@walkeros/web-source-session 4.2.0-next-1780690800063 → 4.2.0-next-1780909874350
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 +4 -3
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/walkerOS.json +2 -2
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @walkeros/web-source-session
|
|
2
2
|
|
|
3
|
-
## 4.2.0-next-
|
|
3
|
+
## 4.2.0-next-1780909874350
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
- Updated dependencies [654ba38]
|
|
16
16
|
- Updated dependencies [6a72a32]
|
|
17
17
|
- Updated dependencies [3eb2467]
|
|
18
|
-
|
|
19
|
-
- @walkeros/
|
|
18
|
+
- Updated dependencies [7d8ebf9]
|
|
19
|
+
- @walkeros/core@4.2.0-next-1780909874350
|
|
20
|
+
- @walkeros/web-core@4.2.0-next-1780909874350
|
|
20
21
|
|
|
21
22
|
## 4.1.2
|
|
22
23
|
|
package/dist/dev.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,r=(e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})},i={};r(i,{examples:()=>f,schemas:()=>a}),module.exports=(e=i,((e,r,i,a)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let c of o(r))s.call(e,c)||c===i||t(e,c,{get:()=>r[c],enumerable:!(a=n(r,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var a={};r(a,{SettingsSchema:()=>u,settings:()=>d});var c=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=l.z.object({storage:l.z.boolean().default(!1).describe("Enable persistent storage for session/device IDs").optional(),consent:l.z.union([l.z.string(),l.z.array(l.z.string())]).describe("Consent key(s) required to enable storage mode").optional(),length:l.z.number().default(30).describe("Session timeout in minutes").optional(),pulse:l.z.boolean().default(!1).describe("Keep session alive on each event").optional(),sessionKey:l.z.string().default("elbSessionId").describe("Storage key for session ID").optional(),sessionStorage:l.z.enum(["local","session"]).default("local").describe("Storage type for session").optional(),deviceKey:l.z.string().default("elbDeviceId").describe("Storage key for device ID").optional(),deviceStorage:l.z.enum(["local","session"]).default("local").describe("Storage type for device").optional(),deviceAge:l.z.number().default(30).describe("Device ID age in days").optional(),cb:l.z.any().describe("Custom session callback function or false to disable").optional(),clickIds:l.z.array(l.ClickIdEntrySchema).describe("Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.").optional()}),d=(0,c.zodToSchema)(u),f={};r(f,{createTrigger:()=>Me,step:()=>p,trigger:()=>_e});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"),O=require("@walkeros/core"),x=require("@walkeros/core"),j=require("@walkeros/core"),D={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",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(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function $(e,t){return e?t.stores[e]:t.stores.__cache}function M(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?n[o]={next:e}:n[o]={}}return n}function _(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function T(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function P(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:(0,S.createIngest)(n),config:t.config,env:N(t.config.env)};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 z(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...N(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=A(e,{stepId:(0,S.stepId)("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});(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 K(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,S.createIngest)(t)}async function H(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)(P,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?E(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=>$(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 O=r.config.before;if(O){const n=(0,S.getNextSteps)(O,(0,S.buildCacheContext)(s,v));if(1===n.length){const o=T(n[0],M(t));if(o.length>0){const n=await H(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)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),v,K(s,n),void 0,i)))}k&&k.length>0&&(v=await(0,S.applyState)(k,t=>$(t,e),v,e));const x=await(0,S.tryCatchAsync)(z,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,v,s,m);if(!1===x)return{event:null,respond:m};if(Array.isArray(x)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(x.map(async n=>{const o=await C(n.event||v),a=K(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=T(s[0],M(t));return n.length>0?H(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>(0,S.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),o,K(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?H(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(x&&"object"==typeof x){const{event:n,respond:o,next:r}=x;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=T(a[0],M(t));return n.length>0?H(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)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),o,K(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}I&&I.length>0&&(v=await(0,S.applyState)(I,t=>$(t,e),v,e)),q&&w&&(0,S.storeCache)(w,q.key,v,q.ttl);const j=r.config.next,D="string"==typeof j||Array.isArray(j)&&j.every(e=>"string"==typeof e),A=void 0!==j&&!D;if((!x||"object"==typeof x&&!x.next)&&A){const n=(0,S.getNextSteps)(r.config.next,(0,S.buildCacheContext)(s,v));if(1===n.length){const o=T(n[0],M(t));return o.length>0?H(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>(0,S.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),v,K(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function N(e){return e&&(0,S.isObject)(e)?e:{}}function F(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function R(e,t,n){var o,s;if(!t.on||!(null==(o=t.queueOn)?void 0:o.length))return;const r=t.queueOn;t.queueOn=[];const i=n||(null==(s=t.config)?void 0:s.id)||"unknown";for(const{type:n,data:o}of r)L(n)&&!Z(e,t,n)||(await(0,k.tryCatchAsync)(t.on,t=>{if(t instanceof k.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o),L(n)&&X(e,t,n))}function B(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function G(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,k.compileState)(f):void 0,g=d,h=g?(0,k.compileCache)({...g,stop:null==(s=g.stop)||s}):void 0,v=F(l)?T(l,M(e.transformers)):void 0,m=F(u)?T(u,M(e.transformers)):void 0,y=a.push,w=null!=y?y:e.push,b=Boolean(y),S=async(n,o,s)=>{var r;let a;const c=null!=m?m:void 0!==u?(()=>{const t=(0,k.getNextSteps)(u,(0,k.buildCacheContext)(s.ingest));return 0===t.length?[]:T(1===t.length?t[0]:t,M(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await H(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=E(h,e);if(t){const n=(0,k.buildCacheContext)(s.ingest),o=await(0,k.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,k.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,k.storeCache)(t,l,n,u),i?a=(async()=>{const t=await(0,k.applyUpdate)(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||(0,k.storeCache)(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=(0,k.getNextSteps)(l,(0,k.buildCacheContext)(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:T(t[0],M(e.transformers))}:{kind:"many",branches:t.map(t=>T(t,M(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>(0,k.applyState)(p,t=>$(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,k.tryCatchAsync)(async()=>b?w(n):w(n,{...o,id:t,ingest:K(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,k.createIngest)(t);if(!i.ingest||void 0===n)return o;const s=await(0,k.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,k.createIngest)(t),respond:void 0};return S(e,n,o)}},O={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={})=>S(e,t,o),ingest:o.ingest,respond:o.respond})}},x=await(0,k.tryCatchAsync)(r,n=>{if(n instanceof k.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(O);if(!x)return;const j=x.type||"unknown",D=e.logger.scope(j).scope(t);return q.logger=D,c&&(x.config={...x.config,primary:c}),x}async function U(e){var t;for(const[t,n]of Object.entries(e.sources)){if(B(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!Y(e,t));s.length!==o.length&&(n.config.require=s,B(n)&&await R(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=>!Y(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=be(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function V(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 W=[D.Consent,D.User,D.Globals,D.Custom];function L(e){return W.includes(e)}function J(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 Y(e,t){switch(t){case D.Consent:case D.User:case D.Globals:case D.Custom:return J(e,t);case D.Run:case D.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function Q(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function X(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=Q(e,n)}function Z(e,t,n){return e.allowed&&Q(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 ee(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 te(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ne(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:ke(t.env,t.config.env)};(0,b.tryCatch)(t.on,t=>V(e,"destination",t,{destId:n,type:o}))(o,a)}function oe(e,t,n,o){const s=se(e,t,o);if(n.length)switch(t){case D.Consent:!function(e,t,n){const o=n||e.consent,s=te(e,D.Consent);t.forEach(t=>{Z(e,t,D.Consent)&&ee(e,t,D.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{(0,b.tryCatch)(t[n],t=>V(e,"consent",t,{key:n}))(o,s)}),X(e,t,D.Consent))})}(e,n,o);break;case D.Ready:!function(e,t){if(!e.allowed)return;const n=te(e,D.Ready);t.forEach(t=>{(0,b.tryCatch)(t,t=>V(e,"ready",t))(void 0,n)})}(e,n);break;case D.Run:!function(e,t){if(!e.allowed)return;const n=te(e,D.Run);t.forEach(t=>{(0,b.tryCatch)(t,t=>V(e,"run",t))(void 0,n)})}(e,n);break;case D.Session:!function(e,t){if(!e.session)return;const n=te(e,D.Session);t.forEach(t=>{(0,b.tryCatch)(t,t=>V(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=te(e,t),r=L(t);n.forEach(n=>{"function"==typeof n&&(r&&!Z(e,n,t)||r&&!ee(e,n,t)||((0,b.tryCatch)(n,n=>V(e,"generic",n,{type:t}))(s,o),r&&X(e,n,t)))});break}}}function se(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 re(e,t,n,o,s){if(!t.on)return!1;if(L(o)&&!Z(e,t,o))return!1;if(L(o)&&!ee(e,t,o))return!1;const r=await(0,b.tryCatchAsync)(t.on,t=>V(e,"source",t,{sourceId:n,type:o}))(o,s);return L(o)&&X(e,t,o),!1===r}function ie(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 ae=new WeakMap;function ce(e,t,n,o){ae.get(e)||(ae.set(e,!0),t.warn(n,o))}function le(e){ae.delete(e)}var ue=Object.freeze({batched:!0});function de(e){return e===ue}function fe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function pe(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 ge(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 he(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return T(e,t);if("string"==typeof e)return T(e,t);const o=(0,y.getNextSteps)(e,(0,y.buildCacheContext)(n));return 0===o.length?[]:1===o.length?T(o[0],t):T(o,t)}async function ve(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return we({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=ie(e.queue,t,{max:n});if(o.dropped>0){const t=ge(e.status,(0,y.stepId)("collector"),"queue",o.dropped);ce(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&le(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?M(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};let u=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&u.push((0,y.clone)(t));const h=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,y.createIngest)("unknown");if(!u.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!u.length&&(null==(i=s.queueOn)?void 0:i.length)){let t=!1;try{t=await me(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const v=[],m=u.filter(t=>{const n=(0,y.getGrantedConsent)(s.config.consent,d,t.consent);if(n)return t.consent=n,v.push(t),!1;const r=A(e,{stepId:(0,y.stepId)("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return r.skipReason="consent",d&&(r.consent={...d}),s.config.consent&&(r.meta={required:{...s.config.consent}}),(0,y.emitStep)(e,r),!0});if(m.length>0){const t=s.queuePush,n=s.config.id||o,r={max:null!=(a=s.config.queueMax)?a:1e3};let i=0;for(const e of m)i+=ie(t,e,r).dropped;if(i>0){pe(e,n);const o=ge(e.status,(0,y.stepId)("destination",n),"queue",i);ce(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&&le(t)}if(!v.length)return{id:o,destination:s,queue:u};let w,b,k=!1;try{k=await me(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!k)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const S=he(s.config.before,g,h),I=s.config.next,C=null==(c=s.config)?void 0:c.cache,q=C?(0,y.compileCache)(C):void 0,O=q?E(q,e):void 0,x=(null==(l=s.config)?void 0:l.state)?(0,y.compileState)(s.config.state):void 0,j=null==x?void 0:x.filter(e=>"get"===e.mode),D=null==x?void 0:x.filter(e=>"set"===e.mode);let M=0,_=0;return await Promise.all(v.map(async t=>{let r;if(t.globals=(0,y.assign)(f,t.globals),t.user=(0,y.assign)(p,t.user),(null==q?void 0:q.stop)&&O){const e=(0,y.buildCacheContext)(h,t),n=await(0,y.checkCache)(q,O,e);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}let i=t,a=n.respond;if(S.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await H(e,e.transformers,S,t,h,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(q&&!q.stop&&O){const e=(0,y.buildCacheContext)(h,i),n=await(0,y.checkCache)(q,O,e);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}j&&j.length>0&&i&&(i=await(0,y.applyState)(j,t=>$(t,e),i,e));const c=Date.now();let l=!1;const u=await(0,y.tryCatchAsync)(ye,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),w=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=ie(a,[i,t],u);if(d.dropped>0){pe(e,c);const t=ge(e.status,(0,y.stepId)("destination",c),"dlq",d.dropped);ce(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&&le(a)})(e,s,o,i,h,a);if(M+=Date.now()-c,r&&O&&void 0===s.config.mock&&(0,y.storeCache)(O,r.key,null==u||u,r.ttl),!l&&!de(u)&&D&&D.length>0&&i&&(i=await(0,y.applyState)(D,t=>$(t,e),i,e)),void 0===u||de(u)||(b=u),de(u)&&_++,!l&&I){void 0!==u&&(h._response=u);const t=he(I,g,h);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await H(e,e.transformers,t,i,h,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:w,response:b,totalDuration:M,batchedCount:_,allowedCount:v.length}})),v={},m={},w={};for(const t of h){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};pe(e,t.id);const u=e.status.destinations[t.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=n.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,w[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)m[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,s=null!=(l=t.allowedCount)?l:0;(Math.max(0,s-n)>0||0===s)&&(v[t.id]=o,u.count++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.out++)}}return we({event:t,...Object.keys(v).length&&{done:v},...Object.keys(m).length&&{queued:m},...Object.keys(w).length&&{failed:w}})}async function me(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:ke(t.env,t.config.env)};r.debug("init");const a=Date.now();let c;(0,y.emitStep)(e,A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await(0,y.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),s=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,y.emitStep)(e,s),t}if(!1===c)return c;if(t.config={...c||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)ne(e,t,n,s,r)}r.debug("init done")}return!0}async function ye(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:{...ke(t.env,p.env),...r?{respond:r}:{}}};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=fe(null==w?void 0:w.batch),r=fe(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=ke(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}:{}}};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=pe(e,u),f=Date.now(),g=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"flush",eventId:"",now:f});g.batch={size:a.entries.length,index:0},(0,y.emitStep)(e,g);const h=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+=ie(s,e,r).dropped;if(i>0){const t=ge(e.status,(0,y.stepId)("destination",u),"dlq",i);ce(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&&le(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let w=a.entries.length;const b=await(0,y.tryCatchAsync)((0,y.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t=>{w=0;const o=Date.now(),s=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-f,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),h(a.entries.map(e=>[e.event,t])),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if((0,y.isObject)(S=b)&&Array.isArray(S.failed)&&b.failed.length>0){const e=[],t=new Set;for(const n of b.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&&(h(e),w=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:w,entries:a.entries.length}))}var S;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),w>0&&(d.count+=w,d.lastAt=Date.now(),e.status.out+=w)},{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=pe(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),ue}{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}),(0,y.emitStep)(e,r);try{const r=await(0,y.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m),i=Date.now(),a=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"out",eventId:o,now:i});return a.durationMs=i-s,a.outEvent=r,g.mappingKey&&(a.mappingKey=g.mappingKey),(0,y.emitStep)(e,a),v.debug("push done"),r}catch(t){const r=Date.now(),i=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:o,now:r});throw i.durationMs=r-s,i.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},g.mappingKey&&(i.mappingKey=g.mappingKey),(0,y.emitStep)(e,i),t}}}function we(e){return{ok:!(null==e?void 0:e.failed),...e}}function be(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=_(e,"before"),{config:a}=_({...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=ke(t.env,o);return{...t,config:c,env:l}}function ke(e,t){return e||t?t?e&&(0,y.isObject)(e)&&(0,y.isObject)(t)?{...e,...t}:t:e:{}}async function Se(e,t,n){const o=Object.entries(e).map(async([e,o])=>{var s;const r=o.destroy;if(!r)return;const i=o.type||"unknown",a=n.scope(i),c={id:e,config:o.config,env:null!=(s=o.env)?s:{},logger:a};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 Ie(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Ce(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,C.isObject)(n)&&((0,I.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case D.Consent:if((0,C.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,v.assign)(e.consent,n),{update:n}}(e,n);Ie(e,D.Consent),s=t,r=!0}break;case D.Custom:(0,C.isObject)(n)&&(e.custom=(0,I.assign)(e.custom,n),Ie(e,D.Custom),s=n,r=!0);break;case D.Destination:(0,C.isObject)(n)&&"code"in n&&(0,C.isObject)(n.code)&&(o=await async function(e,t){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 we({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 U(e);const n=e.destinations[f];return n?ve(e,void 0,{},{[f]:n}):we({ok:!0})}const p={...o,config:d,env:ke(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),ve(e,void 0,{},{[f]:p})}(e,n));break;case D.Globals:(0,C.isObject)(n)&&(e.globals=(0,I.assign)(e.globals,n),Ie(e,D.Globals),s=n,r=!0);break;case D.Hook:if((0,C.isObject)(n)&&(0,I.isString)(n.name)&&(0,I.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case D.On:if((0,C.isObject)(n)&&(0,I.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,w.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,oe(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,I.assign)(e.consent,t.consent),Ie(e,D.Consent)),t.user&&(e.user=(0,I.assign)(e.user,t.user),Ie(e,D.User)),t.globals&&(e.globals=(0,I.assign)(e.config.globalsStatic||{},t.globals),Ie(e,D.Globals)),t.custom&&(e.custom=(0,I.assign)(e.custom,t.custom),Ie(e,D.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await U(e),await async function(e){for(const t of W){if(!J(e,t))continue;const n=se(e,t);oe(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))B(s)&&await re(e,s,o,t,n)}}(e),await ve(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 Se(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 Se(e.destinations,"destination",t),await Se(e.transformers,"transformer",t),await Se(e.stores,"store",t)}(e));break;case D.User:(0,C.isObject)(n)&&((0,I.assign)(e.user,n,{shallow:!1}),Ie(e,D.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=se(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&&(B(o)?await re(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});ne(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))B(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await R(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!B(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await U(e),oe(e,t,i,o),!c}(e,t,void 0,s),o=await ve(e)),o||we({ok:!0})}()}finally{i()}}function qe(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.0-next-1780690800063"},...t}}function Oe(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,I.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 xe(e,t){const n=(0,q.useHooks)(async(n,o={})=>await(0,q.tryCatchAsync)(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:l,preChain:u,include:d,exclude: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,q.createIngest)(i||"unknown");if(l){const t=await(0,q.processEventMapping)(g,l,e);if(t.ignore)return we({ok:!0});if(l.consent&&!(0,q.getGrantedConsent)(l.consent,e.consent,t.event.consent))return we({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await H(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return we({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),we({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=Oe(e,o);return ve(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:we({ok:!0})}g=n.event}const m=function(e,t){return Oe(e,qe(e,t))}(e,g),y=await ve(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 q.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),we({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now();(0,q.emitStep)(e,A(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r}));try{const i=await n(t,o),a=Date.now(),c=A(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,(0,q.emitStep)(e,c),i}catch(t){const n=Date.now(),o=A(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:s,now:n});throw o.durationMs=n-r,o.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,q.emitStep)(e,o),t}}}function je(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 De(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=A(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},(0,j.emitStep)(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?(0,j.compileMatcher)(e.match):()=>!0,ttl:e.ttl})),d=e=>`${s}:${e}`;function f(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return u.find(e=>e.match(n))}const p=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...l}},async get(t){const n=d(t),s=await o.get(n);if(void 0!==s)return l.hits++,c(t,"hit"),s;const r=p.get(n);if(r)return l.inflight_dedups++,c(t,"hit"),r;l.misses++,c(t,"miss");const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=f(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),l.populates++}catch(e){g("set",t,e)}return s}finally{p.delete(n)}})();return p.set(n,i),i},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=f(t,n);if(r)try{await o.set(d(t),n,1e3*r.ttl)}catch(e){g("set",t,e)}},async delete(t){l.deletes++,await e.delete(t);try{await o.delete(d(t))}catch(e){g("delete",t,e)}}};function g(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function Ae(e,t,n){const o=`store.${n}`,s=(0,x.useHooks)(t.get,"StoreGet",e.hooks,e.logger),r=(0,x.useHooks)(t.set,"StoreSet",e.hooks,e.logger),i=(0,x.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,x.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,x.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,x.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,x.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,x.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,x.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,x.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,x.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,x.emitStep)(e,i),s}}}async function Ee(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:{}},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=xe(a,e=>qe(a,e)),a.command=(c=a,l=Ce,(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}),we({ok:!1})})(),"Command",c.hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,t={}){var n;const o={};for(const[n,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:r,env:i},l=await t(c);o[n]=l}const s=t,r=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){var i;const a=t[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(s);for(const t of r){const r=s[t].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=je()),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]=De(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&&Ae(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=je()),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]=be(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}=_(f,"before"),{config:v}=_({...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},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})}},O=await q(C);void 0!==f.before&&void 0===(null==(s=O.config)?void 0:s.before)&&(O.config={...null!=(r=O.config)?r:{},before:f.before}),void 0!==f.next&&void 0===(null==(i=O.config)?void 0:i.next)&&(O.config={...null!=(a=O.config)?a:{},next:f.next}),void 0!==b&&void 0===(null==(c=O.config)?void 0:c.state)&&(O.config={...null!=(l=O.config)?l:{},state:b}),u[d]=O}return u}(a,e.transformers||{}),a}async function $e(e){e=e||{};const t=await Ee(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 we({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 G(e,s,r);if(!t)continue;const i=null==(n=r.config)?void 0:n.require;t.config={...t.config,init:!1,...i?{require:[...i]}:{}},o[s]=t}Object.assign(e.sources,o);for(const t of Object.keys(o)){const n=e.sources[t];let o=!1;n.init&&await(0,k.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof k.FatalError)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,B(n)&&await R(e,n,t))}return await U(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 Me=async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var s,r,i,a,c,l,u,d,f;const 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 $e({...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)}}}},_e=(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:()=>Me,step:()=>p,trigger:()=>_e});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"),O=require("@walkeros/core"),x=require("@walkeros/core"),j=require("@walkeros/core"),D={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",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(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function $(e,t){return e?t.stores[e]:t.stores.__cache}function M(e){var t;const n={};for(const[o,s]of Object.entries(e)){const e=null==(t=s.config)?void 0:t.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?n[o]={next:e}:n[o]={}}return n}function _(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function T(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function P(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:(0,S.createIngest)(n),config:t.config,env:N(t.config.env)};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 z(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...N(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=A(e,{stepId:(0,S.stepId)("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});(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 K(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,S.createIngest)(t)}async function H(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)(P,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?E(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=>$(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 O=r.config.before;if(O){const n=(0,S.getNextSteps)(O,(0,S.buildCacheContext)(s,v));if(1===n.length){const o=T(n[0],M(t));if(o.length>0){const n=await H(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)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),v,K(s,n),void 0,i)))}k&&k.length>0&&(v=await(0,S.applyState)(k,t=>$(t,e),v,e));const x=await(0,S.tryCatchAsync)(z,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,v,s,m);if(!1===x)return{event:null,respond:m};if(Array.isArray(x)){const r=n.slice(n.indexOf(o)+1),a=await Promise.all(x.map(async n=>{const o=await C(n.event||v),a=K(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=T(s[0],M(t));return n.length>0?H(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>(0,S.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),o,K(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?H(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(x&&"object"==typeof x){const{event:n,respond:o,next:r}=x;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=T(a[0],M(t));return n.length>0?H(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)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),o,K(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}I&&I.length>0&&(v=await(0,S.applyState)(I,t=>$(t,e),v,e)),q&&w&&(0,S.storeCache)(w,q.key,v,q.ttl);const j=r.config.next,D="string"==typeof j||Array.isArray(j)&&j.every(e=>"string"==typeof e),A=void 0!==j&&!D;if((!x||"object"==typeof x&&!x.next)&&A){const n=(0,S.getNextSteps)(r.config.next,(0,S.buildCacheContext)(s,v));if(1===n.length){const o=T(n[0],M(t));return o.length>0?H(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>(0,S.tryCatchAsync)(H,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,T(n,M(t)),v,K(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function N(e){return e&&(0,S.isObject)(e)?e:{}}function F(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function R(e,t,n){var o,s;if(!t.on||!(null==(o=t.queueOn)?void 0:o.length))return;const r=t.queueOn;t.queueOn=[];const i=n||(null==(s=t.config)?void 0:s.id)||"unknown";for(const{type:n,data:o}of r)L(n)&&!Z(e,t,n)||(await(0,k.tryCatchAsync)(t.on,t=>{if(t instanceof k.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o),L(n)&&X(e,t,n))}function B(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function G(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,k.compileState)(f):void 0,g=d,h=g?(0,k.compileCache)({...g,stop:null==(s=g.stop)||s}):void 0,v=F(l)?T(l,M(e.transformers)):void 0,m=F(u)?T(u,M(e.transformers)):void 0,y=a.push,w=null!=y?y:e.push,b=Boolean(y),S=async(n,o,s)=>{var r;let a;const c=null!=m?m:void 0!==u?(()=>{const t=(0,k.getNextSteps)(u,(0,k.buildCacheContext)(s.ingest));return 0===t.length?[]:T(1===t.length?t[0]:t,M(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await H(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=E(h,e);if(t){const n=(0,k.buildCacheContext)(s.ingest),o=await(0,k.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,k.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,k.storeCache)(t,l,n,u),i?a=(async()=>{const t=await(0,k.applyUpdate)(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||(0,k.storeCache)(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=(0,k.getNextSteps)(l,(0,k.buildCacheContext)(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:T(t[0],M(e.transformers))}:{kind:"many",branches:t.map(t=>T(t,M(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>(0,k.applyState)(p,t=>$(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,k.tryCatchAsync)(async()=>b?w(n):w(n,{...o,id:t,ingest:K(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,k.createIngest)(t);if(!i.ingest||void 0===n)return o;const s=await(0,k.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,k.createIngest)(t),respond:void 0};return S(e,n,o)}},O={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={})=>S(e,t,o),ingest:o.ingest,respond:o.respond})}},x=await(0,k.tryCatchAsync)(r,n=>{if(n instanceof k.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(O);if(!x)return;const j=x.type||"unknown",D=e.logger.scope(j).scope(t);return q.logger=D,c&&(x.config={...x.config,primary:c}),x}async function U(e){var t;for(const[t,n]of Object.entries(e.sources)){if(B(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!Y(e,t));s.length!==o.length&&(n.config.require=s,B(n)&&await R(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=>!Y(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=be(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function V(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 W=[D.Consent,D.User,D.Globals,D.Custom];function L(e){return W.includes(e)}function J(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 Y(e,t){switch(t){case D.Consent:case D.User:case D.Globals:case D.Custom:return J(e,t);case D.Run:case D.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function Q(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function X(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=Q(e,n)}function Z(e,t,n){return e.allowed&&Q(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 ee(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 te(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ne(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:ke(t.env,t.config.env)};(0,b.tryCatch)(t.on,t=>V(e,"destination",t,{destId:n,type:o}))(o,a)}function oe(e,t,n,o){const s=se(e,t,o);if(n.length)switch(t){case D.Consent:!function(e,t,n){const o=n||e.consent,s=te(e,D.Consent);t.forEach(t=>{Z(e,t,D.Consent)&&ee(e,t,D.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{(0,b.tryCatch)(t[n],t=>V(e,"consent",t,{key:n}))(o,s)}),X(e,t,D.Consent))})}(e,n,o);break;case D.Ready:!function(e,t){if(!e.allowed)return;const n=te(e,D.Ready);t.forEach(t=>{(0,b.tryCatch)(t,t=>V(e,"ready",t))(void 0,n)})}(e,n);break;case D.Run:!function(e,t){if(!e.allowed)return;const n=te(e,D.Run);t.forEach(t=>{(0,b.tryCatch)(t,t=>V(e,"run",t))(void 0,n)})}(e,n);break;case D.Session:!function(e,t){if(!e.session)return;const n=te(e,D.Session);t.forEach(t=>{(0,b.tryCatch)(t,t=>V(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=te(e,t),r=L(t);n.forEach(n=>{"function"==typeof n&&(r&&!Z(e,n,t)||r&&!ee(e,n,t)||((0,b.tryCatch)(n,n=>V(e,"generic",n,{type:t}))(s,o),r&&X(e,n,t)))});break}}}function se(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 re(e,t,n,o,s){if(!t.on)return!1;if(L(o)&&!Z(e,t,o))return!1;if(L(o)&&!ee(e,t,o))return!1;const r=await(0,b.tryCatchAsync)(t.on,t=>V(e,"source",t,{sourceId:n,type:o}))(o,s);return L(o)&&X(e,t,o),!1===r}function ie(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 ae=new WeakMap;function ce(e,t,n,o){ae.get(e)||(ae.set(e,!0),t.warn(n,o))}function le(e){ae.delete(e)}var ue=Object.freeze({batched:!0});function de(e){return e===ue}function fe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function pe(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 ge(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 he(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return T(e,t);if("string"==typeof e)return T(e,t);const o=(0,y.getNextSteps)(e,(0,y.buildCacheContext)(n));return 0===o.length?[]:1===o.length?T(o[0],t):T(o,t)}async function ve(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return we({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=ie(e.queue,t,{max:n});if(o.dropped>0){const t=ge(e.status,(0,y.stepId)("collector"),"queue",o.dropped);ce(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&le(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?M(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};let u=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&u.push((0,y.clone)(t));const h=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,y.createIngest)("unknown");if(!u.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!u.length&&(null==(i=s.queueOn)?void 0:i.length)){let t=!1;try{t=await me(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const v=[],m=u.filter(t=>{const n=(0,y.getGrantedConsent)(s.config.consent,d,t.consent);if(n)return t.consent=n,v.push(t),!1;const r=A(e,{stepId:(0,y.stepId)("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return r.skipReason="consent",d&&(r.consent={...d}),s.config.consent&&(r.meta={required:{...s.config.consent}}),(0,y.emitStep)(e,r),!0});if(m.length>0){const t=s.queuePush,n=s.config.id||o,r={max:null!=(a=s.config.queueMax)?a:1e3};let i=0;for(const e of m)i+=ie(t,e,r).dropped;if(i>0){pe(e,n);const o=ge(e.status,(0,y.stepId)("destination",n),"queue",i);ce(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&&le(t)}if(!v.length)return{id:o,destination:s,queue:u};let w,b,k=!1;try{k=await me(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!k)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const S=he(s.config.before,g,h),I=s.config.next,C=null==(c=s.config)?void 0:c.cache,q=C?(0,y.compileCache)(C):void 0,O=q?E(q,e):void 0,x=(null==(l=s.config)?void 0:l.state)?(0,y.compileState)(s.config.state):void 0,j=null==x?void 0:x.filter(e=>"get"===e.mode),D=null==x?void 0:x.filter(e=>"set"===e.mode);let M=0,_=0;return await Promise.all(v.map(async t=>{let r;if(t.globals=(0,y.assign)(f,t.globals),t.user=(0,y.assign)(p,t.user),(null==q?void 0:q.stop)&&O){const e=(0,y.buildCacheContext)(h,t),n=await(0,y.checkCache)(q,O,e);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}let i=t,a=n.respond;if(S.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await H(e,e.transformers,S,t,h,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(q&&!q.stop&&O){const e=(0,y.buildCacheContext)(h,i),n=await(0,y.checkCache)(q,O,e);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(r={key:n.key,ttl:n.rule.ttl})}j&&j.length>0&&i&&(i=await(0,y.applyState)(j,t=>$(t,e),i,e));const c=Date.now();let l=!1;const u=await(0,y.tryCatchAsync)(ye,t=>{var n;const r=s.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:i.name}),w=t,l=!0;const a=s.dlq,c=s.config.id||o,u={max:null!=(n=s.config.dlqMax)?n:100},d=ie(a,[i,t],u);if(d.dropped>0){pe(e,c);const t=ge(e.status,(0,y.stepId)("destination",c),"dlq",d.dropped);ce(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&&le(a)})(e,s,o,i,h,a);if(M+=Date.now()-c,r&&O&&void 0===s.config.mock&&(0,y.storeCache)(O,r.key,null==u||u,r.ttl),!l&&!de(u)&&D&&D.length>0&&i&&(i=await(0,y.applyState)(D,t=>$(t,e),i,e)),void 0===u||de(u)||(b=u),de(u)&&_++,!l&&I){void 0!==u&&(h._response=u);const t=he(I,g,h);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await H(e,e.transformers,t,i,h,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:w,response:b,totalDuration:M,batchedCount:_,allowedCount:v.length}})),v={},m={},w={};for(const t of h){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};pe(e,t.id);const u=e.status.destinations[t.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=n.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,w[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)m[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,s=null!=(l=t.allowedCount)?l:0;(Math.max(0,s-n)>0||0===s)&&(v[t.id]=o,u.count++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.out++)}}return we({event:t,...Object.keys(v).length&&{done:v},...Object.keys(m).length&&{queued:m},...Object.keys(w).length&&{failed:w}})}async function me(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:ke(t.env,t.config.env)};r.debug("init");const a=Date.now();let c;(0,y.emitStep)(e,A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await(0,y.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),s=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,y.emitStep)(e,s),t}if(!1===c)return c;if(t.config={...c||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)ne(e,t,n,s,r)}r.debug("init done")}return!0}async function ye(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:{...ke(t.env,p.env),...r?{respond:r}:{}}};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=fe(null==w?void 0:w.batch),r=fe(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=ke(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}:{}}};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=pe(e,u),f=Date.now(),g=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"flush",eventId:"",now:f});g.batch={size:a.entries.length,index:0},(0,y.emitStep)(e,g);const h=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+=ie(s,e,r).dropped;if(i>0){const t=ge(e.status,(0,y.stepId)("destination",u),"dlq",i);ce(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&&le(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let w=a.entries.length;const b=await(0,y.tryCatchAsync)((0,y.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t=>{w=0;const o=Date.now(),s=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-f,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),h(a.entries.map(e=>[e.event,t])),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if((0,y.isObject)(S=b)&&Array.isArray(S.failed)&&b.failed.length>0){const e=[],t=new Set;for(const n of b.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&&(h(e),w=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:w,entries:a.entries.length}))}var S;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),w>0&&(d.count+=w,d.lastAt=Date.now(),e.status.out+=w)},{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=pe(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),ue}{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}),(0,y.emitStep)(e,r);try{const r=await(0,y.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m),i=Date.now(),a=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"out",eventId:o,now:i});return a.durationMs=i-s,a.outEvent=r,g.mappingKey&&(a.mappingKey=g.mappingKey),(0,y.emitStep)(e,a),v.debug("push done"),r}catch(t){const r=Date.now(),i=A(e,{stepId:(0,y.stepId)("destination",n),stepType:"destination",phase:"error",eventId:o,now:r});throw i.durationMs=r-s,i.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},g.mappingKey&&(i.mappingKey=g.mappingKey),(0,y.emitStep)(e,i),t}}}function we(e){return{ok:!(null==e?void 0:e.failed),...e}}function be(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=_(e,"before"),{config:a}=_({...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=ke(t.env,o);return{...t,config:c,env:l}}function ke(e,t){return e||t?t?e&&(0,y.isObject)(e)&&(0,y.isObject)(t)?{...e,...t}:t:e:{}}async function Se(e,t,n){const o=Object.entries(e).map(async([e,o])=>{var s;const r=o.destroy;if(!r)return;const i=o.type||"unknown",a=n.scope(i),c={id:e,config:o.config,env:null!=(s=o.env)?s:{},logger:a};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 Ie(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Ce(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,C.isObject)(n)&&((0,I.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case D.Consent:if((0,C.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,v.assign)(e.consent,n),{update:n}}(e,n);Ie(e,D.Consent),s=t,r=!0}break;case D.Custom:(0,C.isObject)(n)&&(e.custom=(0,I.assign)(e.custom,n),Ie(e,D.Custom),s=n,r=!0);break;case D.Destination:(0,C.isObject)(n)&&"code"in n&&(0,C.isObject)(n.code)&&(o=await async function(e,t){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 we({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 U(e);const n=e.destinations[f];return n?ve(e,void 0,{},{[f]:n}):we({ok:!0})}const p={...o,config:d,env:ke(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),ve(e,void 0,{},{[f]:p})}(e,n));break;case D.Globals:(0,C.isObject)(n)&&(e.globals=(0,I.assign)(e.globals,n),Ie(e,D.Globals),s=n,r=!0);break;case D.Hook:if((0,C.isObject)(n)&&(0,I.isString)(n.name)&&(0,I.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case D.On:if((0,C.isObject)(n)&&(0,I.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,w.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,oe(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,I.assign)(e.consent,t.consent),Ie(e,D.Consent)),t.user&&(e.user=(0,I.assign)(e.user,t.user),Ie(e,D.User)),t.globals&&(e.globals=(0,I.assign)(e.config.globalsStatic||{},t.globals),Ie(e,D.Globals)),t.custom&&(e.custom=(0,I.assign)(e.custom,t.custom),Ie(e,D.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await U(e),await async function(e){for(const t of W){if(!J(e,t))continue;const n=se(e,t);oe(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))B(s)&&await re(e,s,o,t,n)}}(e),await ve(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 Se(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 Se(e.destinations,"destination",t),await Se(e.transformers,"transformer",t),await Se(e.stores,"store",t)}(e));break;case D.User:(0,C.isObject)(n)&&((0,I.assign)(e.user,n,{shallow:!1}),Ie(e,D.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=se(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&&(B(o)?await re(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});ne(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))B(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await R(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!B(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await U(e),oe(e,t,i,o),!c}(e,t,void 0,s),o=await ve(e)),o||we({ok:!0})}()}finally{i()}}function qe(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.0-next-1780909874350"},...t}}function Oe(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,I.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 xe(e,t){const n=(0,q.useHooks)(async(n,o={})=>await(0,q.tryCatchAsync)(async()=>{var s;const r=Date.now(),{id:i,ingest:a,respond:c,mapping:l,preChain:u,include:d,exclude: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,q.createIngest)(i||"unknown");if(l){const t=await(0,q.processEventMapping)(g,l,e);if(t.ignore)return we({ok:!0});if(l.consent&&!(0,q.getGrantedConsent)(l.consent,e.consent,t.event.consent))return we({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await H(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return we({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),we({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=Oe(e,o);return ve(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:we({ok:!0})}g=n.event}const m=function(e,t){return Oe(e,qe(e,t))}(e,g),y=await ve(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 q.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),we({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now();(0,q.emitStep)(e,A(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r}));try{const i=await n(t,o),a=Date.now(),c=A(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,(0,q.emitStep)(e,c),i}catch(t){const n=Date.now(),o=A(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:s,now:n});throw o.durationMs=n-r,o.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},(0,q.emitStep)(e,o),t}}}function je(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 De(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=A(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},(0,j.emitStep)(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?(0,j.compileMatcher)(e.match):()=>!0,ttl:e.ttl})),d=e=>`${s}:${e}`;function 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,j.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,j.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,j.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 Ae(e,t,n){const o=`store.${n}`,s=(0,x.useHooks)(t.get,"StoreGet",e.hooks,e.logger),r=(0,x.useHooks)(t.set,"StoreSet",e.hooks,e.logger),i=(0,x.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,x.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,x.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,x.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,x.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,x.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,x.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,x.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,x.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,x.emitStep)(e,i),s}}}async function Ee(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:{}},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=xe(a,e=>qe(a,e)),a.command=(c=a,l=Ce,(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}),we({ok:!1})})(),"Command",c.hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,t={}){var n;const o={};for(const[n,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:r,env:i},l=await t(c);o[n]=l}const s=t,r=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){var i;const a=t[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(s);for(const t of r){const r=s[t].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=je()),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]=De(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&&Ae(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=je()),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]=be(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}=_(f,"before"),{config:v}=_({...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},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})}},O=await q(C);void 0!==f.before&&void 0===(null==(s=O.config)?void 0:s.before)&&(O.config={...null!=(r=O.config)?r:{},before:f.before}),void 0!==f.next&&void 0===(null==(i=O.config)?void 0:i.next)&&(O.config={...null!=(a=O.config)?a:{},next:f.next}),void 0!==b&&void 0===(null==(c=O.config)?void 0:c.state)&&(O.config={...null!=(l=O.config)?l:{},state:b}),u[d]=O}return u}(a,e.transformers||{}),a}async function $e(e){e=e||{};const t=await Ee(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 we({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 G(e,s,r);if(!t)continue;const i=null==(n=r.config)?void 0:n.require;t.config={...t.config,init:!1,...i?{require:[...i]}:{}},o[s]=t}Object.assign(e.sources,o);for(const t of Object.keys(o)){const n=e.sources[t];let o=!1;n.init&&await(0,k.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof k.FatalError)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,B(n)&&await R(e,n,t))}return await U(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 Me=async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var s,r,i,a,c,l,u,d,f;const 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 $e({...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)}}}},_e=(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:()=>zt,step:()=>l,trigger:()=>Rt});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 j,processEventMapping as A,stepId as E,tryCatchAsync as $,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 R,tryCatchAsync as F}from"@walkeros/core";import{createIngest as H,FatalError as N,getMappingValue as B,tryCatchAsync as G,getNextSteps as U,compileCache as V,checkCache as W,storeCache as L,applyUpdate as J,buildCacheContext as Y,compileState as Q,applyState as X}from"@walkeros/core";import{createIngest as Z,emitStep as ee,FatalError as te,isObject as ne,stepId as oe,tryCatchAsync as se,useHooks as re,getNextSteps as ie,compileCache as ae,checkCache as ce,storeCache as le,buildCacheContext as ue,validateStepEntry as de,processEventMapping as fe,compileState as pe,applyState as ge}from"@walkeros/core";import{assign as he,getSpanId as ve,isFunction as me,isString as ye}from"@walkeros/core";import{isObject as we}from"@walkeros/core";import{createIngest as be,emitStep as ke,FatalError as Ie,getGrantedConsent as Se,processEventMapping as qe,tryCatchAsync as xe,useHooks as Oe}from"@walkeros/core";import{FatalError as Ce,useHooks as De,tryCatchAsync as je}from"@walkeros/core";import{emitStep as Ae,useHooks as Ee}from"@walkeros/core";import{compileMatcher as $e,emitStep as Me}from"@walkeros/core";var Te={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 _e(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 Pe(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Ke(e,t){return e?t.stores[e]:t.stores.__cache}function ze(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 Re(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 Fe(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 He(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:Z(n),config:t.config,env:Ue(t.config.env)};s.debug("init");const i=await re(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 Ne(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Ue(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=_e(e,{stepId:oe("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});ee(e,d);try{const s=await re(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=_e(e,{stepId:oe("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:r});return i.durationMs=r-u,i.outEvent=s,ee(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=_e(e,{stepId:oe("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)},ee(e,s),t}}function Be(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:Z(t)}async function Ge(e,t,n,o,s,r,i){var a,c,l,u,d,f,p,g,h;s||(s=Z(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 se(He,t=>{if(t instanceof te)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?ae(a):void 0,w=y?Pe(y,e):void 0,b=(null==(p=r.config)?void 0:p.state)?pe(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?ge(I,t=>Ke(t,e),t,e):t;let q;if(y&&w){const e=ue(s,v),t=await ce(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=ie(x,ue(s,v));if(1===n.length){const o=Fe(n[0],ze(t));if(o.length>0){const n=await Ge(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=>se(Ge,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Fe(n,ze(t)),v,Be(s,n),void 0,i)))}k&&k.length>0&&(v=await ge(k,t=>Ke(t,e),v,e));const O=await se(Ne,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=Be(s,"unknown");if(n.next){const s=ie(n.next,ue(a,o));if(0===s.length)return{event:o,respond:m};if(1===s.length){const n=Fe(s[0],ze(t));return n.length>0?Ge(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>se(Ge,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Fe(n,ze(t)),o,Be(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Ge(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=ie(r,ue(s,o));if(0===a.length){v=o;continue}if(1===a.length){const n=Fe(a[0],ze(t));return n.length>0?Ge(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=>se(Ge,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Fe(n,ze(t)),o,Be(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}I&&I.length>0&&(v=await ge(I,t=>Ke(t,e),v,e)),q&&w&&le(w,q.key,v,q.ttl);const C=r.config.next,D="string"==typeof C||Array.isArray(C)&&C.every(e=>"string"==typeof e),j=void 0!==C&&!D;if((!O||"object"==typeof O&&!O.next)&&j){const n=ie(r.config.next,ue(s,v));if(1===n.length){const o=Fe(n[0],ze(t));return o.length>0?Ge(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>se(Ge,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Fe(n,ze(t)),v,Be(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function Ue(e){return e&&ne(e)?e:{}}function Ve(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function We(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)Ze(n)&&!st(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),Ze(n)&&ot(e,t,n))}function Le(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function Je(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?Q(f):void 0,g=d,h=g?V({...g,stop:null==(s=g.stop)||s}):void 0,v=Ve(l)?Fe(l,ze(e.transformers)):void 0,m=Ve(u)?Fe(u,ze(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=U(u,Y(s.ingest));return 0===t.length?[]:Fe(1===t.length?t[0]:t,ze(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Ge(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=Pe(h,e);if(t){const n=Y(s.ingest),o=await W(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 J(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=>{L(t,l,n,u),i?a=(async()=>{const t=await J(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||L(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=U(l,Y(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Fe(t[0],ze(e.transformers))}:{kind:"many",branches:t.map(t=>Fe(t,ze(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>X(p,t=>Ke(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:Be(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})}},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 Ye(e){var t;for(const[t,n]of Object.entries(e.sources)){if(Le(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!tt(e,t));s.length!==o.length&&(n.config.require=s,Le(n)&&await We(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=>!tt(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=xt(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function Qe(e,t,n,o){if(n instanceof z)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}var Xe=[Te.Consent,Te.User,Te.Globals,Te.Custom];function Ze(e){return Xe.includes(e)}function et(e,t){switch(t){case Te.Consent:return Object.keys(e.consent).length>0;case Te.User:return Object.keys(e.user).length>0;case Te.Globals:return Object.keys(e.globals).length>0;case Te.Custom:return Object.keys(e.custom).length>0;default:return!1}}function tt(e,t){switch(t){case Te.Consent:case Te.User:case Te.Globals:case Te.Custom:return et(e,t);case Te.Run:case Te.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function nt(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function ot(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=nt(e,n)}function st(e,t,n){return e.allowed&&nt(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 rt(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 at(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:Ot(t.env,t.config.env)};R(t.on,t=>Qe(e,"destination",t,{destId:n,type:o}))(o,a)}function ct(e,t,n,o){const s=lt(e,t,o);if(n.length)switch(t){case Te.Consent:!function(e,t,n){const o=n||e.consent,s=it(e,Te.Consent);t.forEach(t=>{st(e,t,Te.Consent)&&rt(e,t,Te.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{R(t[n],t=>Qe(e,"consent",t,{key:n}))(o,s)}),ot(e,t,Te.Consent))})}(e,n,o);break;case Te.Ready:!function(e,t){if(!e.allowed)return;const n=it(e,Te.Ready);t.forEach(t=>{R(t,t=>Qe(e,"ready",t))(void 0,n)})}(e,n);break;case Te.Run:!function(e,t){if(!e.allowed)return;const n=it(e,Te.Run);t.forEach(t=>{R(t,t=>Qe(e,"run",t))(void 0,n)})}(e,n);break;case Te.Session:!function(e,t){if(!e.session)return;const n=it(e,Te.Session);t.forEach(t=>{R(t,t=>Qe(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=it(e,t),r=Ze(t);n.forEach(n=>{"function"==typeof n&&(r&&!st(e,n,t)||r&&!rt(e,n,t)||(R(n,n=>Qe(e,"generic",n,{type:t}))(s,o),r&&ot(e,n,t)))});break}}}function lt(e,t,n){switch(t){case Te.Consent:return n||e.consent;case Te.Session:return e.session;case Te.User:return n||e.user;case Te.Custom:return n||e.custom;case Te.Globals:return n||e.globals;case Te.Config:return n||e.config;default:return}}async function ut(e,t,n,o,s){if(!t.on)return!1;if(Ze(o)&&!st(e,t,o))return!1;if(Ze(o)&&!rt(e,t,o))return!1;const r=await F(t.on,t=>Qe(e,"source",t,{sourceId:n,type:o}))(o,s);return Ze(o)&&ot(e,t,o),!1===r}function dt(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 ft=new WeakMap;function pt(e,t,n,o){ft.get(e)||(ft.set(e,!0),t.warn(n,o))}function gt(e){ft.delete(e)}var ht=Object.freeze({batched:!0});function vt(e){return e===ht}function mt(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function yt(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 wt(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 bt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Fe(e,t);if("string"==typeof e)return Fe(e,t);const o=O(e,v(n));return 0===o.length?[]:1===o.length?Fe(o[0],t):Fe(o,t)}async function kt(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return qt({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=dt(e.queue,t,{max:n});if(o.dropped>0){const t=wt(e.status,E("collector"),"queue",o.dropped);pt(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&>(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?ze(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};let u=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&u.push(m(t));const I=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:k("unknown");if(!u.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!u.length&&(null==(i=s.queueOn)?void 0:i.length)){let t=!1;try{t=await It(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const q=[],O=u.filter(t=>{const n=x(s.config.consent,d,t.consent);if(n)return t.consent=n,q.push(t),!1;const r=_e(e,{stepId:E("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return r.skipReason="consent",d&&(r.consent={...d}),s.config.consent&&(r.meta={required:{...s.config.consent}}),S(e,r),!0});if(O.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 O)i+=dt(t,e,r).dropped;if(i>0){yt(e,n);const o=wt(e.status,E("destination",n),"queue",i);pt(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&>(t)}if(!q.length)return{id:o,destination:s,queue:u};let C,D,j=!1;try{j=await It(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!j)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const A=bt(s.config.before,g,I),M=s.config.next,P=null==(c=s.config)?void 0:c.cache,K=P?y(P):void 0,z=K?Pe(K,e):void 0,R=(null==(l=s.config)?void 0:l.state)?T(s.config.state):void 0,F=null==R?void 0:R.filter(e=>"get"===e.mode),H=null==R?void 0:R.filter(e=>"set"===e.mode);let N=0,B=0;return await Promise.all(q.map(async t=>{let r;if(t.globals=h(f,t.globals),t.user=h(p,t.user),(null==K?void 0:K.stop)&&z){const e=v(I,t),n=await w(K,z,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(A.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Ge(e,e.transformers,A,t,I,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(K&&!K.stop&&z){const e=v(I,i),n=await w(K,z,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})}F&&F.length>0&&i&&(i=await _(F,t=>Ke(t,e),i,e));const c=Date.now();let l=!1;const u=await $(St,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=dt(a,[i,t],u);if(d.dropped>0){yt(e,c);const t=wt(e.status,E("destination",c),"dlq",d.dropped);pt(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&>(a)})(e,s,o,i,I,a);if(N+=Date.now()-c,r&&z&&void 0===s.config.mock&&b(z,r.key,null==u||u,r.ttl),!l&&!vt(u)&&H&&H.length>0&&i&&(i=await _(H,t=>Ke(t,e),i,e)),void 0===u||vt(u)||(D=u),vt(u)&&B++,!l&&M){void 0!==u&&(I._response=u);const t=bt(M,g,I);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ge(e,e.transformers,t,i,I,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:C,response:D,totalDuration:N,batchedCount:B,allowedCount:q.length}})),q={},O={},C={};for(const t of I){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};yt(e,t.id);const u=e.status.destinations[t.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=n.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,C[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)O[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,s=null!=(l=t.allowedCount)?l:0;(Math.max(0,s-n)>0||0===s)&&(q[t.id]=o,u.count++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.out++)}}return qt({event:t,...Object.keys(q).length&&{done:q},...Object.keys(O).length&&{queued:O},...Object.keys(C).length&&{failed:C}})}async function It(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:Ot(t.env,t.config.env)};r.debug("init");const a=Date.now();let c;S(e,_e(e,{stepId:E("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await M(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),s=_e(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},S(e,s),t}if(!1===c)return c;if(t.config={...c||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)at(e,t,n,s,r)}r.debug("init done")}return!0}async function St(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:p}=t,g=await A(o,p,e);if(g.ignore)return!1;const h=t.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:n,config:p,data:g.data,rule:g.mapping,ingest:s,env:{...Ot(t.env,p.env),...r?{respond:r}:{}}};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=Ot(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}:{}}};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=yt(e,u),f=Date.now(),g=_e(e,{stepId:E("destination",n),stepType:"destination",phase:"flush",eventId:"",now:f});g.batch={size:a.entries.length,index:0},S(e,g);const h=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+=dt(s,e,r).dropped;if(i>0){const t=wt(e.status,E("destination",u),"dlq",i);pt(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&>(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let y=a.entries.length;const w=await $(M(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t=>{y=0;const o=Date.now(),s=_e(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-f,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),h(a.entries.map(e=>[e.event,t])),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if(j(k=w)&&Array.isArray(k.failed)&&w.failed.length>0){const e=[],t=new Set;for(const n of w.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&&(h(e),y=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:y,entries:a.entries.length}))}var k;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),y>0&&(d.count+=y,d.lastAt=Date.now(),e.status.out+=y)},{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=yt(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),ht}{v.debug("push",{event:g.event.name});const o="string"==typeof g.event.id?g.event.id:"",s=Date.now(),r=_e(e,{stepId:E("destination",n),stepType:"destination",phase:"in",eventId:o,now:s});g.mappingKey&&(r.mappingKey=g.mappingKey),g.event.consent&&(r.consent={...g.event.consent}),S(e,r);try{const r=await M(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m),i=Date.now(),a=_e(e,{stepId:E("destination",n),stepType:"destination",phase:"out",eventId:o,now:i});return a.durationMs=i-s,a.outEvent=r,g.mappingKey&&(a.mappingKey=g.mappingKey),S(e,a),v.debug("push done"),r}catch(t){const r=Date.now(),i=_e(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:o,now:r});throw i.durationMs=r-s,i.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},g.mappingKey&&(i.mappingKey=g.mappingKey),S(e,i),t}}}function qt(e){return{ok:!(null==e?void 0:e.failed),...e}}function xt(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=Re(e,"before"),{config:a}=Re({...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=Ot(t.env,o);return{...t,config:c,env:l}}function Ot(e,t){return e||t?t?e&&j(e)&&j(t)?{...e,...t}:t:e:{}}async function Ct(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 Dt(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function jt(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 Te.Config:we(n)&&(he(e.config,n,{shallow:!1}),s=n,r=!0);break;case Te.Consent:if(we(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);Dt(e,Te.Consent),s=t,r=!0}break;case Te.Custom:we(n)&&(e.custom=he(e.custom,n),Dt(e,Te.Custom),s=n,r=!0);break;case Te.Destination:we(n)&&"code"in n&&we(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 qt({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 Ye(e);const n=e.destinations[f];return n?kt(e,void 0,{},{[f]:n}):qt({ok:!0})}const p={...o,config:d,env:Ot(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),kt(e,void 0,{},{[f]:p})}(e,n));break;case Te.Globals:we(n)&&(e.globals=he(e.globals,n),Dt(e,Te.Globals),s=n,r=!0);break;case Te.Hook:if(we(n)&&ye(n.name)&&me(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case Te.On:if(we(n)&&ye(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=K(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,ct(e,t,r)}(e,t,o)}break;case Te.Ready:r=!0;break;case Te.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=he(e.consent,t.consent),Dt(e,Te.Consent)),t.user&&(e.user=he(e.user,t.user),Dt(e,Te.User)),t.globals&&(e.globals=he(e.config.globalsStatic||{},t.globals),Dt(e,Te.Globals)),t.custom&&(e.custom=he(e.custom,t.custom),Dt(e,Te.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Ye(e),await async function(e){for(const t of Xe){if(!et(e,t))continue;const n=lt(e,t);ct(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))Le(s)&&await ut(e,s,o,t,n)}}(e),await kt(e)}(e,n),r=!0;break;case Te.Session:r=!0;break;case Te.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await Ct(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 Ct(e.destinations,"destination",t),await Ct(e.transformers,"transformer",t),await Ct(e.stores,"store",t)}(e));break;case Te.User:we(n)&&(he(e.user,n,{shallow:!1}),Dt(e,Te.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=lt(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&&(Le(o)?await ut(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});at(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))Le(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await We(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!Le(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await Ye(e),ct(e,t,i,o),!c}(e,t,void 0,s),o=await kt(e)),o||qt({ok:!0})}()}finally{i()}}function At(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.0-next-1780690800063"},...t}}function Et(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=ve(),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 $t(e,t){const n=Oe(async(n,o={})=>await xe(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:be(i||"unknown");if(l){const t=await qe(g,l,e);if(t.ignore)return qt({ok:!0});if(l.consent&&!Se(l.consent,e.consent,t.event.consent))return qt({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ge(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return qt({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),qt({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=Et(e,o);return kt(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:qt({ok:!0})}g=n.event}const m=function(e,t){return Et(e,At(e,t))}(e,g),y=await kt(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 Ie)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),qt({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now();ke(e,_e(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r}));try{const i=await n(t,o),a=Date.now(),c=_e(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,ke(e,c),i}catch(t){const n=Date.now(),o=_e(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)},ke(e,o),t}}}function Mt(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 Tt(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=_e(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},Me(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?$e(e.match):()=>!0,ttl:e.ttl})),d=e=>`${s}:${e}`;function f(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return u.find(e=>e.match(n))}const p=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...l}},async get(t){const n=d(t),s=await o.get(n);if(void 0!==s)return l.hits++,c(t,"hit"),s;const r=p.get(n);if(r)return l.inflight_dedups++,c(t,"hit"),r;l.misses++,c(t,"miss");const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=f(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),l.populates++}catch(e){g("set",t,e)}return s}finally{p.delete(n)}})();return p.set(n,i),i},async set(t,n,s){l.writes++,await e.set(t,n,s);const r=f(t,n);if(r)try{await o.set(d(t),n,1e3*r.ttl)}catch(e){g("set",t,e)}},async delete(t){l.deletes++,await e.delete(t);try{await o.delete(d(t))}catch(e){g("delete",t,e)}}};function g(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function _t(e,t,n){const o=`store.${n}`,s=Ee(t.get,"StoreGet",e.hooks,e.logger),r=Ee(t.set,"StoreSet",e.hooks,e.logger),i=Ee(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=_e(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=_e(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=_e(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=_e(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=_e(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=_e(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=_e(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=_e(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=_e(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 Pt(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:{}},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=$t(a,e=>At(a,e)),a.command=(l=jt,De(async(e,t,n)=>await je(async()=>await l(c,e,t,n),n=>{if(n instanceof Ce)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),qt({ok:!1})})(),"Command",(c=a).hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,t={}){var n;const o={};for(const[n,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:r,env:i},l=await t(c);o[n]=l}const s=t,r=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){var i;const a=t[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(s);for(const t of r){const r=s[t].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=Mt()),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]=Tt(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&&_t(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=Mt()),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]=xt(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=de(f,"Transformer");if(!g.ok){e.logger.warn(`Transformer ${d} invalid (${g.code}): ${g.reason}. Skipping.`);continue}const{config:h}=Re(f,"before"),{config:v}=Re({...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:Z(d),config:k,env:p},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 fe(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 Kt(e){e=e||{};const t=await Pt(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 qt({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 Je(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,Le(n)&&await We(e,n,t))}return await Ye(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 zt=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 Kt({...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)}}}},Rt=(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:()=>Ft,step:()=>l,trigger:()=>Ht});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 j,processEventMapping as A,stepId as E,tryCatchAsync as $,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 R,tryCatchAsync as F}from"@walkeros/core";import{createIngest as H,FatalError as N,getMappingValue as B,tryCatchAsync as G,getNextSteps as U,compileCache as V,checkCache as W,storeCache as L,applyUpdate as J,buildCacheContext as Y,compileState as Q,applyState as X}from"@walkeros/core";import{createIngest as Z,emitStep as ee,FatalError as te,isObject as ne,stepId as oe,tryCatchAsync as se,useHooks as re,getNextSteps as ie,compileCache as ae,checkCache as ce,storeCache as le,buildCacheContext as ue,validateStepEntry as de,processEventMapping as fe,compileState as pe,applyState as ge}from"@walkeros/core";import{assign as he,getSpanId as ve,isFunction as me,isString as ye}from"@walkeros/core";import{isObject as we}from"@walkeros/core";import{createIngest as be,emitStep as ke,FatalError as Ie,getGrantedConsent as Se,processEventMapping as qe,tryCatchAsync as xe,useHooks as Oe}from"@walkeros/core";import{FatalError as Ce,useHooks as De,tryCatchAsync as je}from"@walkeros/core";import{emitStep as Ae,useHooks as Ee}from"@walkeros/core";import{compileMatcher as $e,emitStep as Me,readCacheEnvelope as Te,wrapCacheEnvelope as _e}from"@walkeros/core";var Pe={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 Ke(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 ze(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Re(e,t){return e?t.stores[e]:t.stores.__cache}function Fe(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 He(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 Ne(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 Be(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:Z(n),config:t.config,env:We(t.config.env)};s.debug("init");const i=await re(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 Ge(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:{...We(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now(),d=Ke(e,{stepId:oe("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u});ee(e,d);try{const s=await re(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=Ke(e,{stepId:oe("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:r});return i.durationMs=r-u,i.outEvent=s,ee(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=Ke(e,{stepId:oe("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)},ee(e,s),t}}function Ue(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:Z(t)}async function Ve(e,t,n,o,s,r,i){var a,c,l,u,d,f,p,g,h;s||(s=Z(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 se(Be,t=>{if(t instanceof te)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?ae(a):void 0,w=y?ze(y,e):void 0,b=(null==(p=r.config)?void 0:p.state)?pe(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?ge(I,t=>Re(t,e),t,e):t;let q;if(y&&w){const e=ue(s,v),t=await ce(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=ie(x,ue(s,v));if(1===n.length){const o=Ne(n[0],Fe(t));if(o.length>0){const n=await Ve(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=>se(Ve,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ne(n,Fe(t)),v,Ue(s,n),void 0,i)))}k&&k.length>0&&(v=await ge(k,t=>Re(t,e),v,e));const O=await se(Ge,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=Ue(s,"unknown");if(n.next){const s=ie(n.next,ue(a,o));if(0===s.length)return{event:o,respond:m};if(1===s.length){const n=Ne(s[0],Fe(t));return n.length>0?Ve(e,t,n,o,a,m,i):{event:o,respond:m}}return(await Promise.all(s.map(n=>se(Ve,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ne(n,Fe(t)),o,Ue(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Ve(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=ie(r,ue(s,o));if(0===a.length){v=o;continue}if(1===a.length){const n=Ne(a[0],Fe(t));return n.length>0?Ve(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=>se(Ve,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ne(n,Fe(t)),o,Ue(s,n),void 0,i))),{event:null,respond:void 0}}n&&(v=n)}I&&I.length>0&&(v=await ge(I,t=>Re(t,e),v,e)),q&&w&&le(w,q.key,v,q.ttl);const C=r.config.next,D="string"==typeof C||Array.isArray(C)&&C.every(e=>"string"==typeof e),j=void 0!==C&&!D;if((!O||"object"==typeof O&&!O.next)&&j){const n=ie(r.config.next,ue(s,v));if(1===n.length){const o=Ne(n[0],Fe(t));return o.length>0?Ve(e,t,o,v,s,m,i):{event:v,respond:m}}return n.length>1?(await Promise.all(n.map(n=>se(Ve,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ne(n,Fe(t)),v,Ue(s,n),void 0,i))),{event:null,respond:void 0}):{event:v,respond:m}}}return{event:v,respond:m}}function We(e){return e&&ne(e)?e:{}}function Le(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Je(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)tt(n)&&!it(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),tt(n)&&rt(e,t,n))}function Ye(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function Qe(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?Q(f):void 0,g=d,h=g?V({...g,stop:null==(s=g.stop)||s}):void 0,v=Le(l)?Ne(l,Fe(e.transformers)):void 0,m=Le(u)?Ne(u,Fe(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=U(u,Y(s.ingest));return 0===t.length?[]:Ne(1===t.length?t[0]:t,Fe(e.transformers))})():[];let d=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Ve(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=ze(h,e);if(t){const n=Y(s.ingest),o=await W(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 J(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=>{L(t,l,n,u),i?a=(async()=>{const t=await J(n,i,c,e);r(t)})():r(n)};s.respond=d}"MISS"!==o.status||h.stop||L(t,o.key,!0,o.rule.ttl)}}}const f=v?{kind:"single",preChain:v}:void 0!==l?(()=>{const t=U(l,Y(s.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Ne(t[0],Fe(e.transformers))}:{kind:"many",branches:t.map(t=>Ne(t,Fe(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(d=await Promise.all(d.map(t=>X(p,t=>Re(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:Ue(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})}},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 Xe(e){var t;for(const[t,n]of Object.entries(e.sources)){if(Ye(n))continue;const o=n.config.require;if(!(null==o?void 0:o.length))continue;const s=o.filter(t=>!ot(e,t));s.length!==o.length&&(n.config.require=s,Ye(n)&&await Je(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=>!ot(e,t));if(o.config&&(o.config.require=r),r.length>0)continue;delete e.pending.destinations[n];const i=Ct(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}function Ze(e,t,n,o){if(n instanceof z)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}var et=[Pe.Consent,Pe.User,Pe.Globals,Pe.Custom];function tt(e){return et.includes(e)}function nt(e,t){switch(t){case Pe.Consent:return Object.keys(e.consent).length>0;case Pe.User:return Object.keys(e.user).length>0;case Pe.Globals:return Object.keys(e.globals).length>0;case Pe.Custom:return Object.keys(e.custom).length>0;default:return!1}}function ot(e,t){switch(t){case Pe.Consent:case Pe.User:case Pe.Globals:case Pe.Custom:return nt(e,t);case Pe.Run:case Pe.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function st(e,t){var n;return null!=(n=e.cellVersion[String(t)])?n:0}function rt(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=st(e,n)}function it(e,t,n){return e.allowed&&st(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 at(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 ct(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function lt(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:Dt(t.env,t.config.env)};R(t.on,t=>Ze(e,"destination",t,{destId:n,type:o}))(o,a)}function ut(e,t,n,o){const s=dt(e,t,o);if(n.length)switch(t){case Pe.Consent:!function(e,t,n){const o=n||e.consent,s=ct(e,Pe.Consent);t.forEach(t=>{it(e,t,Pe.Consent)&&at(e,t,Pe.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{R(t[n],t=>Ze(e,"consent",t,{key:n}))(o,s)}),rt(e,t,Pe.Consent))})}(e,n,o);break;case Pe.Ready:!function(e,t){if(!e.allowed)return;const n=ct(e,Pe.Ready);t.forEach(t=>{R(t,t=>Ze(e,"ready",t))(void 0,n)})}(e,n);break;case Pe.Run:!function(e,t){if(!e.allowed)return;const n=ct(e,Pe.Run);t.forEach(t=>{R(t,t=>Ze(e,"run",t))(void 0,n)})}(e,n);break;case Pe.Session:!function(e,t){if(!e.session)return;const n=ct(e,Pe.Session);t.forEach(t=>{R(t,t=>Ze(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=ct(e,t),r=tt(t);n.forEach(n=>{"function"==typeof n&&(r&&!it(e,n,t)||r&&!at(e,n,t)||(R(n,n=>Ze(e,"generic",n,{type:t}))(s,o),r&&rt(e,n,t)))});break}}}function dt(e,t,n){switch(t){case Pe.Consent:return n||e.consent;case Pe.Session:return e.session;case Pe.User:return n||e.user;case Pe.Custom:return n||e.custom;case Pe.Globals:return n||e.globals;case Pe.Config:return n||e.config;default:return}}async function ft(e,t,n,o,s){if(!t.on)return!1;if(tt(o)&&!it(e,t,o))return!1;if(tt(o)&&!at(e,t,o))return!1;const r=await F(t.on,t=>Ze(e,"source",t,{sourceId:n,type:o}))(o,s);return tt(o)&&rt(e,t,o),!1===r}function pt(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 gt=new WeakMap;function ht(e,t,n,o){gt.get(e)||(gt.set(e,!0),t.warn(n,o))}function vt(e){gt.delete(e)}var mt=Object.freeze({batched:!0});function yt(e){return e===mt}function wt(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function bt(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 kt(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 It(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Ne(e,t);if("string"==typeof e)return Ne(e,t);const o=O(e,v(n));return 0===o.length?[]:1===o.length?Ne(o[0],t):Ne(o,t)}async function St(e,t,n={},o){var s,r,i,a,c,l;const{allowed:u,consent:d,globals:f,user:p}=e;if(!u)return Ot({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=pt(e.queue,t,{max:n});if(o.dropped>0){const t=kt(e.status,E("collector"),"queue",o.dropped);ht(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&vt(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?Fe(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};let u=(s.queuePush||[]).map(e=>({...e,consent:d}));s.queuePush=[],t&&u.push(m(t));const I=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:k("unknown");if(!u.length&&!(null==(r=s.queueOn)?void 0:r.length))return{id:o,destination:s,skipped:!0};if(!u.length&&(null==(i=s.queueOn)?void 0:i.length)){let t=!1;try{t=await qt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const q=[],O=u.filter(t=>{const n=x(s.config.consent,d,t.consent);if(n)return t.consent=n,q.push(t),!1;const r=Ke(e,{stepId:E("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return r.skipReason="consent",d&&(r.consent={...d}),s.config.consent&&(r.meta={required:{...s.config.consent}}),S(e,r),!0});if(O.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 O)i+=pt(t,e,r).dropped;if(i>0){bt(e,n);const o=kt(e.status,E("destination",n),"queue",i);ht(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&&vt(t)}if(!q.length)return{id:o,destination:s,queue:u};let C,D,j=!1;try{j=await qt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!j)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const A=It(s.config.before,g,I),M=s.config.next,P=null==(c=s.config)?void 0:c.cache,K=P?y(P):void 0,z=K?ze(K,e):void 0,R=(null==(l=s.config)?void 0:l.state)?T(s.config.state):void 0,F=null==R?void 0:R.filter(e=>"get"===e.mode),H=null==R?void 0:R.filter(e=>"set"===e.mode);let N=0,B=0;return await Promise.all(q.map(async t=>{let r;if(t.globals=h(f,t.globals),t.user=h(p,t.user),(null==K?void 0:K.stop)&&z){const e=v(I,t),n=await w(K,z,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(A.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Ve(e,e.transformers,A,t,I,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(K&&!K.stop&&z){const e=v(I,i),n=await w(K,z,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})}F&&F.length>0&&i&&(i=await _(F,t=>Re(t,e),i,e));const c=Date.now();let l=!1;const u=await $(xt,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=pt(a,[i,t],u);if(d.dropped>0){bt(e,c);const t=kt(e.status,E("destination",c),"dlq",d.dropped);ht(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&&vt(a)})(e,s,o,i,I,a);if(N+=Date.now()-c,r&&z&&void 0===s.config.mock&&b(z,r.key,null==u||u,r.ttl),!l&&!yt(u)&&H&&H.length>0&&i&&(i=await _(H,t=>Re(t,e),i,e)),void 0===u||yt(u)||(D=u),yt(u)&&B++,!l&&M){void 0!==u&&(I._response=u);const t=It(M,g,I);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ve(e,e.transformers,t,i,I,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:s,error:C,response:D,totalDuration:N,batchedCount:B,allowedCount:q.length}})),q={},O={},C={};for(const t of I){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};bt(e,t.id);const u=e.status.destinations[t.id],d=Date.now();if(u.queuePushSize=null!=(r=null==(s=n.queuePush)?void 0:s.length)?r:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,C[t.id]=o,u.failed++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)O[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,s=null!=(l=t.allowedCount)?l:0;(Math.max(0,s-n)>0||0===s)&&(q[t.id]=o,u.count++,u.lastAt=d,u.duration+=t.totalDuration||0,e.status.out++)}}return Ot({event:t,...Object.keys(q).length&&{done:q},...Object.keys(O).length&&{queued:O},...Object.keys(C).length&&{failed:C}})}async function qt(e,t,n){var o;if(t.init&&!t.config.init){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:Dt(t.env,t.config.env)};r.debug("init");const a=Date.now();let c;S(e,Ke(e,{stepId:E("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await M(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),s=Ke(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},S(e,s),t}if(!1===c)return c;if(t.config={...c||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)lt(e,t,n,s,r)}r.debug("init done")}return!0}async function xt(e,t,n,o,s,r){var i,a,c,l,u,d,f;const{config:p}=t,g=await A(o,p,e);if(g.ignore)return!1;const h=t.type||"unknown",v=e.logger.scope(h),m={collector:e,logger:v,id:n,config:p,data:g.data,rule:g.mapping,ingest:s,env:{...Dt(t.env,p.env),...r?{respond:r}:{}}};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=wt(null==y?void 0:y.batch),r=wt(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=Dt(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}:{}}};v.debug("push batch",{events:a.entries.length});const u=t.config.id||n,d=bt(e,u),f=Date.now(),g=Ke(e,{stepId:E("destination",n),stepType:"destination",phase:"flush",eventId:"",now:f});g.batch={size:a.entries.length,index:0},S(e,g);const h=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+=pt(s,e,r).dropped;if(i>0){const t=kt(e.status,E("destination",u),"dlq",i);ht(s,v,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:r.max,droppedCount:t})}else s.length<r.max&&vt(s);d.failed+=n.length,d.dlqSize=s.length,e.status.failed+=n.length};let y=a.entries.length;const w=await $(M(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t=>{y=0;const o=Date.now(),s=Ke(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});s.durationMs=o-f,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),h(a.entries.map(e=>[e.event,t])),v.error("Push batch failed",{error:t instanceof Error?t.message:String(t),entries:a.entries.length})})(a,l);if(j(k=w)&&Array.isArray(k.failed)&&w.failed.length>0){const e=[],t=new Set;for(const n of w.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&&(h(e),y=Math.max(0,a.entries.length-e.length),v.error("Push batch partial failure",{failed:e.length,delivered:y,entries:a.entries.length}))}var k;v.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!=(s=d.inFlightBatch)?s:0)-a.entries.length),y>0&&(d.count+=y,d.lastAt=Date.now(),e.status.out+=y)},{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=bt(e,h);return m.inFlightBatch=(null!=(f=m.inFlightBatch)?f:0)+1,o.batchFn(),mt}{v.debug("push",{event:g.event.name});const o="string"==typeof g.event.id?g.event.id:"",s=Date.now(),r=Ke(e,{stepId:E("destination",n),stepType:"destination",phase:"in",eventId:o,now:s});g.mappingKey&&(r.mappingKey=g.mappingKey),g.event.consent&&(r.consent={...g.event.consent}),S(e,r);try{const r=await M(t.push,"DestinationPush",e.hooks,e.logger)(g.event,m),i=Date.now(),a=Ke(e,{stepId:E("destination",n),stepType:"destination",phase:"out",eventId:o,now:i});return a.durationMs=i-s,a.outEvent=r,g.mappingKey&&(a.mappingKey=g.mappingKey),S(e,a),v.debug("push done"),r}catch(t){const r=Date.now(),i=Ke(e,{stepId:E("destination",n),stepType:"destination",phase:"error",eventId:o,now:r});throw i.durationMs=r-s,i.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},g.mappingKey&&(i.mappingKey=g.mappingKey),S(e,i),t}}}function Ot(e){return{ok:!(null==e?void 0:e.failed),...e}}function Ct(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=He(e,"before"),{config:a}=He({...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=Dt(t.env,o);return{...t,config:c,env:l}}function Dt(e,t){return e||t?t?e&&j(e)&&j(t)?{...e,...t}:t:e:{}}async function jt(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 At(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Et(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 Pe.Config:we(n)&&(he(e.config,n,{shallow:!1}),s=n,r=!0);break;case Pe.Consent:if(we(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);At(e,Pe.Consent),s=t,r=!0}break;case Pe.Custom:we(n)&&(e.custom=he(e.custom,n),At(e,Pe.Custom),s=n,r=!0);break;case Pe.Destination:we(n)&&"code"in n&&we(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 Ot({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 Xe(e);const n=e.destinations[f];return n?St(e,void 0,{},{[f]:n}):Ot({ok:!0})}const p={...o,config:d,env:Dt(o.env,r)};return e.destinations[f]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),St(e,void 0,{},{[f]:p})}(e,n));break;case Pe.Globals:we(n)&&(e.globals=he(e.globals,n),At(e,Pe.Globals),s=n,r=!0);break;case Pe.Hook:if(we(n)&&ye(n.name)&&me(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case Pe.On:if(we(n)&&ye(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=K(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,ut(e,t,r)}(e,t,o)}break;case Pe.Ready:r=!0;break;case Pe.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=he(e.consent,t.consent),At(e,Pe.Consent)),t.user&&(e.user=he(e.user,t.user),At(e,Pe.User)),t.globals&&(e.globals=he(e.config.globalsStatic||{},t.globals),At(e,Pe.Globals)),t.custom&&(e.custom=he(e.custom,t.custom),At(e,Pe.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Xe(e),await async function(e){for(const t of et){if(!nt(e,t))continue;const n=dt(e,t);ut(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))Ye(s)&&await ft(e,s,o,t,n)}}(e),await St(e)}(e,n),r=!0;break;case Pe.Session:r=!0;break;case Pe.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await jt(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 jt(e.destinations,"destination",t),await jt(e.transformers,"transformer",t),await jt(e.stores,"store",t)}(e));break;case Pe.User:we(n)&&(he(e.user,n,{shallow:!1}),At(e,Pe.User),s=n,r=!0)}return r&&(await async function(e,t,n,o){var s,r;e.seenEvents.add(String(t));let i=n||[];n||(i=e.on[t]||[]);const a=dt(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&&(Ye(o)?await ft(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});lt(e,o,n,t,a)}});for(const[t,n]of Object.entries(e.sources))Ye(n)&&(null==(r=n.queueOn)?void 0:r.length)&&await Je(e,n,t);const l=Object.values(e.sources).some(e=>{var t;return!Ye(e)&&(null==(t=e.config.require)?void 0:t.length)});return(Object.keys(e.pending.destinations).length>0||l)&&await Xe(e),ut(e,t,i,o),!c}(e,t,void 0,s),o=await St(e)),o||Ot({ok:!0})}()}finally{i()}}function $t(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.0-next-1780909874350"},...t}}function Mt(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=ve(),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 Tt(e,t){const n=Oe(async(n,o={})=>await xe(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:be(i||"unknown");if(l){const t=await qe(g,l,e);if(t.ignore)return Ot({ok:!0});if(l.consent&&!Se(l.consent,e.consent,t.event.consent))return Ot({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ve(e,e.transformers,u,g,v,p,i?`source.${i}.next`:void 0);if(null===n.event)return Ot({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),Ot({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=Mt(e,o);return St(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:Ot({ok:!0})}g=n.event}const m=function(e,t){return Mt(e,$t(e,t))}(e,g),y=await St(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 Ie)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),Ot({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id?t.id:"",r=Date.now();ke(e,Ke(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s,now:r}));try{const i=await n(t,o),a=Date.now(),c=Ke(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s,now:a});return c.durationMs=a-r,c.outEvent=i,ke(e,c),i}catch(t){const n=Date.now(),o=Ke(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)},ke(e,o),t}}}function _t(e={}){var t,n,o;const s=null!=(t=e.maxEntries)?t:1e4,r=null!=(n=e.lowWaterMark)?n:.8,i=null!=(o=e.sweepIntervalMs)?o:6e4,a=Math.floor(s*r),c=new Map,l={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let u;return i>0&&(u=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of c)void 0!==o.expires&&o.expires<=e&&(c.delete(n),t++);l.evictions_ttl+=t},i),u&&"function"==typeof u.unref&&u.unref()),{type:"memory",config:{},get(e){const t=c.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(c.delete(e),l.evictions_ttl++,void l.misses++):(c.delete(e),c.set(e,t),l.hits++,t.value);l.misses++},set(e,t,n){const o=!c.has(e);o||c.delete(e),c.set(e,{value:t,expires:void 0!==n?Date.now()+n:void 0}),l.writes++,o&&l.populates++,c.size>s&&function(){if(c.size<=s)return;const e=c.size-a;let t=0;for(const n of c.keys()){if(t>=e)break;c.delete(n),t++}l.evictions_entries+=t}()},delete(e){c.delete(e)&&l.deletes++},get counters(){return{...l}},destroy(){void 0!==u&&(clearInterval(u),u=void 0),c.clear()}}}function Pt(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=Ke(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},Me(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?$e(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=Te(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,_e(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),_e(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 Kt(e,t,n){const o=`store.${n}`,s=Ee(t.get,"StoreGet",e.hooks,e.logger),r=Ee(t.set,"StoreSet",e.hooks,e.logger),i=Ee(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=Ke(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=Ke(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=Ke(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=Ke(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=Ke(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=Ke(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=Ke(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=Ke(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=Ke(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 zt(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:{}},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=Tt(a,e=>$t(a,e)),a.command=(l=Et,De(async(e,t,n)=>await je(async()=>await l(c,e,t,n),n=>{if(n instanceof Ce)throw n;return c.status.failed++,c.logger.error("command failed",{command:e,data:t,error:n}),Ot({ok:!1})})(),"Command",(c=a).hooks,c.logger));const u=e.stores||{};return a.stores=await async function(e,t={}){var n;const o={};for(const[n,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:r,env:i},l=await t(c);o[n]=l}const s=t,r=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){var i;const a=t[r];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const c=null==(i=e[r].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${r}" cache.store references "${c}", which is not declared in flow.stores`);s(c)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(s);for(const t of r){const r=s[t].cache;if(!r)continue;let i,a;void 0!==r.store?(i=o[r.store],a=r.store):(o.__cache||(o.__cache=_t()),i=o.__cache,a="__cache");const c=null!=(n=r.namespace)?n:t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${c}:" via ${a}`),o[t]=Pt(o[t],{storeId:t,cacheConfig:r,cacheStore:i,namespace:c,logger:e.logger.scope("store-cache").scope(t),collector:e})}for(const[t,n]of Object.entries(o))"__cache"!==t&&Kt(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=_t()),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]=Ct(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=de(f,"Transformer");if(!g.ok){e.logger.warn(`Transformer ${d} invalid (${g.code}): ${g.reason}. Skipping.`);continue}const{config:h}=He(f,"before"),{config:v}=He({...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:Z(d),config:k,env:p},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 fe(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 Rt(e){e=e||{};const t=await zt(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 Ot({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 Qe(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,Ye(n)&&await Je(e,n,t))}return await Xe(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 Ft=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 Rt({...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)}}}},Ht=(e,t)=>{if(!e||"object"!=typeof e)return;const n=e,o=t.localStorage;if(n.sessionData&&"object"==typeof n.sessionData){const e="string"==typeof n.sessionKey?n.sessionKey:"elbSessionId";o.setItem(e,JSON.stringify(n.sessionData))}if("string"==typeof n.deviceId){const e="string"==typeof n.deviceKey?n.deviceKey:"elbDeviceId";o.setItem(e,n.deviceId)}};export{c as examples,n as schemas};//# sourceMappingURL=dev.mjs.map
|
package/dist/dev.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/examples/index.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z, ClickIdEntrySchema } from '@walkeros/core/dev';\n\n/**\n * Session source settings schema\n */\nexport const SettingsSchema = z.object({\n storage: z\n .boolean()\n .default(false)\n .describe('Enable persistent storage for session/device IDs')\n .optional(),\n\n consent: z\n .union([z.string(), z.array(z.string())])\n .describe('Consent key(s) required to enable storage mode')\n .optional(),\n\n length: z\n .number()\n .default(30)\n .describe('Session timeout in minutes')\n .optional(),\n\n pulse: z\n .boolean()\n .default(false)\n .describe('Keep session alive on each event')\n .optional(),\n\n sessionKey: z\n .string()\n .default('elbSessionId')\n .describe('Storage key for session ID')\n .optional(),\n\n sessionStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for session')\n .optional(),\n\n deviceKey: z\n .string()\n .default('elbDeviceId')\n .describe('Storage key for device ID')\n .optional(),\n\n deviceStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for device')\n .optional(),\n\n deviceAge: z\n .number()\n .default(30)\n .describe('Device ID age in days')\n .optional(),\n\n // Note: Using z.any() because z.custom() cannot be converted to JSON Schema\n // TypeScript types provide compile-time safety; runtime accepts function or false\n cb: z\n .any()\n .describe('Custom session callback function or false to disable')\n .optional(),\n\n clickIds: z\n .array(ClickIdEntrySchema)\n .describe(\n 'Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","export * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Session source emits three elb calls on start:\n * 1. command('user', { session, device? })\n * 2. command('session', <full session data>)\n * 3. push({ name: 'session start', data: <full session data> })\n */\n\nexport const newMarketingSession: Flow.StepExample = {\n title: 'New marketing session',\n description:\n 'A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.',\n trigger: {\n type: 'load',\n options: {\n url: 'https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 's3ss10n-id', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n },\n ],\n ],\n};\n\nexport const returningVisitor: Flow.StepExample = {\n title: 'Returning visitor',\n description:\n 'A returning visit with a google referrer reuses the stored device id and increments the session count.',\n trigger: {\n type: 'load',\n options: {\n referrer: 'https://google.com',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 'n3w-s3ss10n', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface SessionTriggerOptions {\n url?: string;\n referrer?: string;\n sessionData?: Record<string, unknown>;\n deviceId?: string;\n sessionKey?: string;\n deviceKey?: string;\n}\n\nconst createTrigger: Trigger.CreateFn<Record<string, unknown>, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Record<string, unknown>, void> =\n (type?: string, opts?: unknown) =>\n async (content: Record<string, unknown>) => {\n const options = (opts || {}) as SessionTriggerOptions;\n\n // Pre-init: seed world state before source reads it\n if (options.url) {\n const urlObj = new URL(options.url);\n window.history.replaceState({}, '', urlObj.pathname + urlObj.search);\n }\n if (options.referrer) {\n Object.defineProperty(document, 'referrer', {\n value: options.referrer,\n configurable: true,\n });\n }\n if (options.sessionData) {\n const key = options.sessionKey || 'elbSessionId';\n localStorage.setItem(key, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n const key = options.deviceKey || 'elbDeviceId';\n localStorage.setItem(key, options.deviceId);\n }\n\n // Lazy startFlow — session source fires events during init, but\n // collector.allowed is false until command('run'). The initial\n // session event is dropped. After startFlow, clear the session\n // data written by the dropped init, re-seed, and trigger a consent\n // update to cause session re-init with allowed=true.\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n\n // Clear session data written by the dropped init\n const sessionKey =\n options.sessionKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.sessionKey as string) ||\n 'elbSessionId';\n const deviceKey =\n options.deviceKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.deviceKey as string) ||\n 'elbDeviceId';\n localStorage.removeItem(sessionKey);\n localStorage.removeItem(deviceKey);\n\n // Re-seed localStorage if trigger options specified session data\n if (options.sessionData) {\n localStorage.setItem(sessionKey, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n localStorage.setItem(deviceKey, options.deviceId);\n }\n\n // Re-apply consent to trigger session source on('consent') handler.\n // Now allowed=true so the session start event reaches destinations.\n if (config.consent) {\n await flow.collector.command('consent', config.consent);\n }\n }\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Prepares localStorage with session/device data before source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n if (!input || typeof input !== 'object') return;\n const data = input as Record<string, unknown>;\n const storage = env.localStorage as Storage;\n\n if (data.sessionData && typeof data.sessionData === 'object') {\n const key =\n typeof data.sessionKey === 'string' ? data.sessionKey : 'elbSessionId';\n storage.setItem(key, JSON.stringify(data.sessionData));\n }\n\n if (typeof data.deviceId === 'string') {\n const key =\n typeof data.deviceKey === 'string' ? data.deviceKey : 'elbDeviceId';\n storage.setItem(key, data.deviceId);\n }\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["trigger","_e"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/examples/index.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z, ClickIdEntrySchema } from '@walkeros/core/dev';\n\n/**\n * Session source settings schema\n */\nexport const SettingsSchema = z.object({\n storage: z\n .boolean()\n .default(false)\n .describe('Enable persistent storage for session/device IDs')\n .optional(),\n\n consent: z\n .union([z.string(), z.array(z.string())])\n .describe('Consent key(s) required to enable storage mode')\n .optional(),\n\n length: z\n .number()\n .default(30)\n .describe('Session timeout in minutes')\n .optional(),\n\n pulse: z\n .boolean()\n .default(false)\n .describe('Keep session alive on each event')\n .optional(),\n\n sessionKey: z\n .string()\n .default('elbSessionId')\n .describe('Storage key for session ID')\n .optional(),\n\n sessionStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for session')\n .optional(),\n\n deviceKey: z\n .string()\n .default('elbDeviceId')\n .describe('Storage key for device ID')\n .optional(),\n\n deviceStorage: z\n .enum(['local', 'session'])\n .default('local')\n .describe('Storage type for device')\n .optional(),\n\n deviceAge: z\n .number()\n .default(30)\n .describe('Device ID age in days')\n .optional(),\n\n // Note: Using z.any() because z.custom() cannot be converted to JSON Schema\n // TypeScript types provide compile-time safety; runtime accepts function or false\n cb: z\n .any()\n .describe('Custom session callback function or false to disable')\n .optional(),\n\n clickIds: z\n .array(ClickIdEntrySchema)\n .describe(\n 'Custom click-ID registry. Entries with a `param` matching a default override the platform name in place; new params append to the end of the priority list.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","export * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Flow } from '@walkeros/core';\n\n/**\n * Session source emits three elb calls on start:\n * 1. command('user', { session, device? })\n * 2. command('session', <full session data>)\n * 3. push({ name: 'session start', data: <full session data> })\n */\n\nexport const newMarketingSession: Flow.StepExample = {\n title: 'New marketing session',\n description:\n 'A visit with UTM parameters starts a new session and emits walker user, session, and session start calls.',\n trigger: {\n type: 'load',\n options: {\n url: 'https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=winter-sale',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 's3ss10n-id', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 's3ss10n-id',\n start: 1700000000000,\n isNew: true,\n count: 1,\n runs: 1,\n marketing: true,\n source: 'google',\n medium: 'cpc',\n campaign: 'winter-sale',\n referrer: '',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700000000000,\n },\n },\n ],\n ],\n};\n\nexport const returningVisitor: Flow.StepExample = {\n title: 'Returning visitor',\n description:\n 'A returning visit with a google referrer reuses the stored device id and increments the session count.',\n trigger: {\n type: 'load',\n options: {\n referrer: 'https://google.com',\n },\n },\n in: { storage: true },\n out: [\n ['elb', 'user', { session: 'n3w-s3ss10n', device: 'd3v1c3-id' }],\n [\n 'elb',\n 'session',\n {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n ],\n [\n 'elb',\n {\n name: 'session start',\n data: {\n id: 'n3w-s3ss10n',\n start: 1700001000000,\n isNew: false,\n count: 3,\n runs: 1,\n referrer: 'google.com',\n device: 'd3v1c3-id',\n isStart: true,\n storage: true,\n updated: 1700001000000,\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface SessionTriggerOptions {\n url?: string;\n referrer?: string;\n sessionData?: Record<string, unknown>;\n deviceId?: string;\n sessionKey?: string;\n deviceKey?: string;\n}\n\nconst createTrigger: Trigger.CreateFn<Record<string, unknown>, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Record<string, unknown>, void> =\n (type?: string, opts?: unknown) =>\n async (content: Record<string, unknown>) => {\n const options = (opts || {}) as SessionTriggerOptions;\n\n // Pre-init: seed world state before source reads it\n if (options.url) {\n const urlObj = new URL(options.url);\n window.history.replaceState({}, '', urlObj.pathname + urlObj.search);\n }\n if (options.referrer) {\n Object.defineProperty(document, 'referrer', {\n value: options.referrer,\n configurable: true,\n });\n }\n if (options.sessionData) {\n const key = options.sessionKey || 'elbSessionId';\n localStorage.setItem(key, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n const key = options.deviceKey || 'elbDeviceId';\n localStorage.setItem(key, options.deviceId);\n }\n\n // Lazy startFlow — session source fires events during init, but\n // collector.allowed is false until command('run'). The initial\n // session event is dropped. After startFlow, clear the session\n // data written by the dropped init, re-seed, and trigger a consent\n // update to cause session re-init with allowed=true.\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n\n // Clear session data written by the dropped init\n const sessionKey =\n options.sessionKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.sessionKey as string) ||\n 'elbSessionId';\n const deviceKey =\n options.deviceKey ||\n ((\n config.sources?.session?.config?.settings as Record<string, unknown>\n )?.deviceKey as string) ||\n 'elbDeviceId';\n localStorage.removeItem(sessionKey);\n localStorage.removeItem(deviceKey);\n\n // Re-seed localStorage if trigger options specified session data\n if (options.sessionData) {\n localStorage.setItem(sessionKey, JSON.stringify(options.sessionData));\n }\n if (options.deviceId) {\n localStorage.setItem(deviceKey, options.deviceId);\n }\n\n // Re-apply consent to trigger session source on('consent') handler.\n // Now allowed=true so the session start event reaches destinations.\n if (config.consent) {\n await flow.collector.command('consent', config.consent);\n }\n }\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Prepares localStorage with session/device data before source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n if (!input || typeof input !== 'object') return;\n const data = input as Record<string, unknown>;\n const storage = env.localStorage as Storage;\n\n if (data.sessionData && typeof data.sessionData === 'object') {\n const key =\n typeof data.sessionKey === 'string' ? data.sessionKey : 'elbSessionId';\n storage.setItem(key, JSON.stringify(data.sessionData));\n }\n\n if (typeof data.deviceId === 'string') {\n const key =\n typeof data.deviceKey === 'string' ? data.deviceKey : 'elbDeviceId';\n storage.setItem(key, data.deviceId);\n }\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["trigger","_e"]}
|
package/dist/walkerOS.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$meta": {
|
|
3
3
|
"package": "@walkeros/web-source-session",
|
|
4
|
-
"version": "4.2.0-next-
|
|
4
|
+
"version": "4.2.0-next-1780909874350",
|
|
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
|
|
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 Rt({...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.0-next-
|
|
4
|
+
"version": "4.2.0-next-1780909874350",
|
|
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.0-next-
|
|
37
|
-
"@walkeros/web-core": "4.2.0-next-
|
|
36
|
+
"@walkeros/core": "4.2.0-next-1780909874350",
|
|
37
|
+
"@walkeros/web-core": "4.2.0-next-1780909874350"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@walkeros/collector": "4.2.0-next-
|
|
40
|
+
"@walkeros/collector": "4.2.0-next-1780909874350"
|
|
41
41
|
},
|
|
42
42
|
"repository": {
|
|
43
43
|
"url": "git+https://github.com/elbwalker/walkerOS.git",
|