@walkeros/server-source-aws 4.0.1-next-1778284185788 → 4.0.1

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,13 +1,13 @@
1
1
  # @walkeros/server-source-aws
2
2
 
3
- ## 4.0.1-next-1778284185788
3
+ ## 4.0.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
7
  - Updated dependencies [381dfe7]
8
8
  - Updated dependencies [1524275]
9
9
  - Updated dependencies [03d7055]
10
- - @walkeros/core@4.0.1-next-1778284185788
10
+ - @walkeros/core@4.0.1
11
11
 
12
12
  ## 4.0.0
13
13
 
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:()=>q,schemas:()=>a,sqsExamples:()=>Oe}),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:()=>O,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),b=require("@walkeros/core/dev"),m=require("@walkeros/core/dev"),y=m.z.object({queueName:m.z.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:m.z.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:m.z.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:m.z.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:m.z.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:m.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:m.z.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:m.z.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:m.z.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:m.z.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:m.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()}),O=(0,b.zodToSchema)(y),S=(0,b.zodToSchema)(k),q={};r(q,{createTrigger:()=>we,env:()=>x,step:()=>D,trigger:()=>ke});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},D={};r(D,{apiGatewayV1Post:()=>T,lambdaGet:()=>I,lambdaPost:()=>P});var P={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"}}]]},T={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"}}]]},I={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"}'}]]},E=require("@walkeros/core"),M=require("@walkeros/core"),N=require("@walkeros/core"),R=require("@walkeros/core"),H=require("@walkeros/core"),$=require("@walkeros/core"),_=require("@walkeros/core"),G=require("@walkeros/core"),B=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 F(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;e&&!(0,_.isRouteArray)(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 K(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,_.createIngest)(n),config:t.config,env:ee(t.config.env)};s.debug("init");const i=await(0,_.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 Y(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:{...ee(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await(0,_.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}async function Z(e,t,n,o,s,r,i){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,_.tryCatchAsync)(X)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{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,_.compileCache)(u):void 0,d=l?W(l,e):void 0;let f;if(l&&d){const e=(0,_.buildCacheContext)(s,a),t=(0,_.checkCache)(l,d,e,`t:${o}`);if("HIT"===t?.status&&t.value){if(a=t.value,l.full)return{event:a,respond:c};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=K("string"==typeof g||Array.isArray(g)&&!(0,_.isRouteArray)(g)?g:(0,_.resolveNext)((0,_.compileNext)(g),(0,_.buildCacheContext)(s,a))||void 0,F(t));if(n.length>0){const o=await Z(e,t,n,a,s,c,i);if(null===o.event)return{event:null,respond:o.respond??c};o.respond&&(c=o.respond),a=Array.isArray(o.event)?o.event[0]:o.event}}const p=await(0,_.tryCatchAsync)(Y,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=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:(0,_.createIngest)("unknown");if(n.next){let s=n.next;if((0,_.isRouteArray)(n.next)){const e=(0,_.compileNext)(n.next);s=(0,_.resolveNext)(e,(0,_.buildCacheContext)(u,o))}if(s){const n=K(s,F(t));if(n.length>0)return Z(e,t,n,o,u,c,i)}return{event:o,respond:c}}return r.length>0?Z(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),r){let o=r;if((0,_.isRouteArray)(r)){const e=(0,_.compileNext)(r);if(o=(0,_.resolveNext)(e,(0,_.buildCacheContext)(s,a)),!o){n&&(a=n);continue}}const u=K(o,F(t));return u.length>0?Z(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}n&&(a=n)}if(f&&d&&(0,_.storeCache)(d,f.key,a,f.ttl),(!p||"object"==typeof p&&!p.next)&&r.config.next&&(0,_.isRouteArray)(r.config.next)){const n=r.config.next,o=(0,_.compileNext)(n),u=(0,_.resolveNext)(o,(0,_.buildCacheContext)(s,a));if(u){const n=K(u,F(t));if(n.length>0)return Z(e,t,n,a,s,c,i)}return{event:a,respond:c}}}return{event:a,respond:c}}function ee(e){return e&&(0,_.isObject)(e)?e:{}}async function te(e,t){if(!t.on||!t.queueOn?.length)return;const n=t.queueOn;t.queueOn=[];for(const{type:e,data:o}of n)await(0,$.tryCatchAsync)(t.on)(e,o)}function ne(e){return Boolean(e.config.init)&&!e.config.require?.length}async function oe(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n;let l,d=(0,$.createIngest)(t);const f=u?(0,$.compileCache)({...u,full:u.full??!0}):void 0,g=(0,$.compileNext)(a),p=Array.isArray(a)&&(0,$.isRouteArray)(a)||!g?void 0:K((0,$.resolveNext)(g),F(e.transformers)),h=(0,$.compileNext)(c),b=Array.isArray(c)&&(0,$.isRouteArray)(c)||!h?void 0:K((0,$.resolveNext)(h),F(e.transformers)),m=e.logger.scope("source").scope(t),y={push:async(n,o={})=>{let r,i=n;const a=b??(h?K((0,$.resolveNext)(h,(0,$.buildCacheContext)(d)),F(e.transformers)):[]);if(a.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Z(e,e.transformers,a,i,d,l,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(l=n.respond),i=Array.isArray(n.event)?n.event[0]:n.event}if(f){const n=W(f,e);if(n){const o=(0,$.buildCacheContext)(d),s=(0,$.checkCache)(f,n,o,`s:${t}`);if(s){if("HIT"===s.status&&void 0!==s.value&&f.full){let t=s.value;return s.rule.update&&(t=await(0,$.applyUpdate)(t,s.rule.update,{...o,cache:{status:"HIT"}},e)),l?.(t),{ok:!0}}if("MISS"===s.status&&f.full&&l){const t=l,i=s.rule.update,a={...o,cache:{status:"MISS"}},c=s.key,u=s.rule.ttl;l=o=>{(0,$.storeCache)(n,c,o,u),i?r=(async()=>{const n=await(0,$.applyUpdate)(o,i,a,e);t(n)})():t(o)}}"MISS"!==s.status||f.full||(0,$.storeCache)(n,s.key,!0,s.rule.ttl)}}}const c=p??(g?K((0,$.resolveNext)(g,(0,$.buildCacheContext)(d)),F(e.transformers)):[]),u=await e.push(i,{...o,id:t,ingest:d,respond:l,mapping:s,preChain:c});return r&&await r,u},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:m,...r},v={collector:e,logger:m,id:t,config:s,env:y,setIngest:async n=>{if(!s.ingest)return void(d=(0,$.createIngest)(t));const o=await(0,$.getMappingValue)(n,s.ingest,{collector:e}),r=(0,$.createIngest)(t);d={...r,...o,_meta:r._meta}},setRespond:e=>{l=e}},w=await(0,$.tryCatchAsync)(o)(v);if(!w)return;const k=w.type||"unknown",O=e.logger.scope(k).scope(t);return y.logger=O,i&&(w.config={...w.config,primary:i}),w}function se(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function re(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:pe(t.env,t.config.env)};(0,H.tryCatch)(t.on)(o,a)}function ie(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=se(e,U.Consent);t.forEach(e=>{Object.keys(o).filter(t=>t in e).forEach(t=>{(0,H.tryCatch)(e[t])(o,s)})})}(e,n,o);break;case U.Ready:!function(e,t){if(!e.allowed)return;const n=se(e,U.Ready);t.forEach(e=>{(0,H.tryCatch)(e)(void 0,n)})}(e,n);break;case U.Run:!function(e,t){if(!e.allowed)return;const n=se(e,U.Run);t.forEach(e=>{(0,H.tryCatch)(e)(void 0,n)})}(e,n);break;case U.Session:!function(e,t){if(!e.session)return;const n=se(e,U.Session);t.forEach(t=>{(0,H.tryCatch)(t)(e.session,n)})}(e,n);break;default:{const o=se(e,t);n.forEach(e=>{"function"==typeof e&&(0,H.tryCatch)(e)(s,o)});break}}}function ae(e,t,n,o){if(!e)return[];if(t){const e=(0,N.resolveNext)(t,(0,N.buildCacheContext)(o));return e?K(e,F(n)):[]}return K(e,F(n))}async function ce(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!(0,N.isFunction)(o.push))return fe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=n||s||{init:!1};let l=i?{...u,before:i}:{...u};a&&(l={...l,next:a}),c&&(l={...l,cache:c});const d={...o,config:l,env:pe(o.env,r)};let f=d.config.id;if(!f)do{f=(0,N.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),ue(e,void 0,{},{[f]:d})}async function ue(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return fe({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let c=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&c.push((0,N.clone)(t));const u=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,N.createIngest)("unknown");if(!c.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!c.length&&s.queueOn?.length){let t=!1;try{t=await le(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const l=[],d=c.filter(e=>{const t=(0,N.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,l.push(e),!1)});if(s.queuePush.push(...d),!l.length)return{id:o,destination:s,queue:c};let f,g,p=!1;try{p=await le(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}if(!p)return{id:o,destination:s,queue:c};s.dlq||(s.dlq=[]);const h=s.config.before,b=ae(h,h&&(0,N.isRouteArray)(h)?(0,N.compileNext)(h):void 0,e.transformers,u),m=s.config.next,y=m&&(0,N.isRouteArray)(m)?(0,N.compileNext)(m):void 0,v=s.config?.cache,w=v?(0,N.compileCache)(v):void 0,k=w?W(w,e):void 0;let O=0;return await Promise.all(l.map(async t=>{let r;if(t.globals=(0,N.assign)(i,t.globals),t.user=(0,N.assign)(a,t.user),w?.full&&k){const e=(0,N.buildCacheContext)(u,t),n=(0,N.checkCache)(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,l=n.respond;if(b.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Z(e,e.transformers,b,t,u,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(l=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(w&&!w.full&&k){const e=(0,N.buildCacheContext)(u,c),n=(0,N.checkCache)(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const d=Date.now();let p=!1;const h=await(0,N.tryCatchAsync)(de,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),f=t,p=!0,s.dlq.push([c,t])})(e,s,o,c,u,l);if(O+=Date.now()-d,r&&k&&void 0===s.config.mock&&(0,N.storeCache)(k,r.key,h??!0,r.ttl),void 0!==h&&(g=h),!p&&m){void 0!==h&&(u._response=h);const t=ae(m,y,e.transformers,u);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Z(e,e.transformers,t,c,u,l,`destination.${o}.next`);n.respond&&(l=n.respond)}}return t})),{id:o,destination:s,error:f,response:g,totalDuration:O}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return fe({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function le(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:pe(t.env,t.config.env)};s.debug("init");const i=await(0,N.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)re(e,t,n,s,r)}s.debug("init done")}return!0}async function de(e,t,n,o,s,r){const{config:i}=t,a=await(0,N.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:{...pe(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){u.debug("push",{event:a.event.name});const n=await(0,N.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}{if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,events:[],data:[]};t.batches[f]={batched:o,batchFn:(0,N.debounce)(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...pe(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),(0,N.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,a),u.debug("push batch done"),o.events=[],o.data=[]},d.batch)}}const o=t.batches[f];o.batched.events.push(a.event),(0,N.isDefined)(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function fe(e){return{ok:!e?.failed,...e}}function ge(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=pe(t.env,o);return{...t,config:a,env:c}}function pe(e,t){return e||t?t?e&&(0,N.isObject)(e)&&(0,N.isObject)(t)?{...e,...t}:t:e:{}}async function he(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 be(e,t,n,o){let s,r,i=!1;switch(t){case U.Config:(0,B.isObject)(n)&&((0,G.assign)(e.config,n,{shallow:!1}),r=n,i=!0);break;case U.Consent:if((0,B.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,E.assign)(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case U.Custom:(0,B.isObject)(n)&&(e.custom=(0,G.assign)(e.custom,n),r=n,i=!0);break;case U.Destination:(0,B.isObject)(n)&&("code"in n&&(0,B.isObject)(n.code)?s=await ce(e,n,o):(0,G.isFunction)(n.push)&&(s=await ce(e,{code:n},o)));break;case U.Globals:(0,B.isObject)(n)&&(e.globals=(0,G.assign)(e.globals,n),r=n,i=!0);break;case U.On:(0,G.isString)(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,R.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,ie(e,t,r)}(e,n,o);break;case U.Ready:i=!0;break;case U.Run:s=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,G.assign)(e.consent,t.consent)),t.user&&(e.user=(0,G.assign)(e.user,t.user)),t.globals&&(e.globals=(0,G.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,G.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ue(e)}(e,n),i=!0;break;case U.Session:i=!0;break;case U.Shutdown:await async function(e){const t=e.logger;await he(e.sources,"source",t),await he(e.destinations,"destination",t),await he(e.transformers,"transformer",t),await he(e.stores,"store",t)}(e);break;case U.User:(0,B.isObject)(n)&&((0,G.assign)(e.user,n,{shallow:!1}),r=n,i=!0)}return i&&(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 of Object.values(e.sources)){if(n.config.require?.length){const e=n.config.require.indexOf(t);-1!==e&&n.config.require.splice(e,1)}n.on&&(ne(n)?!1===await(0,H.tryCatchAsync)(n.on)(t,s)&&(i=!0):(n.queueOn=n.queueOn||[],n.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});re(e,o,n,t,s)}});for(const t of Object.values(e.sources))ne(t)&&t.queueOn?.length&&await te(0,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=ge(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),ie(e,t,r,o),!i}(e,t,void 0,r),s=await ue(e)),s||fe({ok:!0})}function me(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,G.getSpanId)(),trigger:p="",entity:h=n,action:b=o,timing:m=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:b,timestamp:s,timing:m,source:y}}async function ye(e){const t=(0,M.assign)({globalsStatic:{},sessionStatic:{},run:!0},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=(0,M.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:{}},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,L.useHooks)(async(n,o={})=>await(0,L.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,L.createIngest)(r||"unknown");if(c){const t=await(0,L.processEventMapping)(g,c,e);if(t.ignore)return fe({ok:!0});if(c.consent&&!(0,L.getGrantedConsent)(c.consent,e.consent,t.event.consent))return fe({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Z(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return fe({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=me(e,o);return ue(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]??fe({ok:!0})}g=n.event}const b=t(g),m=me(e,b),y=await ue(e,m,{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},()=>fe({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.0.1-next-1778284185788"},...e})),r.command=(i=r,a=be,(0,Q.useHooks)(async(e,t,n)=>await(0,Q.tryCatchAsync)(async()=>await a(i,e,t,n),()=>fe({ok:!1}))(),"Command",i.hooks,i.logger));const c=e.stores||{};if(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),l=u.get,d=u.set,f=u.delete;u.get=(0,J.useHooks)(l,"StoreGet",e.hooks,e.logger),u.set=(0,J.useHooks)(d,"StoreSet",e.hooks,e.logger),u.delete=(0,J.useHooks)(f,"StoreDelete",e.hooks,e.logger),n[o]=u}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){const e=new Map;r.stores.__cache={type:"memory",config:{},get:t=>{const n=e.get(t);if(n){if(!(n.expires&&Date.now()>n.expires))return n.value;e.delete(t)}},set:(t,n,o)=>{e.set(t,{value:n,expires:o?Date.now()+o:void 0})},delete:t=>{e.delete(t)}}}return 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]=ge(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,{config:i}=V(s,"before"),{config:a}=V({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:(0,_.createIngest)(o),config:l,env:r},g=await t(f);n[o]=g}return n}(r,e.transformers||{}),r}async function ve(e){e=e||{};const t=await ye(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r,i)=>{if("string"==typeof e&&e.startsWith("walker ")){const s=e.replace("walker ","");return o.command(s,t,n)}let a;if("string"==typeof e)a={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(a.data=t);else{if(!e||"object"!=typeof e)return fe({ok:!1});a=e,t&&"object"==typeof t&&!Array.isArray(t)&&(a.data={...a.data||{},...t})}return s&&"object"==typeof s&&(a.context=s),r&&Array.isArray(r)&&(a.nested=r),i&&"object"==typeof i&&(a.custom=i),o.push(a)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await oe(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];n.init&&await(0,$.tryCatchAsync)(n.init.bind(n))(),n.config.init=!0,ne(n)&&await te(0,n)}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 we=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ve(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 ke(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 Oe={};r(Oe,{createTrigger:()=>Me,env:()=>Se,step:()=>ze});var Se={};r(Se,{push:()=>Ae,simulation:()=>je});var qe=()=>{},xe={error:qe,warn:qe,info:qe,debug:qe,throw:e=>{throw"string"==typeof e?new Error(e):e},json:qe,scope:()=>xe},Ce=()=>()=>Promise.resolve({ok:!0}),Ae={get push(){return Ce()},get command(){return Ce()},get elb(){return Ce()},logger:xe},je=["AWS.SQSClient"],ze={};r(ze,{decoderText:()=>Te,malformedJson:()=>Ie,orderComplete:()=>Pe,pageView:()=>De});var De={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"]]},Pe={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"]]},Te={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"]]},Ie={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 Ee(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var Me=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ve(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Ee(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:()=>q,schemas:()=>a,sqsExamples:()=>Oe}),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:()=>O,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),b=require("@walkeros/core/dev"),m=require("@walkeros/core/dev"),y=m.z.object({queueName:m.z.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:m.z.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:m.z.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:m.z.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:m.z.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:m.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:m.z.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:m.z.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:m.z.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:m.z.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:m.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()}),O=(0,b.zodToSchema)(y),S=(0,b.zodToSchema)(k),q={};r(q,{createTrigger:()=>we,env:()=>x,step:()=>D,trigger:()=>ke});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},D={};r(D,{apiGatewayV1Post:()=>T,lambdaGet:()=>I,lambdaPost:()=>P});var P={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"}}]]},T={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"}}]]},I={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"}'}]]},E=require("@walkeros/core"),M=require("@walkeros/core"),N=require("@walkeros/core"),R=require("@walkeros/core"),H=require("@walkeros/core"),$=require("@walkeros/core"),_=require("@walkeros/core"),G=require("@walkeros/core"),B=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 F(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;e&&!(0,_.isRouteArray)(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 K(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,_.createIngest)(n),config:t.config,env:ee(t.config.env)};s.debug("init");const i=await(0,_.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 Y(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:{...ee(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await(0,_.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}async function Z(e,t,n,o,s,r,i){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,_.tryCatchAsync)(X)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{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,_.compileCache)(u):void 0,d=l?W(l,e):void 0;let f;if(l&&d){const e=(0,_.buildCacheContext)(s,a),t=(0,_.checkCache)(l,d,e,`t:${o}`);if("HIT"===t?.status&&t.value){if(a=t.value,l.full)return{event:a,respond:c};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=K("string"==typeof g||Array.isArray(g)&&!(0,_.isRouteArray)(g)?g:(0,_.resolveNext)((0,_.compileNext)(g),(0,_.buildCacheContext)(s,a))||void 0,F(t));if(n.length>0){const o=await Z(e,t,n,a,s,c,i);if(null===o.event)return{event:null,respond:o.respond??c};o.respond&&(c=o.respond),a=Array.isArray(o.event)?o.event[0]:o.event}}const p=await(0,_.tryCatchAsync)(Y,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=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:(0,_.createIngest)("unknown");if(n.next){let s=n.next;if((0,_.isRouteArray)(n.next)){const e=(0,_.compileNext)(n.next);s=(0,_.resolveNext)(e,(0,_.buildCacheContext)(u,o))}if(s){const n=K(s,F(t));if(n.length>0)return Z(e,t,n,o,u,c,i)}return{event:o,respond:c}}return r.length>0?Z(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),r){let o=r;if((0,_.isRouteArray)(r)){const e=(0,_.compileNext)(r);if(o=(0,_.resolveNext)(e,(0,_.buildCacheContext)(s,a)),!o){n&&(a=n);continue}}const u=K(o,F(t));return u.length>0?Z(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}n&&(a=n)}if(f&&d&&(0,_.storeCache)(d,f.key,a,f.ttl),(!p||"object"==typeof p&&!p.next)&&r.config.next&&(0,_.isRouteArray)(r.config.next)){const n=r.config.next,o=(0,_.compileNext)(n),u=(0,_.resolveNext)(o,(0,_.buildCacheContext)(s,a));if(u){const n=K(u,F(t));if(n.length>0)return Z(e,t,n,a,s,c,i)}return{event:a,respond:c}}}return{event:a,respond:c}}function ee(e){return e&&(0,_.isObject)(e)?e:{}}async function te(e,t){if(!t.on||!t.queueOn?.length)return;const n=t.queueOn;t.queueOn=[];for(const{type:e,data:o}of n)await(0,$.tryCatchAsync)(t.on)(e,o)}function ne(e){return Boolean(e.config.init)&&!e.config.require?.length}async function oe(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n;let l,d=(0,$.createIngest)(t);const f=u?(0,$.compileCache)({...u,full:u.full??!0}):void 0,g=(0,$.compileNext)(a),p=Array.isArray(a)&&(0,$.isRouteArray)(a)||!g?void 0:K((0,$.resolveNext)(g),F(e.transformers)),h=(0,$.compileNext)(c),b=Array.isArray(c)&&(0,$.isRouteArray)(c)||!h?void 0:K((0,$.resolveNext)(h),F(e.transformers)),m=e.logger.scope("source").scope(t),y={push:async(n,o={})=>{let r,i=n;const a=b??(h?K((0,$.resolveNext)(h,(0,$.buildCacheContext)(d)),F(e.transformers)):[]);if(a.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Z(e,e.transformers,a,i,d,l,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(l=n.respond),i=Array.isArray(n.event)?n.event[0]:n.event}if(f){const n=W(f,e);if(n){const o=(0,$.buildCacheContext)(d),s=(0,$.checkCache)(f,n,o,`s:${t}`);if(s){if("HIT"===s.status&&void 0!==s.value&&f.full){let t=s.value;return s.rule.update&&(t=await(0,$.applyUpdate)(t,s.rule.update,{...o,cache:{status:"HIT"}},e)),l?.(t),{ok:!0}}if("MISS"===s.status&&f.full&&l){const t=l,i=s.rule.update,a={...o,cache:{status:"MISS"}},c=s.key,u=s.rule.ttl;l=o=>{(0,$.storeCache)(n,c,o,u),i?r=(async()=>{const n=await(0,$.applyUpdate)(o,i,a,e);t(n)})():t(o)}}"MISS"!==s.status||f.full||(0,$.storeCache)(n,s.key,!0,s.rule.ttl)}}}const c=p??(g?K((0,$.resolveNext)(g,(0,$.buildCacheContext)(d)),F(e.transformers)):[]),u=await e.push(i,{...o,id:t,ingest:d,respond:l,mapping:s,preChain:c});return r&&await r,u},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:m,...r},v={collector:e,logger:m,id:t,config:s,env:y,setIngest:async n=>{if(!s.ingest)return void(d=(0,$.createIngest)(t));const o=await(0,$.getMappingValue)(n,s.ingest,{collector:e}),r=(0,$.createIngest)(t);d={...r,...o,_meta:r._meta}},setRespond:e=>{l=e}},w=await(0,$.tryCatchAsync)(o)(v);if(!w)return;const k=w.type||"unknown",O=e.logger.scope(k).scope(t);return y.logger=O,i&&(w.config={...w.config,primary:i}),w}function se(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function re(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:pe(t.env,t.config.env)};(0,H.tryCatch)(t.on)(o,a)}function ie(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=se(e,U.Consent);t.forEach(e=>{Object.keys(o).filter(t=>t in e).forEach(t=>{(0,H.tryCatch)(e[t])(o,s)})})}(e,n,o);break;case U.Ready:!function(e,t){if(!e.allowed)return;const n=se(e,U.Ready);t.forEach(e=>{(0,H.tryCatch)(e)(void 0,n)})}(e,n);break;case U.Run:!function(e,t){if(!e.allowed)return;const n=se(e,U.Run);t.forEach(e=>{(0,H.tryCatch)(e)(void 0,n)})}(e,n);break;case U.Session:!function(e,t){if(!e.session)return;const n=se(e,U.Session);t.forEach(t=>{(0,H.tryCatch)(t)(e.session,n)})}(e,n);break;default:{const o=se(e,t);n.forEach(e=>{"function"==typeof e&&(0,H.tryCatch)(e)(s,o)});break}}}function ae(e,t,n,o){if(!e)return[];if(t){const e=(0,N.resolveNext)(t,(0,N.buildCacheContext)(o));return e?K(e,F(n)):[]}return K(e,F(n))}async function ce(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!(0,N.isFunction)(o.push))return fe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=n||s||{init:!1};let l=i?{...u,before:i}:{...u};a&&(l={...l,next:a}),c&&(l={...l,cache:c});const d={...o,config:l,env:pe(o.env,r)};let f=d.config.id;if(!f)do{f=(0,N.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),ue(e,void 0,{},{[f]:d})}async function ue(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return fe({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let c=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&c.push((0,N.clone)(t));const u=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,N.createIngest)("unknown");if(!c.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!c.length&&s.queueOn?.length){let t=!1;try{t=await le(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const l=[],d=c.filter(e=>{const t=(0,N.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,l.push(e),!1)});if(s.queuePush.push(...d),!l.length)return{id:o,destination:s,queue:c};let f,g,p=!1;try{p=await le(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}if(!p)return{id:o,destination:s,queue:c};s.dlq||(s.dlq=[]);const h=s.config.before,b=ae(h,h&&(0,N.isRouteArray)(h)?(0,N.compileNext)(h):void 0,e.transformers,u),m=s.config.next,y=m&&(0,N.isRouteArray)(m)?(0,N.compileNext)(m):void 0,v=s.config?.cache,w=v?(0,N.compileCache)(v):void 0,k=w?W(w,e):void 0;let O=0;return await Promise.all(l.map(async t=>{let r;if(t.globals=(0,N.assign)(i,t.globals),t.user=(0,N.assign)(a,t.user),w?.full&&k){const e=(0,N.buildCacheContext)(u,t),n=(0,N.checkCache)(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,l=n.respond;if(b.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Z(e,e.transformers,b,t,u,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(l=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(w&&!w.full&&k){const e=(0,N.buildCacheContext)(u,c),n=(0,N.checkCache)(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const d=Date.now();let p=!1;const h=await(0,N.tryCatchAsync)(de,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),f=t,p=!0,s.dlq.push([c,t])})(e,s,o,c,u,l);if(O+=Date.now()-d,r&&k&&void 0===s.config.mock&&(0,N.storeCache)(k,r.key,h??!0,r.ttl),void 0!==h&&(g=h),!p&&m){void 0!==h&&(u._response=h);const t=ae(m,y,e.transformers,u);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Z(e,e.transformers,t,c,u,l,`destination.${o}.next`);n.respond&&(l=n.respond)}}return t})),{id:o,destination:s,error:f,response:g,totalDuration:O}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return fe({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function le(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:pe(t.env,t.config.env)};s.debug("init");const i=await(0,N.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)re(e,t,n,s,r)}s.debug("init done")}return!0}async function de(e,t,n,o,s,r){const{config:i}=t,a=await(0,N.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:{...pe(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){u.debug("push",{event:a.event.name});const n=await(0,N.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}{if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,events:[],data:[]};t.batches[f]={batched:o,batchFn:(0,N.debounce)(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...pe(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),(0,N.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,a),u.debug("push batch done"),o.events=[],o.data=[]},d.batch)}}const o=t.batches[f];o.batched.events.push(a.event),(0,N.isDefined)(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function fe(e){return{ok:!e?.failed,...e}}function ge(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=pe(t.env,o);return{...t,config:a,env:c}}function pe(e,t){return e||t?t?e&&(0,N.isObject)(e)&&(0,N.isObject)(t)?{...e,...t}:t:e:{}}async function he(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 be(e,t,n,o){let s,r,i=!1;switch(t){case U.Config:(0,B.isObject)(n)&&((0,G.assign)(e.config,n,{shallow:!1}),r=n,i=!0);break;case U.Consent:if((0,B.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,E.assign)(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case U.Custom:(0,B.isObject)(n)&&(e.custom=(0,G.assign)(e.custom,n),r=n,i=!0);break;case U.Destination:(0,B.isObject)(n)&&("code"in n&&(0,B.isObject)(n.code)?s=await ce(e,n,o):(0,G.isFunction)(n.push)&&(s=await ce(e,{code:n},o)));break;case U.Globals:(0,B.isObject)(n)&&(e.globals=(0,G.assign)(e.globals,n),r=n,i=!0);break;case U.On:(0,G.isString)(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,R.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,ie(e,t,r)}(e,n,o);break;case U.Ready:i=!0;break;case U.Run:s=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,G.assign)(e.consent,t.consent)),t.user&&(e.user=(0,G.assign)(e.user,t.user)),t.globals&&(e.globals=(0,G.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,G.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ue(e)}(e,n),i=!0;break;case U.Session:i=!0;break;case U.Shutdown:await async function(e){const t=e.logger;await he(e.sources,"source",t),await he(e.destinations,"destination",t),await he(e.transformers,"transformer",t),await he(e.stores,"store",t)}(e);break;case U.User:(0,B.isObject)(n)&&((0,G.assign)(e.user,n,{shallow:!1}),r=n,i=!0)}return i&&(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 of Object.values(e.sources)){if(n.config.require?.length){const e=n.config.require.indexOf(t);-1!==e&&n.config.require.splice(e,1)}n.on&&(ne(n)?!1===await(0,H.tryCatchAsync)(n.on)(t,s)&&(i=!0):(n.queueOn=n.queueOn||[],n.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});re(e,o,n,t,s)}});for(const t of Object.values(e.sources))ne(t)&&t.queueOn?.length&&await te(0,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=ge(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),ie(e,t,r,o),!i}(e,t,void 0,r),s=await ue(e)),s||fe({ok:!0})}function me(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,G.getSpanId)(),trigger:p="",entity:h=n,action:b=o,timing:m=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:b,timestamp:s,timing:m,source:y}}async function ye(e){const t=(0,M.assign)({globalsStatic:{},sessionStatic:{},run:!0},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=(0,M.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:{}},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,L.useHooks)(async(n,o={})=>await(0,L.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,L.createIngest)(r||"unknown");if(c){const t=await(0,L.processEventMapping)(g,c,e);if(t.ignore)return fe({ok:!0});if(c.consent&&!(0,L.getGrantedConsent)(c.consent,e.consent,t.event.consent))return fe({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Z(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return fe({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=me(e,o);return ue(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]??fe({ok:!0})}g=n.event}const b=t(g),m=me(e,b),y=await ue(e,m,{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},()=>fe({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.0.1"},...e})),r.command=(i=r,a=be,(0,Q.useHooks)(async(e,t,n)=>await(0,Q.tryCatchAsync)(async()=>await a(i,e,t,n),()=>fe({ok:!1}))(),"Command",i.hooks,i.logger));const c=e.stores||{};if(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),l=u.get,d=u.set,f=u.delete;u.get=(0,J.useHooks)(l,"StoreGet",e.hooks,e.logger),u.set=(0,J.useHooks)(d,"StoreSet",e.hooks,e.logger),u.delete=(0,J.useHooks)(f,"StoreDelete",e.hooks,e.logger),n[o]=u}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){const e=new Map;r.stores.__cache={type:"memory",config:{},get:t=>{const n=e.get(t);if(n){if(!(n.expires&&Date.now()>n.expires))return n.value;e.delete(t)}},set:(t,n,o)=>{e.set(t,{value:n,expires:o?Date.now()+o:void 0})},delete:t=>{e.delete(t)}}}return 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]=ge(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,{config:i}=V(s,"before"),{config:a}=V({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:(0,_.createIngest)(o),config:l,env:r},g=await t(f);n[o]=g}return n}(r,e.transformers||{}),r}async function ve(e){e=e||{};const t=await ye(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r,i)=>{if("string"==typeof e&&e.startsWith("walker ")){const s=e.replace("walker ","");return o.command(s,t,n)}let a;if("string"==typeof e)a={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(a.data=t);else{if(!e||"object"!=typeof e)return fe({ok:!1});a=e,t&&"object"==typeof t&&!Array.isArray(t)&&(a.data={...a.data||{},...t})}return s&&"object"==typeof s&&(a.context=s),r&&Array.isArray(r)&&(a.nested=r),i&&"object"==typeof i&&(a.custom=i),o.push(a)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await oe(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];n.init&&await(0,$.tryCatchAsync)(n.init.bind(n))(),n.config.init=!0,ne(n)&&await te(0,n)}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 we=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ve(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 ke(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 Oe={};r(Oe,{createTrigger:()=>Me,env:()=>Se,step:()=>ze});var Se={};r(Se,{push:()=>Ae,simulation:()=>je});var qe=()=>{},xe={error:qe,warn:qe,info:qe,debug:qe,throw:e=>{throw"string"==typeof e?new Error(e):e},json:qe,scope:()=>xe},Ce=()=>()=>Promise.resolve({ok:!0}),Ae={get push(){return Ce()},get command(){return Ce()},get elb(){return Ce()},logger:xe},je=["AWS.SQSClient"],ze={};r(ze,{decoderText:()=>Te,malformedJson:()=>Ie,orderComplete:()=>Pe,pageView:()=>De});var De={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"]]},Pe={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"]]},Te={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"]]},Ie={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 Ee(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var Me=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ve(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Ee(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 m=p.record(p.string(),p.string()),h=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:m.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(h),v={};t(v,{createTrigger:()=>ut,env:()=>w,step:()=>x,trigger:()=>lt});var w={};t(w,{push:()=>q});var k=()=>()=>Promise.resolve({ok:!0}),S=()=>{},O={error:S,warn:S,info:S,debug:S,throw:e=>{throw"string"==typeof e?new Error(e):e},json:S,scope:()=>O},q={get push(){return k()},get command(){return k()},get elb(){return k()},logger:O},x={};t(x,{apiGatewayV1Post:()=>j,lambdaGet:()=>C,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"}}]]},j={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"}}]]},C={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 D}from"@walkeros/core";import{assign as P,createLogger as T}from"@walkeros/core";import{assign as I,buildCacheContext as E,clone as M,compileCache as R,checkCache as N,storeCache as H,compileNext as $,createIngest as G,debounce as _,getId as B,getGrantedConsent as L,isDefined as Q,isFunction as J,isObject as U,isRouteArray as z,processEventMapping as W,resolveNext as F,tryCatchAsync as V,useHooks as K}from"@walkeros/core";import{isArray as X}from"@walkeros/core";import{tryCatch as Y,tryCatchAsync as Z}from"@walkeros/core";import{createIngest as ee,getMappingValue as te,tryCatchAsync as ne,compileNext as oe,resolveNext as se,isRouteArray as re,compileCache as ie,checkCache as ae,storeCache as ce,applyUpdate as ue,buildCacheContext as le}from"@walkeros/core";import{createIngest as de,isObject as fe,tryCatchAsync as ge,useHooks as pe,compileNext as me,resolveNext as he,isRouteArray as be,compileCache as ye,checkCache as ve,storeCache as we,buildCacheContext as ke}from"@walkeros/core";import{assign as Se,getSpanId as Oe,isFunction as qe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as je,getGrantedConsent as Ce,processEventMapping as De,tryCatchAsync as Pe,useHooks as Te}from"@walkeros/core";import{useHooks as Ie,tryCatchAsync as Ee}from"@walkeros/core";import{useHooks as Me}from"@walkeros/core";var Re={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 He(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;e&&!be(e)?t[n]={next:e}:t[n]={}}return t}function $e(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 _e(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:de(n),config:t.config,env:Qe(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 Be(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:{...Qe(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}async function Le(e,t,n,o,s,r,i){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(_e)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{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?ye(u):void 0,d=l?Ne(l,e):void 0;let f;if(l&&d){const e=ke(s,a),t=ve(l,d,e,`t:${o}`);if("HIT"===t?.status&&t.value){if(a=t.value,l.full)return{event:a,respond:c};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=Ge("string"==typeof g||Array.isArray(g)&&!be(g)?g:he(me(g),ke(s,a))||void 0,He(t));if(n.length>0){const o=await Le(e,t,n,a,s,c,i);if(null===o.event)return{event:null,respond:o.respond??c};o.respond&&(c=o.respond),a=Array.isArray(o.event)?o.event[0]:o.event}}const p=await ge(Be,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=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:de("unknown");if(n.next){let s=n.next;if(be(n.next)){const e=me(n.next);s=he(e,ke(u,o))}if(s){const n=Ge(s,He(t));if(n.length>0)return Le(e,t,n,o,u,c,i)}return{event:o,respond:c}}return r.length>0?Le(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),r){let o=r;if(be(r)){const e=me(r);if(o=he(e,ke(s,a)),!o){n&&(a=n);continue}}const u=Ge(o,He(t));return u.length>0?Le(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}n&&(a=n)}if(f&&d&&we(d,f.key,a,f.ttl),(!p||"object"==typeof p&&!p.next)&&r.config.next&&be(r.config.next)){const n=r.config.next,o=me(n),u=he(o,ke(s,a));if(u){const n=Ge(u,He(t));if(n.length>0)return Le(e,t,n,a,s,c,i)}return{event:a,respond:c}}}return{event:a,respond:c}}function Qe(e){return e&&fe(e)?e:{}}async function Je(e,t){if(!t.on||!t.queueOn?.length)return;const n=t.queueOn;t.queueOn=[];for(const{type:e,data:o}of n)await ne(t.on)(e,o)}function Ue(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ze(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n;let l,d=ee(t);const f=u?ie({...u,full:u.full??!0}):void 0,g=oe(a),p=Array.isArray(a)&&re(a)||!g?void 0:Ge(se(g),He(e.transformers)),m=oe(c),h=Array.isArray(c)&&re(c)||!m?void 0:Ge(se(m),He(e.transformers)),b=e.logger.scope("source").scope(t),y={push:async(n,o={})=>{let r,i=n;const a=h??(m?Ge(se(m,le(d)),He(e.transformers)):[]);if(a.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Le(e,e.transformers,a,i,d,l,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(l=n.respond),i=Array.isArray(n.event)?n.event[0]:n.event}if(f){const n=Ne(f,e);if(n){const o=le(d),s=ae(f,n,o,`s:${t}`);if(s){if("HIT"===s.status&&void 0!==s.value&&f.full){let t=s.value;return s.rule.update&&(t=await ue(t,s.rule.update,{...o,cache:{status:"HIT"}},e)),l?.(t),{ok:!0}}if("MISS"===s.status&&f.full&&l){const t=l,i=s.rule.update,a={...o,cache:{status:"MISS"}},c=s.key,u=s.rule.ttl;l=o=>{ce(n,c,o,u),i?r=(async()=>{const n=await ue(o,i,a,e);t(n)})():t(o)}}"MISS"!==s.status||f.full||ce(n,s.key,!0,s.rule.ttl)}}}const c=p??(g?Ge(se(g,le(d)),He(e.transformers)):[]),u=await e.push(i,{...o,id:t,ingest:d,respond:l,mapping:s,preChain:c});return r&&await r,u},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:b,...r},v={collector:e,logger:b,id:t,config:s,env:y,setIngest:async n=>{if(!s.ingest)return void(d=ee(t));const o=await te(n,s.ingest,{collector:e}),r=ee(t);d={...r,...o,_meta:r._meta}},setRespond:e=>{l=e}},w=await ne(o)(v);if(!w)return;const k=w.type||"unknown",S=e.logger.scope(k).scope(t);return y.logger=S,i&&(w.config={...w.config,primary:i}),w}function We(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function Fe(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:ot(t.env,t.config.env)};Y(t.on)(o,a)}function Ve(e,t,n,o){let s;switch(t){case Re.Consent:s=o||e.consent;break;case Re.Session:s=e.session;break;case Re.User:s=o||e.user;break;case Re.Custom:s=o||e.custom;break;case Re.Globals:s=o||e.globals;break;case Re.Config:s=o||e.config;break;case Re.Ready:case Re.Run:default:s=void 0}if(n.length)switch(t){case Re.Consent:!function(e,t,n){const o=n||e.consent,s=We(e,Re.Consent);t.forEach(e=>{Object.keys(o).filter(t=>t in e).forEach(t=>{Y(e[t])(o,s)})})}(e,n,o);break;case Re.Ready:!function(e,t){if(!e.allowed)return;const n=We(e,Re.Ready);t.forEach(e=>{Y(e)(void 0,n)})}(e,n);break;case Re.Run:!function(e,t){if(!e.allowed)return;const n=We(e,Re.Run);t.forEach(e=>{Y(e)(void 0,n)})}(e,n);break;case Re.Session:!function(e,t){if(!e.session)return;const n=We(e,Re.Session);t.forEach(t=>{Y(t)(e.session,n)})}(e,n);break;default:{const o=We(e,t);n.forEach(e=>{"function"==typeof e&&Y(e)(s,o)});break}}}function Ke(e,t,n,o){if(!e)return[];if(t){const e=F(t,E(o));return e?Ge(e,He(n)):[]}return Ge(e,He(n))}async function Xe(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!J(o.push))return tt({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=n||s||{init:!1};let l=i?{...u,before:i}:{...u};a&&(l={...l,next:a}),c&&(l={...l,cache:c});const d={...o,config:l,env:ot(o.env,r)};let f=d.config.id;if(!f)do{f=B(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),Ye(e,void 0,{},{[f]:d})}async function Ye(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return tt({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let c=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&c.push(M(t));const u=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:G("unknown");if(!c.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!c.length&&s.queueOn?.length){let t=!1;try{t=await Ze(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const l=[],d=c.filter(e=>{const t=L(s.config.consent,r,e.consent);return!t||(e.consent=t,l.push(e),!1)});if(s.queuePush.push(...d),!l.length)return{id:o,destination:s,queue:c};let f,g,p=!1;try{p=await Ze(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}if(!p)return{id:o,destination:s,queue:c};s.dlq||(s.dlq=[]);const m=s.config.before,h=Ke(m,m&&z(m)?$(m):void 0,e.transformers,u),b=s.config.next,y=b&&z(b)?$(b):void 0,v=s.config?.cache,w=v?R(v):void 0,k=w?Ne(w,e):void 0;let S=0;return await Promise.all(l.map(async t=>{let r;if(t.globals=I(i,t.globals),t.user=I(a,t.user),w?.full&&k){const e=E(u,t),n=N(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,l=n.respond;if(h.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Le(e,e.transformers,h,t,u,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(l=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(w&&!w.full&&k){const e=E(u,c),n=N(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const d=Date.now();let p=!1;const m=await V(et,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),f=t,p=!0,s.dlq.push([c,t])})(e,s,o,c,u,l);if(S+=Date.now()-d,r&&k&&void 0===s.config.mock&&H(k,r.key,m??!0,r.ttl),void 0!==m&&(g=m),!p&&b){void 0!==m&&(u._response=m);const t=Ke(b,y,e.transformers,u);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Le(e,e.transformers,t,c,u,l,`destination.${o}.next`);n.respond&&(l=n.respond)}}return t})),{id:o,destination:s,error:f,response:g,totalDuration:S}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return tt({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function Ze(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:ot(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)Fe(e,t,n,s,r)}s.debug("init done")}return!0}async function et(e,t,n,o,s,r){const{config:i}=t,a=await W(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:{...ot(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){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}{if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,events:[],data:[]};t.batches[f]={batched:o,batchFn:_(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...ot(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),K(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,a),u.debug("push batch done"),o.events=[],o.data=[]},d.batch)}}const o=t.batches[f];o.batched.events.push(a.event),Q(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function tt(e){return{ok:!e?.failed,...e}}function nt(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=$e(e,"before"),{config:i}=$e({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=ot(t.env,o);return{...t,config:a,env:c}}function ot(e,t){return e||t?t?e&&U(e)&&U(t)?{...e,...t}:t:e:{}}async function st(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 rt(e,t,n,o){let s,r,i=!1;switch(t){case Re.Config:Ae(n)&&(Se(e.config,n,{shallow:!1}),r=n,i=!0);break;case Re.Consent:if(Ae(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=D(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case Re.Custom:Ae(n)&&(e.custom=Se(e.custom,n),r=n,i=!0);break;case Re.Destination:Ae(n)&&("code"in n&&Ae(n.code)?s=await Xe(e,n,o):qe(n.push)&&(s=await Xe(e,{code:n},o)));break;case Re.Globals:Ae(n)&&(e.globals=Se(e.globals,n),r=n,i=!0);break;case Re.On:xe(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=X(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,Ve(e,t,r)}(e,n,o);break;case Re.Ready:i=!0;break;case Re.Run:s=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 Ye(e)}(e,n),i=!0;break;case Re.Session:i=!0;break;case Re.Shutdown:await async function(e){const t=e.logger;await st(e.sources,"source",t),await st(e.destinations,"destination",t),await st(e.transformers,"transformer",t),await st(e.stores,"store",t)}(e);break;case Re.User:Ae(n)&&(Se(e.user,n,{shallow:!1}),r=n,i=!0)}return i&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case Re.Consent:s=o||e.consent;break;case Re.Session:s=e.session;break;case Re.User:s=o||e.user;break;case Re.Custom:s=o||e.custom;break;case Re.Globals:s=o||e.globals;break;case Re.Config:s=o||e.config;break;case Re.Ready:case Re.Run:default:s=void 0}let i=!1;for(const n of Object.values(e.sources)){if(n.config.require?.length){const e=n.config.require.indexOf(t);-1!==e&&n.config.require.splice(e,1)}n.on&&(Ue(n)?!1===await Z(n.on)(t,s)&&(i=!0):(n.queueOn=n.queueOn||[],n.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});Fe(e,o,n,t,s)}});for(const t of Object.values(e.sources))Ue(t)&&t.queueOn?.length&&await Je(0,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=nt(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),Ve(e,t,r,o),!i}(e,t,void 0,r),s=await Ye(e)),s||tt({ok:!0})}function it(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=Oe(),trigger:p="",entity:m=n,action:h=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:m,action:h,timestamp:s,timing:b,source:y}}async function at(e){const t=P({globalsStatic:{},sessionStatic:{},run:!0},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=T(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:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var i,a;r.push=function(e,t){return Te(async(n,o={})=>await Pe(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,m=i??je(r||"unknown");if(c){const t=await De(g,c,e);if(t.ignore)return tt({ok:!0});if(c.consent&&!Ce(c.consent,e.consent,t.event.consent))return tt({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Le(e,e.transformers,u,g,m,f,r?`source.${r}.next`:void 0);if(null===n.event)return tt({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=it(e,o);return Ye(e,s,{id:r,ingest:m,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]??tt({ok:!0})}g=n.event}const h=t(g),b=it(e,h),y=await Ye(e,b,{id:r,ingest:m,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},()=>tt({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.0.1-next-1778284185788"},...e})),r.command=(a=rt,Ie(async(e,t,n)=>await Ee(async()=>await a(i,e,t,n),()=>tt({ok:!1}))(),"Command",(i=r).hooks,i.logger));const c=e.stores||{};if(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),l=u.get,d=u.set,f=u.delete;u.get=Me(l,"StoreGet",e.hooks,e.logger),u.set=Me(d,"StoreSet",e.hooks,e.logger),u.delete=Me(f,"StoreDelete",e.hooks,e.logger),n[o]=u}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){const e=new Map;r.stores.__cache={type:"memory",config:{},get:t=>{const n=e.get(t);if(n){if(!(n.expires&&Date.now()>n.expires))return n.value;e.delete(t)}},set:(t,n,o)=>{e.set(t,{value:n,expires:o?Date.now()+o:void 0})},delete:t=>{e.delete(t)}}}return 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]=nt(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,{config:i}=$e(s,"before"),{config:a}=$e({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:de(o),config:l,env:r},g=await t(f);n[o]=g}return n}(r,e.transformers||{}),r}async function ct(e){e=e||{};const t=await at(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r,i)=>{if("string"==typeof e&&e.startsWith("walker ")){const s=e.replace("walker ","");return o.command(s,t,n)}let a;if("string"==typeof e)a={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(a.data=t);else{if(!e||"object"!=typeof e)return tt({ok:!1});a=e,t&&"object"==typeof t&&!Array.isArray(t)&&(a.data={...a.data||{},...t})}return s&&"object"==typeof s&&(a.context=s),r&&Array.isArray(r)&&(a.nested=r),i&&"object"==typeof i&&(a.custom=i),o.push(a)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await ze(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];n.init&&await ne(n.init.bind(n))(),n.config.init=!0,Ue(n)&&await Je(0,n)}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 ut=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ct(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 lt(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 dt={};t(dt,{createTrigger:()=>qt,env:()=>ft,step:()=>yt});var ft={};t(ft,{push:()=>ht,simulation:()=>bt});var gt=()=>{},pt={error:gt,warn:gt,info:gt,debug:gt,throw:e=>{throw"string"==typeof e?new Error(e):e},json:gt,scope:()=>pt},mt=()=>()=>Promise.resolve({ok:!0}),ht={get push(){return mt()},get command(){return mt()},get elb(){return mt()},logger:pt},bt=["AWS.SQSClient"],yt={};t(yt,{decoderText:()=>kt,malformedJson:()=>St,orderComplete:()=>wt,pageView:()=>vt});var vt={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"]]},wt={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"]]},kt={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"]]},St={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 Ot(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var qt=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ct(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Ot(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,dt 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 m=p.record(p.string(),p.string()),h=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:m.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(h),v={};t(v,{createTrigger:()=>ut,env:()=>w,step:()=>x,trigger:()=>lt});var w={};t(w,{push:()=>q});var k=()=>()=>Promise.resolve({ok:!0}),S=()=>{},O={error:S,warn:S,info:S,debug:S,throw:e=>{throw"string"==typeof e?new Error(e):e},json:S,scope:()=>O},q={get push(){return k()},get command(){return k()},get elb(){return k()},logger:O},x={};t(x,{apiGatewayV1Post:()=>j,lambdaGet:()=>C,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"}}]]},j={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"}}]]},C={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 D}from"@walkeros/core";import{assign as P,createLogger as T}from"@walkeros/core";import{assign as I,buildCacheContext as E,clone as M,compileCache as R,checkCache as N,storeCache as H,compileNext as $,createIngest as G,debounce as _,getId as B,getGrantedConsent as L,isDefined as Q,isFunction as J,isObject as U,isRouteArray as z,processEventMapping as W,resolveNext as F,tryCatchAsync as V,useHooks as K}from"@walkeros/core";import{isArray as X}from"@walkeros/core";import{tryCatch as Y,tryCatchAsync as Z}from"@walkeros/core";import{createIngest as ee,getMappingValue as te,tryCatchAsync as ne,compileNext as oe,resolveNext as se,isRouteArray as re,compileCache as ie,checkCache as ae,storeCache as ce,applyUpdate as ue,buildCacheContext as le}from"@walkeros/core";import{createIngest as de,isObject as fe,tryCatchAsync as ge,useHooks as pe,compileNext as me,resolveNext as he,isRouteArray as be,compileCache as ye,checkCache as ve,storeCache as we,buildCacheContext as ke}from"@walkeros/core";import{assign as Se,getSpanId as Oe,isFunction as qe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as je,getGrantedConsent as Ce,processEventMapping as De,tryCatchAsync as Pe,useHooks as Te}from"@walkeros/core";import{useHooks as Ie,tryCatchAsync as Ee}from"@walkeros/core";import{useHooks as Me}from"@walkeros/core";var Re={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 He(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;e&&!be(e)?t[n]={next:e}:t[n]={}}return t}function $e(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 _e(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:de(n),config:t.config,env:Qe(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 Be(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:{...Qe(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}async function Le(e,t,n,o,s,r,i){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(_e)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{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?ye(u):void 0,d=l?Ne(l,e):void 0;let f;if(l&&d){const e=ke(s,a),t=ve(l,d,e,`t:${o}`);if("HIT"===t?.status&&t.value){if(a=t.value,l.full)return{event:a,respond:c};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=Ge("string"==typeof g||Array.isArray(g)&&!be(g)?g:he(me(g),ke(s,a))||void 0,He(t));if(n.length>0){const o=await Le(e,t,n,a,s,c,i);if(null===o.event)return{event:null,respond:o.respond??c};o.respond&&(c=o.respond),a=Array.isArray(o.event)?o.event[0]:o.event}}const p=await ge(Be,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=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:de("unknown");if(n.next){let s=n.next;if(be(n.next)){const e=me(n.next);s=he(e,ke(u,o))}if(s){const n=Ge(s,He(t));if(n.length>0)return Le(e,t,n,o,u,c,i)}return{event:o,respond:c}}return r.length>0?Le(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),r){let o=r;if(be(r)){const e=me(r);if(o=he(e,ke(s,a)),!o){n&&(a=n);continue}}const u=Ge(o,He(t));return u.length>0?Le(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}n&&(a=n)}if(f&&d&&we(d,f.key,a,f.ttl),(!p||"object"==typeof p&&!p.next)&&r.config.next&&be(r.config.next)){const n=r.config.next,o=me(n),u=he(o,ke(s,a));if(u){const n=Ge(u,He(t));if(n.length>0)return Le(e,t,n,a,s,c,i)}return{event:a,respond:c}}}return{event:a,respond:c}}function Qe(e){return e&&fe(e)?e:{}}async function Je(e,t){if(!t.on||!t.queueOn?.length)return;const n=t.queueOn;t.queueOn=[];for(const{type:e,data:o}of n)await ne(t.on)(e,o)}function Ue(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ze(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n;let l,d=ee(t);const f=u?ie({...u,full:u.full??!0}):void 0,g=oe(a),p=Array.isArray(a)&&re(a)||!g?void 0:Ge(se(g),He(e.transformers)),m=oe(c),h=Array.isArray(c)&&re(c)||!m?void 0:Ge(se(m),He(e.transformers)),b=e.logger.scope("source").scope(t),y={push:async(n,o={})=>{let r,i=n;const a=h??(m?Ge(se(m,le(d)),He(e.transformers)):[]);if(a.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Le(e,e.transformers,a,i,d,l,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(l=n.respond),i=Array.isArray(n.event)?n.event[0]:n.event}if(f){const n=Ne(f,e);if(n){const o=le(d),s=ae(f,n,o,`s:${t}`);if(s){if("HIT"===s.status&&void 0!==s.value&&f.full){let t=s.value;return s.rule.update&&(t=await ue(t,s.rule.update,{...o,cache:{status:"HIT"}},e)),l?.(t),{ok:!0}}if("MISS"===s.status&&f.full&&l){const t=l,i=s.rule.update,a={...o,cache:{status:"MISS"}},c=s.key,u=s.rule.ttl;l=o=>{ce(n,c,o,u),i?r=(async()=>{const n=await ue(o,i,a,e);t(n)})():t(o)}}"MISS"!==s.status||f.full||ce(n,s.key,!0,s.rule.ttl)}}}const c=p??(g?Ge(se(g,le(d)),He(e.transformers)):[]),u=await e.push(i,{...o,id:t,ingest:d,respond:l,mapping:s,preChain:c});return r&&await r,u},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:b,...r},v={collector:e,logger:b,id:t,config:s,env:y,setIngest:async n=>{if(!s.ingest)return void(d=ee(t));const o=await te(n,s.ingest,{collector:e}),r=ee(t);d={...r,...o,_meta:r._meta}},setRespond:e=>{l=e}},w=await ne(o)(v);if(!w)return;const k=w.type||"unknown",S=e.logger.scope(k).scope(t);return y.logger=S,i&&(w.config={...w.config,primary:i}),w}function We(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function Fe(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:ot(t.env,t.config.env)};Y(t.on)(o,a)}function Ve(e,t,n,o){let s;switch(t){case Re.Consent:s=o||e.consent;break;case Re.Session:s=e.session;break;case Re.User:s=o||e.user;break;case Re.Custom:s=o||e.custom;break;case Re.Globals:s=o||e.globals;break;case Re.Config:s=o||e.config;break;case Re.Ready:case Re.Run:default:s=void 0}if(n.length)switch(t){case Re.Consent:!function(e,t,n){const o=n||e.consent,s=We(e,Re.Consent);t.forEach(e=>{Object.keys(o).filter(t=>t in e).forEach(t=>{Y(e[t])(o,s)})})}(e,n,o);break;case Re.Ready:!function(e,t){if(!e.allowed)return;const n=We(e,Re.Ready);t.forEach(e=>{Y(e)(void 0,n)})}(e,n);break;case Re.Run:!function(e,t){if(!e.allowed)return;const n=We(e,Re.Run);t.forEach(e=>{Y(e)(void 0,n)})}(e,n);break;case Re.Session:!function(e,t){if(!e.session)return;const n=We(e,Re.Session);t.forEach(t=>{Y(t)(e.session,n)})}(e,n);break;default:{const o=We(e,t);n.forEach(e=>{"function"==typeof e&&Y(e)(s,o)});break}}}function Ke(e,t,n,o){if(!e)return[];if(t){const e=F(t,E(o));return e?Ge(e,He(n)):[]}return Ge(e,He(n))}async function Xe(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!J(o.push))return tt({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=n||s||{init:!1};let l=i?{...u,before:i}:{...u};a&&(l={...l,next:a}),c&&(l={...l,cache:c});const d={...o,config:l,env:ot(o.env,r)};let f=d.config.id;if(!f)do{f=B(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),Ye(e,void 0,{},{[f]:d})}async function Ye(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return tt({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let c=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&c.push(M(t));const u=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:G("unknown");if(!c.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!c.length&&s.queueOn?.length){let t=!1;try{t=await Ze(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const l=[],d=c.filter(e=>{const t=L(s.config.consent,r,e.consent);return!t||(e.consent=t,l.push(e),!1)});if(s.queuePush.push(...d),!l.length)return{id:o,destination:s,queue:c};let f,g,p=!1;try{p=await Ze(e,s,o)}catch(t){const n=s.type||"unknown";e.logger.scope(n).error("Destination init threw",{error:t instanceof Error?t.message:String(t)})}if(!p)return{id:o,destination:s,queue:c};s.dlq||(s.dlq=[]);const m=s.config.before,h=Ke(m,m&&z(m)?$(m):void 0,e.transformers,u),b=s.config.next,y=b&&z(b)?$(b):void 0,v=s.config?.cache,w=v?R(v):void 0,k=w?Ne(w,e):void 0;let S=0;return await Promise.all(l.map(async t=>{let r;if(t.globals=I(i,t.globals),t.user=I(a,t.user),w?.full&&k){const e=E(u,t),n=N(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,l=n.respond;if(h.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Le(e,e.transformers,h,t,u,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(l=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(w&&!w.full&&k){const e=E(u,c),n=N(w,k,e,`d:${o}`);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const d=Date.now();let p=!1;const m=await V(et,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),f=t,p=!0,s.dlq.push([c,t])})(e,s,o,c,u,l);if(S+=Date.now()-d,r&&k&&void 0===s.config.mock&&H(k,r.key,m??!0,r.ttl),void 0!==m&&(g=m),!p&&b){void 0!==m&&(u._response=m);const t=Ke(b,y,e.transformers,u);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Le(e,e.transformers,t,c,u,l,`destination.${o}.next`);n.respond&&(l=n.respond)}}return t})),{id:o,destination:s,error:f,response:g,totalDuration:S}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return tt({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function Ze(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:ot(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)Fe(e,t,n,s,r)}s.debug("init done")}return!0}async function et(e,t,n,o,s,r){const{config:i}=t,a=await W(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:{...ot(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){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}{if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,events:[],data:[]};t.batches[f]={batched:o,batchFn:_(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...ot(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),K(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,a),u.debug("push batch done"),o.events=[],o.data=[]},d.batch)}}const o=t.batches[f];o.batched.events.push(a.event),Q(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function tt(e){return{ok:!e?.failed,...e}}function nt(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=$e(e,"before"),{config:i}=$e({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=ot(t.env,o);return{...t,config:a,env:c}}function ot(e,t){return e||t?t?e&&U(e)&&U(t)?{...e,...t}:t:e:{}}async function st(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 rt(e,t,n,o){let s,r,i=!1;switch(t){case Re.Config:Ae(n)&&(Se(e.config,n,{shallow:!1}),r=n,i=!0);break;case Re.Consent:if(Ae(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=D(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case Re.Custom:Ae(n)&&(e.custom=Se(e.custom,n),r=n,i=!0);break;case Re.Destination:Ae(n)&&("code"in n&&Ae(n.code)?s=await Xe(e,n,o):qe(n.push)&&(s=await Xe(e,{code:n},o)));break;case Re.Globals:Ae(n)&&(e.globals=Se(e.globals,n),r=n,i=!0);break;case Re.On:xe(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=X(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,Ve(e,t,r)}(e,n,o);break;case Re.Ready:i=!0;break;case Re.Run:s=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 Ye(e)}(e,n),i=!0;break;case Re.Session:i=!0;break;case Re.Shutdown:await async function(e){const t=e.logger;await st(e.sources,"source",t),await st(e.destinations,"destination",t),await st(e.transformers,"transformer",t),await st(e.stores,"store",t)}(e);break;case Re.User:Ae(n)&&(Se(e.user,n,{shallow:!1}),r=n,i=!0)}return i&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case Re.Consent:s=o||e.consent;break;case Re.Session:s=e.session;break;case Re.User:s=o||e.user;break;case Re.Custom:s=o||e.custom;break;case Re.Globals:s=o||e.globals;break;case Re.Config:s=o||e.config;break;case Re.Ready:case Re.Run:default:s=void 0}let i=!1;for(const n of Object.values(e.sources)){if(n.config.require?.length){const e=n.config.require.indexOf(t);-1!==e&&n.config.require.splice(e,1)}n.on&&(Ue(n)?!1===await Z(n.on)(t,s)&&(i=!0):(n.queueOn=n.queueOn||[],n.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});Fe(e,o,n,t,s)}});for(const t of Object.values(e.sources))Ue(t)&&t.queueOn?.length&&await Je(0,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=nt(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),Ve(e,t,r,o),!i}(e,t,void 0,r),s=await Ye(e)),s||tt({ok:!0})}function it(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=Oe(),trigger:p="",entity:m=n,action:h=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:m,action:h,timestamp:s,timing:b,source:y}}async function at(e){const t=P({globalsStatic:{},sessionStatic:{},run:!0},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=T(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:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var i,a;r.push=function(e,t){return Te(async(n,o={})=>await Pe(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,m=i??je(r||"unknown");if(c){const t=await De(g,c,e);if(t.ignore)return tt({ok:!0});if(c.consent&&!Ce(c.consent,e.consent,t.event.consent))return tt({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Le(e,e.transformers,u,g,m,f,r?`source.${r}.next`:void 0);if(null===n.event)return tt({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=it(e,o);return Ye(e,s,{id:r,ingest:m,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]??tt({ok:!0})}g=n.event}const h=t(g),b=it(e,h),y=await Ye(e,b,{id:r,ingest:m,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},()=>tt({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.0.1"},...e})),r.command=(a=rt,Ie(async(e,t,n)=>await Ee(async()=>await a(i,e,t,n),()=>tt({ok:!1}))(),"Command",(i=r).hooks,i.logger));const c=e.stores||{};if(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),l=u.get,d=u.set,f=u.delete;u.get=Me(l,"StoreGet",e.hooks,e.logger),u.set=Me(d,"StoreSet",e.hooks,e.logger),u.delete=Me(f,"StoreDelete",e.hooks,e.logger),n[o]=u}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){const e=new Map;r.stores.__cache={type:"memory",config:{},get:t=>{const n=e.get(t);if(n){if(!(n.expires&&Date.now()>n.expires))return n.value;e.delete(t)}},set:(t,n,o)=>{e.set(t,{value:n,expires:o?Date.now()+o:void 0})},delete:t=>{e.delete(t)}}}return 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]=nt(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,{config:i}=$e(s,"before"),{config:a}=$e({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:de(o),config:l,env:r},g=await t(f);n[o]=g}return n}(r,e.transformers||{}),r}async function ct(e){e=e||{};const t=await at(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r,i)=>{if("string"==typeof e&&e.startsWith("walker ")){const s=e.replace("walker ","");return o.command(s,t,n)}let a;if("string"==typeof e)a={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(a.data=t);else{if(!e||"object"!=typeof e)return tt({ok:!1});a=e,t&&"object"==typeof t&&!Array.isArray(t)&&(a.data={...a.data||{},...t})}return s&&"object"==typeof s&&(a.context=s),r&&Array.isArray(r)&&(a.nested=r),i&&"object"==typeof i&&(a.custom=i),o.push(a)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await ze(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];n.init&&await ne(n.init.bind(n))(),n.config.init=!0,Ue(n)&&await Je(0,n)}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 ut=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ct(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 lt(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 dt={};t(dt,{createTrigger:()=>qt,env:()=>ft,step:()=>yt});var ft={};t(ft,{push:()=>ht,simulation:()=>bt});var gt=()=>{},pt={error:gt,warn:gt,info:gt,debug:gt,throw:e=>{throw"string"==typeof e?new Error(e):e},json:gt,scope:()=>pt},mt=()=>()=>Promise.resolve({ok:!0}),ht={get push(){return mt()},get command(){return mt()},get elb(){return mt()},logger:pt},bt=["AWS.SQSClient"],yt={};t(yt,{decoderText:()=>kt,malformedJson:()=>St,orderComplete:()=>wt,pageView:()=>vt});var vt={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"]]},wt={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"]]},kt={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"]]},St={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 Ot(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var qt=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ct(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Ot(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,dt 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_core13=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"),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 X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;e2&&!(0,import_core7.isRouteArray)(e2)?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:se(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:{...se(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}async function oe(e,n2,t2,o2,s2,r2,i2){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)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{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,f2=u2?(0,import_core7.compileCache)(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=(0,import_core7.buildCacheContext)(s2,a2),n3=(0,import_core7.checkCache)(f2,l2,e2,`t:${o3}`);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!(0,import_core7.isRouteArray)(g2)?g2:(0,import_core7.resolveNext)((0,import_core7.compileNext)(g2),(0,import_core7.buildCacheContext)(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:o4.respond??c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=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===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:(0,import_core7.createIngest)("unknown");if(t3.next){let s3=t3.next;if((0,import_core7.isRouteArray)(t3.next)){const e2=(0,import_core7.compileNext)(t3.next);s3=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){let o5=r4;if((0,import_core7.isRouteArray)(r4)){const e2=(0,import_core7.compileNext)(r4);if(o5=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&(0,import_core7.storeCache)(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&(0,import_core7.isRouteArray)(r3.config.next)){const t3=r3.config.next,o4=(0,import_core7.compileNext)(t3),u3=(0,import_core7.resolveNext)(o4,(0,import_core7.buildCacheContext)(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&(0,import_core7.isObject)(e)?e:{}}async function re(e,n2){if(!n2.on||!n2.queueOn?.length)return;const t2=n2.queueOn;n2.queueOn=[];for(const{type:e2,data:o2}of t2)await(0,import_core6.tryCatchAsync)(n2.on)(e2,o2)}function ie(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ae(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=(0,import_core6.createIngest)(n2);const d2=u2?(0,import_core6.compileCache)({...u2,full:u2.full??!0}):void 0,g2=(0,import_core6.compileNext)(a2),m2=Array.isArray(a2)&&(0,import_core6.isRouteArray)(a2)||!g2?void 0:ee((0,import_core6.resolveNext)(g2),Y(e.transformers)),p2=(0,import_core6.compileNext)(c2),h2=Array.isArray(c2)&&(0,import_core6.isRouteArray)(c2)||!p2?void 0:ee((0,import_core6.resolveNext)(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),b2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=h2??(p2?ee((0,import_core6.resolveNext)(p2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[]);if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const o4=(0,import_core6.buildCacheContext)(l2),s3=(0,import_core6.checkCache)(d2,t4,o4,`s:${n2}`);if(s3){if("HIT"===s3.status&&void 0!==s3.value&&d2.full){let n3=s3.value;return s3.rule.update&&(n3=await(0,import_core6.applyUpdate)(n3,s3.rule.update,{...o4,cache:{status:"HIT"}},e)),f2?.(n3),{ok:!0}}if("MISS"===s3.status&&d2.full&&f2){const n3=f2,i4=s3.rule.update,a4={...o4,cache:{status:"MISS"}},c4=s3.key,u4=s3.rule.ttl;f2=o5=>{(0,import_core6.storeCache)(t4,c4,o5,u4),i4?r3=(async()=>{const t5=await(0,import_core6.applyUpdate)(o5,i4,a4,e);n3(t5)})():n3(o5)}}"MISS"!==s3.status||d2.full||(0,import_core6.storeCache)(t4,s3.key,!0,s3.rule.ttl)}}}const c3=m2??(g2?ee((0,import_core6.resolveNext)(g2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[]),u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},v2={collector:e,logger:y2,id:n2,config:s2,env:b2,setIngest:async t3=>{if(!s2.ingest)return void(l2=(0,import_core6.createIngest)(n2));const o3=await(0,import_core6.getMappingValue)(t3,s2.ingest,{collector:e}),r3=(0,import_core6.createIngest)(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await(0,import_core6.tryCatchAsync)(o2)(v2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return b2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function ue(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function le(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:Ce(n2.env,n2.config.env)};(0,import_core5.tryCatch)(n2.on)(o2,a2)}function de(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=ue(e2,t_Commands.Consent);n3.forEach(e3=>{Object.keys(s3).filter(n4=>n4 in e3).forEach(n4=>{(0,import_core5.tryCatch)(e3[n4])(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Ready);n3.forEach(e3=>{(0,import_core5.tryCatch)(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Run);n3.forEach(e3=>{(0,import_core5.tryCatch)(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=ue(e2,t_Commands.Session);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4)(e2.session,o3)})}(e,o2);break;default:{const t2=ue(e,n2);o2.forEach(e2=>{"function"==typeof e2&&(0,import_core5.tryCatch)(e2)(r2,t2)});break}}}function me(e,n2,t2,o2){if(!e)return[];if(n2){const e2=(0,import_core3.resolveNext)(n2,(0,import_core3.buildCacheContext)(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function pe(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!(0,import_core3.isFunction)(o2.push))return ve({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:Ce(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=(0,import_core3.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),he(e,void 0,{},{[d2]:l2})}async function he(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return ve({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push((0,import_core3.clone)(n2));const b3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:(0,import_core3.createIngest)("unknown");if(!h3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!h3.length&&s3.queueOn?.length){let n3=!1;try{n3=await ye(e,s3,o3)}catch(n4){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const v3=[],w3=h3.filter(e2=>{const n3=(0,import_core3.getGrantedConsent)(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,v3.push(e2),!1)});if(s3.queuePush.push(...w3),!v3.length)return{id:o3,destination:s3,queue:h3};let C2,O2,q2=!1;try{q2=await ye(e,s3,o3)}catch(n3){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n3 instanceof Error?n3.message:String(n3)})}if(!q2)return{id:o3,destination:s3,queue:h3};s3.dlq||(s3.dlq=[]);const x2=s3.config.before,A2=me(x2,x2&&(0,import_core3.isRouteArray)(x2)?(0,import_core3.compileNext)(x2):void 0,e.transformers,b3),S2=s3.config.next,D2=S2&&(0,import_core3.isRouteArray)(S2)?(0,import_core3.compileNext)(S2):void 0,$2=s3.config?.cache,E2=$2?(0,import_core3.compileCache)($2):void 0,_2=E2?X(E2,e):void 0;let I2=0;return await Promise.all(v3.map(async n3=>{let r3;if(n3.globals=(0,import_core3.assign)(i2,n3.globals),n3.user=(0,import_core3.assign)(p2,n3.user),E2?.full&&_2){const e2=(0,import_core3.buildCacheContext)(b3,n3),t3=(0,import_core3.checkCache)(E2,_2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,A2,n3,b3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(E2&&!E2.full&&_2){const e2=(0,import_core3.buildCacheContext)(b3,u2),t3=(0,import_core3.checkCache)(E2,_2,e2,`d:${o3}`);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 h4=await(0,import_core3.tryCatchAsync)(be,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,b3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&(0,import_core3.storeCache)(_2,r3.key,h4??!0,r3.ttl),void 0!==h4&&(O2=h4),!m2&&S2){void 0!==h4&&(b3._response=h4);const n4=me(S2,D2,e.transformers,b3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,b3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),b2={},v2={},w2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,w2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?v2[n3.id]=t3:(b2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return ve({event:n2,...Object.keys(b2).length&&{done:b2},...Object.keys(v2).length&&{queued:v2},...Object.keys(w2).length&&{failed:w2}})}async function ye(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:Ce(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)le(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function be(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),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!l2?.batch||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await(0,import_core3.useHooks)(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:(0,import_core3.debounce)(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),(0,import_core3.useHooks)(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),(0,import_core3.isDefined)(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function ve(e){return{ok:!e?.failed,...e}}function we(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=Ce(n2.env,o2);return{...n2,config:a2,env:c2}}function Ce(e,n2){return e||n2?n2?e&&(0,import_core3.isObject)(e)&&(0,import_core3.isObject)(n2)?{...e,...n2}:n2:e:{}}async function Se(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 De(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.config,o2,{shallow:!1}),a2=o2,c2=!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);a2=n3,c2=!0}break;case t_Commands.Custom:(0,import_core9.isObject)(o2)&&(e.custom=(0,import_core8.assign)(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:(0,import_core9.isObject)(o2)&&("code"in o2&&(0,import_core9.isObject)(o2.code)?i2=await pe(e,o2,r2):(0,import_core8.isFunction)(o2.push)&&(i2=await pe(e,{code:o2},r2)));break;case t_Commands.Globals:(0,import_core9.isObject)(o2)&&(e.globals=(0,import_core8.assign)(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:(0,import_core8.isString)(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,de(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=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 he(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await Se(e2.sources,"source",n3),await Se(e2.destinations,"destination",n3),await Se(e2.transformers,"transformer",n3),await Se(e2.stores,"store",n3)}(e);break;case t_Commands.User:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(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 of Object.values(e.sources)){if(t2.config.require?.length){const e2=t2.config.require.indexOf(n2);-1!==e2&&t2.config.require.splice(e2,1)}t2.on&&(ie(t2)?!1===await(0,import_core5.tryCatchAsync)(t2.on)(n2,r2)&&(a2=!0):(t2.queueOn=t2.queueOn||[],t2.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});le(e,o3,t2,n2,r2)}});for(const n3 of Object.values(e.sources))ie(n3)&&n3.queueOn?.length&&await re(0,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=we(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),de(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await he(e)),i2||ve({ok:!0})}function $e(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:f2=e.user,nested:l2=[],consent:d2=e.consent,id:g2=(0,import_core8.getSpanId)(),trigger:m2="",entity:p2=t2,action:h2=o2,timing:y2=0,source:b2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:f2,nested:l2,consent:d2,id:g2,trigger:m2,entity:p2,action:h2,timestamp:s2,timing:y2,source:b2}}async function Ne(e){const n2=(0,import_core2.assign)({globalsStatic:{},sessionStatic:{},run:!0},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:{}},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:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?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,f2,l2):void 0,p2=i2??(0,import_core10.createIngest)(r2||"unknown");if(c2){const n3=await(0,import_core10.processEventMapping)(g2,c2,e);if(n3.ignore)return ve({ok:!0});if(c2.consent&&!(0,import_core10.getGrantedConsent)(c2.consent,e.consent,n3.event.consent))return ve({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return ve({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=$e(e,o4);return he(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));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]??ve({ok:!0})}g2=t3.event}const h2=n2(g2),y2=$e(e,h2),b2=await he(e,y2,{id:r2,ingest:p2,respond:d2},m2);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 b2},()=>ve({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.0.1-next-1778284185788"},...e2})),a2.command=(e2=a2,n3=De,(0,import_core11.useHooks)(async(t3,o3,s3)=>await(0,import_core11.tryCatchAsync)(async()=>await n3(e2,t3,o3,s3),()=>ve({ok:!1}))(),"Command",e2.hooks,e2.logger));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=(0,import_core12.useHooks)(f2,"StoreGet",e2.hooks,e2.logger),u2.set=(0,import_core12.useHooks)(l2,"StoreSet",e2.hooks,e2.logger),u2.delete=(0,import_core12.useHooks)(d2,"StoreDelete",e2.hooks,e2.logger),t3[o3]=u2}return t3}(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){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return 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]=we(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,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:(0,import_core7.createIngest)(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Ue(e){e=e||{};const n2=await Ne(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return ve({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ae(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];t3.init&&await(0,import_core6.tryCatchAsync)(t3.init.bind(t3))(),t3.config.init=!0,ie(t3)&&await re(0,t3)}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),f2=u2.find(e2=>e2.config.primary);return f2?c2=f2.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 Ue(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,setIngest:setIngest}=context,{push:envPush}=env,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,context2)=>{const requestId=context2.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);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"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_core13.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_core14=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_core14.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_core13=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"),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 X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;e2&&!(0,import_core7.isRouteArray)(e2)?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:se(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:{...se(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}async function oe(e,n2,t2,o2,s2,r2,i2){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)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{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,f2=u2?(0,import_core7.compileCache)(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=(0,import_core7.buildCacheContext)(s2,a2),n3=(0,import_core7.checkCache)(f2,l2,e2,`t:${o3}`);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!(0,import_core7.isRouteArray)(g2)?g2:(0,import_core7.resolveNext)((0,import_core7.compileNext)(g2),(0,import_core7.buildCacheContext)(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:o4.respond??c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=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===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:(0,import_core7.createIngest)("unknown");if(t3.next){let s3=t3.next;if((0,import_core7.isRouteArray)(t3.next)){const e2=(0,import_core7.compileNext)(t3.next);s3=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){let o5=r4;if((0,import_core7.isRouteArray)(r4)){const e2=(0,import_core7.compileNext)(r4);if(o5=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&(0,import_core7.storeCache)(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&(0,import_core7.isRouteArray)(r3.config.next)){const t3=r3.config.next,o4=(0,import_core7.compileNext)(t3),u3=(0,import_core7.resolveNext)(o4,(0,import_core7.buildCacheContext)(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&(0,import_core7.isObject)(e)?e:{}}async function re(e,n2){if(!n2.on||!n2.queueOn?.length)return;const t2=n2.queueOn;n2.queueOn=[];for(const{type:e2,data:o2}of t2)await(0,import_core6.tryCatchAsync)(n2.on)(e2,o2)}function ie(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ae(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=(0,import_core6.createIngest)(n2);const d2=u2?(0,import_core6.compileCache)({...u2,full:u2.full??!0}):void 0,g2=(0,import_core6.compileNext)(a2),m2=Array.isArray(a2)&&(0,import_core6.isRouteArray)(a2)||!g2?void 0:ee((0,import_core6.resolveNext)(g2),Y(e.transformers)),p2=(0,import_core6.compileNext)(c2),h2=Array.isArray(c2)&&(0,import_core6.isRouteArray)(c2)||!p2?void 0:ee((0,import_core6.resolveNext)(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),b2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=h2??(p2?ee((0,import_core6.resolveNext)(p2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[]);if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const o4=(0,import_core6.buildCacheContext)(l2),s3=(0,import_core6.checkCache)(d2,t4,o4,`s:${n2}`);if(s3){if("HIT"===s3.status&&void 0!==s3.value&&d2.full){let n3=s3.value;return s3.rule.update&&(n3=await(0,import_core6.applyUpdate)(n3,s3.rule.update,{...o4,cache:{status:"HIT"}},e)),f2?.(n3),{ok:!0}}if("MISS"===s3.status&&d2.full&&f2){const n3=f2,i4=s3.rule.update,a4={...o4,cache:{status:"MISS"}},c4=s3.key,u4=s3.rule.ttl;f2=o5=>{(0,import_core6.storeCache)(t4,c4,o5,u4),i4?r3=(async()=>{const t5=await(0,import_core6.applyUpdate)(o5,i4,a4,e);n3(t5)})():n3(o5)}}"MISS"!==s3.status||d2.full||(0,import_core6.storeCache)(t4,s3.key,!0,s3.rule.ttl)}}}const c3=m2??(g2?ee((0,import_core6.resolveNext)(g2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[]),u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},v2={collector:e,logger:y2,id:n2,config:s2,env:b2,setIngest:async t3=>{if(!s2.ingest)return void(l2=(0,import_core6.createIngest)(n2));const o3=await(0,import_core6.getMappingValue)(t3,s2.ingest,{collector:e}),r3=(0,import_core6.createIngest)(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await(0,import_core6.tryCatchAsync)(o2)(v2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return b2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function ue(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function le(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:Ce(n2.env,n2.config.env)};(0,import_core5.tryCatch)(n2.on)(o2,a2)}function de(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=ue(e2,t_Commands.Consent);n3.forEach(e3=>{Object.keys(s3).filter(n4=>n4 in e3).forEach(n4=>{(0,import_core5.tryCatch)(e3[n4])(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Ready);n3.forEach(e3=>{(0,import_core5.tryCatch)(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Run);n3.forEach(e3=>{(0,import_core5.tryCatch)(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=ue(e2,t_Commands.Session);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4)(e2.session,o3)})}(e,o2);break;default:{const t2=ue(e,n2);o2.forEach(e2=>{"function"==typeof e2&&(0,import_core5.tryCatch)(e2)(r2,t2)});break}}}function me(e,n2,t2,o2){if(!e)return[];if(n2){const e2=(0,import_core3.resolveNext)(n2,(0,import_core3.buildCacheContext)(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function pe(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!(0,import_core3.isFunction)(o2.push))return ve({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:Ce(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=(0,import_core3.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),he(e,void 0,{},{[d2]:l2})}async function he(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return ve({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push((0,import_core3.clone)(n2));const b3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:(0,import_core3.createIngest)("unknown");if(!h3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!h3.length&&s3.queueOn?.length){let n3=!1;try{n3=await ye(e,s3,o3)}catch(n4){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const v3=[],w3=h3.filter(e2=>{const n3=(0,import_core3.getGrantedConsent)(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,v3.push(e2),!1)});if(s3.queuePush.push(...w3),!v3.length)return{id:o3,destination:s3,queue:h3};let C2,O2,q2=!1;try{q2=await ye(e,s3,o3)}catch(n3){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n3 instanceof Error?n3.message:String(n3)})}if(!q2)return{id:o3,destination:s3,queue:h3};s3.dlq||(s3.dlq=[]);const x2=s3.config.before,A2=me(x2,x2&&(0,import_core3.isRouteArray)(x2)?(0,import_core3.compileNext)(x2):void 0,e.transformers,b3),S2=s3.config.next,D2=S2&&(0,import_core3.isRouteArray)(S2)?(0,import_core3.compileNext)(S2):void 0,$2=s3.config?.cache,E2=$2?(0,import_core3.compileCache)($2):void 0,_2=E2?X(E2,e):void 0;let I2=0;return await Promise.all(v3.map(async n3=>{let r3;if(n3.globals=(0,import_core3.assign)(i2,n3.globals),n3.user=(0,import_core3.assign)(p2,n3.user),E2?.full&&_2){const e2=(0,import_core3.buildCacheContext)(b3,n3),t3=(0,import_core3.checkCache)(E2,_2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,A2,n3,b3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(E2&&!E2.full&&_2){const e2=(0,import_core3.buildCacheContext)(b3,u2),t3=(0,import_core3.checkCache)(E2,_2,e2,`d:${o3}`);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 h4=await(0,import_core3.tryCatchAsync)(be,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,b3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&(0,import_core3.storeCache)(_2,r3.key,h4??!0,r3.ttl),void 0!==h4&&(O2=h4),!m2&&S2){void 0!==h4&&(b3._response=h4);const n4=me(S2,D2,e.transformers,b3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,b3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),b2={},v2={},w2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,w2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?v2[n3.id]=t3:(b2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return ve({event:n2,...Object.keys(b2).length&&{done:b2},...Object.keys(v2).length&&{queued:v2},...Object.keys(w2).length&&{failed:w2}})}async function ye(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:Ce(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)le(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function be(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),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!l2?.batch||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await(0,import_core3.useHooks)(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:(0,import_core3.debounce)(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),(0,import_core3.useHooks)(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),(0,import_core3.isDefined)(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function ve(e){return{ok:!e?.failed,...e}}function we(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=Ce(n2.env,o2);return{...n2,config:a2,env:c2}}function Ce(e,n2){return e||n2?n2?e&&(0,import_core3.isObject)(e)&&(0,import_core3.isObject)(n2)?{...e,...n2}:n2:e:{}}async function Se(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 De(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.config,o2,{shallow:!1}),a2=o2,c2=!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);a2=n3,c2=!0}break;case t_Commands.Custom:(0,import_core9.isObject)(o2)&&(e.custom=(0,import_core8.assign)(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:(0,import_core9.isObject)(o2)&&("code"in o2&&(0,import_core9.isObject)(o2.code)?i2=await pe(e,o2,r2):(0,import_core8.isFunction)(o2.push)&&(i2=await pe(e,{code:o2},r2)));break;case t_Commands.Globals:(0,import_core9.isObject)(o2)&&(e.globals=(0,import_core8.assign)(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:(0,import_core8.isString)(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,de(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=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 he(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await Se(e2.sources,"source",n3),await Se(e2.destinations,"destination",n3),await Se(e2.transformers,"transformer",n3),await Se(e2.stores,"store",n3)}(e);break;case t_Commands.User:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(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 of Object.values(e.sources)){if(t2.config.require?.length){const e2=t2.config.require.indexOf(n2);-1!==e2&&t2.config.require.splice(e2,1)}t2.on&&(ie(t2)?!1===await(0,import_core5.tryCatchAsync)(t2.on)(n2,r2)&&(a2=!0):(t2.queueOn=t2.queueOn||[],t2.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});le(e,o3,t2,n2,r2)}});for(const n3 of Object.values(e.sources))ie(n3)&&n3.queueOn?.length&&await re(0,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=we(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),de(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await he(e)),i2||ve({ok:!0})}function $e(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:f2=e.user,nested:l2=[],consent:d2=e.consent,id:g2=(0,import_core8.getSpanId)(),trigger:m2="",entity:p2=t2,action:h2=o2,timing:y2=0,source:b2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:f2,nested:l2,consent:d2,id:g2,trigger:m2,entity:p2,action:h2,timestamp:s2,timing:y2,source:b2}}async function Ne(e){const n2=(0,import_core2.assign)({globalsStatic:{},sessionStatic:{},run:!0},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:{}},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:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?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,f2,l2):void 0,p2=i2??(0,import_core10.createIngest)(r2||"unknown");if(c2){const n3=await(0,import_core10.processEventMapping)(g2,c2,e);if(n3.ignore)return ve({ok:!0});if(c2.consent&&!(0,import_core10.getGrantedConsent)(c2.consent,e.consent,n3.event.consent))return ve({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return ve({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=$e(e,o4);return he(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));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]??ve({ok:!0})}g2=t3.event}const h2=n2(g2),y2=$e(e,h2),b2=await he(e,y2,{id:r2,ingest:p2,respond:d2},m2);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 b2},()=>ve({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.0.1"},...e2})),a2.command=(e2=a2,n3=De,(0,import_core11.useHooks)(async(t3,o3,s3)=>await(0,import_core11.tryCatchAsync)(async()=>await n3(e2,t3,o3,s3),()=>ve({ok:!1}))(),"Command",e2.hooks,e2.logger));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=(0,import_core12.useHooks)(f2,"StoreGet",e2.hooks,e2.logger),u2.set=(0,import_core12.useHooks)(l2,"StoreSet",e2.hooks,e2.logger),u2.delete=(0,import_core12.useHooks)(d2,"StoreDelete",e2.hooks,e2.logger),t3[o3]=u2}return t3}(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){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return 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]=we(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,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:(0,import_core7.createIngest)(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Ue(e){e=e||{};const n2=await Ne(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return ve({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ae(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];t3.init&&await(0,import_core6.tryCatchAsync)(t3.init.bind(t3))(),t3.config.init=!0,ie(t3)&&await re(0,t3)}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),f2=u2.find(e2=>e2.config.primary);return f2?c2=f2.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 Ue(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,setIngest:setIngest}=context,{push:envPush}=env,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,context2)=>{const requestId=context2.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);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"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_core13.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_core14=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_core14.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 f,checkCache as l,storeCache as d,compileNext as g,createIngest as m,debounce as p,getId as h,getGrantedConsent as y,isDefined as b,isFunction as v,isObject as w,isRouteArray as k,processEventMapping as C,resolveNext as O,tryCatchAsync as j,useHooks as q}from"@walkeros/core";import{isArray as x}from"@walkeros/core";import{tryCatch as A,tryCatchAsync as S}from"@walkeros/core";import{createIngest as D,getMappingValue as $,tryCatchAsync as E,compileNext as _,resolveNext as I,isRouteArray as P,compileCache as R,checkCache as M,storeCache as H,applyUpdate as T,buildCacheContext as G}from"@walkeros/core";import{createIngest as B,isObject as N,tryCatchAsync as U,useHooks as F,compileNext as W,resolveNext as z,isRouteArray as L,compileCache as V,checkCache as J,storeCache as K,buildCacheContext as Q}from"@walkeros/core";import{assign as Oe,getSpanId as je,isFunction as qe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as _e,getGrantedConsent as Ie,processEventMapping as Pe,tryCatchAsync as Re,useHooks as Me}from"@walkeros/core";import{useHooks as Te,tryCatchAsync as Ge}from"@walkeros/core";import{useHooks as Be}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 X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;e2&&!L(e2)?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:se(n2.config.env)};s2.debug("init");const i2=await F(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:{...se(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await F(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}async function oe(e,n2,t2,o2,s2,r2,i2){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 U(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{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,f2=u2?V(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=Q(s2,a2),n3=J(f2,l2,e2,`t:${o3}`);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!L(g2)?g2:z(W(g2),Q(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:o4.respond??c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=await U(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:B("unknown");if(t3.next){let s3=t3.next;if(L(t3.next)){const e2=W(t3.next);s3=z(e2,Q(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){let o5=r4;if(L(r4)){const e2=W(r4);if(o5=z(e2,Q(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&K(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&L(r3.config.next)){const t3=r3.config.next,o4=W(t3),u3=z(o4,Q(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&N(e)?e:{}}async function re(e,n2){if(!n2.on||!n2.queueOn?.length)return;const t2=n2.queueOn;n2.queueOn=[];for(const{type:e2,data:o2}of t2)await E(n2.on)(e2,o2)}function ie(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ae(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=D(n2);const d2=u2?R({...u2,full:u2.full??!0}):void 0,g2=_(a2),m2=Array.isArray(a2)&&P(a2)||!g2?void 0:ee(I(g2),Y(e.transformers)),p2=_(c2),h2=Array.isArray(c2)&&P(c2)||!p2?void 0:ee(I(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),b2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=h2??(p2?ee(I(p2,G(l2)),Y(e.transformers)):[]);if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const o4=G(l2),s3=M(d2,t4,o4,`s:${n2}`);if(s3){if("HIT"===s3.status&&void 0!==s3.value&&d2.full){let n3=s3.value;return s3.rule.update&&(n3=await T(n3,s3.rule.update,{...o4,cache:{status:"HIT"}},e)),f2?.(n3),{ok:!0}}if("MISS"===s3.status&&d2.full&&f2){const n3=f2,i4=s3.rule.update,a4={...o4,cache:{status:"MISS"}},c4=s3.key,u4=s3.rule.ttl;f2=o5=>{H(t4,c4,o5,u4),i4?r3=(async()=>{const t5=await T(o5,i4,a4,e);n3(t5)})():n3(o5)}}"MISS"!==s3.status||d2.full||H(t4,s3.key,!0,s3.rule.ttl)}}}const c3=m2??(g2?ee(I(g2,G(l2)),Y(e.transformers)):[]),u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},v2={collector:e,logger:y2,id:n2,config:s2,env:b2,setIngest:async t3=>{if(!s2.ingest)return void(l2=D(n2));const o3=await $(t3,s2.ingest,{collector:e}),r3=D(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await E(o2)(v2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return b2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function ue(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function le(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:Ce(n2.env,n2.config.env)};A(n2.on)(o2,a2)}function de(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=ue(e2,t_Commands.Consent);n3.forEach(e3=>{Object.keys(s3).filter(n4=>n4 in e3).forEach(n4=>{A(e3[n4])(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Ready);n3.forEach(e3=>{A(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Run);n3.forEach(e3=>{A(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=ue(e2,t_Commands.Session);n3.forEach(n4=>{A(n4)(e2.session,o3)})}(e,o2);break;default:{const t2=ue(e,n2);o2.forEach(e2=>{"function"==typeof e2&&A(e2)(r2,t2)});break}}}function me(e,n2,t2,o2){if(!e)return[];if(n2){const e2=O(n2,c(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function pe(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!v(o2.push))return ve({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:Ce(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=h(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),he(e,void 0,{},{[d2]:l2})}async function he(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return ve({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push(u(n2));const b3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:m("unknown");if(!h3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!h3.length&&s3.queueOn?.length){let n3=!1;try{n3=await ye(e,s3,o3)}catch(n4){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const v3=[],w3=h3.filter(e2=>{const n3=y(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,v3.push(e2),!1)});if(s3.queuePush.push(...w3),!v3.length)return{id:o3,destination:s3,queue:h3};let C2,O2,q2=!1;try{q2=await ye(e,s3,o3)}catch(n3){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n3 instanceof Error?n3.message:String(n3)})}if(!q2)return{id:o3,destination:s3,queue:h3};s3.dlq||(s3.dlq=[]);const x2=s3.config.before,A2=me(x2,x2&&k(x2)?g(x2):void 0,e.transformers,b3),S2=s3.config.next,D2=S2&&k(S2)?g(S2):void 0,$2=s3.config?.cache,E2=$2?f($2):void 0,_2=E2?X(E2,e):void 0;let I2=0;return await Promise.all(v3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(p2,n3.user),E2?.full&&_2){const e2=c(b3,n3),t3=l(E2,_2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,A2,n3,b3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(E2&&!E2.full&&_2){const e2=c(b3,u2),t3=l(E2,_2,e2,`d:${o3}`);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 h4=await j(be,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,b3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&d(_2,r3.key,h4??!0,r3.ttl),void 0!==h4&&(O2=h4),!m2&&S2){void 0!==h4&&(b3._response=h4);const n4=me(S2,D2,e.transformers,b3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,b3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),b2={},v2={},w2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,w2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?v2[n3.id]=t3:(b2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return ve({event:n2,...Object.keys(b2).length&&{done:b2},...Object.keys(v2).length&&{queued:v2},...Object.keys(w2).length&&{failed:w2}})}async function ye(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:Ce(n2.env,n2.config.env)};s2.debug("init");const i2=await q(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)le(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function be(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await C(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!l2?.batch||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await q(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:p(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),q(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),b(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function ve(e){return{ok:!e?.failed,...e}}function we(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=Ce(n2.env,o2);return{...n2,config:a2,env:c2}}function Ce(e,n2){return e||n2?n2?e&&w(e)&&w(n2)?{...e,...n2}:n2:e:{}}async function Se(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 De(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:Ae(o2)&&(Oe(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if(Ae(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);a2=n3,c2=!0}break;case t_Commands.Custom:Ae(o2)&&(e.custom=Oe(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:Ae(o2)&&("code"in o2&&Ae(o2.code)?i2=await pe(e,o2,r2):qe(o2.push)&&(i2=await pe(e,{code:o2},r2)));break;case t_Commands.Globals:Ae(o2)&&(e.globals=Oe(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:xe(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=x(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,de(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=Oe(e.consent,n2.consent)),n2.user&&(e.user=Oe(e.user,n2.user)),n2.globals&&(e.globals=Oe(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=Oe(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await he(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await Se(e2.sources,"source",n3),await Se(e2.destinations,"destination",n3),await Se(e2.transformers,"transformer",n3),await Se(e2.stores,"store",n3)}(e);break;case t_Commands.User:Ae(o2)&&(Oe(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(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 of Object.values(e.sources)){if(t2.config.require?.length){const e2=t2.config.require.indexOf(n2);-1!==e2&&t2.config.require.splice(e2,1)}t2.on&&(ie(t2)?!1===await S(t2.on)(n2,r2)&&(a2=!0):(t2.queueOn=t2.queueOn||[],t2.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});le(e,o3,t2,n2,r2)}});for(const n3 of Object.values(e.sources))ie(n3)&&n3.queueOn?.length&&await re(0,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=we(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),de(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await he(e)),i2||ve({ok:!0})}function $e(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:f2=e.user,nested:l2=[],consent:d2=e.consent,id:g2=je(),trigger:m2="",entity:p2=t2,action:h2=o2,timing:y2=0,source:b2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:f2,nested:l2,consent:d2,id:g2,trigger:m2,entity:p2,action:h2,timestamp:s2,timing:y2,source:b2}}async function Ne(e){const n2=r({globalsStatic:{},sessionStatic:{},run:!0},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:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return Me(async(t2,o2={})=>await Re(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?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,f2,l2):void 0,p2=i2??_e(r2||"unknown");if(c2){const n3=await Pe(g2,c2,e);if(n3.ignore)return ve({ok:!0});if(c2.consent&&!Ie(c2.consent,e.consent,n3.event.consent))return ve({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return ve({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=$e(e,o4);return he(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));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]??ve({ok:!0})}g2=t3.event}const h2=n2(g2),y2=$e(e,h2),b2=await he(e,y2,{id:r2,ingest:p2,respond:d2},m2);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 b2},()=>ve({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.0.1-next-1778284185788"},...e2})),a2.command=(n3=De,Te(async(t3,o3,s3)=>await Ge(async()=>await n3(e2,t3,o3,s3),()=>ve({ok:!1}))(),"Command",(e2=a2).hooks,e2.logger));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=Be(f2,"StoreGet",e2.hooks,e2.logger),u2.set=Be(l2,"StoreSet",e2.hooks,e2.logger),u2.delete=Be(d2,"StoreDelete",e2.hooks,e2.logger),t3[o3]=u2}return t3}(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){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return 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]=we(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,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:B(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Ue(e){e=e||{};const n2=await Ne(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return ve({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ae(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];t3.init&&await E(t3.init.bind(t3))(),t3.config.init=!0,ie(t3)&&await re(0,t3)}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),f2=u2.find(e2=>e2.config.primary);return f2?c2=f2.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 Ue(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,setIngest:setIngest}=context,{push:envPush}=env,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,context2)=>{const requestId=context2.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);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"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 f,checkCache as l,storeCache as d,compileNext as g,createIngest as m,debounce as p,getId as h,getGrantedConsent as y,isDefined as b,isFunction as v,isObject as w,isRouteArray as k,processEventMapping as C,resolveNext as O,tryCatchAsync as j,useHooks as q}from"@walkeros/core";import{isArray as x}from"@walkeros/core";import{tryCatch as A,tryCatchAsync as S}from"@walkeros/core";import{createIngest as D,getMappingValue as $,tryCatchAsync as E,compileNext as _,resolveNext as I,isRouteArray as P,compileCache as R,checkCache as M,storeCache as H,applyUpdate as T,buildCacheContext as G}from"@walkeros/core";import{createIngest as B,isObject as N,tryCatchAsync as U,useHooks as F,compileNext as W,resolveNext as z,isRouteArray as L,compileCache as V,checkCache as J,storeCache as K,buildCacheContext as Q}from"@walkeros/core";import{assign as Oe,getSpanId as je,isFunction as qe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as _e,getGrantedConsent as Ie,processEventMapping as Pe,tryCatchAsync as Re,useHooks as Me}from"@walkeros/core";import{useHooks as Te,tryCatchAsync as Ge}from"@walkeros/core";import{useHooks as Be}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 X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;e2&&!L(e2)?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:se(n2.config.env)};s2.debug("init");const i2=await F(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:{...se(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await F(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}async function oe(e,n2,t2,o2,s2,r2,i2){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 U(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{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,f2=u2?V(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=Q(s2,a2),n3=J(f2,l2,e2,`t:${o3}`);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!L(g2)?g2:z(W(g2),Q(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:o4.respond??c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=await U(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:B("unknown");if(t3.next){let s3=t3.next;if(L(t3.next)){const e2=W(t3.next);s3=z(e2,Q(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){let o5=r4;if(L(r4)){const e2=W(r4);if(o5=z(e2,Q(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&K(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&L(r3.config.next)){const t3=r3.config.next,o4=W(t3),u3=z(o4,Q(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&N(e)?e:{}}async function re(e,n2){if(!n2.on||!n2.queueOn?.length)return;const t2=n2.queueOn;n2.queueOn=[];for(const{type:e2,data:o2}of t2)await E(n2.on)(e2,o2)}function ie(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ae(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=D(n2);const d2=u2?R({...u2,full:u2.full??!0}):void 0,g2=_(a2),m2=Array.isArray(a2)&&P(a2)||!g2?void 0:ee(I(g2),Y(e.transformers)),p2=_(c2),h2=Array.isArray(c2)&&P(c2)||!p2?void 0:ee(I(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),b2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=h2??(p2?ee(I(p2,G(l2)),Y(e.transformers)):[]);if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const o4=G(l2),s3=M(d2,t4,o4,`s:${n2}`);if(s3){if("HIT"===s3.status&&void 0!==s3.value&&d2.full){let n3=s3.value;return s3.rule.update&&(n3=await T(n3,s3.rule.update,{...o4,cache:{status:"HIT"}},e)),f2?.(n3),{ok:!0}}if("MISS"===s3.status&&d2.full&&f2){const n3=f2,i4=s3.rule.update,a4={...o4,cache:{status:"MISS"}},c4=s3.key,u4=s3.rule.ttl;f2=o5=>{H(t4,c4,o5,u4),i4?r3=(async()=>{const t5=await T(o5,i4,a4,e);n3(t5)})():n3(o5)}}"MISS"!==s3.status||d2.full||H(t4,s3.key,!0,s3.rule.ttl)}}}const c3=m2??(g2?ee(I(g2,G(l2)),Y(e.transformers)):[]),u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},v2={collector:e,logger:y2,id:n2,config:s2,env:b2,setIngest:async t3=>{if(!s2.ingest)return void(l2=D(n2));const o3=await $(t3,s2.ingest,{collector:e}),r3=D(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await E(o2)(v2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return b2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function ue(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function le(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:Ce(n2.env,n2.config.env)};A(n2.on)(o2,a2)}function de(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=ue(e2,t_Commands.Consent);n3.forEach(e3=>{Object.keys(s3).filter(n4=>n4 in e3).forEach(n4=>{A(e3[n4])(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Ready);n3.forEach(e3=>{A(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Run);n3.forEach(e3=>{A(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=ue(e2,t_Commands.Session);n3.forEach(n4=>{A(n4)(e2.session,o3)})}(e,o2);break;default:{const t2=ue(e,n2);o2.forEach(e2=>{"function"==typeof e2&&A(e2)(r2,t2)});break}}}function me(e,n2,t2,o2){if(!e)return[];if(n2){const e2=O(n2,c(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function pe(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!v(o2.push))return ve({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:Ce(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=h(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),he(e,void 0,{},{[d2]:l2})}async function he(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return ve({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push(u(n2));const b3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:m("unknown");if(!h3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!h3.length&&s3.queueOn?.length){let n3=!1;try{n3=await ye(e,s3,o3)}catch(n4){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const v3=[],w3=h3.filter(e2=>{const n3=y(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,v3.push(e2),!1)});if(s3.queuePush.push(...w3),!v3.length)return{id:o3,destination:s3,queue:h3};let C2,O2,q2=!1;try{q2=await ye(e,s3,o3)}catch(n3){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n3 instanceof Error?n3.message:String(n3)})}if(!q2)return{id:o3,destination:s3,queue:h3};s3.dlq||(s3.dlq=[]);const x2=s3.config.before,A2=me(x2,x2&&k(x2)?g(x2):void 0,e.transformers,b3),S2=s3.config.next,D2=S2&&k(S2)?g(S2):void 0,$2=s3.config?.cache,E2=$2?f($2):void 0,_2=E2?X(E2,e):void 0;let I2=0;return await Promise.all(v3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(p2,n3.user),E2?.full&&_2){const e2=c(b3,n3),t3=l(E2,_2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,A2,n3,b3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(E2&&!E2.full&&_2){const e2=c(b3,u2),t3=l(E2,_2,e2,`d:${o3}`);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 h4=await j(be,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,b3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&d(_2,r3.key,h4??!0,r3.ttl),void 0!==h4&&(O2=h4),!m2&&S2){void 0!==h4&&(b3._response=h4);const n4=me(S2,D2,e.transformers,b3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,b3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),b2={},v2={},w2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,w2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?v2[n3.id]=t3:(b2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return ve({event:n2,...Object.keys(b2).length&&{done:b2},...Object.keys(v2).length&&{queued:v2},...Object.keys(w2).length&&{failed:w2}})}async function ye(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:Ce(n2.env,n2.config.env)};s2.debug("init");const i2=await q(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)le(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function be(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await C(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!l2?.batch||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await q(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:p(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),q(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),b(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function ve(e){return{ok:!e?.failed,...e}}function we(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=Ce(n2.env,o2);return{...n2,config:a2,env:c2}}function Ce(e,n2){return e||n2?n2?e&&w(e)&&w(n2)?{...e,...n2}:n2:e:{}}async function Se(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 De(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:Ae(o2)&&(Oe(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if(Ae(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);a2=n3,c2=!0}break;case t_Commands.Custom:Ae(o2)&&(e.custom=Oe(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:Ae(o2)&&("code"in o2&&Ae(o2.code)?i2=await pe(e,o2,r2):qe(o2.push)&&(i2=await pe(e,{code:o2},r2)));break;case t_Commands.Globals:Ae(o2)&&(e.globals=Oe(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:xe(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=x(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,de(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=Oe(e.consent,n2.consent)),n2.user&&(e.user=Oe(e.user,n2.user)),n2.globals&&(e.globals=Oe(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=Oe(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await he(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await Se(e2.sources,"source",n3),await Se(e2.destinations,"destination",n3),await Se(e2.transformers,"transformer",n3),await Se(e2.stores,"store",n3)}(e);break;case t_Commands.User:Ae(o2)&&(Oe(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(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 of Object.values(e.sources)){if(t2.config.require?.length){const e2=t2.config.require.indexOf(n2);-1!==e2&&t2.config.require.splice(e2,1)}t2.on&&(ie(t2)?!1===await S(t2.on)(n2,r2)&&(a2=!0):(t2.queueOn=t2.queueOn||[],t2.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});le(e,o3,t2,n2,r2)}});for(const n3 of Object.values(e.sources))ie(n3)&&n3.queueOn?.length&&await re(0,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=we(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),de(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await he(e)),i2||ve({ok:!0})}function $e(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:f2=e.user,nested:l2=[],consent:d2=e.consent,id:g2=je(),trigger:m2="",entity:p2=t2,action:h2=o2,timing:y2=0,source:b2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:f2,nested:l2,consent:d2,id:g2,trigger:m2,entity:p2,action:h2,timestamp:s2,timing:y2,source:b2}}async function Ne(e){const n2=r({globalsStatic:{},sessionStatic:{},run:!0},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:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return Me(async(t2,o2={})=>await Re(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?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,f2,l2):void 0,p2=i2??_e(r2||"unknown");if(c2){const n3=await Pe(g2,c2,e);if(n3.ignore)return ve({ok:!0});if(c2.consent&&!Ie(c2.consent,e.consent,n3.event.consent))return ve({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return ve({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=$e(e,o4);return he(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));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]??ve({ok:!0})}g2=t3.event}const h2=n2(g2),y2=$e(e,h2),b2=await he(e,y2,{id:r2,ingest:p2,respond:d2},m2);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 b2},()=>ve({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.0.1"},...e2})),a2.command=(n3=De,Te(async(t3,o3,s3)=>await Ge(async()=>await n3(e2,t3,o3,s3),()=>ve({ok:!1}))(),"Command",(e2=a2).hooks,e2.logger));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=Be(f2,"StoreGet",e2.hooks,e2.logger),u2.set=Be(l2,"StoreSet",e2.hooks,e2.logger),u2.delete=Be(d2,"StoreDelete",e2.hooks,e2.logger),t3[o3]=u2}return t3}(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){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return 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]=we(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,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:B(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Ue(e){e=e||{};const n2=await Ne(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return ve({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ae(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];t3.init&&await E(t3.init.bind(t3))(),t3.config.init=!0,ie(t3)&&await re(0,t3)}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),f2=u2.find(e2=>e2.config.primary);return f2?c2=f2.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 Ue(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,setIngest:setIngest}=context,{push:envPush}=env,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,context2)=>{const requestId=context2.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);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"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.0.1-next-1778284185788",
4
+ "version": "4.0.1",
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.0.1-next-1778284185788",
4
+ "version": "4.0.1",
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.0.1-next-1778284185788"
26
+ "@walkeros/core": "4.0.1"
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.0.1-next-1778284185788"
33
+ "@walkeros/collector": "4.0.1"
34
34
  },
35
35
  "repository": {
36
36
  "url": "git+https://github.com/elbwalker/walkerOS.git",