@walkeros/server-source-aws 4.1.0-next-1778668930820 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -2
- package/README.md +31 -459
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/walkerOS.json +9 -12
- package/package.json +3 -3
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:()=>Se}),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:()=>ke,env:()=>x,step:()=>D,trigger:()=>Oe});var x={};r(x,{push:()=>z});var C=()=>()=>Promise.resolve({ok:!0}),j=()=>{},A={error:j,warn:j,info:j,debug:j,throw:e=>{throw"string"==typeof e?new Error(e):e},json:j,scope:()=>A},z={get push(){return C()},get command(){return C()},get elb(){return C()},logger:A},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"),H=require("@walkeros/core"),R=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=(0,_.compileNext)(o.config?.next);t[n]="static"===e?.type||"chain"===e?.type?{next:e.value}:{}}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:te(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:{...te(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}function Z(e,t){if(e)return(0,_.resolveNext)((0,_.compileNext)(e),t)??void 0}async function ee(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);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=K(Z(g,(0,_.buildCacheContext)(s,a)),F(t));if(n.length>0){const o=await ee(e,t,n,a,s,c,i);if(null===o.event)return{event:null,respond:o.respond??c};if(o.stopped)return{event:Array.isArray(o.event)?o.event[0]:o.event,respond:o.respond??c,stopped:!0};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){const s=Z(n.next,(0,_.buildCacheContext)(u,o));if(s){const n=K(s,F(t));if(n.length>0)return ee(e,t,n,o,u,c,i)}return{event:o,respond:c}}return r.length>0?ee(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){const o=Z(r,(0,_.buildCacheContext)(s,a));if(!o){n&&(a=n);continue}const u=K(o,F(t));return u.length>0?ee(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)}f&&d&&(0,_.storeCache)(d,f.key,a,f.ttl);const h=r.config.next?(0,_.compileNext)(r.config.next):void 0,b="case"===h?.type||"gate"===h?.type||"sequence"===h?.type;if((!p||"object"==typeof p&&!p.next)&&h&&b){const n=(0,_.resolveNext)(h,(0,_.buildCacheContext)(s,a));if(n){const o=K(n,F(t));if(o.length>0)return ee(e,t,o,a,s,c,i)}return{event:a,respond:c}}}return{event:a,respond:c}}function te(e){return e&&(0,_.isObject)(e)?e:{}}async function ne(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 oe(e){return Boolean(e.config.init)&&!e.config.require?.length}async function se(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,stop:u.stop??!0}):void 0,g=(0,$.compileNext)(a),p="static"!==g?.type&&"chain"!==g?.type||!g?void 0:K((0,$.resolveNext)(g),F(e.transformers)),h=(0,$.compileNext)(c),b="static"!==h?.type&&"chain"!==h?.type||!h?void 0:K((0,$.resolveNext)(h),F(e.transformers)),m=e.logger.scope("source").scope(t),y={push:async(n,o={})=>{let r;const i=b??(h?K((0,$.resolveNext)(h,(0,$.buildCacheContext)(d)),F(e.transformers)):[]);let a=[n];if(i.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await ee(e,e.transformers,i,n,d,l,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(l=o.respond),{ok:!0};o.respond&&(l=o.respond),a=Array.isArray(o.event)?o.event:[o.event]}if(f){const t=W(f,e);if(t){const n=(0,$.buildCacheContext)(d),o=(0,$.checkCache)(f,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&f.stop){let t=o.value;return o.rule.update&&(t=await(0,$.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),l?.(t),{ok:!0}}if("MISS"===o.status&&f.stop&&l){const s=l,i=o.rule.update,a={...n,cache:{status:"MISS"}},c=o.key,u=o.rule.ttl;l=n=>{(0,$.storeCache)(t,c,n,u),i?r=(async()=>{const t=await(0,$.applyUpdate)(n,i,a,e);s(t)})():s(n)}}"MISS"!==o.status||f.stop||(0,$.storeCache)(t,o.key,!0,o.rule.ttl)}}}const c=p??(g?K((0,$.resolveNext)(g,(0,$.buildCacheContext)(d)),F(e.transformers)):[]);let u={ok:!0};for(const n of a)u=await e.push(n,{...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 re(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ie(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:he(t.env,t.config.env)};(0,R.tryCatch)(t.on)(o,a)}function ae(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=re(e,U.Consent);t.forEach(e=>{Object.keys(o).filter(t=>t in e).forEach(t=>{(0,R.tryCatch)(e[t])(o,s)})})}(e,n,o);break;case U.Ready:!function(e,t){if(!e.allowed)return;const n=re(e,U.Ready);t.forEach(e=>{(0,R.tryCatch)(e)(void 0,n)})}(e,n);break;case U.Run:!function(e,t){if(!e.allowed)return;const n=re(e,U.Run);t.forEach(e=>{(0,R.tryCatch)(e)(void 0,n)})}(e,n);break;case U.Session:!function(e,t){if(!e.session)return;const n=re(e,U.Session);t.forEach(t=>{(0,R.tryCatch)(t)(e.session,n)})}(e,n);break;default:{const o=re(e,t);n.forEach(e=>{"function"==typeof e&&(0,R.tryCatch)(e)(s,o)});break}}}function ce(e,t,n,o){if(!e)return[];const s=t??(0,N.compileNext)(e),r=(0,N.resolveNext)(s,(0,N.buildCacheContext)(o));return r?K(r,n):[]}async function ue(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!(0,N.isFunction)(o.push))return ge({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:he(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]),le(e,void 0,{},{[f]:d})}async function le(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return ge({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=e.transformers?F(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push((0,N.clone)(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,N.createIngest)("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await de(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 d=[],f=u.filter(e=>{const t=(0,N.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(s.queuePush.push(...f),!d.length)return{id:o,destination:s,queue:u};let g,p,h=!1;try{h=await de(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(!h)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const b=s.config.before,m=ce(b,b&&Array.isArray(b)?(0,N.compileNext)(b):void 0,c,l),y=s.config.next,v=y&&Array.isArray(y)?(0,N.compileNext)(y):void 0,w=s.config?.cache,k=w?(0,N.compileCache)(w):void 0,O=k?W(k,e):void 0;let S=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=(0,N.assign)(i,t.globals),t.user=(0,N.assign)(a,t.user),k?.stop&&O){const e=(0,N.buildCacheContext)(l,t),n=(0,N.checkCache)(k,O,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await ee(e,e.transformers,m,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(k&&!k.stop&&O){const e=(0,N.buildCacheContext)(l,u),n=(0,N.checkCache)(k,O,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let h=!1;const b=await(0,N.tryCatchAsync)(fe,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,h=!0,s.dlq.push([u,t])})(e,s,o,u,l,d);if(S+=Date.now()-f,r&&O&&void 0===s.config.mock&&(0,N.storeCache)(O,r.key,b??!0,r.ttl),void 0!==b&&(p=b),!h&&y){void 0!==b&&(l._response=b);const t=ce(y,v,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await ee(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:S}})),l={},d={},f={};for(const t of u){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,f[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?d[t.id]=n:(l[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return ge({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}async function de(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:he(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)ie(e,t,n,s,r)}s.debug("init done")}return!0}async function fe(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:{...he(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:{...he(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 ge(e){return{ok:!e?.failed,...e}}function pe(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=he(t.env,o);return{...t,config:a,env:c}}function he(e,t){return e||t?t?e&&(0,N.isObject)(e)&&(0,N.isObject)(t)?{...e,...t}:t:e:{}}async function be(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 me(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 ue(e,n,o):(0,G.isFunction)(n.push)&&(s=await ue(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,H.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,ae(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 le(e)}(e,n),i=!0;break;case U.Session:i=!0;break;case U.Shutdown:await async function(e){const t=e.logger;await be(e.sources,"source",t),await be(e.destinations,"destination",t),await be(e.transformers,"transformer",t),await be(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&&(oe(n)?!1===await(0,R.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});ie(e,o,n,t,s)}});for(const t of Object.values(e.sources))oe(t)&&t.queueOn?.length&&await ne(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=pe(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),ae(e,t,r,o),!i}(e,t,void 0,r),s=await le(e)),s||ge({ok:!0})}function ye(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 ve(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 ge({ok:!0});if(c.consent&&!(0,L.getGrantedConsent)(c.consent,e.consent,t.event.consent))return ge({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await ee(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return ge({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),ge({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=ye(e,o);return le(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]??ge({ok:!0})}g=n.event}const b=t(g),m=ye(e,b),y=await le(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},()=>ge({ok:!1}))(),"Push",e.hooks,e.logger)}(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0-next-1778668930820"},...e})),r.command=(i=r,a=me,(0,Q.useHooks)(async(e,t,n)=>await(0,Q.tryCatchAsync)(async()=>await a(i,e,t,n),()=>ge({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]=pe(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=(0,_.validateTransformerEntry)(s);if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=V(s,"before"),{config:c}=V({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:(0,_.createIngest)(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await(0,_.processEventMapping)(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),h=await p(g);void 0!==s.before&&void 0===h.config?.before&&(h.config={...h.config??{},before:s.before}),void 0!==s.next&&void 0===h.config?.next&&(h.config={...h.config??{},next:s.next}),n[o]=h}return n}(r,e.transformers||{}),r}async function we(e){e=e||{};const t=await ve(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 ge({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 se(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,oe(n)&&await ne(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 ke=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await we(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 Oe(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 Se={};r(Se,{createTrigger:()=>Ne,env:()=>qe,step:()=>De});var qe={};r(qe,{push:()=>Ae,simulation:()=>ze});var xe=()=>{},Ce={error:xe,warn:xe,info:xe,debug:xe,throw:e=>{throw"string"==typeof e?new Error(e):e},json:xe,scope:()=>Ce},je=()=>()=>Promise.resolve({ok:!0}),Ae={get push(){return je()},get command(){return je()},get elb(){return je()},logger:Ce},ze=["AWS.SQSClient"],De={};r(De,{decoderText:()=>Ie,malformedJson:()=>Ee,orderComplete:()=>Te,pageView:()=>Pe});var Pe={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"]]},Te={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"]]},Ie={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"]]},Ee={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 Me(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var Ne=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await we(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Me(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};//# sourceMappingURL=dev.js.map
|
|
1
|
+
"use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,r=(e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})},i={};r(i,{examples:()=>O,schemas:()=>a,sqsExamples:()=>_e}),module.exports=(e=i,((e,r,i,a)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let c of o(r))s.call(e,c)||c===i||t(e,c,{get:()=>r[c],enumerable:!(a=n(r,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var a={};r(a,{CorsOptionsSchema:()=>g,CorsOrigin:()=>f,HttpMethod:()=>d,SettingsSchema:()=>p,settings:()=>h,sqsSettings:()=>q,sqsSetup:()=>S});var c=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),d=l.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),f=l.z.union([l.z.string(),l.z.array(l.z.string()),l.z.literal("*")]),g=l.z.object({origin:f.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:l.z.array(d).describe("Allowed HTTP methods").optional(),headers:l.z.array(l.z.string()).describe("Allowed request headers").optional(),credentials:l.z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:l.z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),p=u.z.object({cors:u.z.union([u.z.boolean(),g]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:u.z.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:u.z.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:u.z.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),h=(0,c.zodToSchema)(p),m=require("@walkeros/core/dev"),y=require("@walkeros/core/dev"),b=y.z.object({queueName:y.z.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:y.z.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:y.z.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:y.z.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:y.z.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:y.z.enum(["json","text","raw"]).describe("Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.").optional(),maxMessages:y.z.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:y.z.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:y.z.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:y.z.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:y.z.enum(["nack","ack"]).describe("Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.").optional()}),v=require("@walkeros/core/dev"),w=v.z.record(v.z.string(),v.z.string()),k=v.z.object({region:v.z.string().min(1).describe("AWS region.").optional(),fifoQueue:v.z.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:v.z.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:v.z.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:v.z.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:v.z.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:v.z.object({arn:v.z.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:v.z.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:v.z.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:w.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:v.z.object({topicArn:v.z.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:v.z.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:v.z.record(v.z.string(),v.z.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),q=(0,m.zodToSchema)(b),S=(0,m.zodToSchema)(k),O={};r(O,{createTrigger:()=>Te,env:()=>x,step:()=>P,trigger:()=>$e});var x={};r(x,{push:()=>z});var C=()=>()=>Promise.resolve({ok:!0}),A=()=>{},j={error:A,warn:A,info:A,debug:A,throw:e=>{throw"string"==typeof e?new Error(e):e},json:A,scope:()=>j},z={get push(){return C()},get command(){return C()},get elb(){return C()},logger:j},P={};r(P,{apiGatewayV1Post:()=>E,lambdaGet:()=>D,lambdaPost:()=>I});var I={title:"Lambda POST",description:"An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-123"},body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},E={title:"API Gateway v1 POST",description:"A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{httpMethod:"POST",path:"/collect",requestContext:{requestId:"req-789",identity:{sourceIp:"203.0.113.42"}},queryStringParameters:null,body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},D={title:"Lambda GET",description:"An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.",trigger:{type:"GET"},in:{version:"2.0",requestContext:{http:{method:"GET",path:"/collect"},requestId:"req-456"},rawQueryString:"e=page+view&d=%7B%22title%22%3A%22Home%22%7D",isBase64Encoded:!1},out:[["elb",{e:"page view",d:'{"title":"Home"}'}]]},M=require("@walkeros/core"),T=require("@walkeros/core"),$=require("@walkeros/core"),_=require("@walkeros/core"),H=require("@walkeros/core"),N=require("@walkeros/core"),R=require("@walkeros/core"),B=require("@walkeros/core"),G=require("@walkeros/core"),F=require("@walkeros/core"),L=require("@walkeros/core"),Q=require("@walkeros/core"),J=require("@walkeros/core"),U={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function W(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function K(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?t[n]={next:e}:t[n]={}}return t}function V(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Y(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function X(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:(0,R.createIngest)(n),config:t.config,env:ne(t.config.env)};s.debug("init");const i=await(0,R.useHooks)(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function Z(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...ne(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await(0,R.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}function ee(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,R.createIngest)(t)}async function te(e,t,n,o,s,r,i){s||(s=(0,R.createIngest)(n[0]??"chain")),i&&s._meta&&(s._meta.chainPath=i);let a=o,c=r;for(const o of n){const r=t[o];if(!r){e.logger.warn(`Transformer not found: ${o}`);continue}if(s&&s._meta&&s._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o}`),{event:null,respond:c};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await(0,R.tryCatchAsync)(X,t=>{if(t instanceof R.FatalError)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:c};if(i&&void 0!==r.config?.chainMocks?.[i]){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),a=t;continue}if(void 0!==r.config?.mock){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),a=r.config.mock;continue}if(r.config?.disabled)continue;const u=r.config?.cache,l=u?(0,R.compileCache)(u):void 0,d=l?W(l,e):void 0;let f;if(l&&d){const e=(0,R.buildCacheContext)(s,a),t=await(0,R.checkCache)(l,d,e);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=(0,R.getNextSteps)(g,(0,R.buildCacheContext)(s,a));if(1===n.length){const o=Y(n[0],K(t));if(o.length>0){const n=await te(e,t,o,a,s,c,i);if(null===n.event)return{event:null,respond:n.respond??c};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:n.respond??c,stopped:!0};n.respond&&(c=n.respond),a=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),a,ee(s,n),void 0,i)))}const p=await(0,R.tryCatchAsync)(Z,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,a,s,c);if(!1===p)return{event:null,respond:c};if(Array.isArray(p)){const r=n.slice(n.indexOf(o)+1),u=await Promise.all(p.map(async n=>{const o=n.event||a,u=ee(s,"unknown");if(n.next){const s=(0,R.getNextSteps)(n.next,(0,R.buildCacheContext)(u,o));if(0===s.length)return{event:o,respond:c};if(1===s.length){const n=Y(s[0],K(t));return n.length>0?te(e,t,n,o,u,c,i):{event:o,respond:c}}return(await Promise.all(s.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),o,ee(u,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?te(e,t,r,o,u,c,i):{event:o,respond:c}}));let l=c;const d=[];for(const e of u.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(l=t.respond),null===t.event)continue;Array.isArray(t.event)?d.push(...t.event):d.push(t.event)}else d.push(e);return 0===d.length?{event:null,respond:l}:1===d.length?{event:d[0],respond:l}:{event:d,respond:l}}if(p&&"object"==typeof p){const{event:n,respond:o,next:r}=p;if(o&&(c=o),void 0!==r){const o=(0,R.getNextSteps)(r,(0,R.buildCacheContext)(s,a));if(0===o.length){n&&(a=n);continue}if(1===o.length){const u=Y(o[0],K(t));return u.length>0?te(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}return await Promise.all(o.map(o=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(o,K(t)),n||a,ee(s,o),void 0,i))),{event:null,respond:void 0}}n&&(a=n)}f&&d&&(0,R.storeCache)(d,f.key,a,f.ttl);const h=r.config.next,m="string"==typeof h||Array.isArray(h)&&h.every(e=>"string"==typeof e),y=void 0!==h&&!m;if((!p||"object"==typeof p&&!p.next)&&y){const n=(0,R.getNextSteps)(r.config.next,(0,R.buildCacheContext)(s,a));if(1===n.length){const o=Y(n[0],K(t));return o.length>0?te(e,t,o,a,s,c,i):{event:a,respond:c}}return n.length>1?(await Promise.all(n.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),a,ee(s,n),void 0,i))),{event:null,respond:void 0}):{event:a,respond:c}}}return{event:a,respond:c}}function ne(e){return e&&(0,R.isObject)(e)?e:{}}function oe(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function se(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o)await(0,N.tryCatchAsync)(t.on,t=>{if(t instanceof N.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,error:t})})(n,r)}function re(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ie(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n,l=u,d=l?(0,N.compileCache)({...l,stop:l.stop??!0}):void 0,f=oe(a)?Y(a,K(e.transformers)):void 0,g=oe(c)?Y(c,K(e.transformers)):void 0,p=r.push,h=p??e.push,m=Boolean(p),y=async(n,o,r)=>{let i;const u=g??(void 0!==c?(()=>{const t=(0,N.getNextSteps)(c,(0,N.buildCacheContext)(r.ingest));return 0===t.length?[]:Y(1===t.length?t[0]:t,K(e.transformers))})():[]);let l=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await te(e,e.transformers,u,n,r.ingest,r.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),l=Array.isArray(o.event)?o.event:[o.event]}if(d){const t=W(d,e);if(t){const n=(0,N.buildCacheContext)(r.ingest),o=await(0,N.checkCache)(d,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&d.stop){let t=o.value;return o.rule.update&&(t=await(0,N.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&d.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},u=o.key,l=o.rule.ttl,d=n=>{(0,N.storeCache)(t,u,n,l),a?i=(async()=>{const t=await(0,N.applyUpdate)(n,a,c,e);s(t)})():s(n)};r.respond=d}"MISS"!==o.status||d.stop||(0,N.storeCache)(t,o.key,!0,o.rule.ttl)}}}const p=f?{kind:"single",preChain:f}:void 0!==a?(()=>{const t=(0,N.getNextSteps)(a,(0,N.buildCacheContext)(r.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Y(t[0],K(e.transformers))}:{kind:"many",branches:t.map(t=>Y(t,K(e.transformers)))}})():{kind:"single",preChain:[]};let y={ok:!0};for(const n of l)"many"===p.kind?(await Promise.all(p.branches.map((i,a)=>(0,N.tryCatchAsync)(async()=>m?h(n):h(n,{...o,id:t,ingest:ee(r.ingest,`${t}.${a}`),respond:void 0,mapping:s,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),y={ok:!0}):y=m?await h(n):await h(n,{...o,id:t,ingest:r.ingest,respond:r.respond,mapping:s,preChain:p.preChain});return i&&await i,y},b=async n=>{const o=(0,N.createIngest)(t);if(!s.ingest||void 0===n)return o;const r=await(0,N.getMappingValue)(n,s.ingest,{collector:e});return{...o,...r,_meta:o._meta}},v=e.logger.scope("source").scope(t),w={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:v,...r,push:async(e,n={})=>{const o={ingest:(0,N.createIngest)(t),respond:void 0};return y(e,n,o)}},k={collector:e,logger:v,id:t,config:s,env:w,withScope:async(e,t,n)=>{const o={ingest:await b(e),respond:t};return n({...w,push:(e,t={})=>y(e,t,o),ingest:o.ingest,respond:o.respond})}},q=await(0,N.tryCatchAsync)(o,n=>{if(n instanceof N.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(k);if(!q)return;const S=q.type||"unknown",O=e.logger.scope(S).scope(t);return w.logger=O,i&&(q.config={...q.config,primary:i}),q}function ae(e,t,n,o){if(n instanceof _.FatalError)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function ce(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ue(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:Ce(t.env,t.config.env)};(0,H.tryCatch)(t.on,t=>ae(e,"destination",t,{destId:n,type:o}))(o,a)}function le(e,t,n,o){let s;switch(t){case U.Consent:s=o||e.consent;break;case U.Session:s=e.session;break;case U.User:s=o||e.user;break;case U.Custom:s=o||e.custom;break;case U.Globals:s=o||e.globals;break;case U.Config:s=o||e.config;break;case U.Ready:case U.Run:default:s=void 0}if(n.length)switch(t){case U.Consent:!function(e,t,n){const o=n||e.consent,s=ce(e,U.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{(0,H.tryCatch)(t[n],t=>ae(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case U.Ready:!function(e,t){if(!e.allowed)return;const n=ce(e,U.Ready);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"ready",t))(void 0,n)})}(e,n);break;case U.Run:!function(e,t){if(!e.allowed)return;const n=ce(e,U.Run);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"run",t))(void 0,n)})}(e,n);break;case U.Session:!function(e,t){if(!e.session)return;const n=ce(e,U.Session);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=ce(e,t);n.forEach(n=>{"function"==typeof n&&(0,H.tryCatch)(n,n=>ae(e,"generic",n,{type:t}))(s,o)});break}}}function de(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var fe=new WeakMap;function ge(e,t,n,o){fe.get(e)||(fe.set(e,!0),t.warn(n,o))}function pe(e){fe.delete(e)}var he=Object.freeze({batched:!0});function me(e){return e===he}function ye(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function be(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function ve(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function we(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Y(e,t);if("string"==typeof e)return Y(e,t);const o=(0,$.getNextSteps)(e,(0,$.buildCacheContext)(n));return 0===o.length?[]:1===o.length?Y(o[0],t):Y(o,t)}async function ke(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return Oe({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=de(e.queue,t,{max:n});if(o.dropped>0){const t=ve(e.status,(0,$.stepId)("collector"),"queue",o.dropped);ge(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&pe(e.queue);e.status.in++}o||(o=e.destinations);const c=e.transformers?K(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push((0,$.clone)(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,$.createIngest)("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await qe(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const d=[],f=u.filter(e=>{const t=(0,$.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(f.length>0){const t=s.queuePush,n=s.config.id||o,r={max:s.config.queueMax??1e3};let i=0;for(const e of f)i+=de(t,e,r).dropped;if(i>0){be(e,n);const o=ve(e.status,(0,$.stepId)("destination",n),"queue",i);ge(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&pe(t)}if(!d.length)return{id:o,destination:s,queue:u};let g,p,h=!1;try{h=await qe(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!h)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const m=we(s.config.before,c,l),y=s.config.next,b=s.config?.cache,v=b?(0,$.compileCache)(b):void 0,w=v?W(v,e):void 0;let k=0,q=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=(0,$.assign)(i,t.globals),t.user=(0,$.assign)(a,t.user),v?.stop&&w){const e=(0,$.buildCacheContext)(l,t),n=await(0,$.checkCache)(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await te(e,e.transformers,m,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(v&&!v.stop&&w){const e=(0,$.buildCacheContext)(l,u),n=await(0,$.checkCache)(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let h=!1;const b=await(0,$.tryCatchAsync)(Se,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,h=!0;const r=s.dlq,i=s.config.id||o,a={max:s.config.dlqMax??100},c=de(r,[u,t],a);if(c.dropped>0){be(e,i);const t=ve(e.status,(0,$.stepId)("destination",i),"dlq",c.dropped);ge(r,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i,cap:a.max,droppedCount:t})}else r.length<a.max&&pe(r)})(e,s,o,u,l,d);if(k+=Date.now()-f,r&&w&&void 0===s.config.mock&&(0,$.storeCache)(w,r.key,b??!0,r.ttl),void 0===b||me(b)||(p=b),me(b)&&q++,!h&&y){void 0!==b&&(l._response=b);const t=we(y,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await te(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:k,batchedCount:q,allowedCount:d.length}})),l={},d={},f={};for(const t of u){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};be(e,t.id);const s=e.status.destinations[t.id],r=Date.now();if(s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0,t.error)o.error=t.error,f[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)d[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0;(Math.max(0,i-n)>0||0===i)&&(l[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++)}}return Oe({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}async function qe(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(o),r={collector:e,logger:s,id:n,config:t.config,env:Ce(t.env,t.config.env)};s.debug("init");const i=await(0,$.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(r);if(!1===i)return i;if(t.config={...i||t.config,init:!0},t.queueOn?.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)ue(e,t,n,s,r)}s.debug("init done")}return!0}async function Se(e,t,n,o,s,r){const{config:i}=t,a=await(0,$.processEventMapping)(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",u=e.logger.scope(c),l={collector:e,logger:u,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...Ce(t.env,i.env),...r?{respond:r}:{}}};if(void 0!==i.mock)return u.debug("mock",{event:a.event.name}),i.mock;const d=a.mapping,f=a.mappingKey||"* *";if(d?.batch&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=ye(d.batch),r=ye(i.batch),a=s.wait??r.wait??3e4,c=s.size??r.size??1e3,l=s.age??r.age??3e4,g=Ce(t.env,i.env),p=(0,$.debounce)(async()=>{const o=t.batches[f].batched;if(0===o.entries.length)return;const s={key:o.key,entries:o.entries,events:o.events,data:o.data};o.entries=[],o.events=[],o.data=[];const r=s.entries[0],a={collector:e,logger:u,id:n,config:i,data:void 0,rule:r.rule,ingest:r.ingest,env:{...g,...r.respond?{respond:r.respond}:{}}};u.debug("push batch",{events:s.entries.length});const c=t.config.id||n,l=be(e,c);let d=!0;await(0,$.tryCatchAsync)((0,$.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),n=>{d=!1;const o=t.dlq=t.dlq||[],r={max:t.config.dlqMax??100};let i=0;for(const e of s.entries)i+=de(o,[e.event,n],r).dropped;if(i>0){const t=ve(e.status,(0,$.stepId)("destination",c),"dlq",i);ge(o,u,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:r.max,droppedCount:t})}else o.length<r.max&&pe(o);l.failed+=s.entries.length,l.dlqSize=o.length,e.status.failed+=s.entries.length,u.error("Push batch failed",{error:n instanceof Error?n.message:String(n),entries:s.entries.length})})(s,a),u.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-s.entries.length),d&&(l.count+=s.entries.length,l.lastAt=Date.now(),e.status.out+=s.entries.length)},{wait:a,size:c,age:l});t.batches[f]={batched:o,batchFn:()=>{p()},flush:async()=>{await p.flush()}}}const o=t.batches[f];o.batched.entries.push({event:a.event,ingest:s,respond:r,rule:d,data:a.data}),o.batched.events.push(a.event),(0,$.isDefined)(a.data)&&o.batched.data.push(a.data);const c=t.config.id||n,l=be(e,c);return l.inFlightBatch=(l.inFlightBatch??0)+1,o.batchFn(),he}{u.debug("push",{event:a.event.name});const n=await(0,$.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}}function Oe(e){return{ok:!e?.failed,...e}}function xe(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=V(e,"before"),{config:i}=V({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=Ce(t.env,o);return{...t,config:a,env:c}}function Ce(e,t){return e||t?t?e&&(0,$.isObject)(e)&&(0,$.isObject)(t)?{...e,...t}:t:e:{}}async function Ae(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};try{await Promise.race([s(a),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function je(e,t,n){let o,s,r=!1;switch(t){case U.Config:(0,G.isObject)(n)&&((0,B.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case U.Consent:if((0,G.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,M.assign)(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case U.Custom:(0,G.isObject)(n)&&(e.custom=(0,B.assign)(e.custom,n),s=n,r=!0);break;case U.Destination:(0,G.isObject)(n)&&"code"in n&&(0,G.isObject)(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!(0,$.isFunction)(n.push))return Oe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let u=r?{...c,before:r}:{...c};i&&(u={...u,next:i}),a&&(u={...u,cache:a});const l={...n,config:u,env:Ce(n.env,s)};let d=l.config.id;if(!d)do{d=(0,$.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=l,!1!==l.config.queue&&(l.queuePush=[...e.queue]),ke(e,void 0,{},{[d]:l})}(e,n));break;case U.Globals:(0,G.isObject)(n)&&(e.globals=(0,B.assign)(e.globals,n),s=n,r=!0);break;case U.Hook:if((0,G.isObject)(n)&&(0,B.isString)(n.name)&&(0,B.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case U.On:if((0,G.isObject)(n)&&(0,B.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,_.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,le(e,t,r)}(e,t,o)}break;case U.Ready:r=!0;break;case U.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,B.assign)(e.consent,t.consent)),t.user&&(e.user=(0,B.assign)(e.user,t.user)),t.globals&&(e.globals=(0,B.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,B.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ke(e)}(e,n),r=!0;break;case U.Session:r=!0;break;case U.Shutdown:await async function(e){const t=e.logger;await Ae(e.sources,"source",t),await Ae(e.destinations,"destination",t),await Ae(e.transformers,"transformer",t),await Ae(e.stores,"store",t)}(e);break;case U.User:(0,G.isObject)(n)&&((0,B.assign)(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case U.Consent:s=o||e.consent;break;case U.Session:s=e.session;break;case U.User:s=o||e.user;break;case U.Custom:s=o||e.custom;break;case U.Globals:s=o||e.globals;break;case U.Config:s=o||e.config;break;case U.Ready:case U.Run:default:s=void 0}let i=!1;for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(re(o)?!1===await(0,H.tryCatchAsync)(o.on,o=>ae(e,"source",o,{sourceId:n,type:t}))(t,s)&&(i=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:s})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:s});ue(e,o,n,t,s)}});for(const[t,n]of Object.entries(e.sources))re(n)&&n.queueOn?.length&&await se(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=o.config?.require;if(!s)continue;const r=s.indexOf(t);if(-1===r)continue;if(s.splice(r,1),s.length>0)continue;delete e.pending.destinations[n];const i=xe(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),le(e,t,r,o),!i}(e,t,void 0,s),o=await ke(e)),o||Oe({ok:!0})}function ze(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:u={},user:l=e.user,nested:d=[],consent:f=e.consent,id:g=(0,B.getSpanId)(),trigger:p="",entity:h=n,action:m=o,timing:y=0,source:b={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:u,user:l,nested:d,consent:f,id:g,trigger:p,entity:h,action:m,timestamp:s,timing:y,source:b}}function Pe(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function Ie(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i}=t,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=n.rules.map(e=>({match:e.match?(0,J.compileMatcher)(e.match):()=>!0,ttl:e.ttl})),u=e=>`${s}:${e}`;function l(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return c.find(e=>e.match(n))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(t){const n=u(t),s=await o.get(n);if(void 0!==s)return a.hits++,s;const r=d.get(n);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=l(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),a.populates++}catch(e){f("set",t,e)}return s}finally{d.delete(n)}})();return d.set(n,i),i},async set(t,n,s){a.writes++,await e.set(t,n,s);const r=l(t,n);if(r)try{await o.set(u(t),n,1e3*r.ttl)}catch(e){f("set",t,e)}},async delete(t){a.deletes++,await e.delete(t);try{await o.delete(u(t))}catch(e){f("delete",t,e)}}};function f(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function Ee(e,t){const n=t.get,o=t.set,s=t.delete;t.get=(0,Q.useHooks)(n,"StoreGet",e.hooks,e.logger),t.set=(0,Q.useHooks)(o,"StoreSet",e.hooks,e.logger),t.delete=(0,Q.useHooks)(s,"StoreDelete",e.hooks,e.logger)}async function De(e){const t=(0,T.assign)({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=(0,T.createLogger)(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},logger:o,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var i,a;r.push=function(e,t){return(0,F.useHooks)(async(n,o={})=>await(0,F.tryCatchAsync)(async()=>{const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:u,include:l,exclude:d}=o;let f=a,g=n;const p=l||d?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,l,d):void 0,h=i??(0,F.createIngest)(r||"unknown");if(c){const t=await(0,F.processEventMapping)(g,c,e);if(t.ignore)return Oe({ok:!0});if(c.consent&&!(0,F.getGrantedConsent)(c.consent,e.consent,t.event.consent))return Oe({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await te(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return Oe({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),Oe({ok:!0});if(n.respond&&(f=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=ze(e,o);return ke(e,s,{id:r,ingest:h,respond:f},p)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return o[0]??Oe({ok:!0})}g=n.event}const m=t(g),y=ze(e,m),b=await ke(e,y,{id:r,ingest:h,respond:f},p);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return b},t=>{if(t instanceof F.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),Oe({ok:!1})})(),"Push",e.hooks,e.logger)}(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0"},...e})),r.command=(i=r,a=je,(0,L.useHooks)(async(e,t,n)=>await(0,L.tryCatchAsync)(async()=>await a(i,e,t,n),n=>{if(n instanceof L.FatalError)throw n;return i.status.failed++,i.logger.error("command failed",{command:e,data:t,error:n}),Oe({ok:!1})})(),"Command",i.hooks,i.logger));const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i},u=await t(c);n[o]=u}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=Pe()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=Ie(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t)})}for(const[t,o]of Object.entries(n))"__cache"!==t&&Ee(e,o);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=Pe()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=xe(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=(0,R.validateStepEntry)(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=V(s,"before"),{config:c}=V({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:(0,R.createIngest)(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await(0,R.processEventMapping)(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),h=await p(g);void 0!==s.before&&void 0===h.config?.before&&(h.config={...h.config??{},before:s.before}),void 0!==s.next&&void 0===h.config?.next&&(h.config={...h.config??{},next:s.next}),n[o]=h}return n}(r,e.transformers||{}),r}async function Me(e){e=e||{};const t=await De(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return Oe({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await ie(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await(0,N.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof N.FatalError)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,re(n)&&await se(e,n,t))}return n}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const u=Object.values(t.sources).filter(e=>"elb"!==e.type),l=u.find(e=>e.config.primary);return l?c=l.push:u.length>0&&(c=u[0].push),{collector:t,elb:c}}var Te=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Me(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function $e(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var _e={};r(_e,{createTrigger:()=>Ve,env:()=>He,step:()=>Le});var He={};r(He,{push:()=>Ge,simulation:()=>Fe});var Ne=()=>{},Re={error:Ne,warn:Ne,info:Ne,debug:Ne,throw:e=>{throw"string"==typeof e?new Error(e):e},json:Ne,scope:()=>Re},Be=()=>()=>Promise.resolve({ok:!0}),Ge={get push(){return Be()},get command(){return Be()},get elb(){return Be()},logger:Re},Fe=["AWS.SQSClient"],Le={};r(Le,{decoderText:()=>Ue,malformedJson:()=>We,orderComplete:()=>Je,pageView:()=>Qe});var Qe={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},Je={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},Ue={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},We={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function Ke(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var Ve=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Me(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Ke(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};//# sourceMappingURL=dev.js.map
|
package/dist/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev.ts","../src/schemas.ts","../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/sqs/schemas/index.ts","../src/sqs/schemas/settings.ts","../src/sqs/schemas/setup.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts","../src/sqs/examples/index.ts","../src/sqs/examples/env.ts","../src/sqs/examples/step.ts","../src/sqs/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './lambda/examples';\nexport * as sqsExamples from './sqs/examples';\n","// Lambda (default sub-source).\nexport { settings, SettingsSchema, type Settings } from './lambda/schemas';\nexport * from './lambda/schemas/primitives';\n\n// SQS sub-source. Prefixed so the website's <Configuration> snippet can\n// remap data.schemas.sqsSettings / sqsSetup onto data.schemas.settings.\nexport { settings as sqsSettings } from './sqs/schemas';\nexport { setup as sqsSetup } from './sqs/schemas';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema exports (for website PropertyTable + MCP package_get).\nexport const settings = zodToSchema(SettingsSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source settings schema.\n *\n * Required: queueName. All other fields optional with sensible defaults\n * applied at runtime by `getConfig`.\n */\nexport const SettingsSchema = z.object({\n queueName: z\n .string()\n .min(1)\n .describe(\n 'SQS queue short name (like walkeros-events). Required for both setup and runtime poll.',\n ),\n region: z\n .string()\n .describe('AWS region (like eu-central-1). Default: eu-central-1.')\n .optional(),\n queueUrl: z\n .string()\n .url()\n .describe(\n 'Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.',\n )\n .optional(),\n client: z\n .any()\n .describe(\n 'Pre-configured AWS SQSClient instance. Bypasses construction when supplied.',\n )\n .optional(),\n config: z\n .any()\n .describe(\n 'AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).',\n )\n .optional(),\n decoder: z\n .enum(['json', 'text', 'raw'])\n .describe(\n 'Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.',\n )\n .optional(),\n maxMessages: z\n .number()\n .int()\n .min(1)\n .max(10)\n .describe('SQS receive batch size. Cap 10. Default: 10.')\n .optional(),\n waitTimeSeconds: z\n .number()\n .int()\n .min(0)\n .max(20)\n .describe('Long-poll duration in seconds. Cap 20. Default: 20.')\n .optional(),\n visibilityTimeout: z\n .number()\n .int()\n .nonnegative()\n .describe(\n 'Per-receive visibility timeout override. Default: queue-configured value.',\n )\n .optional(),\n shutdownTimeoutMs: z\n .number()\n .int()\n .positive()\n .describe(\n 'Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.',\n )\n .optional(),\n onPushError: z\n .enum(['nack', 'ack'])\n .describe(\n 'Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source setup schema.\n *\n * Provisioning options for `walkeros setup source.<id>`. Authoritative-apply:\n * declared state is written via a single CreateQueueCommand; non-declared\n * tags or attributes are left untouched.\n */\nconst TagsSchema = z.record(z.string(), z.string());\n\nexport const SetupSchema = z.object({\n region: z.string().min(1).describe('AWS region.').optional(),\n fifoQueue: z\n .boolean()\n .describe(\n 'FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.',\n )\n .optional(),\n visibilityTimeoutSeconds: z\n .number()\n .int()\n .nonnegative()\n .describe('Visibility timeout in seconds. Default: 30.')\n .optional(),\n messageRetentionSeconds: z\n .number()\n .int()\n .positive()\n .describe('Message retention period in seconds. Default: 345600 (4 days).')\n .optional(),\n maximumMessageSize: z\n .number()\n .int()\n .min(1024)\n .max(262144)\n .describe('Max message size in bytes. Default: 262144 (256 KB).')\n .optional(),\n kmsMasterKeyId: z\n .string()\n .describe('KMS key alias or ID for at-rest encryption.')\n .optional(),\n deadLetterQueue: z\n .object({\n arn: z\n .string()\n .describe(\n 'ARN of an existing DLQ. Mutually exclusive with create: true.',\n )\n .optional(),\n create: z\n .boolean()\n .describe('Create a sibling DLQ named <queueName>-dlq. Default: false.')\n .optional(),\n maxReceiveCount: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .describe('Max receive count before message goes to DLQ. Default: 5.')\n .optional(),\n })\n .describe('Optional dead-letter queue.')\n .optional(),\n tags: TagsSchema.describe(\n 'Tags applied to the queue (and inherited by an auto-created DLQ).',\n ).optional(),\n subscribeToSnsTopic: z\n .object({\n topicArn: z.string().min(1).describe('Topic ARN to subscribe to.'),\n rawMessageDelivery: z\n .boolean()\n .describe('Deliver SNS messages without the SNS envelope.')\n .optional(),\n filterPolicy: z\n .record(z.string(), z.unknown())\n .describe('SNS filter policy applied at subscription level.')\n .optional(),\n })\n .describe(\n 'Optional SNS topic subscription. Creates the subscription and the matching queue policy.',\n )\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\n","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n warn: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noopFn,\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const lambdaPost: Flow.StepExample = {\n title: 'Lambda POST',\n description:\n 'An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'POST', path: '/collect' },\n requestId: 'req-123',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\n title: 'API Gateway v1 POST',\n description:\n 'A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n httpMethod: 'POST',\n path: '/collect',\n requestContext: {\n requestId: 'req-789',\n identity: { sourceIp: '203.0.113.42' },\n },\n queryStringParameters: null,\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const lambdaGet: Flow.StepExample = {\n title: 'Lambda GET',\n description:\n 'An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.',\n trigger: { type: 'GET' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'GET', path: '/collect' },\n requestId: 'req-456',\n },\n rawQueryString: 'e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n e: 'page view',\n d: '{\"title\":\"Home\"}',\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport type { LambdaEvent, LambdaContext, LambdaResult } from '../types';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n [key: string]: unknown;\n}\n\nexport interface Result {\n statusCode: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\n/**\n * Find the lambda source instance from the collector's registered sources.\n */\nfunction findLambdaSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'lambda') return source;\n }\n}\n\n/**\n * Lambda source createTrigger.\n *\n * Boots the collector via startFlow, then invokes the Lambda source's push()\n * with a real API Gateway event and a minimal Lambda context.\n *\n * Content is the raw Lambda event object (API Gateway v1 or v2 format).\n * Result contains statusCode, parsed body, and headers.\n *\n * @example\n * const { trigger, flow } = await createTrigger(config);\n * const result = await trigger('POST')({ version: '2.0', ... });\n * console.log(result.statusCode, result.body);\n */\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n // Lazy startFlow\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findLambdaSource(flow.collector);\n if (!source) throw new Error('Lambda source not found in collector');\n\n // Create minimal Lambda context\n const lambdaContext = {\n awsRequestId: `test-${Date.now()}`,\n } as unknown as LambdaContext;\n\n // Call source.push with the raw Lambda event + context\n const pushFn = (\n source as unknown as {\n push: (...args: unknown[]) => Promise<LambdaResult>;\n }\n ).push;\n const lambdaResult = await pushFn(\n content as unknown as LambdaEvent,\n lambdaContext,\n );\n\n // Parse response\n let body: unknown;\n try {\n body = JSON.parse(lambdaResult.body || '{}');\n } catch {\n body = lambdaResult.body;\n }\n\n const headers: Record<string, string> = {};\n if (lambdaResult.headers) {\n for (const [k, v] of Object.entries(lambdaResult.headers)) {\n if (v !== undefined) headers[k] = String(v);\n }\n }\n\n return {\n statusCode: lambdaResult.statusCode,\n body,\n headers,\n };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/**\n * Legacy trigger — takes a source instance directly.\n * Preserved for CLI simulate path.\n */\nfunction trigger(source: {\n push: (event: LambdaEvent, context: LambdaContext) => Promise<LambdaResult>;\n}): (content: Content) => Promise<LambdaResult> {\n return async (content: Content) => {\n const lambdaEvent = { ...(content as Record<string, unknown>) };\n\n // Adapt body format: step examples may use `name`, source expects `event`\n if (lambdaEvent.body && typeof lambdaEvent.body === 'string') {\n const body = JSON.parse(lambdaEvent.body);\n if (body.name && !body.event) {\n lambdaEvent.body = JSON.stringify({\n ...body,\n event: body.name,\n name: undefined,\n });\n }\n }\n\n const context: LambdaContext = {\n awsRequestId: 'test-req',\n } as unknown as LambdaContext;\n\n return source.push(lambdaEvent as unknown as LambdaEvent, context);\n };\n}\n\nexport { createTrigger, trigger };\n","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\nexport type { Content, Result } from './trigger';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment for the AWS SQS source.\n *\n * Tests substitute the real SDK via `jest.mock('@aws-sdk/client-sqs')` and\n * `jest.mock('@aws-sdk/client-sns')`, which is the canonical pattern: imports\n * of those modules get replaced module-wide, no env-injection plumbing\n * required at the call site.\n *\n * The `simulation` list documents which SDK identifiers the source touches\n * during a simulated run, used by the simulator to know what to stub.\n */\n\nconst noopFn = (): void => undefined;\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n warn: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noopFn,\n scope: () => noopLogger,\n};\n\nconst createMockElbFn = (): Elb.Fn => {\n const fn: Elb.Fn = () => Promise.resolve({ ok: true });\n return fn;\n};\n\n/**\n * Standard mock environment for the SQS source.\n *\n * AWS SDK constructors are intentionally absent: the canonical pattern is\n * module-level `jest.mock('@aws-sdk/client-sqs')` and -sns, not env-injection.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n\nexport const simulation = ['AWS.SQSClient'];\n","import type { Flow } from '@walkeros/core';\n\n/**\n * SQS source step examples.\n *\n * Each `in` is a partial SQS Message-like (MessageId, Body, optional\n * ReceiptHandle). The trigger synthesizes the missing fields and dispatches\n * through the source's `push()` (the same pipeline the long-poll loop uses).\n * `out` records the terminal state recorded by the trigger as\n * `[method, ...args]` entries.\n */\n\nconst eventPayload = {\n event: 'page view',\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n};\n\nconst orderPayload = {\n event: 'order complete',\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n};\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view from SQS',\n description:\n 'A standard SQS message body containing a walker elb event payload as JSON.',\n in: {\n MessageId: 'm-1',\n Body: JSON.stringify(eventPayload),\n },\n out: [['message.ack', 'm-1']],\n};\n\nexport const orderComplete: Flow.StepExample = {\n title: 'Order complete from SQS',\n description: 'Order complete event flowing through the long-poll loop.',\n in: {\n MessageId: 'm-2',\n Body: JSON.stringify(orderPayload),\n },\n out: [['message.ack', 'm-2']],\n};\n\nexport const decoderText: Flow.StepExample = {\n title: 'Text decoder',\n description:\n 'When decoder is \"text\", the body string flows under data.payload.',\n in: { MessageId: 'm-3', Body: 'raw text payload' },\n out: [['message.ack', 'm-3']],\n};\n\nexport const malformedJson: Flow.StepExample = {\n title: 'Malformed JSON nacks',\n description:\n 'Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.',\n in: { MessageId: 'm-4', Body: '{not json' },\n out: [['message.nack', 'm-4']],\n};\n","import type { Collector, Trigger } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport type { SyntheticMessage, SyntheticPushResult } from '../types';\n\n/**\n * Content shape for the SQS source trigger.\n *\n * The trigger synthesizes a SyntheticMessage from this partial input and\n * dispatches it through the source's `push()` (the same pipeline the\n * long-poll loop uses).\n */\nexport interface Content {\n MessageId: string;\n Body: string;\n ReceiptHandle?: string;\n Attributes?: Record<string, string>;\n MessageAttributes?: Record<\n string,\n { DataType: string; StringValue?: string }\n >;\n}\n\n/**\n * Trigger result: the recorded ack/nack as `[method, MessageId]` entries.\n * Mirrors the destination's `[method, ...args]` recording shape.\n */\nexport type Result = Array<[string, ...unknown[]]>;\n\ninterface SqsSourceLike {\n type: string;\n push: (content?: SyntheticMessage) => Promise<SyntheticPushResult | void>;\n}\n\nfunction isSqsSource(value: unknown): value is SqsSourceLike {\n if (typeof value !== 'object' || value === null) return false;\n const candidate: { type?: unknown; push?: unknown } = value;\n return candidate.type === 'sqs' && typeof candidate.push === 'function';\n}\n\nfunction findSource(collector: Collector.Instance): SqsSourceLike | undefined {\n for (const source of Object.values(collector.sources ?? {})) {\n if (isSqsSource(source)) return source;\n }\n return undefined;\n}\n\n/**\n * SQS source createTrigger.\n *\n * Boots the collector via startFlow, finds the registered SQS source, and\n * invokes its `push()` with a synthesized message. The source dispatches the\n * synthetic message through the same handler the long-poll loop uses,\n * exercising the full decode / forward / ack-nack pipeline without touching\n * real SQS infrastructure.\n */\nexport const createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findSource(flow.collector);\n if (!source) {\n throw new Error(\n 'sqs source not registered in collector, ensure it is configured in sources',\n );\n }\n\n const synthetic: SyntheticMessage = {\n MessageId: content.MessageId,\n Body: content.Body,\n ReceiptHandle: content.ReceiptHandle,\n Attributes: content.Attributes,\n MessageAttributes: content.MessageAttributes,\n };\n\n const result = await source.push(synthetic);\n const recorded: Result = [];\n if (result && typeof result === 'object') {\n if (result.acked) recorded.push(['message.ack', content.MessageId]);\n if (result.nacked) recorded.push(['message.nack', content.MessageId]);\n }\n return recorded;\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n"],"mappings":"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","names":["examples_exports","settings","import_dev","import_dev","import_dev","import_dev","SettingsSchema","import_dev","settings","SettingsSchema","trigger","k","v","examples_exports","createTrigger","env_exports","step_exports","env_exports","push","noopFn","noopLogger","createMockElbFn","step_exports","createTrigger","trigger","result"]}
|
|
1
|
+
{"version":3,"sources":["../src/dev.ts","../src/schemas.ts","../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/sqs/schemas/index.ts","../src/sqs/schemas/settings.ts","../src/sqs/schemas/setup.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts","../src/sqs/examples/index.ts","../src/sqs/examples/env.ts","../src/sqs/examples/step.ts","../src/sqs/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './lambda/examples';\nexport * as sqsExamples from './sqs/examples';\n","// Lambda (default sub-source).\nexport { settings, SettingsSchema, type Settings } from './lambda/schemas';\nexport * from './lambda/schemas/primitives';\n\n// SQS sub-source. Prefixed so the website's <Configuration> snippet can\n// remap data.schemas.sqsSettings / sqsSetup onto data.schemas.settings.\nexport { settings as sqsSettings } from './sqs/schemas';\nexport { setup as sqsSetup } from './sqs/schemas';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema exports (for website PropertyTable + MCP package_get).\nexport const settings = zodToSchema(SettingsSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source settings schema.\n *\n * Required: queueName. All other fields optional with sensible defaults\n * applied at runtime by `getConfig`.\n */\nexport const SettingsSchema = z.object({\n queueName: z\n .string()\n .min(1)\n .describe(\n 'SQS queue short name (like walkeros-events). Required for both setup and runtime poll.',\n ),\n region: z\n .string()\n .describe('AWS region (like eu-central-1). Default: eu-central-1.')\n .optional(),\n queueUrl: z\n .string()\n .url()\n .describe(\n 'Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.',\n )\n .optional(),\n client: z\n .any()\n .describe(\n 'Pre-configured AWS SQSClient instance. Bypasses construction when supplied.',\n )\n .optional(),\n config: z\n .any()\n .describe(\n 'AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).',\n )\n .optional(),\n decoder: z\n .enum(['json', 'text', 'raw'])\n .describe(\n 'Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.',\n )\n .optional(),\n maxMessages: z\n .number()\n .int()\n .min(1)\n .max(10)\n .describe('SQS receive batch size. Cap 10. Default: 10.')\n .optional(),\n waitTimeSeconds: z\n .number()\n .int()\n .min(0)\n .max(20)\n .describe('Long-poll duration in seconds. Cap 20. Default: 20.')\n .optional(),\n visibilityTimeout: z\n .number()\n .int()\n .nonnegative()\n .describe(\n 'Per-receive visibility timeout override. Default: queue-configured value.',\n )\n .optional(),\n shutdownTimeoutMs: z\n .number()\n .int()\n .positive()\n .describe(\n 'Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.',\n )\n .optional(),\n onPushError: z\n .enum(['nack', 'ack'])\n .describe(\n 'Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source setup schema.\n *\n * Provisioning options for `walkeros setup source.<id>`. Authoritative-apply:\n * declared state is written via a single CreateQueueCommand; non-declared\n * tags or attributes are left untouched.\n */\nconst TagsSchema = z.record(z.string(), z.string());\n\nexport const SetupSchema = z.object({\n region: z.string().min(1).describe('AWS region.').optional(),\n fifoQueue: z\n .boolean()\n .describe(\n 'FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.',\n )\n .optional(),\n visibilityTimeoutSeconds: z\n .number()\n .int()\n .nonnegative()\n .describe('Visibility timeout in seconds. Default: 30.')\n .optional(),\n messageRetentionSeconds: z\n .number()\n .int()\n .positive()\n .describe('Message retention period in seconds. Default: 345600 (4 days).')\n .optional(),\n maximumMessageSize: z\n .number()\n .int()\n .min(1024)\n .max(262144)\n .describe('Max message size in bytes. Default: 262144 (256 KB).')\n .optional(),\n kmsMasterKeyId: z\n .string()\n .describe('KMS key alias or ID for at-rest encryption.')\n .optional(),\n deadLetterQueue: z\n .object({\n arn: z\n .string()\n .describe(\n 'ARN of an existing DLQ. Mutually exclusive with create: true.',\n )\n .optional(),\n create: z\n .boolean()\n .describe('Create a sibling DLQ named <queueName>-dlq. Default: false.')\n .optional(),\n maxReceiveCount: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .describe('Max receive count before message goes to DLQ. Default: 5.')\n .optional(),\n })\n .describe('Optional dead-letter queue.')\n .optional(),\n tags: TagsSchema.describe(\n 'Tags applied to the queue (and inherited by an auto-created DLQ).',\n ).optional(),\n subscribeToSnsTopic: z\n .object({\n topicArn: z.string().min(1).describe('Topic ARN to subscribe to.'),\n rawMessageDelivery: z\n .boolean()\n .describe('Deliver SNS messages without the SNS envelope.')\n .optional(),\n filterPolicy: z\n .record(z.string(), z.unknown())\n .describe('SNS filter policy applied at subscription level.')\n .optional(),\n })\n .describe(\n 'Optional SNS topic subscription. Creates the subscription and the matching queue policy.',\n )\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\n","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n warn: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noopFn,\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const lambdaPost: Flow.StepExample = {\n title: 'Lambda POST',\n description:\n 'An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'POST', path: '/collect' },\n requestId: 'req-123',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\n title: 'API Gateway v1 POST',\n description:\n 'A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n httpMethod: 'POST',\n path: '/collect',\n requestContext: {\n requestId: 'req-789',\n identity: { sourceIp: '203.0.113.42' },\n },\n queryStringParameters: null,\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const lambdaGet: Flow.StepExample = {\n title: 'Lambda GET',\n description:\n 'An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.',\n trigger: { type: 'GET' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'GET', path: '/collect' },\n requestId: 'req-456',\n },\n rawQueryString: 'e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n e: 'page view',\n d: '{\"title\":\"Home\"}',\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport type { LambdaEvent, LambdaContext, LambdaResult } from '../types';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n [key: string]: unknown;\n}\n\nexport interface Result {\n statusCode: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\n/**\n * Find the lambda source instance from the collector's registered sources.\n */\nfunction findLambdaSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'lambda') return source;\n }\n}\n\n/**\n * Lambda source createTrigger.\n *\n * Boots the collector via startFlow, then invokes the Lambda source's push()\n * with a real API Gateway event and a minimal Lambda context.\n *\n * Content is the raw Lambda event object (API Gateway v1 or v2 format).\n * Result contains statusCode, parsed body, and headers.\n *\n * @example\n * const { trigger, flow } = await createTrigger(config);\n * const result = await trigger('POST')({ version: '2.0', ... });\n * console.log(result.statusCode, result.body);\n */\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n // Lazy startFlow\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findLambdaSource(flow.collector);\n if (!source) throw new Error('Lambda source not found in collector');\n\n // Create minimal Lambda context\n const lambdaContext = {\n awsRequestId: `test-${Date.now()}`,\n } as unknown as LambdaContext;\n\n // Call source.push with the raw Lambda event + context\n const pushFn = (\n source as unknown as {\n push: (...args: unknown[]) => Promise<LambdaResult>;\n }\n ).push;\n const lambdaResult = await pushFn(\n content as unknown as LambdaEvent,\n lambdaContext,\n );\n\n // Parse response\n let body: unknown;\n try {\n body = JSON.parse(lambdaResult.body || '{}');\n } catch {\n body = lambdaResult.body;\n }\n\n const headers: Record<string, string> = {};\n if (lambdaResult.headers) {\n for (const [k, v] of Object.entries(lambdaResult.headers)) {\n if (v !== undefined) headers[k] = String(v);\n }\n }\n\n return {\n statusCode: lambdaResult.statusCode,\n body,\n headers,\n };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/**\n * Legacy trigger — takes a source instance directly.\n * Preserved for CLI simulate path.\n */\nfunction trigger(source: {\n push: (event: LambdaEvent, context: LambdaContext) => Promise<LambdaResult>;\n}): (content: Content) => Promise<LambdaResult> {\n return async (content: Content) => {\n const lambdaEvent = { ...(content as Record<string, unknown>) };\n\n // Adapt body format: step examples may use `name`, source expects `event`\n if (lambdaEvent.body && typeof lambdaEvent.body === 'string') {\n const body = JSON.parse(lambdaEvent.body);\n if (body.name && !body.event) {\n lambdaEvent.body = JSON.stringify({\n ...body,\n event: body.name,\n name: undefined,\n });\n }\n }\n\n const context: LambdaContext = {\n awsRequestId: 'test-req',\n } as unknown as LambdaContext;\n\n return source.push(lambdaEvent as unknown as LambdaEvent, context);\n };\n}\n\nexport { createTrigger, trigger };\n","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\nexport type { Content, Result } from './trigger';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment for the AWS SQS source.\n *\n * Tests substitute the real SDK via `jest.mock('@aws-sdk/client-sqs')` and\n * `jest.mock('@aws-sdk/client-sns')`, which is the canonical pattern: imports\n * of those modules get replaced module-wide, no env-injection plumbing\n * required at the call site.\n *\n * The `simulation` list documents which SDK identifiers the source touches\n * during a simulated run, used by the simulator to know what to stub.\n */\n\nconst noopFn = (): void => undefined;\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n warn: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noopFn,\n scope: () => noopLogger,\n};\n\nconst createMockElbFn = (): Elb.Fn => {\n const fn: Elb.Fn = () => Promise.resolve({ ok: true });\n return fn;\n};\n\n/**\n * Standard mock environment for the SQS source.\n *\n * AWS SDK constructors are intentionally absent: the canonical pattern is\n * module-level `jest.mock('@aws-sdk/client-sqs')` and -sns, not env-injection.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n\nexport const simulation = ['AWS.SQSClient'];\n","import type { Flow } from '@walkeros/core';\n\n/**\n * SQS source step examples.\n *\n * Each `in` is a partial SQS Message-like (MessageId, Body, optional\n * ReceiptHandle). The trigger synthesizes the missing fields and dispatches\n * through the source's `push()` (the same pipeline the long-poll loop uses).\n * `out` records the terminal state recorded by the trigger as\n * `[method, ...args]` entries.\n */\n\nconst eventPayload = {\n event: 'page view',\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n};\n\nconst orderPayload = {\n event: 'order complete',\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n};\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view from SQS',\n description:\n 'A standard SQS message body containing a walker elb event payload as JSON.',\n in: {\n MessageId: 'm-1',\n Body: JSON.stringify(eventPayload),\n },\n out: [['message.ack', 'm-1']],\n};\n\nexport const orderComplete: Flow.StepExample = {\n title: 'Order complete from SQS',\n description: 'Order complete event flowing through the long-poll loop.',\n in: {\n MessageId: 'm-2',\n Body: JSON.stringify(orderPayload),\n },\n out: [['message.ack', 'm-2']],\n};\n\nexport const decoderText: Flow.StepExample = {\n title: 'Text decoder',\n description:\n 'When decoder is \"text\", the body string flows under data.payload.',\n in: { MessageId: 'm-3', Body: 'raw text payload' },\n out: [['message.ack', 'm-3']],\n};\n\nexport const malformedJson: Flow.StepExample = {\n title: 'Malformed JSON nacks',\n description:\n 'Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.',\n in: { MessageId: 'm-4', Body: '{not json' },\n out: [['message.nack', 'm-4']],\n};\n","import type { Collector, Trigger } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport type { SyntheticMessage, SyntheticPushResult } from '../types';\n\n/**\n * Content shape for the SQS source trigger.\n *\n * The trigger synthesizes a SyntheticMessage from this partial input and\n * dispatches it through the source's `push()` (the same pipeline the\n * long-poll loop uses).\n */\nexport interface Content {\n MessageId: string;\n Body: string;\n ReceiptHandle?: string;\n Attributes?: Record<string, string>;\n MessageAttributes?: Record<\n string,\n { DataType: string; StringValue?: string }\n >;\n}\n\n/**\n * Trigger result: the recorded ack/nack as `[method, MessageId]` entries.\n * Mirrors the destination's `[method, ...args]` recording shape.\n */\nexport type Result = Array<[string, ...unknown[]]>;\n\ninterface SqsSourceLike {\n type: string;\n push: (content?: SyntheticMessage) => Promise<SyntheticPushResult | void>;\n}\n\nfunction isSqsSource(value: unknown): value is SqsSourceLike {\n if (typeof value !== 'object' || value === null) return false;\n const candidate: { type?: unknown; push?: unknown } = value;\n return candidate.type === 'sqs' && typeof candidate.push === 'function';\n}\n\nfunction findSource(collector: Collector.Instance): SqsSourceLike | undefined {\n for (const source of Object.values(collector.sources ?? {})) {\n if (isSqsSource(source)) return source;\n }\n return undefined;\n}\n\n/**\n * SQS source createTrigger.\n *\n * Boots the collector via startFlow, finds the registered SQS source, and\n * invokes its `push()` with a synthesized message. The source dispatches the\n * synthetic message through the same handler the long-poll loop uses,\n * exercising the full decode / forward / ack-nack pipeline without touching\n * real SQS infrastructure.\n */\nexport const createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findSource(flow.collector);\n if (!source) {\n throw new Error(\n 'sqs source not registered in collector, ensure it is configured in sources',\n );\n }\n\n const synthetic: SyntheticMessage = {\n MessageId: content.MessageId,\n Body: content.Body,\n ReceiptHandle: content.ReceiptHandle,\n Attributes: content.Attributes,\n MessageAttributes: content.MessageAttributes,\n };\n\n const result = await source.push(synthetic);\n const recorded: Result = [];\n if (result && typeof result === 'object') {\n if (result.acked) recorded.push(['message.ack', content.MessageId]);\n if (result.nacked) recorded.push(['message.nack', content.MessageId]);\n }\n return recorded;\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n"],"mappings":"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","names":["examples_exports","settings","import_dev","import_dev","import_dev","import_dev","SettingsSchema","import_dev","settings","SettingsSchema","trigger","k","v","examples_exports","createTrigger","env_exports","step_exports","env_exports","push","noopFn","noopLogger","createMockElbFn","step_exports","createTrigger","trigger","result"]}
|
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 E,buildCacheContext as I,clone as M,compileCache as R,checkCache as $,storeCache as N,compileNext as H,createIngest as G,debounce as _,getId as B,getGrantedConsent as L,isDefined as Q,isFunction as J,isObject as U,processEventMapping as z,resolveNext as W,tryCatchAsync as F,useHooks as V}from"@walkeros/core";import{isArray as K}from"@walkeros/core";import{tryCatch as X,tryCatchAsync as Y}from"@walkeros/core";import{createIngest as Z,getMappingValue as ee,tryCatchAsync as te,compileNext as ne,resolveNext as oe,compileCache as se,checkCache as re,storeCache as ie,applyUpdate as ae,buildCacheContext as ce}from"@walkeros/core";import{createIngest as ue,isObject as le,tryCatchAsync as de,useHooks as fe,compileNext as ge,resolveNext as pe,compileCache as me,checkCache as he,storeCache as be,buildCacheContext as ye,validateTransformerEntry as ve,processEventMapping as we}from"@walkeros/core";import{assign as ke,getSpanId as Se,isFunction as Oe,isString as qe}from"@walkeros/core";import{isObject as xe}from"@walkeros/core";import{createIngest as Ae,getGrantedConsent as je,processEventMapping as Ce,tryCatchAsync as De,useHooks as Pe}from"@walkeros/core";import{useHooks as Te,tryCatchAsync as Ee}from"@walkeros/core";import{useHooks as Ie}from"@walkeros/core";var Me={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 Re(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function $e(e){const t={};for(const[n,o]of Object.entries(e)){const e=ge(o.config?.next);t[n]="static"===e?.type||"chain"===e?.type?{next:e.value}:{}}return t}function Ne(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 He(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 Ge(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:ue(n),config:t.config,env:Qe(t.config.env)};s.debug("init");const i=await fe(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 _e(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 fe(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}function Be(e,t){if(e)return pe(ge(e),t)??void 0}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 de(Ge)(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?me(u):void 0,d=l?Re(l,e):void 0;let f;if(l&&d){const e=ye(s,a),t=he(l,d,e);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=He(Be(g,ye(s,a)),$e(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};if(o.stopped)return{event:Array.isArray(o.event)?o.event[0]:o.event,respond:o.respond??c,stopped:!0};o.respond&&(c=o.respond),a=Array.isArray(o.event)?o.event[0]:o.event}}const p=await de(_e,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]}}:ue("unknown");if(n.next){const s=Be(n.next,ye(u,o));if(s){const n=He(s,$e(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){const o=Be(r,ye(s,a));if(!o){n&&(a=n);continue}const u=He(o,$e(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)}f&&d&&be(d,f.key,a,f.ttl);const m=r.config.next?ge(r.config.next):void 0,h="case"===m?.type||"gate"===m?.type||"sequence"===m?.type;if((!p||"object"==typeof p&&!p.next)&&m&&h){const n=pe(m,ye(s,a));if(n){const o=He(n,$e(t));if(o.length>0)return Le(e,t,o,a,s,c,i)}return{event:a,respond:c}}}return{event:a,respond:c}}function Qe(e){return e&&le(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 te(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=Z(t);const f=u?se({...u,stop:u.stop??!0}):void 0,g=ne(a),p="static"!==g?.type&&"chain"!==g?.type||!g?void 0:He(oe(g),$e(e.transformers)),m=ne(c),h="static"!==m?.type&&"chain"!==m?.type||!m?void 0:He(oe(m),$e(e.transformers)),b=e.logger.scope("source").scope(t),y={push:async(n,o={})=>{let r;const i=h??(m?He(oe(m,ce(d)),$e(e.transformers)):[]);let a=[n];if(i.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Le(e,e.transformers,i,n,d,l,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(l=o.respond),{ok:!0};o.respond&&(l=o.respond),a=Array.isArray(o.event)?o.event:[o.event]}if(f){const t=Re(f,e);if(t){const n=ce(d),o=re(f,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&f.stop){let t=o.value;return o.rule.update&&(t=await ae(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),l?.(t),{ok:!0}}if("MISS"===o.status&&f.stop&&l){const s=l,i=o.rule.update,a={...n,cache:{status:"MISS"}},c=o.key,u=o.rule.ttl;l=n=>{ie(t,c,n,u),i?r=(async()=>{const t=await ae(n,i,a,e);s(t)})():s(n)}}"MISS"!==o.status||f.stop||ie(t,o.key,!0,o.rule.ttl)}}}const c=p??(g?He(oe(g,ce(d)),$e(e.transformers)):[]);let u={ok:!0};for(const n of a)u=await e.push(n,{...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=Z(t));const o=await ee(n,s.ingest,{collector:e}),r=Z(t);d={...r,...o,_meta:r._meta}},setRespond:e=>{l=e}},w=await te(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)};X(t.on)(o,a)}function Ve(e,t,n,o){let s;switch(t){case Me.Consent:s=o||e.consent;break;case Me.Session:s=e.session;break;case Me.User:s=o||e.user;break;case Me.Custom:s=o||e.custom;break;case Me.Globals:s=o||e.globals;break;case Me.Config:s=o||e.config;break;case Me.Ready:case Me.Run:default:s=void 0}if(n.length)switch(t){case Me.Consent:!function(e,t,n){const o=n||e.consent,s=We(e,Me.Consent);t.forEach(e=>{Object.keys(o).filter(t=>t in e).forEach(t=>{X(e[t])(o,s)})})}(e,n,o);break;case Me.Ready:!function(e,t){if(!e.allowed)return;const n=We(e,Me.Ready);t.forEach(e=>{X(e)(void 0,n)})}(e,n);break;case Me.Run:!function(e,t){if(!e.allowed)return;const n=We(e,Me.Run);t.forEach(e=>{X(e)(void 0,n)})}(e,n);break;case Me.Session:!function(e,t){if(!e.session)return;const n=We(e,Me.Session);t.forEach(t=>{X(t)(e.session,n)})}(e,n);break;default:{const o=We(e,t);n.forEach(e=>{"function"==typeof e&&X(e)(s,o)});break}}}function Ke(e,t,n,o){if(!e)return[];const s=t??H(e),r=W(s,I(o));return r?He(r,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=e.transformers?$e(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push(M(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:G("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await 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 d=[],f=u.filter(e=>{const t=L(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(s.queuePush.push(...f),!d.length)return{id:o,destination:s,queue:u};let g,p,m=!1;try{m=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(!m)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const h=s.config.before,b=Ke(h,h&&Array.isArray(h)?H(h):void 0,c,l),y=s.config.next,v=y&&Array.isArray(y)?H(y):void 0,w=s.config?.cache,k=w?R(w):void 0,S=k?Re(k,e):void 0;let O=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=E(i,t.globals),t.user=E(a,t.user),k?.stop&&S){const e=I(l,t),n=$(k,S,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(b.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Le(e,e.transformers,b,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(k&&!k.stop&&S){const e=I(l,u),n=$(k,S,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let m=!1;const h=await F(et,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,m=!0,s.dlq.push([u,t])})(e,s,o,u,l,d);if(O+=Date.now()-f,r&&S&&void 0===s.config.mock&&N(S,r.key,h??!0,r.ttl),void 0!==h&&(p=h),!m&&y){void 0!==h&&(l._response=h);const t=Ke(y,v,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Le(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:O}})),l={},d={},f={};for(const t of u){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,f[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?d[t.id]=n:(l[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return tt({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}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 V(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 z(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 V(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}),V(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}=Ne(e,"before"),{config:i}=Ne({...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 Me.Config:xe(n)&&(ke(e.config,n,{shallow:!1}),r=n,i=!0);break;case Me.Consent:if(xe(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 Me.Custom:xe(n)&&(e.custom=ke(e.custom,n),r=n,i=!0);break;case Me.Destination:xe(n)&&("code"in n&&xe(n.code)?s=await Xe(e,n,o):Oe(n.push)&&(s=await Xe(e,{code:n},o)));break;case Me.Globals:xe(n)&&(e.globals=ke(e.globals,n),r=n,i=!0);break;case Me.On:qe(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=K(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,Ve(e,t,r)}(e,n,o);break;case Me.Ready:i=!0;break;case Me.Run:s=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=ke(e.consent,t.consent)),t.user&&(e.user=ke(e.user,t.user)),t.globals&&(e.globals=ke(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=ke(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 Me.Session:i=!0;break;case Me.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 Me.User:xe(n)&&(ke(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 Me.Consent:s=o||e.consent;break;case Me.Session:s=e.session;break;case Me.User:s=o||e.user;break;case Me.Custom:s=o||e.custom;break;case Me.Globals:s=o||e.globals;break;case Me.Config:s=o||e.config;break;case Me.Ready:case Me.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 Y(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=Se(),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 Pe(async(n,o={})=>await De(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??Ae(r||"unknown");if(c){const t=await Ce(g,c,e);if(t.ignore)return tt({ok:!0});if(c.consent&&!je(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.stopped)return n.respond&&(f=n.respond),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.1.0-next-1778668930820"},...e})),r.command=(a=rt,Te(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=Ie(l,"StoreGet",e.hooks,e.logger),u.set=Ie(d,"StoreSet",e.hooks,e.logger),u.delete=Ie(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,i=ve(s);if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=Ne(s,"before"),{config:c}=Ne({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:ue(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await we(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),m=await p(g);void 0!==s.before&&void 0===m.config?.before&&(m.config={...m.config??{},before:s.before}),void 0!==s.next&&void 0===m.config?.next&&(m.config={...m.config??{},next:s.next}),n[o]=m}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 te(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 h=p.record(p.string(),p.string()),m=p.object({region:p.string().min(1).describe("AWS region.").optional(),fifoQueue:p.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:p.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:p.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:p.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:p.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:p.object({arn:p.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:p.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:p.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:h.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:p.object({topicArn:p.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:p.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:p.record(p.string(),p.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),b=d(g),y=d(m),v={};t(v,{createTrigger:()=>At,env:()=>w,step:()=>x,trigger:()=>Ct});var w={};t(w,{push:()=>O});var k=()=>()=>Promise.resolve({ok:!0}),S=()=>{},q={error:S,warn:S,info:S,debug:S,throw:e=>{throw"string"==typeof e?new Error(e):e},json:S,scope:()=>q},O={get push(){return k()},get command(){return k()},get elb(){return k()},logger:q},x={};t(x,{apiGatewayV1Post:()=>C,lambdaGet:()=>j,lambdaPost:()=>A});var A={title:"Lambda POST",description:"An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-123"},body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},C={title:"API Gateway v1 POST",description:"A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{httpMethod:"POST",path:"/collect",requestContext:{requestId:"req-789",identity:{sourceIp:"203.0.113.42"}},queryStringParameters:null,body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},j={title:"Lambda GET",description:"An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.",trigger:{type:"GET"},in:{version:"2.0",requestContext:{http:{method:"GET",path:"/collect"},requestId:"req-456"},rawQueryString:"e=page+view&d=%7B%22title%22%3A%22Home%22%7D",isBase64Encoded:!1},out:[["elb",{e:"page view",d:'{"title":"Home"}'}]]};import{assign as P}from"@walkeros/core";import{assign as E,createLogger as I}from"@walkeros/core";import{assign as D,buildCacheContext as M,clone as T,compileCache as $,checkCache as _,storeCache as R,createIngest as H,debounce as N,getId as B,getGrantedConsent as z,getNextSteps as G,isDefined as F,isFunction as L,isObject as Q,processEventMapping as J,stepId as U,tryCatchAsync as W,useHooks as K}from"@walkeros/core";import{isArray as V,FatalError as Y}from"@walkeros/core";import{tryCatch as X,tryCatchAsync as Z}from"@walkeros/core";import{createIngest as ee,FatalError as te,getMappingValue as ne,tryCatchAsync as oe,getNextSteps as se,compileCache as re,checkCache as ie,storeCache as ae,applyUpdate as ce,buildCacheContext as ue}from"@walkeros/core";import{createIngest as le,FatalError as de,isObject as fe,tryCatchAsync as ge,useHooks as pe,getNextSteps as he,compileCache as me,checkCache as be,storeCache as ye,buildCacheContext as ve,validateStepEntry as we,processEventMapping as ke}from"@walkeros/core";import{assign as Se,getSpanId as qe,isFunction as Oe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as Ce,FatalError as je,getGrantedConsent as Pe,processEventMapping as Ee,tryCatchAsync as Ie,useHooks as De}from"@walkeros/core";import{FatalError as Me,useHooks as Te,tryCatchAsync as $e}from"@walkeros/core";import{useHooks as _e}from"@walkeros/core";import{compileMatcher as Re}from"@walkeros/core";var He={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function Ne(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Be(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?t[n]={next:e}:t[n]={}}return t}function ze(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Ge(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function Fe(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:le(n),config:t.config,env:Ue(t.config.env)};s.debug("init");const i=await pe(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function Le(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Ue(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await pe(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}function Qe(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:le(t)}async function Je(e,t,n,o,s,r,i){s||(s=le(n[0]??"chain")),i&&s._meta&&(s._meta.chainPath=i);let a=o,c=r;for(const o of n){const r=t[o];if(!r){e.logger.warn(`Transformer not found: ${o}`);continue}if(s&&s._meta&&s._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o}`),{event:null,respond:c};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await ge(Fe,t=>{if(t instanceof de)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:c};if(i&&void 0!==r.config?.chainMocks?.[i]){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),a=t;continue}if(void 0!==r.config?.mock){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),a=r.config.mock;continue}if(r.config?.disabled)continue;const u=r.config?.cache,l=u?me(u):void 0,d=l?Ne(l,e):void 0;let f;if(l&&d){const e=ve(s,a),t=await be(l,d,e);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=he(g,ve(s,a));if(1===n.length){const o=Ge(n[0],Be(t));if(o.length>0){const n=await Je(e,t,o,a,s,c,i);if(null===n.event)return{event:null,respond:n.respond??c};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:n.respond??c,stopped:!0};n.respond&&(c=n.respond),a=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),a,Qe(s,n),void 0,i)))}const p=await ge(Le,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,a,s,c);if(!1===p)return{event:null,respond:c};if(Array.isArray(p)){const r=n.slice(n.indexOf(o)+1),u=await Promise.all(p.map(async n=>{const o=n.event||a,u=Qe(s,"unknown");if(n.next){const s=he(n.next,ve(u,o));if(0===s.length)return{event:o,respond:c};if(1===s.length){const n=Ge(s[0],Be(t));return n.length>0?Je(e,t,n,o,u,c,i):{event:o,respond:c}}return(await Promise.all(s.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),o,Qe(u,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Je(e,t,r,o,u,c,i):{event:o,respond:c}}));let l=c;const d=[];for(const e of u.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(l=t.respond),null===t.event)continue;Array.isArray(t.event)?d.push(...t.event):d.push(t.event)}else d.push(e);return 0===d.length?{event:null,respond:l}:1===d.length?{event:d[0],respond:l}:{event:d,respond:l}}if(p&&"object"==typeof p){const{event:n,respond:o,next:r}=p;if(o&&(c=o),void 0!==r){const o=he(r,ve(s,a));if(0===o.length){n&&(a=n);continue}if(1===o.length){const u=Ge(o[0],Be(t));return u.length>0?Je(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}return await Promise.all(o.map(o=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(o,Be(t)),n||a,Qe(s,o),void 0,i))),{event:null,respond:void 0}}n&&(a=n)}f&&d&&ye(d,f.key,a,f.ttl);const h=r.config.next,m="string"==typeof h||Array.isArray(h)&&h.every(e=>"string"==typeof e),b=void 0!==h&&!m;if((!p||"object"==typeof p&&!p.next)&&b){const n=he(r.config.next,ve(s,a));if(1===n.length){const o=Ge(n[0],Be(t));return o.length>0?Je(e,t,o,a,s,c,i):{event:a,respond:c}}return n.length>1?(await Promise.all(n.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),a,Qe(s,n),void 0,i))),{event:null,respond:void 0}):{event:a,respond:c}}}return{event:a,respond:c}}function Ue(e){return e&&fe(e)?e:{}}function We(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Ke(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o)await oe(t.on,t=>{if(t instanceof te)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,error:t})})(n,r)}function Ve(e){return Boolean(e.config.init)&&!e.config.require?.length}async function Ye(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n,l=u,d=l?re({...l,stop:l.stop??!0}):void 0,f=We(a)?Ge(a,Be(e.transformers)):void 0,g=We(c)?Ge(c,Be(e.transformers)):void 0,p=r.push,h=p??e.push,m=Boolean(p),b=async(n,o,r)=>{let i;const u=g??(void 0!==c?(()=>{const t=se(c,ue(r.ingest));return 0===t.length?[]:Ge(1===t.length?t[0]:t,Be(e.transformers))})():[]);let l=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Je(e,e.transformers,u,n,r.ingest,r.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),l=Array.isArray(o.event)?o.event:[o.event]}if(d){const t=Ne(d,e);if(t){const n=ue(r.ingest),o=await ie(d,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&d.stop){let t=o.value;return o.rule.update&&(t=await ce(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&d.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},u=o.key,l=o.rule.ttl,d=n=>{ae(t,u,n,l),a?i=(async()=>{const t=await ce(n,a,c,e);s(t)})():s(n)};r.respond=d}"MISS"!==o.status||d.stop||ae(t,o.key,!0,o.rule.ttl)}}}const p=f?{kind:"single",preChain:f}:void 0!==a?(()=>{const t=se(a,ue(r.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Ge(t[0],Be(e.transformers))}:{kind:"many",branches:t.map(t=>Ge(t,Be(e.transformers)))}})():{kind:"single",preChain:[]};let b={ok:!0};for(const n of l)"many"===p.kind?(await Promise.all(p.branches.map((i,a)=>oe(async()=>m?h(n):h(n,{...o,id:t,ingest:Qe(r.ingest,`${t}.${a}`),respond:void 0,mapping:s,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),b={ok:!0}):b=m?await h(n):await h(n,{...o,id:t,ingest:r.ingest,respond:r.respond,mapping:s,preChain:p.preChain});return i&&await i,b},y=async n=>{const o=ee(t);if(!s.ingest||void 0===n)return o;const r=await ne(n,s.ingest,{collector:e});return{...o,...r,_meta:o._meta}},v=e.logger.scope("source").scope(t),w={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:v,...r,push:async(e,n={})=>{const o={ingest:ee(t),respond:void 0};return b(e,n,o)}},k={collector:e,logger:v,id:t,config:s,env:w,withScope:async(e,t,n)=>{const o={ingest:await y(e),respond:t};return n({...w,push:(e,t={})=>b(e,t,o),ingest:o.ingest,respond:o.respond})}},S=await oe(o,n=>{if(n instanceof te)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(k);if(!S)return;const q=S.type||"unknown",O=e.logger.scope(q).scope(t);return w.logger=O,i&&(S.config={...S.config,primary:i}),S}function Xe(e,t,n,o){if(n instanceof Y)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function Ze(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function et(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:bt(t.env,t.config.env)};X(t.on,t=>Xe(e,"destination",t,{destId:n,type:o}))(o,a)}function tt(e,t,n,o){let s;switch(t){case He.Consent:s=o||e.consent;break;case He.Session:s=e.session;break;case He.User:s=o||e.user;break;case He.Custom:s=o||e.custom;break;case He.Globals:s=o||e.globals;break;case He.Config:s=o||e.config;break;case He.Ready:case He.Run:default:s=void 0}if(n.length)switch(t){case He.Consent:!function(e,t,n){const o=n||e.consent,s=Ze(e,He.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{X(t[n],t=>Xe(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case He.Ready:!function(e,t){if(!e.allowed)return;const n=Ze(e,He.Ready);t.forEach(t=>{X(t,t=>Xe(e,"ready",t))(void 0,n)})}(e,n);break;case He.Run:!function(e,t){if(!e.allowed)return;const n=Ze(e,He.Run);t.forEach(t=>{X(t,t=>Xe(e,"run",t))(void 0,n)})}(e,n);break;case He.Session:!function(e,t){if(!e.session)return;const n=Ze(e,He.Session);t.forEach(t=>{X(t,t=>Xe(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=Ze(e,t);n.forEach(n=>{"function"==typeof n&&X(n,n=>Xe(e,"generic",n,{type:t}))(s,o)});break}}}function nt(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var ot=new WeakMap;function st(e,t,n,o){ot.get(e)||(ot.set(e,!0),t.warn(n,o))}function rt(e){ot.delete(e)}var it=Object.freeze({batched:!0});function at(e){return e===it}function ct(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function ut(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function lt(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function dt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Ge(e,t);if("string"==typeof e)return Ge(e,t);const o=G(e,M(n));return 0===o.length?[]:1===o.length?Ge(o[0],t):Ge(o,t)}async function ft(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return ht({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=nt(e.queue,t,{max:n});if(o.dropped>0){const t=lt(e.status,U("collector"),"queue",o.dropped);st(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&rt(e.queue);e.status.in++}o||(o=e.destinations);const c=e.transformers?Be(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push(T(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:H("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await gt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const d=[],f=u.filter(e=>{const t=z(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(f.length>0){const t=s.queuePush,n=s.config.id||o,r={max:s.config.queueMax??1e3};let i=0;for(const e of f)i+=nt(t,e,r).dropped;if(i>0){ut(e,n);const o=lt(e.status,U("destination",n),"queue",i);st(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&rt(t)}if(!d.length)return{id:o,destination:s,queue:u};let g,p,h=!1;try{h=await gt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!h)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const m=dt(s.config.before,c,l),b=s.config.next,y=s.config?.cache,v=y?$(y):void 0,w=v?Ne(v,e):void 0;let k=0,S=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=D(i,t.globals),t.user=D(a,t.user),v?.stop&&w){const e=M(l,t),n=await _(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Je(e,e.transformers,m,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(v&&!v.stop&&w){const e=M(l,u),n=await _(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let h=!1;const y=await W(pt,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,h=!0;const r=s.dlq,i=s.config.id||o,a={max:s.config.dlqMax??100},c=nt(r,[u,t],a);if(c.dropped>0){ut(e,i);const t=lt(e.status,U("destination",i),"dlq",c.dropped);st(r,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i,cap:a.max,droppedCount:t})}else r.length<a.max&&rt(r)})(e,s,o,u,l,d);if(k+=Date.now()-f,r&&w&&void 0===s.config.mock&&R(w,r.key,y??!0,r.ttl),void 0===y||at(y)||(p=y),at(y)&&S++,!h&&b){void 0!==y&&(l._response=y);const t=dt(b,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Je(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:k,batchedCount:S,allowedCount:d.length}})),l={},d={},f={};for(const t of u){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};ut(e,t.id);const s=e.status.destinations[t.id],r=Date.now();if(s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0,t.error)o.error=t.error,f[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)d[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0;(Math.max(0,i-n)>0||0===i)&&(l[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++)}}return ht({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}async function gt(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(o),r={collector:e,logger:s,id:n,config:t.config,env:bt(t.env,t.config.env)};s.debug("init");const i=await K(t.init,"DestinationInit",e.hooks,e.logger)(r);if(!1===i)return i;if(t.config={...i||t.config,init:!0},t.queueOn?.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)et(e,t,n,s,r)}s.debug("init done")}return!0}async function pt(e,t,n,o,s,r){const{config:i}=t,a=await J(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",u=e.logger.scope(c),l={collector:e,logger:u,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...bt(t.env,i.env),...r?{respond:r}:{}}};if(void 0!==i.mock)return u.debug("mock",{event:a.event.name}),i.mock;const d=a.mapping,f=a.mappingKey||"* *";if(d?.batch&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=ct(d.batch),r=ct(i.batch),a=s.wait??r.wait??3e4,c=s.size??r.size??1e3,l=s.age??r.age??3e4,g=bt(t.env,i.env),p=N(async()=>{const o=t.batches[f].batched;if(0===o.entries.length)return;const s={key:o.key,entries:o.entries,events:o.events,data:o.data};o.entries=[],o.events=[],o.data=[];const r=s.entries[0],a={collector:e,logger:u,id:n,config:i,data:void 0,rule:r.rule,ingest:r.ingest,env:{...g,...r.respond?{respond:r.respond}:{}}};u.debug("push batch",{events:s.entries.length});const c=t.config.id||n,l=ut(e,c);let d=!0;await W(K(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),n=>{d=!1;const o=t.dlq=t.dlq||[],r={max:t.config.dlqMax??100};let i=0;for(const e of s.entries)i+=nt(o,[e.event,n],r).dropped;if(i>0){const t=lt(e.status,U("destination",c),"dlq",i);st(o,u,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:r.max,droppedCount:t})}else o.length<r.max&&rt(o);l.failed+=s.entries.length,l.dlqSize=o.length,e.status.failed+=s.entries.length,u.error("Push batch failed",{error:n instanceof Error?n.message:String(n),entries:s.entries.length})})(s,a),u.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-s.entries.length),d&&(l.count+=s.entries.length,l.lastAt=Date.now(),e.status.out+=s.entries.length)},{wait:a,size:c,age:l});t.batches[f]={batched:o,batchFn:()=>{p()},flush:async()=>{await p.flush()}}}const o=t.batches[f];o.batched.entries.push({event:a.event,ingest:s,respond:r,rule:d,data:a.data}),o.batched.events.push(a.event),F(a.data)&&o.batched.data.push(a.data);const c=t.config.id||n,l=ut(e,c);return l.inFlightBatch=(l.inFlightBatch??0)+1,o.batchFn(),it}{u.debug("push",{event:a.event.name});const n=await K(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}}function ht(e){return{ok:!e?.failed,...e}}function mt(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=ze(e,"before"),{config:i}=ze({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=bt(t.env,o);return{...t,config:a,env:c}}function bt(e,t){return e||t?t?e&&Q(e)&&Q(t)?{...e,...t}:t:e:{}}async function yt(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};try{await Promise.race([s(a),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function vt(e,t,n){let o,s,r=!1;switch(t){case He.Config:Ae(n)&&(Se(e.config,n,{shallow:!1}),s=n,r=!0);break;case He.Consent:if(Ae(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=P(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case He.Custom:Ae(n)&&(e.custom=Se(e.custom,n),s=n,r=!0);break;case He.Destination:Ae(n)&&"code"in n&&Ae(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!L(n.push))return ht({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let u=r?{...c,before:r}:{...c};i&&(u={...u,next:i}),a&&(u={...u,cache:a});const l={...n,config:u,env:bt(n.env,s)};let d=l.config.id;if(!d)do{d=B(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=l,!1!==l.config.queue&&(l.queuePush=[...e.queue]),ft(e,void 0,{},{[d]:l})}(e,n));break;case He.Globals:Ae(n)&&(e.globals=Se(e.globals,n),s=n,r=!0);break;case He.Hook:if(Ae(n)&&xe(n.name)&&Oe(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case He.On:if(Ae(n)&&xe(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=V(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,tt(e,t,r)}(e,t,o)}break;case He.Ready:r=!0;break;case He.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=Se(e.consent,t.consent)),t.user&&(e.user=Se(e.user,t.user)),t.globals&&(e.globals=Se(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=Se(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ft(e)}(e,n),r=!0;break;case He.Session:r=!0;break;case He.Shutdown:await async function(e){const t=e.logger;await yt(e.sources,"source",t),await yt(e.destinations,"destination",t),await yt(e.transformers,"transformer",t),await yt(e.stores,"store",t)}(e);break;case He.User:Ae(n)&&(Se(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case He.Consent:s=o||e.consent;break;case He.Session:s=e.session;break;case He.User:s=o||e.user;break;case He.Custom:s=o||e.custom;break;case He.Globals:s=o||e.globals;break;case He.Config:s=o||e.config;break;case He.Ready:case He.Run:default:s=void 0}let i=!1;for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(Ve(o)?!1===await Z(o.on,o=>Xe(e,"source",o,{sourceId:n,type:t}))(t,s)&&(i=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:s})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:s});et(e,o,n,t,s)}});for(const[t,n]of Object.entries(e.sources))Ve(n)&&n.queueOn?.length&&await Ke(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=o.config?.require;if(!s)continue;const r=s.indexOf(t);if(-1===r)continue;if(s.splice(r,1),s.length>0)continue;delete e.pending.destinations[n];const i=mt(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),tt(e,t,r,o),!i}(e,t,void 0,s),o=await ft(e)),o||ht({ok:!0})}function wt(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:u={},user:l=e.user,nested:d=[],consent:f=e.consent,id:g=qe(),trigger:p="",entity:h=n,action:m=o,timing:b=0,source:y={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:u,user:l,nested:d,consent:f,id:g,trigger:p,entity:h,action:m,timestamp:s,timing:b,source:y}}function kt(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function St(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i}=t,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=n.rules.map(e=>({match:e.match?Re(e.match):()=>!0,ttl:e.ttl})),u=e=>`${s}:${e}`;function l(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return c.find(e=>e.match(n))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(t){const n=u(t),s=await o.get(n);if(void 0!==s)return a.hits++,s;const r=d.get(n);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=l(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),a.populates++}catch(e){f("set",t,e)}return s}finally{d.delete(n)}})();return d.set(n,i),i},async set(t,n,s){a.writes++,await e.set(t,n,s);const r=l(t,n);if(r)try{await o.set(u(t),n,1e3*r.ttl)}catch(e){f("set",t,e)}},async delete(t){a.deletes++,await e.delete(t);try{await o.delete(u(t))}catch(e){f("delete",t,e)}}};function f(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function qt(e,t){const n=t.get,o=t.set,s=t.delete;t.get=_e(n,"StoreGet",e.hooks,e.logger),t.set=_e(o,"StoreSet",e.hooks,e.logger),t.delete=_e(s,"StoreDelete",e.hooks,e.logger)}async function Ot(e){const t=E({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=I(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},logger:o,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var i,a;r.push=function(e,t){return De(async(n,o={})=>await Ie(async()=>{const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:u,include:l,exclude:d}=o;let f=a,g=n;const p=l||d?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,l,d):void 0,h=i??Ce(r||"unknown");if(c){const t=await Ee(g,c,e);if(t.ignore)return ht({ok:!0});if(c.consent&&!Pe(c.consent,e.consent,t.event.consent))return ht({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Je(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return ht({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),ht({ok:!0});if(n.respond&&(f=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=wt(e,o);return ft(e,s,{id:r,ingest:h,respond:f},p)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return o[0]??ht({ok:!0})}g=n.event}const m=t(g),b=wt(e,m),y=await ft(e,b,{id:r,ingest:h,respond:f},p);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return y},t=>{if(t instanceof je)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),ht({ok:!1})})(),"Push",e.hooks,e.logger)}(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0"},...e})),r.command=(a=vt,Te(async(e,t,n)=>await $e(async()=>await a(i,e,t,n),n=>{if(n instanceof Me)throw n;return i.status.failed++,i.logger.error("command failed",{command:e,data:t,error:n}),ht({ok:!1})})(),"Command",(i=r).hooks,i.logger));const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i},u=await t(c);n[o]=u}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=kt()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=St(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t)})}for(const[t,o]of Object.entries(n))"__cache"!==t&&qt(e,o);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=kt()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=mt(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=we(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=ze(s,"before"),{config:c}=ze({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:le(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await ke(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),h=await p(g);void 0!==s.before&&void 0===h.config?.before&&(h.config={...h.config??{},before:s.before}),void 0!==s.next&&void 0===h.config?.next&&(h.config={...h.config??{},next:s.next}),n[o]=h}return n}(r,e.transformers||{}),r}async function xt(e){e=e||{};const t=await Ot(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return ht({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await Ye(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await oe(n.init.bind(n),n=>{if(n instanceof te)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,Ve(n)&&await Ke(e,n,t))}return n}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const u=Object.values(t.sources).filter(e=>"elb"!==e.type),l=u.find(e=>e.config.primary);return l?c=l.push:u.length>0&&(c=u[0].push),{collector:t,elb:c}}var At=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await xt(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function Ct(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var jt={};t(jt,{createTrigger:()=>zt,env:()=>Pt,step:()=>$t});var Pt={};t(Pt,{push:()=>Mt,simulation:()=>Tt});var Et=()=>{},It={error:Et,warn:Et,info:Et,debug:Et,throw:e=>{throw"string"==typeof e?new Error(e):e},json:Et,scope:()=>It},Dt=()=>()=>Promise.resolve({ok:!0}),Mt={get push(){return Dt()},get command(){return Dt()},get elb(){return Dt()},logger:It},Tt=["AWS.SQSClient"],$t={};t($t,{decoderText:()=>Ht,malformedJson:()=>Nt,orderComplete:()=>Rt,pageView:()=>_t});var _t={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},Rt={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},Ht={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},Nt={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function Bt(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var zt=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await xt(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Bt(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};export{v as examples,n as schemas,jt as sqsExamples};//# sourceMappingURL=dev.mjs.map
|