@walkeros/server-source-aws 3.3.0 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/walkerOS.json +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
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:()=>v,schemas:()=>a}),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});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),v={};r(v,{createTrigger:()=>ue,env:()=>y,step:()=>O,trigger:()=>le});var y={};r(y,{push:()=>k});var b=()=>()=>Promise.resolve({ok:!0}),m=()=>{},w={error:m,warn:m,info:m,debug:m,throw:e=>{throw"string"==typeof e?new Error(e):e},json:m,scope:()=>w},k={get push(){return b()},get command(){return b()},get elb(){return b()},logger:w},O={};r(O,{apiGatewayV1Post:()=>C,lambdaGet:()=>q,lambdaPost:()=>x});var x={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},C={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},q={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},j=require("@walkeros/core"),A=require("@walkeros/core"),S=require("@walkeros/core"),P=require("@walkeros/core"),I=require("@walkeros/core"),E=require("@walkeros/core"),D=require("@walkeros/core"),T=require("@walkeros/core"),$=require("@walkeros/core"),H=require("@walkeros/core"),_=require("@walkeros/core"),N=require("@walkeros/core"),R={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 z(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function M(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;e&&!(0,D.isRouteArray)(e)?n[o]={next:e}:n[o]={}}return n}function G(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 B(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 U(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,D.createIngest)(n),config:t.config,env:F(t.config.env)};s.debug("init");const i=await(0,D.useHooks)(t.init,"TransformerInit",e.hooks)(r);if(!1===i)return!1;t.config={...i||t.config,env:(null==i?void 0:i.env)||t.config.env,init:!0},s.debug("init done")}return!0}async function L(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:{...F(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await(0,D.useHooks)(t.push,"TransformerPush",e.hooks)(o,c);return a.debug("push done"),u}async function J(e,t,n,o,s,r,i){var a,c,u,l,d,f;i&&(null==s?void 0:s._meta)&&(s._meta.chainPath=i);let g=o,p=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:p};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await(0,D.tryCatchAsync)(U)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{event:null,respond:p};if(i&&void 0!==(null==(c=null==(a=r.config)?void 0:a.chainMocks)?void 0:c[i])){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),g=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),g=r.config.mock;continue}if(null==(l=r.config)?void 0:l.disabled)continue;const h=null==(d=r.config)?void 0:d.cache,v=h?(0,D.compileCache)(h):void 0,y=v?z(v,e):void 0;let b;if(v&&y){const e=(0,D.buildCacheContext)(s,g),t=(0,D.checkCache)(v,y,e,`t:${o}`);if("HIT"===(null==t?void 0:t.status)&&t.value){if(g=t.value,v.full)return{event:g,respond:p};continue}"MISS"===(null==t?void 0:t.status)&&(b={key:t.key,ttl:t.rule.ttl})}const m=r.config.before;if(m){const n=B("string"==typeof m||Array.isArray(m)&&!(0,D.isRouteArray)(m)?m:(0,D.resolveNext)((0,D.compileNext)(m),(0,D.buildCacheContext)(s,g))||void 0,M(t));if(n.length>0){const o=await J(e,t,n,g,s,p,i);if(null===o.event)return{event:null,respond:null!=(f=o.respond)?f:p};o.respond&&(p=o.respond),g=Array.isArray(o.event)?o.event[0]:o.event}}const w=await(0,D.tryCatchAsync)(L,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,g,s,p);if(!1===w)return{event:null,respond:p};if(Array.isArray(w)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(w.map(async n=>{const o=n.event||g,a=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:(0,D.createIngest)("unknown");if(n.next){let s=n.next;if((0,D.isRouteArray)(n.next)){const e=(0,D.compileNext)(n.next);s=(0,D.resolveNext)(e,(0,D.buildCacheContext)(a,o))}if(s){const n=B(s,M(t));if(n.length>0)return J(e,t,n,o,a,p,i)}return{event:o,respond:p}}return r.length>0?J(e,t,r,o,a,p,i):{event:o,respond:p}}));let c=p;const u=[];for(const e of a.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(c=t.respond),null===t.event)continue;Array.isArray(t.event)?u.push(...t.event):u.push(t.event)}else u.push(e);return 0===u.length?{event:null,respond:c}:1===u.length?{event:u[0],respond:c}:{event:u,respond:c}}if(w&&"object"==typeof w){const{event:n,respond:o,next:r}=w;if(o&&(p=o),r){let o=r;if((0,D.isRouteArray)(r)){const e=(0,D.compileNext)(r);if(o=(0,D.resolveNext)(e,(0,D.buildCacheContext)(s,g)),!o){n&&(g=n);continue}}const a=B(o,M(t));return a.length>0?J(e,t,a,n||g,s,p,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:p})}n&&(g=n)}if(b&&y&&(0,D.storeCache)(y,b.key,g,b.ttl),(!w||"object"==typeof w&&!w.next)&&r.config.next&&(0,D.isRouteArray)(r.config.next)){const n=r.config.next,o=(0,D.compileNext)(n),a=(0,D.resolveNext)(o,(0,D.buildCacheContext)(s,g));if(a){const n=B(a,M(t));if(n.length>0)return J(e,t,n,g,s,p,i)}return{event:g,respond:p}}}return{event:g,respond:p}}function F(e){return e&&(0,D.isObject)(e)?e:{}}async function V(e,t,n){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:u,cache:l}=n;let d,f=(0,E.createIngest)(t);const g=l?(0,E.compileCache)({...l,full:null==(o=l.full)||o}):void 0,p=(0,E.compileNext)(c),h=Array.isArray(c)&&(0,E.isRouteArray)(c)||!p?void 0:B((0,E.resolveNext)(p),M(e.transformers)),v=(0,E.compileNext)(u),y=Array.isArray(u)&&(0,E.isRouteArray)(u)||!v?void 0:B((0,E.resolveNext)(v),M(e.transformers)),b=e.logger.scope("source").scope(t),m={push:async(n,o={})=>{let s=n;const i=null!=y?y:v?B((0,E.resolveNext)(v,(0,E.buildCacheContext)(f)),M(e.transformers)):[];if(i.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await J(e,e.transformers,i,s,f,d,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(d=n.respond),s=Array.isArray(n.event)?n.event[0]:n.event}if(g){const n=z(g,e);if(n){const e=(0,E.buildCacheContext)(f),o=(0,E.checkCache)(g,n,e,`s:${t}`);if(o){if("HIT"===o.status&&void 0!==o.value&&g.full){let t=o.value;return o.rule.update&&(t=await(0,E.applyUpdate)(t,o.rule.update,{...e,cache:{status:"HIT"}})),null==d||d(t),{ok:!0}}if("MISS"===o.status&&g.full&&d){const t=d,s=o.rule.update,r={...e,cache:{status:"MISS"}};d=e=>{(0,E.storeCache)(n,o.key,e,o.rule.ttl),s?(0,E.applyUpdate)(e,s,r).then(e=>t(e)):t(e)}}"MISS"!==o.status||g.full||(0,E.storeCache)(n,o.key,!0,o.rule.ttl)}}}const a=null!=h?h:p?B((0,E.resolveNext)(p,(0,E.buildCacheContext)(f)),M(e.transformers)):[];return e.push(s,{...o,id:t,ingest:f,respond:d,mapping:r,preChain:a})},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:b,...i},w={collector:e,logger:b,id:t,config:r,env:m,setIngest:async n=>{if(!r.ingest)return void(f=(0,E.createIngest)(t));const o=await(0,E.getMappingValue)(n,r.ingest,{collector:e}),s=(0,E.createIngest)(t);f={...s,...o,_meta:s._meta}},setRespond:e=>{d=e}},k=await(0,E.tryCatchAsync)(s)(w);if(!k)return;const O=k.type||"unknown",x=e.logger.scope(O).scope(t);return m.logger=x,a&&(k.config={...k.config,primary:a}),k}function W(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:oe(t.env,t.config.env)};(0,I.tryCatch)(t.on)(o,a)}async function K(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case R.Consent:s=o||e.consent;break;case R.Session:s=e.session;break;case R.User:s=o||e.user;break;case R.Custom:s=o||e.custom;break;case R.Globals:s=o||e.globals;break;case R.Config:s=o||e.config;break;case R.Ready:case R.Run:default:s=void 0}let i=!1;for(const n of Object.values(e.sources))n.on&&!1===await(0,I.tryCatchAsync)(n.on)(t,s)&&(i=!0);if(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});W(e,o,n,t,s)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e,t){var n,o;for(const[o,s]of Object.entries(e.pending.sources)){if(!e.pending.sources[o]||e.sources[o])continue;const r=null==(n=s.config)?void 0:n.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.sources[o];const a=await V(e,o,s);a&&(e.sources[o]=a)}for(const[n,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const r=null==(o=s.config)?void 0:o.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.destinations[n];const a=ne(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[n]=a}}(e,t),!r.length)return!i;switch(t){case R.Consent:!function(e,t,n){const o=n||e.consent;t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{(0,I.tryCatch)(t[n])(e,o)})})}(e,r,o);break;case R.Ready:case R.Run:c=r,(a=e).allowed&&c.forEach(e=>{(0,I.tryCatch)(e)(a)});break;case R.Session:!function(e,t){e.session&&t.forEach(t=>{(0,I.tryCatch)(t)(e,e.session)})}(e,r);break;default:r.forEach(t=>{"function"==typeof t&&(0,I.tryCatch)(t)(e,s)})}var a,c;return!i}function Q(e,t,n,o){if(!e)return[];if(t){const e=(0,S.resolveNext)(t,(0,S.buildCacheContext)(o));return e?B(e,M(n)):[]}return B(e,M(n))}async function X(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!(0,S.isFunction)(o.push))return te({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:oe(o.env,r)};let f=d.config.id;if(!f)do{f=(0,S.getId)(4)}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),Y(e,void 0,{},{[f]:d})}async function Y(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return te({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var c,u,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let d=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&d.push((0,S.clone)(t));const f=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,S.createIngest)("unknown");if(!d.length&&!(null==(c=s.queueOn)?void 0:c.length))return{id:o,destination:s,skipped:!0};if(!d.length&&(null==(u=s.queueOn)?void 0:u.length)){const t=await(0,S.tryCatchAsync)(Z)(e,s,o);return{id:o,destination:s,skipped:!t}}const g=[],p=d.filter(e=>{const t=(0,S.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,g.push(e),!1)});if(s.queuePush.push(...p),!g.length)return{id:o,destination:s,queue:d};if(!await(0,S.tryCatchAsync)(Z)(e,s,o))return{id:o,destination:s,queue:d};let h,v;s.dlq||(s.dlq=[]);const y=s.config.before,b=Q(y,y&&(0,S.isRouteArray)(y)?(0,S.compileNext)(y):void 0,e.transformers,f),m=s.config.next,w=m&&(0,S.isRouteArray)(m)?(0,S.compileNext)(m):void 0,k=null==(l=s.config)?void 0:l.cache,O=k?(0,S.compileCache)(k):void 0,x=O?z(O,e):void 0;let C=0;return await Promise.all(g.map(async t=>{let r;if(t.globals=(0,S.assign)(i,t.globals),t.user=(0,S.assign)(a,t.user),(null==O?void 0:O.full)&&x){const e=(0,S.buildCacheContext)(f,t),n=(0,S.checkCache)(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,u=n.respond;if(b.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await J(e,e.transformers,b,t,f,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(u=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(O&&!O.full&&x){const e=(0,S.buildCacheContext)(f,c),n=(0,S.checkCache)(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}const l=Date.now();let d=!1;const g=await(0,S.tryCatchAsync)(ee,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),h=t,d=!0,s.dlq.push([c,t])})(e,s,o,c,f,u);if(C+=Date.now()-l,r&&x&&void 0===s.config.mock&&(0,S.storeCache)(x,r.key,null==g||g,r.ttl),void 0!==g&&(v=g),!d&&m){void 0!==g&&(f._response=g);const t=Q(m,w,e.transformers,f);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await J(e,e.transformers,t,c,f,u,`destination.${o}.next`);n.respond&&(u=n.respond)}}return t})),{id:o,destination:s,error:h,response:v,totalDuration:C}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return te({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function Z(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:oe(t.env,t.config.env)};r.debug("init");const a=await(0,S.useHooks)(t.init,"DestinationInit",e.hooks)(i);if(!1===a)return a;if(t.config={...a||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)W(e,t,n,s,r)}r.debug("init done")}return!0}async function ee(e,t,n,o,s,r){const{config:i}=t,a=await(0,S.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:{...oe(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(!(null==d?void 0:d.batch)||!t.pushBatch||void 0!==i.mock){u.debug("push",{event:a.event.name});const n=await(0,S.useHooks)(t.push,"DestinationPush",e.hooks)(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,S.debounce)(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...oe(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),(0,S.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks)(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,S.isDefined)(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function te(e){return{ok:!(null==e?void 0:e.failed),...e}}function ne(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=G(e,"before"),{config:i}=G({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=oe(t.env,o);return{...t,config:a,env:c}}function oe(e,t){return e||t?t?e&&(0,S.isObject)(e)&&(0,S.isObject)(t)?{...e,...t}:t:e:{}}async function se(e,t,n){const o=Object.entries(e).map(async([e,o])=>{var s;const r=o.destroy;if(!r)return;const i=o.type||"unknown",a=n.scope(i),c={id:e,config:o.config,env:null!=(s=o.env)?s:{},logger:a};try{await Promise.race([r(c),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function re(e,t,n,o){let s,r,i=!1;switch(t){case R.Config:(0,$.isObject)(n)&&((0,T.assign)(e.config,n,{shallow:!1}),r=n,i=!0);break;case R.Consent:if((0,$.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,j.assign)(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case R.Custom:(0,$.isObject)(n)&&(e.custom=(0,T.assign)(e.custom,n),r=n,i=!0);break;case R.Destination:(0,$.isObject)(n)&&("code"in n&&(0,$.isObject)(n.code)?s=await X(e,n,o):(0,T.isFunction)(n.push)&&(s=await X(e,{code:n},o)));break;case R.Globals:(0,$.isObject)(n)&&(e.globals=(0,T.assign)(e.globals,n),r=n,i=!0);break;case R.On:(0,T.isString)(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,P.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,await K(e,t,r)}(e,n,o);break;case R.Ready:i=!0;break;case R.Run:s=await async function(e,t){return e.allowed=!0,e.count=0,e.group=(0,T.getId)(),e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,T.assign)(e.consent,t.consent)),t.user&&(e.user=(0,T.assign)(e.user,t.user)),t.globals&&(e.globals=(0,T.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,T.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Y(e)}(e,n),i=!0;break;case R.Session:i=!0;break;case R.Shutdown:await async function(e){const t=e.logger;await se(e.sources,"source",t),await se(e.destinations,"destination",t),await se(e.transformers,"transformer",t),await se(e.stores,"store",t)}(e);break;case R.User:(0,$.isObject)(n)&&((0,T.assign)(e.user,n,{shallow:!1}),r=n,i=!0)}return i&&(await K(e,t,void 0,r),s=await Y(e)),s||te({ok:!0})}function ie(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");++e.count;const{timestamp:s=Date.now(),group:r=e.group,count:i=e.count}=t,{name:a=`${n} ${o}`,data:c={},context:u={},globals:l=e.globals,custom:d={},user:f=e.user,nested:g=[],consent:p=e.consent,id:h=`${s}-${r}-${i}`,trigger:v="",entity:y=n,action:b=o,timing:m=0,version:w={source:e.version,tagging:e.config.tagging||0},source:k={type:"collector",id:"",previous_id:""}}=t;return{name:a,data:c,context:u,globals:l,custom:d,user:f,nested:g,consent:p,id:h,trigger:v,entity:y,action:b,timestamp:s,timing:m,group:r,count:i,version:w,source:k}}async function ae(e){var t,n;const o=(0,A.assign)({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),s={level:null==(t=e.logger)?void 0:t.level,handler:null==(n=e.logger)?void 0:n.handler},r=(0,A.createLogger)(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,group:"",hooks:e.hooks||{},logger:r,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||{},version:"3.2.0",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var c,u;a.push=function(e,t){return(0,H.useHooks)(async(n,o={})=>await(0,H.tryCatchAsync)(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:u,preChain:l,include:d,exclude:f}=o;let g=c,p=n;const h=d||f?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,d,f):void 0,v=null!=a?a:(0,H.createIngest)(i||"unknown");if(u){const t=await(0,H.processEventMapping)(p,u,e);if(t.ignore)return te({ok:!0});if(u.consent&&!(0,H.getGrantedConsent)(u.consent,e.consent,t.event.consent))return te({ok:!0});p=t.event}if((null==l?void 0:l.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await J(e,e.transformers,l,p,v,g,i?`source.${i}.next`:void 0);if(null===n.event)return te({ok:!0});if(n.respond&&(g=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=ie(e,o);return Y(e,s,{id:i,ingest:v,respond:g},h)}));if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-r}return null!=(s=o[0])?s:te({ok:!0})}p=n.event}const y=t(p),b=ie(e,y),m=await Y(e,b,{id:i,ingest:v,respond:g},h);if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-r}return m},()=>te({ok:!1}))(),"Push",e.hooks)}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e})),a.command=(c=a,u=re,(0,_.useHooks)(async(e,t,n)=>await(0,_.tryCatchAsync)(async()=>await u(c,e,t,n),()=>te({ok:!1}))(),"Command",c.hooks));const l=e.stores||{};if(a.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,N.useHooks)(l,"StoreGet",e.hooks),u.set=(0,N.useHooks)(d,"StoreSet",e.hooks),u.delete=(0,N.useHooks)(f,"StoreDelete",e.hooks),n[o]=u}return n}(a,l),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)}}}(l,a.stores,e),!a.stores.__cache){const e=new Map;a.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 a.destinations=await async function(e,t={}){var n,o;const s={};for(const[r,i]of Object.entries(t))(null==(o=null==(n=i.config)?void 0:n.require)?void 0:o.length)?e.pending.destinations[r]=i:s[r]=ne(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,{config:i}=G(s,"before"),{config:a}=G({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:(0,D.createIngest)(o),config:l,env:r},g=await t(f);n[o]=g}return n}(a,e.transformers||{}),a}async function ce(e){e=e||{};const t=await ae(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 te({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;const s=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{config:t={}}=s;if(t.require&&t.require.length>0){e.pending.sources[o]=s;continue}const r=await V(e,o,s);r&&(n[o]=r)}return n}(t,e.sources||{});Object.assign(t.sources,s);const{consent:r,user:i,globals:a,custom:c}=e;r&&await t.command("consent",r),i&&await t.command("user",i),a&&Object.assign(t.globals,a),c&&Object.assign(t.custom,c),t.config.run&&await t.command("run");let u=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),d=l.find(e=>e.config.primary);return d?u=d.push:l.length>0&&(u=l[0].push),{collector:t,elb:u}}var ue=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ce(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(e){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 le(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"})}}//# 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:()=>v,schemas:()=>a}),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});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),v={};r(v,{createTrigger:()=>ue,env:()=>b,step:()=>O,trigger:()=>le});var b={};r(b,{push:()=>k});var y=()=>()=>Promise.resolve({ok:!0}),m=()=>{},w={error:m,warn:m,info:m,debug:m,throw:e=>{throw"string"==typeof e?new Error(e):e},json:m,scope:()=>w},k={get push(){return y()},get command(){return y()},get elb(){return y()},logger:w},O={};r(O,{apiGatewayV1Post:()=>C,lambdaGet:()=>q,lambdaPost:()=>x});var x={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},C={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},q={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},j=require("@walkeros/core"),A=require("@walkeros/core"),S=require("@walkeros/core"),P=require("@walkeros/core"),I=require("@walkeros/core"),E=require("@walkeros/core"),D=require("@walkeros/core"),T=require("@walkeros/core"),$=require("@walkeros/core"),H=require("@walkeros/core"),R=require("@walkeros/core"),_=require("@walkeros/core"),N={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 z(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function M(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;e&&!(0,D.isRouteArray)(e)?n[o]={next:e}:n[o]={}}return n}function G(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 U(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 B(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,D.createIngest)(n),config:t.config,env:F(t.config.env)};s.debug("init");const i=await(0,D.useHooks)(t.init,"TransformerInit",e.hooks)(r);if(!1===i)return!1;t.config={...i||t.config,env:(null==i?void 0:i.env)||t.config.env,init:!0},s.debug("init done")}return!0}async function L(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:{...F(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await(0,D.useHooks)(t.push,"TransformerPush",e.hooks)(o,c);return a.debug("push done"),u}async function J(e,t,n,o,s,r,i){var a,c,u,l,d,f;i&&(null==s?void 0:s._meta)&&(s._meta.chainPath=i);let g=o,p=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:p};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await(0,D.tryCatchAsync)(B)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{event:null,respond:p};if(i&&void 0!==(null==(c=null==(a=r.config)?void 0:a.chainMocks)?void 0:c[i])){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),g=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),g=r.config.mock;continue}if(null==(l=r.config)?void 0:l.disabled)continue;const h=null==(d=r.config)?void 0:d.cache,v=h?(0,D.compileCache)(h):void 0,b=v?z(v,e):void 0;let y;if(v&&b){const e=(0,D.buildCacheContext)(s,g),t=(0,D.checkCache)(v,b,e,`t:${o}`);if("HIT"===(null==t?void 0:t.status)&&t.value){if(g=t.value,v.full)return{event:g,respond:p};continue}"MISS"===(null==t?void 0:t.status)&&(y={key:t.key,ttl:t.rule.ttl})}const m=r.config.before;if(m){const n=U("string"==typeof m||Array.isArray(m)&&!(0,D.isRouteArray)(m)?m:(0,D.resolveNext)((0,D.compileNext)(m),(0,D.buildCacheContext)(s,g))||void 0,M(t));if(n.length>0){const o=await J(e,t,n,g,s,p,i);if(null===o.event)return{event:null,respond:null!=(f=o.respond)?f:p};o.respond&&(p=o.respond),g=Array.isArray(o.event)?o.event[0]:o.event}}const w=await(0,D.tryCatchAsync)(L,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,g,s,p);if(!1===w)return{event:null,respond:p};if(Array.isArray(w)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(w.map(async n=>{const o=n.event||g,a=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:(0,D.createIngest)("unknown");if(n.next){let s=n.next;if((0,D.isRouteArray)(n.next)){const e=(0,D.compileNext)(n.next);s=(0,D.resolveNext)(e,(0,D.buildCacheContext)(a,o))}if(s){const n=U(s,M(t));if(n.length>0)return J(e,t,n,o,a,p,i)}return{event:o,respond:p}}return r.length>0?J(e,t,r,o,a,p,i):{event:o,respond:p}}));let c=p;const u=[];for(const e of a.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(c=t.respond),null===t.event)continue;Array.isArray(t.event)?u.push(...t.event):u.push(t.event)}else u.push(e);return 0===u.length?{event:null,respond:c}:1===u.length?{event:u[0],respond:c}:{event:u,respond:c}}if(w&&"object"==typeof w){const{event:n,respond:o,next:r}=w;if(o&&(p=o),r){let o=r;if((0,D.isRouteArray)(r)){const e=(0,D.compileNext)(r);if(o=(0,D.resolveNext)(e,(0,D.buildCacheContext)(s,g)),!o){n&&(g=n);continue}}const a=U(o,M(t));return a.length>0?J(e,t,a,n||g,s,p,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:p})}n&&(g=n)}if(y&&b&&(0,D.storeCache)(b,y.key,g,y.ttl),(!w||"object"==typeof w&&!w.next)&&r.config.next&&(0,D.isRouteArray)(r.config.next)){const n=r.config.next,o=(0,D.compileNext)(n),a=(0,D.resolveNext)(o,(0,D.buildCacheContext)(s,g));if(a){const n=U(a,M(t));if(n.length>0)return J(e,t,n,g,s,p,i)}return{event:g,respond:p}}}return{event:g,respond:p}}function F(e){return e&&(0,D.isObject)(e)?e:{}}async function V(e,t,n){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:u,cache:l}=n;let d,f=(0,E.createIngest)(t);const g=l?(0,E.compileCache)({...l,full:null==(o=l.full)||o}):void 0,p=(0,E.compileNext)(c),h=Array.isArray(c)&&(0,E.isRouteArray)(c)||!p?void 0:U((0,E.resolveNext)(p),M(e.transformers)),v=(0,E.compileNext)(u),b=Array.isArray(u)&&(0,E.isRouteArray)(u)||!v?void 0:U((0,E.resolveNext)(v),M(e.transformers)),y=e.logger.scope("source").scope(t),m={push:async(n,o={})=>{let s,i=n;const a=null!=b?b:v?U((0,E.resolveNext)(v,(0,E.buildCacheContext)(f)),M(e.transformers)):[];if(a.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await J(e,e.transformers,a,i,f,d,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(d=n.respond),i=Array.isArray(n.event)?n.event[0]:n.event}if(g){const n=z(g,e);if(n){const e=(0,E.buildCacheContext)(f),o=(0,E.checkCache)(g,n,e,`s:${t}`);if(o){if("HIT"===o.status&&void 0!==o.value&&g.full){let t=o.value;return o.rule.update&&(t=await(0,E.applyUpdate)(t,o.rule.update,{...e,cache:{status:"HIT"}})),null==d||d(t),{ok:!0}}if("MISS"===o.status&&g.full&&d){const t=d,r=o.rule.update,i={...e,cache:{status:"MISS"}},a=o.key,c=o.rule.ttl;d=e=>{(0,E.storeCache)(n,a,e,c),r?s=(async()=>{const n=await(0,E.applyUpdate)(e,r,i);t(n)})():t(e)}}"MISS"!==o.status||g.full||(0,E.storeCache)(n,o.key,!0,o.rule.ttl)}}}const c=null!=h?h:p?U((0,E.resolveNext)(p,(0,E.buildCacheContext)(f)),M(e.transformers)):[],u=await e.push(i,{...o,id:t,ingest:f,respond:d,mapping:r,preChain:c});return s&&await s,u},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y,...i},w={collector:e,logger:y,id:t,config:r,env:m,setIngest:async n=>{if(!r.ingest)return void(f=(0,E.createIngest)(t));const o=await(0,E.getMappingValue)(n,r.ingest,{collector:e}),s=(0,E.createIngest)(t);f={...s,...o,_meta:s._meta}},setRespond:e=>{d=e}},k=await(0,E.tryCatchAsync)(s)(w);if(!k)return;const O=k.type||"unknown",x=e.logger.scope(O).scope(t);return m.logger=x,a&&(k.config={...k.config,primary:a}),k}function W(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:oe(t.env,t.config.env)};(0,I.tryCatch)(t.on)(o,a)}function K(e,t,n,o){let s;switch(t){case N.Consent:s=o||e.consent;break;case N.Session:s=e.session;break;case N.User:s=o||e.user;break;case N.Custom:s=o||e.custom;break;case N.Globals:s=o||e.globals;break;case N.Config:s=o||e.config;break;case N.Ready:case N.Run:default:s=void 0}if(n.length)switch(t){case N.Consent:!function(e,t,n){const o=n||e.consent;t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{(0,I.tryCatch)(t[n])(e,o)})})}(e,n,o);break;case N.Ready:case N.Run:i=n,(r=e).allowed&&i.forEach(e=>{(0,I.tryCatch)(e)(r)});break;case N.Session:!function(e,t){e.session&&t.forEach(t=>{(0,I.tryCatch)(t)(e,e.session)})}(e,n);break;default:n.forEach(t=>{"function"==typeof t&&(0,I.tryCatch)(t)(e,s)})}var r,i}function Q(e,t,n,o){if(!e)return[];if(t){const e=(0,S.resolveNext)(t,(0,S.buildCacheContext)(o));return e?U(e,M(n)):[]}return U(e,M(n))}async function X(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!(0,S.isFunction)(o.push))return te({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:oe(o.env,r)};let f=d.config.id;if(!f)do{f=(0,S.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),Y(e,void 0,{},{[f]:d})}async function Y(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return te({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var c,u,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let d=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&d.push((0,S.clone)(t));const f=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,S.createIngest)("unknown");if(!d.length&&!(null==(c=s.queueOn)?void 0:c.length))return{id:o,destination:s,skipped:!0};if(!d.length&&(null==(u=s.queueOn)?void 0:u.length)){const t=await(0,S.tryCatchAsync)(Z)(e,s,o);return{id:o,destination:s,skipped:!t}}const g=[],p=d.filter(e=>{const t=(0,S.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,g.push(e),!1)});if(s.queuePush.push(...p),!g.length)return{id:o,destination:s,queue:d};if(!await(0,S.tryCatchAsync)(Z)(e,s,o))return{id:o,destination:s,queue:d};let h,v;s.dlq||(s.dlq=[]);const b=s.config.before,y=Q(b,b&&(0,S.isRouteArray)(b)?(0,S.compileNext)(b):void 0,e.transformers,f),m=s.config.next,w=m&&(0,S.isRouteArray)(m)?(0,S.compileNext)(m):void 0,k=null==(l=s.config)?void 0:l.cache,O=k?(0,S.compileCache)(k):void 0,x=O?z(O,e):void 0;let C=0;return await Promise.all(g.map(async t=>{let r;if(t.globals=(0,S.assign)(i,t.globals),t.user=(0,S.assign)(a,t.user),(null==O?void 0:O.full)&&x){const e=(0,S.buildCacheContext)(f,t),n=(0,S.checkCache)(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,u=n.respond;if(y.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await J(e,e.transformers,y,t,f,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(u=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(O&&!O.full&&x){const e=(0,S.buildCacheContext)(f,c),n=(0,S.checkCache)(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}const l=Date.now();let d=!1;const g=await(0,S.tryCatchAsync)(ee,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),h=t,d=!0,s.dlq.push([c,t])})(e,s,o,c,f,u);if(C+=Date.now()-l,r&&x&&void 0===s.config.mock&&(0,S.storeCache)(x,r.key,null==g||g,r.ttl),void 0!==g&&(v=g),!d&&m){void 0!==g&&(f._response=g);const t=Q(m,w,e.transformers,f);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await J(e,e.transformers,t,c,f,u,`destination.${o}.next`);n.respond&&(u=n.respond)}}return t})),{id:o,destination:s,error:h,response:v,totalDuration:C}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return te({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function Z(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:oe(t.env,t.config.env)};r.debug("init");const a=await(0,S.useHooks)(t.init,"DestinationInit",e.hooks)(i);if(!1===a)return a;if(t.config={...a||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)W(e,t,n,s,r)}r.debug("init done")}return!0}async function ee(e,t,n,o,s,r){const{config:i}=t,a=await(0,S.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:{...oe(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(!(null==d?void 0:d.batch)||!t.pushBatch||void 0!==i.mock){u.debug("push",{event:a.event.name});const n=await(0,S.useHooks)(t.push,"DestinationPush",e.hooks)(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,S.debounce)(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...oe(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),(0,S.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks)(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,S.isDefined)(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function te(e){return{ok:!(null==e?void 0:e.failed),...e}}function ne(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=G(e,"before"),{config:i}=G({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=oe(t.env,o);return{...t,config:a,env:c}}function oe(e,t){return e||t?t?e&&(0,S.isObject)(e)&&(0,S.isObject)(t)?{...e,...t}:t:e:{}}async function se(e,t,n){const o=Object.entries(e).map(async([e,o])=>{var s;const r=o.destroy;if(!r)return;const i=o.type||"unknown",a=n.scope(i),c={id:e,config:o.config,env:null!=(s=o.env)?s:{},logger:a};try{await Promise.race([r(c),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function re(e,t,n,o){let s,r,i=!1;switch(t){case N.Config:(0,$.isObject)(n)&&((0,T.assign)(e.config,n,{shallow:!1}),r=n,i=!0);break;case N.Consent:if((0,$.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,j.assign)(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case N.Custom:(0,$.isObject)(n)&&(e.custom=(0,T.assign)(e.custom,n),r=n,i=!0);break;case N.Destination:(0,$.isObject)(n)&&("code"in n&&(0,$.isObject)(n.code)?s=await X(e,n,o):(0,T.isFunction)(n.push)&&(s=await X(e,{code:n},o)));break;case N.Globals:(0,$.isObject)(n)&&(e.globals=(0,T.assign)(e.globals,n),r=n,i=!0);break;case N.On:(0,T.isString)(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,P.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,K(e,t,r)}(e,n,o);break;case N.Ready:i=!0;break;case N.Run:s=await async function(e,t){return e.allowed=!0,e.count=0,e.group=(0,T.getId)(),e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,T.assign)(e.consent,t.consent)),t.user&&(e.user=(0,T.assign)(e.user,t.user)),t.globals&&(e.globals=(0,T.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,T.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Y(e)}(e,n),i=!0;break;case N.Session:i=!0;break;case N.Shutdown:await async function(e){const t=e.logger;await se(e.sources,"source",t),await se(e.destinations,"destination",t),await se(e.transformers,"transformer",t),await se(e.stores,"store",t)}(e);break;case N.User:(0,$.isObject)(n)&&((0,T.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 N.Consent:s=o||e.consent;break;case N.Session:s=e.session;break;case N.User:s=o||e.user;break;case N.Custom:s=o||e.custom;break;case N.Globals:s=o||e.globals;break;case N.Config:s=o||e.config;break;case N.Ready:case N.Run:default:s=void 0}let i=!1;for(const n of Object.values(e.sources))n.on&&!1===await(0,I.tryCatchAsync)(n.on)(t,s)&&(i=!0);return 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});W(e,o,n,t,s)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e,t){var n,o;for(const[o,s]of Object.entries(e.pending.sources)){if(!e.pending.sources[o]||e.sources[o])continue;const r=null==(n=s.config)?void 0:n.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.sources[o];const a=await V(e,o,s);a&&(e.sources[o]=a)}for(const[n,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const r=null==(o=s.config)?void 0:o.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.destinations[n];const a=ne(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[n]=a}}(e,t),K(e,t,r,o),!i}(e,t,void 0,r),s=await Y(e)),s||te({ok:!0})}function ie(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");++e.count;const{timestamp:s=Date.now(),group:r=e.group,count:i=e.count}=t,{name:a=`${n} ${o}`,data:c={},context:u={},globals:l=e.globals,custom:d={},user:f=e.user,nested:g=[],consent:p=e.consent,id:h=`${s}-${r}-${i}`,trigger:v="",entity:b=n,action:y=o,timing:m=0,version:w={source:e.version,tagging:e.config.tagging||0},source:k={type:"collector",id:"",previous_id:""}}=t;return{name:a,data:c,context:u,globals:l,custom:d,user:f,nested:g,consent:p,id:h,trigger:v,entity:b,action:y,timestamp:s,timing:m,group:r,count:i,version:w,source:k}}async function ae(e){var t,n;const o=(0,A.assign)({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),s={level:null==(t=e.logger)?void 0:t.level,handler:null==(n=e.logger)?void 0:n.handler},r=(0,A.createLogger)(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,group:"",hooks:e.hooks||{},logger:r,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||{},version:"3.3.1",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var c,u;a.push=function(e,t){return(0,H.useHooks)(async(n,o={})=>await(0,H.tryCatchAsync)(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:u,preChain:l,include:d,exclude:f}=o;let g=c,p=n;const h=d||f?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,d,f):void 0,v=null!=a?a:(0,H.createIngest)(i||"unknown");if(u){const t=await(0,H.processEventMapping)(p,u,e);if(t.ignore)return te({ok:!0});if(u.consent&&!(0,H.getGrantedConsent)(u.consent,e.consent,t.event.consent))return te({ok:!0});p=t.event}if((null==l?void 0:l.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await J(e,e.transformers,l,p,v,g,i?`source.${i}.next`:void 0);if(null===n.event)return te({ok:!0});if(n.respond&&(g=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=ie(e,o);return Y(e,s,{id:i,ingest:v,respond:g},h)}));if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-r}return null!=(s=o[0])?s:te({ok:!0})}p=n.event}const b=t(p),y=ie(e,b),m=await Y(e,y,{id:i,ingest:v,respond:g},h);if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-r}return m},()=>te({ok:!1}))(),"Push",e.hooks)}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e})),a.command=(c=a,u=re,(0,R.useHooks)(async(e,t,n)=>await(0,R.tryCatchAsync)(async()=>await u(c,e,t,n),()=>te({ok:!1}))(),"Command",c.hooks));const l=e.stores||{};if(a.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,_.useHooks)(l,"StoreGet",e.hooks),u.set=(0,_.useHooks)(d,"StoreSet",e.hooks),u.delete=(0,_.useHooks)(f,"StoreDelete",e.hooks),n[o]=u}return n}(a,l),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)}}}(l,a.stores,e),!a.stores.__cache){const e=new Map;a.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 a.destinations=await async function(e,t={}){var n,o;const s={};for(const[r,i]of Object.entries(t))(null==(o=null==(n=i.config)?void 0:n.require)?void 0:o.length)?e.pending.destinations[r]=i:s[r]=ne(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,{config:i}=G(s,"before"),{config:a}=G({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:(0,D.createIngest)(o),config:l,env:r},g=await t(f);n[o]=g}return n}(a,e.transformers||{}),a}async function ce(e){e=e||{};const t=await ae(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 te({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;const s=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{config:t={}}=s;if(t.require&&t.require.length>0){e.pending.sources[o]=s;continue}const r=await V(e,o,s);r&&(n[o]=r)}return n}(t,e.sources||{});Object.assign(t.sources,s);const{consent:r,user:i,globals:a,custom:c}=e;r&&await t.command("consent",r),i&&await t.command("user",i),a&&Object.assign(t.globals,a),c&&Object.assign(t.custom,c),t.config.run&&await t.command("run");let u=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),d=l.find(e=>e.config.primary);return d?u=d.push:l.length>0&&(u=l[0].push),{collector:t,elb:u}}var ue=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await ce(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(e){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 le(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"})}}//# sourceMappingURL=dev.js.map
|
package/dist/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev.ts","../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["export * as schemas from './lambda/schemas';\nexport * as examples from './lambda/examples';\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","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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":"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","names":["import_dev","import_dev","trigger","k","v"]}
|
|
1
|
+
{"version":3,"sources":["../src/dev.ts","../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["export * as schemas from './lambda/schemas';\nexport * as examples from './lambda/examples';\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","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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,cAA4B;;;ACA5B,IAAAC,cAAkB;;;ACAlB,iBAAkB;AAKX,IAAM,aAAa,aAAE,KAAK;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,IAAM,aAAa,aAAE,MAAM;AAAA,EAChC,aAAE,OAAO;AAAA,EACT,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EAClB,aAAE,QAAQ,GAAG;AACf,CAAC;AAMM,IAAM,oBAAoB,aAAE,OAAO;AAAA,EACxC,QAAQ,WAAW;AAAA,IACjB;AAAA,EACF,EAAE,SAAS;AAAA,EAEX,SAAS,aAAE,MAAM,UAAU,EAAE,SAAS,sBAAsB,EAAE,SAAS;AAAA,EAEvE,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE,SAAS;AAAA,EAE1E,aAAa,aACV,QAAQ,EACR,SAAS,oDAAoD,EAC7D,SAAS;AAAA,EAEZ,QAAQ,aACL,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,qCAAqC,EAC9C,SAAS;AACd,CAAC;;;AD9CM,IAAM,iBAAiB,cAAE,OAAO;AAAA,EACrC,MAAM,cACH,MAAM,CAAC,cAAE,QAAQ,GAAG,iBAAiB,CAAC,EACtC;AAAA,IACC;AAAA,EACF,EACC,QAAQ,IAAI;AAAA,EAEf,SAAS,cACN,OAAO,EACP,IAAI,EACJ,SAAS,EACT,IAAI,GAAM,EACV,SAAS,0DAA0D,EACnE,QAAQ,GAAK;AAAA,EAEhB,qBAAqB,cAClB,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,QAAQ,IAAI;AAAA,EAEf,YAAY,cACT,OAAO,EACP,SAAS,4CAA4C,EACrD,QAAQ,SAAS;AACtB,CAAC;;;ADvBM,IAAM,eAAW,yBAAY,cAAc;;;AGVlD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAWA,IAAM,kBAAkB,MAAc;AACpC,QAAM,MAAM,MACV,QAAQ,QAAQ;AAAA,IACd,IAAI;AAAA,EACN,CAAC;AACH,SAAO;AACT;AAGA,IAAM,SAAS,MAAM;AAAC;AACtB,IAAM,aAA8B;AAAA,EAClC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO,CAAC,YAA4B;AAClC,UAAM,OAAO,YAAY,WAAW,IAAI,MAAM,OAAO,IAAI;AAAA,EAC3D;AAAA,EACA,MAAM;AAAA,EACN,OAAO,MAAM;AACf;AAQO,IAAM,OAAY;AAAA,EACvB,IAAI,OAAO;AACT,WAAO,gBAAgB;AAAA,EACzB;AAAA,EACA,IAAI,UAAU;AACZ,WAAO,gBAAgB;AAAA,EACzB;AAAA,EACA,IAAI,MAAM;AACR,WAAO,gBAAgB;AAAA,EACzB;AAAA,EACA,QAAQ;AACV;;;AClDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,aAA+B;AAAA,EAC1C,SAAS,EAAE,MAAM,OAAO;AAAA,EACxB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,gBAAgB;AAAA,MACd,MAAM,EAAE,QAAQ,QAAQ,MAAM,WAAW;AAAA,MACzC,WAAW;AAAA,IACb;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO;AAAA,MACP,MAAM,EAAE,OAAO,OAAO;AAAA,IACxB,CAAC;AAAA,IACD,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,MAAM,EAAE,OAAO,OAAO;AAAA,IACtB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,mBAAqC;AAAA,EAChD,SAAS,EAAE,MAAM,OAAO;AAAA,EACxB,IAAI;AAAA,IACF,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,gBAAgB;AAAA,MACd,WAAW;AAAA,MACX,UAAU,EAAE,UAAU,eAAe;AAAA,IACvC;AAAA,IACA,uBAAuB;AAAA,IACvB,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO;AAAA,MACP,MAAM,EAAE,OAAO,OAAO;AAAA,IACxB,CAAC;AAAA,IACD,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,MAAM,EAAE,OAAO,OAAO;AAAA,IACtB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,YAA8B;AAAA,EACzC,SAAS,EAAE,MAAM,MAAM;AAAA,EACvB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,gBAAgB;AAAA,MACd,MAAM,EAAE,QAAQ,OAAO,MAAM,WAAW;AAAA,MACxC,WAAW;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,MAAM,EAAE,OAAO,OAAO;AAAA,IACtB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChDA,SAAS,iBAAiB,WAA+B;AACvD,aAAW,UAAU,OAAO,OAAO,UAAU,WAAW,CAAC,CAAC,GAAG;AAC3D,QAAK,OAA6B,SAAS,SAAU,QAAO;AAAA,EAC9D;AACF;AAgBA,IAAM,gBAAmD,OACvD,WACG;AACH,MAAI;AAEJ,QAAMC,WACJ,MACA,OAAO,YAAsC;AAE3C,QAAI,CAAC,MAAM;AACT,YAAM,SAAS,MAAM,GAAU,MAAM;AACrC,aAAO,EAAE,WAAW,OAAO,WAAW,KAAK,OAAO,IAAI;AAAA,IACxD;AAEA,UAAM,SAAS,iBAAiB,KAAK,SAAS;AAC9C,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AAGnE,UAAM,gBAAgB;AAAA,MACpB,cAAc,QAAQ,KAAK,IAAI,CAAC;AAAA,IAClC;AAGA,UAAM,SACJ,OAGA;AACF,UAAM,eAAe,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAGA,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,MAAM,aAAa,QAAQ,IAAI;AAAA,IAC7C,SAAQ;AACN,aAAO,aAAa;AAAA,IACtB;AAEA,UAAM,UAAkC,CAAC;AACzC,QAAI,aAAa,SAAS;AACxB,iBAAW,CAACC,IAAGC,EAAC,KAAK,OAAO,QAAQ,aAAa,OAAO,GAAG;AACzD,YAAIA,OAAM,OAAW,SAAQD,EAAC,IAAI,OAAOC,EAAC;AAAA,MAC5C;AAAA,IACF;AAEA,WAAO;AAAA,MACL,YAAY,aAAa;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,IACA,SAAAF;AAAA,EACF;AACF;AAMA,SAAS,QAAQ,QAE+B;AAC9C,SAAO,OAAO,YAAqB;AACjC,UAAM,cAAc,EAAE,GAAI,QAAoC;AAG9D,QAAI,YAAY,QAAQ,OAAO,YAAY,SAAS,UAAU;AAC5D,YAAM,OAAO,KAAK,MAAM,YAAY,IAAI;AACxC,UAAI,KAAK,QAAQ,CAAC,KAAK,OAAO;AAC5B,oBAAY,OAAO,KAAK,UAAU;AAAA,UAChC,GAAG;AAAA,UACH,OAAO,KAAK;AAAA,UACZ,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,UAAyB;AAAA,MAC7B,cAAc;AAAA,IAChB;AAEA,WAAO,OAAO,KAAK,aAAuC,OAAO;AAAA,EACnE;AACF;","names":["import_dev","import_dev","trigger","k","v"]}
|
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});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),d={};t(d,{createTrigger:()=>Ye,env:()=>f,step:()=>m,trigger:()=>Ze});var f={};t(f,{push:()=>v});var g=()=>()=>Promise.resolve({ok:!0}),p=()=>{},h={error:p,warn:p,info:p,debug:p,throw:e=>{throw"string"==typeof e?new Error(e):e},json:p,scope:()=>h},v={get push(){return g()},get command(){return g()},get elb(){return g()},logger:h},m={};t(m,{apiGatewayV1Post:()=>b,lambdaGet:()=>w,lambdaPost:()=>y});var y={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},b={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},w={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};import{assign as k}from"@walkeros/core";import{assign as O,createLogger as x}from"@walkeros/core";import{assign as j,buildCacheContext as A,clone as q,compileCache as S,checkCache as C,storeCache as P,compileNext as E,createIngest as I,debounce as D,getId as $,getGrantedConsent as T,isDefined as _,isFunction as H,isObject as M,isRouteArray as R,processEventMapping as G,resolveNext as N,tryCatchAsync as B,useHooks as L}from"@walkeros/core";import{isArray as U}from"@walkeros/core";import{tryCatch as J,tryCatchAsync as F}from"@walkeros/core";import{createIngest as V,getMappingValue as z,tryCatchAsync as W,compileNext as K,resolveNext as Q,isRouteArray as X,compileCache as Y,checkCache as Z,storeCache as ee,applyUpdate as te,buildCacheContext as ne}from"@walkeros/core";import{createIngest as oe,isObject as se,tryCatchAsync as re,useHooks as ie,compileNext as ae,resolveNext as ce,isRouteArray as ue,compileCache as le,checkCache as de,storeCache as fe,buildCacheContext as ge}from"@walkeros/core";import{assign as pe,getId as he,isFunction as ve,isString as me}from"@walkeros/core";import{isObject as ye}from"@walkeros/core";import{createIngest as be,getGrantedConsent as we,processEventMapping as ke,tryCatchAsync as Oe,useHooks as xe}from"@walkeros/core";import{useHooks as je,tryCatchAsync as Ae}from"@walkeros/core";import{useHooks as qe}from"@walkeros/core";var Se={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 Ce(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Pe(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;e&&!ue(e)?n[o]={next:e}:n[o]={}}return n}function Ee(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 Ie(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 De(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:oe(n),config:t.config,env:_e(t.config.env)};s.debug("init");const i=await ie(t.init,"TransformerInit",e.hooks)(r);if(!1===i)return!1;t.config={...i||t.config,env:(null==i?void 0: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:{..._e(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await ie(t.push,"TransformerPush",e.hooks)(o,c);return a.debug("push done"),u}async function Te(e,t,n,o,s,r,i){var a,c,u,l,d,f;i&&(null==s?void 0:s._meta)&&(s._meta.chainPath=i);let g=o,p=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:p};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await re(De)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{event:null,respond:p};if(i&&void 0!==(null==(c=null==(a=r.config)?void 0:a.chainMocks)?void 0:c[i])){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),g=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),g=r.config.mock;continue}if(null==(l=r.config)?void 0:l.disabled)continue;const h=null==(d=r.config)?void 0:d.cache,v=h?le(h):void 0,m=v?Ce(v,e):void 0;let y;if(v&&m){const e=ge(s,g),t=de(v,m,e,`t:${o}`);if("HIT"===(null==t?void 0:t.status)&&t.value){if(g=t.value,v.full)return{event:g,respond:p};continue}"MISS"===(null==t?void 0:t.status)&&(y={key:t.key,ttl:t.rule.ttl})}const b=r.config.before;if(b){const n=Ie("string"==typeof b||Array.isArray(b)&&!ue(b)?b:ce(ae(b),ge(s,g))||void 0,Pe(t));if(n.length>0){const o=await Te(e,t,n,g,s,p,i);if(null===o.event)return{event:null,respond:null!=(f=o.respond)?f:p};o.respond&&(p=o.respond),g=Array.isArray(o.event)?o.event[0]:o.event}}const w=await re($e,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,g,s,p);if(!1===w)return{event:null,respond:p};if(Array.isArray(w)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(w.map(async n=>{const o=n.event||g,a=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:oe("unknown");if(n.next){let s=n.next;if(ue(n.next)){const e=ae(n.next);s=ce(e,ge(a,o))}if(s){const n=Ie(s,Pe(t));if(n.length>0)return Te(e,t,n,o,a,p,i)}return{event:o,respond:p}}return r.length>0?Te(e,t,r,o,a,p,i):{event:o,respond:p}}));let c=p;const u=[];for(const e of a.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(c=t.respond),null===t.event)continue;Array.isArray(t.event)?u.push(...t.event):u.push(t.event)}else u.push(e);return 0===u.length?{event:null,respond:c}:1===u.length?{event:u[0],respond:c}:{event:u,respond:c}}if(w&&"object"==typeof w){const{event:n,respond:o,next:r}=w;if(o&&(p=o),r){let o=r;if(ue(r)){const e=ae(r);if(o=ce(e,ge(s,g)),!o){n&&(g=n);continue}}const a=Ie(o,Pe(t));return a.length>0?Te(e,t,a,n||g,s,p,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:p})}n&&(g=n)}if(y&&m&&fe(m,y.key,g,y.ttl),(!w||"object"==typeof w&&!w.next)&&r.config.next&&ue(r.config.next)){const n=r.config.next,o=ae(n),a=ce(o,ge(s,g));if(a){const n=Ie(a,Pe(t));if(n.length>0)return Te(e,t,n,g,s,p,i)}return{event:g,respond:p}}}return{event:g,respond:p}}function _e(e){return e&&se(e)?e:{}}async function He(e,t,n){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:u,cache:l}=n;let d,f=V(t);const g=l?Y({...l,full:null==(o=l.full)||o}):void 0,p=K(c),h=Array.isArray(c)&&X(c)||!p?void 0:Ie(Q(p),Pe(e.transformers)),v=K(u),m=Array.isArray(u)&&X(u)||!v?void 0:Ie(Q(v),Pe(e.transformers)),y=e.logger.scope("source").scope(t),b={push:async(n,o={})=>{let s=n;const i=null!=m?m:v?Ie(Q(v,ne(f)),Pe(e.transformers)):[];if(i.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Te(e,e.transformers,i,s,f,d,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(d=n.respond),s=Array.isArray(n.event)?n.event[0]:n.event}if(g){const n=Ce(g,e);if(n){const e=ne(f),o=Z(g,n,e,`s:${t}`);if(o){if("HIT"===o.status&&void 0!==o.value&&g.full){let t=o.value;return o.rule.update&&(t=await te(t,o.rule.update,{...e,cache:{status:"HIT"}})),null==d||d(t),{ok:!0}}if("MISS"===o.status&&g.full&&d){const t=d,s=o.rule.update,r={...e,cache:{status:"MISS"}};d=e=>{ee(n,o.key,e,o.rule.ttl),s?te(e,s,r).then(e=>t(e)):t(e)}}"MISS"!==o.status||g.full||ee(n,o.key,!0,o.rule.ttl)}}}const a=null!=h?h:p?Ie(Q(p,ne(f)),Pe(e.transformers)):[];return e.push(s,{...o,id:t,ingest:f,respond:d,mapping:r,preChain:a})},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y,...i},w={collector:e,logger:y,id:t,config:r,env:b,setIngest:async n=>{if(!r.ingest)return void(f=V(t));const o=await z(n,r.ingest,{collector:e}),s=V(t);f={...s,...o,_meta:s._meta}},setRespond:e=>{d=e}},k=await W(s)(w);if(!k)return;const O=k.type||"unknown",x=e.logger.scope(O).scope(t);return b.logger=x,a&&(k.config={...k.config,primary:a}),k}function Me(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:Ve(t.env,t.config.env)};J(t.on)(o,a)}async function Re(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case Se.Consent:s=o||e.consent;break;case Se.Session:s=e.session;break;case Se.User:s=o||e.user;break;case Se.Custom:s=o||e.custom;break;case Se.Globals:s=o||e.globals;break;case Se.Config:s=o||e.config;break;case Se.Ready:case Se.Run:default:s=void 0}let i=!1;for(const n of Object.values(e.sources))n.on&&!1===await F(n.on)(t,s)&&(i=!0);if(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});Me(e,o,n,t,s)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e,t){var n,o;for(const[o,s]of Object.entries(e.pending.sources)){if(!e.pending.sources[o]||e.sources[o])continue;const r=null==(n=s.config)?void 0:n.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.sources[o];const a=await He(e,o,s);a&&(e.sources[o]=a)}for(const[n,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const r=null==(o=s.config)?void 0:o.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.destinations[n];const a=Fe(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[n]=a}}(e,t),!r.length)return!i;switch(t){case Se.Consent:!function(e,t,n){const o=n||e.consent;t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{J(t[n])(e,o)})})}(e,r,o);break;case Se.Ready:case Se.Run:c=r,(a=e).allowed&&c.forEach(e=>{J(e)(a)});break;case Se.Session:!function(e,t){e.session&&t.forEach(t=>{J(t)(e,e.session)})}(e,r);break;default:r.forEach(t=>{"function"==typeof t&&J(t)(e,s)})}var a,c;return!i}function Ge(e,t,n,o){if(!e)return[];if(t){const e=N(t,A(o));return e?Ie(e,Pe(n)):[]}return Ie(e,Pe(n))}async function Ne(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!H(o.push))return Je({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:Ve(o.env,r)};let f=d.config.id;if(!f)do{f=$(4)}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),Be(e,void 0,{},{[f]:d})}async function Be(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return Je({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var c,u,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let d=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&d.push(q(t));const f=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:I("unknown");if(!d.length&&!(null==(c=s.queueOn)?void 0:c.length))return{id:o,destination:s,skipped:!0};if(!d.length&&(null==(u=s.queueOn)?void 0:u.length)){const t=await B(Le)(e,s,o);return{id:o,destination:s,skipped:!t}}const g=[],p=d.filter(e=>{const t=T(s.config.consent,r,e.consent);return!t||(e.consent=t,g.push(e),!1)});if(s.queuePush.push(...p),!g.length)return{id:o,destination:s,queue:d};if(!await B(Le)(e,s,o))return{id:o,destination:s,queue:d};let h,v;s.dlq||(s.dlq=[]);const m=s.config.before,y=Ge(m,m&&R(m)?E(m):void 0,e.transformers,f),b=s.config.next,w=b&&R(b)?E(b):void 0,k=null==(l=s.config)?void 0:l.cache,O=k?S(k):void 0,x=O?Ce(O,e):void 0;let D=0;return await Promise.all(g.map(async t=>{let r;if(t.globals=j(i,t.globals),t.user=j(a,t.user),(null==O?void 0:O.full)&&x){const e=A(f,t),n=C(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,u=n.respond;if(y.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Te(e,e.transformers,y,t,f,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(u=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(O&&!O.full&&x){const e=A(f,c),n=C(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}const l=Date.now();let d=!1;const g=await B(Ue,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),h=t,d=!0,s.dlq.push([c,t])})(e,s,o,c,f,u);if(D+=Date.now()-l,r&&x&&void 0===s.config.mock&&P(x,r.key,null==g||g,r.ttl),void 0!==g&&(v=g),!d&&b){void 0!==g&&(f._response=g);const t=Ge(b,w,e.transformers,f);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Te(e,e.transformers,t,c,f,u,`destination.${o}.next`);n.respond&&(u=n.respond)}}return t})),{id:o,destination:s,error:h,response:v,totalDuration:D}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return Je({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function Le(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:Ve(t.env,t.config.env)};r.debug("init");const a=await L(t.init,"DestinationInit",e.hooks)(i);if(!1===a)return a;if(t.config={...a||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)Me(e,t,n,s,r)}r.debug("init done")}return!0}async function Ue(e,t,n,o,s,r){const{config:i}=t,a=await G(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:{...Ve(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(!(null==d?void 0:d.batch)||!t.pushBatch||void 0!==i.mock){u.debug("push",{event:a.event.name});const n=await L(t.push,"DestinationPush",e.hooks)(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:D(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...Ve(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),L(t.pushBatch,"DestinationPushBatch",e.hooks)(o,a),u.debug("push batch done"),o.events=[],o.data=[]},d.batch)}}const o=t.batches[f];o.batched.events.push(a.event),_(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function Je(e){return{ok:!(null==e?void 0:e.failed),...e}}function Fe(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=Ee(e,"before"),{config:i}=Ee({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=Ve(t.env,o);return{...t,config:a,env:c}}function Ve(e,t){return e||t?t?e&&M(e)&&M(t)?{...e,...t}:t:e:{}}async function ze(e,t,n){const o=Object.entries(e).map(async([e,o])=>{var s;const r=o.destroy;if(!r)return;const i=o.type||"unknown",a=n.scope(i),c={id:e,config:o.config,env:null!=(s=o.env)?s:{},logger:a};try{await Promise.race([r(c),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function We(e,t,n,o){let s,r,i=!1;switch(t){case Se.Config:ye(n)&&(pe(e.config,n,{shallow:!1}),r=n,i=!0);break;case Se.Consent:if(ye(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=k(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case Se.Custom:ye(n)&&(e.custom=pe(e.custom,n),r=n,i=!0);break;case Se.Destination:ye(n)&&("code"in n&&ye(n.code)?s=await Ne(e,n,o):ve(n.push)&&(s=await Ne(e,{code:n},o)));break;case Se.Globals:ye(n)&&(e.globals=pe(e.globals,n),r=n,i=!0);break;case Se.On:me(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=U(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,await Re(e,t,r)}(e,n,o);break;case Se.Ready:i=!0;break;case Se.Run:s=await async function(e,t){return e.allowed=!0,e.count=0,e.group=he(),e.timing=Date.now(),t&&(t.consent&&(e.consent=pe(e.consent,t.consent)),t.user&&(e.user=pe(e.user,t.user)),t.globals&&(e.globals=pe(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=pe(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Be(e)}(e,n),i=!0;break;case Se.Session:i=!0;break;case Se.Shutdown:await async function(e){const t=e.logger;await ze(e.sources,"source",t),await ze(e.destinations,"destination",t),await ze(e.transformers,"transformer",t),await ze(e.stores,"store",t)}(e);break;case Se.User:ye(n)&&(pe(e.user,n,{shallow:!1}),r=n,i=!0)}return i&&(await Re(e,t,void 0,r),s=await Be(e)),s||Je({ok:!0})}function Ke(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");++e.count;const{timestamp:s=Date.now(),group:r=e.group,count:i=e.count}=t,{name:a=`${n} ${o}`,data:c={},context:u={},globals:l=e.globals,custom:d={},user:f=e.user,nested:g=[],consent:p=e.consent,id:h=`${s}-${r}-${i}`,trigger:v="",entity:m=n,action:y=o,timing:b=0,version:w={source:e.version,tagging:e.config.tagging||0},source:k={type:"collector",id:"",previous_id:""}}=t;return{name:a,data:c,context:u,globals:l,custom:d,user:f,nested:g,consent:p,id:h,trigger:v,entity:m,action:y,timestamp:s,timing:b,group:r,count:i,version:w,source:k}}async function Qe(e){var t,n;const o=O({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),s={level:null==(t=e.logger)?void 0:t.level,handler:null==(n=e.logger)?void 0:n.handler},r=x(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,group:"",hooks:e.hooks||{},logger:r,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||{},version:"3.2.0",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var c,u;a.push=function(e,t){return xe(async(n,o={})=>await Oe(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:u,preChain:l,include:d,exclude:f}=o;let g=c,p=n;const h=d||f?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,d,f):void 0,v=null!=a?a:be(i||"unknown");if(u){const t=await ke(p,u,e);if(t.ignore)return Je({ok:!0});if(u.consent&&!we(u.consent,e.consent,t.event.consent))return Je({ok:!0});p=t.event}if((null==l?void 0:l.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Te(e,e.transformers,l,p,v,g,i?`source.${i}.next`:void 0);if(null===n.event)return Je({ok:!0});if(n.respond&&(g=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=Ke(e,o);return Be(e,s,{id:i,ingest:v,respond:g},h)}));if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-r}return null!=(s=o[0])?s:Je({ok:!0})}p=n.event}const m=t(p),y=Ke(e,m),b=await Be(e,y,{id:i,ingest:v,respond:g},h);if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-r}return b},()=>Je({ok:!1}))(),"Push",e.hooks)}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e})),a.command=(u=We,je(async(e,t,n)=>await Ae(async()=>await u(c,e,t,n),()=>Je({ok:!1}))(),"Command",(c=a).hooks));const l=e.stores||{};if(a.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=qe(l,"StoreGet",e.hooks),u.set=qe(d,"StoreSet",e.hooks),u.delete=qe(f,"StoreDelete",e.hooks),n[o]=u}return n}(a,l),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)}}}(l,a.stores,e),!a.stores.__cache){const e=new Map;a.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 a.destinations=await async function(e,t={}){var n,o;const s={};for(const[r,i]of Object.entries(t))(null==(o=null==(n=i.config)?void 0:n.require)?void 0:o.length)?e.pending.destinations[r]=i:s[r]=Fe(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,{config:i}=Ee(s,"before"),{config:a}=Ee({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:oe(o),config:l,env:r},g=await t(f);n[o]=g}return n}(a,e.transformers||{}),a}async function Xe(e){e=e||{};const t=await Qe(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 Je({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;const s=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{config:t={}}=s;if(t.require&&t.require.length>0){e.pending.sources[o]=s;continue}const r=await He(e,o,s);r&&(n[o]=r)}return n}(t,e.sources||{});Object.assign(t.sources,s);const{consent:r,user:i,globals:a,custom:c}=e;r&&await t.command("consent",r),i&&await t.command("user",i),a&&Object.assign(t.globals,a),c&&Object.assign(t.custom,c),t.config.run&&await t.command("run");let u=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),d=l.find(e=>e.config.primary);return d?u=d.push:l.length>0&&(u=l[0].push),{collector:t,elb:u}}var Ye=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Xe(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(e){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 Ze(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"})}}export{d as examples,n as schemas};//# 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});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),d={};t(d,{createTrigger:()=>Ye,env:()=>f,step:()=>m,trigger:()=>Ze});var f={};t(f,{push:()=>v});var g=()=>()=>Promise.resolve({ok:!0}),p=()=>{},h={error:p,warn:p,info:p,debug:p,throw:e=>{throw"string"==typeof e?new Error(e):e},json:p,scope:()=>h},v={get push(){return g()},get command(){return g()},get elb(){return g()},logger:h},m={};t(m,{apiGatewayV1Post:()=>y,lambdaGet:()=>w,lambdaPost:()=>b});var b={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},y={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},w={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};import{assign as k}from"@walkeros/core";import{assign as O,createLogger as x}from"@walkeros/core";import{assign as j,buildCacheContext as A,clone as q,compileCache as C,checkCache as S,storeCache as P,compileNext as E,createIngest as I,debounce as D,getId as $,getGrantedConsent as T,isDefined as _,isFunction as H,isObject as R,isRouteArray as M,processEventMapping as G,resolveNext as N,tryCatchAsync as B,useHooks as U}from"@walkeros/core";import{isArray as L}from"@walkeros/core";import{tryCatch as J,tryCatchAsync as F}from"@walkeros/core";import{createIngest as z,getMappingValue as V,tryCatchAsync as W,compileNext as K,resolveNext as Q,isRouteArray as X,compileCache as Y,checkCache as Z,storeCache as ee,applyUpdate as te,buildCacheContext as ne}from"@walkeros/core";import{createIngest as oe,isObject as se,tryCatchAsync as re,useHooks as ie,compileNext as ae,resolveNext as ce,isRouteArray as ue,compileCache as le,checkCache as de,storeCache as fe,buildCacheContext as ge}from"@walkeros/core";import{assign as pe,getId as he,isFunction as ve,isString as me}from"@walkeros/core";import{isObject as be}from"@walkeros/core";import{createIngest as ye,getGrantedConsent as we,processEventMapping as ke,tryCatchAsync as Oe,useHooks as xe}from"@walkeros/core";import{useHooks as je,tryCatchAsync as Ae}from"@walkeros/core";import{useHooks as qe}from"@walkeros/core";var Ce={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 Se(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Pe(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;e&&!ue(e)?n[o]={next:e}:n[o]={}}return n}function Ee(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 Ie(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 De(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:oe(n),config:t.config,env:_e(t.config.env)};s.debug("init");const i=await ie(t.init,"TransformerInit",e.hooks)(r);if(!1===i)return!1;t.config={...i||t.config,env:(null==i?void 0: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:{..._e(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await ie(t.push,"TransformerPush",e.hooks)(o,c);return a.debug("push done"),u}async function Te(e,t,n,o,s,r,i){var a,c,u,l,d,f;i&&(null==s?void 0:s._meta)&&(s._meta.chainPath=i);let g=o,p=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:p};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await re(De)(e,r,o))return e.logger.error(`Transformer init failed: ${o}`),{event:null,respond:p};if(i&&void 0!==(null==(c=null==(a=r.config)?void 0:a.chainMocks)?void 0:c[i])){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),g=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),g=r.config.mock;continue}if(null==(l=r.config)?void 0:l.disabled)continue;const h=null==(d=r.config)?void 0:d.cache,v=h?le(h):void 0,m=v?Se(v,e):void 0;let b;if(v&&m){const e=ge(s,g),t=de(v,m,e,`t:${o}`);if("HIT"===(null==t?void 0:t.status)&&t.value){if(g=t.value,v.full)return{event:g,respond:p};continue}"MISS"===(null==t?void 0:t.status)&&(b={key:t.key,ttl:t.rule.ttl})}const y=r.config.before;if(y){const n=Ie("string"==typeof y||Array.isArray(y)&&!ue(y)?y:ce(ae(y),ge(s,g))||void 0,Pe(t));if(n.length>0){const o=await Te(e,t,n,g,s,p,i);if(null===o.event)return{event:null,respond:null!=(f=o.respond)?f:p};o.respond&&(p=o.respond),g=Array.isArray(o.event)?o.event[0]:o.event}}const w=await re($e,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,g,s,p);if(!1===w)return{event:null,respond:p};if(Array.isArray(w)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(w.map(async n=>{const o=n.event||g,a=s?{...s,_meta:{...s._meta,path:[...s._meta.path]}}:oe("unknown");if(n.next){let s=n.next;if(ue(n.next)){const e=ae(n.next);s=ce(e,ge(a,o))}if(s){const n=Ie(s,Pe(t));if(n.length>0)return Te(e,t,n,o,a,p,i)}return{event:o,respond:p}}return r.length>0?Te(e,t,r,o,a,p,i):{event:o,respond:p}}));let c=p;const u=[];for(const e of a.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(c=t.respond),null===t.event)continue;Array.isArray(t.event)?u.push(...t.event):u.push(t.event)}else u.push(e);return 0===u.length?{event:null,respond:c}:1===u.length?{event:u[0],respond:c}:{event:u,respond:c}}if(w&&"object"==typeof w){const{event:n,respond:o,next:r}=w;if(o&&(p=o),r){let o=r;if(ue(r)){const e=ae(r);if(o=ce(e,ge(s,g)),!o){n&&(g=n);continue}}const a=Ie(o,Pe(t));return a.length>0?Te(e,t,a,n||g,s,p,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:p})}n&&(g=n)}if(b&&m&&fe(m,b.key,g,b.ttl),(!w||"object"==typeof w&&!w.next)&&r.config.next&&ue(r.config.next)){const n=r.config.next,o=ae(n),a=ce(o,ge(s,g));if(a){const n=Ie(a,Pe(t));if(n.length>0)return Te(e,t,n,g,s,p,i)}return{event:g,respond:p}}}return{event:g,respond:p}}function _e(e){return e&&se(e)?e:{}}async function He(e,t,n){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:u,cache:l}=n;let d,f=z(t);const g=l?Y({...l,full:null==(o=l.full)||o}):void 0,p=K(c),h=Array.isArray(c)&&X(c)||!p?void 0:Ie(Q(p),Pe(e.transformers)),v=K(u),m=Array.isArray(u)&&X(u)||!v?void 0:Ie(Q(v),Pe(e.transformers)),b=e.logger.scope("source").scope(t),y={push:async(n,o={})=>{let s,i=n;const a=null!=m?m:v?Ie(Q(v,ne(f)),Pe(e.transformers)):[];if(a.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Te(e,e.transformers,a,i,f,d,`source.${t}.before`);if(null===n.event)return{ok:!0};n.respond&&(d=n.respond),i=Array.isArray(n.event)?n.event[0]:n.event}if(g){const n=Se(g,e);if(n){const e=ne(f),o=Z(g,n,e,`s:${t}`);if(o){if("HIT"===o.status&&void 0!==o.value&&g.full){let t=o.value;return o.rule.update&&(t=await te(t,o.rule.update,{...e,cache:{status:"HIT"}})),null==d||d(t),{ok:!0}}if("MISS"===o.status&&g.full&&d){const t=d,r=o.rule.update,i={...e,cache:{status:"MISS"}},a=o.key,c=o.rule.ttl;d=e=>{ee(n,a,e,c),r?s=(async()=>{const n=await te(e,r,i);t(n)})():t(e)}}"MISS"!==o.status||g.full||ee(n,o.key,!0,o.rule.ttl)}}}const c=null!=h?h:p?Ie(Q(p,ne(f)),Pe(e.transformers)):[],u=await e.push(i,{...o,id:t,ingest:f,respond:d,mapping:r,preChain:c});return s&&await s,u},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:b,...i},w={collector:e,logger:b,id:t,config:r,env:y,setIngest:async n=>{if(!r.ingest)return void(f=z(t));const o=await V(n,r.ingest,{collector:e}),s=z(t);f={...s,...o,_meta:s._meta}},setRespond:e=>{d=e}},k=await W(s)(w);if(!k)return;const O=k.type||"unknown",x=e.logger.scope(O).scope(t);return y.logger=x,a&&(k.config={...k.config,primary:a}),k}function Re(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:ze(t.env,t.config.env)};J(t.on)(o,a)}function Me(e,t,n,o){let s;switch(t){case Ce.Consent:s=o||e.consent;break;case Ce.Session:s=e.session;break;case Ce.User:s=o||e.user;break;case Ce.Custom:s=o||e.custom;break;case Ce.Globals:s=o||e.globals;break;case Ce.Config:s=o||e.config;break;case Ce.Ready:case Ce.Run:default:s=void 0}if(n.length)switch(t){case Ce.Consent:!function(e,t,n){const o=n||e.consent;t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{J(t[n])(e,o)})})}(e,n,o);break;case Ce.Ready:case Ce.Run:i=n,(r=e).allowed&&i.forEach(e=>{J(e)(r)});break;case Ce.Session:!function(e,t){e.session&&t.forEach(t=>{J(t)(e,e.session)})}(e,n);break;default:n.forEach(t=>{"function"==typeof t&&J(t)(e,s)})}var r,i}function Ge(e,t,n,o){if(!e)return[];if(t){const e=N(t,A(o));return e?Ie(e,Pe(n)):[]}return Ie(e,Pe(n))}async function Ne(e,t,n){const{code:o,config:s={},env:r={},before:i,next:a,cache:c}=t;if(!H(o.push))return Je({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:ze(o.env,r)};let f=d.config.id;if(!f)do{f=$(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]);return e.destinations[f]=d,!1!==d.config.queue&&(d.queuePush=[...e.queue]),Be(e,void 0,{},{[f]:d})}async function Be(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return Je({ok:!1});t&&(e.queue.push(t),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var c,u,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let d=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&d.push(q(t));const f=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:I("unknown");if(!d.length&&!(null==(c=s.queueOn)?void 0:c.length))return{id:o,destination:s,skipped:!0};if(!d.length&&(null==(u=s.queueOn)?void 0:u.length)){const t=await B(Ue)(e,s,o);return{id:o,destination:s,skipped:!t}}const g=[],p=d.filter(e=>{const t=T(s.config.consent,r,e.consent);return!t||(e.consent=t,g.push(e),!1)});if(s.queuePush.push(...p),!g.length)return{id:o,destination:s,queue:d};if(!await B(Ue)(e,s,o))return{id:o,destination:s,queue:d};let h,v;s.dlq||(s.dlq=[]);const m=s.config.before,b=Ge(m,m&&M(m)?E(m):void 0,e.transformers,f),y=s.config.next,w=y&&M(y)?E(y):void 0,k=null==(l=s.config)?void 0:l.cache,O=k?C(k):void 0,x=O?Se(O,e):void 0;let D=0;return await Promise.all(g.map(async t=>{let r;if(t.globals=j(i,t.globals),t.user=j(a,t.user),(null==O?void 0:O.full)&&x){const e=A(f,t),n=S(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}let c=t,u=n.respond;if(b.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Te(e,e.transformers,b,t,f,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(u=s.respond),c=Array.isArray(s.event)?s.event[0]:s.event}if(O&&!O.full&&x){const e=A(f,c),n=S(O,x,e,`d:${o}`);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}const l=Date.now();let d=!1;const g=await B(Le,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:c.name}),h=t,d=!0,s.dlq.push([c,t])})(e,s,o,c,f,u);if(D+=Date.now()-l,r&&x&&void 0===s.config.mock&&P(x,r.key,null==g||g,r.ttl),void 0!==g&&(v=g),!d&&y){void 0!==g&&(f._response=g);const t=Ge(y,w,e.transformers,f);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Te(e,e.transformers,t,c,f,u,`destination.${o}.next`);n.respond&&(u=n.respond)}}return t})),{id:o,destination:s,error:h,response:v,totalDuration:D}})),u={},l={},d={};for(const t of c){if(t.skipped)continue;const n={type:t.destination.type||"unknown",data:t.response};e.status.destinations[t.id]||(e.status.destinations[t.id]={count:0,failed:0,duration:0});const o=e.status.destinations[t.id],s=Date.now();t.error?(n.error=t.error,d[t.id]=n,o.failed++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.failed++):t.queue&&t.queue.length?l[t.id]=n:(u[t.id]=n,o.count++,o.lastAt=s,o.duration+=t.totalDuration||0,e.status.out++)}return Je({event:t,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(d).length&&{failed:d}})}async function Ue(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:ze(t.env,t.config.env)};r.debug("init");const a=await U(t.init,"DestinationInit",e.hooks)(i);if(!1===a)return a;if(t.config={...a||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)Re(e,t,n,s,r)}r.debug("init done")}return!0}async function Le(e,t,n,o,s,r){const{config:i}=t,a=await G(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:{...ze(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(!(null==d?void 0:d.batch)||!t.pushBatch||void 0!==i.mock){u.debug("push",{event:a.event.name});const n=await U(t.push,"DestinationPush",e.hooks)(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:D(()=>{const o=t.batches[f].batched,a={collector:e,logger:u,id:n,config:i,data:void 0,rule:d,ingest:s,env:{...ze(t.env,i.env),...r?{respond:r}:{}}};u.debug("push batch",{events:o.events.length}),U(t.pushBatch,"DestinationPushBatch",e.hooks)(o,a),u.debug("push batch done"),o.events=[],o.data=[]},d.batch)}}const o=t.batches[f];o.batched.events.push(a.event),_(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function Je(e){return{ok:!(null==e?void 0:e.failed),...e}}function Fe(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=Ee(e,"before"),{config:i}=Ee({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=ze(t.env,o);return{...t,config:a,env:c}}function ze(e,t){return e||t?t?e&&R(e)&&R(t)?{...e,...t}:t:e:{}}async function Ve(e,t,n){const o=Object.entries(e).map(async([e,o])=>{var s;const r=o.destroy;if(!r)return;const i=o.type||"unknown",a=n.scope(i),c={id:e,config:o.config,env:null!=(s=o.env)?s:{},logger:a};try{await Promise.race([r(c),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function We(e,t,n,o){let s,r,i=!1;switch(t){case Ce.Config:be(n)&&(pe(e.config,n,{shallow:!1}),r=n,i=!0);break;case Ce.Consent:if(be(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=k(e.consent,n),{update:n}}(e,n);r=t,i=!0}break;case Ce.Custom:be(n)&&(e.custom=pe(e.custom,n),r=n,i=!0);break;case Ce.Destination:be(n)&&("code"in n&&be(n.code)?s=await Ne(e,n,o):ve(n.push)&&(s=await Ne(e,{code:n},o)));break;case Ce.Globals:be(n)&&(e.globals=pe(e.globals,n),r=n,i=!0);break;case Ce.On:me(n)&&await async function(e,t,n){const o=e.on,s=o[t]||[],r=L(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,Me(e,t,r)}(e,n,o);break;case Ce.Ready:i=!0;break;case Ce.Run:s=await async function(e,t){return e.allowed=!0,e.count=0,e.group=he(),e.timing=Date.now(),t&&(t.consent&&(e.consent=pe(e.consent,t.consent)),t.user&&(e.user=pe(e.user,t.user)),t.globals&&(e.globals=pe(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=pe(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Be(e)}(e,n),i=!0;break;case Ce.Session:i=!0;break;case Ce.Shutdown:await async function(e){const t=e.logger;await Ve(e.sources,"source",t),await Ve(e.destinations,"destination",t),await Ve(e.transformers,"transformer",t),await Ve(e.stores,"store",t)}(e);break;case Ce.User:be(n)&&(pe(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 Ce.Consent:s=o||e.consent;break;case Ce.Session:s=e.session;break;case Ce.User:s=o||e.user;break;case Ce.Custom:s=o||e.custom;break;case Ce.Globals:s=o||e.globals;break;case Ce.Config:s=o||e.config;break;case Ce.Ready:case Ce.Run:default:s=void 0}let i=!1;for(const n of Object.values(e.sources))n.on&&!1===await F(n.on)(t,s)&&(i=!0);return Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:s});Re(e,o,n,t,s)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e,t){var n,o;for(const[o,s]of Object.entries(e.pending.sources)){if(!e.pending.sources[o]||e.sources[o])continue;const r=null==(n=s.config)?void 0:n.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.sources[o];const a=await He(e,o,s);a&&(e.sources[o]=a)}for(const[n,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const r=null==(o=s.config)?void 0:o.require;if(!r)continue;const i=r.indexOf(t);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.destinations[n];const a=Fe(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[n]=a}}(e,t),Me(e,t,r,o),!i}(e,t,void 0,r),s=await Be(e)),s||Je({ok:!0})}function Ke(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");++e.count;const{timestamp:s=Date.now(),group:r=e.group,count:i=e.count}=t,{name:a=`${n} ${o}`,data:c={},context:u={},globals:l=e.globals,custom:d={},user:f=e.user,nested:g=[],consent:p=e.consent,id:h=`${s}-${r}-${i}`,trigger:v="",entity:m=n,action:b=o,timing:y=0,version:w={source:e.version,tagging:e.config.tagging||0},source:k={type:"collector",id:"",previous_id:""}}=t;return{name:a,data:c,context:u,globals:l,custom:d,user:f,nested:g,consent:p,id:h,trigger:v,entity:m,action:b,timestamp:s,timing:y,group:r,count:i,version:w,source:k}}async function Qe(e){var t,n;const o=O({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),s={level:null==(t=e.logger)?void 0:t.level,handler:null==(n=e.logger)?void 0:n.handler},r=x(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,group:"",hooks:e.hooks||{},logger:r,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||{},version:"3.3.1",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var c,u;a.push=function(e,t){return xe(async(n,o={})=>await Oe(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:u,preChain:l,include:d,exclude:f}=o;let g=c,p=n;const h=d||f?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,d,f):void 0,v=null!=a?a:ye(i||"unknown");if(u){const t=await ke(p,u,e);if(t.ignore)return Je({ok:!0});if(u.consent&&!we(u.consent,e.consent,t.event.consent))return Je({ok:!0});p=t.event}if((null==l?void 0:l.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Te(e,e.transformers,l,p,v,g,i?`source.${i}.next`:void 0);if(null===n.event)return Je({ok:!0});if(n.respond&&(g=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=Ke(e,o);return Be(e,s,{id:i,ingest:v,respond:g},h)}));if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-r}return null!=(s=o[0])?s:Je({ok:!0})}p=n.event}const m=t(p),b=Ke(e,m),y=await Be(e,b,{id:i,ingest:v,respond:g},h);if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-r}return y},()=>Je({ok:!1}))(),"Push",e.hooks)}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e})),a.command=(u=We,je(async(e,t,n)=>await Ae(async()=>await u(c,e,t,n),()=>Je({ok:!1}))(),"Command",(c=a).hooks));const l=e.stores||{};if(a.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=qe(l,"StoreGet",e.hooks),u.set=qe(d,"StoreSet",e.hooks),u.delete=qe(f,"StoreDelete",e.hooks),n[o]=u}return n}(a,l),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)}}}(l,a.stores,e),!a.stores.__cache){const e=new Map;a.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 a.destinations=await async function(e,t={}){var n,o;const s={};for(const[r,i]of Object.entries(t))(null==(o=null==(n=i.config)?void 0:n.require)?void 0:o.length)?e.pending.destinations[r]=i:s[r]=Fe(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,{config:i}=Ee(s,"before"),{config:a}=Ee({...s,config:i},"next"),c=Object.keys(r).length>0?{...a,env:r}:a,{cache:u}=s,l=u?{...c,cache:u}:c,d=e.logger.scope("transformer").scope(o),f={collector:e,logger:d,id:o,ingest:oe(o),config:l,env:r},g=await t(f);n[o]=g}return n}(a,e.transformers||{}),a}async function Xe(e){e=e||{};const t=await Qe(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 Je({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;const s=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{config:t={}}=s;if(t.require&&t.require.length>0){e.pending.sources[o]=s;continue}const r=await He(e,o,s);r&&(n[o]=r)}return n}(t,e.sources||{});Object.assign(t.sources,s);const{consent:r,user:i,globals:a,custom:c}=e;r&&await t.command("consent",r),i&&await t.command("user",i),a&&Object.assign(t.globals,a),c&&Object.assign(t.custom,c),t.config.run&&await t.command("run");let u=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),d=l.find(e=>e.config.primary);return d?u=d.push:l.length>0&&(u=l[0].push),{collector:t,elb:u}}var Ye=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Xe(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(e){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 Ze(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"})}}export{d as examples,n as schemas};//# sourceMappingURL=dev.mjs.map
|
package/dist/dev.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["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","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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":"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","names":["z","z","trigger","k","v"]}
|
|
1
|
+
{"version":3,"sources":["../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["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","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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":"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","names":["z","z","trigger","k","v"]}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},index_exports={};__export(index_exports,{SourceLambda:()=>types_exports,examples:()=>examples_exports,sourceLambda:()=>lambda_default}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core13=require("@walkeros/core");function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},apiGatewayV1Post={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},lambdaGet={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},import_core=require("@walkeros/core"),import_core2=require("@walkeros/core"),import_core3=require("@walkeros/core"),import_core4=require("@walkeros/core"),import_core5=require("@walkeros/core"),import_core6=require("@walkeros/core"),import_core7=require("@walkeros/core"),import_core8=require("@walkeros/core"),import_core9=require("@walkeros/core"),import_core10=require("@walkeros/core"),import_core11=require("@walkeros/core"),import_core12=require("@walkeros/core"),t_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){var _a;const n2={};for(const[t2,o2]of Object.entries(e)){const e2=null==(_a=o2.config)?void 0:_a.next;e2&&!(0,import_core7.isRouteArray)(e2)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:(0,import_core7.createIngest)(t2),config:n2.config,env:se(n2.config.env)};s2.debug("init");const i2=await(0,import_core7.useHooks)(n2.init,"TransformerInit",e.hooks)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:(null==i2?void 0:i2.env)||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...se(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await(0,import_core7.useHooks)(n2.push,"TransformerPush",e.hooks)(o2,c2);return a2.debug("push done"),u2}async function oe(e,n2,t2,o2,s2,r2,i2){var _a,_b,_c,_d,_e2,_f;i2&&(null==s2?void 0:s2._meta)&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await(0,import_core7.tryCatchAsync)(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{event:null,respond:c2};if(i2&&void 0!==(null==(_b=null==(_a=r3.config)?void 0:_a.chainMocks)?void 0:_b[i2])){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==(null==(_c=r3.config)?void 0:_c.mock)){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(null==(_d=r3.config)?void 0:_d.disabled)continue;const u2=null==(_e2=r3.config)?void 0:_e2.cache,f2=u2?(0,import_core7.compileCache)(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=(0,import_core7.buildCacheContext)(s2,a2),n3=(0,import_core7.checkCache)(f2,l2,e2,`t:${o3}`);if("HIT"===(null==n3?void 0:n3.status)&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===(null==n3?void 0:n3.status)&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!(0,import_core7.isRouteArray)(g2)?g2:(0,import_core7.resolveNext)((0,import_core7.compileNext)(g2),(0,import_core7.buildCacheContext)(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:null!=(_f=o4.respond)?_f:c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const p2=await(0,import_core7.tryCatchAsync)(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===p2)return{event:null,respond:c2};if(Array.isArray(p2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(p2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:(0,import_core7.createIngest)("unknown");if(t3.next){let s3=t3.next;if((0,import_core7.isRouteArray)(t3.next)){const e2=(0,import_core7.compileNext)(t3.next);s3=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(p2&&"object"==typeof p2){const{event:t3,respond:o4,next:r4}=p2;if(o4&&(c2=o4),r4){let o5=r4;if((0,import_core7.isRouteArray)(r4)){const e2=(0,import_core7.compileNext)(r4);if(o5=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&(0,import_core7.storeCache)(l2,d2.key,a2,d2.ttl),(!p2||"object"==typeof p2&&!p2.next)&&r3.config.next&&(0,import_core7.isRouteArray)(r3.config.next)){const t3=r3.config.next,o4=(0,import_core7.compileNext)(t3),u3=(0,import_core7.resolveNext)(o4,(0,import_core7.buildCacheContext)(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&(0,import_core7.isObject)(e)?e:{}}async function re(e,n2,t2){var _a;const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=(0,import_core6.createIngest)(n2);const d2=u2?(0,import_core6.compileCache)({...u2,full:null==(_a=u2.full)||_a}):void 0,g2=(0,import_core6.compileNext)(a2),p2=Array.isArray(a2)&&(0,import_core6.isRouteArray)(a2)||!g2?void 0:ee((0,import_core6.resolveNext)(g2),Y(e.transformers)),m2=(0,import_core6.compileNext)(c2),h2=Array.isArray(c2)&&(0,import_core6.isRouteArray)(c2)||!m2?void 0:ee((0,import_core6.resolveNext)(m2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),v2={push:async(t3,o3={})=>{let r3=t3;const i3=null!=h2?h2:m2?ee((0,import_core6.resolveNext)(m2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[];if(i3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,i3,r3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),r3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const e2=(0,import_core6.buildCacheContext)(l2),o4=(0,import_core6.checkCache)(d2,t4,e2,`s:${n2}`);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&d2.full){let n3=o4.value;return o4.rule.update&&(n3=await(0,import_core6.applyUpdate)(n3,o4.rule.update,{...e2,cache:{status:"HIT"}})),null==f2||f2(n3),{ok:!0}}if("MISS"===o4.status&&d2.full&&f2){const n3=f2,s3=o4.rule.update,r4={...e2,cache:{status:"MISS"}};f2=e3=>{(0,import_core6.storeCache)(t4,o4.key,e3,o4.rule.ttl),s3?(0,import_core6.applyUpdate)(e3,s3,r4).then(e4=>n3(e4)):n3(e3)}}"MISS"!==o4.status||d2.full||(0,import_core6.storeCache)(t4,o4.key,!0,o4.rule.ttl)}}}const a3=null!=p2?p2:g2?ee((0,import_core6.resolveNext)(g2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[];return e.push(r3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:a3})},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},b2={collector:e,logger:y2,id:n2,config:s2,env:v2,setIngest:async t3=>{if(!s2.ingest)return void(l2=(0,import_core6.createIngest)(n2));const o3=await(0,import_core6.getMappingValue)(t3,s2.ingest,{collector:e}),r3=(0,import_core6.createIngest)(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await(0,import_core6.tryCatchAsync)(o2)(b2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return v2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function ce(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:ve(n2.env,n2.config.env)};(0,import_core5.tryCatch)(n2.on)(o2,a2)}async function ue(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const t2 of Object.values(e.sources))t2.on&&!1===await(0,import_core5.tryCatchAsync)(t2.on)(n2,r2)&&(a2=!0);if(Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});ce(e,o3,t2,n2,r2)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e2,n3){var _a,_b;for(const[t2,o3]of Object.entries(e2.pending.sources)){if(!e2.pending.sources[t2]||e2.sources[t2])continue;const s3=null==(_a=o3.config)?void 0:_a.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.sources[t2];const i3=await re(e2,t2,o3);i3&&(e2.sources[t2]=i3)}for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=null==(_b=o3.config)?void 0:_b.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=he(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),!i2.length)return!a2;switch(n2){case t_Commands.Consent:!function(e2,n3,t2){const o3=t2||e2.consent;n3.forEach(n4=>{Object.keys(o3).filter(e3=>e3 in n4).forEach(t3=>{(0,import_core5.tryCatch)(n4[t3])(e2,o3)})})}(e,i2,s2);break;case t_Commands.Ready:case t_Commands.Run:n3=i2,(e2=e).allowed&&n3.forEach(n4=>{(0,import_core5.tryCatch)(n4)(e2)});break;case t_Commands.Session:!function(e2,n3){e2.session&&n3.forEach(n4=>{(0,import_core5.tryCatch)(n4)(e2,e2.session)})}(e,i2);break;default:i2.forEach(n3=>{"function"==typeof n3&&(0,import_core5.tryCatch)(n3)(e,r2)})}var e2,n3;return!a2}function fe(e,n2,t2,o2){if(!e)return[];if(n2){const e2=(0,import_core3.resolveNext)(n2,(0,import_core3.buildCacheContext)(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function le(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!(0,import_core3.isFunction)(o2.push))return me({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:ve(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=(0,import_core3.getId)(4)}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),de(e,void 0,{},{[d2]:l2})}async function de(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:m2}=e;if(!s2)return me({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{var _a,_b,_c;if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push((0,import_core3.clone)(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:(0,import_core3.createIngest)("unknown");if(!h3.length&&!(null==(_a=s3.queueOn)?void 0:_a.length))return{id:o3,destination:s3,skipped:!0};if(!h3.length&&(null==(_b=s3.queueOn)?void 0:_b.length)){const n3=await(0,import_core3.tryCatchAsync)(ge)(e,s3,o3);return{id:o3,destination:s3,skipped:!n3}}const b3=[],w3=h3.filter(e2=>{const n3=(0,import_core3.getGrantedConsent)(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,b3.push(e2),!1)});if(s3.queuePush.push(...w3),!b3.length)return{id:o3,destination:s3,queue:h3};if(!await(0,import_core3.tryCatchAsync)(ge)(e,s3,o3))return{id:o3,destination:s3,queue:h3};let C2,O2;s3.dlq||(s3.dlq=[]);const A2=s3.config.before,x2=fe(A2,A2&&(0,import_core3.isRouteArray)(A2)?(0,import_core3.compileNext)(A2):void 0,e.transformers,v3),q2=s3.config.next,S2=q2&&(0,import_core3.isRouteArray)(q2)?(0,import_core3.compileNext)(q2):void 0,$2=null==(_c=s3.config)?void 0:_c.cache,D2=$2?(0,import_core3.compileCache)($2):void 0,_2=D2?X(D2,e):void 0;let I2=0;return await Promise.all(b3.map(async n3=>{let r3;if(n3.globals=(0,import_core3.assign)(i2,n3.globals),n3.user=(0,import_core3.assign)(m2,n3.user),(null==D2?void 0:D2.full)&&_2){const e2=(0,import_core3.buildCacheContext)(v3,n3),t3=(0,import_core3.checkCache)(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(x2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,x2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(D2&&!D2.full&&_2){const e2=(0,import_core3.buildCacheContext)(v3,u2),t3=(0,import_core3.checkCache)(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let p2=!1;const h4=await(0,import_core3.tryCatchAsync)(pe,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,p2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,v3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&(0,import_core3.storeCache)(_2,r3.key,null==h4||h4,r3.ttl),void 0!==h4&&(O2=h4),!p2&&q2){void 0!==h4&&(v3._response=h4);const n4=fe(q2,S2,e.transformers,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,v3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),v2={},b2={},w2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,w2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?b2[n3.id]=t3:(v2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return me({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(b2).length&&{queued:b2},...Object.keys(w2).length&&{failed:w2}})}async function ge(e,n2,t2){var _a;if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:ve(n2.env,n2.config.env)};s2.debug("init");const i2=await(0,import_core3.useHooks)(n2.init,"DestinationInit",e.hooks)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},null==(_a=n2.queueOn)?void 0:_a.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)ce(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function pe(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await(0,import_core3.processEventMapping)(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...ve(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!(null==l2?void 0:l2.batch)||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await(0,import_core3.useHooks)(n2.push,"DestinationPush",e.hooks)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:(0,import_core3.debounce)(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...ve(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),(0,import_core3.useHooks)(n2.pushBatch,"DestinationPushBatch",e.hooks)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),(0,import_core3.isDefined)(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function me(e){return{ok:!(null==e?void 0:e.failed),...e}}function he(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=ve(n2.env,o2);return{...n2,config:a2,env:c2}}function ve(e,n2){return e||n2?n2?e&&(0,import_core3.isObject)(e)&&(0,import_core3.isObject)(n2)?{...e,...n2}:n2:e:{}}async function je(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{var _a;const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:null!=(_a=o3.env)?_a:{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Ae(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if((0,import_core9.isObject)(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=(0,import_core.assign)(e.consent,t2),{update:t2}}(e,o2);a2=n3,c2=!0}break;case t_Commands.Custom:(0,import_core9.isObject)(o2)&&(e.custom=(0,import_core8.assign)(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:(0,import_core9.isObject)(o2)&&("code"in o2&&(0,import_core9.isObject)(o2.code)?i2=await le(e,o2,r2):(0,import_core8.isFunction)(o2.push)&&(i2=await le(e,{code:o2},r2)));break;case t_Commands.Globals:(0,import_core9.isObject)(o2)&&(e.globals=(0,import_core8.assign)(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:(0,import_core8.isString)(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=(0,import_core4.isArray)(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,await ue(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.count=0,e.group=(0,import_core8.getId)(),e.timing=Date.now(),n2&&(n2.consent&&(e.consent=(0,import_core8.assign)(e.consent,n2.consent)),n2.user&&(e.user=(0,import_core8.assign)(e.user,n2.user)),n2.globals&&(e.globals=(0,import_core8.assign)(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=(0,import_core8.assign)(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await de(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await je(e2.sources,"source",n3),await je(e2.destinations,"destination",n3),await je(e2.transformers,"transformer",n3),await je(e2.stores,"store",n3)}(e);break;case t_Commands.User:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(await ue(e,n2,void 0,a2),i2=await de(e)),i2||me({ok:!0})}function xe(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");++e.count;const{timestamp:s2=Date.now(),group:r2=e.group,count:i2=e.count}=n2,{name:a2=`${t2} ${o2}`,data:c2={},context:u2={},globals:f2=e.globals,custom:l2={},user:d2=e.user,nested:g2=[],consent:p2=e.consent,id:m2=`${s2}-${r2}-${i2}`,trigger:h2="",entity:y2=t2,action:v2=o2,timing:b2=0,version:w2={source:e.version,tagging:e.config.tagging||0},source:k2={type:"collector",id:"",previous_id:""}}=n2;return{name:a2,data:c2,context:u2,globals:f2,custom:l2,user:d2,nested:g2,consent:p2,id:m2,trigger:h2,entity:y2,action:v2,timestamp:s2,timing:b2,group:r2,count:i2,version:w2,source:k2}}async function He(e){var _a,_b;const n2=(0,import_core2.assign)({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),t2={level:null==(_a=e.logger)?void 0:_a.level,handler:null==(_b=e.logger)?void 0:_b.handler},o2=(0,import_core2.createLogger)(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,group:"",hooks:e.hooks||{},logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:e.user||{},version:"3.2.0",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return(0,import_core10.useHooks)(async(t2,o2={})=>await(0,import_core10.tryCatchAsync)(async()=>{var _a;const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const p2=f2||l2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,f2,l2):void 0,m2=null!=i2?i2:(0,import_core10.createIngest)(r2||"unknown");if(c2){const n3=await(0,import_core10.processEventMapping)(g2,c2,e);if(n3.ignore)return me({ok:!0});if(c2.consent&&!(0,import_core10.getGrantedConsent)(c2.consent,e.consent,n3.event.consent))return me({ok:!0});g2=n3.event}if((null==u2?void 0:u2.length)&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,m2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return me({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=xe(e,o4);return de(e,s3,{id:r2,ingest:m2,respond:d2},p2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return null!=(_a=o3[0])?_a:me({ok:!0})}g2=t3.event}const h2=n2(g2),y2=xe(e,h2),v2=await de(e,y2,{id:r2,ingest:m2,respond:d2},p2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},()=>me({ok:!1}))(),"Push",e.hooks)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e2})),a2.command=(e2=a2,n3=Ae,(0,import_core11.useHooks)(async(t3,o3,s3)=>await(0,import_core11.tryCatchAsync)(async()=>await n3(e2,t3,o3,s3),()=>me({ok:!1}))(),"Command",e2.hooks));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=(0,import_core12.useHooks)(f2,"StoreGet",e2.hooks),u2.set=(0,import_core12.useHooks)(l2,"StoreSet",e2.hooks),u2.delete=(0,import_core12.useHooks)(d2,"StoreDelete",e2.hooks),t3[o3]=u2}return t3}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),!a2.stores.__cache){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return a2.destinations=await async function(e,n2={}){var _a,_b;const t2={};for(const[o2,s2]of Object.entries(n2))(null==(_b=null==(_a=s2.config)?void 0:_a.require)?void 0:_b.length)?e.pending.destinations[o2]=s2:t2[o2]=he(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:(0,import_core7.createIngest)(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Te(e){e=e||{};const n2=await He(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return me({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2;const s2=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const{config:n3={}}=s2;if(n3.require&&n3.require.length>0){e.pending.sources[o2]=s2;continue}const r2=await re(e,o2,s2);r2&&(t2[o2]=r2)}return t2}(n2,e.sources||{});Object.assign(n2.sources,s2);const{consent:r2,user:i2,globals:a2,custom:c2}=e;r2&&await n2.command("consent",r2),i2&&await n2.command("user",i2),a2&&Object.assign(n2.globals,a2),c2&&Object.assign(n2.custom,c2),n2.config.run&&await n2.command("run");let u2=t2.push;const f2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=f2.find(e2=>e2.config.primary);return l2?u2=l2.push:f2.length>0&&(u2=f2[0].push),{collector:n2,elb:u2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await Te(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch(e){body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var sourceLambda=async context=>{var _a,_b,_c,_d;const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,userSettings=config.settings||{},settings={...userSettings,cors:null==(_a=userSettings.cors)||_a,timeout:null!=(_b=userSettings.timeout)?_b:3e4,enablePixelTracking:null==(_c=userSettings.enablePixelTracking)||_c,healthPath:null!=(_d=userSettings.healthPath)?_d:"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,context2)=>{var _a2;const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=(0,import_core13.requestToData)(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a2=env.logger)||_a2.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}},lambda_default=sourceLambda;//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},index_exports={};__export(index_exports,{SourceLambda:()=>types_exports,examples:()=>examples_exports,sourceLambda:()=>lambda_default}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core13=require("@walkeros/core");function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},apiGatewayV1Post={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},lambdaGet={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},import_core=require("@walkeros/core"),import_core2=require("@walkeros/core"),import_core3=require("@walkeros/core"),import_core4=require("@walkeros/core"),import_core5=require("@walkeros/core"),import_core6=require("@walkeros/core"),import_core7=require("@walkeros/core"),import_core8=require("@walkeros/core"),import_core9=require("@walkeros/core"),import_core10=require("@walkeros/core"),import_core11=require("@walkeros/core"),import_core12=require("@walkeros/core"),t_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){var _a;const n2={};for(const[t2,o2]of Object.entries(e)){const e2=null==(_a=o2.config)?void 0:_a.next;e2&&!(0,import_core7.isRouteArray)(e2)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:(0,import_core7.createIngest)(t2),config:n2.config,env:se(n2.config.env)};s2.debug("init");const i2=await(0,import_core7.useHooks)(n2.init,"TransformerInit",e.hooks)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:(null==i2?void 0:i2.env)||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...se(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await(0,import_core7.useHooks)(n2.push,"TransformerPush",e.hooks)(o2,c2);return a2.debug("push done"),u2}async function oe(e,n2,t2,o2,s2,r2,i2){var _a,_b,_c,_d,_e2,_f;i2&&(null==s2?void 0:s2._meta)&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await(0,import_core7.tryCatchAsync)(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{event:null,respond:c2};if(i2&&void 0!==(null==(_b=null==(_a=r3.config)?void 0:_a.chainMocks)?void 0:_b[i2])){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==(null==(_c=r3.config)?void 0:_c.mock)){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(null==(_d=r3.config)?void 0:_d.disabled)continue;const u2=null==(_e2=r3.config)?void 0:_e2.cache,f2=u2?(0,import_core7.compileCache)(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=(0,import_core7.buildCacheContext)(s2,a2),n3=(0,import_core7.checkCache)(f2,l2,e2,`t:${o3}`);if("HIT"===(null==n3?void 0:n3.status)&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===(null==n3?void 0:n3.status)&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!(0,import_core7.isRouteArray)(g2)?g2:(0,import_core7.resolveNext)((0,import_core7.compileNext)(g2),(0,import_core7.buildCacheContext)(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:null!=(_f=o4.respond)?_f:c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=await(0,import_core7.tryCatchAsync)(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:(0,import_core7.createIngest)("unknown");if(t3.next){let s3=t3.next;if((0,import_core7.isRouteArray)(t3.next)){const e2=(0,import_core7.compileNext)(t3.next);s3=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){let o5=r4;if((0,import_core7.isRouteArray)(r4)){const e2=(0,import_core7.compileNext)(r4);if(o5=(0,import_core7.resolveNext)(e2,(0,import_core7.buildCacheContext)(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&(0,import_core7.storeCache)(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&(0,import_core7.isRouteArray)(r3.config.next)){const t3=r3.config.next,o4=(0,import_core7.compileNext)(t3),u3=(0,import_core7.resolveNext)(o4,(0,import_core7.buildCacheContext)(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&(0,import_core7.isObject)(e)?e:{}}async function re(e,n2,t2){var _a;const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=(0,import_core6.createIngest)(n2);const d2=u2?(0,import_core6.compileCache)({...u2,full:null==(_a=u2.full)||_a}):void 0,g2=(0,import_core6.compileNext)(a2),m2=Array.isArray(a2)&&(0,import_core6.isRouteArray)(a2)||!g2?void 0:ee((0,import_core6.resolveNext)(g2),Y(e.transformers)),p2=(0,import_core6.compileNext)(c2),h2=Array.isArray(c2)&&(0,import_core6.isRouteArray)(c2)||!p2?void 0:ee((0,import_core6.resolveNext)(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),v2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=null!=h2?h2:p2?ee((0,import_core6.resolveNext)(p2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[];if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const e2=(0,import_core6.buildCacheContext)(l2),o4=(0,import_core6.checkCache)(d2,t4,e2,`s:${n2}`);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&d2.full){let n3=o4.value;return o4.rule.update&&(n3=await(0,import_core6.applyUpdate)(n3,o4.rule.update,{...e2,cache:{status:"HIT"}})),null==f2||f2(n3),{ok:!0}}if("MISS"===o4.status&&d2.full&&f2){const n3=f2,s3=o4.rule.update,i4={...e2,cache:{status:"MISS"}},a4=o4.key,c4=o4.rule.ttl;f2=e3=>{(0,import_core6.storeCache)(t4,a4,e3,c4),s3?r3=(async()=>{const t5=await(0,import_core6.applyUpdate)(e3,s3,i4);n3(t5)})():n3(e3)}}"MISS"!==o4.status||d2.full||(0,import_core6.storeCache)(t4,o4.key,!0,o4.rule.ttl)}}}const c3=null!=m2?m2:g2?ee((0,import_core6.resolveNext)(g2,(0,import_core6.buildCacheContext)(l2)),Y(e.transformers)):[],u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},b2={collector:e,logger:y2,id:n2,config:s2,env:v2,setIngest:async t3=>{if(!s2.ingest)return void(l2=(0,import_core6.createIngest)(n2));const o3=await(0,import_core6.getMappingValue)(t3,s2.ingest,{collector:e}),r3=(0,import_core6.createIngest)(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},k2=await(0,import_core6.tryCatchAsync)(o2)(b2);if(!k2)return;const w2=k2.type||"unknown",C2=e.logger.scope(w2).scope(n2);return v2.logger=C2,i2&&(k2.config={...k2.config,primary:i2}),k2}function ce(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:be(n2.env,n2.config.env)};(0,import_core5.tryCatch)(n2.on)(o2,a2)}function ue(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,t2){const o3=t2||e2.consent;n3.forEach(n4=>{Object.keys(o3).filter(e3=>e3 in n4).forEach(t3=>{(0,import_core5.tryCatch)(n4[t3])(e2,o3)})})}(e,o2,s2);break;case t_Commands.Ready:case t_Commands.Run:n3=o2,(e2=e).allowed&&n3.forEach(n4=>{(0,import_core5.tryCatch)(n4)(e2)});break;case t_Commands.Session:!function(e2,n3){e2.session&&n3.forEach(n4=>{(0,import_core5.tryCatch)(n4)(e2,e2.session)})}(e,o2);break;default:o2.forEach(n3=>{"function"==typeof n3&&(0,import_core5.tryCatch)(n3)(e,r2)})}var e2,n3}function le(e,n2,t2,o2){if(!e)return[];if(n2){const e2=(0,import_core3.resolveNext)(n2,(0,import_core3.buildCacheContext)(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function de(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!(0,import_core3.isFunction)(o2.push))return he({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:be(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=(0,import_core3.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),ge(e,void 0,{},{[d2]:l2})}async function ge(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return he({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{var _a,_b,_c;if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push((0,import_core3.clone)(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:(0,import_core3.createIngest)("unknown");if(!h3.length&&!(null==(_a=s3.queueOn)?void 0:_a.length))return{id:o3,destination:s3,skipped:!0};if(!h3.length&&(null==(_b=s3.queueOn)?void 0:_b.length)){const n3=await(0,import_core3.tryCatchAsync)(me)(e,s3,o3);return{id:o3,destination:s3,skipped:!n3}}const b3=[],k3=h3.filter(e2=>{const n3=(0,import_core3.getGrantedConsent)(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,b3.push(e2),!1)});if(s3.queuePush.push(...k3),!b3.length)return{id:o3,destination:s3,queue:h3};if(!await(0,import_core3.tryCatchAsync)(me)(e,s3,o3))return{id:o3,destination:s3,queue:h3};let C2,O2;s3.dlq||(s3.dlq=[]);const x2=s3.config.before,A2=le(x2,x2&&(0,import_core3.isRouteArray)(x2)?(0,import_core3.compileNext)(x2):void 0,e.transformers,v3),q2=s3.config.next,S2=q2&&(0,import_core3.isRouteArray)(q2)?(0,import_core3.compileNext)(q2):void 0,$2=null==(_c=s3.config)?void 0:_c.cache,D2=$2?(0,import_core3.compileCache)($2):void 0,_2=D2?X(D2,e):void 0;let I2=0;return await Promise.all(b3.map(async n3=>{let r3;if(n3.globals=(0,import_core3.assign)(i2,n3.globals),n3.user=(0,import_core3.assign)(p2,n3.user),(null==D2?void 0:D2.full)&&_2){const e2=(0,import_core3.buildCacheContext)(v3,n3),t3=(0,import_core3.checkCache)(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,A2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(D2&&!D2.full&&_2){const e2=(0,import_core3.buildCacheContext)(v3,u2),t3=(0,import_core3.checkCache)(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const h4=await(0,import_core3.tryCatchAsync)(pe,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,v3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&(0,import_core3.storeCache)(_2,r3.key,null==h4||h4,r3.ttl),void 0!==h4&&(O2=h4),!m2&&q2){void 0!==h4&&(v3._response=h4);const n4=le(q2,S2,e.transformers,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,v3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),v2={},b2={},k2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,k2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?b2[n3.id]=t3:(v2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return he({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(b2).length&&{queued:b2},...Object.keys(k2).length&&{failed:k2}})}async function me(e,n2,t2){var _a;if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:be(n2.env,n2.config.env)};s2.debug("init");const i2=await(0,import_core3.useHooks)(n2.init,"DestinationInit",e.hooks)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},null==(_a=n2.queueOn)?void 0:_a.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)ce(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function pe(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await(0,import_core3.processEventMapping)(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...be(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!(null==l2?void 0:l2.batch)||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await(0,import_core3.useHooks)(n2.push,"DestinationPush",e.hooks)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:(0,import_core3.debounce)(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...be(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),(0,import_core3.useHooks)(n2.pushBatch,"DestinationPushBatch",e.hooks)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),(0,import_core3.isDefined)(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function he(e){return{ok:!(null==e?void 0:e.failed),...e}}function ye(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=be(n2.env,o2);return{...n2,config:a2,env:c2}}function be(e,n2){return e||n2?n2?e&&(0,import_core3.isObject)(e)&&(0,import_core3.isObject)(n2)?{...e,...n2}:n2:e:{}}async function xe(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{var _a;const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:null!=(_a=o3.env)?_a:{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Ae(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if((0,import_core9.isObject)(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=(0,import_core.assign)(e.consent,t2),{update:t2}}(e,o2);a2=n3,c2=!0}break;case t_Commands.Custom:(0,import_core9.isObject)(o2)&&(e.custom=(0,import_core8.assign)(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:(0,import_core9.isObject)(o2)&&("code"in o2&&(0,import_core9.isObject)(o2.code)?i2=await de(e,o2,r2):(0,import_core8.isFunction)(o2.push)&&(i2=await de(e,{code:o2},r2)));break;case t_Commands.Globals:(0,import_core9.isObject)(o2)&&(e.globals=(0,import_core8.assign)(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:(0,import_core8.isString)(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=(0,import_core4.isArray)(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,ue(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.count=0,e.group=(0,import_core8.getId)(),e.timing=Date.now(),n2&&(n2.consent&&(e.consent=(0,import_core8.assign)(e.consent,n2.consent)),n2.user&&(e.user=(0,import_core8.assign)(e.user,n2.user)),n2.globals&&(e.globals=(0,import_core8.assign)(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=(0,import_core8.assign)(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await ge(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await xe(e2.sources,"source",n3),await xe(e2.destinations,"destination",n3),await xe(e2.transformers,"transformer",n3),await xe(e2.stores,"store",n3)}(e);break;case t_Commands.User:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const t2 of Object.values(e.sources))t2.on&&!1===await(0,import_core5.tryCatchAsync)(t2.on)(n2,r2)&&(a2=!0);return Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});ce(e,o3,t2,n2,r2)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e2,n3){var _a,_b;for(const[t2,o3]of Object.entries(e2.pending.sources)){if(!e2.pending.sources[t2]||e2.sources[t2])continue;const s3=null==(_a=o3.config)?void 0:_a.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.sources[t2];const i3=await re(e2,t2,o3);i3&&(e2.sources[t2]=i3)}for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=null==(_b=o3.config)?void 0:_b.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=ye(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),ue(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await ge(e)),i2||he({ok:!0})}function qe(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");++e.count;const{timestamp:s2=Date.now(),group:r2=e.group,count:i2=e.count}=n2,{name:a2=`${t2} ${o2}`,data:c2={},context:u2={},globals:f2=e.globals,custom:l2={},user:d2=e.user,nested:g2=[],consent:m2=e.consent,id:p2=`${s2}-${r2}-${i2}`,trigger:h2="",entity:y2=t2,action:v2=o2,timing:b2=0,version:k2={source:e.version,tagging:e.config.tagging||0},source:w2={type:"collector",id:"",previous_id:""}}=n2;return{name:a2,data:c2,context:u2,globals:f2,custom:l2,user:d2,nested:g2,consent:m2,id:p2,trigger:h2,entity:y2,action:v2,timestamp:s2,timing:b2,group:r2,count:i2,version:k2,source:w2}}async function Te(e){var _a,_b;const n2=(0,import_core2.assign)({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),t2={level:null==(_a=e.logger)?void 0:_a.level,handler:null==(_b=e.logger)?void 0:_b.handler},o2=(0,import_core2.createLogger)(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,group:"",hooks:e.hooks||{},logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:e.user||{},version:"3.3.1",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return(0,import_core10.useHooks)(async(t2,o2={})=>await(0,import_core10.tryCatchAsync)(async()=>{var _a;const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,f2,l2):void 0,p2=null!=i2?i2:(0,import_core10.createIngest)(r2||"unknown");if(c2){const n3=await(0,import_core10.processEventMapping)(g2,c2,e);if(n3.ignore)return he({ok:!0});if(c2.consent&&!(0,import_core10.getGrantedConsent)(c2.consent,e.consent,n3.event.consent))return he({ok:!0});g2=n3.event}if((null==u2?void 0:u2.length)&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return he({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=qe(e,o4);return ge(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return null!=(_a=o3[0])?_a:he({ok:!0})}g2=t3.event}const h2=n2(g2),y2=qe(e,h2),v2=await ge(e,y2,{id:r2,ingest:p2,respond:d2},m2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},()=>he({ok:!1}))(),"Push",e.hooks)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e2})),a2.command=(e2=a2,n3=Ae,(0,import_core11.useHooks)(async(t3,o3,s3)=>await(0,import_core11.tryCatchAsync)(async()=>await n3(e2,t3,o3,s3),()=>he({ok:!1}))(),"Command",e2.hooks));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=(0,import_core12.useHooks)(f2,"StoreGet",e2.hooks),u2.set=(0,import_core12.useHooks)(l2,"StoreSet",e2.hooks),u2.delete=(0,import_core12.useHooks)(d2,"StoreDelete",e2.hooks),t3[o3]=u2}return t3}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),!a2.stores.__cache){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return a2.destinations=await async function(e,n2={}){var _a,_b;const t2={};for(const[o2,s2]of Object.entries(n2))(null==(_b=null==(_a=s2.config)?void 0:_a.require)?void 0:_b.length)?e.pending.destinations[o2]=s2:t2[o2]=ye(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:(0,import_core7.createIngest)(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Ge(e){e=e||{};const n2=await Te(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return he({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2;const s2=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const{config:n3={}}=s2;if(n3.require&&n3.require.length>0){e.pending.sources[o2]=s2;continue}const r2=await re(e,o2,s2);r2&&(t2[o2]=r2)}return t2}(n2,e.sources||{});Object.assign(n2.sources,s2);const{consent:r2,user:i2,globals:a2,custom:c2}=e;r2&&await n2.command("consent",r2),i2&&await n2.command("user",i2),a2&&Object.assign(n2.globals,a2),c2&&Object.assign(n2.custom,c2),n2.config.run&&await n2.command("run");let u2=t2.push;const f2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=f2.find(e2=>e2.config.primary);return l2?u2=l2.push:f2.length>0&&(u2=f2[0].push),{collector:n2,elb:u2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await Ge(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch(e){body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var sourceLambda=async context=>{var _a,_b,_c,_d;const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,userSettings=config.settings||{},settings={...userSettings,cors:null==(_a=userSettings.cors)||_a,timeout:null!=(_b=userSettings.timeout)?_b:3e4,enablePixelTracking:null==(_c=userSettings.enablePixelTracking)||_c,healthPath:null!=(_d=userSettings.healthPath)?_d:"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,context2)=>{var _a2;const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=(0,import_core13.requestToData)(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a2=env.logger)||_a2.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}},lambda_default=sourceLambda;//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/types.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["export * from './lambda';\nexport { default as sourceLambda } from './lambda';\n","import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\n\nexport * as SourceLambda from './types';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const userSettings = config.settings || {};\n const settings = {\n ...userSettings,\n cors: userSettings.cors ?? true,\n timeout: userSettings.timeout ?? 30000,\n enablePixelTracking: userSettings.enablePixelTracking ?? true,\n healthPath: userSettings.healthPath ?? '/health',\n };\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n // If body is not a valid object, push {} to let source.before transformers handle raw input via ingest\n if (!body || typeof body !== 'object') {\n await envPush({});\n return createResponse(\n 200,\n { success: true, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport type { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":"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","names":["import_core","push","trigger","k","v","push","context","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/types.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["export * from './lambda';\nexport { default as sourceLambda } from './lambda';\n","import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\n\nexport * as SourceLambda from './types';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const userSettings = config.settings || {};\n const settings = {\n ...userSettings,\n cors: userSettings.cors ?? true,\n timeout: userSettings.timeout ?? 30000,\n enablePixelTracking: userSettings.enablePixelTracking ?? true,\n healthPath: userSettings.healthPath ?? '/health',\n };\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n // If body is not a valid object, push {} to let source.before transformers handle raw input via ingest\n if (!body || typeof body !== 'object') {\n await envPush({});\n return createResponse(\n 200,\n { success: true, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport type { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":"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","names":["import_core","push","trigger","k","v","push","context","_a"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},apiGatewayV1Post={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},lambdaGet={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};import{assign as o}from"@walkeros/core";import{assign as r,createLogger as i}from"@walkeros/core";import{assign as a,buildCacheContext as c,clone as u,compileCache as f,checkCache as l,storeCache as d,compileNext as g,createIngest as p,debounce as m,getId as h,getGrantedConsent as y,isDefined as v,isFunction as b,isObject as w,isRouteArray as k,processEventMapping as C,resolveNext as O,tryCatchAsync as j,useHooks as A}from"@walkeros/core";import{isArray as x}from"@walkeros/core";import{tryCatch as q,tryCatchAsync as S}from"@walkeros/core";import{createIngest as $,getMappingValue as D,tryCatchAsync as _,compileNext as I,resolveNext as P,isRouteArray as E,compileCache as M,checkCache as R,storeCache as H,applyUpdate as T,buildCacheContext as G}from"@walkeros/core";import{createIngest as N,isObject as B,tryCatchAsync as U,useHooks as F,compileNext as W,resolveNext as L,isRouteArray as V,compileCache as z,checkCache as J,storeCache as K,buildCacheContext as Q}from"@walkeros/core";import{assign as be,getId as we,isFunction as ke,isString as Ce}from"@walkeros/core";import{isObject as Oe}from"@walkeros/core";import{createIngest as Se,getGrantedConsent as $e,processEventMapping as De,tryCatchAsync as _e,useHooks as Ie}from"@walkeros/core";import{useHooks as Ee,tryCatchAsync as Me}from"@walkeros/core";import{useHooks as Re}from"@walkeros/core";var t_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){var _a;const n2={};for(const[t2,o2]of Object.entries(e)){const e2=null==(_a=o2.config)?void 0:_a.next;e2&&!V(e2)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:N(t2),config:n2.config,env:se(n2.config.env)};s2.debug("init");const i2=await F(n2.init,"TransformerInit",e.hooks)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:(null==i2?void 0:i2.env)||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...se(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await F(n2.push,"TransformerPush",e.hooks)(o2,c2);return a2.debug("push done"),u2}async function oe(e,n2,t2,o2,s2,r2,i2){var _a,_b,_c,_d,_e2,_f;i2&&(null==s2?void 0:s2._meta)&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await U(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{event:null,respond:c2};if(i2&&void 0!==(null==(_b=null==(_a=r3.config)?void 0:_a.chainMocks)?void 0:_b[i2])){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==(null==(_c=r3.config)?void 0:_c.mock)){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(null==(_d=r3.config)?void 0:_d.disabled)continue;const u2=null==(_e2=r3.config)?void 0:_e2.cache,f2=u2?z(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=Q(s2,a2),n3=J(f2,l2,e2,`t:${o3}`);if("HIT"===(null==n3?void 0:n3.status)&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===(null==n3?void 0:n3.status)&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!V(g2)?g2:L(W(g2),Q(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:null!=(_f=o4.respond)?_f:c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const p2=await U(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===p2)return{event:null,respond:c2};if(Array.isArray(p2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(p2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:N("unknown");if(t3.next){let s3=t3.next;if(V(t3.next)){const e2=W(t3.next);s3=L(e2,Q(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(p2&&"object"==typeof p2){const{event:t3,respond:o4,next:r4}=p2;if(o4&&(c2=o4),r4){let o5=r4;if(V(r4)){const e2=W(r4);if(o5=L(e2,Q(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&K(l2,d2.key,a2,d2.ttl),(!p2||"object"==typeof p2&&!p2.next)&&r3.config.next&&V(r3.config.next)){const t3=r3.config.next,o4=W(t3),u3=L(o4,Q(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&B(e)?e:{}}async function re(e,n2,t2){var _a;const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=$(n2);const d2=u2?M({...u2,full:null==(_a=u2.full)||_a}):void 0,g2=I(a2),p2=Array.isArray(a2)&&E(a2)||!g2?void 0:ee(P(g2),Y(e.transformers)),m2=I(c2),h2=Array.isArray(c2)&&E(c2)||!m2?void 0:ee(P(m2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),v2={push:async(t3,o3={})=>{let r3=t3;const i3=null!=h2?h2:m2?ee(P(m2,G(l2)),Y(e.transformers)):[];if(i3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,i3,r3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),r3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const e2=G(l2),o4=R(d2,t4,e2,`s:${n2}`);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&d2.full){let n3=o4.value;return o4.rule.update&&(n3=await T(n3,o4.rule.update,{...e2,cache:{status:"HIT"}})),null==f2||f2(n3),{ok:!0}}if("MISS"===o4.status&&d2.full&&f2){const n3=f2,s3=o4.rule.update,r4={...e2,cache:{status:"MISS"}};f2=e3=>{H(t4,o4.key,e3,o4.rule.ttl),s3?T(e3,s3,r4).then(e4=>n3(e4)):n3(e3)}}"MISS"!==o4.status||d2.full||H(t4,o4.key,!0,o4.rule.ttl)}}}const a3=null!=p2?p2:g2?ee(P(g2,G(l2)),Y(e.transformers)):[];return e.push(r3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:a3})},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},b2={collector:e,logger:y2,id:n2,config:s2,env:v2,setIngest:async t3=>{if(!s2.ingest)return void(l2=$(n2));const o3=await D(t3,s2.ingest,{collector:e}),r3=$(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await _(o2)(b2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return v2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function ce(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:ve(n2.env,n2.config.env)};q(n2.on)(o2,a2)}async function ue(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const t2 of Object.values(e.sources))t2.on&&!1===await S(t2.on)(n2,r2)&&(a2=!0);if(Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});ce(e,o3,t2,n2,r2)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e2,n3){var _a,_b;for(const[t2,o3]of Object.entries(e2.pending.sources)){if(!e2.pending.sources[t2]||e2.sources[t2])continue;const s3=null==(_a=o3.config)?void 0:_a.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.sources[t2];const i3=await re(e2,t2,o3);i3&&(e2.sources[t2]=i3)}for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=null==(_b=o3.config)?void 0:_b.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=he(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),!i2.length)return!a2;switch(n2){case t_Commands.Consent:!function(e2,n3,t2){const o3=t2||e2.consent;n3.forEach(n4=>{Object.keys(o3).filter(e3=>e3 in n4).forEach(t3=>{q(n4[t3])(e2,o3)})})}(e,i2,s2);break;case t_Commands.Ready:case t_Commands.Run:n3=i2,(e2=e).allowed&&n3.forEach(n4=>{q(n4)(e2)});break;case t_Commands.Session:!function(e2,n3){e2.session&&n3.forEach(n4=>{q(n4)(e2,e2.session)})}(e,i2);break;default:i2.forEach(n3=>{"function"==typeof n3&&q(n3)(e,r2)})}var e2,n3;return!a2}function fe(e,n2,t2,o2){if(!e)return[];if(n2){const e2=O(n2,c(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function le(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!b(o2.push))return me({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:ve(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=h(4)}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),de(e,void 0,{},{[d2]:l2})}async function de(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:m2}=e;if(!s2)return me({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{var _a,_b,_c;if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push(u(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:p("unknown");if(!h3.length&&!(null==(_a=s3.queueOn)?void 0:_a.length))return{id:o3,destination:s3,skipped:!0};if(!h3.length&&(null==(_b=s3.queueOn)?void 0:_b.length)){const n3=await j(ge)(e,s3,o3);return{id:o3,destination:s3,skipped:!n3}}const b3=[],w3=h3.filter(e2=>{const n3=y(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,b3.push(e2),!1)});if(s3.queuePush.push(...w3),!b3.length)return{id:o3,destination:s3,queue:h3};if(!await j(ge)(e,s3,o3))return{id:o3,destination:s3,queue:h3};let C2,O2;s3.dlq||(s3.dlq=[]);const A2=s3.config.before,x2=fe(A2,A2&&k(A2)?g(A2):void 0,e.transformers,v3),q2=s3.config.next,S2=q2&&k(q2)?g(q2):void 0,$2=null==(_c=s3.config)?void 0:_c.cache,D2=$2?f($2):void 0,_2=D2?X(D2,e):void 0;let I2=0;return await Promise.all(b3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(m2,n3.user),(null==D2?void 0:D2.full)&&_2){const e2=c(v3,n3),t3=l(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(x2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,x2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(D2&&!D2.full&&_2){const e2=c(v3,u2),t3=l(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let p2=!1;const h4=await j(pe,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,p2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,v3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&d(_2,r3.key,null==h4||h4,r3.ttl),void 0!==h4&&(O2=h4),!p2&&q2){void 0!==h4&&(v3._response=h4);const n4=fe(q2,S2,e.transformers,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,v3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),v2={},b2={},w2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,w2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?b2[n3.id]=t3:(v2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return me({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(b2).length&&{queued:b2},...Object.keys(w2).length&&{failed:w2}})}async function ge(e,n2,t2){var _a;if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:ve(n2.env,n2.config.env)};s2.debug("init");const i2=await A(n2.init,"DestinationInit",e.hooks)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},null==(_a=n2.queueOn)?void 0:_a.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)ce(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function pe(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await C(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...ve(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!(null==l2?void 0:l2.batch)||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await A(n2.push,"DestinationPush",e.hooks)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:m(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...ve(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),A(n2.pushBatch,"DestinationPushBatch",e.hooks)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),v(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function me(e){return{ok:!(null==e?void 0:e.failed),...e}}function he(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=ve(n2.env,o2);return{...n2,config:a2,env:c2}}function ve(e,n2){return e||n2?n2?e&&w(e)&&w(n2)?{...e,...n2}:n2:e:{}}async function je(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{var _a;const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:null!=(_a=o3.env)?_a:{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Ae(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:Oe(o2)&&(be(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if(Oe(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=o(e.consent,t2),{update:t2}}(e,o2);a2=n3,c2=!0}break;case t_Commands.Custom:Oe(o2)&&(e.custom=be(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:Oe(o2)&&("code"in o2&&Oe(o2.code)?i2=await le(e,o2,r2):ke(o2.push)&&(i2=await le(e,{code:o2},r2)));break;case t_Commands.Globals:Oe(o2)&&(e.globals=be(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:Ce(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=x(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,await ue(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.count=0,e.group=we(),e.timing=Date.now(),n2&&(n2.consent&&(e.consent=be(e.consent,n2.consent)),n2.user&&(e.user=be(e.user,n2.user)),n2.globals&&(e.globals=be(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=be(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await de(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await je(e2.sources,"source",n3),await je(e2.destinations,"destination",n3),await je(e2.transformers,"transformer",n3),await je(e2.stores,"store",n3)}(e);break;case t_Commands.User:Oe(o2)&&(be(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(await ue(e,n2,void 0,a2),i2=await de(e)),i2||me({ok:!0})}function xe(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");++e.count;const{timestamp:s2=Date.now(),group:r2=e.group,count:i2=e.count}=n2,{name:a2=`${t2} ${o2}`,data:c2={},context:u2={},globals:f2=e.globals,custom:l2={},user:d2=e.user,nested:g2=[],consent:p2=e.consent,id:m2=`${s2}-${r2}-${i2}`,trigger:h2="",entity:y2=t2,action:v2=o2,timing:b2=0,version:w2={source:e.version,tagging:e.config.tagging||0},source:k2={type:"collector",id:"",previous_id:""}}=n2;return{name:a2,data:c2,context:u2,globals:f2,custom:l2,user:d2,nested:g2,consent:p2,id:m2,trigger:h2,entity:y2,action:v2,timestamp:s2,timing:b2,group:r2,count:i2,version:w2,source:k2}}async function He(e){var _a,_b;const n2=r({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),t2={level:null==(_a=e.logger)?void 0:_a.level,handler:null==(_b=e.logger)?void 0:_b.handler},o2=i(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,group:"",hooks:e.hooks||{},logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:e.user||{},version:"3.2.0",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return Ie(async(t2,o2={})=>await _e(async()=>{var _a;const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const p2=f2||l2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,f2,l2):void 0,m2=null!=i2?i2:Se(r2||"unknown");if(c2){const n3=await De(g2,c2,e);if(n3.ignore)return me({ok:!0});if(c2.consent&&!$e(c2.consent,e.consent,n3.event.consent))return me({ok:!0});g2=n3.event}if((null==u2?void 0:u2.length)&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,m2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return me({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=xe(e,o4);return de(e,s3,{id:r2,ingest:m2,respond:d2},p2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return null!=(_a=o3[0])?_a:me({ok:!0})}g2=t3.event}const h2=n2(g2),y2=xe(e,h2),v2=await de(e,y2,{id:r2,ingest:m2,respond:d2},p2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},()=>me({ok:!1}))(),"Push",e.hooks)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e2})),a2.command=(n3=Ae,Ee(async(t3,o3,s3)=>await Me(async()=>await n3(e2,t3,o3,s3),()=>me({ok:!1}))(),"Command",(e2=a2).hooks));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=Re(f2,"StoreGet",e2.hooks),u2.set=Re(l2,"StoreSet",e2.hooks),u2.delete=Re(d2,"StoreDelete",e2.hooks),t3[o3]=u2}return t3}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),!a2.stores.__cache){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return a2.destinations=await async function(e,n2={}){var _a,_b;const t2={};for(const[o2,s2]of Object.entries(n2))(null==(_b=null==(_a=s2.config)?void 0:_a.require)?void 0:_b.length)?e.pending.destinations[o2]=s2:t2[o2]=he(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:N(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Te(e){e=e||{};const n2=await He(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return me({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2;const s2=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const{config:n3={}}=s2;if(n3.require&&n3.require.length>0){e.pending.sources[o2]=s2;continue}const r2=await re(e,o2,s2);r2&&(t2[o2]=r2)}return t2}(n2,e.sources||{});Object.assign(n2.sources,s2);const{consent:r2,user:i2,globals:a2,custom:c2}=e;r2&&await n2.command("consent",r2),i2&&await n2.command("user",i2),a2&&Object.assign(n2.globals,a2),c2&&Object.assign(n2.custom,c2),n2.config.run&&await n2.command("run");let u2=t2.push;const f2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=f2.find(e2=>e2.config.primary);return l2?u2=l2.push:f2.length>0&&(u2=f2[0].push),{collector:n2,elb:u2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await Te(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch(e){body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var lambda_default=async context=>{var _a,_b,_c,_d;const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,userSettings=config.settings||{},settings={...userSettings,cors:null==(_a=userSettings.cors)||_a,timeout:null!=(_b=userSettings.timeout)?_b:3e4,enablePixelTracking:null==(_c=userSettings.enablePixelTracking)||_c,healthPath:null!=(_d=userSettings.healthPath)?_d:"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,context2)=>{var _a2;const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a2=env.logger)||_a2.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};export{types_exports as SourceLambda,examples_exports as examples,lambda_default as sourceLambda};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},apiGatewayV1Post={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}},lambdaGet={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:{name:"page view",data:{title:"Home"},entity:"page",action:"view"}};import{assign as o}from"@walkeros/core";import{assign as r,createLogger as i}from"@walkeros/core";import{assign as a,buildCacheContext as c,clone as u,compileCache as f,checkCache as l,storeCache as d,compileNext as g,createIngest as m,debounce as p,getId as h,getGrantedConsent as y,isDefined as v,isFunction as b,isObject as k,isRouteArray as w,processEventMapping as C,resolveNext as O,tryCatchAsync as j,useHooks as x}from"@walkeros/core";import{isArray as A}from"@walkeros/core";import{tryCatch as q,tryCatchAsync as S}from"@walkeros/core";import{createIngest as $,getMappingValue as D,tryCatchAsync as _,compileNext as I,resolveNext as P,isRouteArray as E,compileCache as M,checkCache as R,storeCache as H,applyUpdate as T,buildCacheContext as G}from"@walkeros/core";import{createIngest as N,isObject as U,tryCatchAsync as B,useHooks as F,compileNext as W,resolveNext as z,isRouteArray as L,compileCache as V,checkCache as J,storeCache as K,buildCacheContext as Q}from"@walkeros/core";import{assign as ke,getId as we,isFunction as Ce,isString as Oe}from"@walkeros/core";import{isObject as je}from"@walkeros/core";import{createIngest as $e,getGrantedConsent as De,processEventMapping as _e,tryCatchAsync as Ie,useHooks as Pe}from"@walkeros/core";import{useHooks as Me,tryCatchAsync as Re}from"@walkeros/core";import{useHooks as He}from"@walkeros/core";var t_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){var _a;const n2={};for(const[t2,o2]of Object.entries(e)){const e2=null==(_a=o2.config)?void 0:_a.next;e2&&!L(e2)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:N(t2),config:n2.config,env:se(n2.config.env)};s2.debug("init");const i2=await F(n2.init,"TransformerInit",e.hooks)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:(null==i2?void 0:i2.env)||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...se(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await F(n2.push,"TransformerPush",e.hooks)(o2,c2);return a2.debug("push done"),u2}async function oe(e,n2,t2,o2,s2,r2,i2){var _a,_b,_c,_d,_e2,_f;i2&&(null==s2?void 0:s2._meta)&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await B(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{event:null,respond:c2};if(i2&&void 0!==(null==(_b=null==(_a=r3.config)?void 0:_a.chainMocks)?void 0:_b[i2])){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==(null==(_c=r3.config)?void 0:_c.mock)){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(null==(_d=r3.config)?void 0:_d.disabled)continue;const u2=null==(_e2=r3.config)?void 0:_e2.cache,f2=u2?V(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=Q(s2,a2),n3=J(f2,l2,e2,`t:${o3}`);if("HIT"===(null==n3?void 0:n3.status)&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===(null==n3?void 0:n3.status)&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!L(g2)?g2:z(W(g2),Q(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:null!=(_f=o4.respond)?_f:c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=await B(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:N("unknown");if(t3.next){let s3=t3.next;if(L(t3.next)){const e2=W(t3.next);s3=z(e2,Q(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){let o5=r4;if(L(r4)){const e2=W(r4);if(o5=z(e2,Q(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&K(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&L(r3.config.next)){const t3=r3.config.next,o4=W(t3),u3=z(o4,Q(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&U(e)?e:{}}async function re(e,n2,t2){var _a;const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=$(n2);const d2=u2?M({...u2,full:null==(_a=u2.full)||_a}):void 0,g2=I(a2),m2=Array.isArray(a2)&&E(a2)||!g2?void 0:ee(P(g2),Y(e.transformers)),p2=I(c2),h2=Array.isArray(c2)&&E(c2)||!p2?void 0:ee(P(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),v2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=null!=h2?h2:p2?ee(P(p2,G(l2)),Y(e.transformers)):[];if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const e2=G(l2),o4=R(d2,t4,e2,`s:${n2}`);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&d2.full){let n3=o4.value;return o4.rule.update&&(n3=await T(n3,o4.rule.update,{...e2,cache:{status:"HIT"}})),null==f2||f2(n3),{ok:!0}}if("MISS"===o4.status&&d2.full&&f2){const n3=f2,s3=o4.rule.update,i4={...e2,cache:{status:"MISS"}},a4=o4.key,c4=o4.rule.ttl;f2=e3=>{H(t4,a4,e3,c4),s3?r3=(async()=>{const t5=await T(e3,s3,i4);n3(t5)})():n3(e3)}}"MISS"!==o4.status||d2.full||H(t4,o4.key,!0,o4.rule.ttl)}}}const c3=null!=m2?m2:g2?ee(P(g2,G(l2)),Y(e.transformers)):[],u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},b2={collector:e,logger:y2,id:n2,config:s2,env:v2,setIngest:async t3=>{if(!s2.ingest)return void(l2=$(n2));const o3=await D(t3,s2.ingest,{collector:e}),r3=$(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},k2=await _(o2)(b2);if(!k2)return;const w2=k2.type||"unknown",C2=e.logger.scope(w2).scope(n2);return v2.logger=C2,i2&&(k2.config={...k2.config,primary:i2}),k2}function ce(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:be(n2.env,n2.config.env)};q(n2.on)(o2,a2)}function ue(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,t2){const o3=t2||e2.consent;n3.forEach(n4=>{Object.keys(o3).filter(e3=>e3 in n4).forEach(t3=>{q(n4[t3])(e2,o3)})})}(e,o2,s2);break;case t_Commands.Ready:case t_Commands.Run:n3=o2,(e2=e).allowed&&n3.forEach(n4=>{q(n4)(e2)});break;case t_Commands.Session:!function(e2,n3){e2.session&&n3.forEach(n4=>{q(n4)(e2,e2.session)})}(e,o2);break;default:o2.forEach(n3=>{"function"==typeof n3&&q(n3)(e,r2)})}var e2,n3}function le(e,n2,t2,o2){if(!e)return[];if(n2){const e2=O(n2,c(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function de(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!b(o2.push))return he({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:be(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=h(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),ge(e,void 0,{},{[d2]:l2})}async function ge(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return he({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{var _a,_b,_c;if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push(u(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:m("unknown");if(!h3.length&&!(null==(_a=s3.queueOn)?void 0:_a.length))return{id:o3,destination:s3,skipped:!0};if(!h3.length&&(null==(_b=s3.queueOn)?void 0:_b.length)){const n3=await j(me)(e,s3,o3);return{id:o3,destination:s3,skipped:!n3}}const b3=[],k3=h3.filter(e2=>{const n3=y(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,b3.push(e2),!1)});if(s3.queuePush.push(...k3),!b3.length)return{id:o3,destination:s3,queue:h3};if(!await j(me)(e,s3,o3))return{id:o3,destination:s3,queue:h3};let C2,O2;s3.dlq||(s3.dlq=[]);const x2=s3.config.before,A2=le(x2,x2&&w(x2)?g(x2):void 0,e.transformers,v3),q2=s3.config.next,S2=q2&&w(q2)?g(q2):void 0,$2=null==(_c=s3.config)?void 0:_c.cache,D2=$2?f($2):void 0,_2=D2?X(D2,e):void 0;let I2=0;return await Promise.all(b3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(p2,n3.user),(null==D2?void 0:D2.full)&&_2){const e2=c(v3,n3),t3=l(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,A2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(D2&&!D2.full&&_2){const e2=c(v3,u2),t3=l(D2,_2,e2,`d:${o3}`);if("HIT"===(null==t3?void 0:t3.status))return n3;"MISS"===(null==t3?void 0:t3.status)&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const h4=await j(pe,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,v3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&d(_2,r3.key,null==h4||h4,r3.ttl),void 0!==h4&&(O2=h4),!m2&&q2){void 0!==h4&&(v3._response=h4);const n4=le(q2,S2,e.transformers,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,v3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),v2={},b2={},k2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,k2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?b2[n3.id]=t3:(v2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return he({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(b2).length&&{queued:b2},...Object.keys(k2).length&&{failed:k2}})}async function me(e,n2,t2){var _a;if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:be(n2.env,n2.config.env)};s2.debug("init");const i2=await x(n2.init,"DestinationInit",e.hooks)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},null==(_a=n2.queueOn)?void 0:_a.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)ce(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function pe(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await C(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...be(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!(null==l2?void 0:l2.batch)||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await x(n2.push,"DestinationPush",e.hooks)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:p(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...be(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),x(n2.pushBatch,"DestinationPushBatch",e.hooks)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),v(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function he(e){return{ok:!(null==e?void 0:e.failed),...e}}function ye(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=be(n2.env,o2);return{...n2,config:a2,env:c2}}function be(e,n2){return e||n2?n2?e&&k(e)&&k(n2)?{...e,...n2}:n2:e:{}}async function xe(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{var _a;const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:null!=(_a=o3.env)?_a:{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Ae(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:je(o2)&&(ke(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if(je(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=o(e.consent,t2),{update:t2}}(e,o2);a2=n3,c2=!0}break;case t_Commands.Custom:je(o2)&&(e.custom=ke(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:je(o2)&&("code"in o2&&je(o2.code)?i2=await de(e,o2,r2):Ce(o2.push)&&(i2=await de(e,{code:o2},r2)));break;case t_Commands.Globals:je(o2)&&(e.globals=ke(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:Oe(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=A(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,ue(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.count=0,e.group=we(),e.timing=Date.now(),n2&&(n2.consent&&(e.consent=ke(e.consent,n2.consent)),n2.user&&(e.user=ke(e.user,n2.user)),n2.globals&&(e.globals=ke(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=ke(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await ge(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await xe(e2.sources,"source",n3),await xe(e2.destinations,"destination",n3),await xe(e2.transformers,"transformer",n3),await xe(e2.stores,"store",n3)}(e);break;case t_Commands.User:je(o2)&&(ke(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const t2 of Object.values(e.sources))t2.on&&!1===await S(t2.on)(n2,r2)&&(a2=!0);return Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});ce(e,o3,t2,n2,r2)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e2,n3){var _a,_b;for(const[t2,o3]of Object.entries(e2.pending.sources)){if(!e2.pending.sources[t2]||e2.sources[t2])continue;const s3=null==(_a=o3.config)?void 0:_a.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.sources[t2];const i3=await re(e2,t2,o3);i3&&(e2.sources[t2]=i3)}for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=null==(_b=o3.config)?void 0:_b.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=ye(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),ue(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await ge(e)),i2||he({ok:!0})}function qe(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");++e.count;const{timestamp:s2=Date.now(),group:r2=e.group,count:i2=e.count}=n2,{name:a2=`${t2} ${o2}`,data:c2={},context:u2={},globals:f2=e.globals,custom:l2={},user:d2=e.user,nested:g2=[],consent:m2=e.consent,id:p2=`${s2}-${r2}-${i2}`,trigger:h2="",entity:y2=t2,action:v2=o2,timing:b2=0,version:k2={source:e.version,tagging:e.config.tagging||0},source:w2={type:"collector",id:"",previous_id:""}}=n2;return{name:a2,data:c2,context:u2,globals:f2,custom:l2,user:d2,nested:g2,consent:m2,id:p2,trigger:h2,entity:y2,action:v2,timestamp:s2,timing:b2,group:r2,count:i2,version:k2,source:w2}}async function Te(e){var _a,_b;const n2=r({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),t2={level:null==(_a=e.logger)?void 0:_a.level,handler:null==(_b=e.logger)?void 0:_b.handler},o2=i(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,group:"",hooks:e.hooks||{},logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:e.user||{},version:"3.3.1",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return Pe(async(t2,o2={})=>await Ie(async()=>{var _a;const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,f2,l2):void 0,p2=null!=i2?i2:$e(r2||"unknown");if(c2){const n3=await _e(g2,c2,e);if(n3.ignore)return he({ok:!0});if(c2.consent&&!De(c2.consent,e.consent,n3.event.consent))return he({ok:!0});g2=n3.event}if((null==u2?void 0:u2.length)&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return he({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=qe(e,o4);return ge(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return null!=(_a=o3[0])?_a:he({ok:!0})}g2=t3.event}const h2=n2(g2),y2=qe(e,h2),v2=await ge(e,y2,{id:r2,ingest:p2,respond:d2},m2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},()=>he({ok:!1}))(),"Push",e.hooks)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e2})),a2.command=(n3=Ae,Me(async(t3,o3,s3)=>await Re(async()=>await n3(e2,t3,o3,s3),()=>he({ok:!1}))(),"Command",(e2=a2).hooks));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=He(f2,"StoreGet",e2.hooks),u2.set=He(l2,"StoreSet",e2.hooks),u2.delete=He(d2,"StoreDelete",e2.hooks),t3[o3]=u2}return t3}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),!a2.stores.__cache){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return a2.destinations=await async function(e,n2={}){var _a,_b;const t2={};for(const[o2,s2]of Object.entries(n2))(null==(_b=null==(_a=s2.config)?void 0:_a.require)?void 0:_b.length)?e.pending.destinations[o2]=s2:t2[o2]=ye(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:N(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Ge(e){e=e||{};const n2=await Te(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return he({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2;const s2=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const{config:n3={}}=s2;if(n3.require&&n3.require.length>0){e.pending.sources[o2]=s2;continue}const r2=await re(e,o2,s2);r2&&(t2[o2]=r2)}return t2}(n2,e.sources||{});Object.assign(n2.sources,s2);const{consent:r2,user:i2,globals:a2,custom:c2}=e;r2&&await n2.command("consent",r2),i2&&await n2.command("user",i2),a2&&Object.assign(n2.globals,a2),c2&&Object.assign(n2.custom,c2),n2.config.run&&await n2.command("run");let u2=t2.push;const f2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=f2.find(e2=>e2.config.primary);return l2?u2=l2.push:f2.length>0&&(u2=f2[0].push),{collector:n2,elb:u2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await Ge(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch(e){body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var lambda_default=async context=>{var _a,_b,_c,_d;const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,userSettings=config.settings||{},settings={...userSettings,cors:null==(_a=userSettings.cors)||_a,timeout:null!=(_b=userSettings.timeout)?_b:3e4,enablePixelTracking:null==(_c=userSettings.enablePixelTracking)||_c,healthPath:null!=(_d=userSettings.healthPath)?_d:"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,context2)=>{var _a2;const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch(e){return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){var _a;try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:null==(_a=null==result?void 0:result.event)?void 0:_a.id}}catch(error){return null==logger||logger.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return null==(_a2=env.logger)||_a2.error("Lambda handler error",{error:error,requestId:requestId,method:null==parsed?void 0:parsed.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};export{types_exports as SourceLambda,examples_exports as examples,lambda_default as sourceLambda};//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/types.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\n\nexport * as SourceLambda from './types';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const userSettings = config.settings || {};\n const settings = {\n ...userSettings,\n cors: userSettings.cors ?? true,\n timeout: userSettings.timeout ?? 30000,\n enablePixelTracking: userSettings.enablePixelTracking ?? true,\n healthPath: userSettings.healthPath ?? '/health',\n };\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n // If body is not a valid object, push {} to let source.before transformers handle raw input via ingest\n if (!body || typeof body !== 'object') {\n await envPush({});\n return createResponse(\n 200,\n { success: true, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport type { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":"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","names":["push","trigger","k","v","push","context","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/types.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts"],"sourcesContent":["import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\n\nexport * as SourceLambda from './types';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const userSettings = config.settings || {};\n const settings = {\n ...userSettings,\n cors: userSettings.cors ?? true,\n timeout: userSettings.timeout ?? 30000,\n enablePixelTracking: userSettings.enablePixelTracking ?? true,\n healthPath: userSettings.healthPath ?? '/health',\n };\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n // If body is not a valid object, push {} to let source.before transformers handle raw input via ingest\n if (!body || typeof body !== 'object') {\n await envPush({});\n return createResponse(\n 200,\n { success: true, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport type { z } from '@walkeros/core/dev';\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\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 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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\n },\n};\n\nexport const lambdaGet: Flow.StepExample = {\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 name: 'page view',\n data: { title: 'Home' },\n entity: 'page',\n action: 'view',\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"],"mappings":"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","names":["push","trigger","k","v","push","context","_a"]}
|
package/dist/walkerOS.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/server-source-aws",
|
|
3
3
|
"description": "AWS server sources for walkerOS (Lambda, API Gateway, Function URLs)",
|
|
4
|
-
"version": "3.3.
|
|
4
|
+
"version": "3.3.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
"update": "npx npm-check-updates -u && npm update"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@walkeros/core": "3.3.
|
|
24
|
+
"@walkeros/core": "3.3.1"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
27
|
"@types/aws-lambda": "^8.10.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/aws-lambda": "^8.10.159",
|
|
31
|
-
"@walkeros/collector": "3.3.
|
|
31
|
+
"@walkeros/collector": "3.3.1"
|
|
32
32
|
},
|
|
33
33
|
"repository": {
|
|
34
34
|
"url": "git+https://github.com/elbwalker/walkerOS.git",
|