@walkeros/web-source-session 4.1.1-next-1779485810490 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,14 +1,15 @@
1
1
  # @walkeros/web-source-session
2
2
 
3
- ## 4.1.1-next-1779485810490
3
+ ## 4.1.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
7
  - Updated dependencies [b0279ee]
8
8
  - Updated dependencies [b0279ee]
9
+ - Updated dependencies [0b7f494]
9
10
  - Updated dependencies [edd3836]
10
- - @walkeros/core@4.1.1-next-1779485810490
11
- - @walkeros/web-core@4.1.1-next-1779485810490
11
+ - @walkeros/core@4.1.1
12
+ - @walkeros/web-core@4.1.1
12
13
 
13
14
  ## 4.1.0
14
15
 
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:()=>f,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,{SettingsSchema:()=>u,settings:()=>d});var c=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=l.z.object({storage:l.z.boolean().default(!1).describe("Enable persistent storage for session/device IDs").optional(),consent:l.z.union([l.z.string(),l.z.array(l.z.string())]).describe("Consent key(s) required to enable storage mode").optional(),length:l.z.number().default(30).describe("Session timeout in minutes").optional(),pulse:l.z.boolean().default(!1).describe("Keep session alive on each event").optional(),sessionKey:l.z.string().default("elbSessionId").describe("Storage key for session ID").optional(),sessionStorage:l.z.enum(["local","session"]).default("local").describe("Storage type for session").optional(),deviceKey:l.z.string().default("elbDeviceId").describe("Storage key for device ID").optional(),deviceStorage:l.z.enum(["local","session"]).default("local").describe("Storage type for device").optional(),deviceAge:l.z.number().default(30).describe("Device ID age in days").optional(),cb:l.z.any().describe("Custom session callback function or false to disable").optional(),clickIds:l.z.array(l.ClickIdEntrySchema).describe("Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.").optional()}),d=(0,c.zodToSchema)(u),f={};r(f,{createTrigger:()=>me,step:()=>g,trigger:()=>ye});var g={};r(g,{newMarketingSession:()=>p,returningVisitor:()=>h});var p={title:"New marketing session",description:"A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.",trigger:{type:"load",options:{url:"https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale"}},in:{storage:!0},out:[["elb","user",{session:"s3ss10n-id",device:"d3v1c3-id"}],["elb","session",{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}],["elb",{name:"session start",data:{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}}]]},h={title:"Returning visitor",description:"A returning visit with a google referrer reuses the stored device id and increments the session count.",trigger:{type:"load",options:{referrer:"https://google.com"}},in:{storage:!0},out:[["elb","user",{session:"n3w-s3ss10n",device:"d3v1c3-id"}],["elb","session",{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}],["elb",{name:"session start",data:{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}}]]},v=require("@walkeros/core"),m=require("@walkeros/core"),y=require("@walkeros/core"),b=require("@walkeros/core"),w=require("@walkeros/core"),k=require("@walkeros/core"),C=require("@walkeros/core"),q=require("@walkeros/core"),x=require("@walkeros/core"),O=require("@walkeros/core"),S=require("@walkeros/core"),j=require("@walkeros/core"),I=require("@walkeros/core"),A={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 $(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function D(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?n[o]={next:e}:n[o]={}}return n}function _(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 E(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 P(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,C.createIngest)(n),config:t.config,env:N(t.config.env)};s.debug("init");const i=await(0,C.useHooks)(t.init,"TransformerInit",e.hooks,e.logger)(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 M(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:{...N(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l=await(0,C.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),l}function z(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,C.createIngest)(t)}async function H(e,t,n,o,s,r,i){var a,c,l,u,d,f,g,p;s||(s=(0,C.createIngest)(null!=(a=n[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let h=o,v=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:v};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await(0,C.tryCatchAsync)(P,t=>{if(t instanceof C.FatalError)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:v};if(i&&void 0!==(null==(l=null==(c=r.config)?void 0:c.chainMocks)?void 0:l[i])){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),h=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),h=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(f=r.config)?void 0:f.cache,m=a?(0,C.compileCache)(a):void 0,y=m?$(m,e):void 0;let b;if(m&&y){const e=(0,C.buildCacheContext)(s,h),t=await(0,C.checkCache)(m,y,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(h=t.value,m.stop)return{event:h,respond:v,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(b={key:t.key,ttl:t.rule.ttl})}const w=r.config.before;if(w){const n=(0,C.getNextSteps)(w,(0,C.buildCacheContext)(s,h));if(1===n.length){const o=E(n[0],D(t));if(o.length>0){const n=await H(e,t,o,h,s,v,i);if(null===n.event)return{event:null,respond:null!=(g=n.respond)?g:v};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(p=n.respond)?p:v,stopped:!0};n.respond&&(v=n.respond),h=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>(0,C.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,E(n,D(t)),h,z(s,n),void 0,i)))}const k=await(0,C.tryCatchAsync)(M,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,h,s,v);if(!1===k)return{event:null,respond:v};if(Array.isArray(k)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(k.map(async n=>{const o=n.event||h,a=z(s,"unknown");if(n.next){const s=(0,C.getNextSteps)(n.next,(0,C.buildCacheContext)(a,o));if(0===s.length)return{event:o,respond:v};if(1===s.length){const n=E(s[0],D(t));return n.length>0?H(e,t,n,o,a,v,i):{event:o,respond:v}}return(await Promise.all(s.map(n=>(0,C.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,E(n,D(t)),o,z(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?H(e,t,r,o,a,v,i):{event:o,respond:v}}));let c=v;const l=[];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)?l.push(...t.event):l.push(t.event)}else l.push(e);return 0===l.length?{event:null,respond:c}:1===l.length?{event:l[0],respond:c}:{event:l,respond:c}}if(k&&"object"==typeof k){const{event:n,respond:o,next:r}=k;if(o&&(v=o),void 0!==r){const o=(0,C.getNextSteps)(r,(0,C.buildCacheContext)(s,h));if(0===o.length){n&&(h=n);continue}if(1===o.length){const a=E(o[0],D(t));return a.length>0?H(e,t,a,n||h,s,v,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:v})}return await Promise.all(o.map(o=>(0,C.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,E(o,D(t)),n||h,z(s,o),void 0,i))),{event:null,respond:void 0}}n&&(h=n)}b&&y&&(0,C.storeCache)(y,b.key,h,b.ttl);const q=r.config.next,x="string"==typeof q||Array.isArray(q)&&q.every(e=>"string"==typeof e),O=void 0!==q&&!x;if((!k||"object"==typeof k&&!k.next)&&O){const n=(0,C.getNextSteps)(r.config.next,(0,C.buildCacheContext)(s,h));if(1===n.length){const o=E(n[0],D(t));return o.length>0?H(e,t,o,h,s,v,i):{event:h,respond:v}}return n.length>1?(await Promise.all(n.map(n=>(0,C.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,E(n,D(t)),h,z(s,n),void 0,i))),{event:null,respond:void 0}):{event:h,respond:v}}}return{event:h,respond:v}}function N(e){return e&&(0,C.isObject)(e)?e:{}}function T(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function F(e,t,n){var o,s;if(!t.on||!(null==(o=t.queueOn)?void 0:o.length))return;const r=t.queueOn;t.queueOn=[];const i=n||(null==(s=t.config)?void 0:s.id)||"unknown";for(const{type:n,data:o}of r)await(0,k.tryCatchAsync)(t.on,t=>{if(t instanceof k.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o)}function K(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function R(e,t,n){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:l,cache:u}=n,d=u,f=d?(0,k.compileCache)({...d,stop:null==(o=d.stop)||o}):void 0,g=T(c)?E(c,D(e.transformers)):void 0,p=T(l)?E(l,D(e.transformers)):void 0,h=i.push,v=null!=h?h:e.push,m=Boolean(h),y=async(n,o,s)=>{var i;let a;const u=null!=p?p:void 0!==l?(()=>{const t=(0,k.getNextSteps)(l,(0,k.buildCacheContext)(s.ingest));return 0===t.length?[]:E(1===t.length?t[0]:t,D(e.transformers))})():[];let d=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await H(e,e.transformers,u,n,s.ingest,s.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(s.respond=o.respond),{ok:!0};o.respond&&(s.respond=o.respond),d=Array.isArray(o.event)?o.event:[o.event]}if(f){const t=$(f,e);if(t){const n=(0,k.buildCacheContext)(s.ingest),o=await(0,k.checkCache)(f,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&f.stop){let t=o.value;return o.rule.update&&(t=await(0,k.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(i=s.respond)||i.call(s,t),{ok:!0}}if("MISS"===o.status&&f.stop&&s.respond){const r=s.respond,i=o.rule.update,c={...n,cache:{status:"MISS"}},l=o.key,u=o.rule.ttl,d=n=>{(0,k.storeCache)(t,l,n,u),i?a=(async()=>{const t=await(0,k.applyUpdate)(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||f.stop||(0,k.storeCache)(t,o.key,!0,o.rule.ttl)}}}const h=g?{kind:"single",preChain:g}:void 0!==c?(()=>{const t=(0,k.getNextSteps)(c,(0,k.buildCacheContext)(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:E(t[0],D(e.transformers))}:{kind:"many",branches:t.map(t=>E(t,D(e.transformers)))}})():{kind:"single",preChain:[]};let y={ok:!0};for(const n of d)"many"===h.kind?(await Promise.all(h.branches.map((i,a)=>(0,k.tryCatchAsync)(async()=>m?v(n):v(n,{...o,id:t,ingest:z(s.ingest,`${t}.${a}`),respond:void 0,mapping:r,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),y={ok:!0}):y=m?await v(n):await v(n,{...o,id:t,ingest:s.ingest,respond:s.respond,mapping:r,preChain:h.preChain});return a&&await a,y},b=async n=>{const o=(0,k.createIngest)(t);if(!r.ingest||void 0===n)return o;const s=await(0,k.getMappingValue)(n,r.ingest,{collector:e});return{...o,...s,_meta:o._meta}},w=e.logger.scope("source").scope(t),C={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:w,...i,push:async(e,n={})=>{const o={ingest:(0,k.createIngest)(t),respond:void 0};return y(e,n,o)}},q={collector:e,logger:w,id:t,config:r,env:C,withScope:async(e,t,n)=>{const o={ingest:await b(e),respond:t};return n({...C,push:(e,t={})=>y(e,t,o),ingest:o.ingest,respond:o.respond})}},x=await(0,k.tryCatchAsync)(s,n=>{if(n instanceof k.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(q);if(!x)return;const O=x.type||"unknown",S=e.logger.scope(O).scope(t);return C.logger=S,a&&(x.config={...x.config,primary:a}),x}function B(e,t,n,o){if(n instanceof b.FatalError)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function G(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function U(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:ce(t.env,t.config.env)};(0,w.tryCatch)(t.on,t=>B(e,"destination",t,{destId:n,type:o}))(o,a)}function W(e,t,n,o){let s;switch(t){case A.Consent:s=o||e.consent;break;case A.Session:s=e.session;break;case A.User:s=o||e.user;break;case A.Custom:s=o||e.custom;break;case A.Globals:s=o||e.globals;break;case A.Config:s=o||e.config;break;case A.Ready:case A.Run:default:s=void 0}if(n.length)switch(t){case A.Consent:!function(e,t,n){const o=n||e.consent,s=G(e,A.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{(0,w.tryCatch)(t[n],t=>B(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case A.Ready:!function(e,t){if(!e.allowed)return;const n=G(e,A.Ready);t.forEach(t=>{(0,w.tryCatch)(t,t=>B(e,"ready",t))(void 0,n)})}(e,n);break;case A.Run:!function(e,t){if(!e.allowed)return;const n=G(e,A.Run);t.forEach(t=>{(0,w.tryCatch)(t,t=>B(e,"run",t))(void 0,n)})}(e,n);break;case A.Session:!function(e,t){if(!e.session)return;const n=G(e,A.Session);t.forEach(t=>{(0,w.tryCatch)(t,t=>B(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=G(e,t);n.forEach(n=>{"function"==typeof n&&(0,w.tryCatch)(n,n=>B(e,"generic",n,{type:t}))(s,o)});break}}}function L(e,t,n,o){var s;if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(null!=(s=n.onOverflow)?s:"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const r=[];for(;e.length>=n.max;)r.push(e.shift());return e.push(t),r.length>0&&o&&o(r),{appended:!0,dropped:r.length}}var J=new WeakMap;function V(e,t,n,o){J.get(e)||(J.set(e,!0),t.warn(n,o))}function Y(e){J.delete(e)}var Q=Object.freeze({batched:!0});function X(e){return e===Q}function Z(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function ee(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function te(e,t,n,o){var s;e.dropped[t]||(e.dropped[t]={});const r=e.dropped[t];return r[n]=(null!=(s=r[n])?s:0)+o,r[n]}function ne(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return E(e,t);if("string"==typeof e)return E(e,t);const o=(0,y.getNextSteps)(e,(0,y.buildCacheContext)(n));return 0===o.length?[]:1===o.length?E(o[0],t):E(o,t)}async function oe(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:g}=e;if(!u)return ie({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=L(e.queue,t,{max:n});if(o.dropped>0){const t=te(e.status,(0,y.stepId)("collector"),"queue",o.dropped);V(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&Y(e.queue);e.status.in++}o||(o=e.destinations);const p=e.transformers?D(e.transformers):{},h=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let l=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&l.push((0,y.clone)(t));const u=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,y.createIngest)("unknown");if(!l.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!l.length&&(null==(i=s.queueOn)?void 0:i.length)){let t=!1;try{t=await se(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const h=[],v=l.filter(e=>{const t=(0,y.getGrantedConsent)(s.config.consent,d,e.consent);return!t||(e.consent=t,h.push(e),!1)});if(v.length>0){const t=s.queuePush,n=s.config.id||o,r={max:null!=(a=s.config.queueMax)?a:1e3};let i=0;for(const e of v)i+=L(t,e,r).dropped;if(i>0){ee(e,n);const o=te(e.status,(0,y.stepId)("destination",n),"queue",i);V(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&Y(t)}if(!h.length)return{id:o,destination:s,queue:l};let m,b,w=!1;try{w=await se(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!w)return{id:o,destination:s,queue:l};s.dlq||(s.dlq=[]);const k=ne(s.config.before,p,u),C=s.config.next,q=null==(c=s.config)?void 0:c.cache,x=q?(0,y.compileCache)(q):void 0,O=x?$(x,e):void 0;let S=0,j=0;return await Promise.all(h.map(async t=>{let r;if(t.globals=(0,y.assign)(f,t.globals),t.user=(0,y.assign)(g,t.user),(null==x?void 0:x.stop)&&O){const e=(0,y.buildCacheContext)(u,t),n=await(0,y.checkCache)(x,O,e);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 i=t,a=n.respond;if(k.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await H(e,e.transformers,k,t,u,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(a=s.respond),i=Array.isArray(s.event)?s.event[0]:s.event}if(x&&!x.stop&&O){const e=(0,y.buildCacheContext)(u,i),n=await(0,y.checkCache)(x,O,e);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 c=Date.now();let l=!1;const d=await(0,y.tryCatchAsync)(re,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),m=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=L(a,[i,t],u);if(d.dropped>0){ee(e,c);const t=te(e.status,(0,y.stepId)("destination",c),"dlq",d.dropped);V(a,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:u.max,droppedCount:t})}else a.length<u.max&&Y(a)})(e,s,o,i,u,a);if(S+=Date.now()-c,r&&O&&void 0===s.config.mock&&(0,y.storeCache)(O,r.key,null==d||d,r.ttl),void 0===d||X(d)||(b=d),X(d)&&j++,!l&&C){void 0!==d&&(u._response=d);const t=ne(C,p,u);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await H(e,e.transformers,t,i,u,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:m,response:b,totalDuration:S,batchedCount:j,allowedCount:h.length}})),v={},m={},b={};for(const t of h){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};ee(e,t.id);const u=e.status.destinations[t.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=n.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,b[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)m[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,s=null!=(l=t.allowedCount)?l:0;(Math.max(0,s-n)>0||0===s)&&(v[t.id]=o,u.count++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.out++)}}return ie({event:t,...Object.keys(v).length&&{done:v},...Object.keys(m).length&&{queued:m},...Object.keys(b).length&&{failed:b}})}async function se(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:ce(t.env,t.config.env)};r.debug("init");const a=await(0,y.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(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)U(e,t,n,s,r)}r.debug("init done")}return!0}async function re(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:g}=t,p=await(0,y.processEventMapping)(o,g,e);if(p.ignore)return!1;const h=t.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:n,config:g,data:p.data,rule:p.mapping,ingest:s,env:{...ce(t.env,g.env),...r?{respond:r}:{}}};if(void 0!==g.mock)return v.debug("mock",{event:p.event.name}),g.mock;const b=p.mapping,w=p.mappingKey||"* *";if((null==b?void 0:b.batch)&&t.pushBatch&&void 0===g.mock){if(t.batches=t.batches||{},!t.batches[w]){const o={key:w,entries:[],events:[],data:[]},s=Z(b.batch),r=Z(g.batch),f=null!=(a=null!=(i=s.wait)?i:r.wait)?a:3e4,p=null!=(l=null!=(c=s.size)?c:r.size)?l:1e3,h=null!=(d=null!=(u=s.age)?u:r.age)?d:3e4,m=ce(t.env,g.env),k=(0,y.debounce)(async()=>{var o;const s=t.batches[w].batched;if(0===s.entries.length)return;const r={key:s.key,entries:s.entries,events:s.events,data:s.data};s.entries=[],s.events=[],s.data=[];const i=r.entries[0],a={collector:e,logger:v,id:n,config:g,data:void 0,rule:i.rule,ingest:i.ingest,env:{...m,...i.respond?{respond:i.respond}:{}}};v.debug("push batch",{events:r.entries.length});const c=t.config.id||n,l=ee(e,c);let u=!0;await(0,y.tryCatchAsync)((0,y.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),n=>{var o;u=!1;const s=t.dlq=t.dlq||[],i={max:null!=(o=t.config.dlqMax)?o:100};let a=0;for(const e of r.entries)a+=L(s,[e.event,n],i).dropped;if(a>0){const t=te(e.status,(0,y.stepId)("destination",c),"dlq",a);V(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:i.max,droppedCount:t})}else s.length<i.max&&Y(s);l.failed+=r.entries.length,l.dlqSize=s.length,e.status.failed+=r.entries.length,v.error("Push batch failed",{error:n instanceof Error?n.message:String(n),entries:r.entries.length})})(r,a),v.debug("push batch done"),l.inFlightBatch=Math.max(0,(null!=(o=l.inFlightBatch)?o:0)-r.entries.length),u&&(l.count+=r.entries.length,l.lastAt=Date.now(),e.status.out+=r.entries.length)},{wait:f,size:p,age:h});t.batches[w]={batched:o,batchFn:()=>{k()},flush:async()=>{await k.flush()}}}const o=t.batches[w];o.batched.entries.push({event:p.event,ingest:s,respond:r,rule:b,data:p.data}),o.batched.events.push(p.event),(0,y.isDefined)(p.data)&&o.batched.data.push(p.data);const h=t.config.id||n,m=ee(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),Q}{v.debug("push",{event:p.event.name});const n=await(0,y.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(p.event,m);return v.debug("push done"),n}}function ie(e){return{ok:!(null==e?void 0:e.failed),...e}}function ae(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=_(e,"before"),{config:i}=_({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=ce(t.env,o);return{...t,config:a,env:c}}function ce(e,t){return e||t?t?e&&(0,y.isObject)(e)&&(0,y.isObject)(t)?{...e,...t}:t:e:{}}async function le(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 ue(e,t,n){let o,s,r=!1;switch(t){case A.Config:(0,x.isObject)(n)&&((0,q.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case A.Consent:if((0,x.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,v.assign)(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case A.Custom:(0,x.isObject)(n)&&(e.custom=(0,q.assign)(e.custom,n),s=n,r=!0);break;case A.Destination:(0,x.isObject)(n)&&"code"in n&&(0,x.isObject)(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!(0,y.isFunction)(n.push))return ie({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let l=r?{...c,before:r}:{...c};i&&(l={...l,next:i}),a&&(l={...l,cache:a});const u={...n,config:l,env:ce(n.env,s)};let d=u.config.id;if(!d)do{d=(0,y.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=u,!1!==u.config.queue&&(u.queuePush=[...e.queue]),oe(e,void 0,{},{[d]:u})}(e,n));break;case A.Globals:(0,x.isObject)(n)&&(e.globals=(0,q.assign)(e.globals,n),s=n,r=!0);break;case A.Hook:if((0,x.isObject)(n)&&(0,q.isString)(n.name)&&(0,q.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case A.On:if((0,x.isObject)(n)&&(0,q.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,b.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,W(e,t,r)}(e,t,o)}break;case A.Ready:r=!0;break;case A.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,q.assign)(e.consent,t.consent)),t.user&&(e.user=(0,q.assign)(e.user,t.user)),t.globals&&(e.globals=(0,q.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,q.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await oe(e)}(e,n),r=!0;break;case A.Session:r=!0;break;case A.Shutdown:await async function(e){const t=e.logger;await le(e.sources,"source",t),await le(e.destinations,"destination",t),await le(e.transformers,"transformer",t),await le(e.stores,"store",t)}(e);break;case A.User:(0,x.isObject)(n)&&((0,q.assign)(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;let i,a=n||[];switch(n||(a=e.on[t]||[]),t){case A.Consent:i=o||e.consent;break;case A.Session:i=e.session;break;case A.User:i=o||e.user;break;case A.Custom:i=o||e.custom;break;case A.Globals:i=o||e.globals;break;case A.Config:i=o||e.config;break;case A.Ready:case A.Run:default:i=void 0}let c=!1;for(const[n,o]of Object.entries(e.sources)){if(null==(s=o.config.require)?void 0:s.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(K(o)?!1===await(0,w.tryCatchAsync)(o.on,o=>B(e,"source",o,{sourceId:n,type:t}))(t,i)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:i})))}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:i});U(e,o,n,t,i)}});for(const[t,n]of Object.entries(e.sources))K(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await F(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){var n;for(const[o,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[o]||e.destinations[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.destinations[o];const a=ae(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[o]=a}}(e,t),W(e,t,a,o),!c}(e,t,void 0,s),o=await oe(e)),o||ie({ok:!0})}function de(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:l={},user:u=e.user,nested:d=[],consent:f=e.consent,id:g=(0,q.getSpanId)(),trigger:p="",entity:h=n,action:v=o,timing:m=0,source:y={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:l,user:u,nested:d,consent:f,id:g,trigger:p,entity:h,action:v,timestamp:s,timing:m,source:y}}function fe(e={}){var t,n,o;const s=null!=(t=e.maxEntries)?t:1e4,r=null!=(n=e.lowWaterMark)?n:.8,i=null!=(o=e.sweepIntervalMs)?o:6e4,a=Math.floor(s*r),c=new Map,l={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let u;return i>0&&(u=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of c)void 0!==o.expires&&o.expires<=e&&(c.delete(n),t++);l.evictions_ttl+=t},i),u&&"function"==typeof u.unref&&u.unref()),{type:"memory",config:{},get(e){const t=c.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(c.delete(e),l.evictions_ttl++,void l.misses++):(c.delete(e),c.set(e,t),l.hits++,t.value);l.misses++},set(e,t,n){const o=!c.has(e);o||c.delete(e),c.set(e,{value:t,expires:void 0!==n?Date.now()+n:void 0}),l.writes++,o&&l.populates++,c.size>s&&function(){if(c.size<=s)return;const e=c.size-a;let t=0;for(const n of c.keys()){if(t>=e)break;c.delete(n),t++}l.evictions_entries+=t}()},delete(e){c.delete(e)&&l.deletes++},get counters(){return{...l}},destroy(){void 0!==u&&(clearInterval(u),u=void 0),c.clear()}}}function ge(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i}=t,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=n.rules.map(e=>({match:e.match?(0,I.compileMatcher)(e.match):()=>!0,ttl:e.ttl})),l=e=>`${s}:${e}`;function u(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return c.find(e=>e.match(n))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(t){const n=l(t),s=await o.get(n);if(void 0!==s)return a.hits++,s;const r=d.get(n);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=u(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),a.populates++}catch(e){f("set",t,e)}return s}finally{d.delete(n)}})();return d.set(n,i),i},async set(t,n,s){a.writes++,await e.set(t,n,s);const r=u(t,n);if(r)try{await o.set(l(t),n,1e3*r.ttl)}catch(e){f("set",t,e)}},async delete(t){a.deletes++,await e.delete(t);try{await o.delete(l(t))}catch(e){f("delete",t,e)}}};function f(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function pe(e,t){const n=t.get,o=t.set,s=t.delete;t.get=(0,j.useHooks)(n,"StoreGet",e.hooks,e.logger),t.set=(0,j.useHooks)(o,"StoreSet",e.hooks,e.logger),t.delete=(0,j.useHooks)(s,"StoreDelete",e.hooks,e.logger)}async function he(e){var t,n;const o=(0,m.assign)({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},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,m.createLogger)(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,hooks:e.hooks||{},logger:r,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var c,l;a.push=function(e,t){return(0,O.useHooks)(async(n,o={})=>await(0,O.tryCatchAsync)(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:l,preChain:u,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,O.createIngest)(i||"unknown");if(l){const t=await(0,O.processEventMapping)(p,l,e);if(t.ignore)return ie({ok:!0});if(l.consent&&!(0,O.getGrantedConsent)(l.consent,e.consent,t.event.consent))return ie({ok:!0});p=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await H(e,e.transformers,u,p,v,g,i?`source.${i}.next`:void 0);if(null===n.event)return ie({ok:!0});if(n.stopped)return n.respond&&(g=n.respond),ie({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=de(e,o);return oe(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:ie({ok:!0})}p=n.event}const m=t(p),y=de(e,m),b=await oe(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},t=>{if(t instanceof O.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),ie({ok:!1})})(),"Push",e.hooks,e.logger)}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.1-next-1779485810490"},...e})),a.command=(c=a,l=ue,(0,S.useHooks)(async(e,t,n)=>await(0,S.tryCatchAsync)(async()=>await l(c,e,t,n),n=>{if(n instanceof S.FatalError)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),ie({ok:!1})})(),"Command",c.hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,t={}){var n;const o={};for(const[n,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:r,env:i},l=await t(c);o[n]=l}const s=t,r=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){var i;const a=t[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(s);for(const t of r){const r=s[t].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=fe()),i=o.__cache,a="__cache");const c=null!=(n=r.namespace)?n:t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${c}:" via ${a}`),o[t]=ge(o[t],{storeId:t,cacheConfig:r,cacheStore:i,namespace:c,logger:e.logger.scope("store-cache").scope(t)})}for(const[t,n]of Object.entries(o))"__cache"!==t&&pe(e,n);return o}(a,u),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)}}}(u,a.stores,e),a.stores.__cache||(a.stores.__cache=fe()),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]=ae(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){var n,o,s,r;const i={};for(const[a,c]of Object.entries(t)){const{code:t,env:l={}}=c,u=(0,C.validateStepEntry)(c,"Transformer");if(!u.ok){e.logger.warn(`Transformer ${a} invalid (${u.code}): ${u.reason}. Skipping.`);continue}const{config:d}=_(c,"before"),{config:f}=_({...c,config:d},"next"),g=Object.keys(l).length>0?{...f,env:l}:f,{cache:p}=c,h=p?{...g,cache:p}:g,v=e.logger.scope("transformer").scope(a),m={collector:e,logger:v,id:a,ingest:(0,C.createIngest)(a),config:h,env:l},y=null!=t?t:e=>{const t=c.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${a}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await(0,C.processEventMapping)(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},b=await y(m);void 0!==c.before&&void 0===(null==(n=b.config)?void 0:n.before)&&(b.config={...null!=(o=b.config)?o:{},before:c.before}),void 0!==c.next&&void 0===(null==(s=b.config)?void 0:s.next)&&(b.config={...null!=(r=b.config)?r:{},next:c.next}),i[a]=b}return i}(a,e.transformers||{}),a}async function ve(e){e=e||{};const t=await he(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return ie({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){var n;const o={};for(const[s,r]of Object.entries(t)){const t=await R(e,s,r);if(!t)continue;const i=null==(n=r.config)?void 0:n.require;t.config={...t.config,init:!1,...i?{require:[...i]}:{}},o[s]=t}Object.assign(e.sources,o);for(const t of Object.keys(o)){const n=e.sources[t];let o=!1;n.init&&await(0,k.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof k.FatalError)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,K(n)&&await F(e,n,t))}return o}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),u=l.find(e=>e.config.primary);return u?c=u.push:l.length>0&&(c=l[0].push),{collector:t,elb:c}}var me=async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var s,r,i,a,c,l,u,d,f;const g=o||{};if(g.url){const e=new URL(g.url);window.history.replaceState({},"",e.pathname+e.search)}if(g.referrer&&Object.defineProperty(document,"referrer",{value:g.referrer,configurable:!0}),g.sessionData){const e=g.sessionKey||"elbSessionId";localStorage.setItem(e,JSON.stringify(g.sessionData))}if(g.deviceId){const e=g.deviceKey||"elbDeviceId";localStorage.setItem(e,g.deviceId)}if(!t){const n=await ve({...e,run:null==(s=e.run)||s});t={collector:n.collector,elb:n.elb};const o=g.sessionKey||(null==(c=null==(a=null==(i=null==(r=e.sources)?void 0:r.session)?void 0:i.config)?void 0:a.settings)?void 0:c.sessionKey)||"elbSessionId",p=g.deviceKey||(null==(f=null==(d=null==(u=null==(l=e.sources)?void 0:l.session)?void 0:u.config)?void 0:d.settings)?void 0:f.deviceKey)||"elbDeviceId";localStorage.removeItem(o),localStorage.removeItem(p),g.sessionData&&localStorage.setItem(o,JSON.stringify(g.sessionData)),g.deviceId&&localStorage.setItem(p,g.deviceId),e.consent&&await t.collector.command("consent",e.consent)}}}},ye=(e,t)=>{if(!e||"object"!=typeof e)return;const n=e,o=t.localStorage;if(n.sessionData&&"object"==typeof n.sessionData){const e="string"==typeof n.sessionKey?n.sessionKey:"elbSessionId";o.setItem(e,JSON.stringify(n.sessionData))}if("string"==typeof n.deviceId){const e="string"==typeof n.deviceKey?n.deviceKey:"elbDeviceId";o.setItem(e,n.deviceId)}};//# 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:()=>p,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,{SettingsSchema:()=>u,settings:()=>d});var c=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=l.z.object({storage:l.z.boolean().default(!1).describe("Enable persistent storage for session/device IDs").optional(),consent:l.z.union([l.z.string(),l.z.array(l.z.string())]).describe("Consent key(s) required to enable storage mode").optional(),length:l.z.number().default(30).describe("Session timeout in minutes").optional(),pulse:l.z.boolean().default(!1).describe("Keep session alive on each event").optional(),sessionKey:l.z.string().default("elbSessionId").describe("Storage key for session ID").optional(),sessionStorage:l.z.enum(["local","session"]).default("local").describe("Storage type for session").optional(),deviceKey:l.z.string().default("elbDeviceId").describe("Storage key for device ID").optional(),deviceStorage:l.z.enum(["local","session"]).default("local").describe("Storage type for device").optional(),deviceAge:l.z.number().default(30).describe("Device ID age in days").optional(),cb:l.z.any().describe("Custom session callback function or false to disable").optional(),clickIds:l.z.array(l.ClickIdEntrySchema).describe("Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.").optional()}),d=(0,c.zodToSchema)(u),p={};r(p,{createTrigger:()=>ye,step:()=>f,trigger:()=>we});var f={};r(f,{newMarketingSession:()=>g,returningVisitor:()=>h});var g={title:"New marketing session",description:"A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.",trigger:{type:"load",options:{url:"https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale"}},in:{storage:!0},out:[["elb","user",{session:"s3ss10n-id",device:"d3v1c3-id"}],["elb","session",{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}],["elb",{name:"session start",data:{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}}]]},h={title:"Returning visitor",description:"A returning visit with a google referrer reuses the stored device id and increments the session count.",trigger:{type:"load",options:{referrer:"https://google.com"}},in:{storage:!0},out:[["elb","user",{session:"n3w-s3ss10n",device:"d3v1c3-id"}],["elb","session",{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}],["elb",{name:"session start",data:{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}}]]},m=require("@walkeros/core"),v=require("@walkeros/core"),y=require("@walkeros/core"),w=(require("@walkeros/core"),require("@walkeros/core")),b=require("@walkeros/core"),k=require("@walkeros/core"),I=require("@walkeros/core"),S=require("@walkeros/core"),C=require("@walkeros/core"),q=require("@walkeros/core"),x=require("@walkeros/core"),O=require("@walkeros/core"),j=require("@walkeros/core"),D={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 A(e,t){const n=e.status.startedAt;return{flowId:"default",stepId:t.stepId,stepType:t.stepType,phase:t.phase,eventId:t.eventId,timestamp:new Date(t.now).toISOString(),elapsedMs:t.now-n}}function E(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function $(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?n[o]={next:e}:n[o]={}}return n}function M(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 _(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 T(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,I.createIngest)(n),config:t.config,env:H(t.config.env)};s.debug("init");const i=await(0,I.useHooks)(t.init,"TransformerInit",e.hooks,e.logger)(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 P(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:{...H(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=A(e,{stepId:(0,I.stepId)("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});(0,I.emitStep)(e,d);try{const s=await(0,I.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=A(e,{stepId:(0,I.stepId)("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:r});return i.durationMs=r-u,i.outEvent=s,(0,I.emitStep)(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=A(e,{stepId:(0,I.stepId)("transformer",n),stepType:"transformer",phase:"error",eventId:l,now:o});throw s.durationMs=o-u,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,I.emitStep)(e,s),t}}function z(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,I.createIngest)(t)}async function K(e,t,n,o,s,r,i){var a,c,l,u,d,p,f,g;s||(s=(0,I.createIngest)(null!=(a=n[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let h=o,m=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:m};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await(0,I.tryCatchAsync)(T,t=>{if(t instanceof I.FatalError)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:m};if(i&&void 0!==(null==(l=null==(c=r.config)?void 0:c.chainMocks)?void 0:l[i])){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),h=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),h=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(p=r.config)?void 0:p.cache,v=a?(0,I.compileCache)(a):void 0,y=v?E(v,e):void 0;let w;if(v&&y){const e=(0,I.buildCacheContext)(s,h),t=await(0,I.checkCache)(v,y,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(h=t.value,v.stop)return{event:h,respond:m,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(w={key:t.key,ttl:t.rule.ttl})}const b=r.config.before;if(b){const n=(0,I.getNextSteps)(b,(0,I.buildCacheContext)(s,h));if(1===n.length){const o=_(n[0],$(t));if(o.length>0){const n=await K(e,t,o,h,s,m,i);if(null===n.event)return{event:null,respond:null!=(f=n.respond)?f:m};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(g=n.respond)?g:m,stopped:!0};n.respond&&(m=n.respond),h=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>(0,I.tryCatchAsync)(K,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,_(n,$(t)),h,z(s,n),void 0,i)))}const k=await(0,I.tryCatchAsync)(P,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,h,s,m);if(!1===k)return{event:null,respond:m};if(Array.isArray(k)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(k.map(async n=>{const o=n.event||h,a=z(s,"unknown");if(n.next){const s=(0,I.getNextSteps)(n.next,(0,I.buildCacheContext)(a,o));if(0===s.length)return{event:o,respond:m};if(1===s.length){const n=_(s[0],$(t));return n.length>0?K(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>(0,I.tryCatchAsync)(K,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,_(n,$(t)),o,z(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?K(e,t,r,o,a,m,i):{event:o,respond:m}}));let c=m;const l=[];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)?l.push(...t.event):l.push(t.event)}else l.push(e);return 0===l.length?{event:null,respond:c}:1===l.length?{event:l[0],respond:c}:{event:l,respond:c}}if(k&&"object"==typeof k){const{event:n,respond:o,next:r}=k;if(o&&(m=o),void 0!==r){const o=(0,I.getNextSteps)(r,(0,I.buildCacheContext)(s,h));if(0===o.length){n&&(h=n);continue}if(1===o.length){const a=_(o[0],$(t));return a.length>0?K(e,t,a,n||h,s,m,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:m})}return await Promise.all(o.map(o=>(0,I.tryCatchAsync)(K,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,_(o,$(t)),n||h,z(s,o),void 0,i))),{event:null,respond:void 0}}n&&(h=n)}w&&y&&(0,I.storeCache)(y,w.key,h,w.ttl);const S=r.config.next,C="string"==typeof S||Array.isArray(S)&&S.every(e=>"string"==typeof e),q=void 0!==S&&!C;if((!k||"object"==typeof k&&!k.next)&&q){const n=(0,I.getNextSteps)(r.config.next,(0,I.buildCacheContext)(s,h));if(1===n.length){const o=_(n[0],$(t));return o.length>0?K(e,t,o,h,s,m,i):{event:h,respond:m}}return n.length>1?(await Promise.all(n.map(n=>(0,I.tryCatchAsync)(K,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,_(n,$(t)),h,z(s,n),void 0,i))),{event:null,respond:void 0}):{event:h,respond:m}}}return{event:h,respond:m}}function H(e){return e&&(0,I.isObject)(e)?e:{}}function N(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function R(e,t,n){var o,s;if(!t.on||!(null==(o=t.queueOn)?void 0:o.length))return;const r=t.queueOn;t.queueOn=[];const i=n||(null==(s=t.config)?void 0:s.id)||"unknown";for(const{type:n,data:o}of r)await(0,k.tryCatchAsync)(t.on,t=>{if(t instanceof k.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o)}function F(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function B(e,t,n){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:l,cache:u}=n,d=u,p=d?(0,k.compileCache)({...d,stop:null==(o=d.stop)||o}):void 0,f=N(c)?_(c,$(e.transformers)):void 0,g=N(l)?_(l,$(e.transformers)):void 0,h=i.push,m=null!=h?h:e.push,v=Boolean(h),y=async(n,o,s)=>{var i;let a;const u=null!=g?g:void 0!==l?(()=>{const t=(0,k.getNextSteps)(l,(0,k.buildCacheContext)(s.ingest));return 0===t.length?[]:_(1===t.length?t[0]:t,$(e.transformers))})():[];let d=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await K(e,e.transformers,u,n,s.ingest,s.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(s.respond=o.respond),{ok:!0};o.respond&&(s.respond=o.respond),d=Array.isArray(o.event)?o.event:[o.event]}if(p){const t=E(p,e);if(t){const n=(0,k.buildCacheContext)(s.ingest),o=await(0,k.checkCache)(p,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&p.stop){let t=o.value;return o.rule.update&&(t=await(0,k.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(i=s.respond)||i.call(s,t),{ok:!0}}if("MISS"===o.status&&p.stop&&s.respond){const r=s.respond,i=o.rule.update,c={...n,cache:{status:"MISS"}},l=o.key,u=o.rule.ttl,d=n=>{(0,k.storeCache)(t,l,n,u),i?a=(async()=>{const t=await(0,k.applyUpdate)(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||p.stop||(0,k.storeCache)(t,o.key,!0,o.rule.ttl)}}}const h=f?{kind:"single",preChain:f}:void 0!==c?(()=>{const t=(0,k.getNextSteps)(c,(0,k.buildCacheContext)(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:_(t[0],$(e.transformers))}:{kind:"many",branches:t.map(t=>_(t,$(e.transformers)))}})():{kind:"single",preChain:[]};let y={ok:!0};for(const n of d)"many"===h.kind?(await Promise.all(h.branches.map((i,a)=>(0,k.tryCatchAsync)(async()=>v?m(n):m(n,{...o,id:t,ingest:z(s.ingest,`${t}.${a}`),respond:void 0,mapping:r,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),y={ok:!0}):y=v?await m(n):await m(n,{...o,id:t,ingest:s.ingest,respond:s.respond,mapping:r,preChain:h.preChain});return a&&await a,y},w=async n=>{const o=(0,k.createIngest)(t);if(!r.ingest||void 0===n)return o;const s=await(0,k.getMappingValue)(n,r.ingest,{collector:e});return{...o,...s,_meta:o._meta}},b=e.logger.scope("source").scope(t),I={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:b,...i,push:async(e,n={})=>{const o={ingest:(0,k.createIngest)(t),respond:void 0};return y(e,n,o)}},S={collector:e,logger:b,id:t,config:r,env:I,withScope:async(e,t,n)=>{const o={ingest:await w(e),respond:t};return n({...I,push:(e,t={})=>y(e,t,o),ingest:o.ingest,respond:o.respond})}},C=await(0,k.tryCatchAsync)(s,n=>{if(n instanceof k.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(S);if(!C)return;const q=C.type||"unknown",x=e.logger.scope(q).scope(t);return I.logger=x,a&&(C.config={...C.config,primary:a}),C}function G(e,t,n,o){if(n instanceof w.FatalError)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function U(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}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:le(t.env,t.config.env)};(0,b.tryCatch)(t.on,t=>G(e,"destination",t,{destId:n,type:o}))(o,a)}function L(e,t,n,o){let s;switch(t){case D.Consent:s=o||e.consent;break;case D.Session:s=e.session;break;case D.User:s=o||e.user;break;case D.Custom:s=o||e.custom;break;case D.Globals:s=o||e.globals;break;case D.Config:s=o||e.config;break;case D.Ready:case D.Run:default:s=void 0}if(n.length)switch(t){case D.Consent:!function(e,t,n){const o=n||e.consent,s=U(e,D.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{(0,b.tryCatch)(t[n],t=>G(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case D.Ready:!function(e,t){if(!e.allowed)return;const n=U(e,D.Ready);t.forEach(t=>{(0,b.tryCatch)(t,t=>G(e,"ready",t))(void 0,n)})}(e,n);break;case D.Run:!function(e,t){if(!e.allowed)return;const n=U(e,D.Run);t.forEach(t=>{(0,b.tryCatch)(t,t=>G(e,"run",t))(void 0,n)})}(e,n);break;case D.Session:!function(e,t){if(!e.session)return;const n=U(e,D.Session);t.forEach(t=>{(0,b.tryCatch)(t,t=>G(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=U(e,t);n.forEach(n=>{"function"==typeof n&&(0,b.tryCatch)(n,n=>G(e,"generic",n,{type:t}))(s,o)});break}}}function J(e,t,n,o){var s;if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(null!=(s=n.onOverflow)?s:"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const r=[];for(;e.length>=n.max;)r.push(e.shift());return e.push(t),r.length>0&&o&&o(r),{appended:!0,dropped:r.length}}var V=new WeakMap;function Y(e,t,n,o){V.get(e)||(V.set(e,!0),t.warn(n,o))}function Q(e){V.delete(e)}var X=Object.freeze({batched:!0});function Z(e){return e===X}function ee(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function te(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function ne(e,t,n,o){var s;e.dropped[t]||(e.dropped[t]={});const r=e.dropped[t];return r[n]=(null!=(s=r[n])?s:0)+o,r[n]}function oe(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return _(e,t);if("string"==typeof e)return _(e,t);const o=(0,y.getNextSteps)(e,(0,y.buildCacheContext)(n));return 0===o.length?[]:1===o.length?_(o[0],t):_(o,t)}async function se(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:p,user:f}=e;if(!u)return ae({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=J(e.queue,t,{max:n});if(o.dropped>0){const t=ne(e.status,(0,y.stepId)("collector"),"queue",o.dropped);Y(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&Q(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?$(e.transformers):{},h=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let l=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&l.push((0,y.clone)(t));const u=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,y.createIngest)("unknown");if(!l.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!l.length&&(null==(i=s.queueOn)?void 0:i.length)){let t=!1;try{t=await re(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const h=[],m=l.filter(t=>{const n=(0,y.getGrantedConsent)(s.config.consent,d,t.consent);if(n)return t.consent=n,h.push(t),!1;const r=A(e,{stepId:(0,y.stepId)("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return r.skipReason="consent",d&&(r.consent={...d}),s.config.consent&&(r.meta={required:{...s.config.consent}}),(0,y.emitStep)(e,r),!0});if(m.length>0){const t=s.queuePush,n=s.config.id||o,r={max:null!=(a=s.config.queueMax)?a:1e3};let i=0;for(const e of m)i+=J(t,e,r).dropped;if(i>0){te(e,n);const o=ne(e.status,(0,y.stepId)("destination",n),"queue",i);Y(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&Q(t)}if(!h.length)return{id:o,destination:s,queue:l};let v,w,b=!1;try{b=await re(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!b)return{id:o,destination:s,queue:l};s.dlq||(s.dlq=[]);const k=oe(s.config.before,g,u),I=s.config.next,S=null==(c=s.config)?void 0:c.cache,C=S?(0,y.compileCache)(S):void 0,q=C?E(C,e):void 0;let x=0,O=0;return await Promise.all(h.map(async t=>{let r;if(t.globals=(0,y.assign)(p,t.globals),t.user=(0,y.assign)(f,t.user),(null==C?void 0:C.stop)&&q){const e=(0,y.buildCacheContext)(u,t),n=await(0,y.checkCache)(C,q,e);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 i=t,a=n.respond;if(k.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await K(e,e.transformers,k,t,u,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(a=s.respond),i=Array.isArray(s.event)?s.event[0]:s.event}if(C&&!C.stop&&q){const e=(0,y.buildCacheContext)(u,i),n=await(0,y.checkCache)(C,q,e);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 c=Date.now();let l=!1;const d=await(0,y.tryCatchAsync)(ie,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),v=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=J(a,[i,t],u);if(d.dropped>0){te(e,c);const t=ne(e.status,(0,y.stepId)("destination",c),"dlq",d.dropped);Y(a,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:u.max,droppedCount:t})}else a.length<u.max&&Q(a)})(e,s,o,i,u,a);if(x+=Date.now()-c,r&&q&&void 0===s.config.mock&&(0,y.storeCache)(q,r.key,null==d||d,r.ttl),void 0===d||Z(d)||(w=d),Z(d)&&O++,!l&&I){void 0!==d&&(u._response=d);const t=oe(I,g,u);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await K(e,e.transformers,t,i,u,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:v,response:w,totalDuration:x,batchedCount:O,allowedCount:h.length}})),m={},v={},w={};for(const t of h){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};te(e,t.id);const u=e.status.destinations[t.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=n.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,w[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)v[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,s=null!=(l=t.allowedCount)?l:0;(Math.max(0,s-n)>0||0===s)&&(m[t.id]=o,u.count++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.out++)}}return ae({event:t,...Object.keys(m).length&&{done:m},...Object.keys(v).length&&{queued:v},...Object.keys(w).length&&{failed:w}})}async function re(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:le(t.env,t.config.env)};r.debug("init");const a=Date.now();let c;(0,y.emitStep)(e,A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await(0,y.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),s=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,y.emitStep)(e,s),t}if(!1===c)return c;if(t.config={...c||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 ie(e,t,n,o,s,r){var i,a,c,l,u,d,p;const{config:f}=t,g=await(0,y.processEventMapping)(o,f,e);if(g.ignore)return!1;const h=t.type||"unknown",m=e.logger.scope(h),v={collector:e,logger:m,id:n,config:f,data:g.data,rule:g.mapping,ingest:s,env:{...le(t.env,f.env),...r?{respond:r}:{}}};if(void 0!==f.mock)return m.debug("mock",{event:g.event.name}),f.mock;const w=g.mapping,b=g.mappingKey||"* *";if((null==w?void 0:w.batch)&&t.pushBatch&&void 0===f.mock){if(t.batches=t.batches||{},!t.batches[b]){const o={key:b,entries:[],events:[],data:[]},s=ee(w.batch),r=ee(f.batch),p=null!=(a=null!=(i=s.wait)?i:r.wait)?a:3e4,g=null!=(l=null!=(c=s.size)?c:r.size)?l:1e3,h=null!=(d=null!=(u=s.age)?u:r.age)?d:3e4,v=le(t.env,f.env),k=(0,y.debounce)(async()=>{var o;const s=t.batches[b].batched;if(0===s.entries.length)return;const r={key:s.key,entries:s.entries,events:s.events,data:s.data};s.entries=[],s.events=[],s.data=[];const i=r.entries[0],a={collector:e,logger:m,id:n,config:f,data:void 0,rule:i.rule,ingest:i.ingest,env:{...v,...i.respond?{respond:i.respond}:{}}};m.debug("push batch",{events:r.entries.length});const c=t.config.id||n,l=te(e,c),u=Date.now(),d=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"flush",eventId:"",now:u});d.batch={size:r.entries.length,index:0},(0,y.emitStep)(e,d);let p=!0;await(0,y.tryCatchAsync)((0,y.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),o=>{var s;p=!1;const i=Date.now(),a=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:i});a.durationMs=i-u,a.error=o instanceof Error?{name:o.name,message:o.message}:{message:String(o)},a.batch={size:r.entries.length,index:0},(0,y.emitStep)(e,a);const d=t.dlq=t.dlq||[],f={max:null!=(s=t.config.dlqMax)?s:100};let g=0;for(const e of r.entries)g+=J(d,[e.event,o],f).dropped;if(g>0){const t=ne(e.status,(0,y.stepId)("destination",c),"dlq",g);Y(d,m,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:f.max,droppedCount:t})}else d.length<f.max&&Q(d);l.failed+=r.entries.length,l.dlqSize=d.length,e.status.failed+=r.entries.length,m.error("Push batch failed",{error:o instanceof Error?o.message:String(o),entries:r.entries.length})})(r,a),m.debug("push batch done"),l.inFlightBatch=Math.max(0,(null!=(o=l.inFlightBatch)?o:0)-r.entries.length),p&&(l.count+=r.entries.length,l.lastAt=Date.now(),e.status.out+=r.entries.length)},{wait:p,size:g,age:h});t.batches[b]={batched:o,batchFn:()=>{k()},flush:async()=>{await k.flush()}}}const o=t.batches[b];o.batched.entries.push({event:g.event,ingest:s,respond:r,rule:w,data:g.data}),o.batched.events.push(g.event),(0,y.isDefined)(g.data)&&o.batched.data.push(g.data);const h=t.config.id||n,v=te(e,h);return v.inFlightBatch=(null!=(p=v.inFlightBatch)?p:0)+1,o.batchFn(),X}{m.debug("push",{event:g.event.name});const o="string"==typeof g.event.id?g.event.id:"",s=Date.now(),r=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"in",eventId:o,now:s});g.mappingKey&&(r.mappingKey=g.mappingKey),g.event.consent&&(r.consent={...g.event.consent}),(0,y.emitStep)(e,r);try{const r=await(0,y.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(g.event,v),i=Date.now(),a=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"out",eventId:o,now:i});return a.durationMs=i-s,a.outEvent=r,g.mappingKey&&(a.mappingKey=g.mappingKey),(0,y.emitStep)(e,a),m.debug("push done"),r}catch(t){const r=Date.now(),i=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:o,now:r});throw i.durationMs=r-s,i.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},g.mappingKey&&(i.mappingKey=g.mappingKey),(0,y.emitStep)(e,i),t}}}function ae(e){return{ok:!(null==e?void 0:e.failed),...e}}function ce(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=M(e,"before"),{config:i}=M({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=le(t.env,o);return{...t,config:a,env:c}}function le(e,t){return e||t?t?e&&(0,y.isObject)(e)&&(0,y.isObject)(t)?{...e,...t}:t:e:{}}async function ue(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 de(e,t,n){let o,s,r=!1;switch(t){case D.Config:(0,C.isObject)(n)&&((0,S.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case D.Consent:if((0,C.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,m.assign)(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case D.Custom:(0,C.isObject)(n)&&(e.custom=(0,S.assign)(e.custom,n),s=n,r=!0);break;case D.Destination:(0,C.isObject)(n)&&"code"in n&&(0,C.isObject)(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!(0,y.isFunction)(n.push))return ae({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let l=r?{...c,before:r}:{...c};i&&(l={...l,next:i}),a&&(l={...l,cache:a});const u={...n,config:l,env:le(n.env,s)};let d=u.config.id;if(!d)do{d=(0,y.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=u,!1!==u.config.queue&&(u.queuePush=[...e.queue]),se(e,void 0,{},{[d]:u})}(e,n));break;case D.Globals:(0,C.isObject)(n)&&(e.globals=(0,S.assign)(e.globals,n),s=n,r=!0);break;case D.Hook:if((0,C.isObject)(n)&&(0,S.isString)(n.name)&&(0,S.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case D.On:if((0,C.isObject)(n)&&(0,S.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,w.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,L(e,t,r)}(e,t,o)}break;case D.Ready:r=!0;break;case D.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,S.assign)(e.consent,t.consent)),t.user&&(e.user=(0,S.assign)(e.user,t.user)),t.globals&&(e.globals=(0,S.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,S.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await se(e)}(e,n),r=!0;break;case D.Session:r=!0;break;case D.Shutdown:await async function(e){const t=e.logger;await ue(e.sources,"source",t),await ue(e.destinations,"destination",t),await ue(e.transformers,"transformer",t),await ue(e.stores,"store",t)}(e);break;case D.User:(0,C.isObject)(n)&&((0,S.assign)(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;let i,a=n||[];switch(n||(a=e.on[t]||[]),t){case D.Consent:i=o||e.consent;break;case D.Session:i=e.session;break;case D.User:i=o||e.user;break;case D.Custom:i=o||e.custom;break;case D.Globals:i=o||e.globals;break;case D.Config:i=o||e.config;break;case D.Ready:case D.Run:default:i=void 0}let c=!1;for(const[n,o]of Object.entries(e.sources)){if(null==(s=o.config.require)?void 0:s.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(F(o)?!1===await(0,b.tryCatchAsync)(o.on,o=>G(e,"source",o,{sourceId:n,type:t}))(t,i)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:i})))}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:i});W(e,o,n,t,i)}});for(const[t,n]of Object.entries(e.sources))F(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await R(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){var n;for(const[o,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[o]||e.destinations[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.destinations[o];const a=ce(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[o]=a}}(e,t),L(e,t,a,o),!c}(e,t,void 0,s),o=await se(e)),o||ae({ok:!0})}function pe(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:l={},user:u=e.user,nested:d=[],consent:p=e.consent,id:f=(0,S.getSpanId)(),trigger:g="",entity:h=n,action:m=o,timing:v=0,source:y={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:l,user:u,nested:d,consent:p,id:f,trigger:g,entity:h,action:m,timestamp:s,timing:v,source:y}}function fe(e={}){var t,n,o;const s=null!=(t=e.maxEntries)?t:1e4,r=null!=(n=e.lowWaterMark)?n:.8,i=null!=(o=e.sweepIntervalMs)?o:6e4,a=Math.floor(s*r),c=new Map,l={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let u;return i>0&&(u=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of c)void 0!==o.expires&&o.expires<=e&&(c.delete(n),t++);l.evictions_ttl+=t},i),u&&"function"==typeof u.unref&&u.unref()),{type:"memory",config:{},get(e){const t=c.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(c.delete(e),l.evictions_ttl++,void l.misses++):(c.delete(e),c.set(e,t),l.hits++,t.value);l.misses++},set(e,t,n){const o=!c.has(e);o||c.delete(e),c.set(e,{value:t,expires:void 0!==n?Date.now()+n:void 0}),l.writes++,o&&l.populates++,c.size>s&&function(){if(c.size<=s)return;const e=c.size-a;let t=0;for(const n of c.keys()){if(t>=e)break;c.delete(n),t++}l.evictions_entries+=t}()},delete(e){c.delete(e)&&l.deletes++},get counters(){return{...l}},destroy(){void 0!==u&&(clearInterval(u),u=void 0),c.clear()}}}function ge(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=A(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},(0,j.emitStep)(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?(0,j.compileMatcher)(e.match):()=>!0,ttl:e.ttl})),d=e=>`${s}:${e}`;function p(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return u.find(e=>e.match(n))}const f=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...l}},async get(t){const n=d(t),s=await o.get(n);if(void 0!==s)return l.hits++,c(t,"hit"),s;const r=f.get(n);if(r)return l.inflight_dedups++,c(t,"hit"),r;l.misses++,c(t,"miss");const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=p(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),l.populates++}catch(e){g("set",t,e)}return s}finally{f.delete(n)}})();return f.set(n,i),i},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=p(t,n);if(r)try{await o.set(d(t),n,1e3*r.ttl)}catch(e){g("set",t,e)}},async delete(t){l.deletes++,await e.delete(t);try{await o.delete(d(t))}catch(e){g("delete",t,e)}}};function g(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function he(e,t,n){const o=`store.${n}`,s=(0,O.useHooks)(t.get,"StoreGet",e.hooks,e.logger),r=(0,O.useHooks)(t.set,"StoreSet",e.hooks,e.logger),i=(0,O.useHooks)(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=A(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});r.meta={op:"get",key:t},(0,O.emitStep)(e,r);try{const r=await s(t),i=Date.now(),a=A(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:i});return a.durationMs=i-n,a.meta={op:"get",key:t},(0,O.emitStep)(e,a),r}catch(s){const r=Date.now(),i=A(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"get",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},(0,O.emitStep)(e,i),s}},t.set=async(t,n,s)=>{const i=Date.now(),a=A(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:i});a.meta={op:"set",key:t},(0,O.emitStep)(e,a);try{await r(t,n,s);const a=Date.now(),c=A(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:a});c.durationMs=a-i,c.meta={op:"set",key:t},(0,O.emitStep)(e,c)}catch(n){const s=Date.now(),r=A(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:s});throw r.durationMs=s-i,r.meta={op:"set",key:t},r.error=n instanceof Error?{name:n.name,message:n.message}:{message:String(n)},(0,O.emitStep)(e,r),n}},t.delete=async t=>{const n=Date.now(),s=A(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});s.meta={op:"delete",key:t},(0,O.emitStep)(e,s);try{await i(t);const s=Date.now(),r=A(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:s});r.durationMs=s-n,r.meta={op:"delete",key:t},(0,O.emitStep)(e,r)}catch(s){const r=Date.now(),i=A(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"delete",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},(0,O.emitStep)(e,i),s}}}async function me(e){var t,n;const o=(0,v.assign)({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},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,v.createLogger)(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,hooks:e.hooks||{},observers:new Set,logger:r,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var c,l;a.push=function(e,t){const n=(0,q.useHooks)(async(n,o={})=>await(0,q.tryCatchAsync)(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:l,preChain:u,include:d,exclude:p}=o;let f=c,g=n;const h=d||p?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,p):void 0,m=null!=a?a:(0,q.createIngest)(i||"unknown");if(l){const t=await(0,q.processEventMapping)(g,l,e);if(t.ignore)return ae({ok:!0});if(l.consent&&!(0,q.getGrantedConsent)(l.consent,e.consent,t.event.consent))return ae({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await K(e,e.transformers,u,g,m,f,i?`source.${i}.next`:void 0);if(null===n.event)return ae({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),ae({ok:!0});if(n.respond&&(f=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=pe(e,o);return se(e,s,{id:i,ingest:m,respond:f},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:ae({ok:!0})}g=n.event}const v=t(g),y=pe(e,v),w=await se(e,y,{id:i,ingest:m,respond:f},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 w},t=>{if(t instanceof q.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),ae({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now();(0,q.emitStep)(e,A(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r}));try{const i=await n(t,o),a=Date.now(),c=A(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,(0,q.emitStep)(e,c),i}catch(t){const n=Date.now(),o=A(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:s,now:n});throw o.durationMs=n-r,o.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,q.emitStep)(e,o),t}}}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.1"},...e})),a.command=(c=a,l=de,(0,x.useHooks)(async(e,t,n)=>await(0,x.tryCatchAsync)(async()=>await l(c,e,t,n),n=>{if(n instanceof x.FatalError)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),ae({ok:!1})})(),"Command",c.hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,t={}){var n;const o={};for(const[n,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:r,env:i},l=await t(c);o[n]=l}const s=t,r=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){var i;const a=t[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(s);for(const t of r){const r=s[t].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=fe()),i=o.__cache,a="__cache");const c=null!=(n=r.namespace)?n:t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${c}:" via ${a}`),o[t]=ge(o[t],{storeId:t,cacheConfig:r,cacheStore:i,namespace:c,logger:e.logger.scope("store-cache").scope(t),collector:e})}for(const[t,n]of Object.entries(o))"__cache"!==t&&he(e,n,t);return o}(a,u),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)}}}(u,a.stores,e),a.stores.__cache||(a.stores.__cache=fe()),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]=ce(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){var n,o,s,r;const i={};for(const[a,c]of Object.entries(t)){const{code:t,env:l={}}=c,u=(0,I.validateStepEntry)(c,"Transformer");if(!u.ok){e.logger.warn(`Transformer ${a} invalid (${u.code}): ${u.reason}. Skipping.`);continue}const{config:d}=M(c,"before"),{config:p}=M({...c,config:d},"next"),f=Object.keys(l).length>0?{...p,env:l}:p,{cache:g}=c,h=g?{...f,cache:g}:f,m=e.logger.scope("transformer").scope(a),v={collector:e,logger:m,id:a,ingest:(0,I.createIngest)(a),config:h,env:l},y=null!=t?t:e=>{const t=c.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${a}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await(0,I.processEventMapping)(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},w=await y(v);void 0!==c.before&&void 0===(null==(n=w.config)?void 0:n.before)&&(w.config={...null!=(o=w.config)?o:{},before:c.before}),void 0!==c.next&&void 0===(null==(s=w.config)?void 0:s.next)&&(w.config={...null!=(r=w.config)?r:{},next:c.next}),i[a]=w}return i}(a,e.transformers||{}),a}async function ve(e){e=e||{};const t=await me(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return ae({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){var n;const o={};for(const[s,r]of Object.entries(t)){const t=await B(e,s,r);if(!t)continue;const i=null==(n=r.config)?void 0:n.require;t.config={...t.config,init:!1,...i?{require:[...i]}:{}},o[s]=t}Object.assign(e.sources,o);for(const t of Object.keys(o)){const n=e.sources[t];let o=!1;n.init&&await(0,k.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof k.FatalError)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,F(n)&&await R(e,n,t))}return o}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),u=l.find(e=>e.config.primary);return u?c=u.push:l.length>0&&(c=l[0].push),{collector:t,elb:c}}var ye=async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var s,r,i,a,c,l,u,d,p;const f=o||{};if(f.url){const e=new URL(f.url);window.history.replaceState({},"",e.pathname+e.search)}if(f.referrer&&Object.defineProperty(document,"referrer",{value:f.referrer,configurable:!0}),f.sessionData){const e=f.sessionKey||"elbSessionId";localStorage.setItem(e,JSON.stringify(f.sessionData))}if(f.deviceId){const e=f.deviceKey||"elbDeviceId";localStorage.setItem(e,f.deviceId)}if(!t){const n=await ve({...e,run:null==(s=e.run)||s});t={collector:n.collector,elb:n.elb};const o=f.sessionKey||(null==(c=null==(a=null==(i=null==(r=e.sources)?void 0:r.session)?void 0:i.config)?void 0:a.settings)?void 0:c.sessionKey)||"elbSessionId",g=f.deviceKey||(null==(p=null==(d=null==(u=null==(l=e.sources)?void 0:l.session)?void 0:u.config)?void 0:d.settings)?void 0:p.deviceKey)||"elbDeviceId";localStorage.removeItem(o),localStorage.removeItem(g),f.sessionData&&localStorage.setItem(o,JSON.stringify(f.sessionData)),f.deviceId&&localStorage.setItem(g,f.deviceId),e.consent&&await t.collector.command("consent",e.consent)}}}},we=(e,t)=>{if(!e||"object"!=typeof e)return;const n=e,o=t.localStorage;if(n.sessionData&&"object"==typeof n.sessionData){const e="string"==typeof n.sessionKey?n.sessionKey:"elbSessionId";o.setItem(e,JSON.stringify(n.sessionData))}if("string"==typeof n.deviceId){const e="string"==typeof n.deviceKey?n.deviceKey:"elbDeviceId";o.setItem(e,n.deviceId)}};//# sourceMappingURL=dev.js.map
package/dist/dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/examples/index.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z, ClickIdEntrySchema } from '@walkeros/core/dev';\n\n/**\n * Session source settings schema\n */\nexport const SettingsSchema = z.object({\n storage: z\n .boolean()\n .default(false)\n .describe('Enable persistent storage for session/device IDs')\n .optional(),\n\n consent: z\n .union([z.string(), z.array(z.string())])\n .describe('Consent key(s) required to enable storage mode')\n .optional(),\n\n length: z\n .number()\n .default(30)\n .describe('Session timeout in minutes')\n .optional(),\n\n pulse: z\n .boolean()\n .default(false)\n .describe('Keep session alive on each event')\n .optional(),\n\n sessionKey: z\n .string()\n .default('elbSessionId')\n .describe('Storage key for session ID')\n .optional(),\n\n sessionStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for session')\n .optional(),\n\n deviceKey: z\n .string()\n .default('elbDeviceId')\n .describe('Storage key for device ID')\n .optional(),\n\n deviceStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for device')\n .optional(),\n\n deviceAge: z\n .number()\n .default(30)\n .describe('Device ID age in days')\n .optional(),\n\n // Note: Using z.any() because z.custom() cannot be converted to JSON Schema\n // TypeScript types provide compile-time safety; runtime accepts function or false\n cb: z\n .any()\n .describe('Custom session callback function or false to disable')\n .optional(),\n\n clickIds: z\n .array(ClickIdEntrySchema)\n .describe(\n 'Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","export * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Session source emits three elb calls on start:\n * 1. command('user', { session, device? })\n * 2. command('session', <full session data>)\n * 3. push({ name: 'session start', data: <full session data> })\n */\n\nexport const newMarketingSession: Flow.StepExample = {\n title: 'New marketing session',\n description:\n 'A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.',\n trigger: {\n type: 'load',\n options: {\n url: 'https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 's3ss10n-id', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n },\n ],\n ],\n};\n\nexport const returningVisitor: Flow.StepExample = {\n title: 'Returning visitor',\n description:\n 'A returning visit with a google referrer reuses the stored device id and increments the session count.',\n trigger: {\n type: 'load',\n options: {\n referrer: 'https://google.com',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 'n3w-s3ss10n', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface SessionTriggerOptions {\n url?: string;\n referrer?: string;\n sessionData?: Record<string, unknown>;\n deviceId?: string;\n sessionKey?: string;\n deviceKey?: string;\n}\n\nconst createTrigger: Trigger.CreateFn<Record<string, unknown>, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Record<string, unknown>, void> =\n (type?: string, opts?: unknown) =>\n async (content: Record<string, unknown>) => {\n const options = (opts || {}) as SessionTriggerOptions;\n\n // Pre-init: seed world state before source reads it\n if (options.url) {\n const urlObj = new URL(options.url);\n window.history.replaceState({}, '', urlObj.pathname + urlObj.search);\n }\n if (options.referrer) {\n Object.defineProperty(document, 'referrer', {\n value: options.referrer,\n configurable: true,\n });\n }\n if (options.sessionData) {\n const key = options.sessionKey || 'elbSessionId';\n localStorage.setItem(key, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n const key = options.deviceKey || 'elbDeviceId';\n localStorage.setItem(key, options.deviceId);\n }\n\n // Lazy startFlow — session source fires events during init, but\n // collector.allowed is false until command('run'). The initial\n // session event is dropped. After startFlow, clear the session\n // data written by the dropped init, re-seed, and trigger a consent\n // update to cause session re-init with allowed=true.\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n\n // Clear session data written by the dropped init\n const sessionKey =\n options.sessionKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.sessionKey as string) ||\n 'elbSessionId';\n const deviceKey =\n options.deviceKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.deviceKey as string) ||\n 'elbDeviceId';\n localStorage.removeItem(sessionKey);\n localStorage.removeItem(deviceKey);\n\n // Re-seed localStorage if trigger options specified session data\n if (options.sessionData) {\n localStorage.setItem(sessionKey, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n localStorage.setItem(deviceKey, options.deviceId);\n }\n\n // Re-apply consent to trigger session source on('consent') handler.\n // Now allowed=true so the session start event reaches destinations.\n if (config.consent) {\n await flow.collector.command('consent', config.consent);\n }\n }\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Prepares localStorage with session/device data before source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n if (!input || typeof input !== 'object') return;\n const data = input as Record<string, unknown>;\n const storage = env.localStorage as Storage;\n\n if (data.sessionData && typeof data.sessionData === 'object') {\n const key =\n typeof data.sessionKey === 'string' ? data.sessionKey : 'elbSessionId';\n storage.setItem(key, JSON.stringify(data.sessionData));\n }\n\n if (typeof data.deviceId === 'string') {\n const key =\n typeof data.deviceKey === 'string' ? data.deviceKey : 'elbDeviceId';\n storage.setItem(key, data.deviceId);\n }\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["import_dev","trigger","_e"]}
1
+ {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/examples/index.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z, ClickIdEntrySchema } from '@walkeros/core/dev';\n\n/**\n * Session source settings schema\n */\nexport const SettingsSchema = z.object({\n storage: z\n .boolean()\n .default(false)\n .describe('Enable persistent storage for session/device IDs')\n .optional(),\n\n consent: z\n .union([z.string(), z.array(z.string())])\n .describe('Consent key(s) required to enable storage mode')\n .optional(),\n\n length: z\n .number()\n .default(30)\n .describe('Session timeout in minutes')\n .optional(),\n\n pulse: z\n .boolean()\n .default(false)\n .describe('Keep session alive on each event')\n .optional(),\n\n sessionKey: z\n .string()\n .default('elbSessionId')\n .describe('Storage key for session ID')\n .optional(),\n\n sessionStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for session')\n .optional(),\n\n deviceKey: z\n .string()\n .default('elbDeviceId')\n .describe('Storage key for device ID')\n .optional(),\n\n deviceStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for device')\n .optional(),\n\n deviceAge: z\n .number()\n .default(30)\n .describe('Device ID age in days')\n .optional(),\n\n // Note: Using z.any() because z.custom() cannot be converted to JSON Schema\n // TypeScript types provide compile-time safety; runtime accepts function or false\n cb: z\n .any()\n .describe('Custom session callback function or false to disable')\n .optional(),\n\n clickIds: z\n .array(ClickIdEntrySchema)\n .describe(\n 'Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","export * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Session source emits three elb calls on start:\n * 1. command('user', { session, device? })\n * 2. command('session', <full session data>)\n * 3. push({ name: 'session start', data: <full session data> })\n */\n\nexport const newMarketingSession: Flow.StepExample = {\n title: 'New marketing session',\n description:\n 'A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.',\n trigger: {\n type: 'load',\n options: {\n url: 'https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 's3ss10n-id', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n },\n ],\n ],\n};\n\nexport const returningVisitor: Flow.StepExample = {\n title: 'Returning visitor',\n description:\n 'A returning visit with a google referrer reuses the stored device id and increments the session count.',\n trigger: {\n type: 'load',\n options: {\n referrer: 'https://google.com',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 'n3w-s3ss10n', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface SessionTriggerOptions {\n url?: string;\n referrer?: string;\n sessionData?: Record<string, unknown>;\n deviceId?: string;\n sessionKey?: string;\n deviceKey?: string;\n}\n\nconst createTrigger: Trigger.CreateFn<Record<string, unknown>, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Record<string, unknown>, void> =\n (type?: string, opts?: unknown) =>\n async (content: Record<string, unknown>) => {\n const options = (opts || {}) as SessionTriggerOptions;\n\n // Pre-init: seed world state before source reads it\n if (options.url) {\n const urlObj = new URL(options.url);\n window.history.replaceState({}, '', urlObj.pathname + urlObj.search);\n }\n if (options.referrer) {\n Object.defineProperty(document, 'referrer', {\n value: options.referrer,\n configurable: true,\n });\n }\n if (options.sessionData) {\n const key = options.sessionKey || 'elbSessionId';\n localStorage.setItem(key, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n const key = options.deviceKey || 'elbDeviceId';\n localStorage.setItem(key, options.deviceId);\n }\n\n // Lazy startFlow — session source fires events during init, but\n // collector.allowed is false until command('run'). The initial\n // session event is dropped. After startFlow, clear the session\n // data written by the dropped init, re-seed, and trigger a consent\n // update to cause session re-init with allowed=true.\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n\n // Clear session data written by the dropped init\n const sessionKey =\n options.sessionKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.sessionKey as string) ||\n 'elbSessionId';\n const deviceKey =\n options.deviceKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.deviceKey as string) ||\n 'elbDeviceId';\n localStorage.removeItem(sessionKey);\n localStorage.removeItem(deviceKey);\n\n // Re-seed localStorage if trigger options specified session data\n if (options.sessionData) {\n localStorage.setItem(sessionKey, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n localStorage.setItem(deviceKey, options.deviceId);\n }\n\n // Re-apply consent to trigger session source on('consent') handler.\n // Now allowed=true so the session start event reaches destinations.\n if (config.consent) {\n await flow.collector.command('consent', config.consent);\n }\n }\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Prepares localStorage with session/device data before source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n if (!input || typeof input !== 'object') return;\n const data = input as Record<string, unknown>;\n const storage = env.localStorage as Storage;\n\n if (data.sessionData && typeof data.sessionData === 'object') {\n const key =\n typeof data.sessionKey === 'string' ? data.sessionKey : 'elbSessionId';\n storage.setItem(key, JSON.stringify(data.sessionData));\n }\n\n if (typeof data.deviceId === 'string') {\n const key =\n typeof data.deviceKey === 'string' ? data.deviceKey : 'elbDeviceId';\n storage.setItem(key, data.deviceId);\n }\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["import_dev","trigger","_e"]}
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,n=(n,t)=>{for(var o in t)e(n,o,{get:t[o],enumerable:!0})},t={};n(t,{SettingsSchema:()=>i,settings:()=>a});import{zodToSchema as o}from"@walkeros/core/dev";import{z as s,ClickIdEntrySchema as r}from"@walkeros/core/dev";var i=s.object({storage:s.boolean().default(!1).describe("Enable persistent storage for session/device IDs").optional(),consent:s.union([s.string(),s.array(s.string())]).describe("Consent key(s) required to enable storage mode").optional(),length:s.number().default(30).describe("Session timeout in minutes").optional(),pulse:s.boolean().default(!1).describe("Keep session alive on each event").optional(),sessionKey:s.string().default("elbSessionId").describe("Storage key for session ID").optional(),sessionStorage:s.enum(["local","session"]).default("local").describe("Storage type for session").optional(),deviceKey:s.string().default("elbDeviceId").describe("Storage key for device ID").optional(),deviceStorage:s.enum(["local","session"]).default("local").describe("Storage type for device").optional(),deviceAge:s.number().default(30).describe("Device ID age in days").optional(),cb:s.any().describe("Custom session callback function or false to disable").optional(),clickIds:s.array(r).describe("Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.").optional()}),a=o(i),c={};n(c,{createTrigger:()=>un,step:()=>l,trigger:()=>dn});var l={};n(l,{newMarketingSession:()=>u,returningVisitor:()=>d});var u={title:"New marketing session",description:"A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.",trigger:{type:"load",options:{url:"https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale"}},in:{storage:!0},out:[["elb","user",{session:"s3ss10n-id",device:"d3v1c3-id"}],["elb","session",{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}],["elb",{name:"session start",data:{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}}]]},d={title:"Returning visitor",description:"A returning visit with a google referrer reuses the stored device id and increments the session count.",trigger:{type:"load",options:{referrer:"https://google.com"}},in:{storage:!0},out:[["elb","user",{session:"n3w-s3ss10n",device:"d3v1c3-id"}],["elb","session",{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}],["elb",{name:"session start",data:{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}}]]};import{assign as f}from"@walkeros/core";import{assign as g,createLogger as p}from"@walkeros/core";import{assign as h,buildCacheContext as v,clone as m,compileCache as y,checkCache as b,storeCache as w,createIngest as k,debounce as S,getId as q,getGrantedConsent as x,getNextSteps as O,isDefined as C,isFunction as I,isObject as j,processEventMapping as A,stepId as $,tryCatchAsync as D,useHooks as _}from"@walkeros/core";import{isArray as E,FatalError as P}from"@walkeros/core";import{tryCatch as M,tryCatchAsync as z}from"@walkeros/core";import{createIngest as K,FatalError as R,getMappingValue as T,tryCatchAsync as F,getNextSteps as H,compileCache as N,checkCache as B,storeCache as G,applyUpdate as U,buildCacheContext as W}from"@walkeros/core";import{createIngest as L,FatalError as J,isObject as V,tryCatchAsync as Y,useHooks as Q,getNextSteps as X,compileCache as Z,checkCache as ee,storeCache as ne,buildCacheContext as te,validateStepEntry as oe,processEventMapping as se}from"@walkeros/core";import{assign as re,getSpanId as ie,isFunction as ae,isString as ce}from"@walkeros/core";import{isObject as le}from"@walkeros/core";import{createIngest as ue,FatalError as de,getGrantedConsent as fe,processEventMapping as ge,tryCatchAsync as pe,useHooks as he}from"@walkeros/core";import{FatalError as ve,useHooks as me,tryCatchAsync as ye}from"@walkeros/core";import{useHooks as be}from"@walkeros/core";import{compileMatcher as we}from"@walkeros/core";var ke={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,n){return e.storeId&&n.stores[e.storeId]?n.stores[e.storeId]:n.stores.__cache}function qe(e){var n;const t={};for(const[o,s]of Object.entries(e)){const e=null==(n=s.config)?void 0:n.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?t[o]={next:e}:t[o]={}}return t}function xe(e,n){const t=e.config||{},o=e[n];return void 0!==o?{config:{...t,[n]:o},chainValue:o}:{config:t,chainValue:void 0}}function Oe(e,n={}){if(!e)return[];if(Array.isArray(e))return e;const t=[],o=new Set;let s=e;for(;s&&n[s]&&!o.has(s);){o.add(s),t.push(s);const e=n[s].next;if(Array.isArray(e)){t.push(...e);break}s=e}return t}async function Ce(e,n,t){if(n.init&&!n.config.init){const o=n.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:t,ingest:L(t),config:n.config,env:$e(n.config.env)};s.debug("init");const i=await Q(n.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;n.config={...i||n.config,env:(null==i?void 0:i.env)||n.config.env,init:!0},s.debug("init done")}return!0}async function Ie(e,n,t,o,s,r){const i=n.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:t,ingest:s,config:n.config,env:{...$e(n.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l=await Q(n.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),l}function je(e,n){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:L(n)}async function Ae(e,n,t,o,s,r,i){var a,c,l,u,d,f,g,p;s||(s=L(null!=(a=t[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let h=o,v=r;for(const o of t){const r=n[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:v};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await Y(Ce,n=>{if(n instanceof J)throw n;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:n}),!1})(e,r,o))return{event:null,respond:v};if(i&&void 0!==(null==(l=null==(c=r.config)?void 0:c.chainMocks)?void 0:l[i])){const n=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),h=n;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),h=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(f=r.config)?void 0:f.cache,m=a?Z(a):void 0,y=m?Se(m,e):void 0;let b;if(m&&y){const e=te(s,h),n=await ee(m,y,e);if("HIT"===(null==n?void 0:n.status)&&n.value){if(h=n.value,m.stop)return{event:h,respond:v,stopped:!0};continue}"MISS"===(null==n?void 0:n.status)&&(b={key:n.key,ttl:n.rule.ttl})}const w=r.config.before;if(w){const t=X(w,te(s,h));if(1===t.length){const o=Oe(t[0],qe(n));if(o.length>0){const t=await Ae(e,n,o,h,s,v,i);if(null===t.event)return{event:null,respond:null!=(g=t.respond)?g:v};if(t.stopped)return{event:Array.isArray(t.event)?t.event[0]:t.event,respond:null!=(p=t.respond)?p:v,stopped:!0};t.respond&&(v=t.respond),h=Array.isArray(t.event)?t.event[0]:t.event}}else t.length>1&&await Promise.all(t.map(t=>Y(Ae,n=>(e.logger.scope("transformer:many").error(`many branch ${t} failed`,{error:n}),{event:null,respond:void 0}))(e,n,Oe(t,qe(n)),h,je(s,t),void 0,i)))}const k=await Y(Ie,n=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:n}),!1))(e,r,o,h,s,v);if(!1===k)return{event:null,respond:v};if(Array.isArray(k)){const r=t.slice(t.indexOf(o)+1),a=await Promise.all(k.map(async t=>{const o=t.event||h,a=je(s,"unknown");if(t.next){const s=X(t.next,te(a,o));if(0===s.length)return{event:o,respond:v};if(1===s.length){const t=Oe(s[0],qe(n));return t.length>0?Ae(e,n,t,o,a,v,i):{event:o,respond:v}}return(await Promise.all(s.map(t=>Y(Ae,n=>(e.logger.scope("transformer:many").error(`many branch ${t} failed`,{error:n}),{event:null,respond:void 0}))(e,n,Oe(t,qe(n)),o,je(a,t),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Ae(e,n,r,o,a,v,i):{event:o,respond:v}}));let c=v;const l=[];for(const e of a.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const n=e;if(n.respond&&(c=n.respond),null===n.event)continue;Array.isArray(n.event)?l.push(...n.event):l.push(n.event)}else l.push(e);return 0===l.length?{event:null,respond:c}:1===l.length?{event:l[0],respond:c}:{event:l,respond:c}}if(k&&"object"==typeof k){const{event:t,respond:o,next:r}=k;if(o&&(v=o),void 0!==r){const o=X(r,te(s,h));if(0===o.length){t&&(h=t);continue}if(1===o.length){const a=Oe(o[0],qe(n));return a.length>0?Ae(e,n,a,t||h,s,v,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:v})}return await Promise.all(o.map(o=>Y(Ae,n=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:n}),{event:null,respond:void 0}))(e,n,Oe(o,qe(n)),t||h,je(s,o),void 0,i))),{event:null,respond:void 0}}t&&(h=t)}b&&y&&ne(y,b.key,h,b.ttl);const S=r.config.next,q="string"==typeof S||Array.isArray(S)&&S.every(e=>"string"==typeof e),x=void 0!==S&&!q;if((!k||"object"==typeof k&&!k.next)&&x){const t=X(r.config.next,te(s,h));if(1===t.length){const o=Oe(t[0],qe(n));return o.length>0?Ae(e,n,o,h,s,v,i):{event:h,respond:v}}return t.length>1?(await Promise.all(t.map(t=>Y(Ae,n=>(e.logger.scope("transformer:many").error(`many branch ${t} failed`,{error:n}),{event:null,respond:void 0}))(e,n,Oe(t,qe(n)),h,je(s,t),void 0,i))),{event:null,respond:void 0}):{event:h,respond:v}}}return{event:h,respond:v}}function $e(e){return e&&V(e)?e:{}}function De(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function _e(e,n,t){var o,s;if(!n.on||!(null==(o=n.queueOn)?void 0:o.length))return;const r=n.queueOn;n.queueOn=[];const i=t||(null==(s=n.config)?void 0:s.id)||"unknown";for(const{type:t,data:o}of r)await F(n.on,n=>{if(n instanceof R)throw n;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:t,error:n})})(t,o)}function Ee(e){var n;return Boolean(e.config.init)&&!(null==(n=e.config.require)?void 0:n.length)}async function Pe(e,n,t){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:l,cache:u}=t,d=u,f=d?N({...d,stop:null==(o=d.stop)||o}):void 0,g=De(c)?Oe(c,qe(e.transformers)):void 0,p=De(l)?Oe(l,qe(e.transformers)):void 0,h=i.push,v=null!=h?h:e.push,m=Boolean(h),y=async(t,o,s)=>{var i;let a;const u=null!=p?p:void 0!==l?(()=>{const n=H(l,W(s.ingest));return 0===n.length?[]:Oe(1===n.length?n[0]:n,qe(e.transformers))})():[];let d=[t];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Ae(e,e.transformers,u,t,s.ingest,s.respond,`source.${n}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(s.respond=o.respond),{ok:!0};o.respond&&(s.respond=o.respond),d=Array.isArray(o.event)?o.event:[o.event]}if(f){const n=Se(f,e);if(n){const t=W(s.ingest),o=await B(f,n,t);if(o){if("HIT"===o.status&&void 0!==o.value&&f.stop){let n=o.value;return o.rule.update&&(n=await U(n,o.rule.update,{...t,cache:{status:"HIT"}},e)),null==(i=s.respond)||i.call(s,n),{ok:!0}}if("MISS"===o.status&&f.stop&&s.respond){const r=s.respond,i=o.rule.update,c={...t,cache:{status:"MISS"}},l=o.key,u=o.rule.ttl,d=t=>{G(n,l,t,u),i?a=(async()=>{const n=await U(t,i,c,e);r(n)})():r(t)};s.respond=d}"MISS"!==o.status||f.stop||G(n,o.key,!0,o.rule.ttl)}}}const h=g?{kind:"single",preChain:g}:void 0!==c?(()=>{const n=H(c,W(s.ingest));return 0===n.length?{kind:"single",preChain:[]}:1===n.length?{kind:"single",preChain:Oe(n[0],qe(e.transformers))}:{kind:"many",branches:n.map(n=>Oe(n,qe(e.transformers)))}})():{kind:"single",preChain:[]};let y={ok:!0};for(const t of d)"many"===h.kind?(await Promise.all(h.branches.map((i,a)=>F(async()=>m?v(t):v(t,{...o,id:n,ingest:je(s.ingest,`${n}.${a}`),respond:void 0,mapping:r,preChain:i}),n=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:n}),{ok:!0}))())),y={ok:!0}):y=m?await v(t):await v(t,{...o,id:n,ingest:s.ingest,respond:s.respond,mapping:r,preChain:h.preChain});return a&&await a,y},b=async t=>{const o=K(n);if(!r.ingest||void 0===t)return o;const s=await T(t,r.ingest,{collector:e});return{...o,...s,_meta:o._meta}},w=e.logger.scope("source").scope(n),k={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:w,...i,push:async(e,t={})=>{const o={ingest:K(n),respond:void 0};return y(e,t,o)}},S={collector:e,logger:w,id:n,config:r,env:k,withScope:async(e,n,t)=>{const o={ingest:await b(e),respond:n};return t({...k,push:(e,n={})=>y(e,n,o),ingest:o.ingest,respond:o.respond})}},q=await F(s,t=>{if(t instanceof R)throw t;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:n,error:t})})(S);if(!q)return;const x=q.type||"unknown",O=e.logger.scope(x).scope(n);return k.logger=O,a&&(q.config={...q.config,primary:a}),q}function Me(e,n,t,o){if(t instanceof P)throw t;e.logger.scope("on").error("on callback failed",{kind:n,...o,error:t})}function ze(e,n){return{collector:e,logger:e.logger.scope("on").scope(String(n))}}function Ke(e,n,t,o,s){if(!n.on)return;const r=n.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:t,config:n.config,data:s,env:en(n.env,n.config.env)};M(n.on,n=>Me(e,"destination",n,{destId:t,type:o}))(o,a)}function Re(e,n,t,o){let s;switch(n){case ke.Consent:s=o||e.consent;break;case ke.Session:s=e.session;break;case ke.User:s=o||e.user;break;case ke.Custom:s=o||e.custom;break;case ke.Globals:s=o||e.globals;break;case ke.Config:s=o||e.config;break;case ke.Ready:case ke.Run:default:s=void 0}if(t.length)switch(n){case ke.Consent:!function(e,n,t){const o=t||e.consent,s=ze(e,ke.Consent);n.forEach(n=>{Object.keys(o).filter(e=>e in n).forEach(t=>{M(n[t],n=>Me(e,"consent",n,{key:t}))(o,s)})})}(e,t,o);break;case ke.Ready:!function(e,n){if(!e.allowed)return;const t=ze(e,ke.Ready);n.forEach(n=>{M(n,n=>Me(e,"ready",n))(void 0,t)})}(e,t);break;case ke.Run:!function(e,n){if(!e.allowed)return;const t=ze(e,ke.Run);n.forEach(n=>{M(n,n=>Me(e,"run",n))(void 0,t)})}(e,t);break;case ke.Session:!function(e,n){if(!e.session)return;const t=ze(e,ke.Session);n.forEach(n=>{M(n,n=>Me(e,"session",n))(e.session,t)})}(e,t);break;default:{const o=ze(e,n);t.forEach(t=>{"function"==typeof t&&M(t,t=>Me(e,"generic",t,{type:n}))(s,o)});break}}}function Te(e,n,t,o){var s;if(!Number.isFinite(t.max)||t.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${t.max})`);if("dropNewest"===(null!=(s=t.onOverflow)?s:"dropOldest"))return e.length>=t.max?(o&&o([n]),{appended:!1,dropped:1}):(e.push(n),{appended:!0,dropped:0});const r=[];for(;e.length>=t.max;)r.push(e.shift());return e.push(n),r.length>0&&o&&o(r),{appended:!0,dropped:r.length}}var Fe=new WeakMap;function He(e,n,t,o){Fe.get(e)||(Fe.set(e,!0),n.warn(t,o))}function Ne(e){Fe.delete(e)}var Be=Object.freeze({batched:!0});function Ge(e){return e===Be}function Ue(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function We(e,n){return e.status.destinations[n]||(e.status.destinations[n]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[n]}function Le(e,n,t,o){var s;e.dropped[n]||(e.dropped[n]={});const r=e.dropped[n];return r[t]=(null!=(s=r[t])?s:0)+o,r[t]}function Je(e,n,t){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Oe(e,n);if("string"==typeof e)return Oe(e,n);const o=O(e,v(t));return 0===o.length?[]:1===o.length?Oe(o[0],n):Oe(o,n)}async function Ve(e,n,t={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:g}=e;if(!u)return Xe({ok:!1});if(n){const t=e.config.queueMax;if(void 0===t)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=Te(e.queue,n,{max:t});if(o.dropped>0){const n=Le(e.status,$("collector"),"queue",o.dropped);He(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:t,droppedCount:n})}else e.queue.length<t&&Ne(e.queue);e.status.in++}o||(o=e.destinations);const p=e.transformers?qe(e.transformers):{},S=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let l=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],n&&l.push(m(n));const u=t.ingest?{...t.ingest,_meta:{...t.ingest._meta,path:[...t.ingest._meta.path]}}:k("unknown");if(!l.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!l.length&&(null==(i=s.queueOn)?void 0:i.length)){let n=!1;try{n=await Ye(e,s,o)}catch(n){e.status.failed++;const t=s.type||"unknown";e.logger.scope(t).error("destination init failed",{error:n instanceof Error?n.message:String(n)})}return{id:o,destination:s,skipped:!n}}const S=[],q=l.filter(e=>{const n=x(s.config.consent,d,e.consent);return!n||(e.consent=n,S.push(e),!1)});if(q.length>0){const n=s.queuePush,t=s.config.id||o,r={max:null!=(a=s.config.queueMax)?a:1e3};let i=0;for(const e of q)i+=Te(n,e,r).dropped;if(i>0){We(e,t);const o=Le(e.status,$("destination",t),"queue",i);He(n,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:t,cap:r.max,droppedCount:o})}else n.length<r.max&&Ne(n)}if(!S.length)return{id:o,destination:s,queue:l};let O,C,I=!1;try{I=await Ye(e,s,o)}catch(n){e.status.failed++;const t=s.type||"unknown";e.logger.scope(t).error("destination init failed",{error:n instanceof Error?n.message:String(n)})}if(!I)return{id:o,destination:s,queue:l};s.dlq||(s.dlq=[]);const j=Je(s.config.before,p,u),A=s.config.next,_=null==(c=s.config)?void 0:c.cache,E=_?y(_):void 0,P=E?Se(E,e):void 0;let M=0,z=0;return await Promise.all(S.map(async n=>{let r;if(n.globals=h(f,n.globals),n.user=h(g,n.user),(null==E?void 0:E.stop)&&P){const e=v(u,n),t=await b(E,P,e);if("HIT"===(null==t?void 0:t.status))return n;"MISS"===(null==t?void 0:t.status)&&(r={key:t.key,ttl:t.rule.ttl})}let i=n,a=t.respond;if(j.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Ae(e,e.transformers,j,n,u,t.respond,`destination.${o}.before`);if(null===s.event)return n;s.respond&&(a=s.respond),i=Array.isArray(s.event)?s.event[0]:s.event}if(E&&!E.stop&&P){const e=v(u,i),t=await b(E,P,e);if("HIT"===(null==t?void 0:t.status))return n;"MISS"===(null==t?void 0:t.status)&&(r={key:t.key,ttl:t.rule.ttl})}const c=Date.now();let l=!1;const d=await D(Qe,n=>{var t;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:n,event:i.name}),O=n,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(t=s.config.dlqMax)?t:100},d=Te(a,[i,n],u);if(d.dropped>0){We(e,c);const n=Le(e.status,$("destination",c),"dlq",d.dropped);He(a,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:u.max,droppedCount:n})}else a.length<u.max&&Ne(a)})(e,s,o,i,u,a);if(M+=Date.now()-c,r&&P&&void 0===s.config.mock&&w(P,r.key,null==d||d,r.ttl),void 0===d||Ge(d)||(C=d),Ge(d)&&z++,!l&&A){void 0!==d&&(u._response=d);const n=Je(A,p,u);if(n.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t=await Ae(e,e.transformers,n,i,u,a,`destination.${o}.next`);t.respond&&(a=t.respond)}}return n})),{id:o,destination:s,error:O,response:C,totalDuration:M,batchedCount:z,allowedCount:S.length}})),q={},O={},C={};for(const n of S){if(n.skipped)continue;const t=n.destination,o={type:t.type||"unknown",data:n.response};We(e,n.id);const u=e.status.destinations[n.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=t.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=t.dlq)?void 0:i.length)?a:0,n.error)o.error=n.error,C[n.id]=o,u.failed++,u.lastAt=d,u.duration+=n.totalDuration||0,e.status.failed++;else if(n.queue&&n.queue.length)O[n.id]=o;else{const t=null!=(c=n.batchedCount)?c:0,s=null!=(l=n.allowedCount)?l:0;(Math.max(0,s-t)>0||0===s)&&(q[n.id]=o,u.count++,u.lastAt=d,u.duration+=n.totalDuration||0,e.status.out++)}}return Xe({event:n,...Object.keys(q).length&&{done:q},...Object.keys(O).length&&{queued:O},...Object.keys(C).length&&{failed:C}})}async function Ye(e,n,t){var o;if(n.init&&!n.config.init){const s=n.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:t,config:n.config,env:en(n.env,n.config.env)};r.debug("init");const a=await _(n.init,"DestinationInit",e.hooks,e.logger)(i);if(!1===a)return a;if(n.config={...a||n.config,init:!0},null==(o=n.queueOn)?void 0:o.length){const o=n.queueOn;n.queueOn=[];for(const{type:s,data:r}of o)Ke(e,n,t,s,r)}r.debug("init done")}return!0}async function Qe(e,n,t,o,s,r){var i,a,c,l,u,d,f;const{config:g}=n,p=await A(o,g,e);if(p.ignore)return!1;const h=n.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:t,config:g,data:p.data,rule:p.mapping,ingest:s,env:{...en(n.env,g.env),...r?{respond:r}:{}}};if(void 0!==g.mock)return v.debug("mock",{event:p.event.name}),g.mock;const y=p.mapping,b=p.mappingKey||"* *";if((null==y?void 0:y.batch)&&n.pushBatch&&void 0===g.mock){if(n.batches=n.batches||{},!n.batches[b]){const o={key:b,entries:[],events:[],data:[]},s=Ue(y.batch),r=Ue(g.batch),f=null!=(a=null!=(i=s.wait)?i:r.wait)?a:3e4,p=null!=(l=null!=(c=s.size)?c:r.size)?l:1e3,h=null!=(d=null!=(u=s.age)?u:r.age)?d:3e4,m=en(n.env,g.env),w=S(async()=>{var o;const s=n.batches[b].batched;if(0===s.entries.length)return;const r={key:s.key,entries:s.entries,events:s.events,data:s.data};s.entries=[],s.events=[],s.data=[];const i=r.entries[0],a={collector:e,logger:v,id:t,config:g,data:void 0,rule:i.rule,ingest:i.ingest,env:{...m,...i.respond?{respond:i.respond}:{}}};v.debug("push batch",{events:r.entries.length});const c=n.config.id||t,l=We(e,c);let u=!0;await D(_(n.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t=>{var o;u=!1;const s=n.dlq=n.dlq||[],i={max:null!=(o=n.config.dlqMax)?o:100};let a=0;for(const e of r.entries)a+=Te(s,[e.event,t],i).dropped;if(a>0){const n=Le(e.status,$("destination",c),"dlq",a);He(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:i.max,droppedCount:n})}else s.length<i.max&&Ne(s);l.failed+=r.entries.length,l.dlqSize=s.length,e.status.failed+=r.entries.length,v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:r.entries.length})})(r,a),v.debug("push batch done"),l.inFlightBatch=Math.max(0,(null!=(o=l.inFlightBatch)?o:0)-r.entries.length),u&&(l.count+=r.entries.length,l.lastAt=Date.now(),e.status.out+=r.entries.length)},{wait:f,size:p,age:h});n.batches[b]={batched:o,batchFn:()=>{w()},flush:async()=>{await w.flush()}}}const o=n.batches[b];o.batched.entries.push({event:p.event,ingest:s,respond:r,rule:y,data:p.data}),o.batched.events.push(p.event),C(p.data)&&o.batched.data.push(p.data);const h=n.config.id||t,m=We(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),Be}{v.debug("push",{event:p.event.name});const t=await _(n.push,"DestinationPush",e.hooks,e.logger)(p.event,m);return v.debug("push done"),t}}function Xe(e){return{ok:!(null==e?void 0:e.failed),...e}}function Ze(e){const{code:n,config:t={},env:o={},cache:s}=e,{config:r}=xe(e,"before"),{config:i}=xe({...e,config:r},"next"),a={...n.config,...t,...i};s&&(a.cache=s);const c=en(n.env,o);return{...n,config:a,env:c}}function en(e,n){return e||n?n?e&&j(e)&&j(n)?{...e,...n}:n:e:{}}async function nn(e,n,t){const o=Object.entries(e).map(async([e,o])=>{var s;const r=o.destroy;if(!r)return;const i=o.type||"unknown",a=t.scope(i),c={id:e,config:o.config,env:null!=(s=o.env)?s:{},logger:a};try{await Promise.race([r(c),new Promise((t,o)=>setTimeout(()=>o(new Error(`${n} '${e}' destroy timed out`)),5e3))])}catch(t){a.error(`${n} '${e}' destroy failed: ${t}`)}});await Promise.allSettled(o)}async function tn(e,n,t){let o,s,r=!1;switch(n){case ke.Config:le(t)&&(re(e.config,t,{shallow:!1}),s=t,r=!0);break;case ke.Consent:if(le(t)){const{update:n}=function(e,n){const t={};return Object.entries(n).forEach(([e,n])=>{t[e]=!!n}),e.consent=f(e.consent,t),{update:t}}(e,t);s=n,r=!0}break;case ke.Custom:le(t)&&(e.custom=re(e.custom,t),s=t,r=!0);break;case ke.Destination:le(t)&&"code"in t&&le(t.code)&&(o=await async function(e,n){const{code:t,config:o={},env:s={},before:r,next:i,cache:a}=n;if(!I(t.push))return Xe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let l=r?{...c,before:r}:{...c};i&&(l={...l,next:i}),a&&(l={...l,cache:a});const u={...t,config:l,env:en(t.env,s)};let d=u.config.id;if(!d)do{d=q(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=u,!1!==u.config.queue&&(u.queuePush=[...e.queue]),Ve(e,void 0,{},{[d]:u})}(e,t));break;case ke.Globals:le(t)&&(e.globals=re(e.globals,t),s=t,r=!0);break;case ke.Hook:if(le(t)&&ce(t.name)&&ae(t.fn)){const{name:n,fn:o}=t;e.hooks[n]=o,s=t,r=!0}break;case ke.On:if(le(t)&&ce(t.type)){const{type:n,rules:o}=t;await async function(e,n,t){const o=e.on,s=o[n]||[],r=E(t)?t:[t];r.forEach(e=>{s.push(e)}),o[n]=s,Re(e,n,r)}(e,n,o)}break;case ke.Ready:r=!0;break;case ke.Run:o=await async function(e,n){return e.allowed=!0,e.timing=Date.now(),n&&(n.consent&&(e.consent=re(e.consent,n.consent)),n.user&&(e.user=re(e.user,n.user)),n.globals&&(e.globals=re(e.config.globalsStatic||{},n.globals)),n.custom&&(e.custom=re(e.custom,n.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Ve(e)}(e,t),r=!0;break;case ke.Session:r=!0;break;case ke.Shutdown:await async function(e){const n=e.logger;await nn(e.sources,"source",n),await nn(e.destinations,"destination",n),await nn(e.transformers,"transformer",n),await nn(e.stores,"store",n)}(e);break;case ke.User:le(t)&&(re(e.user,t,{shallow:!1}),s=t,r=!0)}return r&&(await async function(e,n,t,o){var s,r;let i,a=t||[];switch(t||(a=e.on[n]||[]),n){case ke.Consent:i=o||e.consent;break;case ke.Session:i=e.session;break;case ke.User:i=o||e.user;break;case ke.Custom:i=o||e.custom;break;case ke.Globals:i=o||e.globals;break;case ke.Config:i=o||e.config;break;case ke.Ready:case ke.Run:default:i=void 0}let c=!1;for(const[t,o]of Object.entries(e.sources)){if(null==(s=o.config.require)?void 0:s.length){const e=o.config.require.indexOf(n);-1!==e&&o.config.require.splice(e,1)}o.on&&(Ee(o)?!1===await z(o.on,o=>Me(e,"source",o,{sourceId:t,type:n}))(n,i)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:n,data:i})))}Object.entries(e.destinations).forEach(([t,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:n,data:i});Ke(e,o,t,n,i)}});for(const[n,t]of Object.entries(e.sources))Ee(t)&&(null==(r=t.queueOn)?void 0:r.length)&&await _e(e,t,n);return Object.keys(e.pending.destinations).length>0&&await async function(e,n){var t;for(const[o,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[o]||e.destinations[o])continue;const r=null==(t=s.config)?void 0:t.require;if(!r)continue;const i=r.indexOf(n);if(-1===i)continue;if(r.splice(i,1),r.length>0)continue;delete e.pending.destinations[o];const a=Ze(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[o]=a}}(e,n),Re(e,n,a,o),!c}(e,n,void 0,s),o=await Ve(e)),o||Xe({ok:!0})}function on(e,n){if(!n.name)throw new Error("Event name is required");const[t,o]=n.name.split(" ");if(!t||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${t} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:l={},user:u=e.user,nested:d=[],consent:f=e.consent,id:g=ie(),trigger:p="",entity:h=t,action:v=o,timing:m=0,source:y={type:"collector",schema:"4"}}=n;return{name:r,data:i,context:a,globals:c,custom:l,user:u,nested:d,consent:f,id:g,trigger:p,entity:h,action:v,timestamp:s,timing:m,source:y}}function sn(e={}){var n,t,o;const s=null!=(n=e.maxEntries)?n:1e4,r=null!=(t=e.lowWaterMark)?t:.8,i=null!=(o=e.sweepIntervalMs)?o:6e4,a=Math.floor(s*r),c=new Map,l={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let u;return i>0&&(u=setInterval(function(){const e=Date.now();let n=0;for(const[t,o]of c)void 0!==o.expires&&o.expires<=e&&(c.delete(t),n++);l.evictions_ttl+=n},i),u&&"function"==typeof u.unref&&u.unref()),{type:"memory",config:{},get(e){const n=c.get(e);if(n)return void 0!==n.expires&&n.expires<=Date.now()?(c.delete(e),l.evictions_ttl++,void l.misses++):(c.delete(e),c.set(e,n),l.hits++,n.value);l.misses++},set(e,n,t){const o=!c.has(e);o||c.delete(e),c.set(e,{value:n,expires:void 0!==t?Date.now()+t:void 0}),l.writes++,o&&l.populates++,c.size>s&&function(){if(c.size<=s)return;const e=c.size-a;let n=0;for(const t of c.keys()){if(n>=e)break;c.delete(t),n++}l.evictions_entries+=n}()},delete(e){c.delete(e)&&l.deletes++},get counters(){return{...l}},destroy(){void 0!==u&&(clearInterval(u),u=void 0),c.clear()}}}function rn(e,n){const{cacheConfig:t,cacheStore:o,namespace:s,logger:r,storeId:i}=n,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=t.rules.map(e=>({match:e.match?we(e.match):()=>!0,ttl:e.ttl})),l=e=>`${s}:${e}`;function u(e,n){const t=void 0===n?{key:e}:{key:e,value:n};return c.find(e=>e.match(t))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(n){const t=l(n),s=await o.get(t);if(void 0!==s)return a.hits++,s;const r=d.get(t);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(n);if(void 0===s)return;const r=u(n,s);if(r)try{await o.set(t,s,1e3*r.ttl),a.populates++}catch(e){f("set",n,e)}return s}finally{d.delete(t)}})();return d.set(t,i),i},async set(n,t,s){a.writes++,await e.set(n,t,s);const r=u(n,t);if(r)try{await o.set(l(n),t,1e3*r.ttl)}catch(e){f("set",n,e)}},async delete(n){a.deletes++,await e.delete(n);try{await o.delete(l(n))}catch(e){f("delete",n,e)}}};function f(e,n,t){const o=`store-cache(${i}): cache ${e} failed for "${n}"; backing succeeded, continuing`;r?r.warn(o,{error:t}):console.warn(o,t)}}function an(e,n){const t=n.get,o=n.set,s=n.delete;n.get=be(t,"StoreGet",e.hooks,e.logger),n.set=be(o,"StoreSet",e.hooks,e.logger),n.delete=be(s,"StoreDelete",e.hooks,e.logger)}async function cn(e){var n,t;const o=g({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),s={level:null==(n=e.logger)?void 0:n.level,handler:null==(t=e.logger)?void 0:t.handler},r=p(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,hooks:e.hooks||{},logger:r,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var c,l;a.push=function(e,n){return he(async(t,o={})=>await pe(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:l,preChain:u,include:d,exclude:f}=o;let g=c,p=t;const h=d||f?function(e,n,t){let o=e;return n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>n.includes(e)))),t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!t.includes(e)))),o}(e.destinations,d,f):void 0,v=null!=a?a:ue(i||"unknown");if(l){const n=await ge(p,l,e);if(n.ignore)return Xe({ok:!0});if(l.consent&&!fe(l.consent,e.consent,n.event.consent))return Xe({ok:!0});p=n.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const t=await Ae(e,e.transformers,u,p,v,g,i?`source.${i}.next`:void 0);if(null===t.event)return Xe({ok:!0});if(t.stopped)return t.respond&&(g=t.respond),Xe({ok:!0});if(t.respond&&(g=t.respond),Array.isArray(t.event)){const o=await Promise.all(t.event.map(async t=>{const o=n(t),s=on(e,o);return Ve(e,s,{id:i,ingest:v,respond:g},h)}));if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const n=e.status.sources[i];n.count+=t.event.length,n.lastAt=Date.now(),n.duration+=Date.now()-r}return null!=(s=o[0])?s:Xe({ok:!0})}p=t.event}const m=n(p),y=on(e,m),b=await Ve(e,y,{id:i,ingest:v,respond:g},h);if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const n=e.status.sources[i];n.count++,n.lastAt=Date.now(),n.duration+=Date.now()-r}return b},n=>{if(n instanceof de)throw n;return e.status.failed++,e.logger.error("push failed",{event:t,ingest:o.ingest,error:n}),Xe({ok:!1})})(),"Push",e.hooks,e.logger)}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.1-next-1779485810490"},...e})),a.command=(l=tn,me(async(e,n,t)=>await ye(async()=>await l(c,e,n,t),t=>{if(t instanceof ve)throw t;return c.status.failed++,c.logger.error("command failed",{command:e,data:n,error:t}),Xe({ok:!1})})(),"Command",(c=a).hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,n={}){var t;const o={};for(const[t,s]of Object.entries(n)){const{code:n,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(t),c={collector:e,logger:a,id:t,config:r,env:i},l=await n(c);o[t]=l}const s=n,r=function(e){const n={};for(const t of Object.keys(e))n[t]="WHITE";const t=[],o=[];function s(r){var i;const a=n[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),n=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${n}`)}n[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),n[r]="BLACK",t.push(r)}for(const t of Object.keys(e))"WHITE"===n[t]&&s(t);return t}(s);for(const n of r){const r=s[n].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=sn()),i=o.__cache,a="__cache");const c=null!=(t=r.namespace)?t:n;e.logger.scope("store-cache").scope(n).info(`store "${n}" caches with namespace "${c}:" via ${a}`),o[n]=rn(o[n],{storeId:n,cacheConfig:r,cacheStore:i,namespace:c,logger:e.logger.scope("store-cache").scope(n)})}for(const[n,t]of Object.entries(o))"__cache"!==n&&an(e,t);return o}(a,u),function(e,n,t){const o=new Map;for(const[t,s]of Object.entries(e))n[t]&&o.set(s,n[t]);if(0!==o.size)for(const e of[t.transformers,t.destinations,t.sources])if(e)for(const n of Object.values(e))s(n.env);function s(e){if(e)for(const[n,t]of Object.entries(e))if("object"==typeof t&&null!==t){const s=o.get(t);s&&(e[n]=s)}}}(u,a.stores,e),a.stores.__cache||(a.stores.__cache=sn()),a.destinations=await async function(e,n={}){var t,o;const s={};for(const[r,i]of Object.entries(n))(null==(o=null==(t=i.config)?void 0:t.require)?void 0:o.length)?e.pending.destinations[r]=i:s[r]=Ze(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,n={}){var t,o,s,r;const i={};for(const[a,c]of Object.entries(n)){const{code:n,env:l={}}=c,u=oe(c,"Transformer");if(!u.ok){e.logger.warn(`Transformer ${a} invalid (${u.code}): ${u.reason}. Skipping.`);continue}const{config:d}=xe(c,"before"),{config:f}=xe({...c,config:d},"next"),g=Object.keys(l).length>0?{...f,env:l}:f,{cache:p}=c,h=p?{...g,cache:p}:g,v=e.logger.scope("transformer").scope(a),m={collector:e,logger:v,id:a,ingest:L(a),config:h,env:l},y=null!=n?n:e=>{const n=c.mapping;if(n){const t=[];if(void 0!==n.data&&t.push("data"),n.mapping)for(const[e,o]of Object.entries(n.mapping))if("object"==typeof o&&null!==o)for(const[n,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&t.push(`mapping[${e}][${n}].data`),void 0!==o.silent&&t.push(`mapping[${e}][${n}].silent`)}return t.length>0&&e.collector.logger.warn(`Transformer ${a}: \`${t.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async t=>{const o=await se(t,n,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},b=await y(m);void 0!==c.before&&void 0===(null==(t=b.config)?void 0:t.before)&&(b.config={...null!=(o=b.config)?o:{},before:c.before}),void 0!==c.next&&void 0===(null==(s=b.config)?void 0:s.next)&&(b.config={...null!=(r=b.config)?r:{},next:c.next}),i[a]=b}return i}(a,e.transformers||{}),a}async function ln(e){e=e||{};const n=await cn(e),t=(o=n,{type:"elb",config:{},push:async(e,n,t,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const t=e.replace("walker ","");return o.command(t,n)}let i;if("string"==typeof e)i={name:e},n&&"object"==typeof n&&!Array.isArray(n)&&(i.data=n);else{if(!e||"object"!=typeof e)return Xe({ok:!1});i=e,n&&"object"==typeof n&&!Array.isArray(n)&&(i.data={...i.data||{},...n})}return t&&"object"==typeof t&&(i.context=t),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;n.sources.elb=t,await async function(e,n={}){var t;const o={};for(const[s,r]of Object.entries(n)){const n=await Pe(e,s,r);if(!n)continue;const i=null==(t=r.config)?void 0:t.require;n.config={...n.config,init:!1,...i?{require:[...i]}:{}},o[s]=n}Object.assign(e.sources,o);for(const n of Object.keys(o)){const t=e.sources[n];let o=!1;t.init&&await F(t.init.bind(t),t=>{if(t instanceof R)throw t;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:n,error:t})})(),o||(t.config.init=!0,Ee(t)&&await _e(e,t,n))}return o}(n,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await n.command("consent",s),r&&await n.command("user",r),i&&Object.assign(n.globals,i),a&&Object.assign(n.custom,a),n.config.run&&await n.command("run");let c=t.push;const l=Object.values(n.sources).filter(e=>"elb"!==e.type),u=l.find(e=>e.config.primary);return u?c=u.push:l.length>0&&(c=l[0].push),{collector:n,elb:c}}var un=async e=>{let n;return{get flow(){return n},trigger:(t,o)=>async t=>{var s,r,i,a,c,l,u,d,f;const g=o||{};if(g.url){const e=new URL(g.url);window.history.replaceState({},"",e.pathname+e.search)}if(g.referrer&&Object.defineProperty(document,"referrer",{value:g.referrer,configurable:!0}),g.sessionData){const e=g.sessionKey||"elbSessionId";localStorage.setItem(e,JSON.stringify(g.sessionData))}if(g.deviceId){const e=g.deviceKey||"elbDeviceId";localStorage.setItem(e,g.deviceId)}if(!n){const t=await ln({...e,run:null==(s=e.run)||s});n={collector:t.collector,elb:t.elb};const o=g.sessionKey||(null==(c=null==(a=null==(i=null==(r=e.sources)?void 0:r.session)?void 0:i.config)?void 0:a.settings)?void 0:c.sessionKey)||"elbSessionId",p=g.deviceKey||(null==(f=null==(d=null==(u=null==(l=e.sources)?void 0:l.session)?void 0:u.config)?void 0:d.settings)?void 0:f.deviceKey)||"elbDeviceId";localStorage.removeItem(o),localStorage.removeItem(p),g.sessionData&&localStorage.setItem(o,JSON.stringify(g.sessionData)),g.deviceId&&localStorage.setItem(p,g.deviceId),e.consent&&await n.collector.command("consent",e.consent)}}}},dn=(e,n)=>{if(!e||"object"!=typeof e)return;const t=e,o=n.localStorage;if(t.sessionData&&"object"==typeof t.sessionData){const e="string"==typeof t.sessionKey?t.sessionKey:"elbSessionId";o.setItem(e,JSON.stringify(t.sessionData))}if("string"==typeof t.deviceId){const e="string"==typeof t.deviceKey?t.deviceKey:"elbDeviceId";o.setItem(e,t.deviceId)}};export{c as examples,t 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,{SettingsSchema:()=>i,settings:()=>a});import{zodToSchema as o}from"@walkeros/core/dev";import{z as s,ClickIdEntrySchema as r}from"@walkeros/core/dev";var i=s.object({storage:s.boolean().default(!1).describe("Enable persistent storage for session/device IDs").optional(),consent:s.union([s.string(),s.array(s.string())]).describe("Consent key(s) required to enable storage mode").optional(),length:s.number().default(30).describe("Session timeout in minutes").optional(),pulse:s.boolean().default(!1).describe("Keep session alive on each event").optional(),sessionKey:s.string().default("elbSessionId").describe("Storage key for session ID").optional(),sessionStorage:s.enum(["local","session"]).default("local").describe("Storage type for session").optional(),deviceKey:s.string().default("elbDeviceId").describe("Storage key for device ID").optional(),deviceStorage:s.enum(["local","session"]).default("local").describe("Storage type for device").optional(),deviceAge:s.number().default(30).describe("Device ID age in days").optional(),cb:s.any().describe("Custom session callback function or false to disable").optional(),clickIds:s.array(r).describe("Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.").optional()}),a=o(i),c={};t(c,{createTrigger:()=>vt,step:()=>l,trigger:()=>yt});var l={};t(l,{newMarketingSession:()=>u,returningVisitor:()=>d});var u={title:"New marketing session",description:"A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.",trigger:{type:"load",options:{url:"https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale"}},in:{storage:!0},out:[["elb","user",{session:"s3ss10n-id",device:"d3v1c3-id"}],["elb","session",{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}],["elb",{name:"session start",data:{id:"s3ss10n-id",start:17e11,isNew:!0,count:1,runs:1,marketing:!0,source:"google",medium:"cpc",campaign:"winter-sale",referrer:"",device:"d3v1c3-id",isStart:!0,storage:!0,updated:17e11}}]]},d={title:"Returning visitor",description:"A returning visit with a google referrer reuses the stored device id and increments the session count.",trigger:{type:"load",options:{referrer:"https://google.com"}},in:{storage:!0},out:[["elb","user",{session:"n3w-s3ss10n",device:"d3v1c3-id"}],["elb","session",{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}],["elb",{name:"session start",data:{id:"n3w-s3ss10n",start:1700001e6,isNew:!1,count:3,runs:1,referrer:"google.com",device:"d3v1c3-id",isStart:!0,storage:!0,updated:1700001e6}}]]};import{assign as f}from"@walkeros/core";import{assign as p,createLogger as g}from"@walkeros/core";import{assign as h,buildCacheContext as m,clone as v,compileCache as y,checkCache as w,storeCache as b,createIngest as k,debounce as I,emitStep as S,getId as q,getGrantedConsent as x,getNextSteps as O,isDefined as D,isFunction as C,isObject as j,processEventMapping as A,stepId as E,tryCatchAsync as $,useHooks as M}from"@walkeros/core";import{emitStep as T}from"@walkeros/core";import{isArray as _,FatalError as P}from"@walkeros/core";import{tryCatch as K,tryCatchAsync as z}from"@walkeros/core";import{createIngest as R,FatalError as F,getMappingValue as H,tryCatchAsync as N,getNextSteps as B,compileCache as G,checkCache as U,storeCache as W,applyUpdate as L,buildCacheContext as J}from"@walkeros/core";import{createIngest as V,emitStep as Y,FatalError as Q,isObject as X,stepId as Z,tryCatchAsync as ee,useHooks as te,getNextSteps as ne,compileCache as oe,checkCache as se,storeCache as re,buildCacheContext as ie,validateStepEntry as ae,processEventMapping as ce}from"@walkeros/core";import{assign as le,getSpanId as ue,isFunction as de,isString as fe}from"@walkeros/core";import{isObject as pe}from"@walkeros/core";import{createIngest as ge,emitStep as he,FatalError as me,getGrantedConsent as ve,processEventMapping as ye,tryCatchAsync as we,useHooks as be}from"@walkeros/core";import{FatalError as ke,useHooks as Ie,tryCatchAsync as Se}from"@walkeros/core";import{emitStep as qe,useHooks as xe}from"@walkeros/core";import{compileMatcher as Oe,emitStep as De}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 je(e,t){const n=e.status.startedAt;return{flowId:"default",stepId:t.stepId,stepType:t.stepType,phase:t.phase,eventId:t.eventId,timestamp:new Date(t.now).toISOString(),elapsedMs:t.now-n}}function Ae(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Ee(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?n[o]={next:e}:n[o]={}}return n}function $e(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Me(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 Te(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:V(n),config:t.config,env:ze(t.config.env)};s.debug("init");const i=await te(t.init,"TransformerInit",e.hooks,e.logger)(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:{...ze(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=je(e,{stepId:Z("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});Y(e,d);try{const s=await te(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=je(e,{stepId:Z("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:r});return i.durationMs=r-u,i.outEvent=s,Y(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=je(e,{stepId:Z("transformer",n),stepType:"transformer",phase:"error",eventId:l,now:o});throw s.durationMs=o-u,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},Y(e,s),t}}function Pe(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:V(t)}async function Ke(e,t,n,o,s,r,i){var a,c,l,u,d,f,p,g;s||(s=V(null!=(a=n[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let h=o,m=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:m};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await ee(Te,t=>{if(t instanceof Q)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:m};if(i&&void 0!==(null==(l=null==(c=r.config)?void 0:c.chainMocks)?void 0:l[i])){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),h=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),h=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(f=r.config)?void 0:f.cache,v=a?oe(a):void 0,y=v?Ae(v,e):void 0;let w;if(v&&y){const e=ie(s,h),t=await se(v,y,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(h=t.value,v.stop)return{event:h,respond:m,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(w={key:t.key,ttl:t.rule.ttl})}const b=r.config.before;if(b){const n=ne(b,ie(s,h));if(1===n.length){const o=Me(n[0],Ee(t));if(o.length>0){const n=await Ke(e,t,o,h,s,m,i);if(null===n.event)return{event:null,respond:null!=(p=n.respond)?p:m};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(g=n.respond)?g:m,stopped:!0};n.respond&&(m=n.respond),h=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>ee(Ke,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Me(n,Ee(t)),h,Pe(s,n),void 0,i)))}const k=await ee(_e,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,h,s,m);if(!1===k)return{event:null,respond:m};if(Array.isArray(k)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(k.map(async n=>{const o=n.event||h,a=Pe(s,"unknown");if(n.next){const s=ne(n.next,ie(a,o));if(0===s.length)return{event:o,respond:m};if(1===s.length){const n=Me(s[0],Ee(t));return n.length>0?Ke(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>ee(Ke,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Me(n,Ee(t)),o,Pe(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Ke(e,t,r,o,a,m,i):{event:o,respond:m}}));let c=m;const l=[];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)?l.push(...t.event):l.push(t.event)}else l.push(e);return 0===l.length?{event:null,respond:c}:1===l.length?{event:l[0],respond:c}:{event:l,respond:c}}if(k&&"object"==typeof k){const{event:n,respond:o,next:r}=k;if(o&&(m=o),void 0!==r){const o=ne(r,ie(s,h));if(0===o.length){n&&(h=n);continue}if(1===o.length){const a=Me(o[0],Ee(t));return a.length>0?Ke(e,t,a,n||h,s,m,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:m})}return await Promise.all(o.map(o=>ee(Ke,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Me(o,Ee(t)),n||h,Pe(s,o),void 0,i))),{event:null,respond:void 0}}n&&(h=n)}w&&y&&re(y,w.key,h,w.ttl);const I=r.config.next,S="string"==typeof I||Array.isArray(I)&&I.every(e=>"string"==typeof e),q=void 0!==I&&!S;if((!k||"object"==typeof k&&!k.next)&&q){const n=ne(r.config.next,ie(s,h));if(1===n.length){const o=Me(n[0],Ee(t));return o.length>0?Ke(e,t,o,h,s,m,i):{event:h,respond:m}}return n.length>1?(await Promise.all(n.map(n=>ee(Ke,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Me(n,Ee(t)),h,Pe(s,n),void 0,i))),{event:null,respond:void 0}):{event:h,respond:m}}}return{event:h,respond:m}}function ze(e){return e&&X(e)?e:{}}function Re(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Fe(e,t,n){var o,s;if(!t.on||!(null==(o=t.queueOn)?void 0:o.length))return;const r=t.queueOn;t.queueOn=[];const i=n||(null==(s=t.config)?void 0:s.id)||"unknown";for(const{type:n,data:o}of r)await N(t.on,t=>{if(t instanceof F)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o)}function He(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function Ne(e,t,n){var o;const{code:s,config:r={},env:i={},primary:a,next:c,before:l,cache:u}=n,d=u,f=d?G({...d,stop:null==(o=d.stop)||o}):void 0,p=Re(c)?Me(c,Ee(e.transformers)):void 0,g=Re(l)?Me(l,Ee(e.transformers)):void 0,h=i.push,m=null!=h?h:e.push,v=Boolean(h),y=async(n,o,s)=>{var i;let a;const u=null!=g?g:void 0!==l?(()=>{const t=B(l,J(s.ingest));return 0===t.length?[]:Me(1===t.length?t[0]:t,Ee(e.transformers))})():[];let d=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Ke(e,e.transformers,u,n,s.ingest,s.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(s.respond=o.respond),{ok:!0};o.respond&&(s.respond=o.respond),d=Array.isArray(o.event)?o.event:[o.event]}if(f){const t=Ae(f,e);if(t){const n=J(s.ingest),o=await U(f,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&f.stop){let t=o.value;return o.rule.update&&(t=await L(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(i=s.respond)||i.call(s,t),{ok:!0}}if("MISS"===o.status&&f.stop&&s.respond){const r=s.respond,i=o.rule.update,c={...n,cache:{status:"MISS"}},l=o.key,u=o.rule.ttl,d=n=>{W(t,l,n,u),i?a=(async()=>{const t=await L(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||f.stop||W(t,o.key,!0,o.rule.ttl)}}}const h=p?{kind:"single",preChain:p}:void 0!==c?(()=>{const t=B(c,J(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Me(t[0],Ee(e.transformers))}:{kind:"many",branches:t.map(t=>Me(t,Ee(e.transformers)))}})():{kind:"single",preChain:[]};let y={ok:!0};for(const n of d)"many"===h.kind?(await Promise.all(h.branches.map((i,a)=>N(async()=>v?m(n):m(n,{...o,id:t,ingest:Pe(s.ingest,`${t}.${a}`),respond:void 0,mapping:r,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),y={ok:!0}):y=v?await m(n):await m(n,{...o,id:t,ingest:s.ingest,respond:s.respond,mapping:r,preChain:h.preChain});return a&&await a,y},w=async n=>{const o=R(t);if(!r.ingest||void 0===n)return o;const s=await H(n,r.ingest,{collector:e});return{...o,...s,_meta:o._meta}},b=e.logger.scope("source").scope(t),k={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:b,...i,push:async(e,n={})=>{const o={ingest:R(t),respond:void 0};return y(e,n,o)}},I={collector:e,logger:b,id:t,config:r,env:k,withScope:async(e,t,n)=>{const o={ingest:await w(e),respond:t};return n({...k,push:(e,t={})=>y(e,t,o),ingest:o.ingest,respond:o.respond})}},S=await N(s,n=>{if(n instanceof F)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(I);if(!S)return;const q=S.type||"unknown",x=e.logger.scope(q).scope(t);return k.logger=x,a&&(S.config={...S.config,primary:a}),S}function Be(e,t,n,o){if(n instanceof P)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function Ge(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function Ue(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:ct(t.env,t.config.env)};K(t.on,t=>Be(e,"destination",t,{destId:n,type:o}))(o,a)}function We(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,s=Ge(e,Ce.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{K(t[n],t=>Be(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case Ce.Ready:!function(e,t){if(!e.allowed)return;const n=Ge(e,Ce.Ready);t.forEach(t=>{K(t,t=>Be(e,"ready",t))(void 0,n)})}(e,n);break;case Ce.Run:!function(e,t){if(!e.allowed)return;const n=Ge(e,Ce.Run);t.forEach(t=>{K(t,t=>Be(e,"run",t))(void 0,n)})}(e,n);break;case Ce.Session:!function(e,t){if(!e.session)return;const n=Ge(e,Ce.Session);t.forEach(t=>{K(t,t=>Be(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=Ge(e,t);n.forEach(n=>{"function"==typeof n&&K(n,n=>Be(e,"generic",n,{type:t}))(s,o)});break}}}function Le(e,t,n,o){var s;if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(null!=(s=n.onOverflow)?s:"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const r=[];for(;e.length>=n.max;)r.push(e.shift());return e.push(t),r.length>0&&o&&o(r),{appended:!0,dropped:r.length}}var Je=new WeakMap;function Ve(e,t,n,o){Je.get(e)||(Je.set(e,!0),t.warn(n,o))}function Ye(e){Je.delete(e)}var Qe=Object.freeze({batched:!0});function Xe(e){return e===Qe}function Ze(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function et(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function tt(e,t,n,o){var s;e.dropped[t]||(e.dropped[t]={});const r=e.dropped[t];return r[n]=(null!=(s=r[n])?s:0)+o,r[n]}function nt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Me(e,t);if("string"==typeof e)return Me(e,t);const o=O(e,m(n));return 0===o.length?[]:1===o.length?Me(o[0],t):Me(o,t)}async function ot(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return it({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=Le(e.queue,t,{max:n});if(o.dropped>0){const t=tt(e.status,E("collector"),"queue",o.dropped);Ve(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&Ye(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?Ee(e.transformers):{},I=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c;if(s.config.disabled)return{id:o,destination:s,skipped:!0};let l=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&l.push(v(t));const u=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:k("unknown");if(!l.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!l.length&&(null==(i=s.queueOn)?void 0:i.length)){let t=!1;try{t=await st(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const I=[],q=l.filter(t=>{const n=x(s.config.consent,d,t.consent);if(n)return t.consent=n,I.push(t),!1;const r=je(e,{stepId:E("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return r.skipReason="consent",d&&(r.consent={...d}),s.config.consent&&(r.meta={required:{...s.config.consent}}),S(e,r),!0});if(q.length>0){const t=s.queuePush,n=s.config.id||o,r={max:null!=(a=s.config.queueMax)?a:1e3};let i=0;for(const e of q)i+=Le(t,e,r).dropped;if(i>0){et(e,n);const o=tt(e.status,E("destination",n),"queue",i);Ve(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&Ye(t)}if(!I.length)return{id:o,destination:s,queue:l};let O,D,C=!1;try{C=await st(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!C)return{id:o,destination:s,queue:l};s.dlq||(s.dlq=[]);const j=nt(s.config.before,g,u),A=s.config.next,M=null==(c=s.config)?void 0:c.cache,T=M?y(M):void 0,_=T?Ae(T,e):void 0;let P=0,K=0;return await Promise.all(I.map(async t=>{let r;if(t.globals=h(f,t.globals),t.user=h(p,t.user),(null==T?void 0:T.stop)&&_){const e=m(u,t),n=await w(T,_,e);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 i=t,a=n.respond;if(j.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Ke(e,e.transformers,j,t,u,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(a=s.respond),i=Array.isArray(s.event)?s.event[0]:s.event}if(T&&!T.stop&&_){const e=m(u,i),n=await w(T,_,e);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 c=Date.now();let l=!1;const d=await $(rt,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),O=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=Le(a,[i,t],u);if(d.dropped>0){et(e,c);const t=tt(e.status,E("destination",c),"dlq",d.dropped);Ve(a,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:u.max,droppedCount:t})}else a.length<u.max&&Ye(a)})(e,s,o,i,u,a);if(P+=Date.now()-c,r&&_&&void 0===s.config.mock&&b(_,r.key,null==d||d,r.ttl),void 0===d||Xe(d)||(D=d),Xe(d)&&K++,!l&&A){void 0!==d&&(u._response=d);const t=nt(A,g,u);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ke(e,e.transformers,t,i,u,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:O,response:D,totalDuration:P,batchedCount:K,allowedCount:I.length}})),q={},O={},D={};for(const t of I){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};et(e,t.id);const u=e.status.destinations[t.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=n.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,D[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)O[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,s=null!=(l=t.allowedCount)?l:0;(Math.max(0,s-n)>0||0===s)&&(q[t.id]=o,u.count++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.out++)}}return it({event:t,...Object.keys(q).length&&{done:q},...Object.keys(O).length&&{queued:O},...Object.keys(D).length&&{failed:D}})}async function st(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:ct(t.env,t.config.env)};r.debug("init");const a=Date.now();let c;S(e,je(e,{stepId:E("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await M(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),s=je(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},S(e,s),t}if(!1===c)return c;if(t.config={...c||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)Ue(e,t,n,s,r)}r.debug("init done")}return!0}async function rt(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:p}=t,g=await A(o,p,e);if(g.ignore)return!1;const h=t.type||"unknown",m=e.logger.scope(h),v={collector:e,logger:m,id:n,config:p,data:g.data,rule:g.mapping,ingest:s,env:{...ct(t.env,p.env),...r?{respond:r}:{}}};if(void 0!==p.mock)return m.debug("mock",{event:g.event.name}),p.mock;const y=g.mapping,w=g.mappingKey||"* *";if((null==y?void 0:y.batch)&&t.pushBatch&&void 0===p.mock){if(t.batches=t.batches||{},!t.batches[w]){const o={key:w,entries:[],events:[],data:[]},s=Ze(y.batch),r=Ze(p.batch),f=null!=(a=null!=(i=s.wait)?i:r.wait)?a:3e4,g=null!=(l=null!=(c=s.size)?c:r.size)?l:1e3,h=null!=(d=null!=(u=s.age)?u:r.age)?d:3e4,v=ct(t.env,p.env),b=I(async()=>{var o;const s=t.batches[w].batched;if(0===s.entries.length)return;const r={key:s.key,entries:s.entries,events:s.events,data:s.data};s.entries=[],s.events=[],s.data=[];const i=r.entries[0],a={collector:e,logger:m,id:n,config:p,data:void 0,rule:i.rule,ingest:i.ingest,env:{...v,...i.respond?{respond:i.respond}:{}}};m.debug("push batch",{events:r.entries.length});const c=t.config.id||n,l=et(e,c),u=Date.now(),d=je(e,{stepId:E("destination",n),stepType:"destination",phase:"flush",eventId:"",now:u});d.batch={size:r.entries.length,index:0},S(e,d);let f=!0;await $(M(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),o=>{var s;f=!1;const i=Date.now(),a=je(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:"",now:i});a.durationMs=i-u,a.error=o instanceof Error?{name:o.name,message:o.message}:{message:String(o)},a.batch={size:r.entries.length,index:0},S(e,a);const d=t.dlq=t.dlq||[],p={max:null!=(s=t.config.dlqMax)?s:100};let g=0;for(const e of r.entries)g+=Le(d,[e.event,o],p).dropped;if(g>0){const t=tt(e.status,E("destination",c),"dlq",g);Ve(d,m,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:p.max,droppedCount:t})}else d.length<p.max&&Ye(d);l.failed+=r.entries.length,l.dlqSize=d.length,e.status.failed+=r.entries.length,m.error("Push batch failed",{error:o instanceof Error?o.message:String(o),entries:r.entries.length})})(r,a),m.debug("push batch done"),l.inFlightBatch=Math.max(0,(null!=(o=l.inFlightBatch)?o:0)-r.entries.length),f&&(l.count+=r.entries.length,l.lastAt=Date.now(),e.status.out+=r.entries.length)},{wait:f,size:g,age:h});t.batches[w]={batched:o,batchFn:()=>{b()},flush:async()=>{await b.flush()}}}const o=t.batches[w];o.batched.entries.push({event:g.event,ingest:s,respond:r,rule:y,data:g.data}),o.batched.events.push(g.event),D(g.data)&&o.batched.data.push(g.data);const h=t.config.id||n,v=et(e,h);return v.inFlightBatch=(null!=(f=v.inFlightBatch)?f:0)+1,o.batchFn(),Qe}{m.debug("push",{event:g.event.name});const o="string"==typeof g.event.id?g.event.id:"",s=Date.now(),r=je(e,{stepId:E("destination",n),stepType:"destination",phase:"in",eventId:o,now:s});g.mappingKey&&(r.mappingKey=g.mappingKey),g.event.consent&&(r.consent={...g.event.consent}),S(e,r);try{const r=await M(t.push,"DestinationPush",e.hooks,e.logger)(g.event,v),i=Date.now(),a=je(e,{stepId:E("destination",n),stepType:"destination",phase:"out",eventId:o,now:i});return a.durationMs=i-s,a.outEvent=r,g.mappingKey&&(a.mappingKey=g.mappingKey),S(e,a),m.debug("push done"),r}catch(t){const r=Date.now(),i=je(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:o,now:r});throw i.durationMs=r-s,i.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},g.mappingKey&&(i.mappingKey=g.mappingKey),S(e,i),t}}}function it(e){return{ok:!(null==e?void 0:e.failed),...e}}function at(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=$e(e,"before"),{config:i}=$e({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=ct(t.env,o);return{...t,config:a,env:c}}function ct(e,t){return e||t?t?e&&j(e)&&j(t)?{...e,...t}:t:e:{}}async function lt(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 ut(e,t,n){let o,s,r=!1;switch(t){case Ce.Config:pe(n)&&(le(e.config,n,{shallow:!1}),s=n,r=!0);break;case Ce.Consent:if(pe(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=f(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case Ce.Custom:pe(n)&&(e.custom=le(e.custom,n),s=n,r=!0);break;case Ce.Destination:pe(n)&&"code"in n&&pe(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!C(n.push))return it({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let l=r?{...c,before:r}:{...c};i&&(l={...l,next:i}),a&&(l={...l,cache:a});const u={...n,config:l,env:ct(n.env,s)};let d=u.config.id;if(!d)do{d=q(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=u,!1!==u.config.queue&&(u.queuePush=[...e.queue]),ot(e,void 0,{},{[d]:u})}(e,n));break;case Ce.Globals:pe(n)&&(e.globals=le(e.globals,n),s=n,r=!0);break;case Ce.Hook:if(pe(n)&&fe(n.name)&&de(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case Ce.On:if(pe(n)&&fe(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=_(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,We(e,t,r)}(e,t,o)}break;case Ce.Ready:r=!0;break;case Ce.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=le(e.consent,t.consent)),t.user&&(e.user=le(e.user,t.user)),t.globals&&(e.globals=le(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=le(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ot(e)}(e,n),r=!0;break;case Ce.Session:r=!0;break;case Ce.Shutdown:await async function(e){const t=e.logger;await lt(e.sources,"source",t),await lt(e.destinations,"destination",t),await lt(e.transformers,"transformer",t),await lt(e.stores,"store",t)}(e);break;case Ce.User:pe(n)&&(le(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;let i,a=n||[];switch(n||(a=e.on[t]||[]),t){case Ce.Consent:i=o||e.consent;break;case Ce.Session:i=e.session;break;case Ce.User:i=o||e.user;break;case Ce.Custom:i=o||e.custom;break;case Ce.Globals:i=o||e.globals;break;case Ce.Config:i=o||e.config;break;case Ce.Ready:case Ce.Run:default:i=void 0}let c=!1;for(const[n,o]of Object.entries(e.sources)){if(null==(s=o.config.require)?void 0:s.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(He(o)?!1===await z(o.on,o=>Be(e,"source",o,{sourceId:n,type:t}))(t,i)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:i})))}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:i});Ue(e,o,n,t,i)}});for(const[t,n]of Object.entries(e.sources))He(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await Fe(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){var n;for(const[o,s]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[o]||e.destinations[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.destinations[o];const a=at(s);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[o]=a}}(e,t),We(e,t,a,o),!c}(e,t,void 0,s),o=await ot(e)),o||it({ok:!0})}function dt(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:l={},user:u=e.user,nested:d=[],consent:f=e.consent,id:p=ue(),trigger:g="",entity:h=n,action:m=o,timing:v=0,source:y={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:l,user:u,nested:d,consent:f,id:p,trigger:g,entity:h,action:m,timestamp:s,timing:v,source:y}}function ft(e={}){var t,n,o;const s=null!=(t=e.maxEntries)?t:1e4,r=null!=(n=e.lowWaterMark)?n:.8,i=null!=(o=e.sweepIntervalMs)?o:6e4,a=Math.floor(s*r),c=new Map,l={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let u;return i>0&&(u=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of c)void 0!==o.expires&&o.expires<=e&&(c.delete(n),t++);l.evictions_ttl+=t},i),u&&"function"==typeof u.unref&&u.unref()),{type:"memory",config:{},get(e){const t=c.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(c.delete(e),l.evictions_ttl++,void l.misses++):(c.delete(e),c.set(e,t),l.hits++,t.value);l.misses++},set(e,t,n){const o=!c.has(e);o||c.delete(e),c.set(e,{value:t,expires:void 0!==n?Date.now()+n:void 0}),l.writes++,o&&l.populates++,c.size>s&&function(){if(c.size<=s)return;const e=c.size-a;let t=0;for(const n of c.keys()){if(t>=e)break;c.delete(n),t++}l.evictions_entries+=t}()},delete(e){c.delete(e)&&l.deletes++},get counters(){return{...l}},destroy(){void 0!==u&&(clearInterval(u),u=void 0),c.clear()}}}function pt(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=je(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},De(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?Oe(e.match):()=>!0,ttl:e.ttl})),d=e=>`${s}:${e}`;function f(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return u.find(e=>e.match(n))}const p=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...l}},async get(t){const n=d(t),s=await o.get(n);if(void 0!==s)return l.hits++,c(t,"hit"),s;const r=p.get(n);if(r)return l.inflight_dedups++,c(t,"hit"),r;l.misses++,c(t,"miss");const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=f(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),l.populates++}catch(e){g("set",t,e)}return s}finally{p.delete(n)}})();return p.set(n,i),i},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=f(t,n);if(r)try{await o.set(d(t),n,1e3*r.ttl)}catch(e){g("set",t,e)}},async delete(t){l.deletes++,await e.delete(t);try{await o.delete(d(t))}catch(e){g("delete",t,e)}}};function g(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function gt(e,t,n){const o=`store.${n}`,s=xe(t.get,"StoreGet",e.hooks,e.logger),r=xe(t.set,"StoreSet",e.hooks,e.logger),i=xe(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=je(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});r.meta={op:"get",key:t},qe(e,r);try{const r=await s(t),i=Date.now(),a=je(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:i});return a.durationMs=i-n,a.meta={op:"get",key:t},qe(e,a),r}catch(s){const r=Date.now(),i=je(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"get",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},qe(e,i),s}},t.set=async(t,n,s)=>{const i=Date.now(),a=je(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:i});a.meta={op:"set",key:t},qe(e,a);try{await r(t,n,s);const a=Date.now(),c=je(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:a});c.durationMs=a-i,c.meta={op:"set",key:t},qe(e,c)}catch(n){const s=Date.now(),r=je(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:s});throw r.durationMs=s-i,r.meta={op:"set",key:t},r.error=n instanceof Error?{name:n.name,message:n.message}:{message:String(n)},qe(e,r),n}},t.delete=async t=>{const n=Date.now(),s=je(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});s.meta={op:"delete",key:t},qe(e,s);try{await i(t);const s=Date.now(),r=je(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:s});r.durationMs=s-n,r.meta={op:"delete",key:t},qe(e,r)}catch(s){const r=Date.now(),i=je(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"delete",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},qe(e,i),s}}}async function ht(e){var t,n;const o=p({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},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=g(s),i={...o.globalsStatic,...e.globals},a={allowed:!1,config:o,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:i,hooks:e.hooks||{},observers:new Set,logger:r,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var c,l;a.push=function(e,t){const n=be(async(n,o={})=>await we(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:l,preChain:u,include:d,exclude:f}=o;let p=c,g=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,m=null!=a?a:ge(i||"unknown");if(l){const t=await ye(g,l,e);if(t.ignore)return it({ok:!0});if(l.consent&&!ve(l.consent,e.consent,t.event.consent))return it({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ke(e,e.transformers,u,g,m,p,i?`source.${i}.next`:void 0);if(null===n.event)return it({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),it({ok:!0});if(n.respond&&(p=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=dt(e,o);return ot(e,s,{id:i,ingest:m,respond:p},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:it({ok:!0})}g=n.event}const v=t(g),y=dt(e,v),w=await ot(e,y,{id:i,ingest:m,respond:p},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 w},t=>{if(t instanceof me)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),it({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now();he(e,je(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r}));try{const i=await n(t,o),a=Date.now(),c=je(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,he(e,c),i}catch(t){const n=Date.now(),o=je(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:s,now:n});throw o.durationMs=n-r,o.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},he(e,o),t}}}(a,e=>({timing:Math.round((Date.now()-a.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.1"},...e})),a.command=(l=ut,Ie(async(e,t,n)=>await Se(async()=>await l(c,e,t,n),n=>{if(n instanceof ke)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),it({ok:!1})})(),"Command",(c=a).hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,t={}){var n;const o={};for(const[n,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:r,env:i},l=await t(c);o[n]=l}const s=t,r=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){var i;const a=t[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(s);for(const t of r){const r=s[t].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=ft()),i=o.__cache,a="__cache");const c=null!=(n=r.namespace)?n:t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${c}:" via ${a}`),o[t]=pt(o[t],{storeId:t,cacheConfig:r,cacheStore:i,namespace:c,logger:e.logger.scope("store-cache").scope(t),collector:e})}for(const[t,n]of Object.entries(o))"__cache"!==t&&gt(e,n,t);return o}(a,u),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)}}}(u,a.stores,e),a.stores.__cache||(a.stores.__cache=ft()),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]=at(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){var n,o,s,r;const i={};for(const[a,c]of Object.entries(t)){const{code:t,env:l={}}=c,u=ae(c,"Transformer");if(!u.ok){e.logger.warn(`Transformer ${a} invalid (${u.code}): ${u.reason}. Skipping.`);continue}const{config:d}=$e(c,"before"),{config:f}=$e({...c,config:d},"next"),p=Object.keys(l).length>0?{...f,env:l}:f,{cache:g}=c,h=g?{...p,cache:g}:p,m=e.logger.scope("transformer").scope(a),v={collector:e,logger:m,id:a,ingest:V(a),config:h,env:l},y=null!=t?t:e=>{const t=c.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${a}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await ce(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},w=await y(v);void 0!==c.before&&void 0===(null==(n=w.config)?void 0:n.before)&&(w.config={...null!=(o=w.config)?o:{},before:c.before}),void 0!==c.next&&void 0===(null==(s=w.config)?void 0:s.next)&&(w.config={...null!=(r=w.config)?r:{},next:c.next}),i[a]=w}return i}(a,e.transformers||{}),a}async function mt(e){e=e||{};const t=await ht(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return it({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){var n;const o={};for(const[s,r]of Object.entries(t)){const t=await Ne(e,s,r);if(!t)continue;const i=null==(n=r.config)?void 0:n.require;t.config={...t.config,init:!1,...i?{require:[...i]}:{}},o[s]=t}Object.assign(e.sources,o);for(const t of Object.keys(o)){const n=e.sources[t];let o=!1;n.init&&await N(n.init.bind(n),n=>{if(n instanceof F)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,He(n)&&await Fe(e,n,t))}return o}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),u=l.find(e=>e.config.primary);return u?c=u.push:l.length>0&&(c=l[0].push),{collector:t,elb:c}}var vt=async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var s,r,i,a,c,l,u,d,f;const p=o||{};if(p.url){const e=new URL(p.url);window.history.replaceState({},"",e.pathname+e.search)}if(p.referrer&&Object.defineProperty(document,"referrer",{value:p.referrer,configurable:!0}),p.sessionData){const e=p.sessionKey||"elbSessionId";localStorage.setItem(e,JSON.stringify(p.sessionData))}if(p.deviceId){const e=p.deviceKey||"elbDeviceId";localStorage.setItem(e,p.deviceId)}if(!t){const n=await mt({...e,run:null==(s=e.run)||s});t={collector:n.collector,elb:n.elb};const o=p.sessionKey||(null==(c=null==(a=null==(i=null==(r=e.sources)?void 0:r.session)?void 0:i.config)?void 0:a.settings)?void 0:c.sessionKey)||"elbSessionId",g=p.deviceKey||(null==(f=null==(d=null==(u=null==(l=e.sources)?void 0:l.session)?void 0:u.config)?void 0:d.settings)?void 0:f.deviceKey)||"elbDeviceId";localStorage.removeItem(o),localStorage.removeItem(g),p.sessionData&&localStorage.setItem(o,JSON.stringify(p.sessionData)),p.deviceId&&localStorage.setItem(g,p.deviceId),e.consent&&await t.collector.command("consent",e.consent)}}}},yt=(e,t)=>{if(!e||"object"!=typeof e)return;const n=e,o=t.localStorage;if(n.sessionData&&"object"==typeof n.sessionData){const e="string"==typeof n.sessionKey?n.sessionKey:"elbSessionId";o.setItem(e,JSON.stringify(n.sessionData))}if("string"==typeof n.deviceId){const e="string"==typeof n.deviceKey?n.deviceKey:"elbDeviceId";o.setItem(e,n.deviceId)}};export{c as examples,n as schemas};//# sourceMappingURL=dev.mjs.map
package/dist/dev.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/examples/index.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z, ClickIdEntrySchema } from '@walkeros/core/dev';\n\n/**\n * Session source settings schema\n */\nexport const SettingsSchema = z.object({\n storage: z\n .boolean()\n .default(false)\n .describe('Enable persistent storage for session/device IDs')\n .optional(),\n\n consent: z\n .union([z.string(), z.array(z.string())])\n .describe('Consent key(s) required to enable storage mode')\n .optional(),\n\n length: z\n .number()\n .default(30)\n .describe('Session timeout in minutes')\n .optional(),\n\n pulse: z\n .boolean()\n .default(false)\n .describe('Keep session alive on each event')\n .optional(),\n\n sessionKey: z\n .string()\n .default('elbSessionId')\n .describe('Storage key for session ID')\n .optional(),\n\n sessionStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for session')\n .optional(),\n\n deviceKey: z\n .string()\n .default('elbDeviceId')\n .describe('Storage key for device ID')\n .optional(),\n\n deviceStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for device')\n .optional(),\n\n deviceAge: z\n .number()\n .default(30)\n .describe('Device ID age in days')\n .optional(),\n\n // Note: Using z.any() because z.custom() cannot be converted to JSON Schema\n // TypeScript types provide compile-time safety; runtime accepts function or false\n cb: z\n .any()\n .describe('Custom session callback function or false to disable')\n .optional(),\n\n clickIds: z\n .array(ClickIdEntrySchema)\n .describe(\n 'Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","export * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Session source emits three elb calls on start:\n * 1. command('user', { session, device? })\n * 2. command('session', <full session data>)\n * 3. push({ name: 'session start', data: <full session data> })\n */\n\nexport const newMarketingSession: Flow.StepExample = {\n title: 'New marketing session',\n description:\n 'A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.',\n trigger: {\n type: 'load',\n options: {\n url: 'https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 's3ss10n-id', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n },\n ],\n ],\n};\n\nexport const returningVisitor: Flow.StepExample = {\n title: 'Returning visitor',\n description:\n 'A returning visit with a google referrer reuses the stored device id and increments the session count.',\n trigger: {\n type: 'load',\n options: {\n referrer: 'https://google.com',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 'n3w-s3ss10n', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface SessionTriggerOptions {\n url?: string;\n referrer?: string;\n sessionData?: Record<string, unknown>;\n deviceId?: string;\n sessionKey?: string;\n deviceKey?: string;\n}\n\nconst createTrigger: Trigger.CreateFn<Record<string, unknown>, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Record<string, unknown>, void> =\n (type?: string, opts?: unknown) =>\n async (content: Record<string, unknown>) => {\n const options = (opts || {}) as SessionTriggerOptions;\n\n // Pre-init: seed world state before source reads it\n if (options.url) {\n const urlObj = new URL(options.url);\n window.history.replaceState({}, '', urlObj.pathname + urlObj.search);\n }\n if (options.referrer) {\n Object.defineProperty(document, 'referrer', {\n value: options.referrer,\n configurable: true,\n });\n }\n if (options.sessionData) {\n const key = options.sessionKey || 'elbSessionId';\n localStorage.setItem(key, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n const key = options.deviceKey || 'elbDeviceId';\n localStorage.setItem(key, options.deviceId);\n }\n\n // Lazy startFlow — session source fires events during init, but\n // collector.allowed is false until command('run'). The initial\n // session event is dropped. After startFlow, clear the session\n // data written by the dropped init, re-seed, and trigger a consent\n // update to cause session re-init with allowed=true.\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n\n // Clear session data written by the dropped init\n const sessionKey =\n options.sessionKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.sessionKey as string) ||\n 'elbSessionId';\n const deviceKey =\n options.deviceKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.deviceKey as string) ||\n 'elbDeviceId';\n localStorage.removeItem(sessionKey);\n localStorage.removeItem(deviceKey);\n\n // Re-seed localStorage if trigger options specified session data\n if (options.sessionData) {\n localStorage.setItem(sessionKey, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n localStorage.setItem(deviceKey, options.deviceId);\n }\n\n // Re-apply consent to trigger session source on('consent') handler.\n // Now allowed=true so the session start event reaches destinations.\n if (config.consent) {\n await flow.collector.command('consent', config.consent);\n }\n }\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Prepares localStorage with session/device data before source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n if (!input || typeof input !== 'object') return;\n const data = input as Record<string, unknown>;\n const storage = env.localStorage as Storage;\n\n if (data.sessionData && typeof data.sessionData === 'object') {\n const key =\n typeof data.sessionKey === 'string' ? data.sessionKey : 'elbSessionId';\n storage.setItem(key, JSON.stringify(data.sessionData));\n }\n\n if (typeof data.deviceId === 'string') {\n const key =\n typeof data.deviceKey === 'string' ? data.deviceKey : 'elbDeviceId';\n storage.setItem(key, data.deviceId);\n }\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["trigger","_e"]}
1
+ {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/examples/index.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z, ClickIdEntrySchema } from '@walkeros/core/dev';\n\n/**\n * Session source settings schema\n */\nexport const SettingsSchema = z.object({\n storage: z\n .boolean()\n .default(false)\n .describe('Enable persistent storage for session/device IDs')\n .optional(),\n\n consent: z\n .union([z.string(), z.array(z.string())])\n .describe('Consent key(s) required to enable storage mode')\n .optional(),\n\n length: z\n .number()\n .default(30)\n .describe('Session timeout in minutes')\n .optional(),\n\n pulse: z\n .boolean()\n .default(false)\n .describe('Keep session alive on each event')\n .optional(),\n\n sessionKey: z\n .string()\n .default('elbSessionId')\n .describe('Storage key for session ID')\n .optional(),\n\n sessionStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for session')\n .optional(),\n\n deviceKey: z\n .string()\n .default('elbDeviceId')\n .describe('Storage key for device ID')\n .optional(),\n\n deviceStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for device')\n .optional(),\n\n deviceAge: z\n .number()\n .default(30)\n .describe('Device ID age in days')\n .optional(),\n\n // Note: Using z.any() because z.custom() cannot be converted to JSON Schema\n // TypeScript types provide compile-time safety; runtime accepts function or false\n cb: z\n .any()\n .describe('Custom session callback function or false to disable')\n .optional(),\n\n clickIds: z\n .array(ClickIdEntrySchema)\n .describe(\n 'Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","export * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Session source emits three elb calls on start:\n * 1. command('user', { session, device? })\n * 2. command('session', <full session data>)\n * 3. push({ name: 'session start', data: <full session data> })\n */\n\nexport const newMarketingSession: Flow.StepExample = {\n title: 'New marketing session',\n description:\n 'A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.',\n trigger: {\n type: 'load',\n options: {\n url: 'https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 's3ss10n-id', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n },\n ],\n ],\n};\n\nexport const returningVisitor: Flow.StepExample = {\n title: 'Returning visitor',\n description:\n 'A returning visit with a google referrer reuses the stored device id and increments the session count.',\n trigger: {\n type: 'load',\n options: {\n referrer: 'https://google.com',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 'n3w-s3ss10n', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface SessionTriggerOptions {\n url?: string;\n referrer?: string;\n sessionData?: Record<string, unknown>;\n deviceId?: string;\n sessionKey?: string;\n deviceKey?: string;\n}\n\nconst createTrigger: Trigger.CreateFn<Record<string, unknown>, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Record<string, unknown>, void> =\n (type?: string, opts?: unknown) =>\n async (content: Record<string, unknown>) => {\n const options = (opts || {}) as SessionTriggerOptions;\n\n // Pre-init: seed world state before source reads it\n if (options.url) {\n const urlObj = new URL(options.url);\n window.history.replaceState({}, '', urlObj.pathname + urlObj.search);\n }\n if (options.referrer) {\n Object.defineProperty(document, 'referrer', {\n value: options.referrer,\n configurable: true,\n });\n }\n if (options.sessionData) {\n const key = options.sessionKey || 'elbSessionId';\n localStorage.setItem(key, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n const key = options.deviceKey || 'elbDeviceId';\n localStorage.setItem(key, options.deviceId);\n }\n\n // Lazy startFlow — session source fires events during init, but\n // collector.allowed is false until command('run'). The initial\n // session event is dropped. After startFlow, clear the session\n // data written by the dropped init, re-seed, and trigger a consent\n // update to cause session re-init with allowed=true.\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n\n // Clear session data written by the dropped init\n const sessionKey =\n options.sessionKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.sessionKey as string) ||\n 'elbSessionId';\n const deviceKey =\n options.deviceKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.deviceKey as string) ||\n 'elbDeviceId';\n localStorage.removeItem(sessionKey);\n localStorage.removeItem(deviceKey);\n\n // Re-seed localStorage if trigger options specified session data\n if (options.sessionData) {\n localStorage.setItem(sessionKey, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n localStorage.setItem(deviceKey, options.deviceId);\n }\n\n // Re-apply consent to trigger session source on('consent') handler.\n // Now allowed=true so the session start event reaches destinations.\n if (config.consent) {\n await flow.collector.command('consent', config.consent);\n }\n }\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Prepares localStorage with session/device data before source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n if (!input || typeof input !== 'object') return;\n const data = input as Record<string, unknown>;\n const storage = env.localStorage as Storage;\n\n if (data.sessionData && typeof data.sessionData === 'object') {\n const key =\n typeof data.sessionKey === 'string' ? data.sessionKey : 'elbSessionId';\n storage.setItem(key, JSON.stringify(data.sessionData));\n }\n\n if (typeof data.deviceId === 'string') {\n const key =\n typeof data.deviceKey === 'string' ? data.deviceKey : 'elbDeviceId';\n storage.setItem(key, data.deviceId);\n }\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["trigger","_e"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/web-source-session",
4
- "version": "4.1.1-next-1779485810490",
4
+ "version": "4.1.1",
5
5
  "type": "source",
6
6
  "platform": [
7
7
  "web"
@@ -108,7 +108,7 @@
108
108
  },
109
109
  "examples": {
110
110
  "createTrigger": {
111
- "$code": "async e=>{let n;return{get flow(){return n},trigger:(t,o)=>async t=>{var s,r,i,a,c,l,u,d,f;const g=o||{};if(g.url){const e=new URL(g.url);window.history.replaceState({},\"\",e.pathname+e.search)}if(g.referrer&&Object.defineProperty(document,\"referrer\",{value:g.referrer,configurable:!0}),g.sessionData){const e=g.sessionKey||\"elbSessionId\";localStorage.setItem(e,JSON.stringify(g.sessionData))}if(g.deviceId){const e=g.deviceKey||\"elbDeviceId\";localStorage.setItem(e,g.deviceId)}if(!n){const t=await ln({...e,run:null==(s=e.run)||s});n={collector:t.collector,elb:t.elb};const o=g.sessionKey||(null==(c=null==(a=null==(i=null==(r=e.sources)?void 0:r.session)?void 0:i.config)?void 0:a.settings)?void 0:c.sessionKey)||\"elbSessionId\",p=g.deviceKey||(null==(f=null==(d=null==(u=null==(l=e.sources)?void 0:l.session)?void 0:u.config)?void 0:d.settings)?void 0:f.deviceKey)||\"elbDeviceId\";localStorage.removeItem(o),localStorage.removeItem(p),g.sessionData&&localStorage.setItem(o,JSON.stringify(g.sessionData)),g.deviceId&&localStorage.setItem(p,g.deviceId),e.consent&&await n.collector.command(\"consent\",e.consent)}}}}"
111
+ "$code": "async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var s,r,i,a,c,l,u,d,f;const p=o||{};if(p.url){const e=new URL(p.url);window.history.replaceState({},\"\",e.pathname+e.search)}if(p.referrer&&Object.defineProperty(document,\"referrer\",{value:p.referrer,configurable:!0}),p.sessionData){const e=p.sessionKey||\"elbSessionId\";localStorage.setItem(e,JSON.stringify(p.sessionData))}if(p.deviceId){const e=p.deviceKey||\"elbDeviceId\";localStorage.setItem(e,p.deviceId)}if(!t){const n=await mt({...e,run:null==(s=e.run)||s});t={collector:n.collector,elb:n.elb};const o=p.sessionKey||(null==(c=null==(a=null==(i=null==(r=e.sources)?void 0:r.session)?void 0:i.config)?void 0:a.settings)?void 0:c.sessionKey)||\"elbSessionId\",g=p.deviceKey||(null==(f=null==(d=null==(u=null==(l=e.sources)?void 0:l.session)?void 0:u.config)?void 0:d.settings)?void 0:f.deviceKey)||\"elbDeviceId\";localStorage.removeItem(o),localStorage.removeItem(g),p.sessionData&&localStorage.setItem(o,JSON.stringify(p.sessionData)),p.deviceId&&localStorage.setItem(g,p.deviceId),e.consent&&await t.collector.command(\"consent\",e.consent)}}}}"
112
112
  },
113
113
  "step": {
114
114
  "newMarketingSession": {
@@ -235,7 +235,7 @@
235
235
  }
236
236
  },
237
237
  "trigger": {
238
- "$code": "(e,n)=>{if(!e||\"object\"!=typeof e)return;const t=e,o=n.localStorage;if(t.sessionData&&\"object\"==typeof t.sessionData){const e=\"string\"==typeof t.sessionKey?t.sessionKey:\"elbSessionId\";o.setItem(e,JSON.stringify(t.sessionData))}if(\"string\"==typeof t.deviceId){const e=\"string\"==typeof t.deviceKey?t.deviceKey:\"elbDeviceId\";o.setItem(e,t.deviceId)}}"
238
+ "$code": "(e,t)=>{if(!e||\"object\"!=typeof e)return;const n=e,o=t.localStorage;if(n.sessionData&&\"object\"==typeof n.sessionData){const e=\"string\"==typeof n.sessionKey?n.sessionKey:\"elbSessionId\";o.setItem(e,JSON.stringify(n.sessionData))}if(\"string\"==typeof n.deviceId){const e=\"string\"==typeof n.deviceKey?n.deviceKey:\"elbDeviceId\";o.setItem(e,n.deviceId)}}"
239
239
  }
240
240
  }
241
241
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/web-source-session",
3
3
  "description": "Session source for walkerOS",
4
- "version": "4.1.1-next-1779485810490",
4
+ "version": "4.1.1",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -33,11 +33,11 @@
33
33
  "update": "npx npm-check-updates -u && npm update"
34
34
  },
35
35
  "dependencies": {
36
- "@walkeros/core": "4.1.1-next-1779485810490",
37
- "@walkeros/web-core": "4.1.1-next-1779485810490"
36
+ "@walkeros/core": "4.1.1",
37
+ "@walkeros/web-core": "4.1.1"
38
38
  },
39
39
  "devDependencies": {
40
- "@walkeros/collector": "4.1.1-next-1779485810490"
40
+ "@walkeros/collector": "4.1.1"
41
41
  },
42
42
  "repository": {
43
43
  "url": "git+https://github.com/elbwalker/walkerOS.git",