@walkeros/server-destination-rudderstack 4.8.1-next-1792019907609 → 4.8.2

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.mjs CHANGED
@@ -1 +1 @@
1
- var t=(t=>"undefined"!=typeof require?require:"undefined"!=typeof Proxy?new Proxy(t,{get:(t,e)=>("undefined"!=typeof require?require:t)[e]}):t)(function(t){if("undefined"!=typeof require)return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import{getMappingValue as e,isObject as r,isString as n,isArray as i}from"@walkeros/core";var s=async function(t,{config:s,rule:u,data:d,collector:c,env:p,logger:l}){const f=s.settings,y=f._analytics,m=p?.analytics,g=m||y;if(!g)return void l.warn("RudderStack Analytics not initialized");const I=f._state||{},w=u?.settings||{},v=new Date(t.timestamp||Date.now()),h=f.userId?a(await e(t,f.userId,{collector:c})):void 0,k=f.anonymousId?a(await e(t,f.anonymousId,{collector:c})):void 0;if(!h&&!k)return void l.warn("RudderStack requires userId or anonymousId; skipping event",{event:t.name});const q={};h&&(q.userId=h),k&&(q.anonymousId=k);const _=w.identify??f.identify;if(void 0!==_){const s=await e(t,_,{collector:c});r(s)&&function(t,e,s,a,u){const d=a.lastIdentity||{},c=n(e.userId)?e.userId:s.userId,p=r(e.traits)&&!i(e.traits)?e.traits:void 0,l=o(p),f=c!==d.userId,y=l!==(d.traitsHash??"");if(!f&&!y)return;const m={...s,timestamp:u};c&&(m.userId=c);p&&(m.traits=p);t.identify(m),a.lastIdentity={userId:c,anonymousId:s.anonymousId,traitsHash:l}}(g,s,q,I,v)}const P=w.group??f.group;if(void 0!==P){const s=await e(t,P,{collector:c});r(s)&&function(t,e,s,a,u){const d=n(e.groupId)?e.groupId:void 0;if(!d)return;const c=a.lastGroup||{},p=r(e.traits)&&!i(e.traits)?e.traits:void 0,l=o(p),f=d!==c.groupId,y=l!==(c.traitsHash??"");if(!f&&!y)return;const m={...s,groupId:d,timestamp:u};p&&(m.traits=p);t.group(m),a.lastGroup={groupId:d,traitsHash:l}}(g,s,q,I,v)}if(void 0!==w.page&&await async function(t,s,a,o,u,d){const c={...o,timestamp:d};if(!0===s)return c.name="",void t.page(c);const p=await e(a,s,{collector:u});if(!r(p))return;const l=p;c.name=n(l.name)?l.name:"",r(l.properties)&&!i(l.properties)&&(c.properties=l.properties);t.page(c)}(g,w.page,t,q,c,v),void 0!==w.screen&&await async function(t,s,a,o,u,d){const c={...o,timestamp:d};if(!0===s)return c.name="",void t.screen(c);const p=await e(a,s,{collector:u});if(!r(p))return;const l=p;c.name=n(l.name)?l.name:"",r(l.properties)&&!i(l.properties)&&(c.properties=l.properties);t.screen(c)}(g,w.screen,t,q,c,v),void 0!==w.alias&&await async function(t,i,s,a,o,u){const d=await e(s,i,{collector:o});if(!r(d))return;const c=d,p=n(c.previousId)?c.previousId:void 0;if(!p)return;const l={previousId:p,timestamp:u};a.userId&&(l.userId=a.userId);t.alias(l)}(g,w.alias,t,q,c,v),!0!==u?.silent){const e=n(u?.name)?u.name:t.name,i=r(d)?d:{};g.track({...q,event:e,properties:i,timestamp:v})}f._state=I};function a(t){if(n(t)&&t.length>0)return t}function o(t){if(!t)return"";try{return JSON.stringify(t)}catch{return""}}var u={},d={type:"rudderstack",config:{},init({config:e,logger:r,env:n}){const i=function(t={},e){const r=t.settings||{},{writeKey:n,dataPlaneUrl:i}=r;n||e.throw("Config settings writeKey missing"),i||e.throw("Config settings dataPlaneUrl missing");const s={...r,writeKey:n,dataPlaneUrl:i,userId:r.userId??"user.id",anonymousId:r.anonymousId??"user.session"};return{...t,settings:s}}(e,r),s=i.settings,a=n?.analytics;if(!a)try{const e=t("@rudderstack/rudder-sdk-node"),{writeKey:r,dataPlaneUrl:n,userId:i,anonymousId:a,identify:o,group:u,integrations:d,_analytics:c,_state:p,...l}=s,f=new e(r,{dataPlaneUrl:n,...l});s._analytics=f}catch(t){r.throw(`Failed to initialize RudderStack SDK: ${t}`)}return s._state={},i},push:async(t,e)=>await s(t,e),async destroy({config:t}){const e=(t?.settings||{})._analytics;e&&await e.flush()}},c=d;export{u as DestinationRudderStack,c as default,d as destinationRudderStack};//# sourceMappingURL=index.mjs.map
1
+ import{createRequire as t}from"module";const e=t(import.meta.url);var r=(t=>void 0!==e?e:"undefined"!=typeof Proxy?new Proxy(t,{get:(t,r)=>(void 0!==e?e:t)[r]}):t)(function(t){if(void 0!==e)return e.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import{StepError as n}from"@walkeros/core";import{retryBudget as o}from"@walkeros/server-core";import{StepError as s}from"@walkeros/core";import{getMappingValue as i,isObject as a,isString as c,isArray as d,isThenable as u,StepError as l}from"@walkeros/core";import{batchOutcome as f}from"@walkeros/server-core";function p(t,e){const r=new Promise((r,n)=>{const o=e=>n(function(t,e){const r="object"==typeof e&&null!==e?Reflect.get(e,"code"):void 0;return new l(t,{code:"ECONNABORTED"===r||"ETIMEDOUT"===r?"timeout":"transport",cause:e})}(t,e));let s;try{s=e(t=>t?o(t):r())}catch(t){return void o(t)}u(s)&&s.then(()=>r(),o)});return r.catch(()=>{}),r}function g(t,e){if(t.id)return e?`${t.id}-${e}`:t.id}function m(t,e,r){const n=g(e,r);return n?{...t,messageId:n}:t}function y(t,e){const r=(t._flushing??Promise.resolve()).then(()=>e.flush());return t._flushing=r.catch(()=>{}),r}function h(t,e,r,n){t.debug(`RudderStack skipped ${r}: ${n} resolved to nothing`,{event:e.name})}async function w(t){for(const e of await t)if("rejected"===e.status)throw e.reason}async function I(t,e,r,n,o,s,u){const f=n._state||{};n._state=f;const y=e?.settings||{},w=new Date(t.timestamp||Date.now()),I=n.userId?k(await i(t,n.userId,{collector:s})):void 0,v=n.anonymousId?k(await i(t,n.anonymousId,{collector:s})):void 0;if(!I&&!v)throw new l("RudderStack needs a userId or anonymousId for the event",{code:"missing-input"});const R={};I&&(R.userId=I),v&&(R.anonymousId=v);const P=[],_=y.identify??n.identify;if(void 0!==_){const e=await i(t,_,{collector:s});a(e)?P.push(function(t,e,r,n,o){const s=n.lastIdentity||{},i=c(e.userId)?e.userId:r.userId,u=a(e.traits)&&!d(e.traits)?e.traits:void 0,l=S(u),f=i!==s.userId,g=l!==(s.traitsHash??"");if(!f&&!g)return;const m={...r,timestamp:o};i&&(m.userId=i);u&&(m.traits=u);const y={userId:i,anonymousId:r.anonymousId,traitsHash:l};return n.lastIdentity=y,p("RudderStack identify failed",e=>t.identify(m,e)).catch(t=>{throw n.lastIdentity===y&&(n.lastIdentity=void 0),t})}(o,e,m(R,t,"identify"),f,w)):h(u,t,"identify","identify")}const D=y.group??n.group;if(void 0!==D){const e=await i(t,D,{collector:s});a(e)&&c(e.groupId)?P.push(function(t,e,r,n,o){const s=c(e.groupId)?e.groupId:void 0;if(!s)return;const i=n.lastGroup||{},u=a(e.traits)&&!d(e.traits)?e.traits:void 0,l=S(u),f=s!==i.groupId,g=l!==(i.traitsHash??"");if(!f&&!g)return;const m={...r,groupId:s,timestamp:o};u&&(m.traits=u);const y={groupId:s,traitsHash:l};return n.lastGroup=y,p("RudderStack group failed",e=>t.group(m,e)).catch(t=>{throw n.lastGroup===y&&(n.lastGroup=void 0),t})}(o,e,m(R,t,"group"),f,w)):h(u,t,"group","group")}if(void 0!==y.page){const{sent:e}=await async function(t,e,r,n,o,s){const u={...n,timestamp:s};if(!0===e)return{sent:p("RudderStack page failed",e=>t.page(u,e))};const l=await i(r,e,{collector:o});if(!a(l))return{};const f=l;c(f.category)&&(u.category=f.category);c(f.name)&&(u.name=f.name);a(f.properties)&&!d(f.properties)&&(u.properties=f.properties);return{sent:p("RudderStack page failed",e=>t.page(u,e))}}(o,y.page,t,m(R,t,"page"),s,w);e?P.push(e):h(u,t,"page","page")}if(void 0!==y.screen){const{sent:e}=await async function(t,e,r,n,o,s){const u={...n,timestamp:s};if(!0===e)return{sent:p("RudderStack screen failed",e=>t.screen(u,e))};const l=await i(r,e,{collector:o});if(!a(l))return{};const f=l;c(f.category)&&(u.category=f.category);c(f.name)&&(u.name=f.name);a(f.properties)&&!d(f.properties)&&(u.properties=f.properties);return{sent:p("RudderStack screen failed",e=>t.screen(u,e))}}(o,y.screen,t,m(R,t,"screen"),s,w);e?P.push(e):h(u,t,"screen","screen")}if(void 0!==y.alias){const{sent:e}=await async function(t,e,r,n,o,s){const d=await i(r,e,{collector:o});if(!a(d))return{};const u=d,l=c(u.previousId)?u.previousId:void 0;if(!l)return{};const f={previousId:l,timestamp:s};n.userId&&(f.userId=n.userId);n.messageId&&(f.messageId=n.messageId);return{sent:p("RudderStack alias failed",e=>t.alias(f,e))}}(o,y.alias,t,m(R,t,"alias"),s,w);e?P.push(e):h(u,t,"alias","alias")}if(!0!==e?.silent){const n=c(e?.name)?e.name:t.name,s=a(r)?r:{},i={...R,event:n,properties:s,timestamp:w},d=g(t);d&&(i.messageId=d),P.push(p("RudderStack track failed",t=>o.track(i,t)))}return P.filter(t=>void 0!==t)}function v(t,e){const r=e?.analytics||t?._analytics;if(!t||!r)throw new l("RudderStack Analytics not initialized",{code:"not-ready"});return r}function k(t){if(c(t)&&t.length>0)return t}function S(t){if(!t)return"";try{return JSON.stringify(t)}catch{return""}}var R={},P={type:"rudderstack",config:{batch:{size:20,wait:1e4}},init({config:t,env:e}){const i=function(t={}){const e=t.settings||{},{writeKey:r,dataPlaneUrl:n}=e;if(!r||!n){const t=[...r?[]:["writeKey"],...n?[]:["dataPlaneUrl"]];throw new s(`Config settings ${t.join(", ")} missing`,{code:"config"})}const o={...e,writeKey:r,dataPlaneUrl:n,userId:e.userId??"user.id",anonymousId:e.anonymousId??"user.session"};return{...t,settings:o}}(t),{settings:a}=i;if(!e?.analytics)try{const e=r("@rudderstack/rudder-sdk-node"),{writeKey:n,dataPlaneUrl:s,userId:i,anonymousId:c,identify:d,group:u,integrations:l,_analytics:f,_state:p,...g}=a,m=o(t.timeout);a._analytics=new e(n,{dataPlaneUrl:s,timeout:m.attempt,retryCount:m.retries,axiosRetryConfig:{retryDelay:()=>m.wait,shouldResetTimeout:!0},...g,errorHandler:()=>{}})}catch(t){throw new n("Failed to initialize the RudderStack SDK",{code:"not-ready",cause:t})}return a._state={},i},push:async function(t,{config:e,rule:r,data:n,collector:o,env:s,logger:i}){const a=e.settings??{},c=v(e.settings,s),d=await I(t,r,n,a,c,o,i);if(d.length){const t=Promise.allSettled(d);await y(a,c),await w(t)}},pushBatch:async function(t,{config:e,collector:r,env:n,logger:o}){const s=e.settings??{},i=v(e.settings,n),a=[];for(const e of t.entries)try{const t=await I(e.event,e.rule,e.data,s,i,r,o);a.push({settled:Promise.allSettled(t)})}catch(t){a.push({error:t})}await y(s,i);const c=[];for(const[t,{settled:e,error:r}]of a.entries())e?await w(e).catch(e=>c.push({index:t,error:e})):c.push({index:t,error:r});return f(t.entries.length,c)},async destroy({config:t}){const e=t?.settings?._analytics;e&&await e.flush()}},_=P;export{R as DestinationRudderStack,_ as default,P as destinationRudderStack};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/push.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { Config, Settings, PartialConfig } from './types';\nimport type { Logger } from '@walkeros/core';\n\nexport function getConfig(\n partialConfig: PartialConfig = {},\n logger: Logger.Instance,\n): Config {\n const settings = (partialConfig.settings || {}) as Partial<Settings>;\n const { writeKey, dataPlaneUrl } = settings;\n\n if (!writeKey) logger.throw('Config settings writeKey missing');\n if (!dataPlaneUrl) logger.throw('Config settings dataPlaneUrl missing');\n\n const settingsConfig: Settings = {\n ...settings,\n writeKey,\n dataPlaneUrl,\n userId: settings.userId ?? 'user.id',\n anonymousId: settings.anonymousId ?? 'user.session',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type {\n PushFn,\n Settings,\n RuntimeState,\n RudderStackAnalyticsMock,\n} from './types';\nimport { getMappingValue, isObject, isString, isArray } from '@walkeros/core';\n\nexport const push: PushFn = async function (\n event,\n { config, rule, data, collector, env, logger },\n) {\n const settings = config.settings as Settings;\n const analytics = settings._analytics as unknown as\n | RudderStackAnalyticsMock\n | undefined;\n const envAnalytics = (\n env as { analytics?: RudderStackAnalyticsMock } | undefined\n )?.analytics;\n const sdk = envAnalytics || analytics;\n\n if (!sdk) {\n logger.warn('RudderStack Analytics not initialized');\n return;\n }\n\n const state: RuntimeState = settings._state || {};\n const mappingSettings = rule?.settings || {};\n const timestamp = new Date(event.timestamp || Date.now());\n\n // 1. Resolve identity from event\n const userId = settings.userId\n ? resolveString(\n await getMappingValue(event, settings.userId, { collector }),\n )\n : undefined;\n const anonymousId = settings.anonymousId\n ? resolveString(\n await getMappingValue(event, settings.anonymousId, { collector }),\n )\n : undefined;\n\n if (!userId && !anonymousId) {\n logger.warn('RudderStack requires userId or anonymousId; skipping event', {\n event: event.name,\n });\n return;\n }\n\n // Build identity object for every SDK call\n const identity: Record<string, unknown> = {};\n if (userId) identity.userId = userId;\n if (anonymousId) identity.anonymousId = anonymousId;\n\n // 2. Identify -- rule-level overrides destination-level\n const identifyMapping = mappingSettings.identify ?? settings.identify;\n if (identifyMapping !== undefined) {\n const resolved = await getMappingValue(event, identifyMapping, {\n collector,\n });\n if (isObject(resolved)) {\n applyIdentify(\n sdk,\n resolved as Record<string, unknown>,\n identity,\n state,\n timestamp,\n );\n }\n }\n\n // 3. Group -- rule-level overrides destination-level\n const groupMapping = mappingSettings.group ?? settings.group;\n if (groupMapping !== undefined) {\n const resolved = await getMappingValue(event, groupMapping, { collector });\n if (isObject(resolved)) {\n applyGroup(\n sdk,\n resolved as Record<string, unknown>,\n identity,\n state,\n timestamp,\n );\n }\n }\n\n // 4. Page\n if (mappingSettings.page !== undefined) {\n await applyPage(\n sdk,\n mappingSettings.page,\n event,\n identity,\n collector,\n timestamp,\n );\n }\n\n // 5. Screen\n if (mappingSettings.screen !== undefined) {\n await applyScreen(\n sdk,\n mappingSettings.screen,\n event,\n identity,\n collector,\n timestamp,\n );\n }\n\n // 6. Alias\n if (mappingSettings.alias !== undefined) {\n await applyAlias(\n sdk,\n mappingSettings.alias,\n event,\n identity,\n collector,\n timestamp,\n );\n }\n\n // 7. Track (unless silent: true)\n if (rule?.silent !== true) {\n const eventName = isString(rule?.name) ? rule.name : event.name;\n const properties = isObject(data) ? (data as Record<string, unknown>) : {};\n\n sdk.track({\n ...identity,\n event: eventName,\n properties,\n timestamp,\n });\n }\n\n settings._state = state;\n};\n\nfunction resolveString(value: unknown): string | undefined {\n if (isString(value) && value.length > 0) return value;\n return undefined;\n}\n\nfunction hashTraits(traits: Record<string, unknown> | undefined): string {\n if (!traits) return '';\n try {\n return JSON.stringify(traits);\n } catch {\n return '';\n }\n}\n\nfunction applyIdentify(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): void {\n const last = state.lastIdentity || {};\n\n // Per-event identify can override userId\n const identifyUserId = isString(resolved.userId)\n ? resolved.userId\n : (identity.userId as string | undefined);\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const userIdChanged = identifyUserId !== last.userId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n\n if (!userIdChanged && !traitsChanged) return;\n\n const params: Record<string, unknown> = {\n ...identity,\n timestamp,\n };\n if (identifyUserId) params.userId = identifyUserId;\n if (traits) params.traits = traits;\n\n sdk.identify(params);\n\n state.lastIdentity = {\n userId: identifyUserId,\n anonymousId: identity.anonymousId as string | undefined,\n traitsHash,\n };\n}\n\nfunction applyGroup(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): void {\n const groupId = isString(resolved.groupId) ? resolved.groupId : undefined;\n if (!groupId) return;\n\n const last = state.lastGroup || {};\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const groupIdChanged = groupId !== last.groupId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n if (!groupIdChanged && !traitsChanged) return;\n\n const params: Record<string, unknown> = {\n ...identity,\n groupId,\n timestamp,\n };\n if (traits) params.traits = traits;\n\n sdk.group(params);\n\n state.lastGroup = { groupId, traitsHash };\n}\n\nasync function applyPage(\n sdk: RudderStackAnalyticsMock,\n pageMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (pageMapping === true) {\n // Minimal page call -- RudderStack requires name, use empty string\n params.name = '';\n sdk.page(params);\n return;\n }\n\n const resolved = await getMappingValue(\n event,\n pageMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as {\n name?: unknown;\n properties?: unknown;\n };\n // RudderStack requires name -- fall back to empty string\n params.name = isString(r.name) ? r.name : '';\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n sdk.page(params);\n}\n\nasync function applyScreen(\n sdk: RudderStackAnalyticsMock,\n screenMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (screenMapping === true) {\n // Minimal screen call -- RudderStack requires name, use empty string\n params.name = '';\n sdk.screen(params);\n return;\n }\n\n const resolved = await getMappingValue(\n event,\n screenMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as {\n name?: unknown;\n properties?: unknown;\n };\n // RudderStack requires name -- fall back to empty string\n params.name = isString(r.name) ? r.name : '';\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n sdk.screen(params);\n}\n\nasync function applyAlias(\n sdk: RudderStackAnalyticsMock,\n aliasMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<void> {\n const resolved = await getMappingValue(\n event,\n aliasMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return;\n\n const r = resolved as { previousId?: unknown };\n const previousId = isString(r.previousId) ? r.previousId : undefined;\n if (!previousId) return;\n\n const params: Record<string, unknown> = {\n previousId,\n timestamp,\n };\n // Alias uses userId (the new canonical ID) -- not full identity spread\n if (identity.userId) params.userId = identity.userId;\n\n sdk.alias(params);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer } from '@walkeros/server-core';\n\nexport interface Settings {\n /** RudderStack source write key (required). */\n writeKey: string;\n /** RudderStack data plane URL (required). */\n dataPlaneUrl: string;\n /** walkerOS mapping value path to resolve userId from each event. */\n userId?: string;\n /** walkerOS mapping value path to resolve anonymousId from each event. */\n anonymousId?: string;\n /** Destination-level identity mapping (fires identify() on first push / change). */\n identify?: WalkerOSMapping.Value;\n /** Destination-level group mapping (fires group() on first push / change). */\n group?: WalkerOSMapping.Value;\n /** Downstream destination filtering. Passthrough to SDK integrations param. */\n integrations?: Record<string, boolean | Record<string, unknown>>;\n // SDK constructor options (passthrough)\n /** API path. Default: '/v1/batch'. */\n path?: string;\n /** Events to enqueue before flushing. Default: 20. */\n flushAt?: number;\n /** Max milliseconds before auto-flush. Default: 10000. */\n flushInterval?: number;\n /** Maximum batch payload size in bytes. Default: 460800 (~500KB). */\n maxQueueSize?: number;\n /** Maximum in-memory queue length. Default: 20000. */\n maxInternalQueueSize?: number;\n /** Log level. Default: 'info'. */\n logLevel?: string;\n /** Retry attempts for failed batches. Default: 3. */\n retryCount?: number;\n /** Completely disable the SDK. Default: false. */\n enable?: boolean;\n /** Enable gzip compression. Default: true. */\n gzip?: boolean;\n /** Runtime state -- not user-facing. Mutated by init/push. */\n _analytics?: unknown;\n _state?: RuntimeState;\n}\n\nexport interface RuntimeState {\n lastIdentity?: {\n userId?: string;\n anonymousId?: string;\n traitsHash?: string;\n };\n lastGroup?: {\n groupId?: string;\n traitsHash?: string;\n };\n}\n\nexport type InitSettings = Partial<Settings>;\n\n/**\n * Per-rule mapping settings. Every feature is a walkerOS mapping value\n * resolved via getMappingValue(). The resolved object's keys drive\n * which RudderStack SDK methods to call.\n */\nexport interface Mapping {\n identify?: WalkerOSMapping.Value;\n group?: WalkerOSMapping.Value;\n page?: WalkerOSMapping.Value | boolean;\n screen?: WalkerOSMapping.Value | boolean;\n alias?: WalkerOSMapping.Value;\n}\n\n/**\n * Env -- optional SDK override. Production leaves this undefined and the\n * destination creates a real Analytics instance. Tests provide a mock via\n * env.analytics.\n */\nexport interface Env extends DestinationServer.Env {\n analytics?: RudderStackAnalyticsMock;\n}\n\n/**\n * Mock-friendly interface for the Analytics instance methods the\n * destination actually calls. Tests can provide this via env.analytics\n * instead of the real SDK.\n */\nexport interface RudderStackAnalyticsMock {\n track: (params: Record<string, unknown>) => void;\n identify: (params: Record<string, unknown>) => void;\n group: (params: Record<string, unknown>) => void;\n page: (params: Record<string, unknown>) => void;\n screen: (params: Record<string, unknown>) => void;\n alias: (params: Record<string, unknown>) => void;\n flush: (callback?: (err?: Error, data?: unknown) => void) => Promise<void>;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n","import type { Destination, Settings, RudderStackAnalyticsMock } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationRudderStack from './types';\n\nexport const destinationRudderStack: Destination = {\n type: 'rudderstack',\n\n config: {},\n\n init({ config: partialConfig, logger, env }) {\n const config = getConfig(partialConfig, logger);\n const settings = config.settings as Settings;\n\n // Use env.analytics mock if provided (testing), otherwise create real SDK\n const envAnalytics = (\n env as { analytics?: RudderStackAnalyticsMock } | undefined\n )?.analytics;\n\n if (!envAnalytics) {\n // Production path: create real Analytics instance\n try {\n const Analytics = require('@rudderstack/rudder-sdk-node');\n const {\n writeKey,\n dataPlaneUrl,\n userId: _u,\n anonymousId: _a,\n identify: _i,\n group: _g,\n integrations: _int,\n _analytics: _existing,\n _state: _existingState,\n ...sdkOptions\n } = settings;\n\n // RudderStack uses positional constructor: new Analytics(writeKey, opts)\n const analytics = new Analytics(writeKey, {\n dataPlaneUrl,\n ...sdkOptions,\n });\n settings._analytics = analytics;\n } catch (err) {\n logger.throw(`Failed to initialize RudderStack SDK: ${err}`);\n }\n }\n\n settings._state = {};\n\n return config;\n },\n\n async push(event, context) {\n return await push(event, context);\n },\n\n async destroy({ config }) {\n const settings = (config?.settings || {}) as Settings;\n const analytics = settings._analytics;\n if (analytics) {\n await (analytics as unknown as RudderStackAnalyticsMock).flush();\n }\n },\n};\n\nexport default destinationRudderStack;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/types/index.ts"],"sourcesContent":["import type { Destination } from './types';\nimport { StepError } from '@walkeros/core';\nimport { retryBudget } from '@walkeros/server-core';\nimport { getConfig } from './config';\nimport { push, pushBatch } from './push';\n\n// Types\nexport * as DestinationRudderStack from './types';\n\nexport const destinationRudderStack: Destination = {\n type: 'rudderstack',\n\n // Batched by default, at the SDK's own former defaults (20 events, 10 s).\n config: { batch: { size: 20, wait: 10_000 } },\n\n init({ config: partialConfig, env }) {\n const config = getConfig(partialConfig);\n const { settings } = config;\n\n // Use env.analytics mock if provided (testing), otherwise create real SDK\n if (!env?.analytics) {\n // Production path: create real Analytics instance\n try {\n const Analytics = require('@rudderstack/rudder-sdk-node');\n const {\n writeKey,\n dataPlaneUrl,\n userId: _u,\n anonymousId: _a,\n identify: _i,\n group: _g,\n integrations: _int,\n _analytics: _existing,\n _state: _existingState,\n ...sdkOptions\n } = settings;\n\n // RudderStack uses positional constructor: new Analytics(writeKey, opts).\n // Each push and each batch flushes the SDK and waits until its calls\n // are sent. A failed send reaches each call's callback; the error\n // handler only keeps the SDK from rethrowing it as an unhandled\n // rejection. The SDK's own retry ends within config.timeout: a\n // quarter of it per request, two retries a tenth of it apart. A value\n // set in the settings wins.\n const budget = retryBudget(partialConfig.timeout);\n settings._analytics = new Analytics(writeKey, {\n dataPlaneUrl,\n timeout: budget.attempt,\n retryCount: budget.retries,\n axiosRetryConfig: {\n retryDelay: () => budget.wait,\n shouldResetTimeout: true,\n },\n ...sdkOptions,\n errorHandler: () => undefined,\n });\n } catch (err) {\n throw new StepError('Failed to initialize the RudderStack SDK', {\n code: 'not-ready',\n cause: err,\n });\n }\n }\n\n settings._state = {};\n\n return config;\n },\n\n push,\n\n pushBatch,\n\n async destroy({ config }) {\n const analytics = config?.settings?._analytics;\n if (analytics) await analytics.flush();\n },\n};\n\nexport default destinationRudderStack;\n","import type { Config, Settings, PartialConfig } from './types';\nimport { StepError } from '@walkeros/core';\n\nexport function getConfig(partialConfig: PartialConfig = {}): Config {\n const settings: Partial<Settings> = partialConfig.settings || {};\n const { writeKey, dataPlaneUrl } = settings;\n\n if (!writeKey || !dataPlaneUrl) {\n const missing = [\n ...(writeKey ? [] : ['writeKey']),\n ...(dataPlaneUrl ? [] : ['dataPlaneUrl']),\n ];\n throw new StepError(`Config settings ${missing.join(', ')} missing`, {\n code: 'config',\n });\n }\n\n const settingsConfig: Settings = {\n ...settings,\n writeKey,\n dataPlaneUrl,\n userId: settings.userId ?? 'user.id',\n anonymousId: settings.anonymousId ?? 'user.session',\n };\n\n return { ...partialConfig, settings: settingsConfig };\n}\n","import type { Collector, Destination, Logger, WalkerOS } from '@walkeros/core';\nimport type {\n PushFn,\n PushBatchFn,\n Settings,\n RuntimeState,\n RudderStackAnalyticsMock,\n RudderStackCallback,\n Rule,\n} from './types';\nimport {\n getMappingValue,\n isObject,\n isString,\n isArray,\n isThenable,\n StepError,\n} from '@walkeros/core';\nimport { batchOutcome } from '@walkeros/server-core';\n\n/**\n * Hand one call to the SDK. The promise settles once RudderStack sent it: the\n * SDK answers through the callback, with the error when the send failed; an\n * injected client may answer with a promise instead. A call the SDK refuses\n * at once (it validates each message) fails the same way. The promise is\n * marked handled at once, since its event's outcome reads it only after the\n * flush.\n */\nfunction call(\n message: string,\n send: (done: RudderStackCallback) => unknown,\n): Promise<void> {\n const sent = new Promise<void>((resolve, reject) => {\n const fail = (error: unknown) => reject(failure(message, error));\n let answer: unknown;\n try {\n answer = send((error) => (error ? fail(error) : resolve()));\n } catch (error) {\n fail(error);\n return;\n }\n if (isThenable(answer)) answer.then(() => resolve(), fail);\n });\n sent.catch(() => undefined);\n return sent;\n}\n\n/**\n * A failed send: `timeout` when the SDK's last request timed out (axios\n * answers `ECONNABORTED`, or `ETIMEDOUT`), else `transport`.\n */\nfunction failure(message: string, error: unknown): StepError {\n const code: unknown =\n typeof error === 'object' && error !== null\n ? Reflect.get(error, 'code')\n : undefined;\n const timedOut = code === 'ECONNABORTED' || code === 'ETIMEDOUT';\n return new StepError(message, {\n code: timedOut ? 'timeout' : 'transport',\n cause: error,\n });\n}\n\n/**\n * The id RudderStack deduplicates a call by: the event id for the track\n * call, the event id and the call type for the others, so a resent event is\n * dropped and the calls of one event are not.\n */\nfunction messageIdOf(event: WalkerOS.Event, type?: string): string | undefined {\n if (!event.id) return undefined;\n return type ? `${event.id}-${type}` : event.id;\n}\n\n/** The identity of one call, with the call's own messageId. */\nfunction withMessageId(\n identity: Record<string, unknown>,\n event: WalkerOS.Event,\n type: string,\n): Record<string, unknown> {\n const messageId = messageIdOf(event, type);\n return messageId ? { ...identity, messageId } : identity;\n}\n\n/**\n * Ask the SDK to send what it holds, one flush at a time. A failed send\n * reaches each call's callback; the flush itself does not reject (the SDK's\n * error handler is set).\n */\nfunction flush(settings: Partial<Settings>, sdk: RudderStackAnalyticsMock) {\n const flushing = (settings._flushing ?? Promise.resolve()).then(() =>\n sdk.flush(),\n );\n settings._flushing = flushing.catch(() => undefined);\n return flushing;\n}\n\n/**\n * A configured mapping that resolved to nothing skips its call: a declared\n * skip, said once at DEBUG with the event and the mapping key, never the\n * value, so a wrong mapping path does not look like an event without data.\n */\nfunction skipped(\n logger: Logger.Instance,\n event: WalkerOS.Event,\n call: string,\n key: string,\n): void {\n logger.debug(`RudderStack skipped ${call}: ${key} resolved to nothing`, {\n event: event.name,\n });\n}\n\n/** The settled calls of one event: the first failure, if any. */\nasync function delivered(calls: Promise<PromiseSettledResult<void>[]>) {\n for (const result of await calls)\n if (result.status === 'rejected') throw result.reason;\n}\n\n/**\n * Hand the calls of one event to the SDK (identify, group, page, screen,\n * track) and answer their deliveries. An event without userId or anonymousId\n * cannot be sent and fails with missing-input.\n */\nasync function enqueue(\n event: WalkerOS.Event,\n rule: Rule | undefined,\n data: Destination.Data,\n settings: Partial<Settings>,\n sdk: RudderStackAnalyticsMock,\n collector: Collector.Instance,\n logger: Logger.Instance,\n): Promise<Promise<void>[]> {\n const state: RuntimeState = settings._state || {};\n settings._state = state;\n const mappingSettings = rule?.settings || {};\n const timestamp = new Date(event.timestamp || Date.now());\n\n // 1. Resolve identity from event\n const userId = settings.userId\n ? resolveString(\n await getMappingValue(event, settings.userId, { collector }),\n )\n : undefined;\n const anonymousId = settings.anonymousId\n ? resolveString(\n await getMappingValue(event, settings.anonymousId, { collector }),\n )\n : undefined;\n\n if (!userId && !anonymousId)\n throw new StepError(\n 'RudderStack needs a userId or anonymousId for the event',\n {\n code: 'missing-input',\n },\n );\n\n // Build identity object for every SDK call\n const identity: Record<string, unknown> = {};\n if (userId) identity.userId = userId;\n if (anonymousId) identity.anonymousId = anonymousId;\n\n const calls: Array<Promise<void> | undefined> = [];\n\n // 2. Identify -- rule-level overrides destination-level\n const identifyMapping = mappingSettings.identify ?? settings.identify;\n if (identifyMapping !== undefined) {\n const resolved = await getMappingValue(event, identifyMapping, {\n collector,\n });\n if (isObject(resolved))\n calls.push(\n applyIdentify(\n sdk,\n resolved,\n withMessageId(identity, event, 'identify'),\n state,\n timestamp,\n ),\n );\n else skipped(logger, event, 'identify', 'identify');\n }\n\n // 3. Group -- rule-level overrides destination-level\n const groupMapping = mappingSettings.group ?? settings.group;\n if (groupMapping !== undefined) {\n const resolved = await getMappingValue(event, groupMapping, {\n collector,\n });\n if (isObject(resolved) && isString(resolved.groupId))\n calls.push(\n applyGroup(\n sdk,\n resolved,\n withMessageId(identity, event, 'group'),\n state,\n timestamp,\n ),\n );\n else skipped(logger, event, 'group', 'group');\n }\n\n // 4. Page (the call is not awaited here: it is delivered at the flush)\n if (mappingSettings.page !== undefined) {\n const { sent } = await applyPage(\n sdk,\n mappingSettings.page,\n event,\n withMessageId(identity, event, 'page'),\n collector,\n timestamp,\n );\n if (sent) calls.push(sent);\n else skipped(logger, event, 'page', 'page');\n }\n\n // 5. Screen\n if (mappingSettings.screen !== undefined) {\n const { sent } = await applyScreen(\n sdk,\n mappingSettings.screen,\n event,\n withMessageId(identity, event, 'screen'),\n collector,\n timestamp,\n );\n if (sent) calls.push(sent);\n else skipped(logger, event, 'screen', 'screen');\n }\n\n // 6. Alias\n if (mappingSettings.alias !== undefined) {\n const { sent } = await applyAlias(\n sdk,\n mappingSettings.alias,\n event,\n withMessageId(identity, event, 'alias'),\n collector,\n timestamp,\n );\n if (sent) calls.push(sent);\n else skipped(logger, event, 'alias', 'alias');\n }\n\n // 7. Track (unless silent: true)\n if (rule?.silent !== true) {\n const eventName = isString(rule?.name) ? rule.name : event.name;\n const properties = isObject(data) ? (data as Record<string, unknown>) : {};\n\n const params: Record<string, unknown> = {\n ...identity,\n event: eventName,\n properties,\n timestamp,\n };\n const messageId = messageIdOf(event);\n if (messageId) params.messageId = messageId;\n\n calls.push(\n call('RudderStack track failed', (done) => sdk.track(params, done)),\n );\n }\n\n return calls.filter((sent): sent is Promise<void> => sent !== undefined);\n}\n\n/** The SDK the destination sends through, or a StepError. */\nfunction sdkOf(\n settings: Partial<Settings> | undefined,\n env: { analytics?: RudderStackAnalyticsMock } | undefined,\n): RudderStackAnalyticsMock {\n const sdk = env?.analytics || settings?._analytics;\n if (!settings || !sdk)\n throw new StepError('RudderStack Analytics not initialized', {\n code: 'not-ready',\n });\n return sdk;\n}\n\n/** One event: its calls handed to the SDK, sent, and their deliveries awaited. */\nexport const push: PushFn = async function (\n event,\n { config, rule, data, collector, env, logger },\n) {\n const settings = config.settings ?? {};\n const sdk = sdkOf(config.settings, env);\n const calls = await enqueue(\n event,\n rule,\n data,\n settings,\n sdk,\n collector,\n logger,\n );\n if (calls.length) {\n const settled = Promise.allSettled(calls);\n await flush(settings, sdk);\n await delivered(settled);\n }\n};\n\n/**\n * A flushed `config.batch` batch: every entry's calls handed to the SDK, one\n * flush, and each entry's own outcome from its deliveries. An entry that\n * cannot be sent fails alone; when nothing landed, the batch throws.\n */\nexport const pushBatch: PushBatchFn = async function (\n batch,\n { config, collector, env, logger },\n) {\n const settings = config.settings ?? {};\n const sdk = sdkOf(config.settings, env);\n // Each entry's deliveries, or why its calls could not be handed over.\n const outcomes: Array<{\n settled?: Promise<PromiseSettledResult<void>[]>;\n error?: unknown;\n }> = [];\n\n for (const entry of batch.entries) {\n try {\n const calls = await enqueue(\n entry.event,\n entry.rule,\n entry.data,\n settings,\n sdk,\n collector,\n logger,\n );\n outcomes.push({ settled: Promise.allSettled(calls) });\n } catch (error) {\n outcomes.push({ error });\n }\n }\n\n await flush(settings, sdk);\n\n const failed: Destination.BatchFailure[] = [];\n for (const [index, { settled, error }] of outcomes.entries()) {\n if (!settled) failed.push({ index, error });\n else\n await delivered(settled).catch((reason: unknown) =>\n failed.push({ index, error: reason }),\n );\n }\n\n return batchOutcome(batch.entries.length, failed);\n};\n\nfunction resolveString(value: unknown): string | undefined {\n if (isString(value) && value.length > 0) return value;\n return undefined;\n}\n\nfunction hashTraits(traits: Record<string, unknown> | undefined): string {\n if (!traits) return '';\n try {\n return JSON.stringify(traits);\n } catch {\n return '';\n }\n}\n\nfunction applyIdentify(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): Promise<void> | undefined {\n const last = state.lastIdentity || {};\n\n // Per-event identify can override userId\n const identifyUserId = isString(resolved.userId)\n ? resolved.userId\n : (identity.userId as string | undefined);\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const userIdChanged = identifyUserId !== last.userId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n\n if (!userIdChanged && !traitsChanged) return undefined;\n\n const params: Record<string, unknown> = {\n ...identity,\n timestamp,\n };\n if (identifyUserId) params.userId = identifyUserId;\n if (traits) params.traits = traits;\n\n // Remembered at once, so a batch identifies a user once; forgotten again\n // when the delivery fails, so the next event identifies again.\n const current = {\n userId: identifyUserId,\n anonymousId: identity.anonymousId as string | undefined,\n traitsHash,\n };\n state.lastIdentity = current;\n return call('RudderStack identify failed', (done) =>\n sdk.identify(params, done),\n ).catch((error: unknown) => {\n if (state.lastIdentity === current) state.lastIdentity = undefined;\n throw error;\n });\n}\n\nfunction applyGroup(\n sdk: RudderStackAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n): Promise<void> | undefined {\n const groupId = isString(resolved.groupId) ? resolved.groupId : undefined;\n if (!groupId) return undefined;\n\n const last = state.lastGroup || {};\n const traits =\n isObject(resolved.traits) && !isArray(resolved.traits)\n ? (resolved.traits as Record<string, unknown>)\n : undefined;\n\n const traitsHash = hashTraits(traits);\n const groupIdChanged = groupId !== last.groupId;\n const traitsChanged = traitsHash !== (last.traitsHash ?? '');\n if (!groupIdChanged && !traitsChanged) return undefined;\n\n const params: Record<string, unknown> = {\n ...identity,\n groupId,\n timestamp,\n };\n if (traits) params.traits = traits;\n\n // Remembered at once, forgotten again when the delivery fails.\n const current = { groupId, traitsHash };\n state.lastGroup = current;\n return call('RudderStack group failed', (done) =>\n sdk.group(params, done),\n ).catch((error: unknown) => {\n if (state.lastGroup === current) state.lastGroup = undefined;\n throw error;\n });\n}\n\n/** The page call, handed to the SDK; its delivery settles at the flush. */\nasync function applyPage(\n sdk: RudderStackAnalyticsMock,\n pageMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<{ sent?: Promise<void> }> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (pageMapping === true) {\n return {\n sent: call('RudderStack page failed', (done) => sdk.page(params, done)),\n };\n }\n\n const resolved = await getMappingValue(\n event,\n pageMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return {};\n\n const r = resolved as {\n category?: unknown;\n name?: unknown;\n properties?: unknown;\n };\n if (isString(r.category)) params.category = r.category;\n if (isString(r.name)) params.name = r.name;\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n return {\n sent: call('RudderStack page failed', (done) => sdk.page(params, done)),\n };\n}\n\n/** The screen call, handed to the SDK; its delivery settles at the flush. */\nasync function applyScreen(\n sdk: RudderStackAnalyticsMock,\n screenMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<{ sent?: Promise<void> }> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (screenMapping === true) {\n return {\n sent: call('RudderStack screen failed', (done) =>\n sdk.screen(params, done),\n ),\n };\n }\n\n const resolved = await getMappingValue(\n event,\n screenMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return {};\n\n const r = resolved as {\n category?: unknown;\n name?: unknown;\n properties?: unknown;\n };\n if (isString(r.category)) params.category = r.category;\n if (isString(r.name)) params.name = r.name;\n if (isObject(r.properties) && !isArray(r.properties)) {\n params.properties = r.properties;\n }\n\n return {\n sent: call('RudderStack screen failed', (done) => sdk.screen(params, done)),\n };\n}\n\n/** The alias call, handed to the SDK; its delivery settles at the flush. */\nasync function applyAlias(\n sdk: RudderStackAnalyticsMock,\n aliasMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n): Promise<{ sent?: Promise<void> }> {\n const resolved = await getMappingValue(\n event,\n aliasMapping as Parameters<typeof getMappingValue>[1],\n { collector } as Parameters<typeof getMappingValue>[2],\n );\n if (!isObject(resolved)) return {};\n\n const r = resolved as { previousId?: unknown };\n const previousId = isString(r.previousId) ? r.previousId : undefined;\n if (!previousId) return {};\n\n const params: Record<string, unknown> = {\n previousId,\n timestamp,\n };\n // Alias uses userId (the new canonical ID) -- not full identity spread\n if (identity.userId) params.userId = identity.userId;\n if (identity.messageId) params.messageId = identity.messageId;\n\n return {\n sent: call('RudderStack alias failed', (done) => sdk.alias(params, done)),\n };\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer } from '@walkeros/server-core';\n\nexport interface Settings {\n /** RudderStack source write key (required). */\n writeKey: string;\n /** RudderStack data plane URL (required). */\n dataPlaneUrl: string;\n /** walkerOS mapping value path to resolve userId from each event. */\n userId?: string;\n /** walkerOS mapping value path to resolve anonymousId from each event. */\n anonymousId?: string;\n /** Destination-level identity mapping (fires identify() on first push / change). */\n identify?: WalkerOSMapping.Value;\n /** Destination-level group mapping (fires group() on first push / change). */\n group?: WalkerOSMapping.Value;\n /** Downstream destination filtering. Passthrough to SDK integrations param. */\n integrations?: Record<string, boolean | Record<string, unknown>>;\n // SDK constructor options (passthrough)\n /** API path. Default: '/v1/batch'. */\n path?: string;\n /** Events to enqueue before flushing. Default: 20. */\n flushAt?: number;\n /** Max milliseconds before auto-flush. Default: 10000. */\n flushInterval?: number;\n /** Maximum batch payload size in bytes. Default: 460800 (~500KB). */\n maxQueueSize?: number;\n /** Maximum in-memory queue length. Default: 20000. */\n maxInternalQueueSize?: number;\n /** Log level. Default: 'info'. */\n logLevel?: string;\n /** Retries for a failed request. Default: 2, within config.timeout. */\n retryCount?: number;\n /** Time one request may take (ms). Default: a quarter of config.timeout. */\n timeout?: number;\n /** Completely disable the SDK. Default: false. */\n enable?: boolean;\n /** Enable gzip compression. Default: true. */\n gzip?: boolean;\n /** Runtime state -- not user-facing. Mutated by init/push. */\n _analytics?: RudderStackAnalyticsMock;\n _state?: RuntimeState;\n /** The running flush; the next one waits for it. Runtime only. */\n _flushing?: Promise<void>;\n}\n\nexport interface RuntimeState {\n lastIdentity?: {\n userId?: string;\n anonymousId?: string;\n traitsHash?: string;\n };\n lastGroup?: {\n groupId?: string;\n traitsHash?: string;\n };\n}\n\nexport type InitSettings = Partial<Settings>;\n\n/**\n * Per-rule mapping settings. Every feature is a walkerOS mapping value\n * resolved via getMappingValue(). The resolved object's keys drive\n * which RudderStack SDK methods to call.\n */\nexport interface Mapping {\n identify?: WalkerOSMapping.Value;\n group?: WalkerOSMapping.Value;\n page?: WalkerOSMapping.Value | boolean;\n screen?: WalkerOSMapping.Value | boolean;\n alias?: WalkerOSMapping.Value;\n}\n\n/**\n * Env -- optional SDK override. Production leaves this undefined and the\n * destination creates a real Analytics instance. Tests provide a mock via\n * env.analytics.\n */\nexport interface Env extends DestinationServer.Env {\n analytics?: RudderStackAnalyticsMock;\n}\n\n/**\n * Mock-friendly interface for the Analytics instance methods the\n * destination actually calls. Tests can provide this via env.analytics\n * instead of the real SDK.\n */\n/** Called once the SDK sent the call, with the error if it failed. */\nexport type RudderStackCallback = (error?: Error, data?: unknown) => void;\n\nexport interface RudderStackAnalyticsMock {\n track: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n identify: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n group: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n page: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n screen: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n alias: (\n params: Record<string, unknown>,\n callback?: RudderStackCallback,\n ) => unknown;\n flush: (callback?: RudderStackCallback) => Promise<void>;\n}\n\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport interface Destination extends DestinationServer.Destination<Types> {\n init: DestinationServer.InitFn<Types>;\n}\n\nexport type Config = {\n settings: Settings;\n} & DestinationServer.Config<Types>;\n\nexport type InitFn = DestinationServer.InitFn<Types>;\nexport type PushFn = DestinationServer.PushFn<Types>;\nexport type PushBatchFn = CoreDestination.PushBatchFn<Types>;\nexport type PartialConfig = DestinationServer.PartialConfig<Types>;\nexport type PushEvents = DestinationServer.PushEvents<Mapping>;\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\n"],"mappings":"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","names":["StepError","StepError","call","StepError"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-destination-rudderstack",
4
- "version": "4.8.1-next-1792019907609",
4
+ "version": "4.8.2",
5
5
  "type": "destination",
6
6
  "platform": [
7
7
  "server"
@@ -63,7 +63,7 @@
63
63
  "type": "integer",
64
64
  "exclusiveMinimum": 0,
65
65
  "maximum": 9007199254740991,
66
- "description": "Events to enqueue before flushing a batch. Default: 20."
66
+ "description": "Events the SDK sends in one request. Each push and each config.batch batch flushes the SDK and waits until its calls are sent. Default: 20."
67
67
  },
68
68
  "flushInterval": {
69
69
  "type": "integer",
@@ -91,7 +91,13 @@
91
91
  "type": "integer",
92
92
  "minimum": 0,
93
93
  "maximum": 9007199254740991,
94
- "description": "Retry attempts for failed batches. Default: 3."
94
+ "description": "Retries the SDK makes for a failed request, a tenth of config.timeout apart. Default: 2, which ends within config.timeout. A value set here wins."
95
+ },
96
+ "timeout": {
97
+ "type": "integer",
98
+ "exclusiveMinimum": 0,
99
+ "maximum": 9007199254740991,
100
+ "description": "Time one request may take, in milliseconds. Default: a quarter of config.timeout (2500 at the 10 s default). A value set here wins."
95
101
  },
96
102
  "enable": {
97
103
  "type": "boolean",
@@ -128,22 +134,22 @@
128
134
  "push": {
129
135
  "analytics": {
130
136
  "track": {
131
- "$code": "()=>{}"
137
+ "$code": "(e,t)=>t?.()"
132
138
  },
133
139
  "identify": {
134
- "$code": "()=>{}"
140
+ "$code": "(e,t)=>t?.()"
135
141
  },
136
142
  "group": {
137
- "$code": "()=>{}"
143
+ "$code": "(e,t)=>t?.()"
138
144
  },
139
145
  "page": {
140
- "$code": "()=>{}"
146
+ "$code": "(e,t)=>t?.()"
141
147
  },
142
148
  "screen": {
143
- "$code": "()=>{}"
149
+ "$code": "(e,t)=>t?.()"
144
150
  },
145
151
  "alias": {
146
- "$code": "()=>{}"
152
+ "$code": "(e,t)=>t?.()"
147
153
  },
148
154
  "flush": {
149
155
  "$code": "()=>Promise.resolve()"
@@ -195,7 +201,7 @@
195
201
  "consent": {
196
202
  "functional": true
197
203
  },
198
- "id": "19840b53d4ee9cd4",
204
+ "id": "ev1700000107",
199
205
  "trigger": "test",
200
206
  "entity": "identity",
201
207
  "action": "merge",
@@ -222,6 +228,7 @@
222
228
  [
223
229
  "analytics.alias",
224
230
  {
231
+ "messageId": "ev1700000107-alias",
225
232
  "userId": "registered-456",
226
233
  "previousId": "anonymous-123",
227
234
  "timestamp": {}
@@ -260,7 +267,7 @@
260
267
  "consent": {
261
268
  "functional": true
262
269
  },
263
- "id": "fce304391132bd02",
270
+ "id": "ev1700000108",
264
271
  "trigger": "load",
265
272
  "entity": "product",
266
273
  "action": "view",
@@ -278,6 +285,7 @@
278
285
  [
279
286
  "analytics.track",
280
287
  {
288
+ "messageId": "ev1700000108",
281
289
  "anonymousId": "s3ss10n",
282
290
  "event": "product view",
283
291
  "properties": {},
@@ -324,7 +332,7 @@
324
332
  "consent": {
325
333
  "functional": true
326
334
  },
327
- "id": "4435f096a3d3d08e",
335
+ "id": "ev1700000104",
328
336
  "trigger": "test",
329
337
  "entity": "company",
330
338
  "action": "update",
@@ -358,6 +366,7 @@
358
366
  [
359
367
  "analytics.group",
360
368
  {
369
+ "messageId": "ev1700000104-group",
361
370
  "userId": "us3r",
362
371
  "anonymousId": "s3ss10n",
363
372
  "groupId": "comp-456",
@@ -371,6 +380,38 @@
371
380
  ]
372
381
  ]
373
382
  },
383
+ "companyGroupWithoutData": {
384
+ "public": false,
385
+ "description": "A silent group rule whose groupId finds no data sends nothing: an unmet mapping, not a failure, so the push returns normally.",
386
+ "in": {
387
+ "name": "company update",
388
+ "entity": "company",
389
+ "action": "update",
390
+ "timestamp": 1700000120,
391
+ "user": {
392
+ "id": "us3r",
393
+ "session": "s3ss10n"
394
+ }
395
+ },
396
+ "mapping": {
397
+ "silent": true,
398
+ "settings": {
399
+ "group": {
400
+ "map": {
401
+ "groupId": "data.company_id",
402
+ "traits": {
403
+ "map": {
404
+ "name": "data.company_name",
405
+ "industry": "data.industry",
406
+ "employees": "data.employees"
407
+ }
408
+ }
409
+ }
410
+ }
411
+ }
412
+ },
413
+ "out": []
414
+ },
374
415
  "defaultTrack": {
375
416
  "title": "Default track",
376
417
  "description": "A walker event becomes a RudderStack analytics.track call with userId and anonymousId resolved from the event.",
@@ -403,7 +444,7 @@
403
444
  "consent": {
404
445
  "functional": true
405
446
  },
406
- "id": "7c6502b251d92e84",
447
+ "id": "ev1700000100",
407
448
  "trigger": "load",
408
449
  "entity": "product",
409
450
  "action": "view",
@@ -420,6 +461,7 @@
420
461
  [
421
462
  "analytics.track",
422
463
  {
464
+ "messageId": "ev1700000100",
423
465
  "userId": "us3r",
424
466
  "anonymousId": "s3ss10n",
425
467
  "event": "product view",
@@ -470,7 +512,7 @@
470
512
  "consent": {
471
513
  "functional": true
472
514
  },
473
- "id": "5c64cecafb86f416",
515
+ "id": "ev1700000102",
474
516
  "trigger": "load",
475
517
  "entity": "page",
476
518
  "action": "view",
@@ -498,6 +540,7 @@
498
540
  [
499
541
  "analytics.identify",
500
542
  {
543
+ "messageId": "ev1700000102-identify",
501
544
  "userId": "us3r",
502
545
  "anonymousId": "s3ss10n",
503
546
  "traits": {
@@ -509,6 +552,7 @@
509
552
  [
510
553
  "analytics.track",
511
554
  {
555
+ "messageId": "ev1700000102",
512
556
  "userId": "us3r",
513
557
  "anonymousId": "s3ss10n",
514
558
  "event": "page view",
@@ -528,7 +572,7 @@
528
572
  "currency": "EUR",
529
573
  "shipping": 5.22,
530
574
  "taxes": 73.76,
531
- "total": 555
575
+ "value": 555
532
576
  },
533
577
  "context": {
534
578
  "shopping": [
@@ -597,7 +641,7 @@
597
641
  "consent": {
598
642
  "functional": true
599
643
  },
600
- "id": "79f65286a77fdeb0",
644
+ "id": "ev1700000101",
601
645
  "trigger": "load",
602
646
  "entity": "order",
603
647
  "action": "complete",
@@ -617,6 +661,7 @@
617
661
  [
618
662
  "analytics.track",
619
663
  {
664
+ "messageId": "ev1700000101",
620
665
  "userId": "us3r",
621
666
  "anonymousId": "s3ss10n",
622
667
  "event": "Order Completed",
@@ -626,6 +671,118 @@
626
671
  ]
627
672
  ]
628
673
  },
674
+ "noIdentityCompany": {
675
+ "public": false,
676
+ "description": "A company update event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.",
677
+ "in": {
678
+ "name": "company update",
679
+ "entity": "company",
680
+ "action": "update",
681
+ "timestamp": 1700000114
682
+ },
683
+ "out": [],
684
+ "outcome": {
685
+ "status": "failed",
686
+ "code": "missing-input",
687
+ "retryable": false
688
+ }
689
+ },
690
+ "noIdentityLogin": {
691
+ "public": false,
692
+ "description": "A user login event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.",
693
+ "in": {
694
+ "name": "user login",
695
+ "entity": "user",
696
+ "action": "login",
697
+ "timestamp": 1700000113
698
+ },
699
+ "out": [],
700
+ "outcome": {
701
+ "status": "failed",
702
+ "code": "missing-input",
703
+ "retryable": false
704
+ }
705
+ },
706
+ "noIdentityMerge": {
707
+ "public": false,
708
+ "description": "A identity merge event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.",
709
+ "in": {
710
+ "name": "identity merge",
711
+ "entity": "identity",
712
+ "action": "merge",
713
+ "timestamp": 1700000116
714
+ },
715
+ "out": [],
716
+ "outcome": {
717
+ "status": "failed",
718
+ "code": "missing-input",
719
+ "retryable": false
720
+ }
721
+ },
722
+ "noIdentityOrder": {
723
+ "public": false,
724
+ "description": "A order complete event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.",
725
+ "in": {
726
+ "name": "order complete",
727
+ "entity": "order",
728
+ "action": "complete",
729
+ "timestamp": 1700000111
730
+ },
731
+ "out": [],
732
+ "outcome": {
733
+ "status": "failed",
734
+ "code": "missing-input",
735
+ "retryable": false
736
+ }
737
+ },
738
+ "noIdentityPage": {
739
+ "public": false,
740
+ "description": "A page view event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.",
741
+ "in": {
742
+ "name": "page view",
743
+ "entity": "page",
744
+ "action": "view",
745
+ "timestamp": 1700000112
746
+ },
747
+ "out": [],
748
+ "outcome": {
749
+ "status": "failed",
750
+ "code": "missing-input",
751
+ "retryable": false
752
+ }
753
+ },
754
+ "noIdentityProduct": {
755
+ "public": false,
756
+ "description": "A product view event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.",
757
+ "in": {
758
+ "name": "product view",
759
+ "entity": "product",
760
+ "action": "view",
761
+ "timestamp": 1700000110
762
+ },
763
+ "out": [],
764
+ "outcome": {
765
+ "status": "failed",
766
+ "code": "missing-input",
767
+ "retryable": false
768
+ }
769
+ },
770
+ "noIdentityScreen": {
771
+ "public": false,
772
+ "description": "A screen view event without userId or anonymousId cannot be sent to RudderStack: the push fails with missing-input instead of counting as delivered.",
773
+ "in": {
774
+ "name": "screen view",
775
+ "entity": "screen",
776
+ "action": "view",
777
+ "timestamp": 1700000115
778
+ },
779
+ "out": [],
780
+ "outcome": {
781
+ "status": "failed",
782
+ "code": "missing-input",
783
+ "retryable": false
784
+ }
785
+ },
629
786
  "pageView": {
630
787
  "title": "Page view",
631
788
  "description": "A page view fires analytics.page with a resolved page name and properties instead of a generic track.",
@@ -662,7 +819,7 @@
662
819
  "consent": {
663
820
  "functional": true
664
821
  },
665
- "id": "07d83852fe0ee370",
822
+ "id": "ev1700000105",
666
823
  "trigger": "load",
667
824
  "entity": "page",
668
825
  "action": "view",
@@ -694,6 +851,7 @@
694
851
  [
695
852
  "analytics.page",
696
853
  {
854
+ "messageId": "ev1700000105-page",
697
855
  "userId": "us3r",
698
856
  "anonymousId": "s3ss10n",
699
857
  "name": "Getting Started",
@@ -742,7 +900,7 @@
742
900
  "consent": {
743
901
  "functional": true
744
902
  },
745
- "id": "f82d4caccf362e20",
903
+ "id": "ev1700000106",
746
904
  "trigger": "test",
747
905
  "entity": "screen",
748
906
  "action": "view",
@@ -774,6 +932,7 @@
774
932
  [
775
933
  "analytics.screen",
776
934
  {
935
+ "messageId": "ev1700000106-screen",
777
936
  "userId": "us3r",
778
937
  "anonymousId": "s3ss10n",
779
938
  "name": "Welcome",
@@ -785,6 +944,64 @@
785
944
  ]
786
945
  ]
787
946
  },
947
+ "silentRule": {
948
+ "public": false,
949
+ "description": "A rule with silent: true and no identify, group, page, screen or alias mapping sends nothing to RudderStack.",
950
+ "in": {
951
+ "name": "page view",
952
+ "data": {
953
+ "domain": "www.example.com",
954
+ "title": "walkerOS documentation",
955
+ "referrer": "https://www.walkeros.io/",
956
+ "search": "?foo=bar",
957
+ "hash": "#hash",
958
+ "id": "/docs/"
959
+ },
960
+ "context": {
961
+ "dev": [
962
+ "test",
963
+ 1
964
+ ]
965
+ },
966
+ "globals": {
967
+ "pagegroup": "docs"
968
+ },
969
+ "custom": {
970
+ "completely": "random"
971
+ },
972
+ "user": {
973
+ "id": "us3r",
974
+ "session": "s3ss10n"
975
+ },
976
+ "nested": [
977
+ {
978
+ "entity": "child",
979
+ "data": {
980
+ "is": "subordinated"
981
+ }
982
+ }
983
+ ],
984
+ "consent": {
985
+ "functional": true
986
+ },
987
+ "id": "f0cc5f6fec3d8eeb",
988
+ "trigger": "load",
989
+ "entity": "page",
990
+ "action": "view",
991
+ "timestamp": 1700000117,
992
+ "timing": 3.14,
993
+ "source": {
994
+ "count": 1,
995
+ "trace": "0a1b2c3d4e5f60718293a4b5c6d7e8f9",
996
+ "type": "collector",
997
+ "schema": "4"
998
+ }
999
+ },
1000
+ "mapping": {
1001
+ "silent": true
1002
+ },
1003
+ "out": []
1004
+ },
788
1005
  "userLoginIdentify": {
789
1006
  "title": "User login identify",
790
1007
  "description": "A user login fires only an analytics.identify call with the resolved userId and traits, skipping the track.",
@@ -823,7 +1040,7 @@
823
1040
  "consent": {
824
1041
  "functional": true
825
1042
  },
826
- "id": "1f9cac54d86f3a3f",
1043
+ "id": "ev1700000103",
827
1044
  "trigger": "test",
828
1045
  "entity": "user",
829
1046
  "action": "login",
@@ -857,6 +1074,7 @@
857
1074
  [
858
1075
  "analytics.identify",
859
1076
  {
1077
+ "messageId": "ev1700000103-identify",
860
1078
  "userId": "new-user-123",
861
1079
  "anonymousId": "s3ss10n",
862
1080
  "traits": {
@@ -910,7 +1128,7 @@
910
1128
  "consent": {
911
1129
  "functional": true
912
1130
  },
913
- "id": "a7445ceab507ab0a",
1131
+ "id": "9b05d07c86156f49",
914
1132
  "trigger": "test",
915
1133
  "entity": "debug",
916
1134
  "action": "noise",