@walkeros/web-source-session 4.2.1-next-1781682752679 → 4.2.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,9 +1,13 @@
1
1
  # @walkeros/web-source-session
2
2
 
3
- ## 4.2.1-next-1781682752679
3
+ ## 4.2.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - 31c6858: `getId` now draws from the platform's cryptographic random source
8
+ (`crypto.getRandomValues`) when available, with unbiased character sampling
9
+ and a `Math.random` fallback. Session and device ids generated by the session
10
+ source are now longer for a much wider collision margin.
7
11
  - ec84331: Fix `session start` being dropped when the collector starts with
8
12
  `run: false` and no consent requirement. Without a consent rule the source
9
13
  emitted during init, before the collector was allowed, so the event never
@@ -11,10 +15,12 @@
11
15
  browser source's page view timing, so it lands reliably once the collector
12
16
  runs.
13
17
  - Updated dependencies [5cbcd23]
18
+ - Updated dependencies [31c6858]
19
+ - Updated dependencies [d1b41ca]
14
20
  - Updated dependencies [0a8a08b]
15
21
  - Updated dependencies [8afb7cc]
16
- - @walkeros/core@4.2.1-next-1781682752679
17
- - @walkeros/web-core@4.2.1-next-1781682752679
22
+ - @walkeros/core@4.2.1
23
+ - @walkeros/web-core@4.2.1
18
24
 
19
25
  ## 4.2.0
20
26
 
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:()=>Ge,step:()=>p,trigger:()=>Be});var p={};r(p,{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}}]]},v=require("@walkeros/core"),m=require("@walkeros/core"),y=require("@walkeros/core"),w=(require("@walkeros/core"),require("@walkeros/core")),b=require("@walkeros/core"),k=require("@walkeros/core"),S=require("@walkeros/core"),I=require("@walkeros/core"),C=require("@walkeros/core"),q=require("@walkeros/core"),x=require("@walkeros/core"),O=require("@walkeros/core"),j=require("@walkeros/core"),E=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",Scoped:"_",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,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 M=new WeakMap;function T(e,t,n,o){M.get(e)||(M.set(e,!0),t.warn(n,o))}function P(e){M.delete(e)}var _=()=>Date.now();function z(e){var t,n;if(void 0!==e)return"number"==typeof e?{threshold:e,cooldown:3e4}:{threshold:null!=(t=e.threshold)?t:5,cooldown:null!=(n=e.cooldown)?n:3e4}}function K(e,t,n,o,s){if("partial"===n)return;const r=((i=e)[a=t]||(i[a]={state:"closed",consecutiveFailures:0}),i[a]);var i,a;return"success"===n?(r.consecutiveFailures=0,r.state="closed",r.probing=!1,void(r.openUntil=void 0)):(r.consecutiveFailures+=1,"half-open"===r.state?(r.state="open",r.probing=!1,void(r.openUntil=_()+s)):void(r.consecutiveFailures>=o&&(r.state="open",r.probing=!1,r.openUntil=_()+s)))}function F(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 H(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 N(e,t,n,o,s){const r=(0,k.stepId)(t,n);return(t,i)=>{var a;try{if(i)return s?function(e,t,n,o,s,r){var i;const a=t.dlq=t.dlq||[],c={max:null!=(i=t.config.dlqMax)?i:100},l=$(a,[o,s],c);if(l.dropped>0){const t=H(e.status,(0,k.stepId)("destination",n),"dlq",l.dropped);T(a,r,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:n,cap:c.max,droppedCount:t})}else a.length<c.max&&P(a);const u=F(e,n);u.failed++,u.dlqSize=a.length,e.status.failed++;const d=z(t.config.breaker);if(d){const o=t.config.id||n;K(e.status.breakers,(0,k.stepId)("destination",o),"transport-failure",d.threshold,d.cooldown)}}(e,s,n,i,t,o):e.status.failed++,void o.error("reportError",{error:t instanceof Error?t.message:String(t),event:i.name});e.status.connectionErrors[r]=(null!=(a=e.status.connectionErrors[r])?a:0)+1,o.error("connection error",{error:t instanceof Error?t.message:String(t)})}catch(e){}}}function U(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function R(e,t){return e?t.stores[e]:t.stores.__cache}function G(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 B(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 V(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 W(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:Q(t.config.env),reportError:N(e,"transformer",n,s)};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 L(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Q(t.config.env),...r?{respond:r}:{}},reportError:N(e,"transformer",n,a)};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});d.inEvent=o,(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 J(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,I.createIngest)(t)}async function Y(e,t,n,o,s,r,i){var a,c,l,u,d,f,p,g,h;s||(s=(0,I.createIngest)(null!=(a=n[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let v=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)(W,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}),v=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),v=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(f=r.config)?void 0:f.cache,y=a?(0,I.compileCache)(a):void 0,w=y?U(y,e):void 0,b=(null==(p=r.config)?void 0:p.state)?(0,I.compileState)(r.config.state):void 0,k=null==b?void 0:b.filter(e=>"get"===e.mode),S=null==b?void 0:b.filter(e=>"set"===e.mode),C=async t=>S&&0!==S.length?(0,I.applyState)(S,t=>R(t,e),t,e):t;let q;if(y&&w){const e=(0,I.buildCacheContext)(s,v),t=await(0,I.checkCache)(y,w,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(v=t.value,y.stop)return{event:v,respond:m,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(q={key:t.key,ttl:t.rule.ttl})}const x=r.config.before;if(x){const n=(0,I.getNextSteps)(x,(0,I.buildCacheContext)(s,v));if(1===n.length){const o=V(n[0],G(t));if(o.length>0){const n=await Y(e,t,o,v,s,m,i);if(null===n.event)return{event:null,respond:null!=(g=n.respond)?g:m};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(h=n.respond)?h:m,stopped:!0};n.respond&&(m=n.respond),v=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>(0,I.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),v,J(s,n),void 0,i)))}k&&k.length>0&&(v=await(0,I.applyState)(k,t=>R(t,e),v,e));const O=await(0,I.tryCatchAsync)(L,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,v,s,m);if(!1===O)return{event:null,respond:m};if(Array.isArray(O)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(O.map(async n=>{const o=await C(n.event||v),a=J(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=V(s[0],G(t));return n.length>0?Y(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>(0,I.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),o,J(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Y(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(O&&"object"==typeof O){const{event:n,respond:o,next:r}=O;if(o&&(m=o),void 0!==r){const o=await C(n||v),a=(0,I.getNextSteps)(r,(0,I.buildCacheContext)(s,o));if(0===a.length){v=o;continue}if(1===a.length){const n=V(a[0],G(t));return n.length>0?Y(e,t,n,o,s,m,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:m})}return await Promise.all(a.map(n=>(0,I.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),o,J(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}S&&S.length>0&&(v=await(0,I.applyState)(S,t=>R(t,e),v,e)),q&&w&&(0,I.storeCache)(w,q.key,v,q.ttl);const j=r.config.next,E="string"==typeof j||Array.isArray(j)&&j.every(e=>"string"==typeof e),D=void 0!==j&&!E;if((!O||"object"==typeof O&&!O.next)&&D){const n=(0,I.getNextSteps)(r.config.next,(0,I.buildCacheContext)(s,v));if(1===n.length){const o=V(n[0],G(t));return o.length>0?Y(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>(0,I.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),v,J(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function Q(e){return e&&(0,I.isObject)(e)?e:{}}function X(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Z(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)ce(n)&&!pe(e,t,n)||(await(0,S.tryCatchAsync)(t.on,t=>{if(t instanceof S.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o),ce(n)&&fe(e,t,n))}function ee(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function te(e,t,n){var o,s;const{code:r,config:i={},env:a={},primary:c,next:l,before:u,cache:d}=n,f=null!=(o=i.state)?o:n.state,p=f?(0,S.compileState)(f):void 0,g=d,h=g?(0,S.compileCache)({...g,stop:null==(s=g.stop)||s}):void 0,v=X(l)?V(l,G(e.transformers)):void 0,m=X(u)?V(u,G(e.transformers)):void 0,y=a.push,w=null!=y?y:e.push,b=Boolean(y),k=async(n,o,s)=>{var r;let a;const c=null!=m?m:void 0!==u?(()=>{const t=(0,S.getNextSteps)(u,(0,S.buildCacheContext)(s.ingest));return 0===t.length?[]:V(1===t.length?t[0]:t,G(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Y(e,e.transformers,c,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(h){const t=U(h,e);if(t){const n=(0,S.buildCacheContext)(s.ingest),o=await(0,S.checkCache)(h,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&h.stop){let t=o.value;return o.rule.update&&(t=await(0,S.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(r=s.respond)||r.call(s,t),{ok:!0}}if("MISS"===o.status&&h.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,S.storeCache)(t,l,n,u),i?a=(async()=>{const t=await(0,S.applyUpdate)(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||(0,S.storeCache)(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=(0,S.getNextSteps)(l,(0,S.buildCacheContext)(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:V(t[0],G(e.transformers))}:{kind:"many",branches:t.map(t=>V(t,G(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>(0,S.applyState)(p,t=>R(t,e),t,e))));let g={ok:!0};for(const n of d)"many"===f.kind?(await Promise.all(f.branches.map((r,a)=>(0,S.tryCatchAsync)(async()=>b?w(n):w(n,{...o,id:t,ingest:J(s.ingest,`${t}.${a}`),respond:void 0,mapping:i,preChain:r}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),g={ok:!0}):g=b?await w(n):await w(n,{...o,id:t,ingest:s.ingest,respond:s.respond,mapping:i,preChain:f.preChain});return a&&await a,g},I=async n=>{const o=(0,S.createIngest)(t);if(!i.ingest||void 0===n)return o;const s=await(0,S.getMappingValue)(n,i.ingest,{collector:e});return{...o,...s,_meta:o._meta}},C=e.logger.scope("source").scope(t),q={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:C,...a,push:async(e,n={})=>{const o={ingest:(0,S.createIngest)(t),respond:void 0};return k(e,n,o)}},x={collector:e,logger:C,id:t,config:i,env:q,withScope:async(e,t,n)=>{const o={ingest:await I(e),respond:t};return n({...q,push:(e,t={})=>k(e,t,o),ingest:o.ingest,respond:o.respond})},reportError:N(e,"source",t,C)},O=await(0,S.tryCatchAsync)(r,n=>{if(n instanceof S.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(x);if(!O)return;const j=O.type||"unknown",E=e.logger.scope(j).scope(t);return q.logger=E,c&&(O.config={...O.config,primary:c}),O}async function ne(e){var t;for(const[t,n]of Object.entries(e.sources)){if(ee(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!ue(e,t));s.length!==o.length&&(n.config.require=s,ee(n)&&await Z(e,n,t))}for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=null==(t=o.config)?void 0:t.require;if(!s)continue;const r=s.filter(t=>!ue(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=Ae(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function oe(e){if("object"!=typeof e||null===e)return!1;if(!("logger"in e))return!1;const t=e.logger;return"object"==typeof t&&null!==t&&"scope"in t&&"function"==typeof t.scope}var se=!1;function re(){se||(se=!0,"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn("walkerOS: ignored an on-dispatch call with a non-collector argument"))}function ie(e,t,n,o){if(n instanceof w.FatalError)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}var ae=[D.Consent,D.User,D.Globals,D.Custom];function ce(e){return ae.includes(e)}function le(e,t){switch(t){case D.Consent:return Object.keys(e.consent).length>0;case D.User:return Object.keys(e.user).length>0;case D.Globals:return Object.keys(e.globals).length>0;case D.Custom:return Object.keys(e.custom).length>0;default:return!1}}function ue(e,t){switch(t){case D.Consent:case D.User:case D.Globals:case D.Custom:return le(e,t);case D.Run:case D.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function de(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function fe(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=de(e,n)}function pe(e,t,n){return e.allowed&&de(e,n)>function(e,t,n){const o=e.delivery.get(t),s=null==o?void 0:o[String(n)];return void 0===s?-1:s}(e,t,n)}function ge(e,t,n){const o=e.cascade;if(!o)return!0;let s=o.counts.get(t);s||(s={},o.counts.set(t,s));const r=String(n),i=(s[r]||0)+1;return s[r]=i,i<=8||(9===i&&e.logger.error("state delivery did not converge",{type:r}),!1)}function he(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ve(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:$e(t.env,t.config.env),reportError:N(e,"destination",n,i,t)};(0,b.tryCatch)(t.on,t=>ie(e,"destination",t,{destId:n,type:o}))(o,a)}function me(e,t,n,o){if(!oe(e))return void re();const s=ye(e,t,o);if(n.length)switch(t){case D.Consent:!function(e,t,n){const o=n||e.consent,s=he(e,D.Consent);t.forEach(t=>{pe(e,t,D.Consent)&&ge(e,t,D.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{(0,b.tryCatch)(t[n],t=>ie(e,"consent",t,{key:n}))(o,s)}),fe(e,t,D.Consent))})}(e,n,o);break;case D.Ready:!function(e,t){if(!e.allowed)return;const n=he(e,D.Ready);t.forEach(t=>{(0,b.tryCatch)(t,t=>ie(e,"ready",t))(void 0,n)})}(e,n);break;case D.Run:!function(e,t){if(!e.allowed)return;const n=he(e,D.Run);t.forEach(t=>{(0,b.tryCatch)(t,t=>ie(e,"run",t))(void 0,n)})}(e,n);break;case D.Session:!function(e,t){if(!e.session)return;const n=he(e,D.Session);t.forEach(t=>{(0,b.tryCatch)(t,t=>ie(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=he(e,t),r=ce(t);n.forEach(n=>{"function"==typeof n&&(r&&!pe(e,n,t)||r&&!ge(e,n,t)||((0,b.tryCatch)(n,n=>ie(e,"generic",n,{type:t}))(s,o),r&&fe(e,n,t)))});break}}}function ye(e,t,n){switch(t){case D.Consent:return n||e.consent;case D.Session:return e.session;case D.User:return n||e.user;case D.Custom:return n||e.custom;case D.Globals:return n||e.globals;case D.Config:return n||e.config;default:return}}async function we(e,t,n,o,s){if(!t.on)return!1;if(ce(o)&&!pe(e,t,o))return!1;if(ce(o)&&!ge(e,t,o))return!1;const r=await(0,b.tryCatchAsync)(t.on,t=>ie(e,"source",t,{sourceId:n,type:o}))(o,s);return ce(o)&&fe(e,t,o),!1===r}function be(e){return"number"==typeof e&&e>0?e:1e4}var ke=class extends Error{constructor(e){super(e),this.name="DestinationTimeoutError"}};function Se(e,t,n){let o;const s=new Promise((e,s)=>{o=setTimeout(()=>s(new ke(n)),t)});return Promise.race([e,s]).finally(()=>{o&&clearTimeout(o)})}var Ie=Object.freeze({batched:!0});function Ce(e){return e===Ie}function qe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function xe(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return V(e,t);if("string"==typeof e)return V(e,t);const o=(0,y.getNextSteps)(e,(0,y.buildCacheContext)(n));return 0===o.length?[]:1===o.length?V(o[0],t):V(o,t)}async function Oe(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return De({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=$(e.queue,t,{max:n});if(o.dropped>0){const t=H(e.status,(0,y.stepId)("collector"),"queue",o.dropped);T(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&P(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?G(e.transformers):{},h=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};const u=s.config.id||o,h=(0,y.stepId)("destination",u),v=z(s.config.breaker);if(v&&function(e,t,n){const o=e[t];if(!o||"closed"===o.state)return!1;if("half-open"===o.state)return!0===o.probing;const s=_();return void 0!==o.openUntil&&s<o.openUntil||(o.state="half-open",o.probing=!0,o.openUntil=s+n,!1)}(e.status.breakers,h,v.cooldown))return{id:o,destination:s,skipped:!0};const m=t=>{v&&K(e.status.breakers,h,t,v.threshold,v.cooldown)},w=()=>{v&&function(e,t){const n=e[t];n&&"half-open"===n.state&&!0===n.probing&&(n.state="open",n.probing=!1)}(e.status.breakers,h)};let b=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&b.push((0,y.clone)(t));const k=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,y.createIngest)("unknown");if(!b.length&&!(null==(r=s.queueOn)?void 0:r.length))return w(),{id:o,destination:s,skipped:!0};if(!b.length&&(null==(i=s.queueOn)?void 0:i.length)){if(!(0,y.getGrantedConsent)(s.config.consent,d))return w(),{id:o,destination:s,skipped:!0};let t=!1;try{t=await je(e,s,o,!0)}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)}),m("transport-failure")}return w(),{id:o,destination:s,skipped:!t}}const S=[],I=b.filter(t=>{const n=(0,y.getGrantedConsent)(s.config.consent,d,t.consent);if(n)return t.consent=n,S.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(I.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 I)i+=$(t,e,r).dropped;if(i>0){F(e,n);const o=H(e.status,(0,y.stepId)("destination",n),"queue",i);T(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&&P(t)}if(!S.length)return w(),{id:o,destination:s,queue:b};let C,q,x=!1;try{x=await je(e,s,o,!0)}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)}),m("transport-failure")}if(!x)return w(),{id:o,destination:s,queue:b};s.dlq||(s.dlq=[]);const O=xe(s.config.before,g,k),j=s.config.next,E=null==(c=s.config)?void 0:c.cache,D=E?(0,y.compileCache)(E):void 0,M=D?U(D,e):void 0,N=(null==(l=s.config)?void 0:l.state)?(0,y.compileState)(s.config.state):void 0,G=null==N?void 0:N.filter(e=>"get"===e.mode),B=null==N?void 0:N.filter(e=>"set"===e.mode);let V=0,W=0;return await Promise.all(S.map(async t=>{let r;if(t.globals=(0,y.assign)(f,t.globals),t.user=(0,y.assign)(p,t.user),(null==D?void 0:D.stop)&&M){const e=(0,y.buildCacheContext)(k,t),n=await(0,y.checkCache)(D,M,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(O.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Y(e,e.transformers,O,t,k,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(D&&!D.stop&&M){const e=(0,y.buildCacheContext)(k,i),n=await(0,y.checkCache)(D,M,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})}G&&G.length>0&&i&&(i=await(0,y.applyState)(G,t=>R(t,e),i,e));const c=Date.now();let l=!1;const u=await(0,y.tryCatchAsync)(Ee,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),C=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=$(a,[i,t],u);if(d.dropped>0){F(e,c);const t=H(e.status,(0,y.stepId)("destination",c),"dlq",d.dropped);T(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&&P(a)})(e,s,o,i,k,a);if(V+=Date.now()-c,r&&M&&void 0===s.config.mock&&(0,y.storeCache)(M,r.key,null==u||u,r.ttl),!l&&!Ce(u)&&B&&B.length>0&&i&&(i=await(0,y.applyState)(B,t=>R(t,e),i,e)),void 0===u||Ce(u)||(q=u),Ce(u)&&W++,!l&&j){void 0!==u&&(k._response=u);const t=xe(j,g,k);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Y(e,e.transformers,t,i,k,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:C,response:q,totalDuration:V,batchedCount:W,allowedCount:S.length,canonicalId:u,breakerConfig:v}})),v={},m={},w={};for(const t of h){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};F(e,t.id);const u=e.status.destinations[t.id],d=Date.now();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;const f=t.breakerConfig,p=t.canonicalId?(0,y.stepId)("destination",t.canonicalId):void 0,g=t=>{f&&p&&K(e.status.breakers,p,t,f.threshold,f.cooldown)};if(t.error)o.error=t.error,w[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++,g("transport-failure");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++,g("success"))}}return De({event:t,...Object.keys(v).length&&{done:v},...Object.keys(m).length&&{queued:m},...Object.keys(w).length&&{failed:w}})}async function je(e,t,n,o=!1){var s;if(t.init&&!t.config.init){if(!o&&function(e){const t=e.config.consent;return!!t&&Object.keys(t).length>0}(t))return e.logger.scope(t.type||"unknown").debug("init blocked: consent gate not cleared"),!1;const r=t.type||"unknown",i=e.logger.scope(r),a={collector:e,logger:i,id:n,config:t.config,env:$e(t.env,t.config.env),reportError:N(e,"destination",n,i,t)};i.debug("init");const c=Date.now();let l;(0,y.emitStep)(e,A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"init",eventId:"",now:c}));try{l=await(0,y.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(a)}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-c,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,y.emitStep)(e,s),t}if(!1===l)return l;if(t.config={...l||t.config,init:!0},null==(s=t.queueOn)?void 0:s.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)ve(e,t,n,s,r)}i.debug("init done")}return!0}async function Ee(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:p}=t,g=await(0,y.processEventMapping)(o,p,e);if(g.ignore)return!1;const h=t.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:n,config:p,data:g.data,rule:g.mapping,ingest:s,env:{...$e(t.env,p.env),...r?{respond:r}:{}},reportError:N(e,"destination",n,v,t)};if(void 0!==p.mock)return v.debug("mock",{event:g.event.name}),p.mock;const w=g.mapping,b=void 0!==(null==w?void 0:w.batch),k=b?g.mappingKey||"* *":" batch-all";if((b||void 0!==p.batch)&&t.pushBatch&&void 0===p.mock){if(t.batches=t.batches||{},!t.batches[k]){const o={key:k,entries:[],events:[],data:[]},s=qe(null==w?void 0:w.batch),r=qe(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,m=$e(t.env,p.env),S=(0,y.debounce)(async()=>{var o,s;const r=t.batches[k],i=r.batched;if(0===i.entries.length)return;const a={key:i.key,entries:i.entries,events:i.events,data:i.data};i.entries=[],i.events=[],i.data=[];const c=a.entries[0],l={collector:e,logger:v,id:n,config:p,data:void 0,rule:r.isDefault?void 0:c.rule,ingest:c.ingest,env:{...m,...c.respond?{respond:c.respond}:{}},reportError:N(e,"destination",n,v,t)};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=F(e,u),f=z(t.config.breaker),g=(0,y.stepId)("destination",u),h=t=>{f&&K(e.status.breakers,g,t,f.threshold,f.cooldown)},w=Date.now(),b=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"flush",eventId:"",now:w});b.batch={size:a.entries.length,index:0},(0,y.emitStep)(e,b);const S=n=>{var o;const s=t.dlq=t.dlq||[],r={max:null!=(o=t.config.dlqMax)?o:100};let i=0;for(const e of n)i+=$(s,e,r).dropped;if(i>0){const t=H(e.status,(0,y.stepId)("destination",u),"dlq",i);T(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&&P(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let I=a.entries.length;const C=be(p.timeout),q=await(0,y.tryCatchAsync)((o,s)=>Se(Promise.resolve((0,y.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,s)),C,`Destination "${n}" batch delivery timed out after ${C}ms`),t=>{I=0;const o=Date.now(),s=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-w,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},s.batch={size:a.entries.length,index:0},(0,y.emitStep)(e,s),S(a.entries.map(e=>[e.event,t])),h("transport-failure"),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if((0,y.isObject)(x=q)&&Array.isArray(x.failed)&&q.failed.length>0){const e=[],t=new Set;for(const n of q.failed){const s=a.entries[n.index];s&&!t.has(n.index)&&(t.add(n.index),e.push([s.event,null!=(o=n.error)?o:new Error(`Push batch entry ${n.index} failed (no per-row error provided)`)]))}e.length>0&&(S(e),I=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:I,entries:a.entries.length}))}var x;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),I>0&&(d.count+=I,d.lastAt=Date.now(),e.status.out+=I,h("success"))},{wait:f,size:g,age:h});t.batches[k]={batched:o,isDefault:!b,batchFn:()=>{S()},flush:async()=>{await S.flush()}}}const o=t.batches[k];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,m=F(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),Ie}{v.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}),r.inEvent=g.event,(0,y.emitStep)(e,r);try{const r=be(p.timeout),i=await Se(Promise.resolve((0,y.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m)),r,`Destination "${n}" delivery timed out after ${r}ms`),a=Date.now(),c=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"out",eventId:o,now:a});return c.durationMs=a-s,c.outEvent=g.event,(0,y.isDefined)(i)&&(c.meta={...c.meta,response:i}),g.mappingKey&&(c.mappingKey=g.mappingKey),(0,y.emitStep)(e,c),v.debug("push done"),i}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 De(e){return{ok:!(null==e?void 0:e.failed),...e}}function Ae(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=B(e,"before"),{config:a}=B({...e,config:i},"next"),c={...t.config,...n,...a};s&&(c.cache=s),void 0!==r&&void 0===c.state&&(c.state=r);const l=$e(t.env,o);return{...t,config:c,env:l}}function $e(e,t){return e||t?t?e&&(0,y.isObject)(e)&&(0,y.isObject)(t)?{...e,...t}:t:e:{}}async function Me(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};let l;try{await Promise.race([r(c),new Promise((n,o)=>{l=setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3)})])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}finally{l&&clearTimeout(l)}});await Promise.allSettled(o)}function Te(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Pe(e,t,n){let o,s,r=!1;const i=function(e){return e.cascade?()=>{}:(e.cascade={counts:new WeakMap},()=>{e.cascade=void 0})}(e);try{return await async function(){switch(t){case D.Config:(0,q.isObject)(n)&&((0,C.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case D.Consent:if((0,q.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);Te(e,D.Consent),s=t,r=!0}break;case D.Custom:(0,q.isObject)(n)&&(e.custom=(0,C.assign)(e.custom,n),Te(e,D.Custom),s=n,r=!0);break;case D.Destination:(0,q.isObject)(n)&&"code"in n&&(0,q.isObject)(n.code)&&(o=await async function(e,t){var n;const{code:o,config:s={},env:r={},before:i,next:a,cache:c,state:l}=t;if(!(0,y.isFunction)(o.push))return De({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=s||{init:!1};let d=i?{...u,before:i}:{...u};a&&(d={...d,next:a}),c&&(d={...d,cache:c}),void 0!==l&&void 0===d.state&&(d={...d,state:l});let f=d.id;if(!f)do{f=(0,y.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]||e.pending.destinations[f]);if(null==(n=d.require)?void 0:n.length){e.pending.destinations[f]=t,await ne(e);const n=e.destinations[f];return n?Oe(e,void 0,{},{[f]:n}):De({ok:!0})}const p={...o,config:d,env:$e(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),Oe(e,void 0,{},{[f]:p})}(e,n));break;case D.Globals:(0,q.isObject)(n)&&(e.globals=(0,C.assign)(e.globals,n),Te(e,D.Globals),s=n,r=!0);break;case D.Hook:if((0,q.isObject)(n)&&(0,C.isString)(n.name)&&(0,C.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case D.On:if((0,q.isObject)(n)&&(0,C.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){if(!oe(e))return void re();const o=e.on,s=o[t]||[],r=(0,w.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,me(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,C.assign)(e.consent,t.consent),Te(e,D.Consent)),t.user&&(e.user=(0,C.assign)(e.user,t.user),Te(e,D.User)),t.globals&&(e.globals=(0,C.assign)(e.config.globalsStatic||{},t.globals),Te(e,D.Globals)),t.custom&&(e.custom=(0,C.assign)(e.custom,t.custom),Te(e,D.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ne(e),await async function(e){if(oe(e))for(const t of ae){if(!le(e,t))continue;const n=ye(e,t);me(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))ee(s)&&await we(e,s,o,t,n)}else re()}(e),await Oe(e)}(e,n),r=!0;break;case D.Session:r=!0;break;case D.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await Me(e.sources,"source",t),await async function(e,t){const n=Object.entries(e).flatMap(([e,n])=>{const o=n.batches;if(!o)return[];const s=t.scope(n.type||"destination");return Object.values(o).map(async t=>{let n;try{await Promise.race([t.flush(),new Promise((t,o)=>{n=setTimeout(()=>o(new Error(`destination '${e}' batch flush timed out`)),5e3)})])}catch(t){s.error(`destination '${e}' batch flush failed: ${t}`)}finally{n&&clearTimeout(n)}})});await Promise.allSettled(n)}(e.destinations,t),await Me(e.destinations,"destination",t),await Me(e.transformers,"transformer",t),await Me(e.stores,"store",t)}(e));break;case D.User:(0,q.isObject)(n)&&((0,C.assign)(e.user,n,{shallow:!1}),Te(e,D.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;if(!oe(e))return re(),!0;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=ye(e,t,o);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&&(ee(o)?await we(e,o,n,t,a)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:a})))}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:a});ve(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))ee(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await Z(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!ee(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await ne(e),me(e,t,i,o),!c}(e,t,void 0,s),o=await Oe(e)),o||De({ok:!0})}()}finally{i()}}function _e(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.1-next-1781682752679"},...t}}function ze(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:l={},user:u=e.user,nested:d=[],consent:f=e.consent,id:p=(0,C.getSpanId)(),trigger:g="",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:p,trigger:g,entity:h,action:v,timestamp:s,timing:m,source:y}}function Ke(e,t){const n=(0,x.useHooks)(async(n,o={})=>await(0,x.tryCatchAsync)(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,v=null!=a?a:(0,x.createIngest)(i||"unknown");if(l){const t=await(0,x.processEventMapping)(g,l,e);if(t.ignore)return De({ok:!0});if(l.consent&&!(0,x.getGrantedConsent)(l.consent,e.consent,t.event.consent))return De({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Y(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return De({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),De({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=ze(e,o);return Oe(e,s,{id:i,ingest:v,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:De({ok:!0})}g=n.event}const m=function(e,t){return ze(e,_e(e,t))}(e,g),y=await Oe(e,m,{id:i,ingest:v,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 y},t=>{if(t instanceof x.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),De({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now(),i=A(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r});i.inEvent=t,(0,x.emitStep)(e,i);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,x.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,x.emitStep)(e,o),t}}}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 He(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,E.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,E.compileMatcher)(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),r=(0,E.readCacheEnvelope)(s);if(void 0!==r){if(!("expired"in r))return l.hits++,c(t,"hit"),r.value;try{await o.delete(n)}catch(e){g("delete",t,e)}}const i=p.get(n);if(i)return l.inflight_dedups++,c(t,"hit"),i;l.misses++,c(t,"miss");const a=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=f(t,s);if(r)try{const e=1e3*r.ttl;await o.set(n,(0,E.wrapCacheEnvelope)(s,e),e),l.populates++}catch(e){g("set",t,e)}return s}finally{p.delete(n)}})();return p.set(n,a),a},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=f(t,n);if(r)try{const e=1e3*r.ttl;await o.set(d(t),(0,E.wrapCacheEnvelope)(n,e),e)}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 Ne(e,t,n){const o=`store.${n}`,s=(0,j.useHooks)(t.get,"StoreGet",e.hooks,e.logger),r=(0,j.useHooks)(t.set,"StoreSet",e.hooks,e.logger),i=(0,j.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,j.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,j.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,j.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,j.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,j.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,j.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,j.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,j.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,j.emitStep)(e,i),s}}}async function Ue(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||{},observers:new Set,logger:r,on:{},queue:[],round:0,stateVersion:0,cellVersion:{},delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{},connectionErrors:{},breakers:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},hasShutdown:!1,seenEvents:new Set,push:void 0,command:void 0};var c,l;a.push=Ke(a,e=>_e(a,e)),a.command=(c=a,l=Pe,(0,O.useHooks)(async(e,t,n)=>await(0,O.tryCatchAsync)(async()=>await l(c,e,t,n),n=>{if(n instanceof O.FatalError)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),De({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,reportError:N(e,"store",n,a)},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]=He(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&&Ne(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]=Ae(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){var n,o,s,r,i,a,c,l;const u={};for(const[d,f]of Object.entries(t)){const{code:t,env:p={}}=f,g=(0,I.validateStepEntry)(f,"Transformer");if(!g.ok){e.logger.warn(`Transformer ${d} invalid (${g.code}): ${g.reason}. Skipping.`);continue}const{config:h}=B(f,"before"),{config:v}=B({...f,config:h},"next"),m=Object.keys(p).length>0?{...v,env:p}:v,{cache:y}=f,w=y?{...m,cache:y}:m,b=null!=(o=null==(n=f.config)?void 0:n.state)?o:f.state,k=void 0!==b&&void 0===w.state?{...w,state:b}:w,S=e.logger.scope("transformer").scope(d),C={collector:e,logger:S,id:d,ingest:(0,I.createIngest)(d),config:k,env:p,reportError:N(e,"transformer",d,S)},q=null!=t?t:e=>{const t=f.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 ${d}: \`${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})}},x=await q(C);void 0!==f.before&&void 0===(null==(s=x.config)?void 0:s.before)&&(x.config={...null!=(r=x.config)?r:{},before:f.before}),void 0!==f.next&&void 0===(null==(i=x.config)?void 0:i.next)&&(x.config={...null!=(a=x.config)?a:{},next:f.next}),void 0!==b&&void 0===(null==(c=x.config)?void 0:c.state)&&(x.config={...null!=(l=x.config)?l:{},state:b}),u[d]=x}return u}(a,e.transformers||{}),a}async function Re(e){e=e||{};const t=await Ue(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 De({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 te(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,S.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof S.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,ee(n)&&await Z(e,n,t))}return await ne(e),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&&await t.command("globals",i),a&&await t.command("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 Ge=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 Re({...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)}}}},Be=(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:()=>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:()=>Ge,step:()=>p,trigger:()=>Be});var p={};r(p,{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}}]]},v=require("@walkeros/core"),m=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"),E=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",Scoped:"_",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,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 M=new WeakMap;function T(e,t,n,o){M.get(e)||(M.set(e,!0),t.warn(n,o))}function P(e){M.delete(e)}var _=()=>Date.now();function z(e){var t,n;if(void 0!==e)return"number"==typeof e?{threshold:e,cooldown:3e4}:{threshold:null!=(t=e.threshold)?t:5,cooldown:null!=(n=e.cooldown)?n:3e4}}function K(e,t,n,o,s){if("partial"===n)return;const r=((i=e)[a=t]||(i[a]={state:"closed",consecutiveFailures:0}),i[a]);var i,a;return"success"===n?(r.consecutiveFailures=0,r.state="closed",r.probing=!1,void(r.openUntil=void 0)):(r.consecutiveFailures+=1,"half-open"===r.state?(r.state="open",r.probing=!1,void(r.openUntil=_()+s)):void(r.consecutiveFailures>=o&&(r.state="open",r.probing=!1,r.openUntil=_()+s)))}function F(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 H(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 N(e,t,n,o,s){const r=(0,k.stepId)(t,n);return(t,i)=>{var a;try{if(i)return s?function(e,t,n,o,s,r){var i;const a=t.dlq=t.dlq||[],c={max:null!=(i=t.config.dlqMax)?i:100},l=$(a,[o,s],c);if(l.dropped>0){const t=H(e.status,(0,k.stepId)("destination",n),"dlq",l.dropped);T(a,r,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:n,cap:c.max,droppedCount:t})}else a.length<c.max&&P(a);const u=F(e,n);u.failed++,u.dlqSize=a.length,e.status.failed++;const d=z(t.config.breaker);if(d){const o=t.config.id||n;K(e.status.breakers,(0,k.stepId)("destination",o),"transport-failure",d.threshold,d.cooldown)}}(e,s,n,i,t,o):e.status.failed++,void o.error("report error",{error:t instanceof Error?t.message:String(t),event:i.name});e.status.connectionErrors[r]=(null!=(a=e.status.connectionErrors[r])?a:0)+1,o.error("connection error",{error:t instanceof Error?t.message:String(t)})}catch(e){}}}function U(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function R(e,t){return e?t.stores[e]:t.stores.__cache}function G(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 B(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 V(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 W(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,S.createIngest)(n),config:t.config,env:Q(t.config.env),reportError:N(e,"transformer",n,s)};s.debug("init");const i=await(0,S.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 L(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Q(t.config.env),...r?{respond:r}:{}},reportError:N(e,"transformer",n,a)};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=A(e,{stepId:(0,S.stepId)("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});d.inEvent=o,(0,S.emitStep)(e,d);try{const s=await(0,S.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=A(e,{stepId:(0,S.stepId)("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:r});return i.durationMs=r-u,i.outEvent=s,(0,S.emitStep)(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=A(e,{stepId:(0,S.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,S.emitStep)(e,s),t}}function J(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,S.createIngest)(t)}async function Y(e,t,n,o,s,r,i){var a,c,l,u,d,f,p,g,h;s||(s=(0,S.createIngest)(null!=(a=n[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let v=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,S.tryCatchAsync)(W,t=>{if(t instanceof S.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}),v=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),v=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(f=r.config)?void 0:f.cache,y=a?(0,S.compileCache)(a):void 0,w=y?U(y,e):void 0,b=(null==(p=r.config)?void 0:p.state)?(0,S.compileState)(r.config.state):void 0,k=null==b?void 0:b.filter(e=>"get"===e.mode),I=null==b?void 0:b.filter(e=>"set"===e.mode),C=async t=>I&&0!==I.length?(0,S.applyState)(I,t=>R(t,e),t,e):t;let q;if(y&&w){const e=(0,S.buildCacheContext)(s,v),t=await(0,S.checkCache)(y,w,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(v=t.value,y.stop)return{event:v,respond:m,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(q={key:t.key,ttl:t.rule.ttl})}const x=r.config.before;if(x){const n=(0,S.getNextSteps)(x,(0,S.buildCacheContext)(s,v));if(1===n.length){const o=V(n[0],G(t));if(o.length>0){const n=await Y(e,t,o,v,s,m,i);if(null===n.event)return{event:null,respond:null!=(g=n.respond)?g:m};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(h=n.respond)?h:m,stopped:!0};n.respond&&(m=n.respond),v=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>(0,S.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),v,J(s,n),void 0,i)))}k&&k.length>0&&(v=await(0,S.applyState)(k,t=>R(t,e),v,e));const O=await(0,S.tryCatchAsync)(L,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,v,s,m);if(!1===O)return{event:null,respond:m};if(Array.isArray(O)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(O.map(async n=>{const o=await C(n.event||v),a=J(s,"unknown");if(n.next){const s=(0,S.getNextSteps)(n.next,(0,S.buildCacheContext)(a,o));if(0===s.length)return{event:o,respond:m};if(1===s.length){const n=V(s[0],G(t));return n.length>0?Y(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>(0,S.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),o,J(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Y(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(O&&"object"==typeof O){const{event:n,respond:o,next:r}=O;if(o&&(m=o),void 0!==r){const o=await C(n||v),a=(0,S.getNextSteps)(r,(0,S.buildCacheContext)(s,o));if(0===a.length){v=o;continue}if(1===a.length){const n=V(a[0],G(t));return n.length>0?Y(e,t,n,o,s,m,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:m})}return await Promise.all(a.map(n=>(0,S.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),o,J(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}I&&I.length>0&&(v=await(0,S.applyState)(I,t=>R(t,e),v,e)),q&&w&&(0,S.storeCache)(w,q.key,v,q.ttl);const j=r.config.next,E="string"==typeof j||Array.isArray(j)&&j.every(e=>"string"==typeof e),D=void 0!==j&&!E;if((!O||"object"==typeof O&&!O.next)&&D){const n=(0,S.getNextSteps)(r.config.next,(0,S.buildCacheContext)(s,v));if(1===n.length){const o=V(n[0],G(t));return o.length>0?Y(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>(0,S.tryCatchAsync)(Y,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,V(n,G(t)),v,J(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function Q(e){return e&&(0,S.isObject)(e)?e:{}}function X(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Z(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)ce(n)&&!pe(e,t,n)||(await(0,I.tryCatchAsync)(t.on,t=>{if(t instanceof I.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o),ce(n)&&fe(e,t,n))}function ee(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function te(e,t,n){var o,s;const{code:r,config:i={},env:a={},primary:c,next:l,before:u,cache:d}=n,f=null!=(o=i.state)?o:n.state,p=f?(0,I.compileState)(f):void 0,g=d,h=g?(0,I.compileCache)({...g,stop:null==(s=g.stop)||s}):void 0,v=X(l)?V(l,G(e.transformers)):void 0,m=X(u)?V(u,G(e.transformers)):void 0,y=a.push,w=null!=y?y:e.push,b=Boolean(y),k=async(n,o,s)=>{var r;let a;const c=null!=m?m:void 0!==u?(()=>{const t=(0,I.getNextSteps)(u,(0,I.buildCacheContext)(s.ingest));return 0===t.length?[]:V(1===t.length?t[0]:t,G(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Y(e,e.transformers,c,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(h){const t=U(h,e);if(t){const n=(0,I.buildCacheContext)(s.ingest),o=await(0,I.checkCache)(h,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&h.stop){let t=o.value;return o.rule.update&&(t=await(0,I.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(r=s.respond)||r.call(s,t),{ok:!0}}if("MISS"===o.status&&h.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,I.storeCache)(t,l,n,u),i?a=(async()=>{const t=await(0,I.applyUpdate)(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||(0,I.storeCache)(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=(0,I.getNextSteps)(l,(0,I.buildCacheContext)(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:V(t[0],G(e.transformers))}:{kind:"many",branches:t.map(t=>V(t,G(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>(0,I.applyState)(p,t=>R(t,e),t,e))));let g={ok:!0};for(const n of d)"many"===f.kind?(await Promise.all(f.branches.map((r,a)=>(0,I.tryCatchAsync)(async()=>b?w(n):w(n,{...o,id:t,ingest:J(s.ingest,`${t}.${a}`),respond:void 0,mapping:i,preChain:r}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),g={ok:!0}):g=b?await w(n):await w(n,{...o,id:t,ingest:s.ingest,respond:s.respond,mapping:i,preChain:f.preChain});return a&&await a,g},S=async n=>{const o=(0,I.createIngest)(t);if(!i.ingest||void 0===n)return o;const s=await(0,I.getMappingValue)(n,i.ingest,{collector:e});return{...o,...s,_meta:o._meta}},C=e.logger.scope("source").scope(t),q={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:C,...a,push:async(e,n={})=>{const o={ingest:(0,I.createIngest)(t),respond:void 0};return k(e,n,o)}},x={collector:e,logger:C,id:t,config:i,env:q,withScope:async(e,t,n)=>{const o={ingest:await S(e),respond:t};return n({...q,push:(e,t={})=>k(e,t,o),ingest:o.ingest,respond:o.respond})},reportError:N(e,"source",t,C)},O=await(0,I.tryCatchAsync)(r,n=>{if(n instanceof I.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(x);if(!O)return;const j=O.type||"unknown",E=e.logger.scope(j).scope(t);return q.logger=E,c&&(O.config={...O.config,primary:c}),O}async function ne(e){var t;for(const[t,n]of Object.entries(e.sources)){if(ee(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!ue(e,t));s.length!==o.length&&(n.config.require=s,ee(n)&&await Z(e,n,t))}for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=null==(t=o.config)?void 0:t.require;if(!s)continue;const r=s.filter(t=>!ue(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=Ae(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function oe(e){if("object"!=typeof e||null===e)return!1;if(!("logger"in e))return!1;const t=e.logger;return"object"==typeof t&&null!==t&&"scope"in t&&"function"==typeof t.scope}var se=!1;function re(){se||(se=!0,"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn("walkerOS: ignored an on-dispatch call with a non-collector argument"))}function ie(e,t,n,o){if(n instanceof w.FatalError)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}var ae=[D.Consent,D.User,D.Globals,D.Custom];function ce(e){return ae.includes(e)}function le(e,t){switch(t){case D.Consent:return Object.keys(e.consent).length>0;case D.User:return Object.keys(e.user).length>0;case D.Globals:return Object.keys(e.globals).length>0;case D.Custom:return Object.keys(e.custom).length>0;default:return!1}}function ue(e,t){switch(t){case D.Consent:case D.User:case D.Globals:case D.Custom:return le(e,t);case D.Run:case D.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function de(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function fe(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=de(e,n)}function pe(e,t,n){return e.allowed&&de(e,n)>function(e,t,n){const o=e.delivery.get(t),s=null==o?void 0:o[String(n)];return void 0===s?-1:s}(e,t,n)}function ge(e,t,n){const o=e.cascade;if(!o)return!0;let s=o.counts.get(t);s||(s={},o.counts.set(t,s));const r=String(n),i=(s[r]||0)+1;return s[r]=i,i<=8||(9===i&&e.logger.error("state delivery did not converge",{type:r}),!1)}function he(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ve(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:$e(t.env,t.config.env),reportError:N(e,"destination",n,i,t)};(0,b.tryCatch)(t.on,t=>ie(e,"destination",t,{destId:n,type:o}))(o,a)}function me(e,t,n,o){if(!oe(e))return void re();const s=ye(e,t,o);if(n.length)switch(t){case D.Consent:!function(e,t,n){const o=n||e.consent,s=he(e,D.Consent);t.forEach(t=>{pe(e,t,D.Consent)&&ge(e,t,D.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{(0,b.tryCatch)(t[n],t=>ie(e,"consent",t,{key:n}))(o,s)}),fe(e,t,D.Consent))})}(e,n,o);break;case D.Ready:!function(e,t){if(!e.allowed)return;const n=he(e,D.Ready);t.forEach(t=>{(0,b.tryCatch)(t,t=>ie(e,"ready",t))(void 0,n)})}(e,n);break;case D.Run:!function(e,t){if(!e.allowed)return;const n=he(e,D.Run);t.forEach(t=>{(0,b.tryCatch)(t,t=>ie(e,"run",t))(void 0,n)})}(e,n);break;case D.Session:!function(e,t){if(!e.session)return;const n=he(e,D.Session);t.forEach(t=>{(0,b.tryCatch)(t,t=>ie(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=he(e,t),r=ce(t);n.forEach(n=>{"function"==typeof n&&(r&&!pe(e,n,t)||r&&!ge(e,n,t)||((0,b.tryCatch)(n,n=>ie(e,"generic",n,{type:t}))(s,o),r&&fe(e,n,t)))});break}}}function ye(e,t,n){switch(t){case D.Consent:return n||e.consent;case D.Session:return e.session;case D.User:return n||e.user;case D.Custom:return n||e.custom;case D.Globals:return n||e.globals;case D.Config:return n||e.config;default:return}}async function we(e,t,n,o,s){if(!t.on)return!1;if(ce(o)&&!pe(e,t,o))return!1;if(ce(o)&&!ge(e,t,o))return!1;const r=await(0,b.tryCatchAsync)(t.on,t=>ie(e,"source",t,{sourceId:n,type:o}))(o,s);return ce(o)&&fe(e,t,o),!1===r}function be(e){return"number"==typeof e&&e>0?e:1e4}var ke=class extends Error{constructor(e){super(e),this.name="DestinationTimeoutError"}};function Ie(e,t,n){let o;const s=new Promise((e,s)=>{o=setTimeout(()=>s(new ke(n)),t)});return Promise.race([e,s]).finally(()=>{o&&clearTimeout(o)})}var Se=Object.freeze({batched:!0});function Ce(e){return e===Se}function qe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function xe(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return V(e,t);if("string"==typeof e)return V(e,t);const o=(0,y.getNextSteps)(e,(0,y.buildCacheContext)(n));return 0===o.length?[]:1===o.length?V(o[0],t):V(o,t)}async function Oe(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return De({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=$(e.queue,t,{max:n});if(o.dropped>0){const t=H(e.status,(0,y.stepId)("collector"),"queue",o.dropped);T(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&P(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?G(e.transformers):{},h=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};const u=s.config.id||o,h=(0,y.stepId)("destination",u),v=z(s.config.breaker);if(v&&function(e,t,n){const o=e[t];if(!o||"closed"===o.state)return!1;if("half-open"===o.state)return!0===o.probing;const s=_();return void 0!==o.openUntil&&s<o.openUntil||(o.state="half-open",o.probing=!0,o.openUntil=s+n,!1)}(e.status.breakers,h,v.cooldown))return{id:o,destination:s,skipped:!0};const m=t=>{v&&K(e.status.breakers,h,t,v.threshold,v.cooldown)},w=()=>{v&&function(e,t){const n=e[t];n&&"half-open"===n.state&&!0===n.probing&&(n.state="open",n.probing=!1)}(e.status.breakers,h)};let b=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&b.push((0,y.clone)(t));const k=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,y.createIngest)("unknown");if(!b.length&&!(null==(r=s.queueOn)?void 0:r.length))return w(),{id:o,destination:s,skipped:!0};if(!b.length&&(null==(i=s.queueOn)?void 0:i.length)){if(!(0,y.getGrantedConsent)(s.config.consent,d))return w(),{id:o,destination:s,skipped:!0};let t=!1;try{t=await je(e,s,o,!0)}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)}),m("transport-failure")}return w(),{id:o,destination:s,skipped:!t}}const I=[],S=b.filter(t=>{const n=(0,y.getGrantedConsent)(s.config.consent,d,t.consent);if(n)return t.consent=n,I.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(S.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 S)i+=$(t,e,r).dropped;if(i>0){F(e,n);const o=H(e.status,(0,y.stepId)("destination",n),"queue",i);T(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&&P(t)}if(!I.length)return w(),{id:o,destination:s,queue:b};let C,q,x=!1;try{x=await je(e,s,o,!0)}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)}),m("transport-failure")}if(!x)return w(),{id:o,destination:s,queue:b};s.dlq||(s.dlq=[]);const O=xe(s.config.before,g,k),j=s.config.next,E=null==(c=s.config)?void 0:c.cache,D=E?(0,y.compileCache)(E):void 0,M=D?U(D,e):void 0,N=(null==(l=s.config)?void 0:l.state)?(0,y.compileState)(s.config.state):void 0,G=null==N?void 0:N.filter(e=>"get"===e.mode),B=null==N?void 0:N.filter(e=>"set"===e.mode);let V=0,W=0;return await Promise.all(I.map(async t=>{let r;if(t.globals=(0,y.assign)(f,t.globals),t.user=(0,y.assign)(p,t.user),(null==D?void 0:D.stop)&&M){const e=(0,y.buildCacheContext)(k,t),n=await(0,y.checkCache)(D,M,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(O.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Y(e,e.transformers,O,t,k,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(D&&!D.stop&&M){const e=(0,y.buildCacheContext)(k,i),n=await(0,y.checkCache)(D,M,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})}G&&G.length>0&&i&&(i=await(0,y.applyState)(G,t=>R(t,e),i,e));const c=Date.now();let l=!1;const u=await(0,y.tryCatchAsync)(Ee,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),C=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=$(a,[i,t],u);if(d.dropped>0){F(e,c);const t=H(e.status,(0,y.stepId)("destination",c),"dlq",d.dropped);T(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&&P(a)})(e,s,o,i,k,a);if(V+=Date.now()-c,r&&M&&void 0===s.config.mock&&(0,y.storeCache)(M,r.key,null==u||u,r.ttl),!l&&!Ce(u)&&B&&B.length>0&&i&&(i=await(0,y.applyState)(B,t=>R(t,e),i,e)),void 0===u||Ce(u)||(q=u),Ce(u)&&W++,!l&&j){void 0!==u&&(k._response=u);const t=xe(j,g,k);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Y(e,e.transformers,t,i,k,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:C,response:q,totalDuration:V,batchedCount:W,allowedCount:I.length,canonicalId:u,breakerConfig:v}})),v={},m={},w={};for(const t of h){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};F(e,t.id);const u=e.status.destinations[t.id],d=Date.now();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;const f=t.breakerConfig,p=t.canonicalId?(0,y.stepId)("destination",t.canonicalId):void 0,g=t=>{f&&p&&K(e.status.breakers,p,t,f.threshold,f.cooldown)};if(t.error)o.error=t.error,w[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++,g("transport-failure");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++,g("success"))}}return De({event:t,...Object.keys(v).length&&{done:v},...Object.keys(m).length&&{queued:m},...Object.keys(w).length&&{failed:w}})}async function je(e,t,n,o=!1){var s;if(t.init&&!t.config.init){if(!o&&function(e){const t=e.config.consent;return!!t&&Object.keys(t).length>0}(t))return e.logger.scope(t.type||"unknown").debug("init blocked: consent gate not cleared"),!1;const r=t.type||"unknown",i=e.logger.scope(r),a={collector:e,logger:i,id:n,config:t.config,env:$e(t.env,t.config.env),reportError:N(e,"destination",n,i,t)};i.debug("init");const c=Date.now();let l;(0,y.emitStep)(e,A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"init",eventId:"",now:c}));try{l=await(0,y.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(a)}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-c,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,y.emitStep)(e,s),t}if(!1===l)return l;if(t.config={...l||t.config,init:!0},null==(s=t.queueOn)?void 0:s.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)ve(e,t,n,s,r)}i.debug("init done")}return!0}async function Ee(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:p}=t,g=await(0,y.processEventMapping)(o,p,e);if(g.ignore)return!1;const h=t.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:n,config:p,data:g.data,rule:g.mapping,ingest:s,env:{...$e(t.env,p.env),...r?{respond:r}:{}},reportError:N(e,"destination",n,v,t)};if(void 0!==p.mock)return v.debug("mock",{event:g.event.name}),p.mock;const w=g.mapping,b=void 0!==(null==w?void 0:w.batch),k=b?g.mappingKey||"* *":" batch-all";if((b||void 0!==p.batch)&&t.pushBatch&&void 0===p.mock){if(t.batches=t.batches||{},!t.batches[k]){const o={key:k,entries:[],events:[],data:[]},s=qe(null==w?void 0:w.batch),r=qe(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,m=$e(t.env,p.env),I=(0,y.debounce)(async()=>{var o,s;const r=t.batches[k],i=r.batched;if(0===i.entries.length)return;const a={key:i.key,entries:i.entries,events:i.events,data:i.data};i.entries=[],i.events=[],i.data=[];const c=a.entries[0],l={collector:e,logger:v,id:n,config:p,data:void 0,rule:r.isDefault?void 0:c.rule,ingest:c.ingest,env:{...m,...c.respond?{respond:c.respond}:{}},reportError:N(e,"destination",n,v,t)};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=F(e,u),f=z(t.config.breaker),g=(0,y.stepId)("destination",u),h=t=>{f&&K(e.status.breakers,g,t,f.threshold,f.cooldown)},w=Date.now(),b=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"flush",eventId:"",now:w});b.batch={size:a.entries.length,index:0},(0,y.emitStep)(e,b);const I=n=>{var o;const s=t.dlq=t.dlq||[],r={max:null!=(o=t.config.dlqMax)?o:100};let i=0;for(const e of n)i+=$(s,e,r).dropped;if(i>0){const t=H(e.status,(0,y.stepId)("destination",u),"dlq",i);T(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&&P(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let S=a.entries.length;const C=be(p.timeout),q=await(0,y.tryCatchAsync)((o,s)=>Ie(Promise.resolve((0,y.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,s)),C,`Destination "${n}" batch delivery timed out after ${C}ms`),t=>{S=0;const o=Date.now(),s=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-w,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},s.batch={size:a.entries.length,index:0},(0,y.emitStep)(e,s),I(a.entries.map(e=>[e.event,t])),h("transport-failure"),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if((0,y.isObject)(x=q)&&Array.isArray(x.failed)&&q.failed.length>0){const e=[],t=new Set;for(const n of q.failed){const s=a.entries[n.index];s&&!t.has(n.index)&&(t.add(n.index),e.push([s.event,null!=(o=n.error)?o:new Error(`Push batch entry ${n.index} failed (no per-row error provided)`)]))}e.length>0&&(I(e),S=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:S,entries:a.entries.length}))}var x;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),S>0&&(d.count+=S,d.lastAt=Date.now(),e.status.out+=S,h("success"))},{wait:f,size:g,age:h});t.batches[k]={batched:o,isDefault:!b,batchFn:()=>{I()},flush:async()=>{await I.flush()}}}const o=t.batches[k];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,m=F(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),Se}{v.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}),r.inEvent=g.event,(0,y.emitStep)(e,r);try{const r=be(p.timeout),i=await Ie(Promise.resolve((0,y.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m)),r,`Destination "${n}" delivery timed out after ${r}ms`),a=Date.now(),c=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"out",eventId:o,now:a});return c.durationMs=a-s,c.outEvent=g.event,(0,y.isDefined)(i)&&(c.meta={...c.meta,response:i}),g.mappingKey&&(c.mappingKey=g.mappingKey),(0,y.emitStep)(e,c),v.debug("push done"),i}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 De(e){return{ok:!(null==e?void 0:e.failed),...e}}function Ae(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=B(e,"before"),{config:a}=B({...e,config:i},"next"),c={...t.config,...n,...a};s&&(c.cache=s),void 0!==r&&void 0===c.state&&(c.state=r);const l=$e(t.env,o);return{...t,config:c,env:l}}function $e(e,t){return e||t?t?e&&(0,y.isObject)(e)&&(0,y.isObject)(t)?{...e,...t}:t:e:{}}async function Me(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};let l;try{await Promise.race([r(c),new Promise((n,o)=>{l=setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3)})])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}finally{l&&clearTimeout(l)}});await Promise.allSettled(o)}function Te(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Pe(e,t,n){let o,s,r=!1;const i=function(e){return e.cascade?()=>{}:(e.cascade={counts:new WeakMap},()=>{e.cascade=void 0})}(e);try{return await async function(){switch(t){case D.Config:(0,q.isObject)(n)&&((0,C.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case D.Consent:if((0,q.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);Te(e,D.Consent),s=t,r=!0}break;case D.Custom:(0,q.isObject)(n)&&(e.custom=(0,C.assign)(e.custom,n),Te(e,D.Custom),s=n,r=!0);break;case D.Destination:(0,q.isObject)(n)&&"code"in n&&(0,q.isObject)(n.code)&&(o=await async function(e,t){var n;const{code:o,config:s={},env:r={},before:i,next:a,cache:c,state:l}=t;if(!(0,y.isFunction)(o.push))return De({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=s||{init:!1};let d=i?{...u,before:i}:{...u};a&&(d={...d,next:a}),c&&(d={...d,cache:c}),void 0!==l&&void 0===d.state&&(d={...d,state:l});let f=d.id;if(!f)do{f=(0,y.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]||e.pending.destinations[f]);if(null==(n=d.require)?void 0:n.length){e.pending.destinations[f]=t,await ne(e);const n=e.destinations[f];return n?Oe(e,void 0,{},{[f]:n}):De({ok:!0})}const p={...o,config:d,env:$e(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),Oe(e,void 0,{},{[f]:p})}(e,n));break;case D.Globals:(0,q.isObject)(n)&&(e.globals=(0,C.assign)(e.globals,n),Te(e,D.Globals),s=n,r=!0);break;case D.Hook:if((0,q.isObject)(n)&&(0,C.isString)(n.name)&&(0,C.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case D.On:if((0,q.isObject)(n)&&(0,C.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){if(!oe(e))return void re();const o=e.on,s=o[t]||[],r=(0,w.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,me(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(),e.trace=(0,C.getTraceId)(),e.count=0,t&&(t.consent&&(e.consent=(0,C.assign)(e.consent,t.consent),Te(e,D.Consent)),t.user&&(e.user=(0,C.assign)(e.user,t.user),Te(e,D.User)),t.globals&&(e.globals=(0,C.assign)(e.config.globalsStatic||{},t.globals),Te(e,D.Globals)),t.custom&&(e.custom=(0,C.assign)(e.custom,t.custom),Te(e,D.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ne(e),await async function(e){if(oe(e))for(const t of ae){if(!le(e,t))continue;const n=ye(e,t);me(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))ee(s)&&await we(e,s,o,t,n)}else re()}(e),await Oe(e)}(e,n),r=!0;break;case D.Session:r=!0;break;case D.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await Me(e.sources,"source",t),await async function(e,t){const n=Object.entries(e).flatMap(([e,n])=>{const o=n.batches;if(!o)return[];const s=t.scope(n.type||"destination");return Object.values(o).map(async t=>{let n;try{await Promise.race([t.flush(),new Promise((t,o)=>{n=setTimeout(()=>o(new Error(`destination '${e}' batch flush timed out`)),5e3)})])}catch(t){s.error(`destination '${e}' batch flush failed: ${t}`)}finally{n&&clearTimeout(n)}})});await Promise.allSettled(n)}(e.destinations,t),await Me(e.destinations,"destination",t),await Me(e.transformers,"transformer",t),await Me(e.stores,"store",t)}(e));break;case D.User:(0,q.isObject)(n)&&((0,C.assign)(e.user,n,{shallow:!1}),Te(e,D.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;if(!oe(e))return re(),!0;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=ye(e,t,o);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&&(ee(o)?await we(e,o,n,t,a)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:a})))}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:a});ve(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))ee(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await Z(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!ee(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await ne(e),me(e,t,i,o),!c}(e,t,void 0,s),o=await Oe(e)),o||De({ok:!0})}()}finally{i()}}function _e(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.1"},...t}}function ze(e,t){var n,o;if(!t.name)throw new Error("Event name is required");const[s,r]=t.name.split(" ");if(!s||!r)throw new Error("Event name is invalid");const{timestamp:i=Date.now(),name:a=`${s} ${r}`,data:c={},context:l={},globals:u=e.globals,custom:d={},user:f=e.user,nested:p=[],consent:g=e.consent,id:h=(0,C.getSpanId)(),trigger:v="",entity:m=s,action:y=r,timing:w=0,source:b={type:"collector",schema:"4"}}=t,k=null!=(n=b.count)?n:e.count+=1,I=null!=(o=b.trace)?o:e.trace,S={...b,count:k};return void 0!==I&&(S.trace=I),{name:a,data:c,context:l,globals:u,custom:d,user:f,nested:p,consent:g,id:h,trigger:v,entity:m,action:y,timestamp:i,timing:w,source:S}}function Ke(e,t){const n=(0,x.useHooks)(async(n,o={})=>await(0,x.tryCatchAsync)(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,v=null!=a?a:(0,x.createIngest)(i||"unknown");if(l){const t=await(0,x.processEventMapping)(g,l,e);if(t.ignore)return De({ok:!0});if(l.consent&&!(0,x.getGrantedConsent)(l.consent,e.consent,t.event.consent))return De({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Y(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return De({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),De({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=ze(e,o);return Oe(e,s,{id:i,ingest:v,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:De({ok:!0})}g=n.event}const m=function(e,t){return ze(e,_e(e,t))}(e,g),y=await Oe(e,m,{id:i,ingest:v,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 y},t=>{if(t instanceof x.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),De({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now(),i=A(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r});i.inEvent=t,(0,x.emitStep)(e,i);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,x.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,x.emitStep)(e,o),t}}}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 He(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,E.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,E.compileMatcher)(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),r=(0,E.readCacheEnvelope)(s);if(void 0!==r){if(!("expired"in r))return l.hits++,c(t,"hit"),r.value;try{await o.delete(n)}catch(e){g("delete",t,e)}}const i=p.get(n);if(i)return l.inflight_dedups++,c(t,"hit"),i;l.misses++,c(t,"miss");const a=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=f(t,s);if(r)try{const e=1e3*r.ttl;await o.set(n,(0,E.wrapCacheEnvelope)(s,e),e),l.populates++}catch(e){g("set",t,e)}return s}finally{p.delete(n)}})();return p.set(n,a),a},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=f(t,n);if(r)try{const e=1e3*r.ttl;await o.set(d(t),(0,E.wrapCacheEnvelope)(n,e),e)}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 Ne(e,t,n){const o=`store.${n}`,s=(0,j.useHooks)(t.get,"StoreGet",e.hooks,e.logger),r=(0,j.useHooks)(t.set,"StoreSet",e.hooks,e.logger),i=(0,j.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,j.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,j.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,j.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,j.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,j.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,j.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,j.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,j.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,j.emitStep)(e,i),s}}}async function Ue(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||{},observers:new Set,logger:r,on:{},queue:[],round:0,count:0,stateVersion:0,cellVersion:{},delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{},connectionErrors:{},breakers:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},hasShutdown:!1,seenEvents:new Set,push:void 0,command:void 0};var c,l;a.push=Ke(a,e=>_e(a,e)),a.command=(c=a,l=Pe,(0,O.useHooks)(async(e,t,n)=>await(0,O.tryCatchAsync)(async()=>await l(c,e,t,n),n=>{if(n instanceof O.FatalError)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),De({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,reportError:N(e,"store",n,a)},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]=He(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&&Ne(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]=Ae(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){var n,o,s,r,i,a,c,l;const u={};for(const[d,f]of Object.entries(t)){const{code:t,env:p={}}=f,g=(0,S.validateStepEntry)(f,"Transformer");if(!g.ok){e.logger.warn(`Transformer ${d} invalid (${g.code}): ${g.reason}. Skipping.`);continue}const{config:h}=B(f,"before"),{config:v}=B({...f,config:h},"next"),m=Object.keys(p).length>0?{...v,env:p}:v,{cache:y}=f,w=y?{...m,cache:y}:m,b=null!=(o=null==(n=f.config)?void 0:n.state)?o:f.state,k=void 0!==b&&void 0===w.state?{...w,state:b}:w,I=e.logger.scope("transformer").scope(d),C={collector:e,logger:I,id:d,ingest:(0,S.createIngest)(d),config:k,env:p,reportError:N(e,"transformer",d,I)},q=null!=t?t:e=>{const t=f.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 ${d}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await(0,S.processEventMapping)(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},x=await q(C);void 0!==f.before&&void 0===(null==(s=x.config)?void 0:s.before)&&(x.config={...null!=(r=x.config)?r:{},before:f.before}),void 0!==f.next&&void 0===(null==(i=x.config)?void 0:i.next)&&(x.config={...null!=(a=x.config)?a:{},next:f.next}),void 0!==b&&void 0===(null==(c=x.config)?void 0:c.state)&&(x.config={...null!=(l=x.config)?l:{},state:b}),u[d]=x}return u}(a,e.transformers||{}),a}async function Re(e){e=e||{};const t=await Ue(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 De({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 te(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,I.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof I.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,ee(n)&&await Z(e,n,t))}return await ne(e),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&&await t.command("globals",i),a&&await t.command("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 Ge=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 Re({...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)}}}},Be=(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,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:()=>Qt,step:()=>l,trigger:()=>Xt});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 v,clone as m,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 C,isFunction as E,isObject as D,processEventMapping as j,stepId as $,tryCatchAsync as A,useHooks as M,compileState as T,applyState as _}from"@walkeros/core";import{emitStep as P}from"@walkeros/core";import{isArray as K,FatalError as z}from"@walkeros/core";import{tryCatch as F,tryCatchAsync as U}from"@walkeros/core";import{stepId as R}from"@walkeros/core";import{createIngest as H,FatalError as N,getMappingValue as B,tryCatchAsync as G,getNextSteps as V,compileCache as W,checkCache as L,storeCache as J,applyUpdate as Y,buildCacheContext as Q,compileState as X,applyState as Z}from"@walkeros/core";import{createIngest as ee,emitStep as te,FatalError as ne,isObject as oe,stepId as se,tryCatchAsync as re,useHooks as ie,getNextSteps as ae,compileCache as ce,checkCache as le,storeCache as ue,buildCacheContext as de,validateStepEntry as fe,processEventMapping as pe,compileState as ge,applyState as he}from"@walkeros/core";import{assign as ve,getSpanId as me,isFunction as ye,isString as we}from"@walkeros/core";import{isObject as be}from"@walkeros/core";import{createIngest as ke,emitStep as Ie,FatalError as Se,getGrantedConsent as qe,processEventMapping as xe,tryCatchAsync as Oe,useHooks as Ce}from"@walkeros/core";import{FatalError as Ee,useHooks as De,tryCatchAsync as je}from"@walkeros/core";import{emitStep as $e,useHooks as Ae}from"@walkeros/core";import{compileMatcher as Me,emitStep as Te,readCacheEnvelope as _e,wrapCacheEnvelope as Pe}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",Scoped:"_",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function ze(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 Fe(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 Ue=new WeakMap;function Re(e,t,n,o){Ue.get(e)||(Ue.set(e,!0),t.warn(n,o))}function He(e){Ue.delete(e)}var Ne=()=>Date.now();function Be(e){var t,n;if(void 0!==e)return"number"==typeof e?{threshold:e,cooldown:3e4}:{threshold:null!=(t=e.threshold)?t:5,cooldown:null!=(n=e.cooldown)?n:3e4}}function Ge(e,t,n,o,s){if("partial"===n)return;const r=((i=e)[a=t]||(i[a]={state:"closed",consecutiveFailures:0}),i[a]);var i,a;return"success"===n?(r.consecutiveFailures=0,r.state="closed",r.probing=!1,void(r.openUntil=void 0)):(r.consecutiveFailures+=1,"half-open"===r.state?(r.state="open",r.probing=!1,void(r.openUntil=Ne()+s)):void(r.consecutiveFailures>=o&&(r.state="open",r.probing=!1,r.openUntil=Ne()+s)))}function Ve(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 We(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 Le(e,t,n,o,s){const r=R(t,n);return(t,i)=>{var a;try{if(i)return s?function(e,t,n,o,s,r){var i;const a=t.dlq=t.dlq||[],c={max:null!=(i=t.config.dlqMax)?i:100},l=Fe(a,[o,s],c);if(l.dropped>0){const t=We(e.status,R("destination",n),"dlq",l.dropped);Re(a,r,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:n,cap:c.max,droppedCount:t})}else a.length<c.max&&He(a);const u=Ve(e,n);u.failed++,u.dlqSize=a.length,e.status.failed++;const d=Be(t.config.breaker);if(d){const o=t.config.id||n;Ge(e.status.breakers,R("destination",o),"transport-failure",d.threshold,d.cooldown)}}(e,s,n,i,t,o):e.status.failed++,void o.error("reportError",{error:t instanceof Error?t.message:String(t),event:i.name});e.status.connectionErrors[r]=(null!=(a=e.status.connectionErrors[r])?a:0)+1,o.error("connection error",{error:t instanceof Error?t.message:String(t)})}catch(e){}}}function Je(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Ye(e,t){return e?t.stores[e]:t.stores.__cache}function Qe(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 Xe(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 Ze(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 et(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:ee(n),config:t.config,env:st(t.config.env),reportError:Le(e,"transformer",n,s)};s.debug("init");const i=await ie(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 tt(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:{...st(t.config.env),...r?{respond:r}:{}},reportError:Le(e,"transformer",n,a)};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=ze(e,{stepId:se("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});d.inEvent=o,te(e,d);try{const s=await ie(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=ze(e,{stepId:se("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:r});return i.durationMs=r-u,i.outEvent=s,te(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=ze(e,{stepId:se("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)},te(e,s),t}}function nt(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:ee(t)}async function ot(e,t,n,o,s,r,i){var a,c,l,u,d,f,p,g,h;s||(s=ee(null!=(a=n[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let v=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 re(et,t=>{if(t instanceof ne)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}),v=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),v=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(f=r.config)?void 0:f.cache,y=a?ce(a):void 0,w=y?Je(y,e):void 0,b=(null==(p=r.config)?void 0:p.state)?ge(r.config.state):void 0,k=null==b?void 0:b.filter(e=>"get"===e.mode),I=null==b?void 0:b.filter(e=>"set"===e.mode),S=async t=>I&&0!==I.length?he(I,t=>Ye(t,e),t,e):t;let q;if(y&&w){const e=de(s,v),t=await le(y,w,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(v=t.value,y.stop)return{event:v,respond:m,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(q={key:t.key,ttl:t.rule.ttl})}const x=r.config.before;if(x){const n=ae(x,de(s,v));if(1===n.length){const o=Ze(n[0],Qe(t));if(o.length>0){const n=await ot(e,t,o,v,s,m,i);if(null===n.event)return{event:null,respond:null!=(g=n.respond)?g:m};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(h=n.respond)?h:m,stopped:!0};n.respond&&(m=n.respond),v=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>re(ot,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ze(n,Qe(t)),v,nt(s,n),void 0,i)))}k&&k.length>0&&(v=await he(k,t=>Ye(t,e),v,e));const O=await re(tt,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,v,s,m);if(!1===O)return{event:null,respond:m};if(Array.isArray(O)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(O.map(async n=>{const o=await S(n.event||v),a=nt(s,"unknown");if(n.next){const s=ae(n.next,de(a,o));if(0===s.length)return{event:o,respond:m};if(1===s.length){const n=Ze(s[0],Qe(t));return n.length>0?ot(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>re(ot,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ze(n,Qe(t)),o,nt(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?ot(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(O&&"object"==typeof O){const{event:n,respond:o,next:r}=O;if(o&&(m=o),void 0!==r){const o=await S(n||v),a=ae(r,de(s,o));if(0===a.length){v=o;continue}if(1===a.length){const n=Ze(a[0],Qe(t));return n.length>0?ot(e,t,n,o,s,m,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:m})}return await Promise.all(a.map(n=>re(ot,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ze(n,Qe(t)),o,nt(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}I&&I.length>0&&(v=await he(I,t=>Ye(t,e),v,e)),q&&w&&ue(w,q.key,v,q.ttl);const C=r.config.next,E="string"==typeof C||Array.isArray(C)&&C.every(e=>"string"==typeof e),D=void 0!==C&&!E;if((!O||"object"==typeof O&&!O.next)&&D){const n=ae(r.config.next,de(s,v));if(1===n.length){const o=Ze(n[0],Qe(t));return o.length>0?ot(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>re(ot,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ze(n,Qe(t)),v,nt(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function st(e){return e&&oe(e)?e:{}}function rt(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function it(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)ht(n)&&!bt(e,t,n)||(await G(t.on,t=>{if(t instanceof N)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o),ht(n)&&wt(e,t,n))}function at(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function ct(e,t,n){var o,s;const{code:r,config:i={},env:a={},primary:c,next:l,before:u,cache:d}=n,f=null!=(o=i.state)?o:n.state,p=f?X(f):void 0,g=d,h=g?W({...g,stop:null==(s=g.stop)||s}):void 0,v=rt(l)?Ze(l,Qe(e.transformers)):void 0,m=rt(u)?Ze(u,Qe(e.transformers)):void 0,y=a.push,w=null!=y?y:e.push,b=Boolean(y),k=async(n,o,s)=>{var r;let a;const c=null!=m?m:void 0!==u?(()=>{const t=V(u,Q(s.ingest));return 0===t.length?[]:Ze(1===t.length?t[0]:t,Qe(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await ot(e,e.transformers,c,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(h){const t=Je(h,e);if(t){const n=Q(s.ingest),o=await L(h,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&h.stop){let t=o.value;return o.rule.update&&(t=await Y(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(r=s.respond)||r.call(s,t),{ok:!0}}if("MISS"===o.status&&h.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=>{J(t,l,n,u),i?a=(async()=>{const t=await Y(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||J(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=V(l,Q(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Ze(t[0],Qe(e.transformers))}:{kind:"many",branches:t.map(t=>Ze(t,Qe(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>Z(p,t=>Ye(t,e),t,e))));let g={ok:!0};for(const n of d)"many"===f.kind?(await Promise.all(f.branches.map((r,a)=>G(async()=>b?w(n):w(n,{...o,id:t,ingest:nt(s.ingest,`${t}.${a}`),respond:void 0,mapping:i,preChain:r}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),g={ok:!0}):g=b?await w(n):await w(n,{...o,id:t,ingest:s.ingest,respond:s.respond,mapping:i,preChain:f.preChain});return a&&await a,g},I=async n=>{const o=H(t);if(!i.ingest||void 0===n)return o;const s=await B(n,i.ingest,{collector:e});return{...o,...s,_meta:o._meta}},S=e.logger.scope("source").scope(t),q={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:S,...a,push:async(e,n={})=>{const o={ingest:H(t),respond:void 0};return k(e,n,o)}},x={collector:e,logger:S,id:t,config:i,env:q,withScope:async(e,t,n)=>{const o={ingest:await I(e),respond:t};return n({...q,push:(e,t={})=>k(e,t,o),ingest:o.ingest,respond:o.respond})},reportError:Le(e,"source",t,S)},O=await G(r,n=>{if(n instanceof N)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(x);if(!O)return;const C=O.type||"unknown",E=e.logger.scope(C).scope(t);return q.logger=E,c&&(O.config={...O.config,primary:c}),O}async function lt(e){var t;for(const[t,n]of Object.entries(e.sources)){if(at(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!mt(e,t));s.length!==o.length&&(n.config.require=s,at(n)&&await it(e,n,t))}for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=null==(t=o.config)?void 0:t.require;if(!s)continue;const r=s.filter(t=>!mt(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=zt(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function ut(e){if("object"!=typeof e||null===e)return!1;if(!("logger"in e))return!1;const t=e.logger;return"object"==typeof t&&null!==t&&"scope"in t&&"function"==typeof t.scope}var dt=!1;function ft(){dt||(dt=!0,"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn("walkerOS: ignored an on-dispatch call with a non-collector argument"))}function pt(e,t,n,o){if(n instanceof z)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}var gt=[Ke.Consent,Ke.User,Ke.Globals,Ke.Custom];function ht(e){return gt.includes(e)}function vt(e,t){switch(t){case Ke.Consent:return Object.keys(e.consent).length>0;case Ke.User:return Object.keys(e.user).length>0;case Ke.Globals:return Object.keys(e.globals).length>0;case Ke.Custom:return Object.keys(e.custom).length>0;default:return!1}}function mt(e,t){switch(t){case Ke.Consent:case Ke.User:case Ke.Globals:case Ke.Custom:return vt(e,t);case Ke.Run:case Ke.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function yt(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function wt(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=yt(e,n)}function bt(e,t,n){return e.allowed&&yt(e,n)>function(e,t,n){const o=e.delivery.get(t),s=null==o?void 0:o[String(n)];return void 0===s?-1:s}(e,t,n)}function kt(e,t,n){const o=e.cascade;if(!o)return!0;let s=o.counts.get(t);s||(s={},o.counts.set(t,s));const r=String(n),i=(s[r]||0)+1;return s[r]=i,i<=8||(9===i&&e.logger.error("state delivery did not converge",{type:r}),!1)}function It(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function St(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:Ft(t.env,t.config.env),reportError:Le(e,"destination",n,i,t)};F(t.on,t=>pt(e,"destination",t,{destId:n,type:o}))(o,a)}function qt(e,t,n,o){if(!ut(e))return void ft();const s=xt(e,t,o);if(n.length)switch(t){case Ke.Consent:!function(e,t,n){const o=n||e.consent,s=It(e,Ke.Consent);t.forEach(t=>{bt(e,t,Ke.Consent)&&kt(e,t,Ke.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{F(t[n],t=>pt(e,"consent",t,{key:n}))(o,s)}),wt(e,t,Ke.Consent))})}(e,n,o);break;case Ke.Ready:!function(e,t){if(!e.allowed)return;const n=It(e,Ke.Ready);t.forEach(t=>{F(t,t=>pt(e,"ready",t))(void 0,n)})}(e,n);break;case Ke.Run:!function(e,t){if(!e.allowed)return;const n=It(e,Ke.Run);t.forEach(t=>{F(t,t=>pt(e,"run",t))(void 0,n)})}(e,n);break;case Ke.Session:!function(e,t){if(!e.session)return;const n=It(e,Ke.Session);t.forEach(t=>{F(t,t=>pt(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=It(e,t),r=ht(t);n.forEach(n=>{"function"==typeof n&&(r&&!bt(e,n,t)||r&&!kt(e,n,t)||(F(n,n=>pt(e,"generic",n,{type:t}))(s,o),r&&wt(e,n,t)))});break}}}function xt(e,t,n){switch(t){case Ke.Consent:return n||e.consent;case Ke.Session:return e.session;case Ke.User:return n||e.user;case Ke.Custom:return n||e.custom;case Ke.Globals:return n||e.globals;case Ke.Config:return n||e.config;default:return}}async function Ot(e,t,n,o,s){if(!t.on)return!1;if(ht(o)&&!bt(e,t,o))return!1;if(ht(o)&&!kt(e,t,o))return!1;const r=await U(t.on,t=>pt(e,"source",t,{sourceId:n,type:o}))(o,s);return ht(o)&&wt(e,t,o),!1===r}function Ct(e){return"number"==typeof e&&e>0?e:1e4}var Et=class extends Error{constructor(e){super(e),this.name="DestinationTimeoutError"}};function Dt(e,t,n){let o;const s=new Promise((e,s)=>{o=setTimeout(()=>s(new Et(n)),t)});return Promise.race([e,s]).finally(()=>{o&&clearTimeout(o)})}var jt=Object.freeze({batched:!0});function $t(e){return e===jt}function At(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function Mt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Ze(e,t);if("string"==typeof e)return Ze(e,t);const o=O(e,v(n));return 0===o.length?[]:1===o.length?Ze(o[0],t):Ze(o,t)}async function Tt(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return Kt({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=Fe(e.queue,t,{max:n});if(o.dropped>0){const t=We(e.status,$("collector"),"queue",o.dropped);Re(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&He(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?Qe(e.transformers):{},I=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};const u=s.config.id||o,I=$("destination",u),q=Be(s.config.breaker);if(q&&function(e,t,n){const o=e[t];if(!o||"closed"===o.state)return!1;if("half-open"===o.state)return!0===o.probing;const s=Ne();return void 0!==o.openUntil&&s<o.openUntil||(o.state="half-open",o.probing=!0,o.openUntil=s+n,!1)}(e.status.breakers,I,q.cooldown))return{id:o,destination:s,skipped:!0};const O=t=>{q&&Ge(e.status.breakers,I,t,q.threshold,q.cooldown)},C=()=>{q&&function(e,t){const n=e[t];n&&"half-open"===n.state&&!0===n.probing&&(n.state="open",n.probing=!1)}(e.status.breakers,I)};let E=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&E.push(m(t));const D=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:k("unknown");if(!E.length&&!(null==(r=s.queueOn)?void 0:r.length))return C(),{id:o,destination:s,skipped:!0};if(!E.length&&(null==(i=s.queueOn)?void 0:i.length)){if(!x(s.config.consent,d))return C(),{id:o,destination:s,skipped:!0};let t=!1;try{t=await _t(e,s,o,!0)}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)}),O("transport-failure")}return C(),{id:o,destination:s,skipped:!t}}const j=[],M=E.filter(t=>{const n=x(s.config.consent,d,t.consent);if(n)return t.consent=n,j.push(t),!1;const r=ze(e,{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}}),S(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+=Fe(t,e,r).dropped;if(i>0){Ve(e,n);const o=We(e.status,$("destination",n),"queue",i);Re(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&&He(t)}if(!j.length)return C(),{id:o,destination:s,queue:E};let P,K,z=!1;try{z=await _t(e,s,o,!0)}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)}),O("transport-failure")}if(!z)return C(),{id:o,destination:s,queue:E};s.dlq||(s.dlq=[]);const F=Mt(s.config.before,g,D),U=s.config.next,R=null==(c=s.config)?void 0:c.cache,H=R?y(R):void 0,N=H?Je(H,e):void 0,B=(null==(l=s.config)?void 0:l.state)?T(s.config.state):void 0,G=null==B?void 0:B.filter(e=>"get"===e.mode),V=null==B?void 0:B.filter(e=>"set"===e.mode);let W=0,L=0;return await Promise.all(j.map(async t=>{let r;if(t.globals=h(f,t.globals),t.user=h(p,t.user),(null==H?void 0:H.stop)&&N){const e=v(D,t),n=await w(H,N,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(F.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await ot(e,e.transformers,F,t,D,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(H&&!H.stop&&N){const e=v(D,i),n=await w(H,N,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})}G&&G.length>0&&i&&(i=await _(G,t=>Ye(t,e),i,e));const c=Date.now();let l=!1;const u=await A(Pt,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),P=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=Fe(a,[i,t],u);if(d.dropped>0){Ve(e,c);const t=We(e.status,$("destination",c),"dlq",d.dropped);Re(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&&He(a)})(e,s,o,i,D,a);if(W+=Date.now()-c,r&&N&&void 0===s.config.mock&&b(N,r.key,null==u||u,r.ttl),!l&&!$t(u)&&V&&V.length>0&&i&&(i=await _(V,t=>Ye(t,e),i,e)),void 0===u||$t(u)||(K=u),$t(u)&&L++,!l&&U){void 0!==u&&(D._response=u);const t=Mt(U,g,D);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await ot(e,e.transformers,t,i,D,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:P,response:K,totalDuration:W,batchedCount:L,allowedCount:j.length,canonicalId:u,breakerConfig:q}})),q={},O={},C={};for(const t of I){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};Ve(e,t.id);const u=e.status.destinations[t.id],d=Date.now();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;const f=t.breakerConfig,p=t.canonicalId?$("destination",t.canonicalId):void 0,g=t=>{f&&p&&Ge(e.status.breakers,p,t,f.threshold,f.cooldown)};if(t.error)o.error=t.error,C[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++,g("transport-failure");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++,g("success"))}}return Kt({event:t,...Object.keys(q).length&&{done:q},...Object.keys(O).length&&{queued:O},...Object.keys(C).length&&{failed:C}})}async function _t(e,t,n,o=!1){var s;if(t.init&&!t.config.init){if(!o&&function(e){const t=e.config.consent;return!!t&&Object.keys(t).length>0}(t))return e.logger.scope(t.type||"unknown").debug("init blocked: consent gate not cleared"),!1;const r=t.type||"unknown",i=e.logger.scope(r),a={collector:e,logger:i,id:n,config:t.config,env:Ft(t.env,t.config.env),reportError:Le(e,"destination",n,i,t)};i.debug("init");const c=Date.now();let l;S(e,ze(e,{stepId:$("destination",n),stepType:"destination",phase:"init",eventId:"",now:c}));try{l=await M(t.init,"DestinationInit",e.hooks,e.logger)(a)}catch(t){const o=Date.now(),s=ze(e,{stepId:$("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-c,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},S(e,s),t}if(!1===l)return l;if(t.config={...l||t.config,init:!0},null==(s=t.queueOn)?void 0:s.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)St(e,t,n,s,r)}i.debug("init done")}return!0}async function Pt(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:p}=t,g=await j(o,p,e);if(g.ignore)return!1;const h=t.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:n,config:p,data:g.data,rule:g.mapping,ingest:s,env:{...Ft(t.env,p.env),...r?{respond:r}:{}},reportError:Le(e,"destination",n,v,t)};if(void 0!==p.mock)return v.debug("mock",{event:g.event.name}),p.mock;const y=g.mapping,w=void 0!==(null==y?void 0:y.batch),b=w?g.mappingKey||"* *":" batch-all";if((w||void 0!==p.batch)&&t.pushBatch&&void 0===p.mock){if(t.batches=t.batches||{},!t.batches[b]){const o={key:b,entries:[],events:[],data:[]},s=At(null==y?void 0:y.batch),r=At(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,m=Ft(t.env,p.env),k=I(async()=>{var o,s;const r=t.batches[b],i=r.batched;if(0===i.entries.length)return;const a={key:i.key,entries:i.entries,events:i.events,data:i.data};i.entries=[],i.events=[],i.data=[];const c=a.entries[0],l={collector:e,logger:v,id:n,config:p,data:void 0,rule:r.isDefault?void 0:c.rule,ingest:c.ingest,env:{...m,...c.respond?{respond:c.respond}:{}},reportError:Le(e,"destination",n,v,t)};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=Ve(e,u),f=Be(t.config.breaker),g=$("destination",u),h=t=>{f&&Ge(e.status.breakers,g,t,f.threshold,f.cooldown)},y=Date.now(),w=ze(e,{stepId:$("destination",n),stepType:"destination",phase:"flush",eventId:"",now:y});w.batch={size:a.entries.length,index:0},S(e,w);const k=n=>{var o;const s=t.dlq=t.dlq||[],r={max:null!=(o=t.config.dlqMax)?o:100};let i=0;for(const e of n)i+=Fe(s,e,r).dropped;if(i>0){const t=We(e.status,$("destination",u),"dlq",i);Re(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&&He(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let I=a.entries.length;const q=Ct(p.timeout),x=await A((o,s)=>Dt(Promise.resolve(M(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,s)),q,`Destination "${n}" batch delivery timed out after ${q}ms`),t=>{I=0;const o=Date.now(),s=ze(e,{stepId:$("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-y,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},s.batch={size:a.entries.length,index:0},S(e,s),k(a.entries.map(e=>[e.event,t])),h("transport-failure"),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if(D(O=x)&&Array.isArray(O.failed)&&x.failed.length>0){const e=[],t=new Set;for(const n of x.failed){const s=a.entries[n.index];s&&!t.has(n.index)&&(t.add(n.index),e.push([s.event,null!=(o=n.error)?o:new Error(`Push batch entry ${n.index} failed (no per-row error provided)`)]))}e.length>0&&(k(e),I=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:I,entries:a.entries.length}))}var O;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),I>0&&(d.count+=I,d.lastAt=Date.now(),e.status.out+=I,h("success"))},{wait:f,size:g,age:h});t.batches[b]={batched:o,isDefault:!w,batchFn:()=>{k()},flush:async()=>{await k.flush()}}}const o=t.batches[b];o.batched.entries.push({event:g.event,ingest:s,respond:r,rule:y,data:g.data}),o.batched.events.push(g.event),C(g.data)&&o.batched.data.push(g.data);const h=t.config.id||n,m=Ve(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),jt}{v.debug("push",{event:g.event.name});const o="string"==typeof g.event.id?g.event.id:"",s=Date.now(),r=ze(e,{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}),r.inEvent=g.event,S(e,r);try{const r=Ct(p.timeout),i=await Dt(Promise.resolve(M(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m)),r,`Destination "${n}" delivery timed out after ${r}ms`),a=Date.now(),c=ze(e,{stepId:$("destination",n),stepType:"destination",phase:"out",eventId:o,now:a});return c.durationMs=a-s,c.outEvent=g.event,C(i)&&(c.meta={...c.meta,response:i}),g.mappingKey&&(c.mappingKey=g.mappingKey),S(e,c),v.debug("push done"),i}catch(t){const r=Date.now(),i=ze(e,{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),S(e,i),t}}}function Kt(e){return{ok:!(null==e?void 0:e.failed),...e}}function zt(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=Xe(e,"before"),{config:a}=Xe({...e,config:i},"next"),c={...t.config,...n,...a};s&&(c.cache=s),void 0!==r&&void 0===c.state&&(c.state=r);const l=Ft(t.env,o);return{...t,config:c,env:l}}function Ft(e,t){return e||t?t?e&&D(e)&&D(t)?{...e,...t}:t:e:{}}async function Ut(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};let l;try{await Promise.race([r(c),new Promise((n,o)=>{l=setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3)})])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}finally{l&&clearTimeout(l)}});await Promise.allSettled(o)}function Rt(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Ht(e,t,n){let o,s,r=!1;const i=function(e){return e.cascade?()=>{}:(e.cascade={counts:new WeakMap},()=>{e.cascade=void 0})}(e);try{return await async function(){switch(t){case Ke.Config:be(n)&&(ve(e.config,n,{shallow:!1}),s=n,r=!0);break;case Ke.Consent:if(be(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);Rt(e,Ke.Consent),s=t,r=!0}break;case Ke.Custom:be(n)&&(e.custom=ve(e.custom,n),Rt(e,Ke.Custom),s=n,r=!0);break;case Ke.Destination:be(n)&&"code"in n&&be(n.code)&&(o=await async function(e,t){var n;const{code:o,config:s={},env:r={},before:i,next:a,cache:c,state:l}=t;if(!E(o.push))return Kt({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=s||{init:!1};let d=i?{...u,before:i}:{...u};a&&(d={...d,next:a}),c&&(d={...d,cache:c}),void 0!==l&&void 0===d.state&&(d={...d,state:l});let f=d.id;if(!f)do{f=q(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]||e.pending.destinations[f]);if(null==(n=d.require)?void 0:n.length){e.pending.destinations[f]=t,await lt(e);const n=e.destinations[f];return n?Tt(e,void 0,{},{[f]:n}):Kt({ok:!0})}const p={...o,config:d,env:Ft(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),Tt(e,void 0,{},{[f]:p})}(e,n));break;case Ke.Globals:be(n)&&(e.globals=ve(e.globals,n),Rt(e,Ke.Globals),s=n,r=!0);break;case Ke.Hook:if(be(n)&&we(n.name)&&ye(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case Ke.On:if(be(n)&&we(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){if(!ut(e))return void ft();const o=e.on,s=o[t]||[],r=K(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,qt(e,t,r)}(e,t,o)}break;case Ke.Ready:r=!0;break;case Ke.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=ve(e.consent,t.consent),Rt(e,Ke.Consent)),t.user&&(e.user=ve(e.user,t.user),Rt(e,Ke.User)),t.globals&&(e.globals=ve(e.config.globalsStatic||{},t.globals),Rt(e,Ke.Globals)),t.custom&&(e.custom=ve(e.custom,t.custom),Rt(e,Ke.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await lt(e),await async function(e){if(ut(e))for(const t of gt){if(!vt(e,t))continue;const n=xt(e,t);qt(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))at(s)&&await Ot(e,s,o,t,n)}else ft()}(e),await Tt(e)}(e,n),r=!0;break;case Ke.Session:r=!0;break;case Ke.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await Ut(e.sources,"source",t),await async function(e,t){const n=Object.entries(e).flatMap(([e,n])=>{const o=n.batches;if(!o)return[];const s=t.scope(n.type||"destination");return Object.values(o).map(async t=>{let n;try{await Promise.race([t.flush(),new Promise((t,o)=>{n=setTimeout(()=>o(new Error(`destination '${e}' batch flush timed out`)),5e3)})])}catch(t){s.error(`destination '${e}' batch flush failed: ${t}`)}finally{n&&clearTimeout(n)}})});await Promise.allSettled(n)}(e.destinations,t),await Ut(e.destinations,"destination",t),await Ut(e.transformers,"transformer",t),await Ut(e.stores,"store",t)}(e));break;case Ke.User:be(n)&&(ve(e.user,n,{shallow:!1}),Rt(e,Ke.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;if(!ut(e))return ft(),!0;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=xt(e,t,o);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&&(at(o)?await Ot(e,o,n,t,a)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:a})))}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:a});St(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))at(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await it(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!at(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await lt(e),qt(e,t,i,o),!c}(e,t,void 0,s),o=await Tt(e)),o||Kt({ok:!0})}()}finally{i()}}function Nt(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.1-next-1781682752679"},...t}}function Bt(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=me(),trigger:g="",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:p,trigger:g,entity:h,action:v,timestamp:s,timing:m,source:y}}function Gt(e,t){const n=Ce(async(n,o={})=>await Oe(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,v=null!=a?a:ke(i||"unknown");if(l){const t=await xe(g,l,e);if(t.ignore)return Kt({ok:!0});if(l.consent&&!qe(l.consent,e.consent,t.event.consent))return Kt({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await ot(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return Kt({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),Kt({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=Bt(e,o);return Tt(e,s,{id:i,ingest:v,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:Kt({ok:!0})}g=n.event}const m=function(e,t){return Bt(e,Nt(e,t))}(e,g),y=await Tt(e,m,{id:i,ingest:v,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 y},t=>{if(t instanceof Se)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),Kt({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now(),i=ze(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r});i.inEvent=t,Ie(e,i);try{const i=await n(t,o),a=Date.now(),c=ze(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,Ie(e,c),i}catch(t){const n=Date.now(),o=ze(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)},Ie(e,o),t}}}function Vt(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 Wt(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=ze(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},Te(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?Me(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),r=_e(s);if(void 0!==r){if(!("expired"in r))return l.hits++,c(t,"hit"),r.value;try{await o.delete(n)}catch(e){g("delete",t,e)}}const i=p.get(n);if(i)return l.inflight_dedups++,c(t,"hit"),i;l.misses++,c(t,"miss");const a=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=f(t,s);if(r)try{const e=1e3*r.ttl;await o.set(n,Pe(s,e),e),l.populates++}catch(e){g("set",t,e)}return s}finally{p.delete(n)}})();return p.set(n,a),a},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=f(t,n);if(r)try{const e=1e3*r.ttl;await o.set(d(t),Pe(n,e),e)}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 Lt(e,t,n){const o=`store.${n}`,s=Ae(t.get,"StoreGet",e.hooks,e.logger),r=Ae(t.set,"StoreSet",e.hooks,e.logger),i=Ae(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=ze(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});r.meta={op:"get",key:t},$e(e,r);try{const r=await s(t),i=Date.now(),a=ze(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:i});return a.durationMs=i-n,a.meta={op:"get",key:t},$e(e,a),r}catch(s){const r=Date.now(),i=ze(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)},$e(e,i),s}},t.set=async(t,n,s)=>{const i=Date.now(),a=ze(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:i});a.meta={op:"set",key:t},$e(e,a);try{await r(t,n,s);const a=Date.now(),c=ze(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:a});c.durationMs=a-i,c.meta={op:"set",key:t},$e(e,c)}catch(n){const s=Date.now(),r=ze(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)},$e(e,r),n}},t.delete=async t=>{const n=Date.now(),s=ze(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});s.meta={op:"delete",key:t},$e(e,s);try{await i(t);const s=Date.now(),r=ze(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:s});r.durationMs=s-n,r.meta={op:"delete",key:t},$e(e,r)}catch(s){const r=Date.now(),i=ze(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)},$e(e,i),s}}}async function Jt(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,stateVersion:0,cellVersion:{},delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{},connectionErrors:{},breakers:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},hasShutdown:!1,seenEvents:new Set,push:void 0,command:void 0};var c,l;a.push=Gt(a,e=>Nt(a,e)),a.command=(l=Ht,De(async(e,t,n)=>await je(async()=>await l(c,e,t,n),n=>{if(n instanceof Ee)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),Kt({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,reportError:Le(e,"store",n,a)},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=Vt()),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]=Wt(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&&Lt(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=Vt()),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]=zt(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){var n,o,s,r,i,a,c,l;const u={};for(const[d,f]of Object.entries(t)){const{code:t,env:p={}}=f,g=fe(f,"Transformer");if(!g.ok){e.logger.warn(`Transformer ${d} invalid (${g.code}): ${g.reason}. Skipping.`);continue}const{config:h}=Xe(f,"before"),{config:v}=Xe({...f,config:h},"next"),m=Object.keys(p).length>0?{...v,env:p}:v,{cache:y}=f,w=y?{...m,cache:y}:m,b=null!=(o=null==(n=f.config)?void 0:n.state)?o:f.state,k=void 0!==b&&void 0===w.state?{...w,state:b}:w,I=e.logger.scope("transformer").scope(d),S={collector:e,logger:I,id:d,ingest:ee(d),config:k,env:p,reportError:Le(e,"transformer",d,I)},q=null!=t?t:e=>{const t=f.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 ${d}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await pe(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},x=await q(S);void 0!==f.before&&void 0===(null==(s=x.config)?void 0:s.before)&&(x.config={...null!=(r=x.config)?r:{},before:f.before}),void 0!==f.next&&void 0===(null==(i=x.config)?void 0:i.next)&&(x.config={...null!=(a=x.config)?a:{},next:f.next}),void 0!==b&&void 0===(null==(c=x.config)?void 0:c.state)&&(x.config={...null!=(l=x.config)?l:{},state:b}),u[d]=x}return u}(a,e.transformers||{}),a}async function Yt(e){e=e||{};const t=await Jt(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 Kt({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 ct(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 G(n.init.bind(n),n=>{if(n instanceof N)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,at(n)&&await it(e,n,t))}return await lt(e),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&&await t.command("globals",i),a&&await t.command("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 Qt=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 Yt({...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)}}}},Xt=(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
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:()=>Xt,step:()=>l,trigger:()=>Zt});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 v,clone as m,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 C,isFunction as D,isObject as E,processEventMapping as j,stepId as $,tryCatchAsync as A,useHooks as M,compileState as T,applyState as _}from"@walkeros/core";import{emitStep as P}from"@walkeros/core";import{isArray as K,FatalError as z}from"@walkeros/core";import{tryCatch as F,tryCatchAsync as U}from"@walkeros/core";import{stepId as R}from"@walkeros/core";import{createIngest as H,FatalError as N,getMappingValue as B,tryCatchAsync as G,getNextSteps as V,compileCache as W,checkCache as L,storeCache as J,applyUpdate as Y,buildCacheContext as Q,compileState as X,applyState as Z}from"@walkeros/core";import{createIngest as ee,emitStep as te,FatalError as ne,isObject as oe,stepId as se,tryCatchAsync as re,useHooks as ie,getNextSteps as ae,compileCache as ce,checkCache as le,storeCache as ue,buildCacheContext as de,validateStepEntry as fe,processEventMapping as pe,compileState as ge,applyState as he}from"@walkeros/core";import{assign as ve,getSpanId as me,getTraceId as ye,isFunction as we,isString as be}from"@walkeros/core";import{isObject as ke}from"@walkeros/core";import{createIngest as Ie,emitStep as Se,FatalError as qe,getGrantedConsent as xe,processEventMapping as Oe,tryCatchAsync as Ce,useHooks as De}from"@walkeros/core";import{FatalError as Ee,useHooks as je,tryCatchAsync as $e}from"@walkeros/core";import{emitStep as Ae,useHooks as Me}from"@walkeros/core";import{compileMatcher as Te,emitStep as _e,readCacheEnvelope as Pe,wrapCacheEnvelope as Ke}from"@walkeros/core";var ze={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",Scoped:"_",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function Fe(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 Ue(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 Re=new WeakMap;function He(e,t,n,o){Re.get(e)||(Re.set(e,!0),t.warn(n,o))}function Ne(e){Re.delete(e)}var Be=()=>Date.now();function Ge(e){var t,n;if(void 0!==e)return"number"==typeof e?{threshold:e,cooldown:3e4}:{threshold:null!=(t=e.threshold)?t:5,cooldown:null!=(n=e.cooldown)?n:3e4}}function Ve(e,t,n,o,s){if("partial"===n)return;const r=((i=e)[a=t]||(i[a]={state:"closed",consecutiveFailures:0}),i[a]);var i,a;return"success"===n?(r.consecutiveFailures=0,r.state="closed",r.probing=!1,void(r.openUntil=void 0)):(r.consecutiveFailures+=1,"half-open"===r.state?(r.state="open",r.probing=!1,void(r.openUntil=Be()+s)):void(r.consecutiveFailures>=o&&(r.state="open",r.probing=!1,r.openUntil=Be()+s)))}function We(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 Le(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 Je(e,t,n,o,s){const r=R(t,n);return(t,i)=>{var a;try{if(i)return s?function(e,t,n,o,s,r){var i;const a=t.dlq=t.dlq||[],c={max:null!=(i=t.config.dlqMax)?i:100},l=Ue(a,[o,s],c);if(l.dropped>0){const t=Le(e.status,R("destination",n),"dlq",l.dropped);He(a,r,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:n,cap:c.max,droppedCount:t})}else a.length<c.max&&Ne(a);const u=We(e,n);u.failed++,u.dlqSize=a.length,e.status.failed++;const d=Ge(t.config.breaker);if(d){const o=t.config.id||n;Ve(e.status.breakers,R("destination",o),"transport-failure",d.threshold,d.cooldown)}}(e,s,n,i,t,o):e.status.failed++,void o.error("report error",{error:t instanceof Error?t.message:String(t),event:i.name});e.status.connectionErrors[r]=(null!=(a=e.status.connectionErrors[r])?a:0)+1,o.error("connection error",{error:t instanceof Error?t.message:String(t)})}catch(e){}}}function Ye(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Qe(e,t){return e?t.stores[e]:t.stores.__cache}function Xe(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 Ze(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function et(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 tt(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:ee(n),config:t.config,env:rt(t.config.env),reportError:Je(e,"transformer",n,s)};s.debug("init");const i=await ie(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 nt(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:{...rt(t.config.env),...r?{respond:r}:{}},reportError:Je(e,"transformer",n,a)};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=Fe(e,{stepId:se("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});d.inEvent=o,te(e,d);try{const s=await ie(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=Fe(e,{stepId:se("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:r});return i.durationMs=r-u,i.outEvent=s,te(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=Fe(e,{stepId:se("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)},te(e,s),t}}function ot(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:ee(t)}async function st(e,t,n,o,s,r,i){var a,c,l,u,d,f,p,g,h;s||(s=ee(null!=(a=n[0])?a:"chain")),i&&s._meta&&(s._meta.chainPath=i);let v=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 re(tt,t=>{if(t instanceof ne)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}),v=t;continue}if(void 0!==(null==(u=r.config)?void 0:u.mock)){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),v=r.config.mock;continue}if(null==(d=r.config)?void 0:d.disabled)continue;const a=null==(f=r.config)?void 0:f.cache,y=a?ce(a):void 0,w=y?Ye(y,e):void 0,b=(null==(p=r.config)?void 0:p.state)?ge(r.config.state):void 0,k=null==b?void 0:b.filter(e=>"get"===e.mode),I=null==b?void 0:b.filter(e=>"set"===e.mode),S=async t=>I&&0!==I.length?he(I,t=>Qe(t,e),t,e):t;let q;if(y&&w){const e=de(s,v),t=await le(y,w,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(v=t.value,y.stop)return{event:v,respond:m,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(q={key:t.key,ttl:t.rule.ttl})}const x=r.config.before;if(x){const n=ae(x,de(s,v));if(1===n.length){const o=et(n[0],Xe(t));if(o.length>0){const n=await st(e,t,o,v,s,m,i);if(null===n.event)return{event:null,respond:null!=(g=n.respond)?g:m};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(h=n.respond)?h:m,stopped:!0};n.respond&&(m=n.respond),v=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>re(st,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,et(n,Xe(t)),v,ot(s,n),void 0,i)))}k&&k.length>0&&(v=await he(k,t=>Qe(t,e),v,e));const O=await re(nt,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,v,s,m);if(!1===O)return{event:null,respond:m};if(Array.isArray(O)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(O.map(async n=>{const o=await S(n.event||v),a=ot(s,"unknown");if(n.next){const s=ae(n.next,de(a,o));if(0===s.length)return{event:o,respond:m};if(1===s.length){const n=et(s[0],Xe(t));return n.length>0?st(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>re(st,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,et(n,Xe(t)),o,ot(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?st(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(O&&"object"==typeof O){const{event:n,respond:o,next:r}=O;if(o&&(m=o),void 0!==r){const o=await S(n||v),a=ae(r,de(s,o));if(0===a.length){v=o;continue}if(1===a.length){const n=et(a[0],Xe(t));return n.length>0?st(e,t,n,o,s,m,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:m})}return await Promise.all(a.map(n=>re(st,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,et(n,Xe(t)),o,ot(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}I&&I.length>0&&(v=await he(I,t=>Qe(t,e),v,e)),q&&w&&ue(w,q.key,v,q.ttl);const C=r.config.next,D="string"==typeof C||Array.isArray(C)&&C.every(e=>"string"==typeof e),E=void 0!==C&&!D;if((!O||"object"==typeof O&&!O.next)&&E){const n=ae(r.config.next,de(s,v));if(1===n.length){const o=et(n[0],Xe(t));return o.length>0?st(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>re(st,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,et(n,Xe(t)),v,ot(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function rt(e){return e&&oe(e)?e:{}}function it(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function at(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)vt(n)&&!kt(e,t,n)||(await G(t.on,t=>{if(t instanceof N)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o),vt(n)&&bt(e,t,n))}function ct(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function lt(e,t,n){var o,s;const{code:r,config:i={},env:a={},primary:c,next:l,before:u,cache:d}=n,f=null!=(o=i.state)?o:n.state,p=f?X(f):void 0,g=d,h=g?W({...g,stop:null==(s=g.stop)||s}):void 0,v=it(l)?et(l,Xe(e.transformers)):void 0,m=it(u)?et(u,Xe(e.transformers)):void 0,y=a.push,w=null!=y?y:e.push,b=Boolean(y),k=async(n,o,s)=>{var r;let a;const c=null!=m?m:void 0!==u?(()=>{const t=V(u,Q(s.ingest));return 0===t.length?[]:et(1===t.length?t[0]:t,Xe(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await st(e,e.transformers,c,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(h){const t=Ye(h,e);if(t){const n=Q(s.ingest),o=await L(h,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&h.stop){let t=o.value;return o.rule.update&&(t=await Y(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(r=s.respond)||r.call(s,t),{ok:!0}}if("MISS"===o.status&&h.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=>{J(t,l,n,u),i?a=(async()=>{const t=await Y(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||J(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=V(l,Q(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:et(t[0],Xe(e.transformers))}:{kind:"many",branches:t.map(t=>et(t,Xe(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>Z(p,t=>Qe(t,e),t,e))));let g={ok:!0};for(const n of d)"many"===f.kind?(await Promise.all(f.branches.map((r,a)=>G(async()=>b?w(n):w(n,{...o,id:t,ingest:ot(s.ingest,`${t}.${a}`),respond:void 0,mapping:i,preChain:r}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),g={ok:!0}):g=b?await w(n):await w(n,{...o,id:t,ingest:s.ingest,respond:s.respond,mapping:i,preChain:f.preChain});return a&&await a,g},I=async n=>{const o=H(t);if(!i.ingest||void 0===n)return o;const s=await B(n,i.ingest,{collector:e});return{...o,...s,_meta:o._meta}},S=e.logger.scope("source").scope(t),q={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:S,...a,push:async(e,n={})=>{const o={ingest:H(t),respond:void 0};return k(e,n,o)}},x={collector:e,logger:S,id:t,config:i,env:q,withScope:async(e,t,n)=>{const o={ingest:await I(e),respond:t};return n({...q,push:(e,t={})=>k(e,t,o),ingest:o.ingest,respond:o.respond})},reportError:Je(e,"source",t,S)},O=await G(r,n=>{if(n instanceof N)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(x);if(!O)return;const C=O.type||"unknown",D=e.logger.scope(C).scope(t);return q.logger=D,c&&(O.config={...O.config,primary:c}),O}async function ut(e){var t;for(const[t,n]of Object.entries(e.sources)){if(ct(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!yt(e,t));s.length!==o.length&&(n.config.require=s,ct(n)&&await at(e,n,t))}for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=null==(t=o.config)?void 0:t.require;if(!s)continue;const r=s.filter(t=>!yt(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=Ft(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function dt(e){if("object"!=typeof e||null===e)return!1;if(!("logger"in e))return!1;const t=e.logger;return"object"==typeof t&&null!==t&&"scope"in t&&"function"==typeof t.scope}var ft=!1;function pt(){ft||(ft=!0,"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn("walkerOS: ignored an on-dispatch call with a non-collector argument"))}function gt(e,t,n,o){if(n instanceof z)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}var ht=[ze.Consent,ze.User,ze.Globals,ze.Custom];function vt(e){return ht.includes(e)}function mt(e,t){switch(t){case ze.Consent:return Object.keys(e.consent).length>0;case ze.User:return Object.keys(e.user).length>0;case ze.Globals:return Object.keys(e.globals).length>0;case ze.Custom:return Object.keys(e.custom).length>0;default:return!1}}function yt(e,t){switch(t){case ze.Consent:case ze.User:case ze.Globals:case ze.Custom:return mt(e,t);case ze.Run:case ze.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function wt(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function bt(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=wt(e,n)}function kt(e,t,n){return e.allowed&&wt(e,n)>function(e,t,n){const o=e.delivery.get(t),s=null==o?void 0:o[String(n)];return void 0===s?-1:s}(e,t,n)}function It(e,t,n){const o=e.cascade;if(!o)return!0;let s=o.counts.get(t);s||(s={},o.counts.set(t,s));const r=String(n),i=(s[r]||0)+1;return s[r]=i,i<=8||(9===i&&e.logger.error("state delivery did not converge",{type:r}),!1)}function St(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function qt(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:Ut(t.env,t.config.env),reportError:Je(e,"destination",n,i,t)};F(t.on,t=>gt(e,"destination",t,{destId:n,type:o}))(o,a)}function xt(e,t,n,o){if(!dt(e))return void pt();const s=Ot(e,t,o);if(n.length)switch(t){case ze.Consent:!function(e,t,n){const o=n||e.consent,s=St(e,ze.Consent);t.forEach(t=>{kt(e,t,ze.Consent)&&It(e,t,ze.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{F(t[n],t=>gt(e,"consent",t,{key:n}))(o,s)}),bt(e,t,ze.Consent))})}(e,n,o);break;case ze.Ready:!function(e,t){if(!e.allowed)return;const n=St(e,ze.Ready);t.forEach(t=>{F(t,t=>gt(e,"ready",t))(void 0,n)})}(e,n);break;case ze.Run:!function(e,t){if(!e.allowed)return;const n=St(e,ze.Run);t.forEach(t=>{F(t,t=>gt(e,"run",t))(void 0,n)})}(e,n);break;case ze.Session:!function(e,t){if(!e.session)return;const n=St(e,ze.Session);t.forEach(t=>{F(t,t=>gt(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=St(e,t),r=vt(t);n.forEach(n=>{"function"==typeof n&&(r&&!kt(e,n,t)||r&&!It(e,n,t)||(F(n,n=>gt(e,"generic",n,{type:t}))(s,o),r&&bt(e,n,t)))});break}}}function Ot(e,t,n){switch(t){case ze.Consent:return n||e.consent;case ze.Session:return e.session;case ze.User:return n||e.user;case ze.Custom:return n||e.custom;case ze.Globals:return n||e.globals;case ze.Config:return n||e.config;default:return}}async function Ct(e,t,n,o,s){if(!t.on)return!1;if(vt(o)&&!kt(e,t,o))return!1;if(vt(o)&&!It(e,t,o))return!1;const r=await U(t.on,t=>gt(e,"source",t,{sourceId:n,type:o}))(o,s);return vt(o)&&bt(e,t,o),!1===r}function Dt(e){return"number"==typeof e&&e>0?e:1e4}var Et=class extends Error{constructor(e){super(e),this.name="DestinationTimeoutError"}};function jt(e,t,n){let o;const s=new Promise((e,s)=>{o=setTimeout(()=>s(new Et(n)),t)});return Promise.race([e,s]).finally(()=>{o&&clearTimeout(o)})}var $t=Object.freeze({batched:!0});function At(e){return e===$t}function Mt(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function Tt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return et(e,t);if("string"==typeof e)return et(e,t);const o=O(e,v(n));return 0===o.length?[]:1===o.length?et(o[0],t):et(o,t)}async function _t(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return zt({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=Ue(e.queue,t,{max:n});if(o.dropped>0){const t=Le(e.status,$("collector"),"queue",o.dropped);He(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&Ne(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?Xe(e.transformers):{},I=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{var r,i,a,c,l;if(s.config.disabled)return{id:o,destination:s,skipped:!0};const u=s.config.id||o,I=$("destination",u),q=Ge(s.config.breaker);if(q&&function(e,t,n){const o=e[t];if(!o||"closed"===o.state)return!1;if("half-open"===o.state)return!0===o.probing;const s=Be();return void 0!==o.openUntil&&s<o.openUntil||(o.state="half-open",o.probing=!0,o.openUntil=s+n,!1)}(e.status.breakers,I,q.cooldown))return{id:o,destination:s,skipped:!0};const O=t=>{q&&Ve(e.status.breakers,I,t,q.threshold,q.cooldown)},C=()=>{q&&function(e,t){const n=e[t];n&&"half-open"===n.state&&!0===n.probing&&(n.state="open",n.probing=!1)}(e.status.breakers,I)};let D=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&D.push(m(t));const E=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:k("unknown");if(!D.length&&!(null==(r=s.queueOn)?void 0:r.length))return C(),{id:o,destination:s,skipped:!0};if(!D.length&&(null==(i=s.queueOn)?void 0:i.length)){if(!x(s.config.consent,d))return C(),{id:o,destination:s,skipped:!0};let t=!1;try{t=await Pt(e,s,o,!0)}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)}),O("transport-failure")}return C(),{id:o,destination:s,skipped:!t}}const j=[],M=D.filter(t=>{const n=x(s.config.consent,d,t.consent);if(n)return t.consent=n,j.push(t),!1;const r=Fe(e,{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}}),S(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+=Ue(t,e,r).dropped;if(i>0){We(e,n);const o=Le(e.status,$("destination",n),"queue",i);He(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&&Ne(t)}if(!j.length)return C(),{id:o,destination:s,queue:D};let P,K,z=!1;try{z=await Pt(e,s,o,!0)}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)}),O("transport-failure")}if(!z)return C(),{id:o,destination:s,queue:D};s.dlq||(s.dlq=[]);const F=Tt(s.config.before,g,E),U=s.config.next,R=null==(c=s.config)?void 0:c.cache,H=R?y(R):void 0,N=H?Ye(H,e):void 0,B=(null==(l=s.config)?void 0:l.state)?T(s.config.state):void 0,G=null==B?void 0:B.filter(e=>"get"===e.mode),V=null==B?void 0:B.filter(e=>"set"===e.mode);let W=0,L=0;return await Promise.all(j.map(async t=>{let r;if(t.globals=h(f,t.globals),t.user=h(p,t.user),(null==H?void 0:H.stop)&&N){const e=v(E,t),n=await w(H,N,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(F.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await st(e,e.transformers,F,t,E,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(H&&!H.stop&&N){const e=v(E,i),n=await w(H,N,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})}G&&G.length>0&&i&&(i=await _(G,t=>Qe(t,e),i,e));const c=Date.now();let l=!1;const u=await A(Kt,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),P=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=Ue(a,[i,t],u);if(d.dropped>0){We(e,c);const t=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:t})}else a.length<u.max&&Ne(a)})(e,s,o,i,E,a);if(W+=Date.now()-c,r&&N&&void 0===s.config.mock&&b(N,r.key,null==u||u,r.ttl),!l&&!At(u)&&V&&V.length>0&&i&&(i=await _(V,t=>Qe(t,e),i,e)),void 0===u||At(u)||(K=u),At(u)&&L++,!l&&U){void 0!==u&&(E._response=u);const t=Tt(U,g,E);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await st(e,e.transformers,t,i,E,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:P,response:K,totalDuration:W,batchedCount:L,allowedCount:j.length,canonicalId:u,breakerConfig:q}})),q={},O={},C={};for(const t of I){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};We(e,t.id);const u=e.status.destinations[t.id],d=Date.now();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;const f=t.breakerConfig,p=t.canonicalId?$("destination",t.canonicalId):void 0,g=t=>{f&&p&&Ve(e.status.breakers,p,t,f.threshold,f.cooldown)};if(t.error)o.error=t.error,C[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++,g("transport-failure");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++,g("success"))}}return zt({event:t,...Object.keys(q).length&&{done:q},...Object.keys(O).length&&{queued:O},...Object.keys(C).length&&{failed:C}})}async function Pt(e,t,n,o=!1){var s;if(t.init&&!t.config.init){if(!o&&function(e){const t=e.config.consent;return!!t&&Object.keys(t).length>0}(t))return e.logger.scope(t.type||"unknown").debug("init blocked: consent gate not cleared"),!1;const r=t.type||"unknown",i=e.logger.scope(r),a={collector:e,logger:i,id:n,config:t.config,env:Ut(t.env,t.config.env),reportError:Je(e,"destination",n,i,t)};i.debug("init");const c=Date.now();let l;S(e,Fe(e,{stepId:$("destination",n),stepType:"destination",phase:"init",eventId:"",now:c}));try{l=await M(t.init,"DestinationInit",e.hooks,e.logger)(a)}catch(t){const o=Date.now(),s=Fe(e,{stepId:$("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-c,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},S(e,s),t}if(!1===l)return l;if(t.config={...l||t.config,init:!0},null==(s=t.queueOn)?void 0:s.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)qt(e,t,n,s,r)}i.debug("init done")}return!0}async function Kt(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:p}=t,g=await j(o,p,e);if(g.ignore)return!1;const h=t.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:n,config:p,data:g.data,rule:g.mapping,ingest:s,env:{...Ut(t.env,p.env),...r?{respond:r}:{}},reportError:Je(e,"destination",n,v,t)};if(void 0!==p.mock)return v.debug("mock",{event:g.event.name}),p.mock;const y=g.mapping,w=void 0!==(null==y?void 0:y.batch),b=w?g.mappingKey||"* *":" batch-all";if((w||void 0!==p.batch)&&t.pushBatch&&void 0===p.mock){if(t.batches=t.batches||{},!t.batches[b]){const o={key:b,entries:[],events:[],data:[]},s=Mt(null==y?void 0:y.batch),r=Mt(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,m=Ut(t.env,p.env),k=I(async()=>{var o,s;const r=t.batches[b],i=r.batched;if(0===i.entries.length)return;const a={key:i.key,entries:i.entries,events:i.events,data:i.data};i.entries=[],i.events=[],i.data=[];const c=a.entries[0],l={collector:e,logger:v,id:n,config:p,data:void 0,rule:r.isDefault?void 0:c.rule,ingest:c.ingest,env:{...m,...c.respond?{respond:c.respond}:{}},reportError:Je(e,"destination",n,v,t)};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=We(e,u),f=Ge(t.config.breaker),g=$("destination",u),h=t=>{f&&Ve(e.status.breakers,g,t,f.threshold,f.cooldown)},y=Date.now(),w=Fe(e,{stepId:$("destination",n),stepType:"destination",phase:"flush",eventId:"",now:y});w.batch={size:a.entries.length,index:0},S(e,w);const k=n=>{var o;const s=t.dlq=t.dlq||[],r={max:null!=(o=t.config.dlqMax)?o:100};let i=0;for(const e of n)i+=Ue(s,e,r).dropped;if(i>0){const t=Le(e.status,$("destination",u),"dlq",i);He(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&&Ne(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let I=a.entries.length;const q=Dt(p.timeout),x=await A((o,s)=>jt(Promise.resolve(M(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,s)),q,`Destination "${n}" batch delivery timed out after ${q}ms`),t=>{I=0;const o=Date.now(),s=Fe(e,{stepId:$("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-y,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},s.batch={size:a.entries.length,index:0},S(e,s),k(a.entries.map(e=>[e.event,t])),h("transport-failure"),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if(E(O=x)&&Array.isArray(O.failed)&&x.failed.length>0){const e=[],t=new Set;for(const n of x.failed){const s=a.entries[n.index];s&&!t.has(n.index)&&(t.add(n.index),e.push([s.event,null!=(o=n.error)?o:new Error(`Push batch entry ${n.index} failed (no per-row error provided)`)]))}e.length>0&&(k(e),I=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:I,entries:a.entries.length}))}var O;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),I>0&&(d.count+=I,d.lastAt=Date.now(),e.status.out+=I,h("success"))},{wait:f,size:g,age:h});t.batches[b]={batched:o,isDefault:!w,batchFn:()=>{k()},flush:async()=>{await k.flush()}}}const o=t.batches[b];o.batched.entries.push({event:g.event,ingest:s,respond:r,rule:y,data:g.data}),o.batched.events.push(g.event),C(g.data)&&o.batched.data.push(g.data);const h=t.config.id||n,m=We(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),$t}{v.debug("push",{event:g.event.name});const o="string"==typeof g.event.id?g.event.id:"",s=Date.now(),r=Fe(e,{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}),r.inEvent=g.event,S(e,r);try{const r=Dt(p.timeout),i=await jt(Promise.resolve(M(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m)),r,`Destination "${n}" delivery timed out after ${r}ms`),a=Date.now(),c=Fe(e,{stepId:$("destination",n),stepType:"destination",phase:"out",eventId:o,now:a});return c.durationMs=a-s,c.outEvent=g.event,C(i)&&(c.meta={...c.meta,response:i}),g.mappingKey&&(c.mappingKey=g.mappingKey),S(e,c),v.debug("push done"),i}catch(t){const r=Date.now(),i=Fe(e,{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),S(e,i),t}}}function zt(e){return{ok:!(null==e?void 0:e.failed),...e}}function Ft(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=Ze(e,"before"),{config:a}=Ze({...e,config:i},"next"),c={...t.config,...n,...a};s&&(c.cache=s),void 0!==r&&void 0===c.state&&(c.state=r);const l=Ut(t.env,o);return{...t,config:c,env:l}}function Ut(e,t){return e||t?t?e&&E(e)&&E(t)?{...e,...t}:t:e:{}}async function Rt(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};let l;try{await Promise.race([r(c),new Promise((n,o)=>{l=setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3)})])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}finally{l&&clearTimeout(l)}});await Promise.allSettled(o)}function Ht(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Nt(e,t,n){let o,s,r=!1;const i=function(e){return e.cascade?()=>{}:(e.cascade={counts:new WeakMap},()=>{e.cascade=void 0})}(e);try{return await async function(){switch(t){case ze.Config:ke(n)&&(ve(e.config,n,{shallow:!1}),s=n,r=!0);break;case ze.Consent:if(ke(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);Ht(e,ze.Consent),s=t,r=!0}break;case ze.Custom:ke(n)&&(e.custom=ve(e.custom,n),Ht(e,ze.Custom),s=n,r=!0);break;case ze.Destination:ke(n)&&"code"in n&&ke(n.code)&&(o=await async function(e,t){var n;const{code:o,config:s={},env:r={},before:i,next:a,cache:c,state:l}=t;if(!D(o.push))return zt({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u=s||{init:!1};let d=i?{...u,before:i}:{...u};a&&(d={...d,next:a}),c&&(d={...d,cache:c}),void 0!==l&&void 0===d.state&&(d={...d,state:l});let f=d.id;if(!f)do{f=q(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f]||e.pending.destinations[f]);if(null==(n=d.require)?void 0:n.length){e.pending.destinations[f]=t,await ut(e);const n=e.destinations[f];return n?_t(e,void 0,{},{[f]:n}):zt({ok:!0})}const p={...o,config:d,env:Ut(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),_t(e,void 0,{},{[f]:p})}(e,n));break;case ze.Globals:ke(n)&&(e.globals=ve(e.globals,n),Ht(e,ze.Globals),s=n,r=!0);break;case ze.Hook:if(ke(n)&&be(n.name)&&we(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case ze.On:if(ke(n)&&be(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){if(!dt(e))return void pt();const o=e.on,s=o[t]||[],r=K(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,xt(e,t,r)}(e,t,o)}break;case ze.Ready:r=!0;break;case ze.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),e.trace=ye(),e.count=0,t&&(t.consent&&(e.consent=ve(e.consent,t.consent),Ht(e,ze.Consent)),t.user&&(e.user=ve(e.user,t.user),Ht(e,ze.User)),t.globals&&(e.globals=ve(e.config.globalsStatic||{},t.globals),Ht(e,ze.Globals)),t.custom&&(e.custom=ve(e.custom,t.custom),Ht(e,ze.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ut(e),await async function(e){if(dt(e))for(const t of ht){if(!mt(e,t))continue;const n=Ot(e,t);xt(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))ct(s)&&await Ct(e,s,o,t,n)}else pt()}(e),await _t(e)}(e,n),r=!0;break;case ze.Session:r=!0;break;case ze.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await Rt(e.sources,"source",t),await async function(e,t){const n=Object.entries(e).flatMap(([e,n])=>{const o=n.batches;if(!o)return[];const s=t.scope(n.type||"destination");return Object.values(o).map(async t=>{let n;try{await Promise.race([t.flush(),new Promise((t,o)=>{n=setTimeout(()=>o(new Error(`destination '${e}' batch flush timed out`)),5e3)})])}catch(t){s.error(`destination '${e}' batch flush failed: ${t}`)}finally{n&&clearTimeout(n)}})});await Promise.allSettled(n)}(e.destinations,t),await Rt(e.destinations,"destination",t),await Rt(e.transformers,"transformer",t),await Rt(e.stores,"store",t)}(e));break;case ze.User:ke(n)&&(ve(e.user,n,{shallow:!1}),Ht(e,ze.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;if(!dt(e))return pt(),!0;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=Ot(e,t,o);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&&(ct(o)?await Ct(e,o,n,t,a)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:a})))}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:a});qt(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))ct(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await at(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!ct(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await ut(e),xt(e,t,i,o),!c}(e,t,void 0,s),o=await _t(e)),o||zt({ok:!0})}()}finally{i()}}function Bt(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.1"},...t}}function Gt(e,t){var n,o;if(!t.name)throw new Error("Event name is required");const[s,r]=t.name.split(" ");if(!s||!r)throw new Error("Event name is invalid");const{timestamp:i=Date.now(),name:a=`${s} ${r}`,data:c={},context:l={},globals:u=e.globals,custom:d={},user:f=e.user,nested:p=[],consent:g=e.consent,id:h=me(),trigger:v="",entity:m=s,action:y=r,timing:w=0,source:b={type:"collector",schema:"4"}}=t,k=null!=(n=b.count)?n:e.count+=1,I=null!=(o=b.trace)?o:e.trace,S={...b,count:k};return void 0!==I&&(S.trace=I),{name:a,data:c,context:l,globals:u,custom:d,user:f,nested:p,consent:g,id:h,trigger:v,entity:m,action:y,timestamp:i,timing:w,source:S}}function Vt(e,t){const n=De(async(n,o={})=>await Ce(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,v=null!=a?a:Ie(i||"unknown");if(l){const t=await Oe(g,l,e);if(t.ignore)return zt({ok:!0});if(l.consent&&!xe(l.consent,e.consent,t.event.consent))return zt({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await st(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return zt({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),zt({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=Gt(e,o);return _t(e,s,{id:i,ingest:v,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:zt({ok:!0})}g=n.event}const m=function(e,t){return Gt(e,Bt(e,t))}(e,g),y=await _t(e,m,{id:i,ingest:v,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 y},t=>{if(t instanceof qe)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),zt({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now(),i=Fe(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r});i.inEvent=t,Se(e,i);try{const i=await n(t,o),a=Date.now(),c=Fe(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,Se(e,c),i}catch(t){const n=Date.now(),o=Fe(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)},Se(e,o),t}}}function Wt(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 Lt(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=Fe(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},_e(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?Te(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),r=Pe(s);if(void 0!==r){if(!("expired"in r))return l.hits++,c(t,"hit"),r.value;try{await o.delete(n)}catch(e){g("delete",t,e)}}const i=p.get(n);if(i)return l.inflight_dedups++,c(t,"hit"),i;l.misses++,c(t,"miss");const a=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=f(t,s);if(r)try{const e=1e3*r.ttl;await o.set(n,Ke(s,e),e),l.populates++}catch(e){g("set",t,e)}return s}finally{p.delete(n)}})();return p.set(n,a),a},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=f(t,n);if(r)try{const e=1e3*r.ttl;await o.set(d(t),Ke(n,e),e)}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 Jt(e,t,n){const o=`store.${n}`,s=Me(t.get,"StoreGet",e.hooks,e.logger),r=Me(t.set,"StoreSet",e.hooks,e.logger),i=Me(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=Fe(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});r.meta={op:"get",key:t},Ae(e,r);try{const r=await s(t),i=Date.now(),a=Fe(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:i});return a.durationMs=i-n,a.meta={op:"get",key:t},Ae(e,a),r}catch(s){const r=Date.now(),i=Fe(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)},Ae(e,i),s}},t.set=async(t,n,s)=>{const i=Date.now(),a=Fe(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:i});a.meta={op:"set",key:t},Ae(e,a);try{await r(t,n,s);const a=Date.now(),c=Fe(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:a});c.durationMs=a-i,c.meta={op:"set",key:t},Ae(e,c)}catch(n){const s=Date.now(),r=Fe(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)},Ae(e,r),n}},t.delete=async t=>{const n=Date.now(),s=Fe(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});s.meta={op:"delete",key:t},Ae(e,s);try{await i(t);const s=Date.now(),r=Fe(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:s});r.durationMs=s-n,r.meta={op:"delete",key:t},Ae(e,r)}catch(s){const r=Date.now(),i=Fe(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)},Ae(e,i),s}}}async function Yt(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,count:0,stateVersion:0,cellVersion:{},delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{},connectionErrors:{},breakers:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},hasShutdown:!1,seenEvents:new Set,push:void 0,command:void 0};var c,l;a.push=Vt(a,e=>Bt(a,e)),a.command=(l=Nt,je(async(e,t,n)=>await $e(async()=>await l(c,e,t,n),n=>{if(n instanceof Ee)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),zt({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,reportError:Je(e,"store",n,a)},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=Wt()),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]=Lt(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&&Jt(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=Wt()),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]=Ft(i);return s}(a,e.destinations||{}),a.transformers=await async function(e,t={}){var n,o,s,r,i,a,c,l;const u={};for(const[d,f]of Object.entries(t)){const{code:t,env:p={}}=f,g=fe(f,"Transformer");if(!g.ok){e.logger.warn(`Transformer ${d} invalid (${g.code}): ${g.reason}. Skipping.`);continue}const{config:h}=Ze(f,"before"),{config:v}=Ze({...f,config:h},"next"),m=Object.keys(p).length>0?{...v,env:p}:v,{cache:y}=f,w=y?{...m,cache:y}:m,b=null!=(o=null==(n=f.config)?void 0:n.state)?o:f.state,k=void 0!==b&&void 0===w.state?{...w,state:b}:w,I=e.logger.scope("transformer").scope(d),S={collector:e,logger:I,id:d,ingest:ee(d),config:k,env:p,reportError:Je(e,"transformer",d,I)},q=null!=t?t:e=>{const t=f.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 ${d}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await pe(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},x=await q(S);void 0!==f.before&&void 0===(null==(s=x.config)?void 0:s.before)&&(x.config={...null!=(r=x.config)?r:{},before:f.before}),void 0!==f.next&&void 0===(null==(i=x.config)?void 0:i.next)&&(x.config={...null!=(a=x.config)?a:{},next:f.next}),void 0!==b&&void 0===(null==(c=x.config)?void 0:c.state)&&(x.config={...null!=(l=x.config)?l:{},state:b}),u[d]=x}return u}(a,e.transformers||{}),a}async function Qt(e){e=e||{};const t=await Yt(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 zt({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 lt(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 G(n.init.bind(n),n=>{if(n instanceof N)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,ct(n)&&await at(e,n,t))}return await ut(e),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&&await t.command("globals",i),a&&await t.command("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 Xt=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 Qt({...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)}}}},Zt=(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":";;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,mBAAmB;;;ACA5B,SAAS,GAAG,0BAA0B;AAK/B,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,SAAS,EACN,QAAQ,EACR,QAAQ,KAAK,EACb,SAAS,kDAAkD,EAC3D,SAAS;AAAA,EAEZ,SAAS,EACN,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EACvC,SAAS,gDAAgD,EACzD,SAAS;AAAA,EAEZ,QAAQ,EACL,OAAO,EACP,QAAQ,EAAE,EACV,SAAS,4BAA4B,EACrC,SAAS;AAAA,EAEZ,OAAO,EACJ,QAAQ,EACR,QAAQ,KAAK,EACb,SAAS,kCAAkC,EAC3C,SAAS;AAAA,EAEZ,YAAY,EACT,OAAO,EACP,QAAQ,cAAc,EACtB,SAAS,4BAA4B,EACrC,SAAS;AAAA,EAEZ,gBAAgB,EACb,KAAK,CAAC,SAAS,SAAS,CAAC,EACzB,QAAQ,OAAO,EACf,SAAS,0BAA0B,EACnC,SAAS;AAAA,EAEZ,WAAW,EACR,OAAO,EACP,QAAQ,aAAa,EACrB,SAAS,2BAA2B,EACpC,SAAS;AAAA,EAEZ,eAAe,EACZ,KAAK,CAAC,SAAS,SAAS,CAAC,EACzB,QAAQ,OAAO,EACf,SAAS,yBAAyB,EAClC,SAAS;AAAA,EAEZ,WAAW,EACR,OAAO,EACP,QAAQ,EAAE,EACV,SAAS,uBAAuB,EAChC,SAAS;AAAA;AAAA;AAAA,EAIZ,IAAI,EACD,IAAI,EACJ,SAAS,sDAAsD,EAC/D,SAAS;AAAA,EAEZ,UAAU,EACP,MAAM,kBAAkB,EACxB;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;ADjEM,IAAM,WAAW,YAAY,cAAc;;;AEPlD;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AASO,IAAM,sBAAwC;AAAA,EACnD,OAAO;AAAA,EACP,aACE;AAAA,EACF,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,IAAI,EAAE,SAAS,KAAK;AAAA,EACpB,KAAK;AAAA,IACH,CAAC,OAAO,QAAQ,EAAE,SAAS,cAAc,QAAQ,YAAY,CAAC;AAAA,IAC9D;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAqC;AAAA,EAChD,OAAO;AAAA,EACP,aACE;AAAA,EACF,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,IAAI,EAAE,SAAS,KAAK;AAAA,EACpB,KAAK;AAAA,IACH,CAAC,OAAO,QAAQ,EAAE,SAAS,eAAe,QAAQ,YAAY,CAAC;AAAA,IAC/D;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvGA,IAAM,gBAAiE,OACrE,WACG;AACH,MAAI;AAEJ,QAAMA,WACJ,CAAC,MAAe,SAChB,OAAO,YAAqC;AAnBhD,wBAAAC,KAAA;AAoBM,UAAM,UAAW,QAAQ,CAAC;AAG1B,QAAI,QAAQ,KAAK;AACf,YAAM,SAAS,IAAI,IAAI,QAAQ,GAAG;AAClC,aAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,WAAW,OAAO,MAAM;AAAA,IACrE;AACA,QAAI,QAAQ,UAAU;AACpB,aAAO,eAAe,UAAU,YAAY;AAAA,QAC1C,OAAO,QAAQ;AAAA,QACf,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,aAAa;AACvB,YAAM,MAAM,QAAQ,cAAc;AAClC,mBAAa,QAAQ,KAAK,KAAK,UAAU,QAAQ,WAAW,CAAC;AAAA,IAC/D;AACA,QAAI,QAAQ,UAAU;AACpB,YAAM,MAAM,QAAQ,aAAa;AACjC,mBAAa,QAAQ,KAAK,QAAQ,QAAQ;AAAA,IAC5C;AAOA,QAAI,CAAC,MAAM;AACT,YAAM,SAAS,MAAM,GAAU,EAAE,GAAG,QAAQ,MAAK,YAAO,QAAP,YAAc,KAAK,CAAC;AACrE,aAAO,EAAE,WAAW,OAAO,WAAW,KAAK,OAAO,IAAI;AAGtD,YAAM,aACJ,QAAQ,gBAENA,OAAA,wBAAO,YAAP,mBAAgB,YAAhB,mBAAyB,WAAzB,mBAAiC,aAAjC,gBAAAA,IACC,eACH;AACF,YAAM,YACJ,QAAQ,eAEN,8BAAO,YAAP,mBAAgB,YAAhB,mBAAyB,WAAzB,mBAAiC,aAAjC,mBACC,cACH;AACF,mBAAa,WAAW,UAAU;AAClC,mBAAa,WAAW,SAAS;AAGjC,UAAI,QAAQ,aAAa;AACvB,qBAAa,QAAQ,YAAY,KAAK,UAAU,QAAQ,WAAW,CAAC;AAAA,MACtE;AACA,UAAI,QAAQ,UAAU;AACpB,qBAAa,QAAQ,WAAW,QAAQ,QAAQ;AAAA,MAClD;AAIA,UAAI,OAAO,SAAS;AAClB,cAAM,KAAK,UAAU,QAAQ,WAAW,OAAO,OAAO;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,IACA,SAAAD;AAAA,EACF;AACF;AAGA,IAAM,UAAU,CAAC,OAAgB,QAAuC;AACtE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,QAAM,OAAO;AACb,QAAM,UAAU,IAAI;AAEpB,MAAI,KAAK,eAAe,OAAO,KAAK,gBAAgB,UAAU;AAC5D,UAAM,MACJ,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAC1D,YAAQ,QAAQ,KAAK,KAAK,UAAU,KAAK,WAAW,CAAC;AAAA,EACvD;AAEA,MAAI,OAAO,KAAK,aAAa,UAAU;AACrC,UAAM,MACJ,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACxD,YAAQ,QAAQ,KAAK,KAAK,QAAQ;AAAA,EACpC;AACF;","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"]}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,s={};((e,r)=>{for(var n in r)t(e,n,{get:r[n],enumerable:!0})})(s,{SourceSession:()=>f,default:()=>y,sessionStart:()=>g,sessionStorage:()=>u,sessionWindow:()=>d,sourceSession:()=>p}),module.exports=(e=s,((e,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))o.call(e,c)||c===i||t(e,c,{get:()=>s[c],enumerable:!(a=r(s,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var i=require("@walkeros/core"),a=require("@walkeros/web-core"),c=require("@walkeros/core");function d(e={}){var t,r;let n=e.isStart||!1;const o={isStart:n,storage:!1};if(!1===e.isStart)return o;const s=null!=(t=e.window)?t:window,i=null!=(r=e.document)?r:document;if(!n){const[e]=s.performance.getEntriesByType("navigation");if("navigate"!==e.type)return o}const a=new URL(e.url||s.location.href),d=e.referrer||i.referrer,u=d&&new URL(d).hostname,l=(0,c.getMarketingParameters)(a,e.parameters,e.clickIds);if(Object.keys(l).length&&(l.marketing||(l.marketing=!0),n=!0),!n){const t=e.domains||[];t.push(a.hostname),n=!t.includes(u)}return n?Object.assign({isStart:n,storage:!1,start:Date.now(),id:(0,c.getId)(12),referrer:u},l,e.data):o}function u(e={}){const t=Date.now(),{length:r=30,deviceKey:n="elbDeviceId",deviceStorage:o="local",deviceAge:s=30,sessionKey:c="elbSessionId",sessionStorage:u="local",pulse:l=!1}=e,g=e.window||e.document?{window:e.window,document:e.document}:void 0,m=d(e);let w=!1;const f=(0,i.tryCatch)((e,t,r)=>{let n=(0,a.storageRead)(e,r,g);return n||(n=(0,i.getId)(8),(0,a.storageWrite)(e,n,1440*t,r,void 0,g)),String(n)})(n,s,o),p=(0,i.tryCatch)((e,n)=>{const o=JSON.parse(String((0,a.storageRead)(e,n,g)));return l||(o.isNew=!1,m.marketing&&(Object.assign(o,m),w=!0),w||o.updated+6e4*r<t?(delete o.id,delete o.referrer,o.start=t,o.count++,o.runs=1,w=!0):o.runs++),o},()=>{w=!0})(c,u)||{},y={id:(0,i.getId)(12),start:t,isNew:!0,count:1,runs:1},v=Object.assign(y,m,p,{device:f},{isStart:w,storage:!0,updated:t},e.data);return(0,a.storageWrite)(c,JSON.stringify(v),2*r,u,void 0,g),v}var l=require("@walkeros/core");function g(e={}){const{cb:t,consent:r,collector:n,storage:o}=e;if(!r)return m((o?u:d)(e),n,t);{const o=function(e,t){const r=(r,n)=>{const o=n.collector;let s=()=>d(e);if(e.consent){const t=((0,l.isArray)(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});(0,l.getGrantedConsent)(t,r)&&(s=()=>u(e))}m(s(),o,t)};return r}(e,t),s=((0,l.isArray)(r)?r:[r]).reduce((e,t)=>({...e,[t]:o}),{});n&&n.command("on",{type:"consent",rules:s})}}function m(e,t,r){return!1===r?e:(r||(r=w),r(e,t,w))}var w=(e,t)=>{const r={};return e.id&&(r.session=e.id),e.storage&&e.device&&(r.device=e.device),t&&(t.command("user",r),t.command("session",e)),e.isStart&&t&&t.push({name:"session start",data:e}),e},f={},p=async e=>{const{config:t,env:r}=e,{elb:n,command:o}=r,s={...null==t?void 0:t.settings},i={push:n,command:o},a=()=>{g({...s,window:r.window,document:r.document,collector:i})};return{type:"session",config:{settings:s},push:n,init:async()=>{s.consent?a():await o("on",{type:"run",rules:[()=>a()]})}}},y=p;//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,s={};((e,r)=>{for(var n in r)t(e,n,{get:r[n],enumerable:!0})})(s,{SourceSession:()=>f,default:()=>y,sessionStart:()=>g,sessionStorage:()=>u,sessionWindow:()=>d,sourceSession:()=>p}),module.exports=(e=s,((e,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))o.call(e,c)||c===i||t(e,c,{get:()=>s[c],enumerable:!(a=r(s,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var i=require("@walkeros/core"),a=require("@walkeros/web-core"),c=require("@walkeros/core");function d(e={}){var t,r;let n=e.isStart||!1;const o={isStart:n,storage:!1};if(!1===e.isStart)return o;const s=null!=(t=e.window)?t:window,i=null!=(r=e.document)?r:document;if(!n){const[e]=s.performance.getEntriesByType("navigation");if("navigate"!==e.type)return o}const a=new URL(e.url||s.location.href),d=e.referrer||i.referrer,u=d&&new URL(d).hostname,l=(0,c.getMarketingParameters)(a,e.parameters,e.clickIds);if(Object.keys(l).length&&(l.marketing||(l.marketing=!0),n=!0),!n){const t=e.domains||[];t.push(a.hostname),n=!t.includes(u)}return n?Object.assign({isStart:n,storage:!1,start:Date.now(),id:(0,c.getId)(16),referrer:u},l,e.data):o}function u(e={}){const t=Date.now(),{length:r=30,deviceKey:n="elbDeviceId",deviceStorage:o="local",deviceAge:s=30,sessionKey:c="elbSessionId",sessionStorage:u="local",pulse:l=!1}=e,g=e.window||e.document?{window:e.window,document:e.document}:void 0,m=d(e);let w=!1;const f=(0,i.tryCatch)((e,t,r)=>{let n=(0,a.storageRead)(e,r,g);return n||(n=(0,i.getId)(16),(0,a.storageWrite)(e,n,1440*t,r,void 0,g)),String(n)})(n,s,o),p=(0,i.tryCatch)((e,n)=>{const o=JSON.parse(String((0,a.storageRead)(e,n,g)));return l||(o.isNew=!1,m.marketing&&(Object.assign(o,m),w=!0),w||o.updated+6e4*r<t?(delete o.id,delete o.referrer,o.start=t,o.count++,o.runs=1,w=!0):o.runs++),o},()=>{w=!0})(c,u)||{},y={id:(0,i.getId)(16),start:t,isNew:!0,count:1,runs:1},v=Object.assign(y,m,p,{device:f},{isStart:w,storage:!0,updated:t},e.data);return(0,a.storageWrite)(c,JSON.stringify(v),2*r,u,void 0,g),v}var l=require("@walkeros/core");function g(e={}){const{cb:t,consent:r,collector:n,storage:o}=e;if(!r)return m((o?u:d)(e),n,t);{const o=function(e,t){const r=(r,n)=>{const o=n.collector;let s=()=>d(e);if(e.consent){const t=((0,l.isArray)(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});(0,l.getGrantedConsent)(t,r)&&(s=()=>u(e))}m(s(),o,t)};return r}(e,t),s=((0,l.isArray)(r)?r:[r]).reduce((e,t)=>({...e,[t]:o}),{});n&&n.command("on",{type:"consent",rules:s})}}function m(e,t,r){return!1===r?e:(r||(r=w),r(e,t,w))}var w=(e,t)=>{const r={};return e.id&&(r.session=e.id),e.storage&&e.device&&(r.device=e.device),t&&(t.command("user",r),t.command("session",e)),e.isStart&&t&&t.push({name:"session start",data:e}),e},f={},p=async e=>{const{config:t,env:r}=e,{elb:n,command:o}=r,s={...null==t?void 0:t.settings},i={push:n,command:o},a=()=>{g({...s,window:r.window,document:r.document,collector:i})};return{type:"session",config:{settings:s},push:n,init:async()=>{s.consent?a():await o("on",{type:"run",rules:[()=>a()]})}}},y=p;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/sessionStorage.ts","../src/lib/sessionWindow.ts","../src/lib/sessionStart.ts","../src/types/index.ts"],"sourcesContent":["import type { Source, Collector } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { sessionStart } from './lib';\n\n// Export types for external usage\nexport * as SourceSession from './types';\n\n// Export lib functions for direct usage\nexport { sessionStart, sessionStorage, sessionWindow } from './lib';\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from './lib';\n\n/**\n * Session source implementation.\n *\n * This source handles session detection and management.\n */\nexport const sourceSession: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, command } = env;\n\n const settings: Settings = {\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Create minimal collector interface for sessionStart\n const collectorInterface: Partial<Collector.Instance> = {\n push: elb,\n command,\n };\n\n const runSessionStart = (): void => {\n sessionStart({\n ...settings,\n window: env.window,\n document: env.document,\n collector: collectorInterface as Collector.Instance,\n });\n };\n\n // Session detection runs in init() (Pass 2 of initSources), not the factory\n // (Pass 1), so construction stays side-effect free.\n //\n // Consent-gated (settings.consent): sessionStart registers a single consent\n // rule with the collector, which replays it at the run barrier and guarantees\n // exactly-once delivery, so the source does not react to consent itself.\n //\n // Ungated: the emit must wait for the run lifecycle. Calling sessionStart in\n // init() would push `session start` while the collector is not yet `allowed`,\n // dropping it at the dormant destination gate. Registering an on('run') rule\n // defers the emit into the now-allowed pipeline.\n const init = async (): Promise<void> => {\n if (settings.consent) {\n runSessionStart();\n } else {\n await command('on', { type: 'run', rules: [() => runSessionStart()] });\n }\n };\n\n return {\n type: 'session',\n config: fullConfig,\n push: elb,\n init,\n };\n};\n\nexport default sourceSession;\n","import type { Collector } from '@walkeros/core';\nimport type { SessionWindowConfig } from './sessionWindow';\nimport type { StorageType } from '@walkeros/core';\nimport type { StorageEnv } from '@walkeros/web-core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '@walkeros/web-core';\nimport { sessionWindow } from './sessionWindow';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const storageEnv: StorageEnv | undefined =\n config.window || config.document\n ? { window: config.window, document: config.document }\n : undefined;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage, storageEnv);\n if (!id) {\n id = getId(8); // Create a new device ID\n storageWrite(key, id, age * 1440, storage, undefined, storageEnv); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(\n String(storageRead(key, storage, storageEnv)),\n );\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(12),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(\n sessionKey,\n JSON.stringify(session),\n length * 2,\n sessionStorage,\n undefined,\n storageEnv,\n );\n\n return session;\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type ClickIdEntry,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n clickIds?: ClickIdEntry[];\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n const win = config.window ?? window;\n const doc = config.document ?? document;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = win.performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || win.location.href);\n const ref = config.referrer || doc.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(\n url,\n config.parameters,\n config.clickIds,\n );\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(12),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Collector, WalkerOS, On, ClickIdEntry } from '@walkeros/core';\nimport type { SessionStorageConfig } from './sessionStorage';\nimport { sessionStorage } from './sessionStorage';\nimport { sessionWindow } from './sessionWindow';\nimport { getGrantedConsent, isArray } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n clickIds?: ClickIdEntry[];\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentRule>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n if (collector) {\n collector.command('on', { type: 'consent', rules: consentConfig });\n }\n // No fallback - session source always provides collector\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(\n config: SessionConfig,\n cb?: SessionCallback | false,\n): On.ConsentFn {\n const func: On.ConsentFn = (consent, context) => {\n const collector = context.collector;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs and broadcast session data\n if (collector) {\n collector.command('user', user);\n collector.command('session', session);\n }\n // No fallback - session source always provides collector\n\n if (session.isStart) {\n // Convert session start to an event object\n if (collector) {\n collector.push({\n name: 'session start',\n data: session,\n });\n }\n // No fallback - session source always provides collector\n }\n\n return session;\n};\n","import type { Source, Elb } from '@walkeros/core';\nimport type { SessionConfig, SessionCallback } from '../lib';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n session: { type: 'session'; platform?: 'web' };\n }\n}\n\n// Settings: configuration for session source\nexport interface Settings extends SessionConfig {\n // All settings inherited from SessionConfig:\n // - consent?: string | string[]\n // - storage?: boolean\n // - cb?: SessionCallback | false\n // - pulse?: boolean\n // - sessionStorage?: 'local' | 'session'\n // - deviceStorage?: 'local' | 'session'\n // - sessionKey?: string\n // - deviceKey?: string\n // - length?: number (session timeout in minutes)\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\n// Re-export session types from lib\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from '../lib';\n"],"mappings":"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","names":["import_core","sessionStorage","session","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/sessionStorage.ts","../src/lib/sessionWindow.ts","../src/lib/sessionStart.ts","../src/types/index.ts"],"sourcesContent":["import type { Source, Collector } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { sessionStart } from './lib';\n\n// Export types for external usage\nexport * as SourceSession from './types';\n\n// Export lib functions for direct usage\nexport { sessionStart, sessionStorage, sessionWindow } from './lib';\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from './lib';\n\n/**\n * Session source implementation.\n *\n * This source handles session detection and management.\n */\nexport const sourceSession: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, command } = env;\n\n const settings: Settings = {\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Create minimal collector interface for sessionStart\n const collectorInterface: Partial<Collector.Instance> = {\n push: elb,\n command,\n };\n\n const runSessionStart = (): void => {\n sessionStart({\n ...settings,\n window: env.window,\n document: env.document,\n collector: collectorInterface as Collector.Instance,\n });\n };\n\n // Session detection runs in init() (Pass 2 of initSources), not the factory\n // (Pass 1), so construction stays side-effect free.\n //\n // Consent-gated (settings.consent): sessionStart registers a single consent\n // rule with the collector, which replays it at the run barrier and guarantees\n // exactly-once delivery, so the source does not react to consent itself.\n //\n // Ungated: the emit must wait for the run lifecycle. Calling sessionStart in\n // init() would push `session start` while the collector is not yet `allowed`,\n // dropping it at the dormant destination gate. Registering an on('run') rule\n // defers the emit into the now-allowed pipeline.\n const init = async (): Promise<void> => {\n if (settings.consent) {\n runSessionStart();\n } else {\n await command('on', { type: 'run', rules: [() => runSessionStart()] });\n }\n };\n\n return {\n type: 'session',\n config: fullConfig,\n push: elb,\n init,\n };\n};\n\nexport default sourceSession;\n","import type { Collector } from '@walkeros/core';\nimport type { SessionWindowConfig } from './sessionWindow';\nimport type { StorageType } from '@walkeros/core';\nimport type { StorageEnv } from '@walkeros/web-core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '@walkeros/web-core';\nimport { sessionWindow } from './sessionWindow';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const storageEnv: StorageEnv | undefined =\n config.window || config.document\n ? { window: config.window, document: config.document }\n : undefined;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage, storageEnv);\n if (!id) {\n id = getId(16); // Create a new device ID\n storageWrite(key, id, age * 1440, storage, undefined, storageEnv); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(\n String(storageRead(key, storage, storageEnv)),\n );\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(16),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(\n sessionKey,\n JSON.stringify(session),\n length * 2,\n sessionStorage,\n undefined,\n storageEnv,\n );\n\n return session;\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type ClickIdEntry,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n clickIds?: ClickIdEntry[];\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n const win = config.window ?? window;\n const doc = config.document ?? document;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = win.performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || win.location.href);\n const ref = config.referrer || doc.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(\n url,\n config.parameters,\n config.clickIds,\n );\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(16),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Collector, WalkerOS, On, ClickIdEntry } from '@walkeros/core';\nimport type { SessionStorageConfig } from './sessionStorage';\nimport { sessionStorage } from './sessionStorage';\nimport { sessionWindow } from './sessionWindow';\nimport { getGrantedConsent, isArray } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n clickIds?: ClickIdEntry[];\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentRule>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n if (collector) {\n collector.command('on', { type: 'consent', rules: consentConfig });\n }\n // No fallback - session source always provides collector\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(\n config: SessionConfig,\n cb?: SessionCallback | false,\n): On.ConsentFn {\n const func: On.ConsentFn = (consent, context) => {\n const collector = context.collector;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs and broadcast session data\n if (collector) {\n collector.command('user', user);\n collector.command('session', session);\n }\n // No fallback - session source always provides collector\n\n if (session.isStart) {\n // Convert session start to an event object\n if (collector) {\n collector.push({\n name: 'session start',\n data: session,\n });\n }\n // No fallback - session source always provides collector\n }\n\n return session;\n};\n","import type { Source, Elb } from '@walkeros/core';\nimport type { SessionConfig, SessionCallback } from '../lib';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n session: { type: 'session'; platform?: 'web' };\n }\n}\n\n// Settings: configuration for session source\nexport interface Settings extends SessionConfig {\n // All settings inherited from SessionConfig:\n // - consent?: string | string[]\n // - storage?: boolean\n // - cb?: SessionCallback | false\n // - pulse?: boolean\n // - sessionStorage?: 'local' | 'session'\n // - deviceStorage?: 'local' | 'session'\n // - sessionKey?: string\n // - deviceKey?: string\n // - length?: number (session timeout in minutes)\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\n// Re-export session types from lib\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from '../lib';\n"],"mappings":"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","names":["import_core","sessionStorage","session","import_core"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{getId as e,tryCatch as t}from"@walkeros/core";import{storageRead as n,storageWrite as o}from"@walkeros/web-core";import{getId as r,getMarketingParameters as s}from"@walkeros/core";function i(e={}){var t,n;let o=e.isStart||!1;const i={isStart:o,storage:!1};if(!1===e.isStart)return i;const c=null!=(t=e.window)?t:window,a=null!=(n=e.document)?n:document;if(!o){const[e]=c.performance.getEntriesByType("navigation");if("navigate"!==e.type)return i}const d=new URL(e.url||c.location.href),u=e.referrer||a.referrer,l=u&&new URL(u).hostname,m=s(d,e.parameters,e.clickIds);if(Object.keys(m).length&&(m.marketing||(m.marketing=!0),o=!0),!o){const t=e.domains||[];t.push(d.hostname),o=!t.includes(l)}return o?Object.assign({isStart:o,storage:!1,start:Date.now(),id:r(12),referrer:l},m,e.data):i}function c(r={}){const s=Date.now(),{length:c=30,deviceKey:a="elbDeviceId",deviceStorage:d="local",deviceAge:u=30,sessionKey:l="elbSessionId",sessionStorage:m="local",pulse:g=!1}=r,w=r.window||r.document?{window:r.window,document:r.document}:void 0,f=i(r);let p=!1;const v=t((t,r,s)=>{let i=n(t,s,w);return i||(i=e(8),o(t,i,1440*r,s,void 0,w)),String(i)})(a,u,d),S=t((e,t)=>{const o=JSON.parse(String(n(e,t,w)));return g||(o.isNew=!1,f.marketing&&(Object.assign(o,f),p=!0),p||o.updated+6e4*c<s?(delete o.id,delete o.referrer,o.start=s,o.count++,o.runs=1,p=!0):o.runs++),o},()=>{p=!0})(l,m)||{},y={id:e(12),start:s,isNew:!0,count:1,runs:1},b=Object.assign(y,f,S,{device:v},{isStart:p,storage:!0,updated:s},r.data);return o(l,JSON.stringify(b),2*c,m,void 0,w),b}import{getGrantedConsent as a,isArray as d}from"@walkeros/core";function u(e={}){const{cb:t,consent:n,collector:o,storage:r}=e;if(!n)return l((r?c:i)(e),o,t);{const r=function(e,t){const n=(n,o)=>{const r=o.collector;let s=()=>i(e);if(e.consent){const t=(d(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});a(t,n)&&(s=()=>c(e))}l(s(),r,t)};return n}(e,t),s=(d(n)?n:[n]).reduce((e,t)=>({...e,[t]:r}),{});o&&o.command("on",{type:"consent",rules:s})}}function l(e,t,n){return!1===n?e:(n||(n=m),n(e,t,m))}var m=(e,t)=>{const n={};return e.id&&(n.session=e.id),e.storage&&e.device&&(n.device=e.device),t&&(t.command("user",n),t.command("session",e)),e.isStart&&t&&t.push({name:"session start",data:e}),e},g={},w=async e=>{const{config:t,env:n}=e,{elb:o,command:r}=n,s={...null==t?void 0:t.settings},i={push:o,command:r},c=()=>{u({...s,window:n.window,document:n.document,collector:i})};return{type:"session",config:{settings:s},push:o,init:async()=>{s.consent?c():await r("on",{type:"run",rules:[()=>c()]})}}},f=w;export{g as SourceSession,f as default,u as sessionStart,c as sessionStorage,i as sessionWindow,w as sourceSession};//# sourceMappingURL=index.mjs.map
1
+ import{getId as e,tryCatch as t}from"@walkeros/core";import{storageRead as n,storageWrite as o}from"@walkeros/web-core";import{getId as r,getMarketingParameters as s}from"@walkeros/core";function i(e={}){var t,n;let o=e.isStart||!1;const i={isStart:o,storage:!1};if(!1===e.isStart)return i;const c=null!=(t=e.window)?t:window,a=null!=(n=e.document)?n:document;if(!o){const[e]=c.performance.getEntriesByType("navigation");if("navigate"!==e.type)return i}const d=new URL(e.url||c.location.href),u=e.referrer||a.referrer,l=u&&new URL(u).hostname,m=s(d,e.parameters,e.clickIds);if(Object.keys(m).length&&(m.marketing||(m.marketing=!0),o=!0),!o){const t=e.domains||[];t.push(d.hostname),o=!t.includes(l)}return o?Object.assign({isStart:o,storage:!1,start:Date.now(),id:r(16),referrer:l},m,e.data):i}function c(r={}){const s=Date.now(),{length:c=30,deviceKey:a="elbDeviceId",deviceStorage:d="local",deviceAge:u=30,sessionKey:l="elbSessionId",sessionStorage:m="local",pulse:g=!1}=r,w=r.window||r.document?{window:r.window,document:r.document}:void 0,f=i(r);let p=!1;const v=t((t,r,s)=>{let i=n(t,s,w);return i||(i=e(16),o(t,i,1440*r,s,void 0,w)),String(i)})(a,u,d),S=t((e,t)=>{const o=JSON.parse(String(n(e,t,w)));return g||(o.isNew=!1,f.marketing&&(Object.assign(o,f),p=!0),p||o.updated+6e4*c<s?(delete o.id,delete o.referrer,o.start=s,o.count++,o.runs=1,p=!0):o.runs++),o},()=>{p=!0})(l,m)||{},y={id:e(16),start:s,isNew:!0,count:1,runs:1},b=Object.assign(y,f,S,{device:v},{isStart:p,storage:!0,updated:s},r.data);return o(l,JSON.stringify(b),2*c,m,void 0,w),b}import{getGrantedConsent as a,isArray as d}from"@walkeros/core";function u(e={}){const{cb:t,consent:n,collector:o,storage:r}=e;if(!n)return l((r?c:i)(e),o,t);{const r=function(e,t){const n=(n,o)=>{const r=o.collector;let s=()=>i(e);if(e.consent){const t=(d(e.consent)?e.consent:[e.consent]).reduce((e,t)=>({...e,[t]:!0}),{});a(t,n)&&(s=()=>c(e))}l(s(),r,t)};return n}(e,t),s=(d(n)?n:[n]).reduce((e,t)=>({...e,[t]:r}),{});o&&o.command("on",{type:"consent",rules:s})}}function l(e,t,n){return!1===n?e:(n||(n=m),n(e,t,m))}var m=(e,t)=>{const n={};return e.id&&(n.session=e.id),e.storage&&e.device&&(n.device=e.device),t&&(t.command("user",n),t.command("session",e)),e.isStart&&t&&t.push({name:"session start",data:e}),e},g={},w=async e=>{const{config:t,env:n}=e,{elb:o,command:r}=n,s={...null==t?void 0:t.settings},i={push:o,command:r},c=()=>{u({...s,window:n.window,document:n.document,collector:i})};return{type:"session",config:{settings:s},push:o,init:async()=>{s.consent?c():await r("on",{type:"run",rules:[()=>c()]})}}},f=w;export{g as SourceSession,f as default,u as sessionStart,c as sessionStorage,i as sessionWindow,w as sourceSession};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/sessionStorage.ts","../src/lib/sessionWindow.ts","../src/lib/sessionStart.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { Collector } from '@walkeros/core';\nimport type { SessionWindowConfig } from './sessionWindow';\nimport type { StorageType } from '@walkeros/core';\nimport type { StorageEnv } from '@walkeros/web-core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '@walkeros/web-core';\nimport { sessionWindow } from './sessionWindow';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const storageEnv: StorageEnv | undefined =\n config.window || config.document\n ? { window: config.window, document: config.document }\n : undefined;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage, storageEnv);\n if (!id) {\n id = getId(8); // Create a new device ID\n storageWrite(key, id, age * 1440, storage, undefined, storageEnv); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(\n String(storageRead(key, storage, storageEnv)),\n );\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(12),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(\n sessionKey,\n JSON.stringify(session),\n length * 2,\n sessionStorage,\n undefined,\n storageEnv,\n );\n\n return session;\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type ClickIdEntry,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n clickIds?: ClickIdEntry[];\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n const win = config.window ?? window;\n const doc = config.document ?? document;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = win.performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || win.location.href);\n const ref = config.referrer || doc.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(\n url,\n config.parameters,\n config.clickIds,\n );\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(12),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Collector, WalkerOS, On, ClickIdEntry } from '@walkeros/core';\nimport type { SessionStorageConfig } from './sessionStorage';\nimport { sessionStorage } from './sessionStorage';\nimport { sessionWindow } from './sessionWindow';\nimport { getGrantedConsent, isArray } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n clickIds?: ClickIdEntry[];\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentRule>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n if (collector) {\n collector.command('on', { type: 'consent', rules: consentConfig });\n }\n // No fallback - session source always provides collector\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(\n config: SessionConfig,\n cb?: SessionCallback | false,\n): On.ConsentFn {\n const func: On.ConsentFn = (consent, context) => {\n const collector = context.collector;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs and broadcast session data\n if (collector) {\n collector.command('user', user);\n collector.command('session', session);\n }\n // No fallback - session source always provides collector\n\n if (session.isStart) {\n // Convert session start to an event object\n if (collector) {\n collector.push({\n name: 'session start',\n data: session,\n });\n }\n // No fallback - session source always provides collector\n }\n\n return session;\n};\n","import type { Source, Elb } from '@walkeros/core';\nimport type { SessionConfig, SessionCallback } from '../lib';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n session: { type: 'session'; platform?: 'web' };\n }\n}\n\n// Settings: configuration for session source\nexport interface Settings extends SessionConfig {\n // All settings inherited from SessionConfig:\n // - consent?: string | string[]\n // - storage?: boolean\n // - cb?: SessionCallback | false\n // - pulse?: boolean\n // - sessionStorage?: 'local' | 'session'\n // - deviceStorage?: 'local' | 'session'\n // - sessionKey?: string\n // - deviceKey?: string\n // - length?: number (session timeout in minutes)\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\n// Re-export session types from lib\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from '../lib';\n","import type { Source, Collector } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { sessionStart } from './lib';\n\n// Export types for external usage\nexport * as SourceSession from './types';\n\n// Export lib functions for direct usage\nexport { sessionStart, sessionStorage, sessionWindow } from './lib';\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from './lib';\n\n/**\n * Session source implementation.\n *\n * This source handles session detection and management.\n */\nexport const sourceSession: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, command } = env;\n\n const settings: Settings = {\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Create minimal collector interface for sessionStart\n const collectorInterface: Partial<Collector.Instance> = {\n push: elb,\n command,\n };\n\n const runSessionStart = (): void => {\n sessionStart({\n ...settings,\n window: env.window,\n document: env.document,\n collector: collectorInterface as Collector.Instance,\n });\n };\n\n // Session detection runs in init() (Pass 2 of initSources), not the factory\n // (Pass 1), so construction stays side-effect free.\n //\n // Consent-gated (settings.consent): sessionStart registers a single consent\n // rule with the collector, which replays it at the run barrier and guarantees\n // exactly-once delivery, so the source does not react to consent itself.\n //\n // Ungated: the emit must wait for the run lifecycle. Calling sessionStart in\n // init() would push `session start` while the collector is not yet `allowed`,\n // dropping it at the dormant destination gate. Registering an on('run') rule\n // defers the emit into the now-allowed pipeline.\n const init = async (): Promise<void> => {\n if (settings.consent) {\n runSessionStart();\n } else {\n await command('on', { type: 'run', rules: [() => runSessionStart()] });\n }\n };\n\n return {\n type: 'session',\n config: fullConfig,\n push: elb,\n init,\n };\n};\n\nexport default sourceSession;\n"],"mappings":"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","names":["getId","sessionStorage","getId","session"]}
1
+ {"version":3,"sources":["../src/lib/sessionStorage.ts","../src/lib/sessionWindow.ts","../src/lib/sessionStart.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { Collector } from '@walkeros/core';\nimport type { SessionWindowConfig } from './sessionWindow';\nimport type { StorageType } from '@walkeros/core';\nimport type { StorageEnv } from '@walkeros/web-core';\nimport { getId, tryCatch } from '@walkeros/core';\nimport { storageRead, storageWrite } from '@walkeros/web-core';\nimport { sessionWindow } from './sessionWindow';\n\nexport interface SessionStorageConfig extends SessionWindowConfig {\n deviceKey?: string;\n deviceStorage?: StorageType;\n deviceAge?: number;\n sessionKey?: string;\n sessionStorage?: StorageType;\n length?: number; // Minutes after last update to consider session as expired (default: 30)\n pulse?: boolean;\n}\n\nexport function sessionStorage(\n config: SessionStorageConfig = {},\n): Collector.SessionData {\n const now = Date.now();\n const {\n length = 30, // Session length in minutes\n deviceKey = 'elbDeviceId',\n deviceStorage = 'local',\n deviceAge = 30, // Device ID age in days\n sessionKey = 'elbSessionId',\n sessionStorage = 'local',\n pulse = false, // Handle the counting\n } = config;\n const storageEnv: StorageEnv | undefined =\n config.window || config.document\n ? { window: config.window, document: config.document }\n : undefined;\n const windowSession = sessionWindow(config); // Status based on window only\n let isStart = false;\n\n // Retrieve or create device ID\n const device = tryCatch((key: string, age: number, storage: StorageType) => {\n let id = storageRead(key, storage, storageEnv);\n if (!id) {\n id = getId(16); // Create a new device ID\n storageWrite(key, id, age * 1440, storage, undefined, storageEnv); // Write device ID to storage\n }\n return String(id);\n })(deviceKey, deviceAge, deviceStorage);\n\n // Retrieve or initialize session data\n const existingSession: Collector.SessionData =\n tryCatch(\n (key: string, storage?: StorageType) => {\n const session = JSON.parse(\n String(storageRead(key, storage, storageEnv)),\n );\n\n // Only update session if it's not a pulse check\n if (pulse) return session;\n\n // Mark session as not new by default\n session.isNew = false;\n\n // Handle new marketing entry\n if (windowSession.marketing) {\n Object.assign(session, windowSession); // Overwrite existing session with marketing data\n isStart = true; // This is a session start\n }\n\n // Check if session is still active\n if (isStart || session.updated + length * 60000 < now) {\n // Session has expired\n delete session.id; // Unset session ID\n delete session.referrer; // Unset referrer\n session.start = now; // Set new session start\n session.count++; // Increase session count\n session.runs = 1; // Reset runs\n isStart = true; // It's a new session\n } else {\n // Session is still active\n session.runs++; // Increase number of runs\n }\n\n return session;\n },\n () => {\n // No existing session or something went wrong\n isStart = true; // Start a new session\n },\n )(sessionKey, sessionStorage) || {};\n\n // Default session data\n const defaultSession: Partial<Collector.SessionData> = {\n id: getId(16),\n start: now,\n isNew: true,\n count: 1,\n runs: 1,\n };\n\n // Merge session data\n const session = Object.assign(\n defaultSession, // Default session values\n windowSession, // Basic session data based on window\n existingSession, // (Updated) existing session\n { device }, // Device ID\n { isStart, storage: true, updated: now }, // Status of the session\n config.data, // Given data has the highest priority\n );\n\n // Write (updated) session to storage\n storageWrite(\n sessionKey,\n JSON.stringify(session),\n length * 2,\n sessionStorage,\n undefined,\n storageEnv,\n );\n\n return session;\n}\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport {\n getId,\n getMarketingParameters,\n type ClickIdEntry,\n type MarketingParameters,\n} from '@walkeros/core';\n\nexport interface SessionWindowConfig {\n clickIds?: ClickIdEntry[];\n data?: WalkerOS.Properties;\n domains?: string[];\n isStart?: boolean;\n parameters?: MarketingParameters;\n referrer?: string;\n url?: string;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function sessionWindow(\n config: SessionWindowConfig = {},\n): Collector.SessionData {\n let isStart = config.isStart || false;\n const known = { isStart, storage: false };\n\n // If session has explicitly started, return known\n if (config.isStart === false) return known;\n\n const win = config.window ?? window;\n const doc = config.document ?? document;\n\n // Entry type\n if (!isStart) {\n // Only focus on linked or direct navigation types\n // and ignore reloads and all others\n const [perf] = win.performance.getEntriesByType(\n 'navigation',\n ) as PerformanceNavigationTiming[];\n if (perf.type !== 'navigate') return known;\n }\n\n const url = new URL(config.url || win.location.href);\n const ref = config.referrer || doc.referrer;\n const referrer = ref && new URL(ref).hostname;\n\n // Marketing\n const marketing = getMarketingParameters(\n url,\n config.parameters,\n config.clickIds,\n );\n if (Object.keys(marketing).length) {\n // Check for marketing parameters like UTM and add existing\n if (!marketing.marketing)\n // Flag as a marketing session without overwriting\n marketing.marketing = true;\n\n isStart = true;\n }\n\n // Referrer\n if (!isStart) {\n // Small chance of multiple unintended events for same users\n // https://en.wikipedia.org/wiki/HTTP_referer#Referrer_hiding\n // Use domains: [''] to disable direct or hidden referrer\n\n const domains = config.domains || [];\n domains.push(url.hostname);\n isStart = !domains.includes(referrer);\n }\n\n return isStart\n ? // It's a session start, moin\n Object.assign(\n {\n isStart,\n storage: false,\n start: Date.now(),\n id: getId(16),\n referrer,\n },\n marketing,\n config.data,\n )\n : // No session start\n known;\n}\n","import type { Collector, WalkerOS, On, ClickIdEntry } from '@walkeros/core';\nimport type { SessionStorageConfig } from './sessionStorage';\nimport { sessionStorage } from './sessionStorage';\nimport { sessionWindow } from './sessionWindow';\nimport { getGrantedConsent, isArray } from '@walkeros/core';\n\nexport interface SessionConfig extends SessionStorageConfig {\n clickIds?: ClickIdEntry[];\n consent?: string | string[];\n storage?: boolean;\n cb?: SessionCallback | false;\n collector?: Collector.Instance;\n}\n\nexport type SessionFunction = typeof sessionStorage | typeof sessionWindow;\nexport type SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n) => void;\n\nexport function sessionStart(\n config: SessionConfig = {},\n): Collector.SessionData | void {\n const { cb, consent, collector, storage } = config;\n const sessionFn: SessionFunction = storage ? sessionStorage : sessionWindow;\n\n // Consent\n if (consent) {\n const consentHandler = onConsentFn(config, cb);\n\n const consentConfig = (\n isArray(consent) ? consent : [consent]\n ).reduce<On.ConsentRule>(\n (acc, key) => ({ ...acc, [key]: consentHandler }),\n {},\n );\n // Register consent handlers with the collector\n if (collector) {\n collector.command('on', { type: 'consent', rules: consentConfig });\n }\n // No fallback - session source always provides collector\n } else {\n // just do it\n return callFuncAndCb(sessionFn(config), collector, cb);\n }\n}\n\nfunction callFuncAndCb(\n session: Collector.SessionData,\n collector?: Collector.Instance,\n cb?: SessionCallback | false,\n) {\n if (cb === false) return session; // Callback is disabled\n if (!cb) cb = defaultCb; // Default callback if none is provided\n return cb(session, collector, defaultCb);\n}\n\nfunction onConsentFn(\n config: SessionConfig,\n cb?: SessionCallback | false,\n): On.ConsentFn {\n const func: On.ConsentFn = (consent, context) => {\n const collector = context.collector;\n\n let sessionFn: SessionFunction = () => sessionWindow(config); // Window by default\n\n if (config.consent) {\n const consentKeys = (\n isArray(config.consent) ? config.consent : [config.consent]\n ).reduce<WalkerOS.Consent>((acc, key) => ({ ...acc, [key]: true }), {});\n\n if (getGrantedConsent(consentKeys, consent))\n // Use storage if consent is granted\n sessionFn = () => sessionStorage(config);\n }\n\n callFuncAndCb(sessionFn(), collector, cb);\n };\n\n return func;\n}\n\nconst defaultCb: SessionCallback = (\n session,\n collector,\n): Collector.SessionData => {\n const user: WalkerOS.User = {};\n\n // User.session is the session ID\n if (session.id) user.session = session.id;\n\n // Set device ID only in storage mode\n if (session.storage && session.device) user.device = session.device;\n\n // Set user IDs and broadcast session data\n if (collector) {\n collector.command('user', user);\n collector.command('session', session);\n }\n // No fallback - session source always provides collector\n\n if (session.isStart) {\n // Convert session start to an event object\n if (collector) {\n collector.push({\n name: 'session start',\n data: session,\n });\n }\n // No fallback - session source always provides collector\n }\n\n return session;\n};\n","import type { Source, Elb } from '@walkeros/core';\nimport type { SessionConfig, SessionCallback } from '../lib';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n session: { type: 'session'; platform?: 'web' };\n }\n}\n\n// Settings: configuration for session source\nexport interface Settings extends SessionConfig {\n // All settings inherited from SessionConfig:\n // - consent?: string | string[]\n // - storage?: boolean\n // - cb?: SessionCallback | false\n // - pulse?: boolean\n // - sessionStorage?: 'local' | 'session'\n // - deviceStorage?: 'local' | 'session'\n // - sessionKey?: string\n // - deviceKey?: string\n // - length?: number (session timeout in minutes)\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\n// Re-export session types from lib\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from '../lib';\n","import type { Source, Collector } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { sessionStart } from './lib';\n\n// Export types for external usage\nexport * as SourceSession from './types';\n\n// Export lib functions for direct usage\nexport { sessionStart, sessionStorage, sessionWindow } from './lib';\nexport type {\n SessionConfig,\n SessionCallback,\n SessionFunction,\n SessionStorageConfig,\n SessionWindowConfig,\n} from './lib';\n\n/**\n * Session source implementation.\n *\n * This source handles session detection and management.\n */\nexport const sourceSession: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, command } = env;\n\n const settings: Settings = {\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Create minimal collector interface for sessionStart\n const collectorInterface: Partial<Collector.Instance> = {\n push: elb,\n command,\n };\n\n const runSessionStart = (): void => {\n sessionStart({\n ...settings,\n window: env.window,\n document: env.document,\n collector: collectorInterface as Collector.Instance,\n });\n };\n\n // Session detection runs in init() (Pass 2 of initSources), not the factory\n // (Pass 1), so construction stays side-effect free.\n //\n // Consent-gated (settings.consent): sessionStart registers a single consent\n // rule with the collector, which replays it at the run barrier and guarantees\n // exactly-once delivery, so the source does not react to consent itself.\n //\n // Ungated: the emit must wait for the run lifecycle. Calling sessionStart in\n // init() would push `session start` while the collector is not yet `allowed`,\n // dropping it at the dormant destination gate. Registering an on('run') rule\n // defers the emit into the now-allowed pipeline.\n const init = async (): Promise<void> => {\n if (settings.consent) {\n runSessionStart();\n } else {\n await command('on', { type: 'run', rules: [() => runSessionStart()] });\n }\n };\n\n return {\n type: 'session',\n config: fullConfig,\n push: elb,\n init,\n };\n};\n\nexport default sourceSession;\n"],"mappings":"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","names":["getId","sessionStorage","getId","session"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/web-source-session",
4
- "version": "4.2.1-next-1781682752679",
4
+ "version": "4.2.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 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 Yt({...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)}}}}"
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 Qt({...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": {
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.2.1-next-1781682752679",
4
+ "version": "4.2.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.2.1-next-1781682752679",
37
- "@walkeros/web-core": "4.2.1-next-1781682752679"
36
+ "@walkeros/core": "4.2.1",
37
+ "@walkeros/web-core": "4.2.1"
38
38
  },
39
39
  "devDependencies": {
40
- "@walkeros/collector": "4.2.1-next-1781682752679"
40
+ "@walkeros/collector": "4.2.1"
41
41
  },
42
42
  "repository": {
43
43
  "url": "git+https://github.com/elbwalker/walkerOS.git",