@walkeros/collector 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +22 -15
- package/dist/index.d.ts +22 -15
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -65,13 +65,13 @@ declare const Const: {
|
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* @param collector - The walkerOS collector instance.
|
|
71
|
-
* @param data - The consent data to set.
|
|
72
|
-
* @returns The result of the push operation.
|
|
68
|
+
* Processes consent data: coerces to boolean, updates collector state.
|
|
69
|
+
* Does NOT notify or process queues — caller handles that.
|
|
73
70
|
*/
|
|
74
|
-
declare function
|
|
71
|
+
declare function processConsent(collector: Collector.Instance, data: WalkerOS.Consent): {
|
|
72
|
+
update: WalkerOS.Consent;
|
|
73
|
+
runQueue: boolean;
|
|
74
|
+
};
|
|
75
75
|
|
|
76
76
|
declare function startFlow<ElbPush extends Elb.Fn = Elb.Fn>(initConfig?: Collector.InitConfig): Promise<StartFlow<ElbPush>>;
|
|
77
77
|
|
|
@@ -137,6 +137,12 @@ declare function destinationPush<Destination extends Destination.Instance>(colle
|
|
|
137
137
|
* @returns The push result.
|
|
138
138
|
*/
|
|
139
139
|
declare function createPushResult(partialResult?: Partial<Elb.PushResult>): Elb.PushResult;
|
|
140
|
+
/**
|
|
141
|
+
* Register a single destination from its init definition.
|
|
142
|
+
* Merges code config, user config, and chain config.
|
|
143
|
+
* Used by initDestinations and activatePending.
|
|
144
|
+
*/
|
|
145
|
+
declare function registerDestination(def: Destination.Init): Destination.Instance;
|
|
140
146
|
/**
|
|
141
147
|
* Initializes a map of destinations using ONLY the unified code/config/env pattern.
|
|
142
148
|
* Does NOT call destination.init() - that happens later during push with proper consent checks.
|
|
@@ -145,7 +151,7 @@ declare function createPushResult(partialResult?: Partial<Elb.PushResult>): Elb.
|
|
|
145
151
|
* @param collector - The collector instance for destination init context.
|
|
146
152
|
* @returns The initialized destinations.
|
|
147
153
|
*/
|
|
148
|
-
declare function initDestinations(
|
|
154
|
+
declare function initDestinations(collector: Collector.Instance, destinations?: Destination.InitDestinations): Promise<Collector.Destinations>;
|
|
149
155
|
/**
|
|
150
156
|
* Merges destination environment with config environment
|
|
151
157
|
* Config env takes precedence over destination env for overrides
|
|
@@ -186,7 +192,7 @@ declare function runCollector(collector: Collector.Instance, state?: RunState):
|
|
|
186
192
|
* @param type The type of the event to listen for.
|
|
187
193
|
* @param option The callback function or an array of callback functions.
|
|
188
194
|
*/
|
|
189
|
-
declare function on(collector: Collector.Instance, type: On.Types, option: WalkerOS.SingleOrArray<On.Options>): void
|
|
195
|
+
declare function on(collector: Collector.Instance, type: On.Types, option: WalkerOS.SingleOrArray<On.Options>): Promise<void>;
|
|
190
196
|
/**
|
|
191
197
|
* Calls a destination's on() handler with proper context.
|
|
192
198
|
* Used by both onApply() for immediate calls and destinationInit() for flushing queued events.
|
|
@@ -200,14 +206,15 @@ declare function callDestinationOn(collector: Collector.Instance, destination: D
|
|
|
200
206
|
* @param options The options for the callbacks.
|
|
201
207
|
* @param config The consent configuration.
|
|
202
208
|
*/
|
|
203
|
-
declare function onApply(collector: Collector.Instance, type: On.Types, options?: Array<On.Options>, config?:
|
|
209
|
+
declare function onApply(collector: Collector.Instance, type: On.Types, options?: Array<On.Options>, config?: unknown): Promise<boolean>;
|
|
204
210
|
|
|
205
211
|
/**
|
|
206
|
-
* Initialize
|
|
207
|
-
*
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
212
|
+
* Initialize a single source. Extracted from the initSources loop body
|
|
213
|
+
* so it can be reused by the pending-source activator.
|
|
214
|
+
*/
|
|
215
|
+
declare function initSource(collector: Collector.Instance, sourceId: string, sourceDefinition: Source.InitSource): Promise<Source.Instance | undefined>;
|
|
216
|
+
/**
|
|
217
|
+
* Initialize sources. Sources with `require` are deferred to collector.pending.
|
|
211
218
|
*/
|
|
212
219
|
declare function initSources(collector: Collector.Instance, sources?: Source.InitSources): Promise<Collector.Sources>;
|
|
213
220
|
|
|
@@ -286,4 +293,4 @@ declare function walkChain(startId: string | string[] | undefined, transformers?
|
|
|
286
293
|
next?: string | string[];
|
|
287
294
|
}>): string[];
|
|
288
295
|
|
|
289
|
-
export { code as Code, type CommandTypes, Commands, Const, type CreateCollector, type HandleCommandFn, type RunState, type StartFlow, type StorageType, addDestination, callDestinationOn, commonHandleCommand, createEvent, createPush, createPushResult, destinationInit, destinationPush, extractTransformerNextMap, initDestinations, initSources, mergeEnvironments, on, onApply, pushToDestinations,
|
|
296
|
+
export { code as Code, type CommandTypes, Commands, Const, type CreateCollector, type HandleCommandFn, type RunState, type StartFlow, type StorageType, addDestination, callDestinationOn, commonHandleCommand, createEvent, createPush, createPushResult, destinationInit, destinationPush, extractTransformerNextMap, initDestinations, initSource, initSources, mergeEnvironments, on, onApply, processConsent, pushToDestinations, registerDestination, runCollector, startFlow, walkChain };
|
package/dist/index.d.ts
CHANGED
|
@@ -65,13 +65,13 @@ declare const Const: {
|
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* @param collector - The walkerOS collector instance.
|
|
71
|
-
* @param data - The consent data to set.
|
|
72
|
-
* @returns The result of the push operation.
|
|
68
|
+
* Processes consent data: coerces to boolean, updates collector state.
|
|
69
|
+
* Does NOT notify or process queues — caller handles that.
|
|
73
70
|
*/
|
|
74
|
-
declare function
|
|
71
|
+
declare function processConsent(collector: Collector.Instance, data: WalkerOS.Consent): {
|
|
72
|
+
update: WalkerOS.Consent;
|
|
73
|
+
runQueue: boolean;
|
|
74
|
+
};
|
|
75
75
|
|
|
76
76
|
declare function startFlow<ElbPush extends Elb.Fn = Elb.Fn>(initConfig?: Collector.InitConfig): Promise<StartFlow<ElbPush>>;
|
|
77
77
|
|
|
@@ -137,6 +137,12 @@ declare function destinationPush<Destination extends Destination.Instance>(colle
|
|
|
137
137
|
* @returns The push result.
|
|
138
138
|
*/
|
|
139
139
|
declare function createPushResult(partialResult?: Partial<Elb.PushResult>): Elb.PushResult;
|
|
140
|
+
/**
|
|
141
|
+
* Register a single destination from its init definition.
|
|
142
|
+
* Merges code config, user config, and chain config.
|
|
143
|
+
* Used by initDestinations and activatePending.
|
|
144
|
+
*/
|
|
145
|
+
declare function registerDestination(def: Destination.Init): Destination.Instance;
|
|
140
146
|
/**
|
|
141
147
|
* Initializes a map of destinations using ONLY the unified code/config/env pattern.
|
|
142
148
|
* Does NOT call destination.init() - that happens later during push with proper consent checks.
|
|
@@ -145,7 +151,7 @@ declare function createPushResult(partialResult?: Partial<Elb.PushResult>): Elb.
|
|
|
145
151
|
* @param collector - The collector instance for destination init context.
|
|
146
152
|
* @returns The initialized destinations.
|
|
147
153
|
*/
|
|
148
|
-
declare function initDestinations(
|
|
154
|
+
declare function initDestinations(collector: Collector.Instance, destinations?: Destination.InitDestinations): Promise<Collector.Destinations>;
|
|
149
155
|
/**
|
|
150
156
|
* Merges destination environment with config environment
|
|
151
157
|
* Config env takes precedence over destination env for overrides
|
|
@@ -186,7 +192,7 @@ declare function runCollector(collector: Collector.Instance, state?: RunState):
|
|
|
186
192
|
* @param type The type of the event to listen for.
|
|
187
193
|
* @param option The callback function or an array of callback functions.
|
|
188
194
|
*/
|
|
189
|
-
declare function on(collector: Collector.Instance, type: On.Types, option: WalkerOS.SingleOrArray<On.Options>): void
|
|
195
|
+
declare function on(collector: Collector.Instance, type: On.Types, option: WalkerOS.SingleOrArray<On.Options>): Promise<void>;
|
|
190
196
|
/**
|
|
191
197
|
* Calls a destination's on() handler with proper context.
|
|
192
198
|
* Used by both onApply() for immediate calls and destinationInit() for flushing queued events.
|
|
@@ -200,14 +206,15 @@ declare function callDestinationOn(collector: Collector.Instance, destination: D
|
|
|
200
206
|
* @param options The options for the callbacks.
|
|
201
207
|
* @param config The consent configuration.
|
|
202
208
|
*/
|
|
203
|
-
declare function onApply(collector: Collector.Instance, type: On.Types, options?: Array<On.Options>, config?:
|
|
209
|
+
declare function onApply(collector: Collector.Instance, type: On.Types, options?: Array<On.Options>, config?: unknown): Promise<boolean>;
|
|
204
210
|
|
|
205
211
|
/**
|
|
206
|
-
* Initialize
|
|
207
|
-
*
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
212
|
+
* Initialize a single source. Extracted from the initSources loop body
|
|
213
|
+
* so it can be reused by the pending-source activator.
|
|
214
|
+
*/
|
|
215
|
+
declare function initSource(collector: Collector.Instance, sourceId: string, sourceDefinition: Source.InitSource): Promise<Source.Instance | undefined>;
|
|
216
|
+
/**
|
|
217
|
+
* Initialize sources. Sources with `require` are deferred to collector.pending.
|
|
211
218
|
*/
|
|
212
219
|
declare function initSources(collector: Collector.Instance, sources?: Source.InitSources): Promise<Collector.Sources>;
|
|
213
220
|
|
|
@@ -286,4 +293,4 @@ declare function walkChain(startId: string | string[] | undefined, transformers?
|
|
|
286
293
|
next?: string | string[];
|
|
287
294
|
}>): string[];
|
|
288
295
|
|
|
289
|
-
export { code as Code, type CommandTypes, Commands, Const, type CreateCollector, type HandleCommandFn, type RunState, type StartFlow, type StorageType, addDestination, callDestinationOn, commonHandleCommand, createEvent, createPush, createPushResult, destinationInit, destinationPush, extractTransformerNextMap, initDestinations, initSources, mergeEnvironments, on, onApply, pushToDestinations,
|
|
296
|
+
export { code as Code, type CommandTypes, Commands, Const, type CreateCollector, type HandleCommandFn, type RunState, type StartFlow, type StorageType, addDestination, callDestinationOn, commonHandleCommand, createEvent, createPush, createPushResult, destinationInit, destinationPush, extractTransformerNextMap, initDestinations, initSource, initSources, mergeEnvironments, on, onApply, processConsent, pushToDestinations, registerDestination, runCollector, startFlow, walkChain };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,n=Object.defineProperty,t=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,r={};((e,t)=>{for(var o in t)n(e,o,{get:t[o],enumerable:!0})})(r,{Code:()=>i,Commands:()=>a,Const:()=>c,addDestination:()=>q,callDestinationOn:()=>m,commonHandleCommand:()=>I,createEvent:()=>M,createPush:()=>G,createPushResult:()=>E,destinationInit:()=>P,destinationPush:()=>A,extractTransformerNextMap:()=>b,initDestinations:()=>x,initSources:()=>U,mergeEnvironments:()=>D,on:()=>d,onApply:()=>h,pushToDestinations:()=>j,runCollector:()=>T,setConsent:()=>S,startFlow:()=>V,walkChain:()=>v}),module.exports=(e=r,((e,r,i,a)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let c of o(r))s.call(e,c)||c===i||n(e,c,{get:()=>r[c],enumerable:!(a=t(r,c))||a.enumerable});return e})(n({},"__esModule",{value:!0}),e));var i={},a={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",User:"user",Walker:"walker"},c={Commands:a,Utils:{Storage:{Cookie:"cookie",Local:"local",Session:"session"}}},u=require("@walkeros/core"),l=require("@walkeros/core"),g=require("@walkeros/core"),f=require("@walkeros/core");function d(e,n,t){const o=e.on,s=o[n]||[],r=(0,g.isArray)(t)?t:[t];r.forEach(e=>{s.push(e)}),o[n]=s,h(e,n,r)}function m(e,n,t,o,s){if(!n.on)return;const r=n.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:t,config:n.config,data:s,env:D(n.env,n.config.env)};(0,f.tryCatch)(n.on)(o,a)}function h(e,n,t,o){let s,r=t||[];switch(t||(r=e.on[n]||[]),n){case c.Commands.Consent:s=o||e.consent;break;case c.Commands.Session:s=e.session;break;case c.Commands.Ready:case c.Commands.Run:default:s=void 0}if(Object.values(e.sources).forEach(e=>{e.on&&(0,f.tryCatch)(e.on)(n,s)}),Object.entries(e.destinations).forEach(([t,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:n,data:s});m(e,o,t,n,s)}}),r.length)switch(n){case c.Commands.Consent:!function(e,n,t){const o=t||e.consent;n.forEach(n=>{Object.keys(o).filter(e=>e in n).forEach(t=>{(0,f.tryCatch)(n[t])(e,o)})})}(e,r,o);break;case c.Commands.Ready:case c.Commands.Run:!function(e,n){e.allowed&&n.forEach(n=>{(0,f.tryCatch)(n)(e)})}(e,r);break;case c.Commands.Session:!function(e,n){if(!e.session)return;n.forEach(n=>{(0,f.tryCatch)(n)(e,e.session)})}(e,r)}}var p=require("@walkeros/core");function b(e){const n={};for(const[t,o]of Object.entries(e))o.config?.next?n[t]={next:o.config.next}:n[t]={};return n}function y(e,n){const t=e.config||{},o=e[n];return void 0!==o?{config:{...t,[n]:o},chainValue:o}:{config:t,chainValue:void 0}}function v(e,n={}){if(!e)return[];if(Array.isArray(e))return e;const t=[],o=new Set;let s=e;for(;s&&n[s]&&!o.has(s);){o.add(s),t.push(s);const e=n[s].next;if(Array.isArray(e)){t.push(...e);break}s=e}return t}async function k(e,n,t){if(n.init&&!n.config.init){const o=n.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:t,config:n.config,env:O(n.config.env)};s.debug("init");const i=await(0,p.useHooks)(n.init,"TransformerInit",e.hooks)(r);if(!1===i)return!1;n.config={...i||n.config,init:!0},s.debug("init done")}return!0}async function w(e,n,t,o,s){const r=n.type||"unknown",i=e.logger.scope(`transformer:${r}`),a={collector:e,logger:i,id:t,ingest:s,config:n.config,env:O(n.config.env)};i.debug("push",{event:o.name});const c=await(0,p.useHooks)(n.push,"TransformerPush",e.hooks)(o,a);return i.debug("push done"),c}async function C(e,n,t,o,s){let r=o;for(const o of t){const t=n[o];if(!t){e.logger.info(`Transformer not found: ${o}`);continue}if(!await(0,p.tryCatchAsync)(k)(e,t,o))return e.logger.info(`Transformer init failed: ${o}`),null;const i=await(0,p.tryCatchAsync)(w,n=>(e.logger.scope(`transformer:${t.type||"unknown"}`).error("Push failed",{error:n}),!1))(e,t,o,r,s);if(!1===i)return null;void 0!==i&&(r=i)}return r}function O(e){return e&&(0,p.isObject)(e)?e:{}}async function q(e,n,t){const{code:o,config:s={},env:r={},before:i}=n;if(!(0,l.isFunction)(o.push))return E({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const a=t||s||{init:!1},c=i?{...a,before:i}:a,u={...o,config:c,env:D(o.env,r)};let g=u.config.id;if(!g)do{g=(0,l.getId)(4)}while(e.destinations[g]);return e.destinations[g]=u,!1!==u.config.queue&&(u.queuePush=[...e.queue]),j(e,void 0,{},{[g]:u})}async function j(e,n,t={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return E({ok:!1});n&&e.queue.push(n),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{let c=(s.queuePush||[]).map(e=>({...e,consent:r}));if(s.queuePush=[],n){const e=(0,l.clone)(n);c.push(e)}if(!c.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!c.length&&s.queueOn?.length){const n=await(0,l.tryCatchAsync)(P)(e,s,o);return{id:o,destination:s,skipped:!n}}const u=[],g=c.filter(e=>{const n=(0,l.getGrantedConsent)(s.config.consent,r,e.consent);return!n||(e.consent=n,u.push(e),!1)});if(s.queuePush.concat(g),!u.length)return{id:o,destination:s,queue:c};if(!await(0,l.tryCatchAsync)(P)(e,s,o))return{id:o,destination:s,queue:c};let f,d;s.dlq||(s.dlq=[]);const m=function(e,n){const t=e.config.before;return t?v(t,b(n)):[]}(s,e.transformers);return await Promise.all(u.map(async n=>{n.globals=(0,l.assign)(i,n.globals),n.user=(0,l.assign)(a,n.user);let r=n;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await C(e,e.transformers,m,n,t.ingest);if(null===o)return n;r=o}const c=await(0,l.tryCatchAsync)(A,n=>{const t=s.type||"unknown";e.logger.scope(t).error("Push failed",{error:n,event:r.name}),f=n,s.dlq.push([r,n])})(e,s,o,r,t.ingest);return void 0!==c&&(d=c),n})),{id:o,destination:s,error:f,response:d}})),u={},g={},f={};for(const e of c){if(e.skipped)continue;const n=e.destination,t={type:n.type||"unknown",data:e.response};e.error?(t.error=e.error,f[e.id]=t):e.queue&&e.queue.length?(n.queuePush=(n.queuePush||[]).concat(e.queue),g[e.id]=t):u[e.id]=t}return E({event:n,...Object.keys(u).length&&{done:u},...Object.keys(g).length&&{queued:g},...Object.keys(f).length&&{failed:f}})}async function P(e,n,t){if(n.init&&!n.config.init){const o=n.type||"unknown",s=e.logger.scope(o),r={collector:e,logger:s,id:t,config:n.config,env:D(n.env,n.config.env)};s.debug("init");const i=await(0,l.useHooks)(n.init,"DestinationInit",e.hooks)(r);if(!1===i)return i;if(n.config={...i||n.config,init:!0},n.queueOn?.length){const o=n.queueOn;n.queueOn=[];for(const{type:s,data:r}of o)m(e,n,t,s,r)}s.debug("init done")}return!0}async function A(e,n,t,o,s){const{config:r}=n,i=await(0,l.processEventMapping)(o,r,e);if(i.ignore)return!1;const a=n.type||"unknown",c=e.logger.scope(a),u={collector:e,logger:c,id:t,config:r,data:i.data,rule:i.mapping,ingest:s,env:D(n.env,r.env)},g=i.mapping,f=i.mappingKey||"* *";if(!g?.batch||!n.pushBatch){c.debug("push",{event:i.event.name});const t=await(0,l.useHooks)(n.push,"DestinationPush",e.hooks)(i.event,u);return c.debug("push done"),t}{if(n.batches=n.batches||{},!n.batches[f]){const o={key:f,events:[],data:[]};n.batches[f]={batched:o,batchFn:(0,l.debounce)(()=>{const o=n.batches[f].batched,i={collector:e,logger:c,id:t,config:r,data:void 0,rule:g,ingest:s,env:D(n.env,r.env)};c.debug("push batch",{events:o.events.length}),(0,l.useHooks)(n.pushBatch,"DestinationPushBatch",e.hooks)(o,i),c.debug("push batch done"),o.events=[],o.data=[]},g.batch)}}const o=n.batches[f];o.batched.events.push(i.event),(0,l.isDefined)(i.data)&&o.batched.data.push(i.data),o.batchFn()}return!0}function E(e){return{ok:!e?.failed,...e}}async function x(e,n={}){const t={};for(const[e,o]of Object.entries(n)){const{code:n,config:s={},env:r={}}=o,{config:i}=y(o,"before"),a={...n.config,...s,...i},c=D(n.env,r);t[e]={...n,config:a,env:c}}return t}function D(e,n){return e||n?n?e&&(0,l.isObject)(e)&&(0,l.isObject)(n)?{...e,...n}:n:e:{}}async function S(e,n){const{consent:t}=e;let o=!1;const s={};return Object.entries(n).forEach(([e,n])=>{const t=!!n;s[e]=t,o=o||t}),e.consent=(0,u.assign)(t,s),h(e,"consent",void 0,s),o?j(e):E({ok:!0})}var $=require("@walkeros/core"),H=require("@walkeros/core"),R=require("@walkeros/core");async function I(e,n,t,o){let s;switch(n){case c.Commands.Config:(0,R.isObject)(t)&&(0,H.assign)(e.config,t,{shallow:!1});break;case c.Commands.Consent:(0,R.isObject)(t)&&(s=await S(e,t));break;case c.Commands.Custom:(0,R.isObject)(t)&&(e.custom=(0,H.assign)(e.custom,t));break;case c.Commands.Destination:(0,R.isObject)(t)&&"code"in t&&(0,R.isObject)(t.code)&&(s=await q(e,t,o));break;case c.Commands.Globals:(0,R.isObject)(t)&&(e.globals=(0,H.assign)(e.globals,t));break;case c.Commands.On:(0,H.isString)(t)&&d(e,t,o);break;case c.Commands.Ready:h(e,"ready");break;case c.Commands.Run:s=await T(e,t);break;case c.Commands.Session:h(e,"session");break;case c.Commands.User:(0,R.isObject)(t)&&(0,H.assign)(e.user,t,{shallow:!1})}return s||E({ok:!0})}function M(e,n){if(!n.name)throw new Error("Event name is required");const[t,o]=n.name.split(" ");if(!t||!o)throw new Error("Event name is invalid");++e.count;const{timestamp:s=Date.now(),group:r=e.group,count:i=e.count}=n,{name:a=`${t} ${o}`,data:c={},context:u={},globals:l=e.globals,custom:g={},user:f=e.user,nested:d=[],consent:m=e.consent,id:h=`${s}-${r}-${i}`,trigger:p="",entity:b=t,action:y=o,timing:v=0,version:k={source:e.version,tagging:e.config.tagging||0},source:w={type:"collector",id:"",previous_id:""}}=n;return{name:a,data:c,context:u,globals:l,custom:g,user:f,nested:d,consent:m,id:h,trigger:p,entity:b,action:y,timestamp:s,timing:v,group:r,count:i,version:k,source:w}}async function T(e,n){e.allowed=!0,e.count=0,e.group=(0,H.getId)(),e.timing=Date.now(),n&&(n.consent&&(e.consent=(0,H.assign)(e.consent,n.consent)),n.user&&(e.user=(0,H.assign)(e.user,n.user)),n.globals&&(e.globals=(0,H.assign)(e.config.globalsStatic||{},n.globals)),n.custom&&(e.custom=(0,H.assign)(e.custom,n.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++;const t=await j(e);return h(e,"run"),t}var F=require("@walkeros/core");function G(e,n){return(0,F.useHooks)(async(t,o={})=>await(0,F.tryCatchAsync)(async()=>{const{id:s,ingest:r,mapping:i,preChain:a}=o;let c=t;const u=r?Object.freeze(r):void 0;if(i){const n=await(0,F.processEventMapping)(c,i,e);if(n.ignore)return E({ok:!0});if(i.consent){if(!(0,F.getGrantedConsent)(i.consent,e.consent,n.event.consent))return E({ok:!0})}c=n.event}if(a?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await C(e,e.transformers,a,c,u);if(null===n)return E({ok:!0});c=n}const l=n(c),g=M(e,l);return await j(e,g,{id:s,ingest:u})},()=>E({ok:!1}))(),"Push",e.hooks)}var _=require("@walkeros/core");async function B(e){const n=(0,$.assign)({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),t={level:e.logger?.level,handler:e.logger?.handler},o=(0,$.createLogger)(t),s={...n.globalsStatic,...e.globals},r={allowed:!1,config:n,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},globals:s,group:"",hooks:{},logger:o,on:{},queue:[],round:0,session:void 0,timing:Date.now(),user:e.user||{},version:"1.1.2",sources:{},push:void 0,command:void 0};return r.push=G(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e})),r.command=function(e,n){return(0,_.useHooks)(async(t,o,s)=>await(0,_.tryCatchAsync)(async()=>await n(e,t,o,s),()=>E({ok:!1}))(),"Command",e.hooks)}(r,I),r.destinations=await x(0,e.destinations||{}),r.transformers=await async function(e,n={}){const t={};for(const[o,s]of Object.entries(n)){const{code:n,env:r={}}=s,{config:i}=y(s,"next"),a=e.logger.scope("transformer").scope(o),c={collector:e,logger:a,id:o,config:i,env:r},u=await n(c);t[o]=u}return t}(r,e.transformers||{}),r}var L=require("@walkeros/core");async function U(e,n={}){const t={};for(const[o,s]of Object.entries(n)){const{code:n,config:r={},env:i={},primary:a,next:c}=s;let u;const l=v(c,b(e.transformers)),g=(n,t={})=>e.push(n,{...t,id:o,ingest:u,mapping:r,preChain:l}),f=e.logger.scope("source").scope(o),d={push:g,command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:f,...i},m={collector:e,logger:f,id:o,config:r,env:d,setIngest:async n=>{u=r.ingest?await(0,L.getMappingValue)(n,r.ingest,{collector:e}):void 0}},h=await(0,L.tryCatchAsync)(n)(m);if(!h)continue;const p=h.type||"unknown",y=e.logger.scope(p).scope(o);d.logger=y,a&&(h.config={...h.config,primary:a}),t[o]=h}return t}async function V(e){e=e||{};const n=await B(e),t=(o=n,{type:"elb",config:{},push:async(e,n,t,s,r,i)=>{if("string"==typeof e&&e.startsWith("walker ")){const s=e.replace("walker ","");return o.command(s,n,t)}let a;if("string"==typeof e)a={name:e},n&&"object"==typeof n&&!Array.isArray(n)&&(a.data=n);else{if(!e||"object"!=typeof e)return E({ok:!1});a=e,n&&"object"==typeof n&&!Array.isArray(n)&&(a.data={...a.data||{},...n})}return s&&"object"==typeof s&&(a.context=s),r&&Array.isArray(r)&&(a.nested=r),i&&"object"==typeof i&&(a.custom=i),o.push(a)}});var o;n.sources.elb=t;const s=await U(n,e.sources||{});Object.assign(n.sources,s);const{consent:r,user:i,globals:a,custom:c}=e;r&&await n.command("consent",r),i&&await n.command("user",i),a&&Object.assign(n.globals,a),c&&Object.assign(n.custom,c),n.config.run&&await n.command("run");let u=t.push;const l=Object.values(n.sources).filter(e=>"elb"!==e.type),g=l.find(e=>e.config.primary);return g?u=g.push:l.length>0&&(u=l[0].push),{collector:n,elb:u}}//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var e,n=Object.defineProperty,t=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,i={};((e,t)=>{for(var o in t)n(e,o,{get:t[o],enumerable:!0})})(i,{Code:()=>r,Commands:()=>a,Const:()=>c,addDestination:()=>x,callDestinationOn:()=>D,commonHandleCommand:()=>G,createEvent:()=>U,createPush:()=>L,createPushResult:()=>H,destinationInit:()=>S,destinationPush:()=>$,extractTransformerNextMap:()=>b,initDestinations:()=>I,initSource:()=>q,initSources:()=>j,mergeEnvironments:()=>M,on:()=>A,onApply:()=>P,processConsent:()=>l,pushToDestinations:()=>E,registerDestination:()=>R,runCollector:()=>_,startFlow:()=>Q,walkChain:()=>w}),module.exports=(e=i,((e,i,r,a)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let c of o(i))s.call(e,c)||c===r||n(e,c,{get:()=>i[c],enumerable:!(a=t(i,c))||a.enumerable});return e})(n({},"__esModule",{value:!0}),e));var r={},a={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",User:"user",Walker:"walker"},c={Commands:a,Utils:{Storage:{Cookie:"cookie",Local:"local",Session:"session"}}},u=require("@walkeros/core");function l(e,n){let t=!1;const o={};return Object.entries(n).forEach(([e,n])=>{const s=!!n;o[e]=s,t=t||s}),e.consent=(0,u.assign)(e.consent,o),{update:o,runQueue:t}}var g=require("@walkeros/core"),f=require("@walkeros/core"),d=require("@walkeros/core"),m=require("@walkeros/core"),p=require("@walkeros/core"),h=require("@walkeros/core");function b(e){const n={};for(const[t,o]of Object.entries(e))o.config?.next?n[t]={next:o.config.next}:n[t]={};return n}function y(e,n){const t=e.config||{},o=e[n];return void 0!==o?{config:{...t,[n]:o},chainValue:o}:{config:t,chainValue:void 0}}function w(e,n={}){if(!e)return[];if(Array.isArray(e))return e;const t=[],o=new Set;let s=e;for(;s&&n[s]&&!o.has(s);){o.add(s),t.push(s);const e=n[s].next;if(Array.isArray(e)){t.push(...e);break}s=e}return t}async function k(e,n,t){if(n.init&&!n.config.init){const o=n.type||"unknown",s=e.logger.scope(`transformer:${o}`),i={collector:e,logger:s,id:t,config:n.config,env:O(n.config.env)};s.debug("init");const r=await(0,h.useHooks)(n.init,"TransformerInit",e.hooks)(i);if(!1===r)return!1;n.config={...r||n.config,init:!0},s.debug("init done")}return!0}async function v(e,n,t,o,s){const i=n.type||"unknown",r=e.logger.scope(`transformer:${i}`),a={collector:e,logger:r,id:t,ingest:s,config:n.config,env:O(n.config.env)};r.debug("push",{event:o.name});const c=await(0,h.useHooks)(n.push,"TransformerPush",e.hooks)(o,a);return r.debug("push done"),c}async function C(e,n,t,o,s){let i=o;for(const o of t){const t=n[o];if(!t){e.logger.info(`Transformer not found: ${o}`);continue}if(!await(0,h.tryCatchAsync)(k)(e,t,o))return e.logger.info(`Transformer init failed: ${o}`),null;const r=await(0,h.tryCatchAsync)(v,n=>(e.logger.scope(`transformer:${t.type||"unknown"}`).error("Push failed",{error:n}),!1))(e,t,o,i,s);if(!1===r)return null;void 0!==r&&(i=r)}return i}function O(e){return e&&(0,h.isObject)(e)?e:{}}async function q(e,n,t){const{code:o,config:s={},env:i={},primary:r,next:a}=t;let c;const u=w(a,b(e.transformers)),l=e.logger.scope("source").scope(n),g={push:(t,o={})=>e.push(t,{...o,id:n,ingest:c,mapping:s,preChain:u}),command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:l,...i},f={collector:e,logger:l,id:n,config:s,env:g,setIngest:async n=>{c=s.ingest?await(0,p.getMappingValue)(n,s.ingest,{collector:e}):void 0}},d=await(0,p.tryCatchAsync)(o)(f);if(!d)return;const m=d.type||"unknown",h=e.logger.scope(m).scope(n);return g.logger=h,r&&(d.config={...d.config,primary:r}),d}async function j(e,n={}){const t={};for(const[o,s]of Object.entries(n)){const{config:n={}}=s;if(n.require&&n.require.length>0){e.pending.sources[o]=s;continue}const i=await q(e,o,s);i&&(t[o]=i)}return t}async function A(e,n,t){const o=e.on,s=o[n]||[],i=(0,d.isArray)(t)?t:[t];i.forEach(e=>{s.push(e)}),o[n]=s,await P(e,n,i)}function D(e,n,t,o,s){if(!n.on)return;const i=n.type||"unknown",r=e.logger.scope(i).scope("on").scope(o),a={collector:e,logger:r,id:t,config:n.config,data:s,env:M(n.env,n.config.env)};(0,m.tryCatch)(n.on)(o,a)}async function P(e,n,t,o){let s,i=t||[];switch(t||(i=e.on[n]||[]),n){case c.Commands.Consent:s=o||e.consent;break;case c.Commands.Session:s=e.session;break;case c.Commands.User:s=o||e.user;break;case c.Commands.Custom:s=o||e.custom;break;case c.Commands.Globals:s=o||e.globals;break;case c.Commands.Config:s=o||e.config;break;case c.Commands.Ready:case c.Commands.Run:default:s=void 0}let r=!1;for(const t of Object.values(e.sources))if(t.on){!1===await(0,m.tryCatchAsync)(t.on)(n,s)&&(r=!0)}if(Object.entries(e.destinations).forEach(([t,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:n,data:s});D(e,o,t,n,s)}}),(Object.keys(e.pending.sources).length>0||Object.keys(e.pending.destinations).length>0)&&await async function(e,n){for(const[t,o]of Object.entries(e.pending.sources)){if(!e.pending.sources[t]||e.sources[t])continue;const s=o.config?.require;if(!s)continue;const i=s.indexOf(n);if(-1===i)continue;if(s.splice(i,1),s.length>0)continue;delete e.pending.sources[t];const r=await q(e,t,o);r&&(e.sources[t]=r)}for(const[t,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[t]||e.destinations[t])continue;const s=o.config?.require;if(!s)continue;const i=s.indexOf(n);if(-1===i)continue;if(s.splice(i,1),s.length>0)continue;delete e.pending.destinations[t];const r=R(o);!1!==r.config.queue&&(r.queuePush=[...e.queue]),e.destinations[t]=r}}(e,n),!i.length)return!r;switch(n){case c.Commands.Consent:!function(e,n,t){const o=t||e.consent;n.forEach(n=>{Object.keys(o).filter(e=>e in n).forEach(t=>{(0,m.tryCatch)(n[t])(e,o)})})}(e,i,o);break;case c.Commands.Ready:case c.Commands.Run:!function(e,n){e.allowed&&n.forEach(n=>{(0,m.tryCatch)(n)(e)})}(e,i);break;case c.Commands.Session:!function(e,n){if(!e.session)return;n.forEach(n=>{(0,m.tryCatch)(n)(e,e.session)})}(e,i);break;default:i.forEach(n=>{"function"==typeof n&&(0,m.tryCatch)(n)(e,s)})}return!r}async function x(e,n,t){const{code:o,config:s={},env:i={},before:r}=n;if(!(0,f.isFunction)(o.push))return H({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const a=t||s||{init:!1},c=r?{...a,before:r}:a,u={...o,config:c,env:M(o.env,i)};let l=u.config.id;if(!l)do{l=(0,f.getId)(4)}while(e.destinations[l]);return e.destinations[l]=u,!1!==u.config.queue&&(u.queuePush=[...e.queue]),E(e,void 0,{},{[l]:u})}async function E(e,n,t={},o){const{allowed:s,consent:i,globals:r,user:a}=e;if(!s)return H({ok:!1});n&&(e.queue.push(n),e.status.in++),o||(o=e.destinations);const c=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{let c=(s.queuePush||[]).map(e=>({...e,consent:i}));if(s.queuePush=[],n){const e=(0,f.clone)(n);c.push(e)}if(!c.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!c.length&&s.queueOn?.length){const n=await(0,f.tryCatchAsync)(S)(e,s,o);return{id:o,destination:s,skipped:!n}}const u=[],l=c.filter(e=>{const n=(0,f.getGrantedConsent)(s.config.consent,i,e.consent);return!n||(e.consent=n,u.push(e),!1)});if(s.queuePush.push(...l),!u.length)return{id:o,destination:s,queue:c};if(!await(0,f.tryCatchAsync)(S)(e,s,o))return{id:o,destination:s,queue:c};let g,d;s.dlq||(s.dlq=[]);const m=function(e,n){const t=e.config.before;return t?w(t,b(n)):[]}(s,e.transformers);let p=0;return await Promise.all(u.map(async n=>{n.globals=(0,f.assign)(r,n.globals),n.user=(0,f.assign)(a,n.user);let i=n;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await C(e,e.transformers,m,n,t.ingest);if(null===o)return n;i=o}const c=Date.now(),u=await(0,f.tryCatchAsync)($,n=>{const t=s.type||"unknown";e.logger.scope(t).error("Push failed",{error:n,event:i.name}),g=n,s.dlq.push([i,n])})(e,s,o,i,t.ingest);return p+=Date.now()-c,void 0!==u&&(d=u),n})),{id:o,destination:s,error:g,response:d,totalDuration:p}})),u={},l={},g={};for(const n of c){if(n.skipped)continue;const t=n.destination,o={type:t.type||"unknown",data:n.response};e.status.destinations[n.id]||(e.status.destinations[n.id]={count:0,failed:0,duration:0});const s=e.status.destinations[n.id],i=Date.now();n.error?(o.error=n.error,g[n.id]=o,s.failed++,s.lastAt=i,s.duration+=n.totalDuration||0,e.status.failed++):n.queue&&n.queue.length?(t.queuePush=(t.queuePush||[]).concat(n.queue),l[n.id]=o):(u[n.id]=o,s.count++,s.lastAt=i,s.duration+=n.totalDuration||0,e.status.out++)}return H({event:n,...Object.keys(u).length&&{done:u},...Object.keys(l).length&&{queued:l},...Object.keys(g).length&&{failed:g}})}async function S(e,n,t){if(n.init&&!n.config.init){const o=n.type||"unknown",s=e.logger.scope(o),i={collector:e,logger:s,id:t,config:n.config,env:M(n.env,n.config.env)};s.debug("init");const r=await(0,f.useHooks)(n.init,"DestinationInit",e.hooks)(i);if(!1===r)return r;if(n.config={...r||n.config,init:!0},n.queueOn?.length){const o=n.queueOn;n.queueOn=[];for(const{type:s,data:i}of o)D(e,n,t,s,i)}s.debug("init done")}return!0}async function $(e,n,t,o,s){const{config:i}=n,r=await(0,f.processEventMapping)(o,i,e);if(r.ignore)return!1;const a=n.type||"unknown",c=e.logger.scope(a),u={collector:e,logger:c,id:t,config:i,data:r.data,rule:r.mapping,ingest:s,env:M(n.env,i.env)},l=r.mapping,g=r.mappingKey||"* *";if(!l?.batch||!n.pushBatch){c.debug("push",{event:r.event.name});const t=await(0,f.useHooks)(n.push,"DestinationPush",e.hooks)(r.event,u);return c.debug("push done"),t}{if(n.batches=n.batches||{},!n.batches[g]){const o={key:g,events:[],data:[]};n.batches[g]={batched:o,batchFn:(0,f.debounce)(()=>{const o=n.batches[g].batched,r={collector:e,logger:c,id:t,config:i,data:void 0,rule:l,ingest:s,env:M(n.env,i.env)};c.debug("push batch",{events:o.events.length}),(0,f.useHooks)(n.pushBatch,"DestinationPushBatch",e.hooks)(o,r),c.debug("push batch done"),o.events=[],o.data=[]},l.batch)}}const o=n.batches[g];o.batched.events.push(r.event),(0,f.isDefined)(r.data)&&o.batched.data.push(r.data),o.batchFn()}return!0}function H(e){return{ok:!e?.failed,...e}}function R(e){const{code:n,config:t={},env:o={}}=e,{config:s}=y(e,"before"),i={...n.config,...t,...s},r=M(n.env,o);return{...n,config:i,env:r}}async function I(e,n={}){const t={};for(const[o,s]of Object.entries(n))s.config?.require?.length?e.pending.destinations[o]=s:t[o]=R(s);return t}function M(e,n){return e||n?n?e&&(0,f.isObject)(e)&&(0,f.isObject)(n)?{...e,...n}:n:e:{}}var T=require("@walkeros/core"),F=require("@walkeros/core");async function G(e,n,t,o){let s,i,r=!1,a=!1;switch(n){case c.Commands.Config:(0,F.isObject)(t)&&((0,T.assign)(e.config,t,{shallow:!1}),i=t,r=!0);break;case c.Commands.Consent:if((0,F.isObject)(t)){const{update:n,runQueue:o}=l(e,t);i=n,r=!0,a=o}break;case c.Commands.Custom:(0,F.isObject)(t)&&(e.custom=(0,T.assign)(e.custom,t),i=t,r=!0);break;case c.Commands.Destination:(0,F.isObject)(t)&&("code"in t&&(0,F.isObject)(t.code)?s=await x(e,t,o):(0,T.isFunction)(t.push)&&(s=await x(e,{code:t},o)));break;case c.Commands.Globals:(0,F.isObject)(t)&&(e.globals=(0,T.assign)(e.globals,t),i=t,r=!0);break;case c.Commands.On:(0,T.isString)(t)&&await A(e,t,o);break;case c.Commands.Ready:r=!0;break;case c.Commands.Run:s=await _(e,t),r=!0;break;case c.Commands.Session:r=!0;break;case c.Commands.User:(0,F.isObject)(t)&&((0,T.assign)(e.user,t,{shallow:!1}),i=t,r=!0)}return r&&await P(e,n,void 0,i),a&&(s=await E(e)),s||H({ok:!0})}function U(e,n){if(!n.name)throw new Error("Event name is required");const[t,o]=n.name.split(" ");if(!t||!o)throw new Error("Event name is invalid");++e.count;const{timestamp:s=Date.now(),group:i=e.group,count:r=e.count}=n,{name:a=`${t} ${o}`,data:c={},context:u={},globals:l=e.globals,custom:g={},user:f=e.user,nested:d=[],consent:m=e.consent,id:p=`${s}-${i}-${r}`,trigger:h="",entity:b=t,action:y=o,timing:w=0,version:k={source:e.version,tagging:e.config.tagging||0},source:v={type:"collector",id:"",previous_id:""}}=n;return{name:a,data:c,context:u,globals:l,custom:g,user:f,nested:d,consent:m,id:p,trigger:h,entity:b,action:y,timestamp:s,timing:w,group:i,count:r,version:k,source:v}}async function _(e,n){e.allowed=!0,e.count=0,e.group=(0,T.getId)(),e.timing=Date.now(),n&&(n.consent&&(e.consent=(0,T.assign)(e.consent,n.consent)),n.user&&(e.user=(0,T.assign)(e.user,n.user)),n.globals&&(e.globals=(0,T.assign)(e.config.globalsStatic||{},n.globals)),n.custom&&(e.custom=(0,T.assign)(e.custom,n.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++;return await E(e)}var B=require("@walkeros/core");function L(e,n){return(0,B.useHooks)(async(t,o={})=>await(0,B.tryCatchAsync)(async()=>{const s=Date.now(),{id:i,ingest:r,mapping:a,preChain:c}=o;let u=t;const l=r?Object.freeze(r):void 0;if(a){const n=await(0,B.processEventMapping)(u,a,e);if(n.ignore)return H({ok:!0});if(a.consent){if(!(0,B.getGrantedConsent)(a.consent,e.consent,n.event.consent))return H({ok:!0})}u=n.event}if(c?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await C(e,e.transformers,c,u,l);if(null===n)return H({ok:!0});u=n}const g=n(u),f=U(e,g),d=await E(e,f,{id:i,ingest:l});if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const n=e.status.sources[i];n.count++,n.lastAt=Date.now(),n.duration+=Date.now()-s}return d},()=>H({ok:!1}))(),"Push",e.hooks)}var V=require("@walkeros/core");async function N(e){const n=(0,g.assign)({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},e,{merge:!1,extend:!1}),t={level:e.logger?.level,handler:e.logger?.handler},o=(0,g.createLogger)(t),s={...n.globalsStatic,...e.globals},i={allowed:!1,config:n,consent:e.consent||{},count:0,custom:e.custom||{},destinations:{},transformers:{},globals:s,group:"",hooks:{},logger:o,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:e.user||{},version:"1.1.2",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};return i.push=L(i,e=>({timing:Math.round((Date.now()-i.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...e})),i.command=function(e,n){return(0,V.useHooks)(async(t,o,s)=>await(0,V.tryCatchAsync)(async()=>await n(e,t,o,s),()=>H({ok:!1}))(),"Command",e.hooks)}(i,G),i.destinations=await I(i,e.destinations||{}),i.transformers=await async function(e,n={}){const t={};for(const[o,s]of Object.entries(n)){const{code:n,env:i={}}=s,{config:r}=y(s,"next"),a=e.logger.scope("transformer").scope(o),c={collector:e,logger:a,id:o,config:r,env:i},u=await n(c);t[o]=u}return t}(i,e.transformers||{}),i}async function Q(e){e=e||{};const n=await N(e),t=(o=n,{type:"elb",config:{},push:async(e,n,t,s,i,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const s=e.replace("walker ","");return o.command(s,n,t)}let a;if("string"==typeof e)a={name:e},n&&"object"==typeof n&&!Array.isArray(n)&&(a.data=n);else{if(!e||"object"!=typeof e)return H({ok:!1});a=e,n&&"object"==typeof n&&!Array.isArray(n)&&(a.data={...a.data||{},...n})}return s&&"object"==typeof s&&(a.context=s),i&&Array.isArray(i)&&(a.nested=i),r&&"object"==typeof r&&(a.custom=r),o.push(a)}});var o;n.sources.elb=t;const s=await j(n,e.sources||{});Object.assign(n.sources,s);const{consent:i,user:r,globals:a,custom:c}=e;i&&await n.command("consent",i),r&&await n.command("user",r),a&&Object.assign(n.globals,a),c&&Object.assign(n.custom,c),n.config.run&&await n.command("run");let u=t.push;const l=Object.values(n.sources).filter(e=>"elb"!==e.type),g=l.find(e=>e.config.primary);return g?u=g.push:l.length>0&&(u=l[0].push),{collector:n,elb:u}}//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types/code.ts","../src/constants.ts","../src/consent.ts","../src/destination.ts","../src/on.ts","../src/transformer.ts","../src/collector.ts","../src/handle.ts","../src/push.ts","../src/command.ts","../src/elb.ts","../src/source.ts","../src/flow.ts"],"sourcesContent":["export * from './types';\n\nexport * from './constants';\n\nexport * from './consent';\nexport * from './flow';\nexport * from './push';\nexport * from './destination';\nexport * from './handle';\nexport * from './on';\nexport * from './source';\nexport { walkChain, extractTransformerNextMap } from './transformer';\n","import type { Destination, Mapping, On, WalkerOS } from '@walkeros/core';\n\nexport interface Settings {\n scripts?: string[];\n init?: string;\n on?: string;\n push?: string;\n pushBatch?: string;\n}\n\nexport interface CodeMapping extends Mapping.Rule<CodeMapping> {\n push?: string;\n pushBatch?: string;\n}\n\nexport type Types = Destination.Types<Settings, CodeMapping>;\nexport type Config = Destination.Config<Types>;\nexport type Context = Destination.Context<Types>;\nexport type PushContext = Destination.PushContext<Types>;\nexport type PushBatchContext = Destination.PushBatchContext<Types>;\n\nexport type InitFn = (context: Context) => void;\nexport type OnFn = (type: On.Types, context: Context) => void;\nexport type PushFn = (event: WalkerOS.Event, context: PushContext) => void;\nexport type PushBatchFn = (\n batch: Destination.Batch<CodeMapping>,\n context: PushBatchContext,\n) => void;\n","import type { Collector } from '@walkeros/core';\nimport type { CommandTypes, StorageType } from './types/collector';\n\nexport const Commands: Record<CommandTypes, Collector.CommandType> = {\n Action: 'action',\n Actions: 'actions',\n Config: 'config',\n Consent: 'consent',\n Context: 'context',\n Custom: 'custom',\n Destination: 'destination',\n Elb: 'elb',\n Globals: 'globals',\n Hook: 'hook',\n Init: 'init',\n Link: 'link',\n On: 'on',\n Prefix: 'data-elb',\n Ready: 'ready',\n Run: 'run',\n Session: 'session',\n User: 'user',\n Walker: 'walker',\n} as const;\n\nconst UtilsStorage: { [key: string]: StorageType } = {\n Cookie: 'cookie',\n Local: 'local',\n Session: 'session',\n} as const;\n\nconst Utils = {\n Storage: UtilsStorage,\n};\n\nexport const Const = {\n Commands,\n Utils,\n};\n\nexport default Const;\n","import type { Collector, WalkerOS, Elb } from '@walkeros/core';\nimport { assign } from '@walkeros/core';\nimport { pushToDestinations, createPushResult } from './destination';\nimport { onApply } from './on';\n\n/**\n * Sets the consent state and processes the queue.\n *\n * @param collector - The walkerOS collector instance.\n * @param data - The consent data to set.\n * @returns The result of the push operation.\n */\nexport async function setConsent(\n collector: Collector.Instance,\n data: WalkerOS.Consent,\n): Promise<Elb.PushResult> {\n const { consent } = collector;\n\n let runQueue = false;\n const update: WalkerOS.Consent = {};\n Object.entries(data).forEach(([name, granted]) => {\n const state = !!granted;\n\n update[name] = state;\n\n // Only run queue if state was set to true\n runQueue = runQueue || state;\n });\n\n // Update consent state\n collector.consent = assign(consent, update);\n\n // Run on consent events\n onApply(collector, 'consent', undefined, update);\n\n // Process previous events if not disabled\n return runQueue\n ? pushToDestinations(collector)\n : createPushResult({ ok: true });\n}\n","import type {\n Collector,\n WalkerOS,\n Elb,\n Destination,\n Transformer,\n} from '@walkeros/core';\nimport {\n assign,\n clone,\n debounce,\n getId,\n getGrantedConsent,\n isDefined,\n isFunction,\n isObject,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { callDestinationOn } from './on';\nimport {\n runTransformerChain,\n walkChain,\n extractTransformerNextMap,\n extractChainProperty,\n} from './transformer';\n\n/**\n * Computes transformer chain for a destination on-demand.\n * Returns empty array if destination has no 'before' configured.\n */\nfunction getDestinationChain(\n destination: Destination.Instance,\n transformers: Transformer.Transformers,\n): string[] {\n const before = destination.config.before as string | string[] | undefined;\n if (!before) return [];\n return walkChain(before, extractTransformerNextMap(transformers));\n}\n\n/**\n * Adds a new destination to the collector.\n *\n * @param collector - The walkerOS collector instance.\n * @param data - The destination's init data.\n * @param options - The destination's config.\n * @returns The result of the push operation.\n */\nexport async function addDestination(\n collector: Collector.Instance,\n data: Destination.Init,\n options?: Destination.Config,\n): Promise<Elb.PushResult> {\n const { code, config: dataConfig = {}, env = {}, before } = data;\n\n // Validate that code has a push method\n if (!isFunction(code.push)) {\n return createPushResult({\n ok: false,\n failed: {\n invalid: {\n type: 'invalid',\n error: 'Destination code must have a push method',\n },\n },\n });\n }\n\n const baseConfig = options || dataConfig || { init: false };\n // Merge before into config if provided at root level\n const config = before ? { ...baseConfig, before } : baseConfig;\n\n const destination: Destination.Instance = {\n ...code,\n config,\n env: mergeEnvironments(code.env, env),\n };\n\n let id = destination.config.id; // Use given id\n if (!id) {\n // Generate a new id if none was given\n do {\n id = getId(4);\n } while (collector.destinations[id]);\n }\n\n // Add the destination\n collector.destinations[id] = destination;\n\n // Process previous events if not disabled\n if (destination.config.queue !== false)\n destination.queuePush = [...collector.queue];\n\n return pushToDestinations(collector, undefined, {}, { [id]: destination });\n}\n\n/**\n * Pushes an event to all or a subset of destinations.\n *\n * @param collector - The walkerOS collector instance.\n * @param event - The event to push.\n * @param meta - Optional metadata with id and ingest.\n * @param destinations - The destinations to push to.\n * @returns The result of the push operation.\n */\nexport async function pushToDestinations(\n collector: Collector.Instance,\n event?: WalkerOS.Event,\n meta: { id?: string; ingest?: unknown } = {},\n destinations?: Collector.Destinations,\n): Promise<Elb.PushResult> {\n const { allowed, consent, globals, user } = collector;\n\n // Check if collector is allowed to push\n if (!allowed) return createPushResult({ ok: false });\n\n // Add event to the collector queue\n if (event) collector.queue.push(event);\n\n // Use given destinations or use internal destinations\n if (!destinations) destinations = collector.destinations;\n\n const results = await Promise.all(\n // Process all destinations in parallel\n Object.entries(destinations || {}).map(async ([id, destination]) => {\n // Create a queue of events to be processed\n let currentQueue = (destination.queuePush || []).map((event) => ({\n ...event,\n consent,\n }));\n\n // Reset original queue while processing to enable async processing\n destination.queuePush = [];\n\n // Add event to queue stack\n if (event) {\n // Clone the event to avoid mutating the original event\n const currentEvent = clone(event);\n\n // Note: Policy is now applied in processEventMapping() within destinationPush()\n\n // Add event to queue stack\n currentQueue.push(currentEvent);\n }\n\n // If no events and no queued on events, skip this destination\n if (!currentQueue.length && !destination.queueOn?.length) {\n return { id, destination, skipped: true };\n }\n\n // If only on events queued (no push events), still init to flush queueOn\n if (!currentQueue.length && destination.queueOn?.length) {\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n return { id, destination, skipped: !isInitialized };\n }\n\n const allowedEvents: WalkerOS.Events = [];\n const skippedEvents = currentQueue.filter((queuedEvent) => {\n const grantedConsent = getGrantedConsent(\n destination.config.consent, // Required\n consent, // Current collector state\n queuedEvent.consent, // Individual event state\n );\n\n if (grantedConsent) {\n queuedEvent.consent = grantedConsent; // Save granted consent states only\n\n allowedEvents.push(queuedEvent); // Add to allowed queue\n return false; // Remove from destination queue\n }\n\n return true; // Keep denied events in the queue\n });\n\n // Add skipped events back to the queue\n destination.queuePush.concat(skippedEvents);\n\n // Execution shall not pass if no events are allowed\n if (!allowedEvents.length) {\n return { id, destination, queue: currentQueue }; // Don't push if not allowed\n }\n\n // Initialize the destination if needed\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n\n if (!isInitialized) return { id, destination, queue: currentQueue };\n\n // Process the destinations event queue\n let error: unknown;\n let response: unknown;\n if (!destination.dlq) destination.dlq = [];\n\n // Compute transformer chain on-demand from destination.before\n const postChain = getDestinationChain(\n destination,\n collector.transformers,\n );\n\n // Process allowed events and store failed ones in the dead letter queue (DLQ)\n await Promise.all(\n allowedEvents.map(async (event) => {\n // Merge event with collector state, prioritizing event properties\n event.globals = assign(globals, event.globals);\n event.user = assign(user, event.user);\n\n // Run post-collector transformer chain if configured for this destination\n let processedEvent: WalkerOS.Event | null = event;\n if (\n postChain.length > 0 &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const chainResult = await runTransformerChain(\n collector,\n collector.transformers,\n postChain,\n event,\n meta.ingest,\n );\n\n if (chainResult === null) {\n // Chain stopped - skip this event for this destination\n return event;\n }\n\n // Use the processed event (cast back to full Event type)\n processedEvent = chainResult as WalkerOS.Event;\n }\n\n const result = await tryCatchAsync(destinationPush, (err) => {\n // Log the error with destination scope\n const destType = destination.type || 'unknown';\n collector.logger.scope(destType).error('Push failed', {\n error: err,\n event: processedEvent!.name,\n });\n error = err; // oh no\n\n // Add failed event to destinations DLQ\n destination.dlq!.push([processedEvent!, err]);\n\n return undefined;\n })(collector, destination, id, processedEvent!, meta.ingest);\n\n // Capture the last response (for single event pushes)\n if (result !== undefined) response = result;\n\n return event;\n }),\n );\n\n return { id, destination, error, response };\n }),\n );\n\n // Build result objects\n const done: Record<string, Destination.Ref> = {};\n const queued: Record<string, Destination.Ref> = {};\n const failed: Record<string, Destination.Ref> = {};\n\n for (const result of results) {\n if (result.skipped) continue;\n\n const destination = result.destination;\n const ref: Destination.Ref = {\n type: destination.type || 'unknown',\n data: result.response, // Capture push() return value\n };\n\n if (result.error) {\n ref.error = result.error;\n failed[result.id] = ref;\n } else if (result.queue && result.queue.length) {\n destination.queuePush = (destination.queuePush || []).concat(\n result.queue,\n );\n queued[result.id] = ref;\n } else {\n done[result.id] = ref;\n }\n }\n\n return createPushResult({\n event,\n ...(Object.keys(done).length && { done }),\n ...(Object.keys(queued).length && { queued }),\n ...(Object.keys(failed).length && { failed }),\n });\n}\n\n/**\n * Initializes a destination.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to initialize.\n * @param destId - The destination ID.\n * @returns Whether the destination was initialized successfully.\n */\nexport async function destinationInit<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n): Promise<boolean> {\n // Check if the destination was initialized properly or try to do so\n if (destination.init && !destination.config.init) {\n // Create scoped logger for this destination: [type:id] or [unknown:id]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n destLogger.debug('init');\n\n const configResult = await useHooks(\n destination.init,\n 'DestinationInit',\n collector.hooks,\n )(context);\n\n // Actively check for errors (when false)\n if (configResult === false) return configResult; // don't push if init is false\n\n // Update the destination config if it was returned\n destination.config = {\n ...(configResult || destination.config),\n init: true, // Remember that the destination was initialized\n };\n\n // Flush queued on() events now that destination is initialized\n if (destination.queueOn?.length) {\n const queueOn = destination.queueOn;\n destination.queueOn = [];\n\n for (const { type, data } of queueOn) {\n callDestinationOn(collector, destination, destId, type, data);\n }\n }\n\n destLogger.debug('init done');\n }\n\n return true; // Destination is ready to push\n}\n\n/**\n * Pushes an event to a single destination.\n * Handles mapping, batching, and consent checks.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to push to.\n * @param destId - The destination ID.\n * @param event - The event to push.\n * @param ingest - Optional ingest metadata (frozen, same reference).\n * @returns Whether the event was pushed successfully.\n */\nexport async function destinationPush<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n event: WalkerOS.Event,\n ingest?: unknown,\n): Promise<unknown> {\n const { config } = destination;\n\n const processed = await processEventMapping(event, config, collector);\n\n if (processed.ignore) return false;\n\n // Create scoped logger for this destination: [type] or [unknown]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.PushContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n data: processed.data,\n rule: processed.mapping,\n ingest,\n env: mergeEnvironments(destination.env, config.env),\n };\n\n const eventMapping = processed.mapping;\n const mappingKey = processed.mappingKey || '* *';\n\n if (eventMapping?.batch && destination.pushBatch) {\n // Initialize batch registry on destination (not on shared mapping config)\n destination.batches = destination.batches || {};\n\n // Get or create batch state for this mapping key\n if (!destination.batches[mappingKey]) {\n const batched: Destination.Batch<unknown> = {\n key: mappingKey,\n events: [],\n data: [],\n };\n\n destination.batches[mappingKey] = {\n batched,\n batchFn: debounce(() => {\n const batchState = destination.batches![mappingKey];\n const currentBatched = batchState.batched;\n\n const batchContext: Destination.PushBatchContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n // Note: batch.data contains all transformed data; context.data is for single events\n data: undefined,\n rule: eventMapping, // Renamed from mapping to rule\n ingest, // Same frozen reference\n env: mergeEnvironments(destination.env, config.env),\n };\n\n destLogger.debug('push batch', {\n events: currentBatched.events.length,\n });\n\n useHooks(\n destination.pushBatch!,\n 'DestinationPushBatch',\n collector.hooks,\n )(currentBatched, batchContext);\n\n destLogger.debug('push batch done');\n\n // Reset batch\n currentBatched.events = [];\n currentBatched.data = [];\n }, eventMapping.batch),\n };\n }\n\n // Add event to batch\n const batchState = destination.batches[mappingKey];\n batchState.batched.events.push(processed.event);\n if (isDefined(processed.data)) batchState.batched.data.push(processed.data);\n\n // Trigger debounced batch\n batchState.batchFn();\n } else {\n destLogger.debug('push', { event: processed.event.name });\n\n // It's time to go to the destination's side now\n const response = await useHooks(\n destination.push,\n 'DestinationPush',\n collector.hooks,\n )(processed.event, context);\n\n destLogger.debug('push done');\n\n return response;\n }\n\n return true;\n}\n\n/**\n * Creates a standardized result object for push operations.\n *\n * @param partialResult - A partial result to merge with the default result.\n * @returns The push result.\n */\nexport function createPushResult(\n partialResult?: Partial<Elb.PushResult>,\n): Elb.PushResult {\n return {\n ok: !partialResult?.failed,\n ...partialResult,\n };\n}\n\n/**\n * Initializes a map of destinations using ONLY the unified code/config/env pattern.\n * Does NOT call destination.init() - that happens later during push with proper consent checks.\n *\n * @param destinations - The destinations to initialize.\n * @param collector - The collector instance for destination init context.\n * @returns The initialized destinations.\n */\nexport async function initDestinations(\n _collector: Collector.Instance,\n destinations: Destination.InitDestinations = {},\n): Promise<Collector.Destinations> {\n const result: Collector.Destinations = {};\n\n for (const [name, destinationDef] of Object.entries(destinations)) {\n const { code, config = {}, env = {} } = destinationDef;\n\n // Use unified chain property extractor\n const { config: configWithChain } = extractChainProperty(\n destinationDef,\n 'before',\n );\n\n const mergedConfig = {\n ...code.config,\n ...config,\n ...configWithChain,\n };\n\n const mergedEnv = mergeEnvironments(code.env, env);\n\n result[name] = {\n ...code,\n config: mergedConfig,\n env: mergedEnv,\n };\n }\n\n return result;\n}\n\n/**\n * Merges destination environment with config environment\n * Config env takes precedence over destination env for overrides\n */\nexport function mergeEnvironments(\n destinationEnv?: Destination.Env,\n configEnv?: Destination.Env,\n): Destination.Env {\n // If neither environment exists, return empty object\n if (!destinationEnv && !configEnv) return {};\n\n // If only one exists, return it\n if (!configEnv) return destinationEnv!;\n if (!destinationEnv) return configEnv;\n\n // Both exist - merge objects with configEnv taking precedence\n if (isObject(destinationEnv) && isObject(configEnv)) {\n return { ...destinationEnv, ...configEnv };\n }\n\n // If they're not both objects, config env overrides destination env\n return configEnv;\n}\n","import type { Collector, On, WalkerOS, Destination } from '@walkeros/core';\nimport { isArray } from '@walkeros/core';\nimport { Const } from './constants';\nimport { tryCatch } from '@walkeros/core';\nimport { mergeEnvironments } from './destination';\n\n/**\n * Registers a callback for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to listen for.\n * @param option The callback function or an array of callback functions.\n */\nexport function on(\n collector: Collector.Instance,\n type: On.Types,\n option: WalkerOS.SingleOrArray<On.Options>,\n) {\n const on = collector.on;\n const onType: Array<On.Options> = on[type] || [];\n const options = isArray(option) ? option : [option];\n\n options.forEach((option) => {\n onType.push(option);\n });\n\n // Update collector on state\n (on[type] as typeof onType) = onType;\n\n // Execute the on function directly\n onApply(collector, type, options);\n}\n\n/**\n * Calls a destination's on() handler with proper context.\n * Used by both onApply() for immediate calls and destinationInit() for flushing queued events.\n */\nexport function callDestinationOn(\n collector: Collector.Instance,\n destination: Destination.Instance,\n destId: string,\n type: On.Types,\n data: unknown,\n) {\n if (!destination.on) return;\n\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType).scope('on').scope(type);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n data: data as Destination.Data,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n tryCatch(destination.on)(type, context);\n}\n\n/**\n * Applies all registered callbacks for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to apply the callbacks for.\n * @param options The options for the callbacks.\n * @param config The consent configuration.\n */\nexport function onApply(\n collector: Collector.Instance,\n type: On.Types,\n options?: Array<On.Options>,\n config?: WalkerOS.Consent,\n) {\n // Use the optionally provided options\n let onConfig = options || [];\n\n if (!options) {\n // Get the collector on events\n onConfig = collector.on[type] || [];\n }\n\n // Calculate context data once for all sources and destinations\n let contextData: unknown;\n\n switch (type) {\n case Const.Commands.Consent:\n contextData = config || collector.consent;\n break;\n case Const.Commands.Session:\n contextData = collector.session;\n break;\n case Const.Commands.Ready:\n case Const.Commands.Run:\n default:\n contextData = undefined;\n break;\n }\n\n Object.values(collector.sources).forEach((source) => {\n if (source.on) {\n tryCatch(source.on)(type, contextData);\n }\n });\n\n Object.entries(collector.destinations).forEach(([destId, destination]) => {\n if (destination.on) {\n // Queue if destination not yet initialized\n if (!destination.config.init) {\n destination.queueOn = destination.queueOn || [];\n destination.queueOn.push({ type, data: contextData });\n return;\n }\n\n // Call immediately using shared helper\n callDestinationOn(collector, destination, destId, type, contextData);\n }\n });\n\n if (!onConfig.length) return; // No on-events registered, nothing to do\n\n switch (type) {\n case Const.Commands.Consent:\n onConsent(collector, onConfig as Array<On.ConsentConfig>, config);\n break;\n case Const.Commands.Ready:\n onReady(collector, onConfig as Array<On.ReadyConfig>);\n break;\n case Const.Commands.Run:\n onRun(collector, onConfig as Array<On.RunConfig>);\n break;\n case Const.Commands.Session:\n onSession(collector, onConfig as Array<On.SessionConfig>);\n break;\n default:\n break;\n }\n}\n\nfunction onConsent(\n collector: Collector.Instance,\n onConfig: Array<On.ConsentConfig>,\n currentConsent?: WalkerOS.Consent,\n): void {\n const consentState = currentConsent || collector.consent;\n\n onConfig.forEach((consentConfig) => {\n // Collect functions whose consent keys match the rule keys directly\n // Directly execute functions whose consent keys match the rule keys\n Object.keys(consentState) // consent keys\n .filter((consent) => consent in consentConfig) // check for matching rule keys\n .forEach((consent) => {\n // Execute the function\n tryCatch(consentConfig[consent])(collector, consentState);\n });\n });\n}\n\nfunction onReady(\n collector: Collector.Instance,\n onConfig: Array<On.ReadyConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onRun(\n collector: Collector.Instance,\n onConfig: Array<On.RunConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onSession(\n collector: Collector.Instance,\n onConfig: Array<On.SessionConfig>,\n): void {\n if (!collector.session) return;\n\n onConfig.forEach((func) => {\n tryCatch(func)(collector, collector.session);\n });\n}\n","/**\n * @module transformer\n *\n * Transformer Chain Utilities\n * ==========================\n *\n * This module provides the unified implementation for transformer chains in walkerOS.\n * Chains are used at two points in the data flow:\n *\n * 1. Pre-collector chains (source.next):\n * Source → [Transformer Chain] → Collector\n * Events are processed before the collector sees them.\n *\n * 2. Post-collector chains (destination.before):\n * Collector → [Transformer Chain] → Destination\n * Events are processed before reaching specific destinations.\n *\n * Key Functions:\n * - extractTransformerNextMap(): Extracts next links from transformer instances\n * - extractChainProperty(): Unified extraction of chain properties from definitions\n * - walkChain(): Resolves chain IDs from starting point\n * - runTransformerChain(): Executes a chain of transformers on an event\n *\n * Chain Resolution:\n * - String start: Walk transformer.next links until chain ends\n * - Array start: Use array directly (explicit chain, ignores transformer.next)\n *\n * Chain Termination:\n * - Transformer returns false → chain stops, event is dropped\n * - Transformer throws error → chain stops, event is dropped\n * - Transformer returns void → continue with unchanged event\n * - Transformer returns event → continue with modified event\n */\nimport type { Collector, Transformer, WalkerOS } from '@walkeros/core';\nimport { isObject, tryCatchAsync, useHooks } from '@walkeros/core';\n\n/**\n * Extracts transformer next configuration for chain walking.\n * Maps transformer instances to their config.next values.\n *\n * This is the single source of truth for extracting chain links.\n * Used by both source.ts (pre-collector chains) and destination.ts (post-collector chains).\n *\n * @param transformers - Map of transformer instances\n * @returns Map of transformer IDs to their next configuration\n */\nexport function extractTransformerNextMap(\n transformers: Transformer.Transformers,\n): Record<string, { next?: string | string[] }> {\n const result: Record<string, { next?: string | string[] }> = {};\n for (const [id, transformer] of Object.entries(transformers)) {\n if (transformer.config?.next) {\n result[id] = { next: transformer.config.next as string | string[] };\n } else {\n result[id] = {};\n }\n }\n return result;\n}\n\n/**\n * Extracts chain property from definition and merges into config.\n * Provides unified handling for source.next, destination.before, and transformer.next.\n *\n * @param definition - Component definition with optional chain property\n * @param propertyName - Name of chain property ('next' or 'before')\n * @returns Object with merged config and extracted chain value\n */\nexport function extractChainProperty<\n T extends { config?: Record<string, unknown>; [key: string]: unknown },\n>(\n definition: T,\n propertyName: 'next' | 'before',\n): {\n config: Record<string, unknown>;\n chainValue: string | string[] | undefined;\n} {\n const config = (definition.config || {}) as Record<string, unknown>;\n const chainValue = definition[propertyName] as string | string[] | undefined;\n\n if (chainValue !== undefined) {\n return {\n config: { ...config, [propertyName]: chainValue },\n chainValue,\n };\n }\n\n return { config, chainValue: undefined };\n}\n\n/**\n * Walks a transformer chain starting from a given transformer ID.\n * Returns ordered array of transformer IDs in the chain.\n *\n * Used for on-demand chain resolution:\n * - Called from destination.ts with destination.config.before\n * - Called from source.ts with source.config.next\n *\n * @param startId - First transformer in chain, or explicit array of transformer IDs\n * @param transformers - Available transformer configs with optional `next` field\n * @returns Ordered array of transformer IDs to execute\n *\n * @example\n * // Single transformer\n * walkChain('redact', { redact: {} }) // ['redact']\n *\n * @example\n * // Chain via next\n * walkChain('a', { a: { next: 'b' }, b: { next: 'c' }, c: {} }) // ['a', 'b', 'c']\n *\n * @example\n * // Explicit array\n * walkChain(['x', 'y'], {}) // ['x', 'y']\n */\nexport function walkChain(\n startId: string | string[] | undefined,\n transformers: Record<string, { next?: string | string[] }> = {},\n): string[] {\n if (!startId) return [];\n\n // If array provided, use it directly (explicit chain)\n if (Array.isArray(startId)) {\n return startId;\n }\n\n // Walk the chain via transformer.next links\n const chain: string[] = [];\n const visited = new Set<string>();\n let current: string | undefined = startId;\n\n while (current && transformers[current]) {\n if (visited.has(current)) {\n // Circular reference detected - stop walking\n break;\n }\n visited.add(current);\n chain.push(current);\n\n const next: string | string[] | undefined = transformers[current].next;\n\n // If transformer has array next, append it and stop walking\n if (Array.isArray(next)) {\n chain.push(...next);\n break;\n }\n\n current = next;\n }\n\n return chain;\n}\n\n/**\n * Initializes transformer instances from configuration.\n * Does NOT call transformer.init() - that happens lazily before first push.\n *\n * @param collector - The collector instance\n * @param initTransformers - Transformer initialization configurations\n * @returns Initialized transformer instances\n */\nexport async function initTransformers(\n collector: Collector.Instance,\n initTransformers: Transformer.InitTransformers = {},\n): Promise<Transformer.Transformers> {\n const result: Transformer.Transformers = {};\n\n for (const [transformerId, transformerDef] of Object.entries(\n initTransformers,\n )) {\n const { code, env = {} } = transformerDef;\n\n // Use unified chain property extractor\n const { config: configWithChain } = extractChainProperty(\n transformerDef,\n 'next',\n );\n\n // Build transformer context for init\n const transformerLogger = collector.logger\n .scope('transformer')\n .scope(transformerId);\n\n const context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: configWithChain,\n env: env as Transformer.Env,\n };\n\n // Initialize the transformer instance with context\n const instance = await code(context);\n\n result[transformerId] = instance;\n }\n\n return result;\n}\n\n/**\n * Initializes a transformer if it hasn't been initialized yet.\n * Called lazily before first push.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to initialize\n * @param transformerId - The transformer ID\n * @returns Whether initialization succeeded\n */\nexport async function transformerInit(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n): Promise<boolean> {\n // Check if already initialized\n if (transformer.init && !transformer.config.init) {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('init');\n\n const configResult = await useHooks(\n transformer.init,\n 'TransformerInit',\n collector.hooks,\n )(context);\n\n // Check for initialization failure\n if (configResult === false) return false;\n\n // Update config if returned\n transformer.config = {\n ...(configResult || transformer.config),\n init: true,\n };\n\n transformerLogger.debug('init done');\n }\n\n return true;\n}\n\n/**\n * Pushes an event through a single transformer.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to push to\n * @param transformerId - The transformer ID\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event, void for passthrough, or false to stop chain\n */\nexport async function transformerPush(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | false | void> {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n ingest, // Same frozen reference, no copying\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('push', { event: (event as { name?: string }).name });\n\n const result = await useHooks(\n transformer.push,\n 'TransformerPush',\n collector.hooks,\n )(event, context);\n\n transformerLogger.debug('push done');\n\n return result;\n}\n\n/**\n * Runs an event through a chain of transformers.\n *\n * @param collector - The collector instance with transformers\n * @param transformers - Map of transformer instances\n * @param chain - Ordered array of transformer IDs to execute\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event or null if chain was stopped\n */\nexport async function runTransformerChain(\n collector: Collector.Instance,\n transformers: Transformer.Transformers,\n chain: string[],\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | null> {\n let processedEvent = event;\n\n for (const transformerName of chain) {\n const transformer = transformers[transformerName];\n if (!transformer) {\n collector.logger.info(`Transformer not found: ${transformerName}`);\n continue;\n }\n\n // Initialize transformer if needed\n const isInitialized = await tryCatchAsync(transformerInit)(\n collector,\n transformer,\n transformerName,\n );\n\n if (!isInitialized) {\n collector.logger.info(`Transformer init failed: ${transformerName}`);\n return null; // Stop chain on init failure\n }\n\n // Run the transformer\n const result = (await tryCatchAsync(transformerPush, (err) => {\n collector.logger\n .scope(`transformer:${transformer.type || 'unknown'}`)\n .error('Push failed', { error: err });\n return false; // Stop chain on error\n })(collector, transformer, transformerName, processedEvent, ingest)) as\n | WalkerOS.DeepPartialEvent\n | false\n | void;\n\n // Handle result\n if (result === false) {\n // Transformer explicitly stopped the chain\n return null;\n }\n\n if (result !== undefined) {\n // Transformer returned a modified event\n processedEvent = result;\n }\n // If result is undefined (void), continue with current event unchanged\n }\n\n return processedEvent;\n}\n\n/**\n * Merges transformer environments.\n */\nfunction mergeTransformerEnvironments(\n configEnv?: Transformer.Env,\n): Transformer.Env {\n if (!configEnv) return {};\n if (isObject(configEnv)) return configEnv;\n return {};\n}\n","import type { Collector, Logger, WalkerOS } from '@walkeros/core';\nimport { assign, createLogger } from '@walkeros/core';\nimport { commonHandleCommand } from './handle';\nimport { initDestinations } from './destination';\nimport { initTransformers } from './transformer';\nimport { createPush } from './push';\nimport { createCommand } from './command';\nimport { initSources } from './source';\n\ndeclare const __VERSION__: string;\n\nexport async function collector(\n initConfig: Collector.InitConfig,\n): Promise<Collector.Instance> {\n const version = __VERSION__;\n\n const defaultConfig: Collector.Config = {\n globalsStatic: {},\n sessionStatic: {},\n tagging: 0,\n run: true,\n };\n\n const config: Collector.Config = assign(defaultConfig, initConfig, {\n merge: false,\n extend: false,\n });\n\n // Create logger with config from initConfig\n const loggerConfig: Logger.Config = {\n level: initConfig.logger?.level,\n handler: initConfig.logger?.handler,\n };\n const logger = createLogger(loggerConfig);\n\n // Enhanced globals with static globals from config\n const finalGlobals = { ...config.globalsStatic, ...initConfig.globals };\n\n const collector: Collector.Instance = {\n allowed: false,\n config,\n consent: initConfig.consent || {},\n count: 0,\n custom: initConfig.custom || {},\n destinations: {},\n transformers: {},\n globals: finalGlobals,\n group: '',\n hooks: {},\n logger,\n on: {},\n queue: [],\n round: 0,\n session: undefined,\n timing: Date.now(),\n user: initConfig.user || {},\n version,\n sources: {},\n push: undefined as unknown as Collector.PushFn, // Placeholder, will be set below\n command: undefined as unknown as Collector.CommandFn, // Placeholder, will be set below\n };\n\n // Set the push and command functions with the collector reference\n collector.push = createPush(\n collector,\n (event: WalkerOS.DeepPartialEvent): WalkerOS.PartialEvent =>\n ({\n timing: Math.round((Date.now() - collector.timing) / 10) / 100,\n source: { type: 'collector', id: '', previous_id: '' },\n ...event,\n }) as WalkerOS.PartialEvent,\n );\n\n collector.command = createCommand(collector, commonHandleCommand);\n\n // Initialize destinations after collector is fully created\n // Sources are initialized in startFlow after ELB source is created\n collector.destinations = await initDestinations(\n collector,\n initConfig.destinations || {},\n );\n\n // Initialize transformers\n collector.transformers = await initTransformers(\n collector,\n initConfig.transformers || {},\n );\n\n return collector;\n}\n","import type { Collector, WalkerOS, Destination, Elb, On } from '@walkeros/core';\nimport { Const } from './constants';\nimport {\n addDestination,\n pushToDestinations,\n createPushResult,\n} from './destination';\nimport { assign, getId, isString } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport { setConsent } from './consent';\nimport { on, onApply } from './on';\nimport type { RunState } from './types/collector';\n\n/**\n * Handles common commands.\n *\n * @param collector The walkerOS collector instance.\n * @param action The action to handle.\n * @param data The data to handle.\n * @param options The options to handle.\n * @returns A promise that resolves with the push result or undefined.\n */\nexport async function commonHandleCommand(\n collector: Collector.Instance,\n action: string,\n data?: unknown,\n options?: unknown,\n): Promise<Elb.PushResult> {\n let result: Elb.PushResult | undefined;\n switch (action) {\n case Const.Commands.Config:\n if (isObject(data)) {\n assign(collector.config, data as Partial<Collector.Config>, {\n shallow: false,\n });\n }\n break;\n\n case Const.Commands.Consent:\n if (isObject(data)) {\n result = await setConsent(collector, data as WalkerOS.Consent);\n }\n break;\n\n case Const.Commands.Custom:\n if (isObject(data)) {\n collector.custom = assign(\n collector.custom,\n data as WalkerOS.Properties,\n );\n }\n break;\n\n case Const.Commands.Destination:\n if (isObject(data)) {\n if ('code' in data && isObject((data as Destination.Init).code)) {\n result = await addDestination(\n collector,\n data as Destination.Init,\n options as Destination.Config,\n );\n }\n }\n break;\n\n case Const.Commands.Globals:\n if (isObject(data)) {\n collector.globals = assign(\n collector.globals,\n data as WalkerOS.Properties,\n );\n }\n break;\n\n case Const.Commands.On:\n if (isString(data)) {\n on(\n collector,\n data as On.Types,\n options as WalkerOS.SingleOrArray<On.Options>,\n );\n }\n break;\n\n case Const.Commands.Ready:\n onApply(collector, 'ready');\n break;\n\n case Const.Commands.Run:\n result = await runCollector(collector, data as RunState);\n break;\n\n case Const.Commands.Session:\n onApply(collector, 'session');\n break;\n\n case Const.Commands.User:\n if (isObject(data)) {\n assign(collector.user, data as WalkerOS.User, { shallow: false });\n }\n break;\n }\n\n return result || createPushResult({ ok: true });\n}\n\n/**\n * Creates a full event from a partial event.\n *\n * @param collector The walkerOS collector instance.\n * @param partialEvent The partial event to transform.\n * @returns The full event.\n */\nexport function createEvent(\n collector: Collector.Instance,\n partialEvent: WalkerOS.PartialEvent,\n): WalkerOS.Event {\n if (!partialEvent.name) throw new Error('Event name is required');\n\n const [entityValue, actionValue] = partialEvent.name.split(' ');\n if (!entityValue || !actionValue) throw new Error('Event name is invalid');\n\n ++collector.count;\n\n const {\n timestamp = Date.now(),\n group = collector.group,\n count = collector.count,\n } = partialEvent;\n\n const {\n name = `${entityValue} ${actionValue}`,\n data = {},\n context = {},\n globals = collector.globals,\n custom = {},\n user = collector.user,\n nested = [],\n consent = collector.consent,\n id = `${timestamp}-${group}-${count}`,\n trigger = '',\n entity = entityValue,\n action = actionValue,\n timing = 0,\n version = {\n source: collector.version,\n tagging: collector.config.tagging || 0,\n },\n source = { type: 'collector', id: '', previous_id: '' },\n } = partialEvent;\n\n return {\n name,\n data,\n context,\n globals,\n custom,\n user,\n nested,\n consent,\n id,\n trigger,\n entity,\n action,\n timestamp,\n timing,\n group,\n count,\n version,\n source,\n };\n}\n\n/**\n * Runs the collector by setting it to allowed state and processing queued events.\n *\n * @param collector The walkerOS collector instance.\n * @param state Optional state to merge with the collector (user, globals, consent, custom).\n * @returns A promise that resolves with the push result.\n */\nexport async function runCollector(\n collector: Collector.Instance,\n state?: RunState,\n): Promise<Elb.PushResult> {\n // Set the collector to allowed state\n collector.allowed = true;\n\n // Reset count and generate new group ID\n collector.count = 0;\n collector.group = getId();\n\n // Update timing for this run\n collector.timing = Date.now();\n\n // Update collector state if provided\n if (state) {\n // Update consent if provided\n if (state.consent) {\n collector.consent = assign(collector.consent, state.consent);\n }\n\n // Update user if provided\n if (state.user) {\n collector.user = assign(collector.user, state.user);\n }\n\n // Update globals if provided\n if (state.globals) {\n collector.globals = assign(\n collector.config.globalsStatic || {},\n state.globals,\n );\n }\n\n // Update custom if provided\n if (state.custom) {\n collector.custom = assign(collector.custom, state.custom);\n }\n }\n\n // Reset destination queues\n Object.values(collector.destinations).forEach((destination) => {\n destination.queuePush = [];\n });\n\n // Reset collector queue for this run\n collector.queue = [];\n\n // Increase round counter\n collector.round++;\n\n // Process any queued events now that the collector is allowed\n const result = await pushToDestinations(collector);\n\n // Call the predefined run events\n onApply(collector, 'run');\n\n return result;\n}\n","import type { Collector, WalkerOS, Elb } from '@walkeros/core';\nimport {\n getGrantedConsent,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { createEvent } from './handle';\nimport { pushToDestinations, createPushResult } from './destination';\nimport { runTransformerChain } from './transformer';\n\n/**\n * Creates the push function for the collector.\n * Handles source mapping, event creation, and routing to destinations.\n *\n * @param collector - The walkerOS collector instance\n * @param prepareEvent - Function to enrich partial events\n * @returns The push function\n */\nexport function createPush<T extends Collector.Instance>(\n collector: T,\n prepareEvent: (event: WalkerOS.DeepPartialEvent) => WalkerOS.PartialEvent,\n): Collector.PushFn {\n return useHooks(\n async (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n const { id, ingest, mapping, preChain } = options;\n let partialEvent = event;\n\n // Freeze ingest for performance (pass by reference, no copying)\n const frozenIngest = ingest ? Object.freeze(ingest) : undefined;\n\n // Apply source mapping if provided in options\n if (mapping) {\n const processed = await processEventMapping(\n partialEvent,\n mapping,\n collector,\n );\n\n // Check ignore flag\n if (processed.ignore) {\n return createPushResult({ ok: true });\n }\n\n // Check consent requirements\n if (mapping.consent) {\n const grantedConsent = getGrantedConsent(\n mapping.consent,\n collector.consent,\n processed.event.consent as WalkerOS.Consent | undefined,\n );\n\n if (!grantedConsent) {\n return createPushResult({ ok: true });\n }\n }\n\n partialEvent = processed.event;\n }\n\n // Run pre-collector transformer chain if provided in options\n if (\n preChain?.length &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const processedEvent = await runTransformerChain(\n collector,\n collector.transformers,\n preChain,\n partialEvent,\n frozenIngest,\n );\n\n // Chain was stopped - event dropped\n if (processedEvent === null) {\n return createPushResult({ ok: true });\n }\n\n partialEvent = processedEvent;\n }\n\n // Prepare event (add timing, source info)\n const enrichedEvent = prepareEvent(partialEvent);\n\n // Create full event\n const fullEvent = createEvent(collector, enrichedEvent);\n\n // Push to destinations with id and ingest\n return await pushToDestinations(collector, fullEvent, {\n id,\n ingest: frozenIngest,\n });\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Push',\n collector.hooks,\n ) as Collector.PushFn;\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { HandleCommandFn } from './types/collector';\nimport { useHooks, tryCatchAsync } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the command function for the collector.\n * Handles walker commands (config, consent, destination, etc.)\n *\n * @param collector - The walkerOS collector instance\n * @param handleCommand - Command handler function\n * @returns The command function\n */\nexport function createCommand<T extends Collector.Instance>(\n collector: T,\n handleCommand: HandleCommandFn<T>,\n): Collector.CommandFn {\n return useHooks(\n async (\n command: string,\n data?: unknown,\n options?: unknown,\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n return await handleCommand(collector, command, data, options);\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Command',\n collector.hooks,\n ) as Collector.CommandFn;\n}\n","import type { Collector, Source, WalkerOS, Elb } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the default ELB source.\n * Routes between collector.push and collector.command based on input.\n * Provides backward-compatible flexible argument interface.\n *\n * @param collector - The walkerOS collector instance\n * @returns ELB source instance\n */\nexport function createElbSource(\n collector: Collector.Instance,\n): Source.Instance {\n return {\n type: 'elb',\n config: {},\n\n // The push function is the elb() interface users interact with\n push: async (\n eventOrCommand?: unknown,\n data?: unknown,\n options?: unknown,\n context?: unknown,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n ): Promise<Elb.PushResult> => {\n // Detect walker commands\n if (\n typeof eventOrCommand === 'string' &&\n eventOrCommand.startsWith('walker ')\n ) {\n const command = eventOrCommand.replace('walker ', '');\n return collector.command(command, data, options);\n }\n\n // Build event object\n let event: WalkerOS.DeepPartialEvent;\n\n if (typeof eventOrCommand === 'string') {\n // Convert string to object: elb('page view', { title: 'Home' })\n event = { name: eventOrCommand };\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = data as WalkerOS.Properties;\n }\n } else if (eventOrCommand && typeof eventOrCommand === 'object') {\n // Use object directly: elb({ name: 'page view', data: {...} })\n event = eventOrCommand as WalkerOS.DeepPartialEvent;\n // Merge additional data if provided\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = {\n ...(event.data || {}),\n ...(data as WalkerOS.Properties),\n };\n }\n } else {\n // Invalid input\n return createPushResult({ ok: false });\n }\n\n // Add optional properties if provided\n if (context && typeof context === 'object') {\n event.context = context as WalkerOS.OrderedProperties;\n }\n if (nested && Array.isArray(nested)) {\n event.nested = nested;\n }\n if (custom && typeof custom === 'object') {\n event.custom = custom as WalkerOS.Properties;\n }\n\n // Call collector.push with event object\n return collector.push(event);\n },\n };\n}\n","import type { Collector, Source, WalkerOS } from '@walkeros/core';\nimport { getMappingValue, tryCatchAsync } from '@walkeros/core';\nimport { walkChain, extractTransformerNextMap } from './transformer';\n\n/**\n * Initialize sources using the code/config/env pattern\n *\n * @param collector - The WalkerOS collector instance\n * @param sources - Map of source definitions with code/config/env\n * @returns Initialized sources\n */\nexport async function initSources(\n collector: Collector.Instance,\n sources: Source.InitSources = {},\n): Promise<Collector.Sources> {\n const result: Collector.Sources = {};\n\n for (const [sourceId, sourceDefinition] of Object.entries(sources)) {\n const { code, config = {}, env = {}, primary, next } = sourceDefinition;\n\n // Track current ingest metadata (set per-request by setIngest)\n let currentIngest: unknown = undefined;\n\n // Resolve transformer chain for this source\n const preChain = walkChain(\n next,\n extractTransformerNextMap(collector.transformers),\n );\n\n // Create wrapped push that auto-applies source mapping config, preChain, and ingest\n const wrappedPush: Collector.PushFn = (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ) => {\n // Pass source config as mapping in options, plus resolved preChain, source id, and ingest\n return collector.push(event, {\n ...options,\n id: sourceId,\n ingest: currentIngest,\n mapping: config,\n preChain, // Source-specific transformer chain\n });\n };\n\n // Create initial logger scoped to sourceId (type will be added after init)\n const initialLogger = collector.logger.scope('source').scope(sourceId);\n\n const cleanEnv: Source.Env = {\n push: wrappedPush,\n command: collector.command,\n sources: collector.sources, // Provide access to all sources for chaining\n elb: collector.sources.elb.push, // ELB source is always available\n logger: initialLogger,\n ...env,\n };\n\n /**\n * setIngest extracts metadata from raw request using config.ingest mapping.\n * Opt-in: returns early if no config.ingest is defined.\n */\n const setIngest = async (value: unknown): Promise<void> => {\n // Opt-in barrier: no processing when ingest not configured\n if (!config.ingest) {\n currentIngest = undefined;\n return;\n }\n\n currentIngest = await getMappingValue(value, config.ingest, {\n collector,\n });\n };\n\n // Build source context for init\n const sourceContext: Source.Context = {\n collector,\n logger: initialLogger,\n id: sourceId,\n config,\n env: cleanEnv,\n setIngest,\n };\n\n // Call source function with context\n const sourceInstance = await tryCatchAsync(code)(sourceContext);\n\n if (!sourceInstance) continue; // Skip failed source initialization\n\n // Update logger with actual source type: [type:sourceId] or [unknown:sourceId]\n const sourceType = sourceInstance.type || 'unknown';\n const sourceLogger = collector.logger.scope(sourceType).scope(sourceId);\n cleanEnv.logger = sourceLogger;\n\n // Store the primary flag in the source config for later access\n if (primary) {\n sourceInstance.config = { ...sourceInstance.config, primary };\n }\n\n result[sourceId] = sourceInstance;\n }\n\n return result;\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { StartFlow } from './types';\nimport { collector } from './collector';\nimport { createElbSource } from './elb';\nimport { initSources } from './source';\n\nexport async function startFlow<ElbPush extends Elb.Fn = Elb.Fn>(\n initConfig?: Collector.InitConfig,\n): Promise<StartFlow<ElbPush>> {\n initConfig = initConfig || {};\n const instance = await collector(initConfig);\n\n // Create and register ELB source first\n const elbSource = createElbSource(instance);\n instance.sources.elb = elbSource;\n\n // Now initialize other sources with ELB source available\n const additionalSources = await initSources(\n instance,\n initConfig.sources || {},\n );\n Object.assign(instance.sources, additionalSources);\n\n const { consent, user, globals, custom } = initConfig;\n\n if (consent) await instance.command('consent', consent);\n if (user) await instance.command('user', user);\n if (globals) Object.assign(instance.globals, globals);\n if (custom) Object.assign(instance.custom, custom);\n\n if (instance.config.run) await instance.command('run');\n\n // Determine the primary elb:\n // 1. Use explicitly marked primary source\n // 2. Use first non-elb source if any exist\n // 3. Fallback to ELB source\n let primaryElb: Elb.Fn = elbSource.push as Elb.Fn;\n\n const sources = Object.values(instance.sources).filter(\n (source) => source.type !== 'elb',\n );\n\n // First, check for explicitly marked primary source\n const markedPrimary = sources.find(\n (source) => (source.config as { primary?: boolean }).primary,\n );\n\n if (markedPrimary) {\n primaryElb = markedPrimary.push as Elb.Fn;\n } else if (sources.length > 0) {\n // Use first source as default\n primaryElb = sources[0].push as Elb.Fn;\n }\n\n return {\n collector: instance,\n elb: primaryElb as ElbPush,\n };\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","collector","on","option","import_core","collector","initTransformers","collector","event","isInitialized","batchState","collector","import_core","import_core","collector","import_core","collector","import_core","collector","collector","collector","import_core","collector"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types/code.ts","../src/constants.ts","../src/consent.ts","../src/collector.ts","../src/destination.ts","../src/on.ts","../src/source.ts","../src/transformer.ts","../src/pending.ts","../src/handle.ts","../src/push.ts","../src/command.ts","../src/elb.ts","../src/flow.ts"],"sourcesContent":["export * from './types';\n\nexport * from './constants';\n\nexport * from './consent';\nexport * from './flow';\nexport * from './push';\nexport * from './destination';\nexport * from './handle';\nexport * from './on';\nexport * from './source';\nexport { walkChain, extractTransformerNextMap } from './transformer';\n","import type { Destination, Mapping, On, WalkerOS } from '@walkeros/core';\n\nexport interface Settings {\n scripts?: string[];\n init?: string;\n on?: string;\n push?: string;\n pushBatch?: string;\n}\n\nexport interface CodeMapping extends Mapping.Rule<CodeMapping> {\n push?: string;\n pushBatch?: string;\n}\n\nexport type Types = Destination.Types<Settings, CodeMapping>;\nexport type Config = Destination.Config<Types>;\nexport type Context = Destination.Context<Types>;\nexport type PushContext = Destination.PushContext<Types>;\nexport type PushBatchContext = Destination.PushBatchContext<Types>;\n\nexport type InitFn = (context: Context) => void;\nexport type OnFn = (type: On.Types, context: Context) => void;\nexport type PushFn = (event: WalkerOS.Event, context: PushContext) => void;\nexport type PushBatchFn = (\n batch: Destination.Batch<CodeMapping>,\n context: PushBatchContext,\n) => void;\n","import type { Collector } from '@walkeros/core';\nimport type { CommandTypes, StorageType } from './types/collector';\n\nexport const Commands: Record<CommandTypes, Collector.CommandType> = {\n Action: 'action',\n Actions: 'actions',\n Config: 'config',\n Consent: 'consent',\n Context: 'context',\n Custom: 'custom',\n Destination: 'destination',\n Elb: 'elb',\n Globals: 'globals',\n Hook: 'hook',\n Init: 'init',\n Link: 'link',\n On: 'on',\n Prefix: 'data-elb',\n Ready: 'ready',\n Run: 'run',\n Session: 'session',\n User: 'user',\n Walker: 'walker',\n} as const;\n\nconst UtilsStorage: { [key: string]: StorageType } = {\n Cookie: 'cookie',\n Local: 'local',\n Session: 'session',\n} as const;\n\nconst Utils = {\n Storage: UtilsStorage,\n};\n\nexport const Const = {\n Commands,\n Utils,\n};\n\nexport default Const;\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport { assign } from '@walkeros/core';\n\n/**\n * Processes consent data: coerces to boolean, updates collector state.\n * Does NOT notify or process queues — caller handles that.\n */\nexport function processConsent(\n collector: Collector.Instance,\n data: WalkerOS.Consent,\n): { update: WalkerOS.Consent; runQueue: boolean } {\n let runQueue = false;\n const update: WalkerOS.Consent = {};\n Object.entries(data).forEach(([name, granted]) => {\n const state = !!granted;\n update[name] = state;\n runQueue = runQueue || state;\n });\n\n collector.consent = assign(collector.consent, update);\n\n return { update, runQueue };\n}\n","import type { Collector, Logger, WalkerOS } from '@walkeros/core';\nimport { assign, createLogger } from '@walkeros/core';\nimport { commonHandleCommand } from './handle';\nimport { initDestinations } from './destination';\nimport { initTransformers } from './transformer';\nimport { createPush } from './push';\nimport { createCommand } from './command';\nimport { initSources } from './source';\n\ndeclare const __VERSION__: string;\n\nexport async function collector(\n initConfig: Collector.InitConfig,\n): Promise<Collector.Instance> {\n const version = __VERSION__;\n\n const defaultConfig: Collector.Config = {\n globalsStatic: {},\n sessionStatic: {},\n tagging: 0,\n run: true,\n };\n\n const config: Collector.Config = assign(defaultConfig, initConfig, {\n merge: false,\n extend: false,\n });\n\n // Create logger with config from initConfig\n const loggerConfig: Logger.Config = {\n level: initConfig.logger?.level,\n handler: initConfig.logger?.handler,\n };\n const logger = createLogger(loggerConfig);\n\n // Enhanced globals with static globals from config\n const finalGlobals = { ...config.globalsStatic, ...initConfig.globals };\n\n const collector: Collector.Instance = {\n allowed: false,\n config,\n consent: initConfig.consent || {},\n count: 0,\n custom: initConfig.custom || {},\n destinations: {},\n transformers: {},\n globals: finalGlobals,\n group: '',\n hooks: {},\n logger,\n on: {},\n queue: [],\n round: 0,\n session: undefined,\n status: {\n startedAt: Date.now(),\n in: 0,\n out: 0,\n failed: 0,\n sources: {},\n destinations: {},\n },\n timing: Date.now(),\n user: initConfig.user || {},\n version,\n sources: {},\n pending: { sources: {}, destinations: {} },\n push: undefined as unknown as Collector.PushFn, // Placeholder, will be set below\n command: undefined as unknown as Collector.CommandFn, // Placeholder, will be set below\n };\n\n // Set the push and command functions with the collector reference\n collector.push = createPush(\n collector,\n (event: WalkerOS.DeepPartialEvent): WalkerOS.PartialEvent =>\n ({\n timing: Math.round((Date.now() - collector.timing) / 10) / 100,\n source: { type: 'collector', id: '', previous_id: '' },\n ...event,\n }) as WalkerOS.PartialEvent,\n );\n\n collector.command = createCommand(collector, commonHandleCommand);\n\n // Initialize destinations after collector is fully created\n // Sources are initialized in startFlow after ELB source is created\n collector.destinations = await initDestinations(\n collector,\n initConfig.destinations || {},\n );\n\n // Initialize transformers\n collector.transformers = await initTransformers(\n collector,\n initConfig.transformers || {},\n );\n\n return collector;\n}\n","import type {\n Collector,\n WalkerOS,\n Elb,\n Destination,\n Transformer,\n} from '@walkeros/core';\nimport {\n assign,\n clone,\n debounce,\n getId,\n getGrantedConsent,\n isDefined,\n isFunction,\n isObject,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { callDestinationOn } from './on';\nimport {\n runTransformerChain,\n walkChain,\n extractTransformerNextMap,\n extractChainProperty,\n} from './transformer';\n\n/**\n * Computes transformer chain for a destination on-demand.\n * Returns empty array if destination has no 'before' configured.\n */\nfunction getDestinationChain(\n destination: Destination.Instance,\n transformers: Transformer.Transformers,\n): string[] {\n const before = destination.config.before as string | string[] | undefined;\n if (!before) return [];\n return walkChain(before, extractTransformerNextMap(transformers));\n}\n\n/**\n * Adds a new destination to the collector.\n *\n * @param collector - The walkerOS collector instance.\n * @param data - The destination's init data.\n * @param options - The destination's config.\n * @returns The result of the push operation.\n */\nexport async function addDestination(\n collector: Collector.Instance,\n data: Destination.Init,\n options?: Destination.Config,\n): Promise<Elb.PushResult> {\n const { code, config: dataConfig = {}, env = {}, before } = data;\n\n // Validate that code has a push method\n if (!isFunction(code.push)) {\n return createPushResult({\n ok: false,\n failed: {\n invalid: {\n type: 'invalid',\n error: 'Destination code must have a push method',\n },\n },\n });\n }\n\n const baseConfig = options || dataConfig || { init: false };\n // Merge before into config if provided at root level\n const config = before ? { ...baseConfig, before } : baseConfig;\n\n const destination: Destination.Instance = {\n ...code,\n config,\n env: mergeEnvironments(code.env, env),\n };\n\n let id = destination.config.id; // Use given id\n if (!id) {\n // Generate a new id if none was given\n do {\n id = getId(4);\n } while (collector.destinations[id]);\n }\n\n // Add the destination\n collector.destinations[id] = destination;\n\n // Process previous events if not disabled\n if (destination.config.queue !== false)\n destination.queuePush = [...collector.queue];\n\n return pushToDestinations(collector, undefined, {}, { [id]: destination });\n}\n\n/**\n * Pushes an event to all or a subset of destinations.\n *\n * @param collector - The walkerOS collector instance.\n * @param event - The event to push.\n * @param meta - Optional metadata with id and ingest.\n * @param destinations - The destinations to push to.\n * @returns The result of the push operation.\n */\nexport async function pushToDestinations(\n collector: Collector.Instance,\n event?: WalkerOS.Event,\n meta: { id?: string; ingest?: unknown } = {},\n destinations?: Collector.Destinations,\n): Promise<Elb.PushResult> {\n const { allowed, consent, globals, user } = collector;\n\n // Check if collector is allowed to push\n if (!allowed) return createPushResult({ ok: false });\n\n // Add event to the collector queue\n if (event) {\n collector.queue.push(event);\n collector.status.in++;\n }\n\n // Use given destinations or use internal destinations\n if (!destinations) destinations = collector.destinations;\n\n const results = await Promise.all(\n // Process all destinations in parallel\n Object.entries(destinations || {}).map(async ([id, destination]) => {\n // Create a queue of events to be processed\n let currentQueue = (destination.queuePush || []).map((event) => ({\n ...event,\n consent,\n }));\n\n // Reset original queue while processing to enable async processing\n destination.queuePush = [];\n\n // Add event to queue stack\n if (event) {\n // Clone the event to avoid mutating the original event\n const currentEvent = clone(event);\n\n // Note: Policy is now applied in processEventMapping() within destinationPush()\n\n // Add event to queue stack\n currentQueue.push(currentEvent);\n }\n\n // If no events and no queued on events, skip this destination\n if (!currentQueue.length && !destination.queueOn?.length) {\n return { id, destination, skipped: true };\n }\n\n // If only on events queued (no push events), still init to flush queueOn\n if (!currentQueue.length && destination.queueOn?.length) {\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n return { id, destination, skipped: !isInitialized };\n }\n\n const allowedEvents: WalkerOS.Events = [];\n const skippedEvents = currentQueue.filter((queuedEvent) => {\n const grantedConsent = getGrantedConsent(\n destination.config.consent, // Required\n consent, // Current collector state\n queuedEvent.consent, // Individual event state\n );\n\n if (grantedConsent) {\n queuedEvent.consent = grantedConsent; // Save granted consent states only\n\n allowedEvents.push(queuedEvent); // Add to allowed queue\n return false; // Remove from destination queue\n }\n\n return true; // Keep denied events in the queue\n });\n\n // Add skipped events back to the queue\n destination.queuePush.push(...skippedEvents);\n\n // Execution shall not pass if no events are allowed\n if (!allowedEvents.length) {\n return { id, destination, queue: currentQueue }; // Don't push if not allowed\n }\n\n // Initialize the destination if needed\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n\n if (!isInitialized) return { id, destination, queue: currentQueue };\n\n // Process the destinations event queue\n let error: unknown;\n let response: unknown;\n if (!destination.dlq) destination.dlq = [];\n\n // Compute transformer chain on-demand from destination.before\n const postChain = getDestinationChain(\n destination,\n collector.transformers,\n );\n\n // Process allowed events and store failed ones in the dead letter queue (DLQ)\n let totalDuration = 0;\n await Promise.all(\n allowedEvents.map(async (event) => {\n // Merge event with collector state, prioritizing event properties\n event.globals = assign(globals, event.globals);\n event.user = assign(user, event.user);\n\n // Run post-collector transformer chain if configured for this destination\n let processedEvent: WalkerOS.Event | null = event;\n if (\n postChain.length > 0 &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const chainResult = await runTransformerChain(\n collector,\n collector.transformers,\n postChain,\n event,\n meta.ingest,\n );\n\n if (chainResult === null) {\n // Chain stopped - skip this event for this destination\n return event;\n }\n\n // Use the processed event (cast back to full Event type)\n processedEvent = chainResult as WalkerOS.Event;\n }\n\n const pushStart = Date.now();\n const result = await tryCatchAsync(destinationPush, (err) => {\n // Log the error with destination scope\n const destType = destination.type || 'unknown';\n collector.logger.scope(destType).error('Push failed', {\n error: err,\n event: processedEvent!.name,\n });\n error = err; // oh no\n\n // Add failed event to destinations DLQ\n destination.dlq!.push([processedEvent!, err]);\n\n return undefined;\n })(collector, destination, id, processedEvent!, meta.ingest);\n totalDuration += Date.now() - pushStart;\n\n // Capture the last response (for single event pushes)\n if (result !== undefined) response = result;\n\n return event;\n }),\n );\n\n return { id, destination, error, response, totalDuration };\n }),\n );\n\n // Build result objects\n const done: Record<string, Destination.Ref> = {};\n const queued: Record<string, Destination.Ref> = {};\n const failed: Record<string, Destination.Ref> = {};\n\n for (const result of results) {\n if (result.skipped) continue;\n\n const destination = result.destination;\n const ref: Destination.Ref = {\n type: destination.type || 'unknown',\n data: result.response, // Capture push() return value\n };\n\n // Ensure destination status entry exists\n if (!collector.status.destinations[result.id]) {\n collector.status.destinations[result.id] = {\n count: 0,\n failed: 0,\n duration: 0,\n };\n }\n const destStatus = collector.status.destinations[result.id];\n const now = Date.now();\n\n if (result.error) {\n ref.error = result.error;\n failed[result.id] = ref;\n destStatus.failed++;\n destStatus.lastAt = now;\n destStatus.duration += result.totalDuration || 0;\n collector.status.failed++;\n } else if (result.queue && result.queue.length) {\n destination.queuePush = (destination.queuePush || []).concat(\n result.queue,\n );\n queued[result.id] = ref;\n } else {\n done[result.id] = ref;\n destStatus.count++;\n destStatus.lastAt = now;\n destStatus.duration += result.totalDuration || 0;\n collector.status.out++;\n }\n }\n\n return createPushResult({\n event,\n ...(Object.keys(done).length && { done }),\n ...(Object.keys(queued).length && { queued }),\n ...(Object.keys(failed).length && { failed }),\n });\n}\n\n/**\n * Initializes a destination.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to initialize.\n * @param destId - The destination ID.\n * @returns Whether the destination was initialized successfully.\n */\nexport async function destinationInit<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n): Promise<boolean> {\n // Check if the destination was initialized properly or try to do so\n if (destination.init && !destination.config.init) {\n // Create scoped logger for this destination: [type:id] or [unknown:id]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n destLogger.debug('init');\n\n const configResult = await useHooks(\n destination.init,\n 'DestinationInit',\n collector.hooks,\n )(context);\n\n // Actively check for errors (when false)\n if (configResult === false) return configResult; // don't push if init is false\n\n // Update the destination config if it was returned\n destination.config = {\n ...(configResult || destination.config),\n init: true, // Remember that the destination was initialized\n };\n\n // Flush queued on() events now that destination is initialized\n if (destination.queueOn?.length) {\n const queueOn = destination.queueOn;\n destination.queueOn = [];\n\n for (const { type, data } of queueOn) {\n callDestinationOn(collector, destination, destId, type, data);\n }\n }\n\n destLogger.debug('init done');\n }\n\n return true; // Destination is ready to push\n}\n\n/**\n * Pushes an event to a single destination.\n * Handles mapping, batching, and consent checks.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to push to.\n * @param destId - The destination ID.\n * @param event - The event to push.\n * @param ingest - Optional ingest metadata (frozen, same reference).\n * @returns Whether the event was pushed successfully.\n */\nexport async function destinationPush<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n event: WalkerOS.Event,\n ingest?: unknown,\n): Promise<unknown> {\n const { config } = destination;\n\n const processed = await processEventMapping(event, config, collector);\n\n if (processed.ignore) return false;\n\n // Create scoped logger for this destination: [type] or [unknown]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.PushContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n data: processed.data,\n rule: processed.mapping,\n ingest,\n env: mergeEnvironments(destination.env, config.env),\n };\n\n const eventMapping = processed.mapping;\n const mappingKey = processed.mappingKey || '* *';\n\n if (eventMapping?.batch && destination.pushBatch) {\n // Initialize batch registry on destination (not on shared mapping config)\n destination.batches = destination.batches || {};\n\n // Get or create batch state for this mapping key\n if (!destination.batches[mappingKey]) {\n const batched: Destination.Batch<unknown> = {\n key: mappingKey,\n events: [],\n data: [],\n };\n\n destination.batches[mappingKey] = {\n batched,\n batchFn: debounce(() => {\n const batchState = destination.batches![mappingKey];\n const currentBatched = batchState.batched;\n\n const batchContext: Destination.PushBatchContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n // Note: batch.data contains all transformed data; context.data is for single events\n data: undefined,\n rule: eventMapping, // Renamed from mapping to rule\n ingest, // Same frozen reference\n env: mergeEnvironments(destination.env, config.env),\n };\n\n destLogger.debug('push batch', {\n events: currentBatched.events.length,\n });\n\n useHooks(\n destination.pushBatch!,\n 'DestinationPushBatch',\n collector.hooks,\n )(currentBatched, batchContext);\n\n destLogger.debug('push batch done');\n\n // Reset batch\n currentBatched.events = [];\n currentBatched.data = [];\n }, eventMapping.batch),\n };\n }\n\n // Add event to batch\n const batchState = destination.batches[mappingKey];\n batchState.batched.events.push(processed.event);\n if (isDefined(processed.data)) batchState.batched.data.push(processed.data);\n\n // Trigger debounced batch\n batchState.batchFn();\n } else {\n destLogger.debug('push', { event: processed.event.name });\n\n // It's time to go to the destination's side now\n const response = await useHooks(\n destination.push,\n 'DestinationPush',\n collector.hooks,\n )(processed.event, context);\n\n destLogger.debug('push done');\n\n return response;\n }\n\n return true;\n}\n\n/**\n * Creates a standardized result object for push operations.\n *\n * @param partialResult - A partial result to merge with the default result.\n * @returns The push result.\n */\nexport function createPushResult(\n partialResult?: Partial<Elb.PushResult>,\n): Elb.PushResult {\n return {\n ok: !partialResult?.failed,\n ...partialResult,\n };\n}\n\n/**\n * Register a single destination from its init definition.\n * Merges code config, user config, and chain config.\n * Used by initDestinations and activatePending.\n */\nexport function registerDestination(\n def: Destination.Init,\n): Destination.Instance {\n const { code, config = {}, env = {} } = def;\n const { config: configWithChain } = extractChainProperty(def, 'before');\n const mergedConfig = { ...code.config, ...config, ...configWithChain };\n const mergedEnv = mergeEnvironments(code.env, env);\n return { ...code, config: mergedConfig, env: mergedEnv };\n}\n\n/**\n * Initializes a map of destinations using ONLY the unified code/config/env pattern.\n * Does NOT call destination.init() - that happens later during push with proper consent checks.\n *\n * @param destinations - The destinations to initialize.\n * @param collector - The collector instance for destination init context.\n * @returns The initialized destinations.\n */\nexport async function initDestinations(\n collector: Collector.Instance,\n destinations: Destination.InitDestinations = {},\n): Promise<Collector.Destinations> {\n const result: Collector.Destinations = {};\n\n for (const [id, def] of Object.entries(destinations)) {\n if (def.config?.require?.length) {\n collector.pending.destinations[id] = def;\n continue;\n }\n result[id] = registerDestination(def);\n }\n\n return result;\n}\n\n/**\n * Merges destination environment with config environment\n * Config env takes precedence over destination env for overrides\n */\nexport function mergeEnvironments(\n destinationEnv?: Destination.Env,\n configEnv?: Destination.Env,\n): Destination.Env {\n // If neither environment exists, return empty object\n if (!destinationEnv && !configEnv) return {};\n\n // If only one exists, return it\n if (!configEnv) return destinationEnv!;\n if (!destinationEnv) return configEnv;\n\n // Both exist - merge objects with configEnv taking precedence\n if (isObject(destinationEnv) && isObject(configEnv)) {\n return { ...destinationEnv, ...configEnv };\n }\n\n // If they're not both objects, config env overrides destination env\n return configEnv;\n}\n","import type { Collector, On, WalkerOS, Destination } from '@walkeros/core';\nimport { isArray } from '@walkeros/core';\nimport { Const } from './constants';\nimport { tryCatch, tryCatchAsync } from '@walkeros/core';\nimport { mergeEnvironments } from './destination';\nimport { activatePending } from './pending';\n\n/**\n * Registers a callback for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to listen for.\n * @param option The callback function or an array of callback functions.\n */\nexport async function on(\n collector: Collector.Instance,\n type: On.Types,\n option: WalkerOS.SingleOrArray<On.Options>,\n) {\n const on = collector.on;\n const onType: Array<On.Options> = on[type] || [];\n const options = isArray(option) ? option : [option];\n\n options.forEach((option) => {\n onType.push(option);\n });\n\n // Update collector on state\n (on[type] as typeof onType) = onType;\n\n // Execute the on function directly\n await onApply(collector, type, options);\n}\n\n/**\n * Calls a destination's on() handler with proper context.\n * Used by both onApply() for immediate calls and destinationInit() for flushing queued events.\n */\nexport function callDestinationOn(\n collector: Collector.Instance,\n destination: Destination.Instance,\n destId: string,\n type: On.Types,\n data: unknown,\n) {\n if (!destination.on) return;\n\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType).scope('on').scope(type);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n data: data as Destination.Data,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n tryCatch(destination.on)(type, context);\n}\n\n/**\n * Applies all registered callbacks for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to apply the callbacks for.\n * @param options The options for the callbacks.\n * @param config The consent configuration.\n */\nexport async function onApply(\n collector: Collector.Instance,\n type: On.Types,\n options?: Array<On.Options>,\n config?: unknown,\n): Promise<boolean> {\n // Use the optionally provided options\n let onConfig = options || [];\n\n if (!options) {\n // Get the collector on events\n onConfig = collector.on[type] || [];\n }\n\n // Calculate context data once for all sources and destinations\n let contextData: unknown;\n\n switch (type) {\n case Const.Commands.Consent:\n contextData = config || collector.consent;\n break;\n case Const.Commands.Session:\n contextData = collector.session;\n break;\n case Const.Commands.User:\n contextData = config || collector.user;\n break;\n case Const.Commands.Custom:\n contextData = config || collector.custom;\n break;\n case Const.Commands.Globals:\n contextData = config || collector.globals;\n break;\n case Const.Commands.Config:\n contextData = config || collector.config;\n break;\n case Const.Commands.Ready:\n case Const.Commands.Run:\n default:\n contextData = undefined;\n break;\n }\n\n let vetoed = false;\n for (const source of Object.values(collector.sources)) {\n if (source.on) {\n const result = await tryCatchAsync(source.on)(type, contextData);\n if (result === false) vetoed = true;\n }\n }\n\n Object.entries(collector.destinations).forEach(([destId, destination]) => {\n if (destination.on) {\n // Queue if destination not yet initialized\n if (!destination.config.init) {\n destination.queueOn = destination.queueOn || [];\n destination.queueOn.push({ type, data: contextData });\n return;\n }\n\n // Call immediately using shared helper\n callDestinationOn(collector, destination, destId, type, contextData);\n }\n });\n\n // Activate pending sources/destinations whose require conditions are met\n if (\n Object.keys(collector.pending.sources).length > 0 ||\n Object.keys(collector.pending.destinations).length > 0\n ) {\n await activatePending(collector, type);\n }\n\n if (!onConfig.length) return !vetoed;\n\n switch (type) {\n case Const.Commands.Consent:\n onConsent(\n collector,\n onConfig as Array<On.ConsentConfig>,\n config as WalkerOS.Consent,\n );\n break;\n case Const.Commands.Ready:\n onReady(collector, onConfig as Array<On.ReadyConfig>);\n break;\n case Const.Commands.Run:\n onRun(collector, onConfig as Array<On.RunConfig>);\n break;\n case Const.Commands.Session:\n onSession(collector, onConfig as Array<On.SessionConfig>);\n break;\n default:\n // Generic handler for user, custom, globals, config, and custom events\n onConfig.forEach((func) => {\n if (typeof func === 'function') {\n tryCatch(func as On.GenericFn)(collector, contextData);\n }\n });\n break;\n }\n\n return !vetoed;\n}\n\nfunction onConsent(\n collector: Collector.Instance,\n onConfig: Array<On.ConsentConfig>,\n currentConsent?: WalkerOS.Consent,\n): void {\n const consentState = currentConsent || collector.consent;\n\n onConfig.forEach((consentConfig) => {\n // Collect functions whose consent keys match the rule keys directly\n // Directly execute functions whose consent keys match the rule keys\n Object.keys(consentState) // consent keys\n .filter((consent) => consent in consentConfig) // check for matching rule keys\n .forEach((consent) => {\n // Execute the function\n tryCatch(consentConfig[consent])(collector, consentState);\n });\n });\n}\n\nfunction onReady(\n collector: Collector.Instance,\n onConfig: Array<On.ReadyConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onRun(\n collector: Collector.Instance,\n onConfig: Array<On.RunConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onSession(\n collector: Collector.Instance,\n onConfig: Array<On.SessionConfig>,\n): void {\n if (!collector.session) return;\n\n onConfig.forEach((func) => {\n tryCatch(func)(collector, collector.session);\n });\n}\n","import type { Collector, Source, WalkerOS } from '@walkeros/core';\nimport { getMappingValue, tryCatchAsync } from '@walkeros/core';\nimport { walkChain, extractTransformerNextMap } from './transformer';\n\n/**\n * Initialize a single source. Extracted from the initSources loop body\n * so it can be reused by the pending-source activator.\n */\nexport async function initSource(\n collector: Collector.Instance,\n sourceId: string,\n sourceDefinition: Source.InitSource,\n): Promise<Source.Instance | undefined> {\n const { code, config = {}, env = {}, primary, next } = sourceDefinition;\n\n // Track current ingest metadata (set per-request by setIngest)\n let currentIngest: unknown = undefined;\n\n // Resolve transformer chain for this source\n const preChain = walkChain(\n next,\n extractTransformerNextMap(collector.transformers),\n );\n\n // Create wrapped push that auto-applies source mapping config, preChain, and ingest\n const wrappedPush: Collector.PushFn = (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ) => {\n return collector.push(event, {\n ...options,\n id: sourceId,\n ingest: currentIngest,\n mapping: config,\n preChain,\n });\n };\n\n // Create initial logger scoped to sourceId (type will be added after init)\n const initialLogger = collector.logger.scope('source').scope(sourceId);\n\n const cleanEnv: Source.Env = {\n push: wrappedPush,\n command: collector.command,\n sources: collector.sources,\n elb: collector.sources.elb.push,\n logger: initialLogger,\n ...env,\n };\n\n /**\n * setIngest extracts metadata from raw request using config.ingest mapping.\n * Opt-in: returns early if no config.ingest is defined.\n */\n const setIngest = async (value: unknown): Promise<void> => {\n if (!config.ingest) {\n currentIngest = undefined;\n return;\n }\n\n currentIngest = await getMappingValue(value, config.ingest, {\n collector,\n });\n };\n\n const sourceContext: Source.Context = {\n collector,\n logger: initialLogger,\n id: sourceId,\n config,\n env: cleanEnv,\n setIngest,\n };\n\n const sourceInstance = await tryCatchAsync(code)(sourceContext);\n if (!sourceInstance) return undefined;\n\n const sourceType = sourceInstance.type || 'unknown';\n const sourceLogger = collector.logger.scope(sourceType).scope(sourceId);\n cleanEnv.logger = sourceLogger;\n\n if (primary) {\n sourceInstance.config = { ...sourceInstance.config, primary };\n }\n\n return sourceInstance;\n}\n\n/**\n * Initialize sources. Sources with `require` are deferred to collector.pending.\n */\nexport async function initSources(\n collector: Collector.Instance,\n sources: Source.InitSources = {},\n): Promise<Collector.Sources> {\n const result: Collector.Sources = {};\n\n for (const [sourceId, sourceDefinition] of Object.entries(sources)) {\n const { config = {} } = sourceDefinition;\n\n if (config.require && config.require.length > 0) {\n collector.pending.sources[sourceId] = sourceDefinition;\n continue;\n }\n\n const sourceInstance = await initSource(\n collector,\n sourceId,\n sourceDefinition,\n );\n if (sourceInstance) {\n result[sourceId] = sourceInstance;\n }\n }\n\n return result;\n}\n","/**\n * @module transformer\n *\n * Transformer Chain Utilities\n * ==========================\n *\n * This module provides the unified implementation for transformer chains in walkerOS.\n * Chains are used at two points in the data flow:\n *\n * 1. Pre-collector chains (source.next):\n * Source → [Transformer Chain] → Collector\n * Events are processed before the collector sees them.\n *\n * 2. Post-collector chains (destination.before):\n * Collector → [Transformer Chain] → Destination\n * Events are processed before reaching specific destinations.\n *\n * Key Functions:\n * - extractTransformerNextMap(): Extracts next links from transformer instances\n * - extractChainProperty(): Unified extraction of chain properties from definitions\n * - walkChain(): Resolves chain IDs from starting point\n * - runTransformerChain(): Executes a chain of transformers on an event\n *\n * Chain Resolution:\n * - String start: Walk transformer.next links until chain ends\n * - Array start: Use array directly (explicit chain, ignores transformer.next)\n *\n * Chain Termination:\n * - Transformer returns false → chain stops, event is dropped\n * - Transformer throws error → chain stops, event is dropped\n * - Transformer returns void → continue with unchanged event\n * - Transformer returns event → continue with modified event\n */\nimport type { Collector, Transformer, WalkerOS } from '@walkeros/core';\nimport { isObject, tryCatchAsync, useHooks } from '@walkeros/core';\n\n/**\n * Extracts transformer next configuration for chain walking.\n * Maps transformer instances to their config.next values.\n *\n * This is the single source of truth for extracting chain links.\n * Used by both source.ts (pre-collector chains) and destination.ts (post-collector chains).\n *\n * @param transformers - Map of transformer instances\n * @returns Map of transformer IDs to their next configuration\n */\nexport function extractTransformerNextMap(\n transformers: Transformer.Transformers,\n): Record<string, { next?: string | string[] }> {\n const result: Record<string, { next?: string | string[] }> = {};\n for (const [id, transformer] of Object.entries(transformers)) {\n if (transformer.config?.next) {\n result[id] = { next: transformer.config.next as string | string[] };\n } else {\n result[id] = {};\n }\n }\n return result;\n}\n\n/**\n * Extracts chain property from definition and merges into config.\n * Provides unified handling for source.next, destination.before, and transformer.next.\n *\n * @param definition - Component definition with optional chain property\n * @param propertyName - Name of chain property ('next' or 'before')\n * @returns Object with merged config and extracted chain value\n */\nexport function extractChainProperty<\n T extends { config?: Record<string, unknown>; [key: string]: unknown },\n>(\n definition: T,\n propertyName: 'next' | 'before',\n): {\n config: Record<string, unknown>;\n chainValue: string | string[] | undefined;\n} {\n const config = (definition.config || {}) as Record<string, unknown>;\n const chainValue = definition[propertyName] as string | string[] | undefined;\n\n if (chainValue !== undefined) {\n return {\n config: { ...config, [propertyName]: chainValue },\n chainValue,\n };\n }\n\n return { config, chainValue: undefined };\n}\n\n/**\n * Walks a transformer chain starting from a given transformer ID.\n * Returns ordered array of transformer IDs in the chain.\n *\n * Used for on-demand chain resolution:\n * - Called from destination.ts with destination.config.before\n * - Called from source.ts with source.config.next\n *\n * @param startId - First transformer in chain, or explicit array of transformer IDs\n * @param transformers - Available transformer configs with optional `next` field\n * @returns Ordered array of transformer IDs to execute\n *\n * @example\n * // Single transformer\n * walkChain('redact', { redact: {} }) // ['redact']\n *\n * @example\n * // Chain via next\n * walkChain('a', { a: { next: 'b' }, b: { next: 'c' }, c: {} }) // ['a', 'b', 'c']\n *\n * @example\n * // Explicit array\n * walkChain(['x', 'y'], {}) // ['x', 'y']\n */\nexport function walkChain(\n startId: string | string[] | undefined,\n transformers: Record<string, { next?: string | string[] }> = {},\n): string[] {\n if (!startId) return [];\n\n // If array provided, use it directly (explicit chain)\n if (Array.isArray(startId)) {\n return startId;\n }\n\n // Walk the chain via transformer.next links\n const chain: string[] = [];\n const visited = new Set<string>();\n let current: string | undefined = startId;\n\n while (current && transformers[current]) {\n if (visited.has(current)) {\n // Circular reference detected - stop walking\n break;\n }\n visited.add(current);\n chain.push(current);\n\n const next: string | string[] | undefined = transformers[current].next;\n\n // If transformer has array next, append it and stop walking\n if (Array.isArray(next)) {\n chain.push(...next);\n break;\n }\n\n current = next;\n }\n\n return chain;\n}\n\n/**\n * Initializes transformer instances from configuration.\n * Does NOT call transformer.init() - that happens lazily before first push.\n *\n * @param collector - The collector instance\n * @param initTransformers - Transformer initialization configurations\n * @returns Initialized transformer instances\n */\nexport async function initTransformers(\n collector: Collector.Instance,\n initTransformers: Transformer.InitTransformers = {},\n): Promise<Transformer.Transformers> {\n const result: Transformer.Transformers = {};\n\n for (const [transformerId, transformerDef] of Object.entries(\n initTransformers,\n )) {\n const { code, env = {} } = transformerDef;\n\n // Use unified chain property extractor\n const { config: configWithChain } = extractChainProperty(\n transformerDef,\n 'next',\n );\n\n // Build transformer context for init\n const transformerLogger = collector.logger\n .scope('transformer')\n .scope(transformerId);\n\n const context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: configWithChain,\n env: env as Transformer.Env,\n };\n\n // Initialize the transformer instance with context\n const instance = await code(context);\n\n result[transformerId] = instance;\n }\n\n return result;\n}\n\n/**\n * Initializes a transformer if it hasn't been initialized yet.\n * Called lazily before first push.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to initialize\n * @param transformerId - The transformer ID\n * @returns Whether initialization succeeded\n */\nexport async function transformerInit(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n): Promise<boolean> {\n // Check if already initialized\n if (transformer.init && !transformer.config.init) {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('init');\n\n const configResult = await useHooks(\n transformer.init,\n 'TransformerInit',\n collector.hooks,\n )(context);\n\n // Check for initialization failure\n if (configResult === false) return false;\n\n // Update config if returned\n transformer.config = {\n ...(configResult || transformer.config),\n init: true,\n };\n\n transformerLogger.debug('init done');\n }\n\n return true;\n}\n\n/**\n * Pushes an event through a single transformer.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to push to\n * @param transformerId - The transformer ID\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event, void for passthrough, or false to stop chain\n */\nexport async function transformerPush(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | false | void> {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n ingest, // Same frozen reference, no copying\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('push', { event: (event as { name?: string }).name });\n\n const result = await useHooks(\n transformer.push,\n 'TransformerPush',\n collector.hooks,\n )(event, context);\n\n transformerLogger.debug('push done');\n\n return result;\n}\n\n/**\n * Runs an event through a chain of transformers.\n *\n * @param collector - The collector instance with transformers\n * @param transformers - Map of transformer instances\n * @param chain - Ordered array of transformer IDs to execute\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event or null if chain was stopped\n */\nexport async function runTransformerChain(\n collector: Collector.Instance,\n transformers: Transformer.Transformers,\n chain: string[],\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | null> {\n let processedEvent = event;\n\n for (const transformerName of chain) {\n const transformer = transformers[transformerName];\n if (!transformer) {\n collector.logger.info(`Transformer not found: ${transformerName}`);\n continue;\n }\n\n // Initialize transformer if needed\n const isInitialized = await tryCatchAsync(transformerInit)(\n collector,\n transformer,\n transformerName,\n );\n\n if (!isInitialized) {\n collector.logger.info(`Transformer init failed: ${transformerName}`);\n return null; // Stop chain on init failure\n }\n\n // Run the transformer\n const result = (await tryCatchAsync(transformerPush, (err) => {\n collector.logger\n .scope(`transformer:${transformer.type || 'unknown'}`)\n .error('Push failed', { error: err });\n return false; // Stop chain on error\n })(collector, transformer, transformerName, processedEvent, ingest)) as\n | WalkerOS.DeepPartialEvent\n | false\n | void;\n\n // Handle result\n if (result === false) {\n // Transformer explicitly stopped the chain\n return null;\n }\n\n if (result !== undefined) {\n // Transformer returned a modified event\n processedEvent = result;\n }\n // If result is undefined (void), continue with current event unchanged\n }\n\n return processedEvent;\n}\n\n/**\n * Merges transformer environments.\n */\nfunction mergeTransformerEnvironments(\n configEnv?: Transformer.Env,\n): Transformer.Env {\n if (!configEnv) return {};\n if (isObject(configEnv)) return configEnv;\n return {};\n}\n","import type { Collector } from '@walkeros/core';\nimport { initSource } from './source';\nimport { registerDestination } from './destination';\n\n/**\n * Activate pending sources and destinations whose require conditions are met.\n * Called from onApply after each non-vetoed event.\n *\n * Mutates require arrays in place — removes the fulfilled event type.\n * When require is empty, initializes and moves to active maps.\n *\n * Re-entrancy safe: delete-before-init ensures nested calls see clean state.\n */\nexport async function activatePending(\n collector: Collector.Instance,\n type: string,\n): Promise<void> {\n for (const [id, def] of Object.entries(collector.pending.sources)) {\n // Re-entrancy guard: skip if already processed by nested call\n if (!collector.pending.sources[id] || collector.sources[id]) continue;\n\n const require = def.config?.require;\n if (!require) continue;\n\n const idx = require.indexOf(type);\n if (idx === -1) continue;\n require.splice(idx, 1);\n\n if (require.length > 0) continue;\n\n delete collector.pending.sources[id];\n const instance = await initSource(collector, id, def);\n if (instance) collector.sources[id] = instance;\n }\n\n for (const [id, def] of Object.entries(collector.pending.destinations)) {\n if (!collector.pending.destinations[id] || collector.destinations[id])\n continue;\n\n const require = def.config?.require;\n if (!require) continue;\n\n const idx = require.indexOf(type);\n if (idx === -1) continue;\n require.splice(idx, 1);\n\n if (require.length > 0) continue;\n\n delete collector.pending.destinations[id];\n const instance = registerDestination(def);\n if (instance.config.queue !== false) {\n instance.queuePush = [...collector.queue];\n }\n collector.destinations[id] = instance;\n }\n}\n","import type { Collector, WalkerOS, Destination, Elb, On } from '@walkeros/core';\nimport { Const } from './constants';\nimport {\n addDestination,\n pushToDestinations,\n createPushResult,\n} from './destination';\nimport { assign, getId, isFunction, isString } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport { processConsent } from './consent';\nimport { on, onApply } from './on';\nimport type { RunState } from './types/collector';\n\n/**\n * Handles common commands.\n *\n * @param collector The walkerOS collector instance.\n * @param action The action to handle.\n * @param data The data to handle.\n * @param options The options to handle.\n * @returns A promise that resolves with the push result or undefined.\n */\nexport async function commonHandleCommand(\n collector: Collector.Instance,\n action: string,\n data?: unknown,\n options?: unknown,\n): Promise<Elb.PushResult> {\n let result: Elb.PushResult | undefined;\n let onData: unknown;\n let shouldNotify = false;\n let consentRunQueue = false;\n\n switch (action) {\n case Const.Commands.Config:\n if (isObject(data)) {\n assign(collector.config, data as Partial<Collector.Config>, {\n shallow: false,\n });\n onData = data;\n shouldNotify = true;\n }\n break;\n\n case Const.Commands.Consent:\n if (isObject(data)) {\n const { update, runQueue } = processConsent(\n collector,\n data as WalkerOS.Consent,\n );\n onData = update;\n shouldNotify = true;\n consentRunQueue = runQueue;\n }\n break;\n\n case Const.Commands.Custom:\n if (isObject(data)) {\n collector.custom = assign(\n collector.custom,\n data as WalkerOS.Properties,\n );\n onData = data;\n shouldNotify = true;\n }\n break;\n\n case Const.Commands.Destination:\n if (isObject(data)) {\n // Support both { code, before } format and legacy { push } format\n if ('code' in data && isObject((data as Destination.Init).code)) {\n // New format: { code, before?, config?, env? }\n result = await addDestination(\n collector,\n data as Destination.Init,\n options as Destination.Config,\n );\n } else if (isFunction(data.push)) {\n // Legacy format: direct destination instance\n result = await addDestination(\n collector,\n { code: data as unknown as Destination.Instance },\n options as Destination.Config,\n );\n }\n }\n break;\n\n case Const.Commands.Globals:\n if (isObject(data)) {\n collector.globals = assign(\n collector.globals,\n data as WalkerOS.Properties,\n );\n onData = data;\n shouldNotify = true;\n }\n break;\n\n case Const.Commands.On:\n if (isString(data)) {\n await on(\n collector,\n data as On.Types,\n options as WalkerOS.SingleOrArray<On.Options>,\n );\n // on() handles its own onApply (fires only new callbacks)\n }\n break;\n\n case Const.Commands.Ready:\n shouldNotify = true;\n break;\n\n case Const.Commands.Run:\n result = await runCollector(collector, data as RunState);\n shouldNotify = true;\n break;\n\n case Const.Commands.Session:\n shouldNotify = true;\n break;\n\n case Const.Commands.User:\n if (isObject(data)) {\n assign(collector.user, data as WalkerOS.User, { shallow: false });\n onData = data;\n shouldNotify = true;\n }\n break;\n }\n\n // Single notification point for all state-mutation commands\n if (shouldNotify) {\n await onApply(collector, action as On.Types, undefined, onData);\n }\n\n // Post-notification side effects\n if (consentRunQueue) {\n result = await pushToDestinations(collector);\n }\n\n return result || createPushResult({ ok: true });\n}\n\n/**\n * Creates a full event from a partial event.\n *\n * @param collector The walkerOS collector instance.\n * @param partialEvent The partial event to transform.\n * @returns The full event.\n */\nexport function createEvent(\n collector: Collector.Instance,\n partialEvent: WalkerOS.PartialEvent,\n): WalkerOS.Event {\n if (!partialEvent.name) throw new Error('Event name is required');\n\n const [entityValue, actionValue] = partialEvent.name.split(' ');\n if (!entityValue || !actionValue) throw new Error('Event name is invalid');\n\n ++collector.count;\n\n const {\n timestamp = Date.now(),\n group = collector.group,\n count = collector.count,\n } = partialEvent;\n\n const {\n name = `${entityValue} ${actionValue}`,\n data = {},\n context = {},\n globals = collector.globals,\n custom = {},\n user = collector.user,\n nested = [],\n consent = collector.consent,\n id = `${timestamp}-${group}-${count}`,\n trigger = '',\n entity = entityValue,\n action = actionValue,\n timing = 0,\n version = {\n source: collector.version,\n tagging: collector.config.tagging || 0,\n },\n source = { type: 'collector', id: '', previous_id: '' },\n } = partialEvent;\n\n return {\n name,\n data,\n context,\n globals,\n custom,\n user,\n nested,\n consent,\n id,\n trigger,\n entity,\n action,\n timestamp,\n timing,\n group,\n count,\n version,\n source,\n };\n}\n\n/**\n * Runs the collector by setting it to allowed state and processing queued events.\n *\n * @param collector The walkerOS collector instance.\n * @param state Optional state to merge with the collector (user, globals, consent, custom).\n * @returns A promise that resolves with the push result.\n */\nexport async function runCollector(\n collector: Collector.Instance,\n state?: RunState,\n): Promise<Elb.PushResult> {\n // Set the collector to allowed state\n collector.allowed = true;\n\n // Reset count and generate new group ID\n collector.count = 0;\n collector.group = getId();\n\n // Update timing for this run\n collector.timing = Date.now();\n\n // Update collector state if provided\n if (state) {\n // Update consent if provided\n if (state.consent) {\n collector.consent = assign(collector.consent, state.consent);\n }\n\n // Update user if provided\n if (state.user) {\n collector.user = assign(collector.user, state.user);\n }\n\n // Update globals if provided\n if (state.globals) {\n collector.globals = assign(\n collector.config.globalsStatic || {},\n state.globals,\n );\n }\n\n // Update custom if provided\n if (state.custom) {\n collector.custom = assign(collector.custom, state.custom);\n }\n }\n\n // Reset destination queues\n Object.values(collector.destinations).forEach((destination) => {\n destination.queuePush = [];\n });\n\n // Reset collector queue for this run\n collector.queue = [];\n\n // Increase round counter\n collector.round++;\n\n // Process any queued events now that the collector is allowed\n const result = await pushToDestinations(collector);\n\n return result;\n}\n","import type { Collector, WalkerOS, Elb } from '@walkeros/core';\nimport {\n getGrantedConsent,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { createEvent } from './handle';\nimport { pushToDestinations, createPushResult } from './destination';\nimport { runTransformerChain } from './transformer';\n\n/**\n * Creates the push function for the collector.\n * Handles source mapping, event creation, and routing to destinations.\n *\n * @param collector - The walkerOS collector instance\n * @param prepareEvent - Function to enrich partial events\n * @returns The push function\n */\nexport function createPush<T extends Collector.Instance>(\n collector: T,\n prepareEvent: (event: WalkerOS.DeepPartialEvent) => WalkerOS.PartialEvent,\n): Collector.PushFn {\n return useHooks(\n async (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n const pushStart = Date.now();\n const { id, ingest, mapping, preChain } = options;\n let partialEvent = event;\n\n // Freeze ingest for performance (pass by reference, no copying)\n const frozenIngest = ingest ? Object.freeze(ingest) : undefined;\n\n // Apply source mapping if provided in options\n if (mapping) {\n const processed = await processEventMapping(\n partialEvent,\n mapping,\n collector,\n );\n\n // Check ignore flag\n if (processed.ignore) {\n return createPushResult({ ok: true });\n }\n\n // Check consent requirements\n if (mapping.consent) {\n const grantedConsent = getGrantedConsent(\n mapping.consent,\n collector.consent,\n processed.event.consent as WalkerOS.Consent | undefined,\n );\n\n if (!grantedConsent) {\n return createPushResult({ ok: true });\n }\n }\n\n partialEvent = processed.event;\n }\n\n // Run pre-collector transformer chain if provided in options\n if (\n preChain?.length &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const processedEvent = await runTransformerChain(\n collector,\n collector.transformers,\n preChain,\n partialEvent,\n frozenIngest,\n );\n\n // Chain was stopped - event dropped\n if (processedEvent === null) {\n return createPushResult({ ok: true });\n }\n\n partialEvent = processedEvent;\n }\n\n // Prepare event (add timing, source info)\n const enrichedEvent = prepareEvent(partialEvent);\n\n // Create full event\n const fullEvent = createEvent(collector, enrichedEvent);\n\n // Push to destinations with id and ingest\n const result = await pushToDestinations(collector, fullEvent, {\n id,\n ingest: frozenIngest,\n });\n\n // Update source status\n if (id) {\n if (!collector.status.sources[id]) {\n collector.status.sources[id] = {\n count: 0,\n duration: 0,\n };\n }\n const sourceStatus = collector.status.sources[id];\n sourceStatus.count++;\n sourceStatus.lastAt = Date.now();\n sourceStatus.duration += Date.now() - pushStart;\n }\n\n return result;\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Push',\n collector.hooks,\n ) as Collector.PushFn;\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { HandleCommandFn } from './types/collector';\nimport { useHooks, tryCatchAsync } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the command function for the collector.\n * Handles walker commands (config, consent, destination, etc.)\n *\n * @param collector - The walkerOS collector instance\n * @param handleCommand - Command handler function\n * @returns The command function\n */\nexport function createCommand<T extends Collector.Instance>(\n collector: T,\n handleCommand: HandleCommandFn<T>,\n): Collector.CommandFn {\n return useHooks(\n async (\n command: string,\n data?: unknown,\n options?: unknown,\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n return await handleCommand(collector, command, data, options);\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Command',\n collector.hooks,\n ) as Collector.CommandFn;\n}\n","import type { Collector, Source, WalkerOS, Elb } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the default ELB source.\n * Routes between collector.push and collector.command based on input.\n * Provides backward-compatible flexible argument interface.\n *\n * @param collector - The walkerOS collector instance\n * @returns ELB source instance\n */\nexport function createElbSource(\n collector: Collector.Instance,\n): Source.Instance {\n return {\n type: 'elb',\n config: {},\n\n // The push function is the elb() interface users interact with\n push: async (\n eventOrCommand?: unknown,\n data?: unknown,\n options?: unknown,\n context?: unknown,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n ): Promise<Elb.PushResult> => {\n // Detect walker commands\n if (\n typeof eventOrCommand === 'string' &&\n eventOrCommand.startsWith('walker ')\n ) {\n const command = eventOrCommand.replace('walker ', '');\n return collector.command(command, data, options);\n }\n\n // Build event object\n let event: WalkerOS.DeepPartialEvent;\n\n if (typeof eventOrCommand === 'string') {\n // Convert string to object: elb('page view', { title: 'Home' })\n event = { name: eventOrCommand };\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = data as WalkerOS.Properties;\n }\n } else if (eventOrCommand && typeof eventOrCommand === 'object') {\n // Use object directly: elb({ name: 'page view', data: {...} })\n event = eventOrCommand as WalkerOS.DeepPartialEvent;\n // Merge additional data if provided\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = {\n ...(event.data || {}),\n ...(data as WalkerOS.Properties),\n };\n }\n } else {\n // Invalid input\n return createPushResult({ ok: false });\n }\n\n // Add optional properties if provided\n if (context && typeof context === 'object') {\n event.context = context as WalkerOS.OrderedProperties;\n }\n if (nested && Array.isArray(nested)) {\n event.nested = nested;\n }\n if (custom && typeof custom === 'object') {\n event.custom = custom as WalkerOS.Properties;\n }\n\n // Call collector.push with event object\n return collector.push(event);\n },\n };\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { StartFlow } from './types';\nimport { collector } from './collector';\nimport { createElbSource } from './elb';\nimport { initSources } from './source';\n\nexport async function startFlow<ElbPush extends Elb.Fn = Elb.Fn>(\n initConfig?: Collector.InitConfig,\n): Promise<StartFlow<ElbPush>> {\n initConfig = initConfig || {};\n const instance = await collector(initConfig);\n\n // Create and register ELB source first\n const elbSource = createElbSource(instance);\n instance.sources.elb = elbSource;\n\n // Now initialize other sources with ELB source available\n const additionalSources = await initSources(\n instance,\n initConfig.sources || {},\n );\n Object.assign(instance.sources, additionalSources);\n\n const { consent, user, globals, custom } = initConfig;\n\n if (consent) await instance.command('consent', consent);\n if (user) await instance.command('user', user);\n if (globals) Object.assign(instance.globals, globals);\n if (custom) Object.assign(instance.custom, custom);\n\n if (instance.config.run) await instance.command('run');\n\n // Determine the primary elb:\n // 1. Use explicitly marked primary source\n // 2. Use first non-elb source if any exist\n // 3. Fallback to ELB source\n let primaryElb: Elb.Fn = elbSource.push as Elb.Fn;\n\n const sources = Object.values(instance.sources).filter(\n (source) => source.type !== 'elb',\n );\n\n // First, check for explicitly marked primary source\n const markedPrimary = sources.find(\n (source) => (source.config as { primary?: boolean }).primary,\n );\n\n if (markedPrimary) {\n primaryElb = markedPrimary.push as Elb.Fn;\n } else if (sources.length > 0) {\n // Use first source as default\n primaryElb = sources[0].push as Elb.Fn;\n }\n\n return {\n collector: instance,\n elb: primaryElb as ElbPush,\n };\n}\n"],"mappings":"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","names":["collector","import_core","import_core","import_core","import_core","import_core","import_core","collector","initTransformers","collector","collector","require","collector","on","option","collector","event","isInitialized","batchState","import_core","collector","import_core","collector","import_core","collector","collector","collector"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var n={},e={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",User:"user",Walker:"walker"},o={Commands:e,Utils:{Storage:{Cookie:"cookie",Local:"local",Session:"session"}}};import{assign as t}from"@walkeros/core";import{assign as s,clone as r,debounce as i,getId as a,getGrantedConsent as c,isDefined as u,isFunction as f,isObject as l,processEventMapping as g,tryCatchAsync as d,useHooks as m}from"@walkeros/core";import{isArray as p}from"@walkeros/core";import{tryCatch as h}from"@walkeros/core";function b(n,e,o){const t=n.on,s=t[e]||[],r=p(o)?o:[o];r.forEach(n=>{s.push(n)}),t[e]=s,k(n,e,r)}function y(n,e,o,t,s){if(!e.on)return;const r=e.type||"unknown",i=n.logger.scope(r).scope("on").scope(t),a={collector:n,logger:i,id:o,config:e.config,data:s,env:T(e.env,e.config.env)};h(e.on)(t,a)}function k(n,e,t,s){let r,i=t||[];switch(t||(i=n.on[e]||[]),e){case o.Commands.Consent:r=s||n.consent;break;case o.Commands.Session:r=n.session;break;case o.Commands.Ready:case o.Commands.Run:default:r=void 0}if(Object.values(n.sources).forEach(n=>{n.on&&h(n.on)(e,r)}),Object.entries(n.destinations).forEach(([o,t])=>{if(t.on){if(!t.config.init)return t.queueOn=t.queueOn||[],void t.queueOn.push({type:e,data:r});y(n,t,o,e,r)}}),i.length)switch(e){case o.Commands.Consent:!function(n,e,o){const t=o||n.consent;e.forEach(e=>{Object.keys(t).filter(n=>n in e).forEach(o=>{h(e[o])(n,t)})})}(n,i,s);break;case o.Commands.Ready:case o.Commands.Run:!function(n,e){n.allowed&&e.forEach(e=>{h(e)(n)})}(n,i);break;case o.Commands.Session:!function(n,e){if(!n.session)return;e.forEach(e=>{h(e)(n,n.session)})}(n,i)}}import{isObject as w,tryCatchAsync as v,useHooks as C}from"@walkeros/core";function O(n){const e={};for(const[o,t]of Object.entries(n))t.config?.next?e[o]={next:t.config.next}:e[o]={};return e}function q(n,e){const o=n.config||{},t=n[e];return void 0!==t?{config:{...o,[e]:t},chainValue:t}:{config:o,chainValue:void 0}}function j(n,e={}){if(!n)return[];if(Array.isArray(n))return n;const o=[],t=new Set;let s=n;for(;s&&e[s]&&!t.has(s);){t.add(s),o.push(s);const n=e[s].next;if(Array.isArray(n)){o.push(...n);break}s=n}return o}async function A(n,e,o){if(e.init&&!e.config.init){const t=e.type||"unknown",s=n.logger.scope(`transformer:${t}`),r={collector:n,logger:s,id:o,config:e.config,env:x(e.config.env)};s.debug("init");const i=await C(e.init,"TransformerInit",n.hooks)(r);if(!1===i)return!1;e.config={...i||e.config,init:!0},s.debug("init done")}return!0}async function P(n,e,o,t,s){const r=e.type||"unknown",i=n.logger.scope(`transformer:${r}`),a={collector:n,logger:i,id:o,ingest:s,config:e.config,env:x(e.config.env)};i.debug("push",{event:t.name});const c=await C(e.push,"TransformerPush",n.hooks)(t,a);return i.debug("push done"),c}async function E(n,e,o,t,s){let r=t;for(const t of o){const o=e[t];if(!o){n.logger.info(`Transformer not found: ${t}`);continue}if(!await v(A)(n,o,t))return n.logger.info(`Transformer init failed: ${t}`),null;const i=await v(P,e=>(n.logger.scope(`transformer:${o.type||"unknown"}`).error("Push failed",{error:e}),!1))(n,o,t,r,s);if(!1===i)return null;void 0!==i&&(r=i)}return r}function x(n){return n&&w(n)?n:{}}async function S(n,e,o){const{code:t,config:s={},env:r={},before:i}=e;if(!f(t.push))return I({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||s||{init:!1},u=i?{...c,before:i}:c,l={...t,config:u,env:T(t.env,r)};let g=l.config.id;if(!g)do{g=a(4)}while(n.destinations[g]);return n.destinations[g]=l,!1!==l.config.queue&&(l.queuePush=[...n.queue]),D(n,void 0,{},{[g]:l})}async function D(n,e,o={},t){const{allowed:i,consent:a,globals:u,user:f}=n;if(!i)return I({ok:!1});e&&n.queue.push(e),t||(t=n.destinations);const l=await Promise.all(Object.entries(t||{}).map(async([t,i])=>{let l=(i.queuePush||[]).map(n=>({...n,consent:a}));if(i.queuePush=[],e){const n=r(e);l.push(n)}if(!l.length&&!i.queueOn?.length)return{id:t,destination:i,skipped:!0};if(!l.length&&i.queueOn?.length){const e=await d($)(n,i,t);return{id:t,destination:i,skipped:!e}}const g=[],m=l.filter(n=>{const e=c(i.config.consent,a,n.consent);return!e||(n.consent=e,g.push(n),!1)});if(i.queuePush.concat(m),!g.length)return{id:t,destination:i,queue:l};if(!await d($)(n,i,t))return{id:t,destination:i,queue:l};let p,h;i.dlq||(i.dlq=[]);const b=function(n,e){const o=n.config.before;return o?j(o,O(e)):[]}(i,n.transformers);return await Promise.all(g.map(async e=>{e.globals=s(u,e.globals),e.user=s(f,e.user);let r=e;if(b.length>0&&n.transformers&&Object.keys(n.transformers).length>0){const t=await E(n,n.transformers,b,e,o.ingest);if(null===t)return e;r=t}const a=await d(R,e=>{const o=i.type||"unknown";n.logger.scope(o).error("Push failed",{error:e,event:r.name}),p=e,i.dlq.push([r,e])})(n,i,t,r,o.ingest);return void 0!==a&&(h=a),e})),{id:t,destination:i,error:p,response:h}})),g={},m={},p={};for(const n of l){if(n.skipped)continue;const e=n.destination,o={type:e.type||"unknown",data:n.response};n.error?(o.error=n.error,p[n.id]=o):n.queue&&n.queue.length?(e.queuePush=(e.queuePush||[]).concat(n.queue),m[n.id]=o):g[n.id]=o}return I({event:e,...Object.keys(g).length&&{done:g},...Object.keys(m).length&&{queued:m},...Object.keys(p).length&&{failed:p}})}async function $(n,e,o){if(e.init&&!e.config.init){const t=e.type||"unknown",s=n.logger.scope(t),r={collector:n,logger:s,id:o,config:e.config,env:T(e.env,e.config.env)};s.debug("init");const i=await m(e.init,"DestinationInit",n.hooks)(r);if(!1===i)return i;if(e.config={...i||e.config,init:!0},e.queueOn?.length){const t=e.queueOn;e.queueOn=[];for(const{type:s,data:r}of t)y(n,e,o,s,r)}s.debug("init done")}return!0}async function R(n,e,o,t,s){const{config:r}=e,a=await g(t,r,n);if(a.ignore)return!1;const c=e.type||"unknown",f=n.logger.scope(c),l={collector:n,logger:f,id:o,config:r,data:a.data,rule:a.mapping,ingest:s,env:T(e.env,r.env)},d=a.mapping,p=a.mappingKey||"* *";if(!d?.batch||!e.pushBatch){f.debug("push",{event:a.event.name});const o=await m(e.push,"DestinationPush",n.hooks)(a.event,l);return f.debug("push done"),o}{if(e.batches=e.batches||{},!e.batches[p]){const t={key:p,events:[],data:[]};e.batches[p]={batched:t,batchFn:i(()=>{const t=e.batches[p].batched,i={collector:n,logger:f,id:o,config:r,data:void 0,rule:d,ingest:s,env:T(e.env,r.env)};f.debug("push batch",{events:t.events.length}),m(e.pushBatch,"DestinationPushBatch",n.hooks)(t,i),f.debug("push batch done"),t.events=[],t.data=[]},d.batch)}}const t=e.batches[p];t.batched.events.push(a.event),u(a.data)&&t.batched.data.push(a.data),t.batchFn()}return!0}function I(n){return{ok:!n?.failed,...n}}async function H(n,e={}){const o={};for(const[n,t]of Object.entries(e)){const{code:e,config:s={},env:r={}}=t,{config:i}=q(t,"before"),a={...e.config,...s,...i},c=T(e.env,r);o[n]={...e,config:a,env:c}}return o}function T(n,e){return n||e?e?n&&l(n)&&l(e)?{...n,...e}:e:n:{}}async function B(n,e){const{consent:o}=n;let s=!1;const r={};return Object.entries(e).forEach(([n,e])=>{const o=!!e;r[n]=o,s=s||o}),n.consent=t(o,r),k(n,"consent",void 0,r),s?D(n):I({ok:!0})}import{assign as G,createLogger as U}from"@walkeros/core";import{assign as F,getId as L,isString as M}from"@walkeros/core";import{isObject as V}from"@walkeros/core";async function W(n,e,t,s){let r;switch(e){case o.Commands.Config:V(t)&&F(n.config,t,{shallow:!1});break;case o.Commands.Consent:V(t)&&(r=await B(n,t));break;case o.Commands.Custom:V(t)&&(n.custom=F(n.custom,t));break;case o.Commands.Destination:V(t)&&"code"in t&&V(t.code)&&(r=await S(n,t,s));break;case o.Commands.Globals:V(t)&&(n.globals=F(n.globals,t));break;case o.Commands.On:M(t)&&b(n,t,s);break;case o.Commands.Ready:k(n,"ready");break;case o.Commands.Run:r=await z(n,t);break;case o.Commands.Session:k(n,"session");break;case o.Commands.User:V(t)&&F(n.user,t,{shallow:!1})}return r||I({ok:!0})}function _(n,e){if(!e.name)throw new Error("Event name is required");const[o,t]=e.name.split(" ");if(!o||!t)throw new Error("Event name is invalid");++n.count;const{timestamp:s=Date.now(),group:r=n.group,count:i=n.count}=e,{name:a=`${o} ${t}`,data:c={},context:u={},globals:f=n.globals,custom:l={},user:g=n.user,nested:d=[],consent:m=n.consent,id:p=`${s}-${r}-${i}`,trigger:h="",entity:b=o,action:y=t,timing:k=0,version:w={source:n.version,tagging:n.config.tagging||0},source:v={type:"collector",id:"",previous_id:""}}=e;return{name:a,data:c,context:u,globals:f,custom:l,user:g,nested:d,consent:m,id:p,trigger:h,entity:b,action:y,timestamp:s,timing:k,group:r,count:i,version:w,source:v}}async function z(n,e){n.allowed=!0,n.count=0,n.group=L(),n.timing=Date.now(),e&&(e.consent&&(n.consent=F(n.consent,e.consent)),e.user&&(n.user=F(n.user,e.user)),e.globals&&(n.globals=F(n.config.globalsStatic||{},e.globals)),e.custom&&(n.custom=F(n.custom,e.custom))),Object.values(n.destinations).forEach(n=>{n.queuePush=[]}),n.queue=[],n.round++;const o=await D(n);return k(n,"run"),o}import{getGrantedConsent as K,processEventMapping as J,tryCatchAsync as N,useHooks as Q}from"@walkeros/core";function X(n,e){return Q(async(o,t={})=>await N(async()=>{const{id:s,ingest:r,mapping:i,preChain:a}=t;let c=o;const u=r?Object.freeze(r):void 0;if(i){const e=await J(c,i,n);if(e.ignore)return I({ok:!0});if(i.consent){if(!K(i.consent,n.consent,e.event.consent))return I({ok:!0})}c=e.event}if(a?.length&&n.transformers&&Object.keys(n.transformers).length>0){const e=await E(n,n.transformers,a,c,u);if(null===e)return I({ok:!0});c=e}const f=e(c),l=_(n,f);return await D(n,l,{id:s,ingest:u})},()=>I({ok:!1}))(),"Push",n.hooks)}import{useHooks as Y,tryCatchAsync as Z}from"@walkeros/core";async function nn(n){const e=G({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},n,{merge:!1,extend:!1}),o={level:n.logger?.level,handler:n.logger?.handler},t=U(o),s={...e.globalsStatic,...n.globals},r={allowed:!1,config:e,consent:n.consent||{},count:0,custom:n.custom||{},destinations:{},transformers:{},globals:s,group:"",hooks:{},logger:t,on:{},queue:[],round:0,session:void 0,timing:Date.now(),user:n.user||{},version:"1.1.2",sources:{},push:void 0,command:void 0};return r.push=X(r,n=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...n})),r.command=function(n,e){return Y(async(o,t,s)=>await Z(async()=>await e(n,o,t,s),()=>I({ok:!1}))(),"Command",n.hooks)}(r,W),r.destinations=await H(0,n.destinations||{}),r.transformers=await async function(n,e={}){const o={};for(const[t,s]of Object.entries(e)){const{code:e,env:r={}}=s,{config:i}=q(s,"next"),a=n.logger.scope("transformer").scope(t),c={collector:n,logger:a,id:t,config:i,env:r},u=await e(c);o[t]=u}return o}(r,n.transformers||{}),r}import{getMappingValue as en,tryCatchAsync as on}from"@walkeros/core";async function tn(n,e={}){const o={};for(const[t,s]of Object.entries(e)){const{code:e,config:r={},env:i={},primary:a,next:c}=s;let u;const f=j(c,O(n.transformers)),l=(e,o={})=>n.push(e,{...o,id:t,ingest:u,mapping:r,preChain:f}),g=n.logger.scope("source").scope(t),d={push:l,command:n.command,sources:n.sources,elb:n.sources.elb.push,logger:g,...i},m={collector:n,logger:g,id:t,config:r,env:d,setIngest:async e=>{u=r.ingest?await en(e,r.ingest,{collector:n}):void 0}},p=await on(e)(m);if(!p)continue;const h=p.type||"unknown",b=n.logger.scope(h).scope(t);d.logger=b,a&&(p.config={...p.config,primary:a}),o[t]=p}return o}async function sn(n){n=n||{};const e=await nn(n),o=(t=e,{type:"elb",config:{},push:async(n,e,o,s,r,i)=>{if("string"==typeof n&&n.startsWith("walker ")){const s=n.replace("walker ","");return t.command(s,e,o)}let a;if("string"==typeof n)a={name:n},e&&"object"==typeof e&&!Array.isArray(e)&&(a.data=e);else{if(!n||"object"!=typeof n)return I({ok:!1});a=n,e&&"object"==typeof e&&!Array.isArray(e)&&(a.data={...a.data||{},...e})}return s&&"object"==typeof s&&(a.context=s),r&&Array.isArray(r)&&(a.nested=r),i&&"object"==typeof i&&(a.custom=i),t.push(a)}});var t;e.sources.elb=o;const s=await tn(e,n.sources||{});Object.assign(e.sources,s);const{consent:r,user:i,globals:a,custom:c}=n;r&&await e.command("consent",r),i&&await e.command("user",i),a&&Object.assign(e.globals,a),c&&Object.assign(e.custom,c),e.config.run&&await e.command("run");let u=o.push;const f=Object.values(e.sources).filter(n=>"elb"!==n.type),l=f.find(n=>n.config.primary);return l?u=l.push:f.length>0&&(u=f[0].push),{collector:e,elb:u}}export{n as Code,e as Commands,o as Const,S as addDestination,y as callDestinationOn,W as commonHandleCommand,_ as createEvent,X as createPush,I as createPushResult,$ as destinationInit,R as destinationPush,O as extractTransformerNextMap,H as initDestinations,tn as initSources,T as mergeEnvironments,b as on,k as onApply,D as pushToDestinations,z as runCollector,B as setConsent,sn as startFlow,j as walkChain};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
var n={},e={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",User:"user",Walker:"walker"},t={Commands:e,Utils:{Storage:{Cookie:"cookie",Local:"local",Session:"session"}}};import{assign as o}from"@walkeros/core";function s(n,e){let t=!1;const s={};return Object.entries(e).forEach(([n,e])=>{const o=!!e;s[n]=o,t=t||o}),n.consent=o(n.consent,s),{update:s,runQueue:t}}import{assign as i,createLogger as a}from"@walkeros/core";import{assign as r,clone as c,debounce as u,getId as f,getGrantedConsent as l,isDefined as g,isFunction as d,isObject as m,processEventMapping as p,tryCatchAsync as h,useHooks as b}from"@walkeros/core";import{isArray as y}from"@walkeros/core";import{tryCatch as w,tryCatchAsync as k}from"@walkeros/core";import{getMappingValue as v,tryCatchAsync as C}from"@walkeros/core";import{isObject as q,tryCatchAsync as O,useHooks as j}from"@walkeros/core";function A(n){const e={};for(const[t,o]of Object.entries(n))o.config?.next?e[t]={next:o.config.next}:e[t]={};return e}function D(n,e){const t=n.config||{},o=n[e];return void 0!==o?{config:{...t,[e]:o},chainValue:o}:{config:t,chainValue:void 0}}function P(n,e={}){if(!n)return[];if(Array.isArray(n))return n;const t=[],o=new Set;let s=n;for(;s&&e[s]&&!o.has(s);){o.add(s),t.push(s);const n=e[s].next;if(Array.isArray(n)){t.push(...n);break}s=n}return t}async function x(n,e,t){if(e.init&&!e.config.init){const o=e.type||"unknown",s=n.logger.scope(`transformer:${o}`),i={collector:n,logger:s,id:t,config:e.config,env:$(e.config.env)};s.debug("init");const a=await j(e.init,"TransformerInit",n.hooks)(i);if(!1===a)return!1;e.config={...a||e.config,init:!0},s.debug("init done")}return!0}async function E(n,e,t,o,s){const i=e.type||"unknown",a=n.logger.scope(`transformer:${i}`),r={collector:n,logger:a,id:t,ingest:s,config:e.config,env:$(e.config.env)};a.debug("push",{event:o.name});const c=await j(e.push,"TransformerPush",n.hooks)(o,r);return a.debug("push done"),c}async function S(n,e,t,o,s){let i=o;for(const o of t){const t=e[o];if(!t){n.logger.info(`Transformer not found: ${o}`);continue}if(!await O(x)(n,t,o))return n.logger.info(`Transformer init failed: ${o}`),null;const a=await O(E,e=>(n.logger.scope(`transformer:${t.type||"unknown"}`).error("Push failed",{error:e}),!1))(n,t,o,i,s);if(!1===a)return null;void 0!==a&&(i=a)}return i}function $(n){return n&&q(n)?n:{}}async function R(n,e,t){const{code:o,config:s={},env:i={},primary:a,next:r}=t;let c;const u=P(r,A(n.transformers)),f=n.logger.scope("source").scope(e),l={push:(t,o={})=>n.push(t,{...o,id:e,ingest:c,mapping:s,preChain:u}),command:n.command,sources:n.sources,elb:n.sources.elb.push,logger:f,...i},g={collector:n,logger:f,id:e,config:s,env:l,setIngest:async e=>{c=s.ingest?await v(e,s.ingest,{collector:n}):void 0}},d=await C(o)(g);if(!d)return;const m=d.type||"unknown",p=n.logger.scope(m).scope(e);return l.logger=p,a&&(d.config={...d.config,primary:a}),d}async function I(n,e={}){const t={};for(const[o,s]of Object.entries(e)){const{config:e={}}=s;if(e.require&&e.require.length>0){n.pending.sources[o]=s;continue}const i=await R(n,o,s);i&&(t[o]=i)}return t}async function G(n,e,t){const o=n.on,s=o[e]||[],i=y(t)?t:[t];i.forEach(n=>{s.push(n)}),o[e]=s,await T(n,e,i)}function H(n,e,t,o,s){if(!e.on)return;const i=e.type||"unknown",a=n.logger.scope(i).scope("on").scope(o),r={collector:n,logger:a,id:t,config:e.config,data:s,env:W(e.env,e.config.env)};w(e.on)(o,r)}async function T(n,e,o,s){let i,a=o||[];switch(o||(a=n.on[e]||[]),e){case t.Commands.Consent:i=s||n.consent;break;case t.Commands.Session:i=n.session;break;case t.Commands.User:i=s||n.user;break;case t.Commands.Custom:i=s||n.custom;break;case t.Commands.Globals:i=s||n.globals;break;case t.Commands.Config:i=s||n.config;break;case t.Commands.Ready:case t.Commands.Run:default:i=void 0}let r=!1;for(const t of Object.values(n.sources))if(t.on){!1===await k(t.on)(e,i)&&(r=!0)}if(Object.entries(n.destinations).forEach(([t,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:e,data:i});H(n,o,t,e,i)}}),(Object.keys(n.pending.sources).length>0||Object.keys(n.pending.destinations).length>0)&&await async function(n,e){for(const[t,o]of Object.entries(n.pending.sources)){if(!n.pending.sources[t]||n.sources[t])continue;const s=o.config?.require;if(!s)continue;const i=s.indexOf(e);if(-1===i)continue;if(s.splice(i,1),s.length>0)continue;delete n.pending.sources[t];const a=await R(n,t,o);a&&(n.sources[t]=a)}for(const[t,o]of Object.entries(n.pending.destinations)){if(!n.pending.destinations[t]||n.destinations[t])continue;const s=o.config?.require;if(!s)continue;const i=s.indexOf(e);if(-1===i)continue;if(s.splice(i,1),s.length>0)continue;delete n.pending.destinations[t];const a=Q(o);!1!==a.config.queue&&(a.queuePush=[...n.queue]),n.destinations[t]=a}}(n,e),!a.length)return!r;switch(e){case t.Commands.Consent:!function(n,e,t){const o=t||n.consent;e.forEach(e=>{Object.keys(o).filter(n=>n in e).forEach(t=>{w(e[t])(n,o)})})}(n,a,s);break;case t.Commands.Ready:case t.Commands.Run:!function(n,e){n.allowed&&e.forEach(e=>{w(e)(n)})}(n,a);break;case t.Commands.Session:!function(n,e){if(!n.session)return;e.forEach(e=>{w(e)(n,n.session)})}(n,a);break;default:a.forEach(e=>{"function"==typeof e&&w(e)(n,i)})}return!r}async function U(n,e,t){const{code:o,config:s={},env:i={},before:a}=e;if(!d(o.push))return M({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const r=t||s||{init:!1},c=a?{...r,before:a}:r,u={...o,config:c,env:W(o.env,i)};let l=u.config.id;if(!l)do{l=f(4)}while(n.destinations[l]);return n.destinations[l]=u,!1!==u.config.queue&&(u.queuePush=[...n.queue]),B(n,void 0,{},{[l]:u})}async function B(n,e,t={},o){const{allowed:s,consent:i,globals:a,user:u}=n;if(!s)return M({ok:!1});e&&(n.queue.push(e),n.status.in++),o||(o=n.destinations);const f=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{let f=(s.queuePush||[]).map(n=>({...n,consent:i}));if(s.queuePush=[],e){const n=c(e);f.push(n)}if(!f.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!f.length&&s.queueOn?.length){const e=await h(F)(n,s,o);return{id:o,destination:s,skipped:!e}}const g=[],d=f.filter(n=>{const e=l(s.config.consent,i,n.consent);return!e||(n.consent=e,g.push(n),!1)});if(s.queuePush.push(...d),!g.length)return{id:o,destination:s,queue:f};if(!await h(F)(n,s,o))return{id:o,destination:s,queue:f};let m,p;s.dlq||(s.dlq=[]);const b=function(n,e){const t=n.config.before;return t?P(t,A(e)):[]}(s,n.transformers);let y=0;return await Promise.all(g.map(async e=>{e.globals=r(a,e.globals),e.user=r(u,e.user);let i=e;if(b.length>0&&n.transformers&&Object.keys(n.transformers).length>0){const o=await S(n,n.transformers,b,e,t.ingest);if(null===o)return e;i=o}const c=Date.now(),f=await h(L,e=>{const t=s.type||"unknown";n.logger.scope(t).error("Push failed",{error:e,event:i.name}),m=e,s.dlq.push([i,e])})(n,s,o,i,t.ingest);return y+=Date.now()-c,void 0!==f&&(p=f),e})),{id:o,destination:s,error:m,response:p,totalDuration:y}})),g={},d={},m={};for(const e of f){if(e.skipped)continue;const t=e.destination,o={type:t.type||"unknown",data:e.response};n.status.destinations[e.id]||(n.status.destinations[e.id]={count:0,failed:0,duration:0});const s=n.status.destinations[e.id],i=Date.now();e.error?(o.error=e.error,m[e.id]=o,s.failed++,s.lastAt=i,s.duration+=e.totalDuration||0,n.status.failed++):e.queue&&e.queue.length?(t.queuePush=(t.queuePush||[]).concat(e.queue),d[e.id]=o):(g[e.id]=o,s.count++,s.lastAt=i,s.duration+=e.totalDuration||0,n.status.out++)}return M({event:e,...Object.keys(g).length&&{done:g},...Object.keys(d).length&&{queued:d},...Object.keys(m).length&&{failed:m}})}async function F(n,e,t){if(e.init&&!e.config.init){const o=e.type||"unknown",s=n.logger.scope(o),i={collector:n,logger:s,id:t,config:e.config,env:W(e.env,e.config.env)};s.debug("init");const a=await b(e.init,"DestinationInit",n.hooks)(i);if(!1===a)return a;if(e.config={...a||e.config,init:!0},e.queueOn?.length){const o=e.queueOn;e.queueOn=[];for(const{type:s,data:i}of o)H(n,e,t,s,i)}s.debug("init done")}return!0}async function L(n,e,t,o,s){const{config:i}=e,a=await p(o,i,n);if(a.ignore)return!1;const r=e.type||"unknown",c=n.logger.scope(r),f={collector:n,logger:c,id:t,config:i,data:a.data,rule:a.mapping,ingest:s,env:W(e.env,i.env)},l=a.mapping,d=a.mappingKey||"* *";if(!l?.batch||!e.pushBatch){c.debug("push",{event:a.event.name});const t=await b(e.push,"DestinationPush",n.hooks)(a.event,f);return c.debug("push done"),t}{if(e.batches=e.batches||{},!e.batches[d]){const o={key:d,events:[],data:[]};e.batches[d]={batched:o,batchFn:u(()=>{const o=e.batches[d].batched,a={collector:n,logger:c,id:t,config:i,data:void 0,rule:l,ingest:s,env:W(e.env,i.env)};c.debug("push batch",{events:o.events.length}),b(e.pushBatch,"DestinationPushBatch",n.hooks)(o,a),c.debug("push batch done"),o.events=[],o.data=[]},l.batch)}}const o=e.batches[d];o.batched.events.push(a.event),g(a.data)&&o.batched.data.push(a.data),o.batchFn()}return!0}function M(n){return{ok:!n?.failed,...n}}function Q(n){const{code:e,config:t={},env:o={}}=n,{config:s}=D(n,"before"),i={...e.config,...t,...s},a=W(e.env,o);return{...e,config:i,env:a}}async function V(n,e={}){const t={};for(const[o,s]of Object.entries(e))s.config?.require?.length?n.pending.destinations[o]=s:t[o]=Q(s);return t}function W(n,e){return n||e?e?n&&m(n)&&m(e)?{...n,...e}:e:n:{}}import{assign as _,getId as z,isFunction as K,isString as J}from"@walkeros/core";import{isObject as N}from"@walkeros/core";async function X(n,e,o,i){let a,r,c=!1,u=!1;switch(e){case t.Commands.Config:N(o)&&(_(n.config,o,{shallow:!1}),r=o,c=!0);break;case t.Commands.Consent:if(N(o)){const{update:e,runQueue:t}=s(n,o);r=e,c=!0,u=t}break;case t.Commands.Custom:N(o)&&(n.custom=_(n.custom,o),r=o,c=!0);break;case t.Commands.Destination:N(o)&&("code"in o&&N(o.code)?a=await U(n,o,i):K(o.push)&&(a=await U(n,{code:o},i)));break;case t.Commands.Globals:N(o)&&(n.globals=_(n.globals,o),r=o,c=!0);break;case t.Commands.On:J(o)&&await G(n,o,i);break;case t.Commands.Ready:c=!0;break;case t.Commands.Run:a=await Z(n,o),c=!0;break;case t.Commands.Session:c=!0;break;case t.Commands.User:N(o)&&(_(n.user,o,{shallow:!1}),r=o,c=!0)}return c&&await T(n,e,void 0,r),u&&(a=await B(n)),a||M({ok:!0})}function Y(n,e){if(!e.name)throw new Error("Event name is required");const[t,o]=e.name.split(" ");if(!t||!o)throw new Error("Event name is invalid");++n.count;const{timestamp:s=Date.now(),group:i=n.group,count:a=n.count}=e,{name:r=`${t} ${o}`,data:c={},context:u={},globals:f=n.globals,custom:l={},user:g=n.user,nested:d=[],consent:m=n.consent,id:p=`${s}-${i}-${a}`,trigger:h="",entity:b=t,action:y=o,timing:w=0,version:k={source:n.version,tagging:n.config.tagging||0},source:v={type:"collector",id:"",previous_id:""}}=e;return{name:r,data:c,context:u,globals:f,custom:l,user:g,nested:d,consent:m,id:p,trigger:h,entity:b,action:y,timestamp:s,timing:w,group:i,count:a,version:k,source:v}}async function Z(n,e){n.allowed=!0,n.count=0,n.group=z(),n.timing=Date.now(),e&&(e.consent&&(n.consent=_(n.consent,e.consent)),e.user&&(n.user=_(n.user,e.user)),e.globals&&(n.globals=_(n.config.globalsStatic||{},e.globals)),e.custom&&(n.custom=_(n.custom,e.custom))),Object.values(n.destinations).forEach(n=>{n.queuePush=[]}),n.queue=[],n.round++;return await B(n)}import{getGrantedConsent as nn,processEventMapping as en,tryCatchAsync as tn,useHooks as on}from"@walkeros/core";function sn(n,e){return on(async(t,o={})=>await tn(async()=>{const s=Date.now(),{id:i,ingest:a,mapping:r,preChain:c}=o;let u=t;const f=a?Object.freeze(a):void 0;if(r){const e=await en(u,r,n);if(e.ignore)return M({ok:!0});if(r.consent){if(!nn(r.consent,n.consent,e.event.consent))return M({ok:!0})}u=e.event}if(c?.length&&n.transformers&&Object.keys(n.transformers).length>0){const e=await S(n,n.transformers,c,u,f);if(null===e)return M({ok:!0});u=e}const l=e(u),g=Y(n,l),d=await B(n,g,{id:i,ingest:f});if(i){n.status.sources[i]||(n.status.sources[i]={count:0,duration:0});const e=n.status.sources[i];e.count++,e.lastAt=Date.now(),e.duration+=Date.now()-s}return d},()=>M({ok:!1}))(),"Push",n.hooks)}import{useHooks as an,tryCatchAsync as rn}from"@walkeros/core";async function cn(n){const e=i({globalsStatic:{},sessionStatic:{},tagging:0,run:!0},n,{merge:!1,extend:!1}),t={level:n.logger?.level,handler:n.logger?.handler},o=a(t),s={...e.globalsStatic,...n.globals},r={allowed:!1,config:e,consent:n.consent||{},count:0,custom:n.custom||{},destinations:{},transformers:{},globals:s,group:"",hooks:{},logger:o,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:n.user||{},version:"1.1.2",sources:{},pending:{sources:{},destinations:{}},push:void 0,command:void 0};return r.push=sn(r,n=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",id:"",previous_id:""},...n})),r.command=function(n,e){return an(async(t,o,s)=>await rn(async()=>await e(n,t,o,s),()=>M({ok:!1}))(),"Command",n.hooks)}(r,X),r.destinations=await V(r,n.destinations||{}),r.transformers=await async function(n,e={}){const t={};for(const[o,s]of Object.entries(e)){const{code:e,env:i={}}=s,{config:a}=D(s,"next"),r=n.logger.scope("transformer").scope(o),c={collector:n,logger:r,id:o,config:a,env:i},u=await e(c);t[o]=u}return t}(r,n.transformers||{}),r}async function un(n){n=n||{};const e=await cn(n),t=(o=e,{type:"elb",config:{},push:async(n,e,t,s,i,a)=>{if("string"==typeof n&&n.startsWith("walker ")){const s=n.replace("walker ","");return o.command(s,e,t)}let r;if("string"==typeof n)r={name:n},e&&"object"==typeof e&&!Array.isArray(e)&&(r.data=e);else{if(!n||"object"!=typeof n)return M({ok:!1});r=n,e&&"object"==typeof e&&!Array.isArray(e)&&(r.data={...r.data||{},...e})}return s&&"object"==typeof s&&(r.context=s),i&&Array.isArray(i)&&(r.nested=i),a&&"object"==typeof a&&(r.custom=a),o.push(r)}});var o;e.sources.elb=t;const s=await I(e,n.sources||{});Object.assign(e.sources,s);const{consent:i,user:a,globals:r,custom:c}=n;i&&await e.command("consent",i),a&&await e.command("user",a),r&&Object.assign(e.globals,r),c&&Object.assign(e.custom,c),e.config.run&&await e.command("run");let u=t.push;const f=Object.values(e.sources).filter(n=>"elb"!==n.type),l=f.find(n=>n.config.primary);return l?u=l.push:f.length>0&&(u=f[0].push),{collector:e,elb:u}}export{n as Code,e as Commands,t as Const,U as addDestination,H as callDestinationOn,X as commonHandleCommand,Y as createEvent,sn as createPush,M as createPushResult,F as destinationInit,L as destinationPush,A as extractTransformerNextMap,V as initDestinations,R as initSource,I as initSources,W as mergeEnvironments,G as on,T as onApply,s as processConsent,B as pushToDestinations,Q as registerDestination,Z as runCollector,un as startFlow,P as walkChain};//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/code.ts","../src/constants.ts","../src/consent.ts","../src/destination.ts","../src/on.ts","../src/transformer.ts","../src/collector.ts","../src/handle.ts","../src/push.ts","../src/command.ts","../src/elb.ts","../src/source.ts","../src/flow.ts"],"sourcesContent":["import type { Destination, Mapping, On, WalkerOS } from '@walkeros/core';\n\nexport interface Settings {\n scripts?: string[];\n init?: string;\n on?: string;\n push?: string;\n pushBatch?: string;\n}\n\nexport interface CodeMapping extends Mapping.Rule<CodeMapping> {\n push?: string;\n pushBatch?: string;\n}\n\nexport type Types = Destination.Types<Settings, CodeMapping>;\nexport type Config = Destination.Config<Types>;\nexport type Context = Destination.Context<Types>;\nexport type PushContext = Destination.PushContext<Types>;\nexport type PushBatchContext = Destination.PushBatchContext<Types>;\n\nexport type InitFn = (context: Context) => void;\nexport type OnFn = (type: On.Types, context: Context) => void;\nexport type PushFn = (event: WalkerOS.Event, context: PushContext) => void;\nexport type PushBatchFn = (\n batch: Destination.Batch<CodeMapping>,\n context: PushBatchContext,\n) => void;\n","import type { Collector } from '@walkeros/core';\nimport type { CommandTypes, StorageType } from './types/collector';\n\nexport const Commands: Record<CommandTypes, Collector.CommandType> = {\n Action: 'action',\n Actions: 'actions',\n Config: 'config',\n Consent: 'consent',\n Context: 'context',\n Custom: 'custom',\n Destination: 'destination',\n Elb: 'elb',\n Globals: 'globals',\n Hook: 'hook',\n Init: 'init',\n Link: 'link',\n On: 'on',\n Prefix: 'data-elb',\n Ready: 'ready',\n Run: 'run',\n Session: 'session',\n User: 'user',\n Walker: 'walker',\n} as const;\n\nconst UtilsStorage: { [key: string]: StorageType } = {\n Cookie: 'cookie',\n Local: 'local',\n Session: 'session',\n} as const;\n\nconst Utils = {\n Storage: UtilsStorage,\n};\n\nexport const Const = {\n Commands,\n Utils,\n};\n\nexport default Const;\n","import type { Collector, WalkerOS, Elb } from '@walkeros/core';\nimport { assign } from '@walkeros/core';\nimport { pushToDestinations, createPushResult } from './destination';\nimport { onApply } from './on';\n\n/**\n * Sets the consent state and processes the queue.\n *\n * @param collector - The walkerOS collector instance.\n * @param data - The consent data to set.\n * @returns The result of the push operation.\n */\nexport async function setConsent(\n collector: Collector.Instance,\n data: WalkerOS.Consent,\n): Promise<Elb.PushResult> {\n const { consent } = collector;\n\n let runQueue = false;\n const update: WalkerOS.Consent = {};\n Object.entries(data).forEach(([name, granted]) => {\n const state = !!granted;\n\n update[name] = state;\n\n // Only run queue if state was set to true\n runQueue = runQueue || state;\n });\n\n // Update consent state\n collector.consent = assign(consent, update);\n\n // Run on consent events\n onApply(collector, 'consent', undefined, update);\n\n // Process previous events if not disabled\n return runQueue\n ? pushToDestinations(collector)\n : createPushResult({ ok: true });\n}\n","import type {\n Collector,\n WalkerOS,\n Elb,\n Destination,\n Transformer,\n} from '@walkeros/core';\nimport {\n assign,\n clone,\n debounce,\n getId,\n getGrantedConsent,\n isDefined,\n isFunction,\n isObject,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { callDestinationOn } from './on';\nimport {\n runTransformerChain,\n walkChain,\n extractTransformerNextMap,\n extractChainProperty,\n} from './transformer';\n\n/**\n * Computes transformer chain for a destination on-demand.\n * Returns empty array if destination has no 'before' configured.\n */\nfunction getDestinationChain(\n destination: Destination.Instance,\n transformers: Transformer.Transformers,\n): string[] {\n const before = destination.config.before as string | string[] | undefined;\n if (!before) return [];\n return walkChain(before, extractTransformerNextMap(transformers));\n}\n\n/**\n * Adds a new destination to the collector.\n *\n * @param collector - The walkerOS collector instance.\n * @param data - The destination's init data.\n * @param options - The destination's config.\n * @returns The result of the push operation.\n */\nexport async function addDestination(\n collector: Collector.Instance,\n data: Destination.Init,\n options?: Destination.Config,\n): Promise<Elb.PushResult> {\n const { code, config: dataConfig = {}, env = {}, before } = data;\n\n // Validate that code has a push method\n if (!isFunction(code.push)) {\n return createPushResult({\n ok: false,\n failed: {\n invalid: {\n type: 'invalid',\n error: 'Destination code must have a push method',\n },\n },\n });\n }\n\n const baseConfig = options || dataConfig || { init: false };\n // Merge before into config if provided at root level\n const config = before ? { ...baseConfig, before } : baseConfig;\n\n const destination: Destination.Instance = {\n ...code,\n config,\n env: mergeEnvironments(code.env, env),\n };\n\n let id = destination.config.id; // Use given id\n if (!id) {\n // Generate a new id if none was given\n do {\n id = getId(4);\n } while (collector.destinations[id]);\n }\n\n // Add the destination\n collector.destinations[id] = destination;\n\n // Process previous events if not disabled\n if (destination.config.queue !== false)\n destination.queuePush = [...collector.queue];\n\n return pushToDestinations(collector, undefined, {}, { [id]: destination });\n}\n\n/**\n * Pushes an event to all or a subset of destinations.\n *\n * @param collector - The walkerOS collector instance.\n * @param event - The event to push.\n * @param meta - Optional metadata with id and ingest.\n * @param destinations - The destinations to push to.\n * @returns The result of the push operation.\n */\nexport async function pushToDestinations(\n collector: Collector.Instance,\n event?: WalkerOS.Event,\n meta: { id?: string; ingest?: unknown } = {},\n destinations?: Collector.Destinations,\n): Promise<Elb.PushResult> {\n const { allowed, consent, globals, user } = collector;\n\n // Check if collector is allowed to push\n if (!allowed) return createPushResult({ ok: false });\n\n // Add event to the collector queue\n if (event) collector.queue.push(event);\n\n // Use given destinations or use internal destinations\n if (!destinations) destinations = collector.destinations;\n\n const results = await Promise.all(\n // Process all destinations in parallel\n Object.entries(destinations || {}).map(async ([id, destination]) => {\n // Create a queue of events to be processed\n let currentQueue = (destination.queuePush || []).map((event) => ({\n ...event,\n consent,\n }));\n\n // Reset original queue while processing to enable async processing\n destination.queuePush = [];\n\n // Add event to queue stack\n if (event) {\n // Clone the event to avoid mutating the original event\n const currentEvent = clone(event);\n\n // Note: Policy is now applied in processEventMapping() within destinationPush()\n\n // Add event to queue stack\n currentQueue.push(currentEvent);\n }\n\n // If no events and no queued on events, skip this destination\n if (!currentQueue.length && !destination.queueOn?.length) {\n return { id, destination, skipped: true };\n }\n\n // If only on events queued (no push events), still init to flush queueOn\n if (!currentQueue.length && destination.queueOn?.length) {\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n return { id, destination, skipped: !isInitialized };\n }\n\n const allowedEvents: WalkerOS.Events = [];\n const skippedEvents = currentQueue.filter((queuedEvent) => {\n const grantedConsent = getGrantedConsent(\n destination.config.consent, // Required\n consent, // Current collector state\n queuedEvent.consent, // Individual event state\n );\n\n if (grantedConsent) {\n queuedEvent.consent = grantedConsent; // Save granted consent states only\n\n allowedEvents.push(queuedEvent); // Add to allowed queue\n return false; // Remove from destination queue\n }\n\n return true; // Keep denied events in the queue\n });\n\n // Add skipped events back to the queue\n destination.queuePush.concat(skippedEvents);\n\n // Execution shall not pass if no events are allowed\n if (!allowedEvents.length) {\n return { id, destination, queue: currentQueue }; // Don't push if not allowed\n }\n\n // Initialize the destination if needed\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n\n if (!isInitialized) return { id, destination, queue: currentQueue };\n\n // Process the destinations event queue\n let error: unknown;\n let response: unknown;\n if (!destination.dlq) destination.dlq = [];\n\n // Compute transformer chain on-demand from destination.before\n const postChain = getDestinationChain(\n destination,\n collector.transformers,\n );\n\n // Process allowed events and store failed ones in the dead letter queue (DLQ)\n await Promise.all(\n allowedEvents.map(async (event) => {\n // Merge event with collector state, prioritizing event properties\n event.globals = assign(globals, event.globals);\n event.user = assign(user, event.user);\n\n // Run post-collector transformer chain if configured for this destination\n let processedEvent: WalkerOS.Event | null = event;\n if (\n postChain.length > 0 &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const chainResult = await runTransformerChain(\n collector,\n collector.transformers,\n postChain,\n event,\n meta.ingest,\n );\n\n if (chainResult === null) {\n // Chain stopped - skip this event for this destination\n return event;\n }\n\n // Use the processed event (cast back to full Event type)\n processedEvent = chainResult as WalkerOS.Event;\n }\n\n const result = await tryCatchAsync(destinationPush, (err) => {\n // Log the error with destination scope\n const destType = destination.type || 'unknown';\n collector.logger.scope(destType).error('Push failed', {\n error: err,\n event: processedEvent!.name,\n });\n error = err; // oh no\n\n // Add failed event to destinations DLQ\n destination.dlq!.push([processedEvent!, err]);\n\n return undefined;\n })(collector, destination, id, processedEvent!, meta.ingest);\n\n // Capture the last response (for single event pushes)\n if (result !== undefined) response = result;\n\n return event;\n }),\n );\n\n return { id, destination, error, response };\n }),\n );\n\n // Build result objects\n const done: Record<string, Destination.Ref> = {};\n const queued: Record<string, Destination.Ref> = {};\n const failed: Record<string, Destination.Ref> = {};\n\n for (const result of results) {\n if (result.skipped) continue;\n\n const destination = result.destination;\n const ref: Destination.Ref = {\n type: destination.type || 'unknown',\n data: result.response, // Capture push() return value\n };\n\n if (result.error) {\n ref.error = result.error;\n failed[result.id] = ref;\n } else if (result.queue && result.queue.length) {\n destination.queuePush = (destination.queuePush || []).concat(\n result.queue,\n );\n queued[result.id] = ref;\n } else {\n done[result.id] = ref;\n }\n }\n\n return createPushResult({\n event,\n ...(Object.keys(done).length && { done }),\n ...(Object.keys(queued).length && { queued }),\n ...(Object.keys(failed).length && { failed }),\n });\n}\n\n/**\n * Initializes a destination.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to initialize.\n * @param destId - The destination ID.\n * @returns Whether the destination was initialized successfully.\n */\nexport async function destinationInit<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n): Promise<boolean> {\n // Check if the destination was initialized properly or try to do so\n if (destination.init && !destination.config.init) {\n // Create scoped logger for this destination: [type:id] or [unknown:id]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n destLogger.debug('init');\n\n const configResult = await useHooks(\n destination.init,\n 'DestinationInit',\n collector.hooks,\n )(context);\n\n // Actively check for errors (when false)\n if (configResult === false) return configResult; // don't push if init is false\n\n // Update the destination config if it was returned\n destination.config = {\n ...(configResult || destination.config),\n init: true, // Remember that the destination was initialized\n };\n\n // Flush queued on() events now that destination is initialized\n if (destination.queueOn?.length) {\n const queueOn = destination.queueOn;\n destination.queueOn = [];\n\n for (const { type, data } of queueOn) {\n callDestinationOn(collector, destination, destId, type, data);\n }\n }\n\n destLogger.debug('init done');\n }\n\n return true; // Destination is ready to push\n}\n\n/**\n * Pushes an event to a single destination.\n * Handles mapping, batching, and consent checks.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to push to.\n * @param destId - The destination ID.\n * @param event - The event to push.\n * @param ingest - Optional ingest metadata (frozen, same reference).\n * @returns Whether the event was pushed successfully.\n */\nexport async function destinationPush<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n event: WalkerOS.Event,\n ingest?: unknown,\n): Promise<unknown> {\n const { config } = destination;\n\n const processed = await processEventMapping(event, config, collector);\n\n if (processed.ignore) return false;\n\n // Create scoped logger for this destination: [type] or [unknown]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.PushContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n data: processed.data,\n rule: processed.mapping,\n ingest,\n env: mergeEnvironments(destination.env, config.env),\n };\n\n const eventMapping = processed.mapping;\n const mappingKey = processed.mappingKey || '* *';\n\n if (eventMapping?.batch && destination.pushBatch) {\n // Initialize batch registry on destination (not on shared mapping config)\n destination.batches = destination.batches || {};\n\n // Get or create batch state for this mapping key\n if (!destination.batches[mappingKey]) {\n const batched: Destination.Batch<unknown> = {\n key: mappingKey,\n events: [],\n data: [],\n };\n\n destination.batches[mappingKey] = {\n batched,\n batchFn: debounce(() => {\n const batchState = destination.batches![mappingKey];\n const currentBatched = batchState.batched;\n\n const batchContext: Destination.PushBatchContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n // Note: batch.data contains all transformed data; context.data is for single events\n data: undefined,\n rule: eventMapping, // Renamed from mapping to rule\n ingest, // Same frozen reference\n env: mergeEnvironments(destination.env, config.env),\n };\n\n destLogger.debug('push batch', {\n events: currentBatched.events.length,\n });\n\n useHooks(\n destination.pushBatch!,\n 'DestinationPushBatch',\n collector.hooks,\n )(currentBatched, batchContext);\n\n destLogger.debug('push batch done');\n\n // Reset batch\n currentBatched.events = [];\n currentBatched.data = [];\n }, eventMapping.batch),\n };\n }\n\n // Add event to batch\n const batchState = destination.batches[mappingKey];\n batchState.batched.events.push(processed.event);\n if (isDefined(processed.data)) batchState.batched.data.push(processed.data);\n\n // Trigger debounced batch\n batchState.batchFn();\n } else {\n destLogger.debug('push', { event: processed.event.name });\n\n // It's time to go to the destination's side now\n const response = await useHooks(\n destination.push,\n 'DestinationPush',\n collector.hooks,\n )(processed.event, context);\n\n destLogger.debug('push done');\n\n return response;\n }\n\n return true;\n}\n\n/**\n * Creates a standardized result object for push operations.\n *\n * @param partialResult - A partial result to merge with the default result.\n * @returns The push result.\n */\nexport function createPushResult(\n partialResult?: Partial<Elb.PushResult>,\n): Elb.PushResult {\n return {\n ok: !partialResult?.failed,\n ...partialResult,\n };\n}\n\n/**\n * Initializes a map of destinations using ONLY the unified code/config/env pattern.\n * Does NOT call destination.init() - that happens later during push with proper consent checks.\n *\n * @param destinations - The destinations to initialize.\n * @param collector - The collector instance for destination init context.\n * @returns The initialized destinations.\n */\nexport async function initDestinations(\n _collector: Collector.Instance,\n destinations: Destination.InitDestinations = {},\n): Promise<Collector.Destinations> {\n const result: Collector.Destinations = {};\n\n for (const [name, destinationDef] of Object.entries(destinations)) {\n const { code, config = {}, env = {} } = destinationDef;\n\n // Use unified chain property extractor\n const { config: configWithChain } = extractChainProperty(\n destinationDef,\n 'before',\n );\n\n const mergedConfig = {\n ...code.config,\n ...config,\n ...configWithChain,\n };\n\n const mergedEnv = mergeEnvironments(code.env, env);\n\n result[name] = {\n ...code,\n config: mergedConfig,\n env: mergedEnv,\n };\n }\n\n return result;\n}\n\n/**\n * Merges destination environment with config environment\n * Config env takes precedence over destination env for overrides\n */\nexport function mergeEnvironments(\n destinationEnv?: Destination.Env,\n configEnv?: Destination.Env,\n): Destination.Env {\n // If neither environment exists, return empty object\n if (!destinationEnv && !configEnv) return {};\n\n // If only one exists, return it\n if (!configEnv) return destinationEnv!;\n if (!destinationEnv) return configEnv;\n\n // Both exist - merge objects with configEnv taking precedence\n if (isObject(destinationEnv) && isObject(configEnv)) {\n return { ...destinationEnv, ...configEnv };\n }\n\n // If they're not both objects, config env overrides destination env\n return configEnv;\n}\n","import type { Collector, On, WalkerOS, Destination } from '@walkeros/core';\nimport { isArray } from '@walkeros/core';\nimport { Const } from './constants';\nimport { tryCatch } from '@walkeros/core';\nimport { mergeEnvironments } from './destination';\n\n/**\n * Registers a callback for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to listen for.\n * @param option The callback function or an array of callback functions.\n */\nexport function on(\n collector: Collector.Instance,\n type: On.Types,\n option: WalkerOS.SingleOrArray<On.Options>,\n) {\n const on = collector.on;\n const onType: Array<On.Options> = on[type] || [];\n const options = isArray(option) ? option : [option];\n\n options.forEach((option) => {\n onType.push(option);\n });\n\n // Update collector on state\n (on[type] as typeof onType) = onType;\n\n // Execute the on function directly\n onApply(collector, type, options);\n}\n\n/**\n * Calls a destination's on() handler with proper context.\n * Used by both onApply() for immediate calls and destinationInit() for flushing queued events.\n */\nexport function callDestinationOn(\n collector: Collector.Instance,\n destination: Destination.Instance,\n destId: string,\n type: On.Types,\n data: unknown,\n) {\n if (!destination.on) return;\n\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType).scope('on').scope(type);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n data: data as Destination.Data,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n tryCatch(destination.on)(type, context);\n}\n\n/**\n * Applies all registered callbacks for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to apply the callbacks for.\n * @param options The options for the callbacks.\n * @param config The consent configuration.\n */\nexport function onApply(\n collector: Collector.Instance,\n type: On.Types,\n options?: Array<On.Options>,\n config?: WalkerOS.Consent,\n) {\n // Use the optionally provided options\n let onConfig = options || [];\n\n if (!options) {\n // Get the collector on events\n onConfig = collector.on[type] || [];\n }\n\n // Calculate context data once for all sources and destinations\n let contextData: unknown;\n\n switch (type) {\n case Const.Commands.Consent:\n contextData = config || collector.consent;\n break;\n case Const.Commands.Session:\n contextData = collector.session;\n break;\n case Const.Commands.Ready:\n case Const.Commands.Run:\n default:\n contextData = undefined;\n break;\n }\n\n Object.values(collector.sources).forEach((source) => {\n if (source.on) {\n tryCatch(source.on)(type, contextData);\n }\n });\n\n Object.entries(collector.destinations).forEach(([destId, destination]) => {\n if (destination.on) {\n // Queue if destination not yet initialized\n if (!destination.config.init) {\n destination.queueOn = destination.queueOn || [];\n destination.queueOn.push({ type, data: contextData });\n return;\n }\n\n // Call immediately using shared helper\n callDestinationOn(collector, destination, destId, type, contextData);\n }\n });\n\n if (!onConfig.length) return; // No on-events registered, nothing to do\n\n switch (type) {\n case Const.Commands.Consent:\n onConsent(collector, onConfig as Array<On.ConsentConfig>, config);\n break;\n case Const.Commands.Ready:\n onReady(collector, onConfig as Array<On.ReadyConfig>);\n break;\n case Const.Commands.Run:\n onRun(collector, onConfig as Array<On.RunConfig>);\n break;\n case Const.Commands.Session:\n onSession(collector, onConfig as Array<On.SessionConfig>);\n break;\n default:\n break;\n }\n}\n\nfunction onConsent(\n collector: Collector.Instance,\n onConfig: Array<On.ConsentConfig>,\n currentConsent?: WalkerOS.Consent,\n): void {\n const consentState = currentConsent || collector.consent;\n\n onConfig.forEach((consentConfig) => {\n // Collect functions whose consent keys match the rule keys directly\n // Directly execute functions whose consent keys match the rule keys\n Object.keys(consentState) // consent keys\n .filter((consent) => consent in consentConfig) // check for matching rule keys\n .forEach((consent) => {\n // Execute the function\n tryCatch(consentConfig[consent])(collector, consentState);\n });\n });\n}\n\nfunction onReady(\n collector: Collector.Instance,\n onConfig: Array<On.ReadyConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onRun(\n collector: Collector.Instance,\n onConfig: Array<On.RunConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onSession(\n collector: Collector.Instance,\n onConfig: Array<On.SessionConfig>,\n): void {\n if (!collector.session) return;\n\n onConfig.forEach((func) => {\n tryCatch(func)(collector, collector.session);\n });\n}\n","/**\n * @module transformer\n *\n * Transformer Chain Utilities\n * ==========================\n *\n * This module provides the unified implementation for transformer chains in walkerOS.\n * Chains are used at two points in the data flow:\n *\n * 1. Pre-collector chains (source.next):\n * Source → [Transformer Chain] → Collector\n * Events are processed before the collector sees them.\n *\n * 2. Post-collector chains (destination.before):\n * Collector → [Transformer Chain] → Destination\n * Events are processed before reaching specific destinations.\n *\n * Key Functions:\n * - extractTransformerNextMap(): Extracts next links from transformer instances\n * - extractChainProperty(): Unified extraction of chain properties from definitions\n * - walkChain(): Resolves chain IDs from starting point\n * - runTransformerChain(): Executes a chain of transformers on an event\n *\n * Chain Resolution:\n * - String start: Walk transformer.next links until chain ends\n * - Array start: Use array directly (explicit chain, ignores transformer.next)\n *\n * Chain Termination:\n * - Transformer returns false → chain stops, event is dropped\n * - Transformer throws error → chain stops, event is dropped\n * - Transformer returns void → continue with unchanged event\n * - Transformer returns event → continue with modified event\n */\nimport type { Collector, Transformer, WalkerOS } from '@walkeros/core';\nimport { isObject, tryCatchAsync, useHooks } from '@walkeros/core';\n\n/**\n * Extracts transformer next configuration for chain walking.\n * Maps transformer instances to their config.next values.\n *\n * This is the single source of truth for extracting chain links.\n * Used by both source.ts (pre-collector chains) and destination.ts (post-collector chains).\n *\n * @param transformers - Map of transformer instances\n * @returns Map of transformer IDs to their next configuration\n */\nexport function extractTransformerNextMap(\n transformers: Transformer.Transformers,\n): Record<string, { next?: string | string[] }> {\n const result: Record<string, { next?: string | string[] }> = {};\n for (const [id, transformer] of Object.entries(transformers)) {\n if (transformer.config?.next) {\n result[id] = { next: transformer.config.next as string | string[] };\n } else {\n result[id] = {};\n }\n }\n return result;\n}\n\n/**\n * Extracts chain property from definition and merges into config.\n * Provides unified handling for source.next, destination.before, and transformer.next.\n *\n * @param definition - Component definition with optional chain property\n * @param propertyName - Name of chain property ('next' or 'before')\n * @returns Object with merged config and extracted chain value\n */\nexport function extractChainProperty<\n T extends { config?: Record<string, unknown>; [key: string]: unknown },\n>(\n definition: T,\n propertyName: 'next' | 'before',\n): {\n config: Record<string, unknown>;\n chainValue: string | string[] | undefined;\n} {\n const config = (definition.config || {}) as Record<string, unknown>;\n const chainValue = definition[propertyName] as string | string[] | undefined;\n\n if (chainValue !== undefined) {\n return {\n config: { ...config, [propertyName]: chainValue },\n chainValue,\n };\n }\n\n return { config, chainValue: undefined };\n}\n\n/**\n * Walks a transformer chain starting from a given transformer ID.\n * Returns ordered array of transformer IDs in the chain.\n *\n * Used for on-demand chain resolution:\n * - Called from destination.ts with destination.config.before\n * - Called from source.ts with source.config.next\n *\n * @param startId - First transformer in chain, or explicit array of transformer IDs\n * @param transformers - Available transformer configs with optional `next` field\n * @returns Ordered array of transformer IDs to execute\n *\n * @example\n * // Single transformer\n * walkChain('redact', { redact: {} }) // ['redact']\n *\n * @example\n * // Chain via next\n * walkChain('a', { a: { next: 'b' }, b: { next: 'c' }, c: {} }) // ['a', 'b', 'c']\n *\n * @example\n * // Explicit array\n * walkChain(['x', 'y'], {}) // ['x', 'y']\n */\nexport function walkChain(\n startId: string | string[] | undefined,\n transformers: Record<string, { next?: string | string[] }> = {},\n): string[] {\n if (!startId) return [];\n\n // If array provided, use it directly (explicit chain)\n if (Array.isArray(startId)) {\n return startId;\n }\n\n // Walk the chain via transformer.next links\n const chain: string[] = [];\n const visited = new Set<string>();\n let current: string | undefined = startId;\n\n while (current && transformers[current]) {\n if (visited.has(current)) {\n // Circular reference detected - stop walking\n break;\n }\n visited.add(current);\n chain.push(current);\n\n const next: string | string[] | undefined = transformers[current].next;\n\n // If transformer has array next, append it and stop walking\n if (Array.isArray(next)) {\n chain.push(...next);\n break;\n }\n\n current = next;\n }\n\n return chain;\n}\n\n/**\n * Initializes transformer instances from configuration.\n * Does NOT call transformer.init() - that happens lazily before first push.\n *\n * @param collector - The collector instance\n * @param initTransformers - Transformer initialization configurations\n * @returns Initialized transformer instances\n */\nexport async function initTransformers(\n collector: Collector.Instance,\n initTransformers: Transformer.InitTransformers = {},\n): Promise<Transformer.Transformers> {\n const result: Transformer.Transformers = {};\n\n for (const [transformerId, transformerDef] of Object.entries(\n initTransformers,\n )) {\n const { code, env = {} } = transformerDef;\n\n // Use unified chain property extractor\n const { config: configWithChain } = extractChainProperty(\n transformerDef,\n 'next',\n );\n\n // Build transformer context for init\n const transformerLogger = collector.logger\n .scope('transformer')\n .scope(transformerId);\n\n const context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: configWithChain,\n env: env as Transformer.Env,\n };\n\n // Initialize the transformer instance with context\n const instance = await code(context);\n\n result[transformerId] = instance;\n }\n\n return result;\n}\n\n/**\n * Initializes a transformer if it hasn't been initialized yet.\n * Called lazily before first push.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to initialize\n * @param transformerId - The transformer ID\n * @returns Whether initialization succeeded\n */\nexport async function transformerInit(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n): Promise<boolean> {\n // Check if already initialized\n if (transformer.init && !transformer.config.init) {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('init');\n\n const configResult = await useHooks(\n transformer.init,\n 'TransformerInit',\n collector.hooks,\n )(context);\n\n // Check for initialization failure\n if (configResult === false) return false;\n\n // Update config if returned\n transformer.config = {\n ...(configResult || transformer.config),\n init: true,\n };\n\n transformerLogger.debug('init done');\n }\n\n return true;\n}\n\n/**\n * Pushes an event through a single transformer.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to push to\n * @param transformerId - The transformer ID\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event, void for passthrough, or false to stop chain\n */\nexport async function transformerPush(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | false | void> {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n ingest, // Same frozen reference, no copying\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('push', { event: (event as { name?: string }).name });\n\n const result = await useHooks(\n transformer.push,\n 'TransformerPush',\n collector.hooks,\n )(event, context);\n\n transformerLogger.debug('push done');\n\n return result;\n}\n\n/**\n * Runs an event through a chain of transformers.\n *\n * @param collector - The collector instance with transformers\n * @param transformers - Map of transformer instances\n * @param chain - Ordered array of transformer IDs to execute\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event or null if chain was stopped\n */\nexport async function runTransformerChain(\n collector: Collector.Instance,\n transformers: Transformer.Transformers,\n chain: string[],\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | null> {\n let processedEvent = event;\n\n for (const transformerName of chain) {\n const transformer = transformers[transformerName];\n if (!transformer) {\n collector.logger.info(`Transformer not found: ${transformerName}`);\n continue;\n }\n\n // Initialize transformer if needed\n const isInitialized = await tryCatchAsync(transformerInit)(\n collector,\n transformer,\n transformerName,\n );\n\n if (!isInitialized) {\n collector.logger.info(`Transformer init failed: ${transformerName}`);\n return null; // Stop chain on init failure\n }\n\n // Run the transformer\n const result = (await tryCatchAsync(transformerPush, (err) => {\n collector.logger\n .scope(`transformer:${transformer.type || 'unknown'}`)\n .error('Push failed', { error: err });\n return false; // Stop chain on error\n })(collector, transformer, transformerName, processedEvent, ingest)) as\n | WalkerOS.DeepPartialEvent\n | false\n | void;\n\n // Handle result\n if (result === false) {\n // Transformer explicitly stopped the chain\n return null;\n }\n\n if (result !== undefined) {\n // Transformer returned a modified event\n processedEvent = result;\n }\n // If result is undefined (void), continue with current event unchanged\n }\n\n return processedEvent;\n}\n\n/**\n * Merges transformer environments.\n */\nfunction mergeTransformerEnvironments(\n configEnv?: Transformer.Env,\n): Transformer.Env {\n if (!configEnv) return {};\n if (isObject(configEnv)) return configEnv;\n return {};\n}\n","import type { Collector, Logger, WalkerOS } from '@walkeros/core';\nimport { assign, createLogger } from '@walkeros/core';\nimport { commonHandleCommand } from './handle';\nimport { initDestinations } from './destination';\nimport { initTransformers } from './transformer';\nimport { createPush } from './push';\nimport { createCommand } from './command';\nimport { initSources } from './source';\n\ndeclare const __VERSION__: string;\n\nexport async function collector(\n initConfig: Collector.InitConfig,\n): Promise<Collector.Instance> {\n const version = __VERSION__;\n\n const defaultConfig: Collector.Config = {\n globalsStatic: {},\n sessionStatic: {},\n tagging: 0,\n run: true,\n };\n\n const config: Collector.Config = assign(defaultConfig, initConfig, {\n merge: false,\n extend: false,\n });\n\n // Create logger with config from initConfig\n const loggerConfig: Logger.Config = {\n level: initConfig.logger?.level,\n handler: initConfig.logger?.handler,\n };\n const logger = createLogger(loggerConfig);\n\n // Enhanced globals with static globals from config\n const finalGlobals = { ...config.globalsStatic, ...initConfig.globals };\n\n const collector: Collector.Instance = {\n allowed: false,\n config,\n consent: initConfig.consent || {},\n count: 0,\n custom: initConfig.custom || {},\n destinations: {},\n transformers: {},\n globals: finalGlobals,\n group: '',\n hooks: {},\n logger,\n on: {},\n queue: [],\n round: 0,\n session: undefined,\n timing: Date.now(),\n user: initConfig.user || {},\n version,\n sources: {},\n push: undefined as unknown as Collector.PushFn, // Placeholder, will be set below\n command: undefined as unknown as Collector.CommandFn, // Placeholder, will be set below\n };\n\n // Set the push and command functions with the collector reference\n collector.push = createPush(\n collector,\n (event: WalkerOS.DeepPartialEvent): WalkerOS.PartialEvent =>\n ({\n timing: Math.round((Date.now() - collector.timing) / 10) / 100,\n source: { type: 'collector', id: '', previous_id: '' },\n ...event,\n }) as WalkerOS.PartialEvent,\n );\n\n collector.command = createCommand(collector, commonHandleCommand);\n\n // Initialize destinations after collector is fully created\n // Sources are initialized in startFlow after ELB source is created\n collector.destinations = await initDestinations(\n collector,\n initConfig.destinations || {},\n );\n\n // Initialize transformers\n collector.transformers = await initTransformers(\n collector,\n initConfig.transformers || {},\n );\n\n return collector;\n}\n","import type { Collector, WalkerOS, Destination, Elb, On } from '@walkeros/core';\nimport { Const } from './constants';\nimport {\n addDestination,\n pushToDestinations,\n createPushResult,\n} from './destination';\nimport { assign, getId, isString } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport { setConsent } from './consent';\nimport { on, onApply } from './on';\nimport type { RunState } from './types/collector';\n\n/**\n * Handles common commands.\n *\n * @param collector The walkerOS collector instance.\n * @param action The action to handle.\n * @param data The data to handle.\n * @param options The options to handle.\n * @returns A promise that resolves with the push result or undefined.\n */\nexport async function commonHandleCommand(\n collector: Collector.Instance,\n action: string,\n data?: unknown,\n options?: unknown,\n): Promise<Elb.PushResult> {\n let result: Elb.PushResult | undefined;\n switch (action) {\n case Const.Commands.Config:\n if (isObject(data)) {\n assign(collector.config, data as Partial<Collector.Config>, {\n shallow: false,\n });\n }\n break;\n\n case Const.Commands.Consent:\n if (isObject(data)) {\n result = await setConsent(collector, data as WalkerOS.Consent);\n }\n break;\n\n case Const.Commands.Custom:\n if (isObject(data)) {\n collector.custom = assign(\n collector.custom,\n data as WalkerOS.Properties,\n );\n }\n break;\n\n case Const.Commands.Destination:\n if (isObject(data)) {\n if ('code' in data && isObject((data as Destination.Init).code)) {\n result = await addDestination(\n collector,\n data as Destination.Init,\n options as Destination.Config,\n );\n }\n }\n break;\n\n case Const.Commands.Globals:\n if (isObject(data)) {\n collector.globals = assign(\n collector.globals,\n data as WalkerOS.Properties,\n );\n }\n break;\n\n case Const.Commands.On:\n if (isString(data)) {\n on(\n collector,\n data as On.Types,\n options as WalkerOS.SingleOrArray<On.Options>,\n );\n }\n break;\n\n case Const.Commands.Ready:\n onApply(collector, 'ready');\n break;\n\n case Const.Commands.Run:\n result = await runCollector(collector, data as RunState);\n break;\n\n case Const.Commands.Session:\n onApply(collector, 'session');\n break;\n\n case Const.Commands.User:\n if (isObject(data)) {\n assign(collector.user, data as WalkerOS.User, { shallow: false });\n }\n break;\n }\n\n return result || createPushResult({ ok: true });\n}\n\n/**\n * Creates a full event from a partial event.\n *\n * @param collector The walkerOS collector instance.\n * @param partialEvent The partial event to transform.\n * @returns The full event.\n */\nexport function createEvent(\n collector: Collector.Instance,\n partialEvent: WalkerOS.PartialEvent,\n): WalkerOS.Event {\n if (!partialEvent.name) throw new Error('Event name is required');\n\n const [entityValue, actionValue] = partialEvent.name.split(' ');\n if (!entityValue || !actionValue) throw new Error('Event name is invalid');\n\n ++collector.count;\n\n const {\n timestamp = Date.now(),\n group = collector.group,\n count = collector.count,\n } = partialEvent;\n\n const {\n name = `${entityValue} ${actionValue}`,\n data = {},\n context = {},\n globals = collector.globals,\n custom = {},\n user = collector.user,\n nested = [],\n consent = collector.consent,\n id = `${timestamp}-${group}-${count}`,\n trigger = '',\n entity = entityValue,\n action = actionValue,\n timing = 0,\n version = {\n source: collector.version,\n tagging: collector.config.tagging || 0,\n },\n source = { type: 'collector', id: '', previous_id: '' },\n } = partialEvent;\n\n return {\n name,\n data,\n context,\n globals,\n custom,\n user,\n nested,\n consent,\n id,\n trigger,\n entity,\n action,\n timestamp,\n timing,\n group,\n count,\n version,\n source,\n };\n}\n\n/**\n * Runs the collector by setting it to allowed state and processing queued events.\n *\n * @param collector The walkerOS collector instance.\n * @param state Optional state to merge with the collector (user, globals, consent, custom).\n * @returns A promise that resolves with the push result.\n */\nexport async function runCollector(\n collector: Collector.Instance,\n state?: RunState,\n): Promise<Elb.PushResult> {\n // Set the collector to allowed state\n collector.allowed = true;\n\n // Reset count and generate new group ID\n collector.count = 0;\n collector.group = getId();\n\n // Update timing for this run\n collector.timing = Date.now();\n\n // Update collector state if provided\n if (state) {\n // Update consent if provided\n if (state.consent) {\n collector.consent = assign(collector.consent, state.consent);\n }\n\n // Update user if provided\n if (state.user) {\n collector.user = assign(collector.user, state.user);\n }\n\n // Update globals if provided\n if (state.globals) {\n collector.globals = assign(\n collector.config.globalsStatic || {},\n state.globals,\n );\n }\n\n // Update custom if provided\n if (state.custom) {\n collector.custom = assign(collector.custom, state.custom);\n }\n }\n\n // Reset destination queues\n Object.values(collector.destinations).forEach((destination) => {\n destination.queuePush = [];\n });\n\n // Reset collector queue for this run\n collector.queue = [];\n\n // Increase round counter\n collector.round++;\n\n // Process any queued events now that the collector is allowed\n const result = await pushToDestinations(collector);\n\n // Call the predefined run events\n onApply(collector, 'run');\n\n return result;\n}\n","import type { Collector, WalkerOS, Elb } from '@walkeros/core';\nimport {\n getGrantedConsent,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { createEvent } from './handle';\nimport { pushToDestinations, createPushResult } from './destination';\nimport { runTransformerChain } from './transformer';\n\n/**\n * Creates the push function for the collector.\n * Handles source mapping, event creation, and routing to destinations.\n *\n * @param collector - The walkerOS collector instance\n * @param prepareEvent - Function to enrich partial events\n * @returns The push function\n */\nexport function createPush<T extends Collector.Instance>(\n collector: T,\n prepareEvent: (event: WalkerOS.DeepPartialEvent) => WalkerOS.PartialEvent,\n): Collector.PushFn {\n return useHooks(\n async (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n const { id, ingest, mapping, preChain } = options;\n let partialEvent = event;\n\n // Freeze ingest for performance (pass by reference, no copying)\n const frozenIngest = ingest ? Object.freeze(ingest) : undefined;\n\n // Apply source mapping if provided in options\n if (mapping) {\n const processed = await processEventMapping(\n partialEvent,\n mapping,\n collector,\n );\n\n // Check ignore flag\n if (processed.ignore) {\n return createPushResult({ ok: true });\n }\n\n // Check consent requirements\n if (mapping.consent) {\n const grantedConsent = getGrantedConsent(\n mapping.consent,\n collector.consent,\n processed.event.consent as WalkerOS.Consent | undefined,\n );\n\n if (!grantedConsent) {\n return createPushResult({ ok: true });\n }\n }\n\n partialEvent = processed.event;\n }\n\n // Run pre-collector transformer chain if provided in options\n if (\n preChain?.length &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const processedEvent = await runTransformerChain(\n collector,\n collector.transformers,\n preChain,\n partialEvent,\n frozenIngest,\n );\n\n // Chain was stopped - event dropped\n if (processedEvent === null) {\n return createPushResult({ ok: true });\n }\n\n partialEvent = processedEvent;\n }\n\n // Prepare event (add timing, source info)\n const enrichedEvent = prepareEvent(partialEvent);\n\n // Create full event\n const fullEvent = createEvent(collector, enrichedEvent);\n\n // Push to destinations with id and ingest\n return await pushToDestinations(collector, fullEvent, {\n id,\n ingest: frozenIngest,\n });\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Push',\n collector.hooks,\n ) as Collector.PushFn;\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { HandleCommandFn } from './types/collector';\nimport { useHooks, tryCatchAsync } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the command function for the collector.\n * Handles walker commands (config, consent, destination, etc.)\n *\n * @param collector - The walkerOS collector instance\n * @param handleCommand - Command handler function\n * @returns The command function\n */\nexport function createCommand<T extends Collector.Instance>(\n collector: T,\n handleCommand: HandleCommandFn<T>,\n): Collector.CommandFn {\n return useHooks(\n async (\n command: string,\n data?: unknown,\n options?: unknown,\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n return await handleCommand(collector, command, data, options);\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Command',\n collector.hooks,\n ) as Collector.CommandFn;\n}\n","import type { Collector, Source, WalkerOS, Elb } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the default ELB source.\n * Routes between collector.push and collector.command based on input.\n * Provides backward-compatible flexible argument interface.\n *\n * @param collector - The walkerOS collector instance\n * @returns ELB source instance\n */\nexport function createElbSource(\n collector: Collector.Instance,\n): Source.Instance {\n return {\n type: 'elb',\n config: {},\n\n // The push function is the elb() interface users interact with\n push: async (\n eventOrCommand?: unknown,\n data?: unknown,\n options?: unknown,\n context?: unknown,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n ): Promise<Elb.PushResult> => {\n // Detect walker commands\n if (\n typeof eventOrCommand === 'string' &&\n eventOrCommand.startsWith('walker ')\n ) {\n const command = eventOrCommand.replace('walker ', '');\n return collector.command(command, data, options);\n }\n\n // Build event object\n let event: WalkerOS.DeepPartialEvent;\n\n if (typeof eventOrCommand === 'string') {\n // Convert string to object: elb('page view', { title: 'Home' })\n event = { name: eventOrCommand };\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = data as WalkerOS.Properties;\n }\n } else if (eventOrCommand && typeof eventOrCommand === 'object') {\n // Use object directly: elb({ name: 'page view', data: {...} })\n event = eventOrCommand as WalkerOS.DeepPartialEvent;\n // Merge additional data if provided\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = {\n ...(event.data || {}),\n ...(data as WalkerOS.Properties),\n };\n }\n } else {\n // Invalid input\n return createPushResult({ ok: false });\n }\n\n // Add optional properties if provided\n if (context && typeof context === 'object') {\n event.context = context as WalkerOS.OrderedProperties;\n }\n if (nested && Array.isArray(nested)) {\n event.nested = nested;\n }\n if (custom && typeof custom === 'object') {\n event.custom = custom as WalkerOS.Properties;\n }\n\n // Call collector.push with event object\n return collector.push(event);\n },\n };\n}\n","import type { Collector, Source, WalkerOS } from '@walkeros/core';\nimport { getMappingValue, tryCatchAsync } from '@walkeros/core';\nimport { walkChain, extractTransformerNextMap } from './transformer';\n\n/**\n * Initialize sources using the code/config/env pattern\n *\n * @param collector - The WalkerOS collector instance\n * @param sources - Map of source definitions with code/config/env\n * @returns Initialized sources\n */\nexport async function initSources(\n collector: Collector.Instance,\n sources: Source.InitSources = {},\n): Promise<Collector.Sources> {\n const result: Collector.Sources = {};\n\n for (const [sourceId, sourceDefinition] of Object.entries(sources)) {\n const { code, config = {}, env = {}, primary, next } = sourceDefinition;\n\n // Track current ingest metadata (set per-request by setIngest)\n let currentIngest: unknown = undefined;\n\n // Resolve transformer chain for this source\n const preChain = walkChain(\n next,\n extractTransformerNextMap(collector.transformers),\n );\n\n // Create wrapped push that auto-applies source mapping config, preChain, and ingest\n const wrappedPush: Collector.PushFn = (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ) => {\n // Pass source config as mapping in options, plus resolved preChain, source id, and ingest\n return collector.push(event, {\n ...options,\n id: sourceId,\n ingest: currentIngest,\n mapping: config,\n preChain, // Source-specific transformer chain\n });\n };\n\n // Create initial logger scoped to sourceId (type will be added after init)\n const initialLogger = collector.logger.scope('source').scope(sourceId);\n\n const cleanEnv: Source.Env = {\n push: wrappedPush,\n command: collector.command,\n sources: collector.sources, // Provide access to all sources for chaining\n elb: collector.sources.elb.push, // ELB source is always available\n logger: initialLogger,\n ...env,\n };\n\n /**\n * setIngest extracts metadata from raw request using config.ingest mapping.\n * Opt-in: returns early if no config.ingest is defined.\n */\n const setIngest = async (value: unknown): Promise<void> => {\n // Opt-in barrier: no processing when ingest not configured\n if (!config.ingest) {\n currentIngest = undefined;\n return;\n }\n\n currentIngest = await getMappingValue(value, config.ingest, {\n collector,\n });\n };\n\n // Build source context for init\n const sourceContext: Source.Context = {\n collector,\n logger: initialLogger,\n id: sourceId,\n config,\n env: cleanEnv,\n setIngest,\n };\n\n // Call source function with context\n const sourceInstance = await tryCatchAsync(code)(sourceContext);\n\n if (!sourceInstance) continue; // Skip failed source initialization\n\n // Update logger with actual source type: [type:sourceId] or [unknown:sourceId]\n const sourceType = sourceInstance.type || 'unknown';\n const sourceLogger = collector.logger.scope(sourceType).scope(sourceId);\n cleanEnv.logger = sourceLogger;\n\n // Store the primary flag in the source config for later access\n if (primary) {\n sourceInstance.config = { ...sourceInstance.config, primary };\n }\n\n result[sourceId] = sourceInstance;\n }\n\n return result;\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { StartFlow } from './types';\nimport { collector } from './collector';\nimport { createElbSource } from './elb';\nimport { initSources } from './source';\n\nexport async function startFlow<ElbPush extends Elb.Fn = Elb.Fn>(\n initConfig?: Collector.InitConfig,\n): Promise<StartFlow<ElbPush>> {\n initConfig = initConfig || {};\n const instance = await collector(initConfig);\n\n // Create and register ELB source first\n const elbSource = createElbSource(instance);\n instance.sources.elb = elbSource;\n\n // Now initialize other sources with ELB source available\n const additionalSources = await initSources(\n instance,\n initConfig.sources || {},\n );\n Object.assign(instance.sources, additionalSources);\n\n const { consent, user, globals, custom } = initConfig;\n\n if (consent) await instance.command('consent', consent);\n if (user) await instance.command('user', user);\n if (globals) Object.assign(instance.globals, globals);\n if (custom) Object.assign(instance.custom, custom);\n\n if (instance.config.run) await instance.command('run');\n\n // Determine the primary elb:\n // 1. Use explicitly marked primary source\n // 2. Use first non-elb source if any exist\n // 3. Fallback to ELB source\n let primaryElb: Elb.Fn = elbSource.push as Elb.Fn;\n\n const sources = Object.values(instance.sources).filter(\n (source) => source.type !== 'elb',\n );\n\n // First, check for explicitly marked primary source\n const markedPrimary = sources.find(\n (source) => (source.config as { primary?: boolean }).primary,\n );\n\n if (markedPrimary) {\n primaryElb = markedPrimary.push as Elb.Fn;\n } else if (sources.length > 0) {\n // Use first source as default\n primaryElb = sources[0].push as Elb.Fn;\n }\n\n return {\n collector: instance,\n elb: primaryElb as ElbPush,\n };\n}\n"],"mappings":";AAAA;;;ACGO,IAAM,WAAwD;AAAA,EACnE,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAM,eAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX;AAEA,IAAM,QAAQ;AAAA,EACZ,SAAS;AACX;AAEO,IAAM,QAAQ;AAAA,EACnB;AAAA,EACA;AACF;;;ACrCA,SAAS,UAAAA,eAAc;;;ACMvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,OACK;;;AClBP,SAAS,eAAe;AAExB,SAAS,gBAAgB;AAUlB,SAAS,GACdC,YACA,MACA,QACA;AACA,QAAMC,MAAKD,WAAU;AACrB,QAAM,SAA4BC,IAAG,IAAI,KAAK,CAAC;AAC/C,QAAM,UAAU,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAElD,UAAQ,QAAQ,CAACC,YAAW;AAC1B,WAAO,KAAKA,OAAM;AAAA,EACpB,CAAC;AAGD,EAACD,IAAG,IAAI,IAAsB;AAG9B,UAAQD,YAAW,MAAM,OAAO;AAClC;AAMO,SAAS,kBACdA,YACA,aACA,QACA,MACA,MACA;AACA,MAAI,CAAC,YAAY,GAAI;AAErB,QAAM,WAAW,YAAY,QAAQ;AACrC,QAAM,aAAaA,WAAU,OAAO,MAAM,QAAQ,EAAE,MAAM,IAAI,EAAE,MAAM,IAAI;AAE1E,QAAM,UAA+B;AAAA,IACnC,WAAAA;AAAA,IACA,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ,YAAY;AAAA,IACpB;AAAA,IACA,KAAK,kBAAkB,YAAY,KAAK,YAAY,OAAO,GAAG;AAAA,EAChE;AAEA,WAAS,YAAY,EAAE,EAAE,MAAM,OAAO;AACxC;AAUO,SAAS,QACdA,YACA,MACA,SACA,QACA;AAEA,MAAI,WAAW,WAAW,CAAC;AAE3B,MAAI,CAAC,SAAS;AAEZ,eAAWA,WAAU,GAAG,IAAI,KAAK,CAAC;AAAA,EACpC;AAGA,MAAI;AAEJ,UAAQ,MAAM;AAAA,IACZ,KAAK,MAAM,SAAS;AAClB,oBAAc,UAAUA,WAAU;AAClC;AAAA,IACF,KAAK,MAAM,SAAS;AAClB,oBAAcA,WAAU;AACxB;AAAA,IACF,KAAK,MAAM,SAAS;AAAA,IACpB,KAAK,MAAM,SAAS;AAAA,IACpB;AACE,oBAAc;AACd;AAAA,EACJ;AAEA,SAAO,OAAOA,WAAU,OAAO,EAAE,QAAQ,CAAC,WAAW;AACnD,QAAI,OAAO,IAAI;AACb,eAAS,OAAO,EAAE,EAAE,MAAM,WAAW;AAAA,IACvC;AAAA,EACF,CAAC;AAED,SAAO,QAAQA,WAAU,YAAY,EAAE,QAAQ,CAAC,CAAC,QAAQ,WAAW,MAAM;AACxE,QAAI,YAAY,IAAI;AAElB,UAAI,CAAC,YAAY,OAAO,MAAM;AAC5B,oBAAY,UAAU,YAAY,WAAW,CAAC;AAC9C,oBAAY,QAAQ,KAAK,EAAE,MAAM,MAAM,YAAY,CAAC;AACpD;AAAA,MACF;AAGA,wBAAkBA,YAAW,aAAa,QAAQ,MAAM,WAAW;AAAA,IACrE;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,OAAQ;AAEtB,UAAQ,MAAM;AAAA,IACZ,KAAK,MAAM,SAAS;AAClB,gBAAUA,YAAW,UAAqC,MAAM;AAChE;AAAA,IACF,KAAK,MAAM,SAAS;AAClB,cAAQA,YAAW,QAAiC;AACpD;AAAA,IACF,KAAK,MAAM,SAAS;AAClB,YAAMA,YAAW,QAA+B;AAChD;AAAA,IACF,KAAK,MAAM,SAAS;AAClB,gBAAUA,YAAW,QAAmC;AACxD;AAAA,IACF;AACE;AAAA,EACJ;AACF;AAEA,SAAS,UACPA,YACA,UACA,gBACM;AACN,QAAM,eAAe,kBAAkBA,WAAU;AAEjD,WAAS,QAAQ,CAAC,kBAAkB;AAGlC,WAAO,KAAK,YAAY,EACrB,OAAO,CAAC,YAAY,WAAW,aAAa,EAC5C,QAAQ,CAAC,YAAY;AAEpB,eAAS,cAAc,OAAO,CAAC,EAAEA,YAAW,YAAY;AAAA,IAC1D,CAAC;AAAA,EACL,CAAC;AACH;AAEA,SAAS,QACPA,YACA,UACM;AACN,MAAIA,WAAU;AACZ,aAAS,QAAQ,CAAC,SAAS;AACzB,eAAS,IAAI,EAAEA,UAAS;AAAA,IAC1B,CAAC;AACL;AAEA,SAAS,MACPA,YACA,UACM;AACN,MAAIA,WAAU;AACZ,aAAS,QAAQ,CAAC,SAAS;AACzB,eAAS,IAAI,EAAEA,UAAS;AAAA,IAC1B,CAAC;AACL;AAEA,SAAS,UACPA,YACA,UACM;AACN,MAAI,CAACA,WAAU,QAAS;AAExB,WAAS,QAAQ,CAAC,SAAS;AACzB,aAAS,IAAI,EAAEA,YAAWA,WAAU,OAAO;AAAA,EAC7C,CAAC;AACH;;;AC1JA,SAAS,UAAU,eAAe,gBAAgB;AAY3C,SAAS,0BACd,cAC8C;AAC9C,QAAM,SAAuD,CAAC;AAC9D,aAAW,CAAC,IAAI,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC5D,QAAI,YAAY,QAAQ,MAAM;AAC5B,aAAO,EAAE,IAAI,EAAE,MAAM,YAAY,OAAO,KAA0B;AAAA,IACpE,OAAO;AACL,aAAO,EAAE,IAAI,CAAC;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAAS,qBAGd,YACA,cAIA;AACA,QAAM,SAAU,WAAW,UAAU,CAAC;AACtC,QAAM,aAAa,WAAW,YAAY;AAE1C,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,MACL,QAAQ,EAAE,GAAG,QAAQ,CAAC,YAAY,GAAG,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,YAAY,OAAU;AACzC;AA0BO,SAAS,UACd,SACA,eAA6D,CAAC,GACpD;AACV,MAAI,CAAC,QAAS,QAAO,CAAC;AAGtB,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO;AAAA,EACT;AAGA,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI,UAA8B;AAElC,SAAO,WAAW,aAAa,OAAO,GAAG;AACvC,QAAI,QAAQ,IAAI,OAAO,GAAG;AAExB;AAAA,IACF;AACA,YAAQ,IAAI,OAAO;AACnB,UAAM,KAAK,OAAO;AAElB,UAAM,OAAsC,aAAa,OAAO,EAAE;AAGlE,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAM,KAAK,GAAG,IAAI;AAClB;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAUA,eAAsB,iBACpBG,YACAC,oBAAiD,CAAC,GACf;AACnC,QAAM,SAAmC,CAAC;AAE1C,aAAW,CAAC,eAAe,cAAc,KAAK,OAAO;AAAA,IACnDA;AAAA,EACF,GAAG;AACD,UAAM,EAAE,MAAM,MAAM,CAAC,EAAE,IAAI;AAG3B,UAAM,EAAE,QAAQ,gBAAgB,IAAI;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAGA,UAAM,oBAAoBD,WAAU,OACjC,MAAM,aAAa,EACnB,MAAM,aAAa;AAEtB,UAAM,UAAU;AAAA,MACd,WAAAA;AAAA,MACA,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,KAAK,OAAO;AAEnC,WAAO,aAAa,IAAI;AAAA,EAC1B;AAEA,SAAO;AACT;AAWA,eAAsB,gBACpBA,YACA,aACA,eACkB;AAElB,MAAI,YAAY,QAAQ,CAAC,YAAY,OAAO,MAAM;AAChD,UAAM,kBAAkB,YAAY,QAAQ;AAC5C,UAAM,oBAAoBA,WAAU,OAAO;AAAA,MACzC,eAAe,eAAe;AAAA,IAChC;AAEA,UAAM,UAA+B;AAAA,MACnC,WAAAA;AAAA,MACA,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ,YAAY;AAAA,MACpB,KAAK,6BAA6B,YAAY,OAAO,GAAG;AAAA,IAC1D;AAEA,sBAAkB,MAAM,MAAM;AAE9B,UAAM,eAAe,MAAM;AAAA,MACzB,YAAY;AAAA,MACZ;AAAA,MACAA,WAAU;AAAA,IACZ,EAAE,OAAO;AAGT,QAAI,iBAAiB,MAAO,QAAO;AAGnC,gBAAY,SAAS;AAAA,MACnB,GAAI,gBAAgB,YAAY;AAAA,MAChC,MAAM;AAAA,IACR;AAEA,sBAAkB,MAAM,WAAW;AAAA,EACrC;AAEA,SAAO;AACT;AAYA,eAAsB,gBACpBA,YACA,aACA,eACA,OACA,QACmD;AACnD,QAAM,kBAAkB,YAAY,QAAQ;AAC5C,QAAM,oBAAoBA,WAAU,OAAO;AAAA,IACzC,eAAe,eAAe;AAAA,EAChC;AAEA,QAAM,UAA+B;AAAA,IACnC,WAAAA;AAAA,IACA,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ;AAAA;AAAA,IACA,QAAQ,YAAY;AAAA,IACpB,KAAK,6BAA6B,YAAY,OAAO,GAAG;AAAA,EAC1D;AAEA,oBAAkB,MAAM,QAAQ,EAAE,OAAQ,MAA4B,KAAK,CAAC;AAE5E,QAAM,SAAS,MAAM;AAAA,IACnB,YAAY;AAAA,IACZ;AAAA,IACAA,WAAU;AAAA,EACZ,EAAE,OAAO,OAAO;AAEhB,oBAAkB,MAAM,WAAW;AAEnC,SAAO;AACT;AAYA,eAAsB,oBACpBA,YACA,cACA,OACA,OACA,QAC2C;AAC3C,MAAI,iBAAiB;AAErB,aAAW,mBAAmB,OAAO;AACnC,UAAM,cAAc,aAAa,eAAe;AAChD,QAAI,CAAC,aAAa;AAChB,MAAAA,WAAU,OAAO,KAAK,0BAA0B,eAAe,EAAE;AACjE;AAAA,IACF;AAGA,UAAM,gBAAgB,MAAM,cAAc,eAAe;AAAA,MACvDA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,eAAe;AAClB,MAAAA,WAAU,OAAO,KAAK,4BAA4B,eAAe,EAAE;AACnE,aAAO;AAAA,IACT;AAGA,UAAM,SAAU,MAAM,cAAc,iBAAiB,CAAC,QAAQ;AAC5D,MAAAA,WAAU,OACP,MAAM,eAAe,YAAY,QAAQ,SAAS,EAAE,EACpD,MAAM,eAAe,EAAE,OAAO,IAAI,CAAC;AACtC,aAAO;AAAA,IACT,CAAC,EAAEA,YAAW,aAAa,iBAAiB,gBAAgB,MAAM;AAMlE,QAAI,WAAW,OAAO;AAEpB,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,QAAW;AAExB,uBAAiB;AAAA,IACnB;AAAA,EAEF;AAEA,SAAO;AACT;AAKA,SAAS,6BACP,WACiB;AACjB,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,MAAI,SAAS,SAAS,EAAG,QAAO;AAChC,SAAO,CAAC;AACV;;;AFjVA,SAAS,oBACP,aACA,cACU;AACV,QAAM,SAAS,YAAY,OAAO;AAClC,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,SAAO,UAAU,QAAQ,0BAA0B,YAAY,CAAC;AAClE;AAUA,eAAsB,eACpBE,YACA,MACA,SACyB;AACzB,QAAM,EAAE,MAAM,QAAQ,aAAa,CAAC,GAAG,MAAM,CAAC,GAAG,OAAO,IAAI;AAG5D,MAAI,CAAC,WAAW,KAAK,IAAI,GAAG;AAC1B,WAAO,iBAAiB;AAAA,MACtB,IAAI;AAAA,MACJ,QAAQ;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,WAAW,cAAc,EAAE,MAAM,MAAM;AAE1D,QAAM,SAAS,SAAS,EAAE,GAAG,YAAY,OAAO,IAAI;AAEpD,QAAM,cAAoC;AAAA,IACxC,GAAG;AAAA,IACH;AAAA,IACA,KAAK,kBAAkB,KAAK,KAAK,GAAG;AAAA,EACtC;AAEA,MAAI,KAAK,YAAY,OAAO;AAC5B,MAAI,CAAC,IAAI;AAEP,OAAG;AACD,WAAK,MAAM,CAAC;AAAA,IACd,SAASA,WAAU,aAAa,EAAE;AAAA,EACpC;AAGA,EAAAA,WAAU,aAAa,EAAE,IAAI;AAG7B,MAAI,YAAY,OAAO,UAAU;AAC/B,gBAAY,YAAY,CAAC,GAAGA,WAAU,KAAK;AAE7C,SAAO,mBAAmBA,YAAW,QAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,YAAY,CAAC;AAC3E;AAWA,eAAsB,mBACpBA,YACA,OACA,OAA0C,CAAC,GAC3C,cACyB;AACzB,QAAM,EAAE,SAAS,SAAS,SAAS,KAAK,IAAIA;AAG5C,MAAI,CAAC,QAAS,QAAO,iBAAiB,EAAE,IAAI,MAAM,CAAC;AAGnD,MAAI,MAAO,CAAAA,WAAU,MAAM,KAAK,KAAK;AAGrC,MAAI,CAAC,aAAc,gBAAeA,WAAU;AAE5C,QAAM,UAAU,MAAM,QAAQ;AAAA;AAAA,IAE5B,OAAO,QAAQ,gBAAgB,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,WAAW,MAAM;AAElE,UAAI,gBAAgB,YAAY,aAAa,CAAC,GAAG,IAAI,CAACC,YAAW;AAAA,QAC/D,GAAGA;AAAA,QACH;AAAA,MACF,EAAE;AAGF,kBAAY,YAAY,CAAC;AAGzB,UAAI,OAAO;AAET,cAAM,eAAe,MAAM,KAAK;AAKhC,qBAAa,KAAK,YAAY;AAAA,MAChC;AAGA,UAAI,CAAC,aAAa,UAAU,CAAC,YAAY,SAAS,QAAQ;AACxD,eAAO,EAAE,IAAI,aAAa,SAAS,KAAK;AAAA,MAC1C;AAGA,UAAI,CAAC,aAAa,UAAU,YAAY,SAAS,QAAQ;AACvD,cAAMC,iBAAgB,MAAMC,eAAc,eAAe;AAAA,UACvDH;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,eAAO,EAAE,IAAI,aAAa,SAAS,CAACE,eAAc;AAAA,MACpD;AAEA,YAAM,gBAAiC,CAAC;AACxC,YAAM,gBAAgB,aAAa,OAAO,CAAC,gBAAgB;AACzD,cAAM,iBAAiB;AAAA,UACrB,YAAY,OAAO;AAAA;AAAA,UACnB;AAAA;AAAA,UACA,YAAY;AAAA;AAAA,QACd;AAEA,YAAI,gBAAgB;AAClB,sBAAY,UAAU;AAEtB,wBAAc,KAAK,WAAW;AAC9B,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT,CAAC;AAGD,kBAAY,UAAU,OAAO,aAAa;AAG1C,UAAI,CAAC,cAAc,QAAQ;AACzB,eAAO,EAAE,IAAI,aAAa,OAAO,aAAa;AAAA,MAChD;AAGA,YAAM,gBAAgB,MAAMC,eAAc,eAAe;AAAA,QACvDH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,cAAe,QAAO,EAAE,IAAI,aAAa,OAAO,aAAa;AAGlE,UAAI;AACJ,UAAI;AACJ,UAAI,CAAC,YAAY,IAAK,aAAY,MAAM,CAAC;AAGzC,YAAM,YAAY;AAAA,QAChB;AAAA,QACAA,WAAU;AAAA,MACZ;AAGA,YAAM,QAAQ;AAAA,QACZ,cAAc,IAAI,OAAOC,WAAU;AAEjC,UAAAA,OAAM,UAAU,OAAO,SAASA,OAAM,OAAO;AAC7C,UAAAA,OAAM,OAAO,OAAO,MAAMA,OAAM,IAAI;AAGpC,cAAI,iBAAwCA;AAC5C,cACE,UAAU,SAAS,KACnBD,WAAU,gBACV,OAAO,KAAKA,WAAU,YAAY,EAAE,SAAS,GAC7C;AACA,kBAAM,cAAc,MAAM;AAAA,cACxBA;AAAA,cACAA,WAAU;AAAA,cACV;AAAA,cACAC;AAAA,cACA,KAAK;AAAA,YACP;AAEA,gBAAI,gBAAgB,MAAM;AAExB,qBAAOA;AAAA,YACT;AAGA,6BAAiB;AAAA,UACnB;AAEA,gBAAM,SAAS,MAAME,eAAc,iBAAiB,CAAC,QAAQ;AAE3D,kBAAM,WAAW,YAAY,QAAQ;AACrC,YAAAH,WAAU,OAAO,MAAM,QAAQ,EAAE,MAAM,eAAe;AAAA,cACpD,OAAO;AAAA,cACP,OAAO,eAAgB;AAAA,YACzB,CAAC;AACD,oBAAQ;AAGR,wBAAY,IAAK,KAAK,CAAC,gBAAiB,GAAG,CAAC;AAE5C,mBAAO;AAAA,UACT,CAAC,EAAEA,YAAW,aAAa,IAAI,gBAAiB,KAAK,MAAM;AAG3D,cAAI,WAAW,OAAW,YAAW;AAErC,iBAAOC;AAAA,QACT,CAAC;AAAA,MACH;AAEA,aAAO,EAAE,IAAI,aAAa,OAAO,SAAS;AAAA,IAC5C,CAAC;AAAA,EACH;AAGA,QAAM,OAAwC,CAAC;AAC/C,QAAM,SAA0C,CAAC;AACjD,QAAM,SAA0C,CAAC;AAEjD,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,QAAS;AAEpB,UAAM,cAAc,OAAO;AAC3B,UAAM,MAAuB;AAAA,MAC3B,MAAM,YAAY,QAAQ;AAAA,MAC1B,MAAM,OAAO;AAAA;AAAA,IACf;AAEA,QAAI,OAAO,OAAO;AAChB,UAAI,QAAQ,OAAO;AACnB,aAAO,OAAO,EAAE,IAAI;AAAA,IACtB,WAAW,OAAO,SAAS,OAAO,MAAM,QAAQ;AAC9C,kBAAY,aAAa,YAAY,aAAa,CAAC,GAAG;AAAA,QACpD,OAAO;AAAA,MACT;AACA,aAAO,OAAO,EAAE,IAAI;AAAA,IACtB,OAAO;AACL,WAAK,OAAO,EAAE,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,GAAI,OAAO,KAAK,IAAI,EAAE,UAAU,EAAE,KAAK;AAAA,IACvC,GAAI,OAAO,KAAK,MAAM,EAAE,UAAU,EAAE,OAAO;AAAA,IAC3C,GAAI,OAAO,KAAK,MAAM,EAAE,UAAU,EAAE,OAAO;AAAA,EAC7C,CAAC;AACH;AAWA,eAAsB,gBACpBD,YACA,aACA,QACkB;AAElB,MAAI,YAAY,QAAQ,CAAC,YAAY,OAAO,MAAM;AAEhD,UAAM,WAAW,YAAY,QAAQ;AACrC,UAAM,aAAaA,WAAU,OAAO,MAAM,QAAQ;AAElD,UAAM,UAA+B;AAAA,MACnC,WAAAA;AAAA,MACA,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ,YAAY;AAAA,MACpB,KAAK,kBAAkB,YAAY,KAAK,YAAY,OAAO,GAAG;AAAA,IAChE;AAEA,eAAW,MAAM,MAAM;AAEvB,UAAM,eAAe,MAAMI;AAAA,MACzB,YAAY;AAAA,MACZ;AAAA,MACAJ,WAAU;AAAA,IACZ,EAAE,OAAO;AAGT,QAAI,iBAAiB,MAAO,QAAO;AAGnC,gBAAY,SAAS;AAAA,MACnB,GAAI,gBAAgB,YAAY;AAAA,MAChC,MAAM;AAAA;AAAA,IACR;AAGA,QAAI,YAAY,SAAS,QAAQ;AAC/B,YAAM,UAAU,YAAY;AAC5B,kBAAY,UAAU,CAAC;AAEvB,iBAAW,EAAE,MAAM,KAAK,KAAK,SAAS;AACpC,0BAAkBA,YAAW,aAAa,QAAQ,MAAM,IAAI;AAAA,MAC9D;AAAA,IACF;AAEA,eAAW,MAAM,WAAW;AAAA,EAC9B;AAEA,SAAO;AACT;AAcA,eAAsB,gBACpBA,YACA,aACA,QACA,OACA,QACkB;AAClB,QAAM,EAAE,OAAO,IAAI;AAEnB,QAAM,YAAY,MAAM,oBAAoB,OAAO,QAAQA,UAAS;AAEpE,MAAI,UAAU,OAAQ,QAAO;AAG7B,QAAM,WAAW,YAAY,QAAQ;AACrC,QAAM,aAAaA,WAAU,OAAO,MAAM,QAAQ;AAElD,QAAM,UAAmC;AAAA,IACvC,WAAAA;AAAA,IACA,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ;AAAA,IACA,MAAM,UAAU;AAAA,IAChB,MAAM,UAAU;AAAA,IAChB;AAAA,IACA,KAAK,kBAAkB,YAAY,KAAK,OAAO,GAAG;AAAA,EACpD;AAEA,QAAM,eAAe,UAAU;AAC/B,QAAM,aAAa,UAAU,cAAc;AAE3C,MAAI,cAAc,SAAS,YAAY,WAAW;AAEhD,gBAAY,UAAU,YAAY,WAAW,CAAC;AAG9C,QAAI,CAAC,YAAY,QAAQ,UAAU,GAAG;AACpC,YAAM,UAAsC;AAAA,QAC1C,KAAK;AAAA,QACL,QAAQ,CAAC;AAAA,QACT,MAAM,CAAC;AAAA,MACT;AAEA,kBAAY,QAAQ,UAAU,IAAI;AAAA,QAChC;AAAA,QACA,SAAS,SAAS,MAAM;AACtB,gBAAMK,cAAa,YAAY,QAAS,UAAU;AAClD,gBAAM,iBAAiBA,YAAW;AAElC,gBAAM,eAA6C;AAAA,YACjD,WAAAL;AAAA,YACA,QAAQ;AAAA,YACR,IAAI;AAAA,YACJ;AAAA;AAAA,YAEA,MAAM;AAAA,YACN,MAAM;AAAA;AAAA,YACN;AAAA;AAAA,YACA,KAAK,kBAAkB,YAAY,KAAK,OAAO,GAAG;AAAA,UACpD;AAEA,qBAAW,MAAM,cAAc;AAAA,YAC7B,QAAQ,eAAe,OAAO;AAAA,UAChC,CAAC;AAED,UAAAI;AAAA,YACE,YAAY;AAAA,YACZ;AAAA,YACAJ,WAAU;AAAA,UACZ,EAAE,gBAAgB,YAAY;AAE9B,qBAAW,MAAM,iBAAiB;AAGlC,yBAAe,SAAS,CAAC;AACzB,yBAAe,OAAO,CAAC;AAAA,QACzB,GAAG,aAAa,KAAK;AAAA,MACvB;AAAA,IACF;AAGA,UAAM,aAAa,YAAY,QAAQ,UAAU;AACjD,eAAW,QAAQ,OAAO,KAAK,UAAU,KAAK;AAC9C,QAAI,UAAU,UAAU,IAAI,EAAG,YAAW,QAAQ,KAAK,KAAK,UAAU,IAAI;AAG1E,eAAW,QAAQ;AAAA,EACrB,OAAO;AACL,eAAW,MAAM,QAAQ,EAAE,OAAO,UAAU,MAAM,KAAK,CAAC;AAGxD,UAAM,WAAW,MAAMI;AAAA,MACrB,YAAY;AAAA,MACZ;AAAA,MACAJ,WAAU;AAAA,IACZ,EAAE,UAAU,OAAO,OAAO;AAE1B,eAAW,MAAM,WAAW;AAE5B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAQO,SAAS,iBACd,eACgB;AAChB,SAAO;AAAA,IACL,IAAI,CAAC,eAAe;AAAA,IACpB,GAAG;AAAA,EACL;AACF;AAUA,eAAsB,iBACpB,YACA,eAA6C,CAAC,GACb;AACjC,QAAM,SAAiC,CAAC;AAExC,aAAW,CAAC,MAAM,cAAc,KAAK,OAAO,QAAQ,YAAY,GAAG;AACjE,UAAM,EAAE,MAAM,SAAS,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI;AAGxC,UAAM,EAAE,QAAQ,gBAAgB,IAAI;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAEA,UAAM,eAAe;AAAA,MACnB,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,UAAM,YAAY,kBAAkB,KAAK,KAAK,GAAG;AAEjD,WAAO,IAAI,IAAI;AAAA,MACb,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,kBACd,gBACA,WACiB;AAEjB,MAAI,CAAC,kBAAkB,CAAC,UAAW,QAAO,CAAC;AAG3C,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,CAAC,eAAgB,QAAO;AAG5B,MAAIM,UAAS,cAAc,KAAKA,UAAS,SAAS,GAAG;AACnD,WAAO,EAAE,GAAG,gBAAgB,GAAG,UAAU;AAAA,EAC3C;AAGA,SAAO;AACT;;;AD/hBA,eAAsB,WACpBC,YACA,MACyB;AACzB,QAAM,EAAE,QAAQ,IAAIA;AAEpB,MAAI,WAAW;AACf,QAAM,SAA2B,CAAC;AAClC,SAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,OAAO,MAAM;AAChD,UAAM,QAAQ,CAAC,CAAC;AAEhB,WAAO,IAAI,IAAI;AAGf,eAAW,YAAY;AAAA,EACzB,CAAC;AAGD,EAAAA,WAAU,UAAUC,QAAO,SAAS,MAAM;AAG1C,UAAQD,YAAW,WAAW,QAAW,MAAM;AAG/C,SAAO,WACH,mBAAmBA,UAAS,IAC5B,iBAAiB,EAAE,IAAI,KAAK,CAAC;AACnC;;;AItCA,SAAS,UAAAE,SAAQ,oBAAoB;;;ACMrC,SAAS,UAAAC,SAAQ,SAAAC,QAAO,gBAAgB;AACxC,SAAS,YAAAC,iBAAgB;AAczB,eAAsB,oBACpBC,YACA,QACA,MACA,SACyB;AACzB,MAAI;AACJ,UAAQ,QAAQ;AAAA,IACd,KAAK,MAAM,SAAS;AAClB,UAAIC,UAAS,IAAI,GAAG;AAClB,QAAAC,QAAOF,WAAU,QAAQ,MAAmC;AAAA,UAC1D,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,UAAIC,UAAS,IAAI,GAAG;AAClB,iBAAS,MAAM,WAAWD,YAAW,IAAwB;AAAA,MAC/D;AACA;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,UAAIC,UAAS,IAAI,GAAG;AAClB,QAAAD,WAAU,SAASE;AAAA,UACjBF,WAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,UAAIC,UAAS,IAAI,GAAG;AAClB,YAAI,UAAU,QAAQA,UAAU,KAA0B,IAAI,GAAG;AAC/D,mBAAS,MAAM;AAAA,YACbD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,UAAIC,UAAS,IAAI,GAAG;AAClB,QAAAD,WAAU,UAAUE;AAAA,UAClBF,WAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,UAAI,SAAS,IAAI,GAAG;AAClB;AAAA,UACEA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,cAAQA,YAAW,OAAO;AAC1B;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,eAAS,MAAM,aAAaA,YAAW,IAAgB;AACvD;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,cAAQA,YAAW,SAAS;AAC5B;AAAA,IAEF,KAAK,MAAM,SAAS;AAClB,UAAIC,UAAS,IAAI,GAAG;AAClB,QAAAC,QAAOF,WAAU,MAAM,MAAuB,EAAE,SAAS,MAAM,CAAC;AAAA,MAClE;AACA;AAAA,EACJ;AAEA,SAAO,UAAU,iBAAiB,EAAE,IAAI,KAAK,CAAC;AAChD;AASO,SAAS,YACdA,YACA,cACgB;AAChB,MAAI,CAAC,aAAa,KAAM,OAAM,IAAI,MAAM,wBAAwB;AAEhE,QAAM,CAAC,aAAa,WAAW,IAAI,aAAa,KAAK,MAAM,GAAG;AAC9D,MAAI,CAAC,eAAe,CAAC,YAAa,OAAM,IAAI,MAAM,uBAAuB;AAEzE,IAAEA,WAAU;AAEZ,QAAM;AAAA,IACJ,YAAY,KAAK,IAAI;AAAA,IACrB,QAAQA,WAAU;AAAA,IAClB,QAAQA,WAAU;AAAA,EACpB,IAAI;AAEJ,QAAM;AAAA,IACJ,OAAO,GAAG,WAAW,IAAI,WAAW;AAAA,IACpC,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,IACX,UAAUA,WAAU;AAAA,IACpB,SAAS,CAAC;AAAA,IACV,OAAOA,WAAU;AAAA,IACjB,SAAS,CAAC;AAAA,IACV,UAAUA,WAAU;AAAA,IACpB,KAAK,GAAG,SAAS,IAAI,KAAK,IAAI,KAAK;AAAA,IACnC,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,MACR,QAAQA,WAAU;AAAA,MAClB,SAASA,WAAU,OAAO,WAAW;AAAA,IACvC;AAAA,IACA,SAAS,EAAE,MAAM,aAAa,IAAI,IAAI,aAAa,GAAG;AAAA,EACxD,IAAI;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AASA,eAAsB,aACpBA,YACA,OACyB;AAEzB,EAAAA,WAAU,UAAU;AAGpB,EAAAA,WAAU,QAAQ;AAClB,EAAAA,WAAU,QAAQG,OAAM;AAGxB,EAAAH,WAAU,SAAS,KAAK,IAAI;AAG5B,MAAI,OAAO;AAET,QAAI,MAAM,SAAS;AACjB,MAAAA,WAAU,UAAUE,QAAOF,WAAU,SAAS,MAAM,OAAO;AAAA,IAC7D;AAGA,QAAI,MAAM,MAAM;AACd,MAAAA,WAAU,OAAOE,QAAOF,WAAU,MAAM,MAAM,IAAI;AAAA,IACpD;AAGA,QAAI,MAAM,SAAS;AACjB,MAAAA,WAAU,UAAUE;AAAA,QAClBF,WAAU,OAAO,iBAAiB,CAAC;AAAA,QACnC,MAAM;AAAA,MACR;AAAA,IACF;AAGA,QAAI,MAAM,QAAQ;AAChB,MAAAA,WAAU,SAASE,QAAOF,WAAU,QAAQ,MAAM,MAAM;AAAA,IAC1D;AAAA,EACF;AAGA,SAAO,OAAOA,WAAU,YAAY,EAAE,QAAQ,CAAC,gBAAgB;AAC7D,gBAAY,YAAY,CAAC;AAAA,EAC3B,CAAC;AAGD,EAAAA,WAAU,QAAQ,CAAC;AAGnB,EAAAA,WAAU;AAGV,QAAM,SAAS,MAAM,mBAAmBA,UAAS;AAGjD,UAAQA,YAAW,KAAK;AAExB,SAAO;AACT;;;AC7OA;AAAA,EACE,qBAAAI;AAAA,EACA,uBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AAaA,SAAS,WACdC,YACA,cACkB;AAClB,SAAOC;AAAA,IACL,OACE,OACA,UAAiC,CAAC,MACN;AAC5B,aAAO,MAAMC;AAAA,QACX,YAAqC;AACnC,gBAAM,EAAE,IAAI,QAAQ,SAAS,SAAS,IAAI;AAC1C,cAAI,eAAe;AAGnB,gBAAM,eAAe,SAAS,OAAO,OAAO,MAAM,IAAI;AAGtD,cAAI,SAAS;AACX,kBAAM,YAAY,MAAMC;AAAA,cACtB;AAAA,cACA;AAAA,cACAH;AAAA,YACF;AAGA,gBAAI,UAAU,QAAQ;AACpB,qBAAO,iBAAiB,EAAE,IAAI,KAAK,CAAC;AAAA,YACtC;AAGA,gBAAI,QAAQ,SAAS;AACnB,oBAAM,iBAAiBI;AAAA,gBACrB,QAAQ;AAAA,gBACRJ,WAAU;AAAA,gBACV,UAAU,MAAM;AAAA,cAClB;AAEA,kBAAI,CAAC,gBAAgB;AACnB,uBAAO,iBAAiB,EAAE,IAAI,KAAK,CAAC;AAAA,cACtC;AAAA,YACF;AAEA,2BAAe,UAAU;AAAA,UAC3B;AAGA,cACE,UAAU,UACVA,WAAU,gBACV,OAAO,KAAKA,WAAU,YAAY,EAAE,SAAS,GAC7C;AACA,kBAAM,iBAAiB,MAAM;AAAA,cAC3BA;AAAA,cACAA,WAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAGA,gBAAI,mBAAmB,MAAM;AAC3B,qBAAO,iBAAiB,EAAE,IAAI,KAAK,CAAC;AAAA,YACtC;AAEA,2BAAe;AAAA,UACjB;AAGA,gBAAM,gBAAgB,aAAa,YAAY;AAG/C,gBAAM,YAAY,YAAYA,YAAW,aAAa;AAGtD,iBAAO,MAAM,mBAAmBA,YAAW,WAAW;AAAA,YACpD;AAAA,YACA,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,QACA,MAAM;AACJ,iBAAO,iBAAiB,EAAE,IAAI,MAAM,CAAC;AAAA,QACvC;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA;AAAA,IACAA,WAAU;AAAA,EACZ;AACF;;;ACzGA,SAAS,YAAAK,WAAU,iBAAAC,sBAAqB;AAWjC,SAAS,cACdC,YACA,eACqB;AACrB,SAAOC;AAAA,IACL,OACE,SACA,MACA,YAC4B;AAC5B,aAAO,MAAMC;AAAA,QACX,YAAqC;AACnC,iBAAO,MAAM,cAAcF,YAAW,SAAS,MAAM,OAAO;AAAA,QAC9D;AAAA,QACA,MAAM;AACJ,iBAAO,iBAAiB,EAAE,IAAI,MAAM,CAAC;AAAA,QACvC;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA;AAAA,IACAA,WAAU;AAAA,EACZ;AACF;;;AHxBA,eAAsB,UACpB,YAC6B;AAC7B,QAAM,UAAU;AAEhB,QAAM,gBAAkC;AAAA,IACtC,eAAe,CAAC;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AAEA,QAAM,SAA2BG,QAAO,eAAe,YAAY;AAAA,IACjE,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,eAA8B;AAAA,IAClC,OAAO,WAAW,QAAQ;AAAA,IAC1B,SAAS,WAAW,QAAQ;AAAA,EAC9B;AACA,QAAM,SAAS,aAAa,YAAY;AAGxC,QAAM,eAAe,EAAE,GAAG,OAAO,eAAe,GAAG,WAAW,QAAQ;AAEtE,QAAMC,aAAgC;AAAA,IACpC,SAAS;AAAA,IACT;AAAA,IACA,SAAS,WAAW,WAAW,CAAC;AAAA,IAChC,OAAO;AAAA,IACP,QAAQ,WAAW,UAAU,CAAC;AAAA,IAC9B,cAAc,CAAC;AAAA,IACf,cAAc,CAAC;AAAA,IACf,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO,CAAC;AAAA,IACR;AAAA,IACA,IAAI,CAAC;AAAA,IACL,OAAO,CAAC;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ,KAAK,IAAI;AAAA,IACjB,MAAM,WAAW,QAAQ,CAAC;AAAA,IAC1B;AAAA,IACA,SAAS,CAAC;AAAA,IACV,MAAM;AAAA;AAAA,IACN,SAAS;AAAA;AAAA,EACX;AAGA,EAAAA,WAAU,OAAO;AAAA,IACfA;AAAA,IACA,CAAC,WACE;AAAA,MACC,QAAQ,KAAK,OAAO,KAAK,IAAI,IAAIA,WAAU,UAAU,EAAE,IAAI;AAAA,MAC3D,QAAQ,EAAE,MAAM,aAAa,IAAI,IAAI,aAAa,GAAG;AAAA,MACrD,GAAG;AAAA,IACL;AAAA,EACJ;AAEA,EAAAA,WAAU,UAAU,cAAcA,YAAW,mBAAmB;AAIhE,EAAAA,WAAU,eAAe,MAAM;AAAA,IAC7BA;AAAA,IACA,WAAW,gBAAgB,CAAC;AAAA,EAC9B;AAGA,EAAAA,WAAU,eAAe,MAAM;AAAA,IAC7BA;AAAA,IACA,WAAW,gBAAgB,CAAC;AAAA,EAC9B;AAEA,SAAOA;AACT;;;AI9EO,SAAS,gBACdC,YACiB;AACjB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,CAAC;AAAA;AAAA,IAGT,MAAM,OACJ,gBACA,MACA,SACA,SACA,QACA,WAC4B;AAE5B,UACE,OAAO,mBAAmB,YAC1B,eAAe,WAAW,SAAS,GACnC;AACA,cAAM,UAAU,eAAe,QAAQ,WAAW,EAAE;AACpD,eAAOA,WAAU,QAAQ,SAAS,MAAM,OAAO;AAAA,MACjD;AAGA,UAAI;AAEJ,UAAI,OAAO,mBAAmB,UAAU;AAEtC,gBAAQ,EAAE,MAAM,eAAe;AAC/B,YAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D,gBAAM,OAAO;AAAA,QACf;AAAA,MACF,WAAW,kBAAkB,OAAO,mBAAmB,UAAU;AAE/D,gBAAQ;AAER,YAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D,gBAAM,OAAO;AAAA,YACX,GAAI,MAAM,QAAQ,CAAC;AAAA,YACnB,GAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF,OAAO;AAEL,eAAO,iBAAiB,EAAE,IAAI,MAAM,CAAC;AAAA,MACvC;AAGA,UAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,cAAM,UAAU;AAAA,MAClB;AACA,UAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,cAAM,SAAS;AAAA,MACjB;AACA,UAAI,UAAU,OAAO,WAAW,UAAU;AACxC,cAAM,SAAS;AAAA,MACjB;AAGA,aAAOA,WAAU,KAAK,KAAK;AAAA,IAC7B;AAAA,EACF;AACF;;;AC1EA,SAAS,iBAAiB,iBAAAC,sBAAqB;AAU/C,eAAsB,YACpBC,YACA,UAA8B,CAAC,GACH;AAC5B,QAAM,SAA4B,CAAC;AAEnC,aAAW,CAAC,UAAU,gBAAgB,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClE,UAAM,EAAE,MAAM,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,SAAS,KAAK,IAAI;AAGvD,QAAI,gBAAyB;AAG7B,UAAM,WAAW;AAAA,MACf;AAAA,MACA,0BAA0BA,WAAU,YAAY;AAAA,IAClD;AAGA,UAAM,cAAgC,CACpC,OACA,UAAiC,CAAC,MAC/B;AAEH,aAAOA,WAAU,KAAK,OAAO;AAAA,QAC3B,GAAG;AAAA,QACH,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT;AAAA;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,gBAAgBA,WAAU,OAAO,MAAM,QAAQ,EAAE,MAAM,QAAQ;AAErE,UAAM,WAAuB;AAAA,MAC3B,MAAM;AAAA,MACN,SAASA,WAAU;AAAA,MACnB,SAASA,WAAU;AAAA;AAAA,MACnB,KAAKA,WAAU,QAAQ,IAAI;AAAA;AAAA,MAC3B,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAMA,UAAM,YAAY,OAAO,UAAkC;AAEzD,UAAI,CAAC,OAAO,QAAQ;AAClB,wBAAgB;AAChB;AAAA,MACF;AAEA,sBAAgB,MAAM,gBAAgB,OAAO,OAAO,QAAQ;AAAA,QAC1D,WAAAA;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,gBAAgC;AAAA,MACpC,WAAAA;AAAA,MACA,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAGA,UAAM,iBAAiB,MAAMC,eAAc,IAAI,EAAE,aAAa;AAE9D,QAAI,CAAC,eAAgB;AAGrB,UAAM,aAAa,eAAe,QAAQ;AAC1C,UAAM,eAAeD,WAAU,OAAO,MAAM,UAAU,EAAE,MAAM,QAAQ;AACtE,aAAS,SAAS;AAGlB,QAAI,SAAS;AACX,qBAAe,SAAS,EAAE,GAAG,eAAe,QAAQ,QAAQ;AAAA,IAC9D;AAEA,WAAO,QAAQ,IAAI;AAAA,EACrB;AAEA,SAAO;AACT;;;AC/FA,eAAsB,UACpB,YAC6B;AAC7B,eAAa,cAAc,CAAC;AAC5B,QAAM,WAAW,MAAM,UAAU,UAAU;AAG3C,QAAM,YAAY,gBAAgB,QAAQ;AAC1C,WAAS,QAAQ,MAAM;AAGvB,QAAM,oBAAoB,MAAM;AAAA,IAC9B;AAAA,IACA,WAAW,WAAW,CAAC;AAAA,EACzB;AACA,SAAO,OAAO,SAAS,SAAS,iBAAiB;AAEjD,QAAM,EAAE,SAAS,MAAM,SAAS,OAAO,IAAI;AAE3C,MAAI,QAAS,OAAM,SAAS,QAAQ,WAAW,OAAO;AACtD,MAAI,KAAM,OAAM,SAAS,QAAQ,QAAQ,IAAI;AAC7C,MAAI,QAAS,QAAO,OAAO,SAAS,SAAS,OAAO;AACpD,MAAI,OAAQ,QAAO,OAAO,SAAS,QAAQ,MAAM;AAEjD,MAAI,SAAS,OAAO,IAAK,OAAM,SAAS,QAAQ,KAAK;AAMrD,MAAI,aAAqB,UAAU;AAEnC,QAAM,UAAU,OAAO,OAAO,SAAS,OAAO,EAAE;AAAA,IAC9C,CAAC,WAAW,OAAO,SAAS;AAAA,EAC9B;AAGA,QAAM,gBAAgB,QAAQ;AAAA,IAC5B,CAAC,WAAY,OAAO,OAAiC;AAAA,EACvD;AAEA,MAAI,eAAe;AACjB,iBAAa,cAAc;AAAA,EAC7B,WAAW,QAAQ,SAAS,GAAG;AAE7B,iBAAa,QAAQ,CAAC,EAAE;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,KAAK;AAAA,EACP;AACF;","names":["assign","isObject","tryCatchAsync","useHooks","collector","on","option","collector","initTransformers","collector","event","isInitialized","tryCatchAsync","useHooks","batchState","isObject","collector","assign","assign","assign","getId","isObject","collector","isObject","assign","getId","getGrantedConsent","processEventMapping","tryCatchAsync","useHooks","collector","useHooks","tryCatchAsync","processEventMapping","getGrantedConsent","useHooks","tryCatchAsync","collector","useHooks","tryCatchAsync","assign","collector","collector","tryCatchAsync","collector","tryCatchAsync"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/code.ts","../src/constants.ts","../src/consent.ts","../src/collector.ts","../src/destination.ts","../src/on.ts","../src/source.ts","../src/transformer.ts","../src/pending.ts","../src/handle.ts","../src/push.ts","../src/command.ts","../src/elb.ts","../src/flow.ts"],"sourcesContent":["import type { Destination, Mapping, On, WalkerOS } from '@walkeros/core';\n\nexport interface Settings {\n scripts?: string[];\n init?: string;\n on?: string;\n push?: string;\n pushBatch?: string;\n}\n\nexport interface CodeMapping extends Mapping.Rule<CodeMapping> {\n push?: string;\n pushBatch?: string;\n}\n\nexport type Types = Destination.Types<Settings, CodeMapping>;\nexport type Config = Destination.Config<Types>;\nexport type Context = Destination.Context<Types>;\nexport type PushContext = Destination.PushContext<Types>;\nexport type PushBatchContext = Destination.PushBatchContext<Types>;\n\nexport type InitFn = (context: Context) => void;\nexport type OnFn = (type: On.Types, context: Context) => void;\nexport type PushFn = (event: WalkerOS.Event, context: PushContext) => void;\nexport type PushBatchFn = (\n batch: Destination.Batch<CodeMapping>,\n context: PushBatchContext,\n) => void;\n","import type { Collector } from '@walkeros/core';\nimport type { CommandTypes, StorageType } from './types/collector';\n\nexport const Commands: Record<CommandTypes, Collector.CommandType> = {\n Action: 'action',\n Actions: 'actions',\n Config: 'config',\n Consent: 'consent',\n Context: 'context',\n Custom: 'custom',\n Destination: 'destination',\n Elb: 'elb',\n Globals: 'globals',\n Hook: 'hook',\n Init: 'init',\n Link: 'link',\n On: 'on',\n Prefix: 'data-elb',\n Ready: 'ready',\n Run: 'run',\n Session: 'session',\n User: 'user',\n Walker: 'walker',\n} as const;\n\nconst UtilsStorage: { [key: string]: StorageType } = {\n Cookie: 'cookie',\n Local: 'local',\n Session: 'session',\n} as const;\n\nconst Utils = {\n Storage: UtilsStorage,\n};\n\nexport const Const = {\n Commands,\n Utils,\n};\n\nexport default Const;\n","import type { Collector, WalkerOS } from '@walkeros/core';\nimport { assign } from '@walkeros/core';\n\n/**\n * Processes consent data: coerces to boolean, updates collector state.\n * Does NOT notify or process queues — caller handles that.\n */\nexport function processConsent(\n collector: Collector.Instance,\n data: WalkerOS.Consent,\n): { update: WalkerOS.Consent; runQueue: boolean } {\n let runQueue = false;\n const update: WalkerOS.Consent = {};\n Object.entries(data).forEach(([name, granted]) => {\n const state = !!granted;\n update[name] = state;\n runQueue = runQueue || state;\n });\n\n collector.consent = assign(collector.consent, update);\n\n return { update, runQueue };\n}\n","import type { Collector, Logger, WalkerOS } from '@walkeros/core';\nimport { assign, createLogger } from '@walkeros/core';\nimport { commonHandleCommand } from './handle';\nimport { initDestinations } from './destination';\nimport { initTransformers } from './transformer';\nimport { createPush } from './push';\nimport { createCommand } from './command';\nimport { initSources } from './source';\n\ndeclare const __VERSION__: string;\n\nexport async function collector(\n initConfig: Collector.InitConfig,\n): Promise<Collector.Instance> {\n const version = __VERSION__;\n\n const defaultConfig: Collector.Config = {\n globalsStatic: {},\n sessionStatic: {},\n tagging: 0,\n run: true,\n };\n\n const config: Collector.Config = assign(defaultConfig, initConfig, {\n merge: false,\n extend: false,\n });\n\n // Create logger with config from initConfig\n const loggerConfig: Logger.Config = {\n level: initConfig.logger?.level,\n handler: initConfig.logger?.handler,\n };\n const logger = createLogger(loggerConfig);\n\n // Enhanced globals with static globals from config\n const finalGlobals = { ...config.globalsStatic, ...initConfig.globals };\n\n const collector: Collector.Instance = {\n allowed: false,\n config,\n consent: initConfig.consent || {},\n count: 0,\n custom: initConfig.custom || {},\n destinations: {},\n transformers: {},\n globals: finalGlobals,\n group: '',\n hooks: {},\n logger,\n on: {},\n queue: [],\n round: 0,\n session: undefined,\n status: {\n startedAt: Date.now(),\n in: 0,\n out: 0,\n failed: 0,\n sources: {},\n destinations: {},\n },\n timing: Date.now(),\n user: initConfig.user || {},\n version,\n sources: {},\n pending: { sources: {}, destinations: {} },\n push: undefined as unknown as Collector.PushFn, // Placeholder, will be set below\n command: undefined as unknown as Collector.CommandFn, // Placeholder, will be set below\n };\n\n // Set the push and command functions with the collector reference\n collector.push = createPush(\n collector,\n (event: WalkerOS.DeepPartialEvent): WalkerOS.PartialEvent =>\n ({\n timing: Math.round((Date.now() - collector.timing) / 10) / 100,\n source: { type: 'collector', id: '', previous_id: '' },\n ...event,\n }) as WalkerOS.PartialEvent,\n );\n\n collector.command = createCommand(collector, commonHandleCommand);\n\n // Initialize destinations after collector is fully created\n // Sources are initialized in startFlow after ELB source is created\n collector.destinations = await initDestinations(\n collector,\n initConfig.destinations || {},\n );\n\n // Initialize transformers\n collector.transformers = await initTransformers(\n collector,\n initConfig.transformers || {},\n );\n\n return collector;\n}\n","import type {\n Collector,\n WalkerOS,\n Elb,\n Destination,\n Transformer,\n} from '@walkeros/core';\nimport {\n assign,\n clone,\n debounce,\n getId,\n getGrantedConsent,\n isDefined,\n isFunction,\n isObject,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { callDestinationOn } from './on';\nimport {\n runTransformerChain,\n walkChain,\n extractTransformerNextMap,\n extractChainProperty,\n} from './transformer';\n\n/**\n * Computes transformer chain for a destination on-demand.\n * Returns empty array if destination has no 'before' configured.\n */\nfunction getDestinationChain(\n destination: Destination.Instance,\n transformers: Transformer.Transformers,\n): string[] {\n const before = destination.config.before as string | string[] | undefined;\n if (!before) return [];\n return walkChain(before, extractTransformerNextMap(transformers));\n}\n\n/**\n * Adds a new destination to the collector.\n *\n * @param collector - The walkerOS collector instance.\n * @param data - The destination's init data.\n * @param options - The destination's config.\n * @returns The result of the push operation.\n */\nexport async function addDestination(\n collector: Collector.Instance,\n data: Destination.Init,\n options?: Destination.Config,\n): Promise<Elb.PushResult> {\n const { code, config: dataConfig = {}, env = {}, before } = data;\n\n // Validate that code has a push method\n if (!isFunction(code.push)) {\n return createPushResult({\n ok: false,\n failed: {\n invalid: {\n type: 'invalid',\n error: 'Destination code must have a push method',\n },\n },\n });\n }\n\n const baseConfig = options || dataConfig || { init: false };\n // Merge before into config if provided at root level\n const config = before ? { ...baseConfig, before } : baseConfig;\n\n const destination: Destination.Instance = {\n ...code,\n config,\n env: mergeEnvironments(code.env, env),\n };\n\n let id = destination.config.id; // Use given id\n if (!id) {\n // Generate a new id if none was given\n do {\n id = getId(4);\n } while (collector.destinations[id]);\n }\n\n // Add the destination\n collector.destinations[id] = destination;\n\n // Process previous events if not disabled\n if (destination.config.queue !== false)\n destination.queuePush = [...collector.queue];\n\n return pushToDestinations(collector, undefined, {}, { [id]: destination });\n}\n\n/**\n * Pushes an event to all or a subset of destinations.\n *\n * @param collector - The walkerOS collector instance.\n * @param event - The event to push.\n * @param meta - Optional metadata with id and ingest.\n * @param destinations - The destinations to push to.\n * @returns The result of the push operation.\n */\nexport async function pushToDestinations(\n collector: Collector.Instance,\n event?: WalkerOS.Event,\n meta: { id?: string; ingest?: unknown } = {},\n destinations?: Collector.Destinations,\n): Promise<Elb.PushResult> {\n const { allowed, consent, globals, user } = collector;\n\n // Check if collector is allowed to push\n if (!allowed) return createPushResult({ ok: false });\n\n // Add event to the collector queue\n if (event) {\n collector.queue.push(event);\n collector.status.in++;\n }\n\n // Use given destinations or use internal destinations\n if (!destinations) destinations = collector.destinations;\n\n const results = await Promise.all(\n // Process all destinations in parallel\n Object.entries(destinations || {}).map(async ([id, destination]) => {\n // Create a queue of events to be processed\n let currentQueue = (destination.queuePush || []).map((event) => ({\n ...event,\n consent,\n }));\n\n // Reset original queue while processing to enable async processing\n destination.queuePush = [];\n\n // Add event to queue stack\n if (event) {\n // Clone the event to avoid mutating the original event\n const currentEvent = clone(event);\n\n // Note: Policy is now applied in processEventMapping() within destinationPush()\n\n // Add event to queue stack\n currentQueue.push(currentEvent);\n }\n\n // If no events and no queued on events, skip this destination\n if (!currentQueue.length && !destination.queueOn?.length) {\n return { id, destination, skipped: true };\n }\n\n // If only on events queued (no push events), still init to flush queueOn\n if (!currentQueue.length && destination.queueOn?.length) {\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n return { id, destination, skipped: !isInitialized };\n }\n\n const allowedEvents: WalkerOS.Events = [];\n const skippedEvents = currentQueue.filter((queuedEvent) => {\n const grantedConsent = getGrantedConsent(\n destination.config.consent, // Required\n consent, // Current collector state\n queuedEvent.consent, // Individual event state\n );\n\n if (grantedConsent) {\n queuedEvent.consent = grantedConsent; // Save granted consent states only\n\n allowedEvents.push(queuedEvent); // Add to allowed queue\n return false; // Remove from destination queue\n }\n\n return true; // Keep denied events in the queue\n });\n\n // Add skipped events back to the queue\n destination.queuePush.push(...skippedEvents);\n\n // Execution shall not pass if no events are allowed\n if (!allowedEvents.length) {\n return { id, destination, queue: currentQueue }; // Don't push if not allowed\n }\n\n // Initialize the destination if needed\n const isInitialized = await tryCatchAsync(destinationInit)(\n collector,\n destination,\n id,\n );\n\n if (!isInitialized) return { id, destination, queue: currentQueue };\n\n // Process the destinations event queue\n let error: unknown;\n let response: unknown;\n if (!destination.dlq) destination.dlq = [];\n\n // Compute transformer chain on-demand from destination.before\n const postChain = getDestinationChain(\n destination,\n collector.transformers,\n );\n\n // Process allowed events and store failed ones in the dead letter queue (DLQ)\n let totalDuration = 0;\n await Promise.all(\n allowedEvents.map(async (event) => {\n // Merge event with collector state, prioritizing event properties\n event.globals = assign(globals, event.globals);\n event.user = assign(user, event.user);\n\n // Run post-collector transformer chain if configured for this destination\n let processedEvent: WalkerOS.Event | null = event;\n if (\n postChain.length > 0 &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const chainResult = await runTransformerChain(\n collector,\n collector.transformers,\n postChain,\n event,\n meta.ingest,\n );\n\n if (chainResult === null) {\n // Chain stopped - skip this event for this destination\n return event;\n }\n\n // Use the processed event (cast back to full Event type)\n processedEvent = chainResult as WalkerOS.Event;\n }\n\n const pushStart = Date.now();\n const result = await tryCatchAsync(destinationPush, (err) => {\n // Log the error with destination scope\n const destType = destination.type || 'unknown';\n collector.logger.scope(destType).error('Push failed', {\n error: err,\n event: processedEvent!.name,\n });\n error = err; // oh no\n\n // Add failed event to destinations DLQ\n destination.dlq!.push([processedEvent!, err]);\n\n return undefined;\n })(collector, destination, id, processedEvent!, meta.ingest);\n totalDuration += Date.now() - pushStart;\n\n // Capture the last response (for single event pushes)\n if (result !== undefined) response = result;\n\n return event;\n }),\n );\n\n return { id, destination, error, response, totalDuration };\n }),\n );\n\n // Build result objects\n const done: Record<string, Destination.Ref> = {};\n const queued: Record<string, Destination.Ref> = {};\n const failed: Record<string, Destination.Ref> = {};\n\n for (const result of results) {\n if (result.skipped) continue;\n\n const destination = result.destination;\n const ref: Destination.Ref = {\n type: destination.type || 'unknown',\n data: result.response, // Capture push() return value\n };\n\n // Ensure destination status entry exists\n if (!collector.status.destinations[result.id]) {\n collector.status.destinations[result.id] = {\n count: 0,\n failed: 0,\n duration: 0,\n };\n }\n const destStatus = collector.status.destinations[result.id];\n const now = Date.now();\n\n if (result.error) {\n ref.error = result.error;\n failed[result.id] = ref;\n destStatus.failed++;\n destStatus.lastAt = now;\n destStatus.duration += result.totalDuration || 0;\n collector.status.failed++;\n } else if (result.queue && result.queue.length) {\n destination.queuePush = (destination.queuePush || []).concat(\n result.queue,\n );\n queued[result.id] = ref;\n } else {\n done[result.id] = ref;\n destStatus.count++;\n destStatus.lastAt = now;\n destStatus.duration += result.totalDuration || 0;\n collector.status.out++;\n }\n }\n\n return createPushResult({\n event,\n ...(Object.keys(done).length && { done }),\n ...(Object.keys(queued).length && { queued }),\n ...(Object.keys(failed).length && { failed }),\n });\n}\n\n/**\n * Initializes a destination.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to initialize.\n * @param destId - The destination ID.\n * @returns Whether the destination was initialized successfully.\n */\nexport async function destinationInit<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n): Promise<boolean> {\n // Check if the destination was initialized properly or try to do so\n if (destination.init && !destination.config.init) {\n // Create scoped logger for this destination: [type:id] or [unknown:id]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n destLogger.debug('init');\n\n const configResult = await useHooks(\n destination.init,\n 'DestinationInit',\n collector.hooks,\n )(context);\n\n // Actively check for errors (when false)\n if (configResult === false) return configResult; // don't push if init is false\n\n // Update the destination config if it was returned\n destination.config = {\n ...(configResult || destination.config),\n init: true, // Remember that the destination was initialized\n };\n\n // Flush queued on() events now that destination is initialized\n if (destination.queueOn?.length) {\n const queueOn = destination.queueOn;\n destination.queueOn = [];\n\n for (const { type, data } of queueOn) {\n callDestinationOn(collector, destination, destId, type, data);\n }\n }\n\n destLogger.debug('init done');\n }\n\n return true; // Destination is ready to push\n}\n\n/**\n * Pushes an event to a single destination.\n * Handles mapping, batching, and consent checks.\n *\n * @template Destination\n * @param collector - The walkerOS collector instance.\n * @param destination - The destination to push to.\n * @param destId - The destination ID.\n * @param event - The event to push.\n * @param ingest - Optional ingest metadata (frozen, same reference).\n * @returns Whether the event was pushed successfully.\n */\nexport async function destinationPush<Destination extends Destination.Instance>(\n collector: Collector.Instance,\n destination: Destination,\n destId: string,\n event: WalkerOS.Event,\n ingest?: unknown,\n): Promise<unknown> {\n const { config } = destination;\n\n const processed = await processEventMapping(event, config, collector);\n\n if (processed.ignore) return false;\n\n // Create scoped logger for this destination: [type] or [unknown]\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType);\n\n const context: Destination.PushContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n data: processed.data,\n rule: processed.mapping,\n ingest,\n env: mergeEnvironments(destination.env, config.env),\n };\n\n const eventMapping = processed.mapping;\n const mappingKey = processed.mappingKey || '* *';\n\n if (eventMapping?.batch && destination.pushBatch) {\n // Initialize batch registry on destination (not on shared mapping config)\n destination.batches = destination.batches || {};\n\n // Get or create batch state for this mapping key\n if (!destination.batches[mappingKey]) {\n const batched: Destination.Batch<unknown> = {\n key: mappingKey,\n events: [],\n data: [],\n };\n\n destination.batches[mappingKey] = {\n batched,\n batchFn: debounce(() => {\n const batchState = destination.batches![mappingKey];\n const currentBatched = batchState.batched;\n\n const batchContext: Destination.PushBatchContext = {\n collector,\n logger: destLogger,\n id: destId,\n config,\n // Note: batch.data contains all transformed data; context.data is for single events\n data: undefined,\n rule: eventMapping, // Renamed from mapping to rule\n ingest, // Same frozen reference\n env: mergeEnvironments(destination.env, config.env),\n };\n\n destLogger.debug('push batch', {\n events: currentBatched.events.length,\n });\n\n useHooks(\n destination.pushBatch!,\n 'DestinationPushBatch',\n collector.hooks,\n )(currentBatched, batchContext);\n\n destLogger.debug('push batch done');\n\n // Reset batch\n currentBatched.events = [];\n currentBatched.data = [];\n }, eventMapping.batch),\n };\n }\n\n // Add event to batch\n const batchState = destination.batches[mappingKey];\n batchState.batched.events.push(processed.event);\n if (isDefined(processed.data)) batchState.batched.data.push(processed.data);\n\n // Trigger debounced batch\n batchState.batchFn();\n } else {\n destLogger.debug('push', { event: processed.event.name });\n\n // It's time to go to the destination's side now\n const response = await useHooks(\n destination.push,\n 'DestinationPush',\n collector.hooks,\n )(processed.event, context);\n\n destLogger.debug('push done');\n\n return response;\n }\n\n return true;\n}\n\n/**\n * Creates a standardized result object for push operations.\n *\n * @param partialResult - A partial result to merge with the default result.\n * @returns The push result.\n */\nexport function createPushResult(\n partialResult?: Partial<Elb.PushResult>,\n): Elb.PushResult {\n return {\n ok: !partialResult?.failed,\n ...partialResult,\n };\n}\n\n/**\n * Register a single destination from its init definition.\n * Merges code config, user config, and chain config.\n * Used by initDestinations and activatePending.\n */\nexport function registerDestination(\n def: Destination.Init,\n): Destination.Instance {\n const { code, config = {}, env = {} } = def;\n const { config: configWithChain } = extractChainProperty(def, 'before');\n const mergedConfig = { ...code.config, ...config, ...configWithChain };\n const mergedEnv = mergeEnvironments(code.env, env);\n return { ...code, config: mergedConfig, env: mergedEnv };\n}\n\n/**\n * Initializes a map of destinations using ONLY the unified code/config/env pattern.\n * Does NOT call destination.init() - that happens later during push with proper consent checks.\n *\n * @param destinations - The destinations to initialize.\n * @param collector - The collector instance for destination init context.\n * @returns The initialized destinations.\n */\nexport async function initDestinations(\n collector: Collector.Instance,\n destinations: Destination.InitDestinations = {},\n): Promise<Collector.Destinations> {\n const result: Collector.Destinations = {};\n\n for (const [id, def] of Object.entries(destinations)) {\n if (def.config?.require?.length) {\n collector.pending.destinations[id] = def;\n continue;\n }\n result[id] = registerDestination(def);\n }\n\n return result;\n}\n\n/**\n * Merges destination environment with config environment\n * Config env takes precedence over destination env for overrides\n */\nexport function mergeEnvironments(\n destinationEnv?: Destination.Env,\n configEnv?: Destination.Env,\n): Destination.Env {\n // If neither environment exists, return empty object\n if (!destinationEnv && !configEnv) return {};\n\n // If only one exists, return it\n if (!configEnv) return destinationEnv!;\n if (!destinationEnv) return configEnv;\n\n // Both exist - merge objects with configEnv taking precedence\n if (isObject(destinationEnv) && isObject(configEnv)) {\n return { ...destinationEnv, ...configEnv };\n }\n\n // If they're not both objects, config env overrides destination env\n return configEnv;\n}\n","import type { Collector, On, WalkerOS, Destination } from '@walkeros/core';\nimport { isArray } from '@walkeros/core';\nimport { Const } from './constants';\nimport { tryCatch, tryCatchAsync } from '@walkeros/core';\nimport { mergeEnvironments } from './destination';\nimport { activatePending } from './pending';\n\n/**\n * Registers a callback for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to listen for.\n * @param option The callback function or an array of callback functions.\n */\nexport async function on(\n collector: Collector.Instance,\n type: On.Types,\n option: WalkerOS.SingleOrArray<On.Options>,\n) {\n const on = collector.on;\n const onType: Array<On.Options> = on[type] || [];\n const options = isArray(option) ? option : [option];\n\n options.forEach((option) => {\n onType.push(option);\n });\n\n // Update collector on state\n (on[type] as typeof onType) = onType;\n\n // Execute the on function directly\n await onApply(collector, type, options);\n}\n\n/**\n * Calls a destination's on() handler with proper context.\n * Used by both onApply() for immediate calls and destinationInit() for flushing queued events.\n */\nexport function callDestinationOn(\n collector: Collector.Instance,\n destination: Destination.Instance,\n destId: string,\n type: On.Types,\n data: unknown,\n) {\n if (!destination.on) return;\n\n const destType = destination.type || 'unknown';\n const destLogger = collector.logger.scope(destType).scope('on').scope(type);\n\n const context: Destination.Context = {\n collector,\n logger: destLogger,\n id: destId,\n config: destination.config,\n data: data as Destination.Data,\n env: mergeEnvironments(destination.env, destination.config.env),\n };\n\n tryCatch(destination.on)(type, context);\n}\n\n/**\n * Applies all registered callbacks for a specific event type.\n *\n * @param collector The walkerOS collector instance.\n * @param type The type of the event to apply the callbacks for.\n * @param options The options for the callbacks.\n * @param config The consent configuration.\n */\nexport async function onApply(\n collector: Collector.Instance,\n type: On.Types,\n options?: Array<On.Options>,\n config?: unknown,\n): Promise<boolean> {\n // Use the optionally provided options\n let onConfig = options || [];\n\n if (!options) {\n // Get the collector on events\n onConfig = collector.on[type] || [];\n }\n\n // Calculate context data once for all sources and destinations\n let contextData: unknown;\n\n switch (type) {\n case Const.Commands.Consent:\n contextData = config || collector.consent;\n break;\n case Const.Commands.Session:\n contextData = collector.session;\n break;\n case Const.Commands.User:\n contextData = config || collector.user;\n break;\n case Const.Commands.Custom:\n contextData = config || collector.custom;\n break;\n case Const.Commands.Globals:\n contextData = config || collector.globals;\n break;\n case Const.Commands.Config:\n contextData = config || collector.config;\n break;\n case Const.Commands.Ready:\n case Const.Commands.Run:\n default:\n contextData = undefined;\n break;\n }\n\n let vetoed = false;\n for (const source of Object.values(collector.sources)) {\n if (source.on) {\n const result = await tryCatchAsync(source.on)(type, contextData);\n if (result === false) vetoed = true;\n }\n }\n\n Object.entries(collector.destinations).forEach(([destId, destination]) => {\n if (destination.on) {\n // Queue if destination not yet initialized\n if (!destination.config.init) {\n destination.queueOn = destination.queueOn || [];\n destination.queueOn.push({ type, data: contextData });\n return;\n }\n\n // Call immediately using shared helper\n callDestinationOn(collector, destination, destId, type, contextData);\n }\n });\n\n // Activate pending sources/destinations whose require conditions are met\n if (\n Object.keys(collector.pending.sources).length > 0 ||\n Object.keys(collector.pending.destinations).length > 0\n ) {\n await activatePending(collector, type);\n }\n\n if (!onConfig.length) return !vetoed;\n\n switch (type) {\n case Const.Commands.Consent:\n onConsent(\n collector,\n onConfig as Array<On.ConsentConfig>,\n config as WalkerOS.Consent,\n );\n break;\n case Const.Commands.Ready:\n onReady(collector, onConfig as Array<On.ReadyConfig>);\n break;\n case Const.Commands.Run:\n onRun(collector, onConfig as Array<On.RunConfig>);\n break;\n case Const.Commands.Session:\n onSession(collector, onConfig as Array<On.SessionConfig>);\n break;\n default:\n // Generic handler for user, custom, globals, config, and custom events\n onConfig.forEach((func) => {\n if (typeof func === 'function') {\n tryCatch(func as On.GenericFn)(collector, contextData);\n }\n });\n break;\n }\n\n return !vetoed;\n}\n\nfunction onConsent(\n collector: Collector.Instance,\n onConfig: Array<On.ConsentConfig>,\n currentConsent?: WalkerOS.Consent,\n): void {\n const consentState = currentConsent || collector.consent;\n\n onConfig.forEach((consentConfig) => {\n // Collect functions whose consent keys match the rule keys directly\n // Directly execute functions whose consent keys match the rule keys\n Object.keys(consentState) // consent keys\n .filter((consent) => consent in consentConfig) // check for matching rule keys\n .forEach((consent) => {\n // Execute the function\n tryCatch(consentConfig[consent])(collector, consentState);\n });\n });\n}\n\nfunction onReady(\n collector: Collector.Instance,\n onConfig: Array<On.ReadyConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onRun(\n collector: Collector.Instance,\n onConfig: Array<On.RunConfig>,\n): void {\n if (collector.allowed)\n onConfig.forEach((func) => {\n tryCatch(func)(collector);\n });\n}\n\nfunction onSession(\n collector: Collector.Instance,\n onConfig: Array<On.SessionConfig>,\n): void {\n if (!collector.session) return;\n\n onConfig.forEach((func) => {\n tryCatch(func)(collector, collector.session);\n });\n}\n","import type { Collector, Source, WalkerOS } from '@walkeros/core';\nimport { getMappingValue, tryCatchAsync } from '@walkeros/core';\nimport { walkChain, extractTransformerNextMap } from './transformer';\n\n/**\n * Initialize a single source. Extracted from the initSources loop body\n * so it can be reused by the pending-source activator.\n */\nexport async function initSource(\n collector: Collector.Instance,\n sourceId: string,\n sourceDefinition: Source.InitSource,\n): Promise<Source.Instance | undefined> {\n const { code, config = {}, env = {}, primary, next } = sourceDefinition;\n\n // Track current ingest metadata (set per-request by setIngest)\n let currentIngest: unknown = undefined;\n\n // Resolve transformer chain for this source\n const preChain = walkChain(\n next,\n extractTransformerNextMap(collector.transformers),\n );\n\n // Create wrapped push that auto-applies source mapping config, preChain, and ingest\n const wrappedPush: Collector.PushFn = (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ) => {\n return collector.push(event, {\n ...options,\n id: sourceId,\n ingest: currentIngest,\n mapping: config,\n preChain,\n });\n };\n\n // Create initial logger scoped to sourceId (type will be added after init)\n const initialLogger = collector.logger.scope('source').scope(sourceId);\n\n const cleanEnv: Source.Env = {\n push: wrappedPush,\n command: collector.command,\n sources: collector.sources,\n elb: collector.sources.elb.push,\n logger: initialLogger,\n ...env,\n };\n\n /**\n * setIngest extracts metadata from raw request using config.ingest mapping.\n * Opt-in: returns early if no config.ingest is defined.\n */\n const setIngest = async (value: unknown): Promise<void> => {\n if (!config.ingest) {\n currentIngest = undefined;\n return;\n }\n\n currentIngest = await getMappingValue(value, config.ingest, {\n collector,\n });\n };\n\n const sourceContext: Source.Context = {\n collector,\n logger: initialLogger,\n id: sourceId,\n config,\n env: cleanEnv,\n setIngest,\n };\n\n const sourceInstance = await tryCatchAsync(code)(sourceContext);\n if (!sourceInstance) return undefined;\n\n const sourceType = sourceInstance.type || 'unknown';\n const sourceLogger = collector.logger.scope(sourceType).scope(sourceId);\n cleanEnv.logger = sourceLogger;\n\n if (primary) {\n sourceInstance.config = { ...sourceInstance.config, primary };\n }\n\n return sourceInstance;\n}\n\n/**\n * Initialize sources. Sources with `require` are deferred to collector.pending.\n */\nexport async function initSources(\n collector: Collector.Instance,\n sources: Source.InitSources = {},\n): Promise<Collector.Sources> {\n const result: Collector.Sources = {};\n\n for (const [sourceId, sourceDefinition] of Object.entries(sources)) {\n const { config = {} } = sourceDefinition;\n\n if (config.require && config.require.length > 0) {\n collector.pending.sources[sourceId] = sourceDefinition;\n continue;\n }\n\n const sourceInstance = await initSource(\n collector,\n sourceId,\n sourceDefinition,\n );\n if (sourceInstance) {\n result[sourceId] = sourceInstance;\n }\n }\n\n return result;\n}\n","/**\n * @module transformer\n *\n * Transformer Chain Utilities\n * ==========================\n *\n * This module provides the unified implementation for transformer chains in walkerOS.\n * Chains are used at two points in the data flow:\n *\n * 1. Pre-collector chains (source.next):\n * Source → [Transformer Chain] → Collector\n * Events are processed before the collector sees them.\n *\n * 2. Post-collector chains (destination.before):\n * Collector → [Transformer Chain] → Destination\n * Events are processed before reaching specific destinations.\n *\n * Key Functions:\n * - extractTransformerNextMap(): Extracts next links from transformer instances\n * - extractChainProperty(): Unified extraction of chain properties from definitions\n * - walkChain(): Resolves chain IDs from starting point\n * - runTransformerChain(): Executes a chain of transformers on an event\n *\n * Chain Resolution:\n * - String start: Walk transformer.next links until chain ends\n * - Array start: Use array directly (explicit chain, ignores transformer.next)\n *\n * Chain Termination:\n * - Transformer returns false → chain stops, event is dropped\n * - Transformer throws error → chain stops, event is dropped\n * - Transformer returns void → continue with unchanged event\n * - Transformer returns event → continue with modified event\n */\nimport type { Collector, Transformer, WalkerOS } from '@walkeros/core';\nimport { isObject, tryCatchAsync, useHooks } from '@walkeros/core';\n\n/**\n * Extracts transformer next configuration for chain walking.\n * Maps transformer instances to their config.next values.\n *\n * This is the single source of truth for extracting chain links.\n * Used by both source.ts (pre-collector chains) and destination.ts (post-collector chains).\n *\n * @param transformers - Map of transformer instances\n * @returns Map of transformer IDs to their next configuration\n */\nexport function extractTransformerNextMap(\n transformers: Transformer.Transformers,\n): Record<string, { next?: string | string[] }> {\n const result: Record<string, { next?: string | string[] }> = {};\n for (const [id, transformer] of Object.entries(transformers)) {\n if (transformer.config?.next) {\n result[id] = { next: transformer.config.next as string | string[] };\n } else {\n result[id] = {};\n }\n }\n return result;\n}\n\n/**\n * Extracts chain property from definition and merges into config.\n * Provides unified handling for source.next, destination.before, and transformer.next.\n *\n * @param definition - Component definition with optional chain property\n * @param propertyName - Name of chain property ('next' or 'before')\n * @returns Object with merged config and extracted chain value\n */\nexport function extractChainProperty<\n T extends { config?: Record<string, unknown>; [key: string]: unknown },\n>(\n definition: T,\n propertyName: 'next' | 'before',\n): {\n config: Record<string, unknown>;\n chainValue: string | string[] | undefined;\n} {\n const config = (definition.config || {}) as Record<string, unknown>;\n const chainValue = definition[propertyName] as string | string[] | undefined;\n\n if (chainValue !== undefined) {\n return {\n config: { ...config, [propertyName]: chainValue },\n chainValue,\n };\n }\n\n return { config, chainValue: undefined };\n}\n\n/**\n * Walks a transformer chain starting from a given transformer ID.\n * Returns ordered array of transformer IDs in the chain.\n *\n * Used for on-demand chain resolution:\n * - Called from destination.ts with destination.config.before\n * - Called from source.ts with source.config.next\n *\n * @param startId - First transformer in chain, or explicit array of transformer IDs\n * @param transformers - Available transformer configs with optional `next` field\n * @returns Ordered array of transformer IDs to execute\n *\n * @example\n * // Single transformer\n * walkChain('redact', { redact: {} }) // ['redact']\n *\n * @example\n * // Chain via next\n * walkChain('a', { a: { next: 'b' }, b: { next: 'c' }, c: {} }) // ['a', 'b', 'c']\n *\n * @example\n * // Explicit array\n * walkChain(['x', 'y'], {}) // ['x', 'y']\n */\nexport function walkChain(\n startId: string | string[] | undefined,\n transformers: Record<string, { next?: string | string[] }> = {},\n): string[] {\n if (!startId) return [];\n\n // If array provided, use it directly (explicit chain)\n if (Array.isArray(startId)) {\n return startId;\n }\n\n // Walk the chain via transformer.next links\n const chain: string[] = [];\n const visited = new Set<string>();\n let current: string | undefined = startId;\n\n while (current && transformers[current]) {\n if (visited.has(current)) {\n // Circular reference detected - stop walking\n break;\n }\n visited.add(current);\n chain.push(current);\n\n const next: string | string[] | undefined = transformers[current].next;\n\n // If transformer has array next, append it and stop walking\n if (Array.isArray(next)) {\n chain.push(...next);\n break;\n }\n\n current = next;\n }\n\n return chain;\n}\n\n/**\n * Initializes transformer instances from configuration.\n * Does NOT call transformer.init() - that happens lazily before first push.\n *\n * @param collector - The collector instance\n * @param initTransformers - Transformer initialization configurations\n * @returns Initialized transformer instances\n */\nexport async function initTransformers(\n collector: Collector.Instance,\n initTransformers: Transformer.InitTransformers = {},\n): Promise<Transformer.Transformers> {\n const result: Transformer.Transformers = {};\n\n for (const [transformerId, transformerDef] of Object.entries(\n initTransformers,\n )) {\n const { code, env = {} } = transformerDef;\n\n // Use unified chain property extractor\n const { config: configWithChain } = extractChainProperty(\n transformerDef,\n 'next',\n );\n\n // Build transformer context for init\n const transformerLogger = collector.logger\n .scope('transformer')\n .scope(transformerId);\n\n const context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: configWithChain,\n env: env as Transformer.Env,\n };\n\n // Initialize the transformer instance with context\n const instance = await code(context);\n\n result[transformerId] = instance;\n }\n\n return result;\n}\n\n/**\n * Initializes a transformer if it hasn't been initialized yet.\n * Called lazily before first push.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to initialize\n * @param transformerId - The transformer ID\n * @returns Whether initialization succeeded\n */\nexport async function transformerInit(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n): Promise<boolean> {\n // Check if already initialized\n if (transformer.init && !transformer.config.init) {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('init');\n\n const configResult = await useHooks(\n transformer.init,\n 'TransformerInit',\n collector.hooks,\n )(context);\n\n // Check for initialization failure\n if (configResult === false) return false;\n\n // Update config if returned\n transformer.config = {\n ...(configResult || transformer.config),\n init: true,\n };\n\n transformerLogger.debug('init done');\n }\n\n return true;\n}\n\n/**\n * Pushes an event through a single transformer.\n *\n * @param collector - The collector instance\n * @param transformer - The transformer to push to\n * @param transformerId - The transformer ID\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event, void for passthrough, or false to stop chain\n */\nexport async function transformerPush(\n collector: Collector.Instance,\n transformer: Transformer.Instance,\n transformerId: string,\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | false | void> {\n const transformerType = transformer.type || 'unknown';\n const transformerLogger = collector.logger.scope(\n `transformer:${transformerType}`,\n );\n\n const context: Transformer.Context = {\n collector,\n logger: transformerLogger,\n id: transformerId,\n ingest, // Same frozen reference, no copying\n config: transformer.config,\n env: mergeTransformerEnvironments(transformer.config.env),\n };\n\n transformerLogger.debug('push', { event: (event as { name?: string }).name });\n\n const result = await useHooks(\n transformer.push,\n 'TransformerPush',\n collector.hooks,\n )(event, context);\n\n transformerLogger.debug('push done');\n\n return result;\n}\n\n/**\n * Runs an event through a chain of transformers.\n *\n * @param collector - The collector instance with transformers\n * @param transformers - Map of transformer instances\n * @param chain - Ordered array of transformer IDs to execute\n * @param event - The event to process\n * @param ingest - Optional ingest metadata (frozen, same reference)\n * @returns The processed event or null if chain was stopped\n */\nexport async function runTransformerChain(\n collector: Collector.Instance,\n transformers: Transformer.Transformers,\n chain: string[],\n event: WalkerOS.DeepPartialEvent,\n ingest?: unknown,\n): Promise<WalkerOS.DeepPartialEvent | null> {\n let processedEvent = event;\n\n for (const transformerName of chain) {\n const transformer = transformers[transformerName];\n if (!transformer) {\n collector.logger.info(`Transformer not found: ${transformerName}`);\n continue;\n }\n\n // Initialize transformer if needed\n const isInitialized = await tryCatchAsync(transformerInit)(\n collector,\n transformer,\n transformerName,\n );\n\n if (!isInitialized) {\n collector.logger.info(`Transformer init failed: ${transformerName}`);\n return null; // Stop chain on init failure\n }\n\n // Run the transformer\n const result = (await tryCatchAsync(transformerPush, (err) => {\n collector.logger\n .scope(`transformer:${transformer.type || 'unknown'}`)\n .error('Push failed', { error: err });\n return false; // Stop chain on error\n })(collector, transformer, transformerName, processedEvent, ingest)) as\n | WalkerOS.DeepPartialEvent\n | false\n | void;\n\n // Handle result\n if (result === false) {\n // Transformer explicitly stopped the chain\n return null;\n }\n\n if (result !== undefined) {\n // Transformer returned a modified event\n processedEvent = result;\n }\n // If result is undefined (void), continue with current event unchanged\n }\n\n return processedEvent;\n}\n\n/**\n * Merges transformer environments.\n */\nfunction mergeTransformerEnvironments(\n configEnv?: Transformer.Env,\n): Transformer.Env {\n if (!configEnv) return {};\n if (isObject(configEnv)) return configEnv;\n return {};\n}\n","import type { Collector } from '@walkeros/core';\nimport { initSource } from './source';\nimport { registerDestination } from './destination';\n\n/**\n * Activate pending sources and destinations whose require conditions are met.\n * Called from onApply after each non-vetoed event.\n *\n * Mutates require arrays in place — removes the fulfilled event type.\n * When require is empty, initializes and moves to active maps.\n *\n * Re-entrancy safe: delete-before-init ensures nested calls see clean state.\n */\nexport async function activatePending(\n collector: Collector.Instance,\n type: string,\n): Promise<void> {\n for (const [id, def] of Object.entries(collector.pending.sources)) {\n // Re-entrancy guard: skip if already processed by nested call\n if (!collector.pending.sources[id] || collector.sources[id]) continue;\n\n const require = def.config?.require;\n if (!require) continue;\n\n const idx = require.indexOf(type);\n if (idx === -1) continue;\n require.splice(idx, 1);\n\n if (require.length > 0) continue;\n\n delete collector.pending.sources[id];\n const instance = await initSource(collector, id, def);\n if (instance) collector.sources[id] = instance;\n }\n\n for (const [id, def] of Object.entries(collector.pending.destinations)) {\n if (!collector.pending.destinations[id] || collector.destinations[id])\n continue;\n\n const require = def.config?.require;\n if (!require) continue;\n\n const idx = require.indexOf(type);\n if (idx === -1) continue;\n require.splice(idx, 1);\n\n if (require.length > 0) continue;\n\n delete collector.pending.destinations[id];\n const instance = registerDestination(def);\n if (instance.config.queue !== false) {\n instance.queuePush = [...collector.queue];\n }\n collector.destinations[id] = instance;\n }\n}\n","import type { Collector, WalkerOS, Destination, Elb, On } from '@walkeros/core';\nimport { Const } from './constants';\nimport {\n addDestination,\n pushToDestinations,\n createPushResult,\n} from './destination';\nimport { assign, getId, isFunction, isString } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\nimport { processConsent } from './consent';\nimport { on, onApply } from './on';\nimport type { RunState } from './types/collector';\n\n/**\n * Handles common commands.\n *\n * @param collector The walkerOS collector instance.\n * @param action The action to handle.\n * @param data The data to handle.\n * @param options The options to handle.\n * @returns A promise that resolves with the push result or undefined.\n */\nexport async function commonHandleCommand(\n collector: Collector.Instance,\n action: string,\n data?: unknown,\n options?: unknown,\n): Promise<Elb.PushResult> {\n let result: Elb.PushResult | undefined;\n let onData: unknown;\n let shouldNotify = false;\n let consentRunQueue = false;\n\n switch (action) {\n case Const.Commands.Config:\n if (isObject(data)) {\n assign(collector.config, data as Partial<Collector.Config>, {\n shallow: false,\n });\n onData = data;\n shouldNotify = true;\n }\n break;\n\n case Const.Commands.Consent:\n if (isObject(data)) {\n const { update, runQueue } = processConsent(\n collector,\n data as WalkerOS.Consent,\n );\n onData = update;\n shouldNotify = true;\n consentRunQueue = runQueue;\n }\n break;\n\n case Const.Commands.Custom:\n if (isObject(data)) {\n collector.custom = assign(\n collector.custom,\n data as WalkerOS.Properties,\n );\n onData = data;\n shouldNotify = true;\n }\n break;\n\n case Const.Commands.Destination:\n if (isObject(data)) {\n // Support both { code, before } format and legacy { push } format\n if ('code' in data && isObject((data as Destination.Init).code)) {\n // New format: { code, before?, config?, env? }\n result = await addDestination(\n collector,\n data as Destination.Init,\n options as Destination.Config,\n );\n } else if (isFunction(data.push)) {\n // Legacy format: direct destination instance\n result = await addDestination(\n collector,\n { code: data as unknown as Destination.Instance },\n options as Destination.Config,\n );\n }\n }\n break;\n\n case Const.Commands.Globals:\n if (isObject(data)) {\n collector.globals = assign(\n collector.globals,\n data as WalkerOS.Properties,\n );\n onData = data;\n shouldNotify = true;\n }\n break;\n\n case Const.Commands.On:\n if (isString(data)) {\n await on(\n collector,\n data as On.Types,\n options as WalkerOS.SingleOrArray<On.Options>,\n );\n // on() handles its own onApply (fires only new callbacks)\n }\n break;\n\n case Const.Commands.Ready:\n shouldNotify = true;\n break;\n\n case Const.Commands.Run:\n result = await runCollector(collector, data as RunState);\n shouldNotify = true;\n break;\n\n case Const.Commands.Session:\n shouldNotify = true;\n break;\n\n case Const.Commands.User:\n if (isObject(data)) {\n assign(collector.user, data as WalkerOS.User, { shallow: false });\n onData = data;\n shouldNotify = true;\n }\n break;\n }\n\n // Single notification point for all state-mutation commands\n if (shouldNotify) {\n await onApply(collector, action as On.Types, undefined, onData);\n }\n\n // Post-notification side effects\n if (consentRunQueue) {\n result = await pushToDestinations(collector);\n }\n\n return result || createPushResult({ ok: true });\n}\n\n/**\n * Creates a full event from a partial event.\n *\n * @param collector The walkerOS collector instance.\n * @param partialEvent The partial event to transform.\n * @returns The full event.\n */\nexport function createEvent(\n collector: Collector.Instance,\n partialEvent: WalkerOS.PartialEvent,\n): WalkerOS.Event {\n if (!partialEvent.name) throw new Error('Event name is required');\n\n const [entityValue, actionValue] = partialEvent.name.split(' ');\n if (!entityValue || !actionValue) throw new Error('Event name is invalid');\n\n ++collector.count;\n\n const {\n timestamp = Date.now(),\n group = collector.group,\n count = collector.count,\n } = partialEvent;\n\n const {\n name = `${entityValue} ${actionValue}`,\n data = {},\n context = {},\n globals = collector.globals,\n custom = {},\n user = collector.user,\n nested = [],\n consent = collector.consent,\n id = `${timestamp}-${group}-${count}`,\n trigger = '',\n entity = entityValue,\n action = actionValue,\n timing = 0,\n version = {\n source: collector.version,\n tagging: collector.config.tagging || 0,\n },\n source = { type: 'collector', id: '', previous_id: '' },\n } = partialEvent;\n\n return {\n name,\n data,\n context,\n globals,\n custom,\n user,\n nested,\n consent,\n id,\n trigger,\n entity,\n action,\n timestamp,\n timing,\n group,\n count,\n version,\n source,\n };\n}\n\n/**\n * Runs the collector by setting it to allowed state and processing queued events.\n *\n * @param collector The walkerOS collector instance.\n * @param state Optional state to merge with the collector (user, globals, consent, custom).\n * @returns A promise that resolves with the push result.\n */\nexport async function runCollector(\n collector: Collector.Instance,\n state?: RunState,\n): Promise<Elb.PushResult> {\n // Set the collector to allowed state\n collector.allowed = true;\n\n // Reset count and generate new group ID\n collector.count = 0;\n collector.group = getId();\n\n // Update timing for this run\n collector.timing = Date.now();\n\n // Update collector state if provided\n if (state) {\n // Update consent if provided\n if (state.consent) {\n collector.consent = assign(collector.consent, state.consent);\n }\n\n // Update user if provided\n if (state.user) {\n collector.user = assign(collector.user, state.user);\n }\n\n // Update globals if provided\n if (state.globals) {\n collector.globals = assign(\n collector.config.globalsStatic || {},\n state.globals,\n );\n }\n\n // Update custom if provided\n if (state.custom) {\n collector.custom = assign(collector.custom, state.custom);\n }\n }\n\n // Reset destination queues\n Object.values(collector.destinations).forEach((destination) => {\n destination.queuePush = [];\n });\n\n // Reset collector queue for this run\n collector.queue = [];\n\n // Increase round counter\n collector.round++;\n\n // Process any queued events now that the collector is allowed\n const result = await pushToDestinations(collector);\n\n return result;\n}\n","import type { Collector, WalkerOS, Elb } from '@walkeros/core';\nimport {\n getGrantedConsent,\n processEventMapping,\n tryCatchAsync,\n useHooks,\n} from '@walkeros/core';\nimport { createEvent } from './handle';\nimport { pushToDestinations, createPushResult } from './destination';\nimport { runTransformerChain } from './transformer';\n\n/**\n * Creates the push function for the collector.\n * Handles source mapping, event creation, and routing to destinations.\n *\n * @param collector - The walkerOS collector instance\n * @param prepareEvent - Function to enrich partial events\n * @returns The push function\n */\nexport function createPush<T extends Collector.Instance>(\n collector: T,\n prepareEvent: (event: WalkerOS.DeepPartialEvent) => WalkerOS.PartialEvent,\n): Collector.PushFn {\n return useHooks(\n async (\n event: WalkerOS.DeepPartialEvent,\n options: Collector.PushOptions = {},\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n const pushStart = Date.now();\n const { id, ingest, mapping, preChain } = options;\n let partialEvent = event;\n\n // Freeze ingest for performance (pass by reference, no copying)\n const frozenIngest = ingest ? Object.freeze(ingest) : undefined;\n\n // Apply source mapping if provided in options\n if (mapping) {\n const processed = await processEventMapping(\n partialEvent,\n mapping,\n collector,\n );\n\n // Check ignore flag\n if (processed.ignore) {\n return createPushResult({ ok: true });\n }\n\n // Check consent requirements\n if (mapping.consent) {\n const grantedConsent = getGrantedConsent(\n mapping.consent,\n collector.consent,\n processed.event.consent as WalkerOS.Consent | undefined,\n );\n\n if (!grantedConsent) {\n return createPushResult({ ok: true });\n }\n }\n\n partialEvent = processed.event;\n }\n\n // Run pre-collector transformer chain if provided in options\n if (\n preChain?.length &&\n collector.transformers &&\n Object.keys(collector.transformers).length > 0\n ) {\n const processedEvent = await runTransformerChain(\n collector,\n collector.transformers,\n preChain,\n partialEvent,\n frozenIngest,\n );\n\n // Chain was stopped - event dropped\n if (processedEvent === null) {\n return createPushResult({ ok: true });\n }\n\n partialEvent = processedEvent;\n }\n\n // Prepare event (add timing, source info)\n const enrichedEvent = prepareEvent(partialEvent);\n\n // Create full event\n const fullEvent = createEvent(collector, enrichedEvent);\n\n // Push to destinations with id and ingest\n const result = await pushToDestinations(collector, fullEvent, {\n id,\n ingest: frozenIngest,\n });\n\n // Update source status\n if (id) {\n if (!collector.status.sources[id]) {\n collector.status.sources[id] = {\n count: 0,\n duration: 0,\n };\n }\n const sourceStatus = collector.status.sources[id];\n sourceStatus.count++;\n sourceStatus.lastAt = Date.now();\n sourceStatus.duration += Date.now() - pushStart;\n }\n\n return result;\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Push',\n collector.hooks,\n ) as Collector.PushFn;\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { HandleCommandFn } from './types/collector';\nimport { useHooks, tryCatchAsync } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the command function for the collector.\n * Handles walker commands (config, consent, destination, etc.)\n *\n * @param collector - The walkerOS collector instance\n * @param handleCommand - Command handler function\n * @returns The command function\n */\nexport function createCommand<T extends Collector.Instance>(\n collector: T,\n handleCommand: HandleCommandFn<T>,\n): Collector.CommandFn {\n return useHooks(\n async (\n command: string,\n data?: unknown,\n options?: unknown,\n ): Promise<Elb.PushResult> => {\n return await tryCatchAsync(\n async (): Promise<Elb.PushResult> => {\n return await handleCommand(collector, command, data, options);\n },\n () => {\n return createPushResult({ ok: false });\n },\n )();\n },\n 'Command',\n collector.hooks,\n ) as Collector.CommandFn;\n}\n","import type { Collector, Source, WalkerOS, Elb } from '@walkeros/core';\nimport { createPushResult } from './destination';\n\n/**\n * Creates the default ELB source.\n * Routes between collector.push and collector.command based on input.\n * Provides backward-compatible flexible argument interface.\n *\n * @param collector - The walkerOS collector instance\n * @returns ELB source instance\n */\nexport function createElbSource(\n collector: Collector.Instance,\n): Source.Instance {\n return {\n type: 'elb',\n config: {},\n\n // The push function is the elb() interface users interact with\n push: async (\n eventOrCommand?: unknown,\n data?: unknown,\n options?: unknown,\n context?: unknown,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n ): Promise<Elb.PushResult> => {\n // Detect walker commands\n if (\n typeof eventOrCommand === 'string' &&\n eventOrCommand.startsWith('walker ')\n ) {\n const command = eventOrCommand.replace('walker ', '');\n return collector.command(command, data, options);\n }\n\n // Build event object\n let event: WalkerOS.DeepPartialEvent;\n\n if (typeof eventOrCommand === 'string') {\n // Convert string to object: elb('page view', { title: 'Home' })\n event = { name: eventOrCommand };\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = data as WalkerOS.Properties;\n }\n } else if (eventOrCommand && typeof eventOrCommand === 'object') {\n // Use object directly: elb({ name: 'page view', data: {...} })\n event = eventOrCommand as WalkerOS.DeepPartialEvent;\n // Merge additional data if provided\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n event.data = {\n ...(event.data || {}),\n ...(data as WalkerOS.Properties),\n };\n }\n } else {\n // Invalid input\n return createPushResult({ ok: false });\n }\n\n // Add optional properties if provided\n if (context && typeof context === 'object') {\n event.context = context as WalkerOS.OrderedProperties;\n }\n if (nested && Array.isArray(nested)) {\n event.nested = nested;\n }\n if (custom && typeof custom === 'object') {\n event.custom = custom as WalkerOS.Properties;\n }\n\n // Call collector.push with event object\n return collector.push(event);\n },\n };\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport type { StartFlow } from './types';\nimport { collector } from './collector';\nimport { createElbSource } from './elb';\nimport { initSources } from './source';\n\nexport async function startFlow<ElbPush extends Elb.Fn = Elb.Fn>(\n initConfig?: Collector.InitConfig,\n): Promise<StartFlow<ElbPush>> {\n initConfig = initConfig || {};\n const instance = await collector(initConfig);\n\n // Create and register ELB source first\n const elbSource = createElbSource(instance);\n instance.sources.elb = elbSource;\n\n // Now initialize other sources with ELB source available\n const additionalSources = await initSources(\n instance,\n initConfig.sources || {},\n );\n Object.assign(instance.sources, additionalSources);\n\n const { consent, user, globals, custom } = initConfig;\n\n if (consent) await instance.command('consent', consent);\n if (user) await instance.command('user', user);\n if (globals) Object.assign(instance.globals, globals);\n if (custom) Object.assign(instance.custom, custom);\n\n if (instance.config.run) await instance.command('run');\n\n // Determine the primary elb:\n // 1. Use explicitly marked primary source\n // 2. Use first non-elb source if any exist\n // 3. Fallback to ELB source\n let primaryElb: Elb.Fn = elbSource.push as Elb.Fn;\n\n const sources = Object.values(instance.sources).filter(\n (source) => source.type !== 'elb',\n );\n\n // First, check for explicitly marked primary source\n const markedPrimary = sources.find(\n (source) => (source.config as { primary?: boolean }).primary,\n );\n\n if (markedPrimary) {\n primaryElb = markedPrimary.push as Elb.Fn;\n } else if (sources.length > 0) {\n // Use first source as default\n primaryElb = sources[0].push as Elb.Fn;\n }\n\n return {\n collector: instance,\n elb: primaryElb as ElbPush,\n };\n}\n"],"mappings":"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","names":["collector","assign","assign","isObject","tryCatchAsync","useHooks","tryCatchAsync","tryCatchAsync","collector","initTransformers","collector","tryCatchAsync","collector","require","collector","on","option","tryCatchAsync","collector","event","isInitialized","tryCatchAsync","assign","useHooks","batchState","isObject","assign","getId","isFunction","isObject","collector","isObject","assign","isFunction","getId","getGrantedConsent","processEventMapping","tryCatchAsync","useHooks","collector","useHooks","tryCatchAsync","processEventMapping","getGrantedConsent","useHooks","tryCatchAsync","collector","useHooks","tryCatchAsync","assign","collector","collector"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/collector",
|
|
3
3
|
"description": "Unified platform-agnostic collector for walkerOS",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"update": "npx npm-check-updates -u && npm update"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@walkeros/core": "1.
|
|
33
|
+
"@walkeros/core": "1.3.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {},
|
|
36
36
|
"repository": {
|