@walkeros/server-destination-rudderstack 3.4.2 → 4.0.0-next-1777463920154
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/README.md +1 -1
- package/dist/dev.d.mts +5 -5
- package/dist/dev.d.ts +5 -5
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/examples/index.d.mts +5 -5
- package/dist/examples/index.d.ts +5 -5
- package/dist/examples/index.js +5 -5
- package/dist/examples/index.mjs +5 -5
- 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/dist/walkerOS.json +41 -160
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/push.ts","../src/types/index.ts"],"sourcesContent":["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","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 skip: true)\n if (rule?.skip !== 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"],"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, 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","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"],"mappings":"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","names":[]}
|
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
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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 skip: true)\n if (rule?.skip !== 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/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":[]}
|
package/dist/walkerOS.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$meta": {
|
|
3
3
|
"package": "@walkeros/server-destination-rudderstack",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "4.0.0-next-1777463920154",
|
|
5
5
|
"type": "destination",
|
|
6
6
|
"platform": [
|
|
7
7
|
"server"
|
|
@@ -15,19 +15,19 @@
|
|
|
15
15
|
"type": "object",
|
|
16
16
|
"properties": {
|
|
17
17
|
"identify": {
|
|
18
|
-
"description": "Per-event identity mapping. Resolves to { userId?, traits? }. Use with rule-level
|
|
18
|
+
"description": "Per-event identity mapping. Resolves to { userId?, traits? }. Use with rule-level silent: true on login/identify events."
|
|
19
19
|
},
|
|
20
20
|
"group": {
|
|
21
|
-
"description": "Per-event group assignment. Resolves to { groupId, traits? }. Use with rule-level
|
|
21
|
+
"description": "Per-event group assignment. Resolves to { groupId, traits? }. Use with rule-level silent: true on company/team events."
|
|
22
22
|
},
|
|
23
23
|
"page": {
|
|
24
|
-
"description": "Per-event page call. Resolves to { name, properties? } or true for minimal page(). RudderStack requires name (falls back to empty string). Use with
|
|
24
|
+
"description": "Per-event page call. Resolves to { name, properties? } or true for minimal page(). RudderStack requires name (falls back to empty string). Use with silent: true."
|
|
25
25
|
},
|
|
26
26
|
"screen": {
|
|
27
|
-
"description": "Per-event screen call (mobile backends). Resolves to { name, properties? } or true for minimal screen(). RudderStack requires name (falls back to empty string). Use with
|
|
27
|
+
"description": "Per-event screen call (mobile backends). Resolves to { name, properties? } or true for minimal screen(). RudderStack requires name (falls back to empty string). Use with silent: true."
|
|
28
28
|
},
|
|
29
29
|
"alias": {
|
|
30
|
-
"description": "Per-event alias call. Resolves to { previousId }. Links anonymous user to identified user. Use with rule-level
|
|
30
|
+
"description": "Per-event alias call. Resolves to { previousId }. Links anonymous user to identified user. Use with rule-level silent: true."
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"additionalProperties": false
|
|
@@ -188,39 +188,25 @@
|
|
|
188
188
|
"entity": "child",
|
|
189
189
|
"data": {
|
|
190
190
|
"is": "subordinated"
|
|
191
|
-
},
|
|
192
|
-
"nested": [],
|
|
193
|
-
"context": {
|
|
194
|
-
"element": [
|
|
195
|
-
"child",
|
|
196
|
-
0
|
|
197
|
-
]
|
|
198
191
|
}
|
|
199
192
|
}
|
|
200
193
|
],
|
|
201
194
|
"consent": {
|
|
202
195
|
"functional": true
|
|
203
196
|
},
|
|
204
|
-
"id": "
|
|
197
|
+
"id": "b6542f5f143ddaa3",
|
|
205
198
|
"trigger": "test",
|
|
206
199
|
"entity": "identity",
|
|
207
200
|
"action": "merge",
|
|
208
201
|
"timestamp": 1700000107,
|
|
209
202
|
"timing": 3.14,
|
|
210
|
-
"group": "gr0up",
|
|
211
|
-
"count": 1,
|
|
212
|
-
"version": {
|
|
213
|
-
"source": "3.4.2",
|
|
214
|
-
"tagging": 1
|
|
215
|
-
},
|
|
216
203
|
"source": {
|
|
217
|
-
"type": "
|
|
218
|
-
"
|
|
219
|
-
"previous_id": "http://remotehost:9001"
|
|
204
|
+
"type": "collector",
|
|
205
|
+
"schema": "4"
|
|
220
206
|
}
|
|
221
207
|
},
|
|
222
208
|
"mapping": {
|
|
223
|
-
"
|
|
209
|
+
"silent": true,
|
|
224
210
|
"settings": {
|
|
225
211
|
"alias": {
|
|
226
212
|
"map": {
|
|
@@ -271,22 +257,15 @@
|
|
|
271
257
|
"consent": {
|
|
272
258
|
"functional": true
|
|
273
259
|
},
|
|
274
|
-
"id": "
|
|
260
|
+
"id": "9d99423665dcb364",
|
|
275
261
|
"trigger": "load",
|
|
276
262
|
"entity": "product",
|
|
277
263
|
"action": "view",
|
|
278
264
|
"timestamp": 1700000108,
|
|
279
265
|
"timing": 3.14,
|
|
280
|
-
"group": "gr0up",
|
|
281
|
-
"count": 1,
|
|
282
|
-
"version": {
|
|
283
|
-
"source": "3.4.2",
|
|
284
|
-
"tagging": 1
|
|
285
|
-
},
|
|
286
266
|
"source": {
|
|
287
|
-
"type": "
|
|
288
|
-
"
|
|
289
|
-
"previous_id": "http://remotehost:9001"
|
|
267
|
+
"type": "collector",
|
|
268
|
+
"schema": "4"
|
|
290
269
|
}
|
|
291
270
|
},
|
|
292
271
|
"settings": {},
|
|
@@ -334,39 +313,25 @@
|
|
|
334
313
|
"entity": "child",
|
|
335
314
|
"data": {
|
|
336
315
|
"is": "subordinated"
|
|
337
|
-
},
|
|
338
|
-
"nested": [],
|
|
339
|
-
"context": {
|
|
340
|
-
"element": [
|
|
341
|
-
"child",
|
|
342
|
-
0
|
|
343
|
-
]
|
|
344
316
|
}
|
|
345
317
|
}
|
|
346
318
|
],
|
|
347
319
|
"consent": {
|
|
348
320
|
"functional": true
|
|
349
321
|
},
|
|
350
|
-
"id": "
|
|
322
|
+
"id": "62621489d19cefe9",
|
|
351
323
|
"trigger": "test",
|
|
352
324
|
"entity": "company",
|
|
353
325
|
"action": "update",
|
|
354
326
|
"timestamp": 1700000104,
|
|
355
327
|
"timing": 3.14,
|
|
356
|
-
"group": "gr0up",
|
|
357
|
-
"count": 1,
|
|
358
|
-
"version": {
|
|
359
|
-
"source": "3.4.2",
|
|
360
|
-
"tagging": 1
|
|
361
|
-
},
|
|
362
328
|
"source": {
|
|
363
|
-
"type": "
|
|
364
|
-
"
|
|
365
|
-
"previous_id": "http://remotehost:9001"
|
|
329
|
+
"type": "collector",
|
|
330
|
+
"schema": "4"
|
|
366
331
|
}
|
|
367
332
|
},
|
|
368
333
|
"mapping": {
|
|
369
|
-
"
|
|
334
|
+
"silent": true,
|
|
370
335
|
"settings": {
|
|
371
336
|
"group": {
|
|
372
337
|
"map": {
|
|
@@ -431,22 +396,15 @@
|
|
|
431
396
|
"consent": {
|
|
432
397
|
"functional": true
|
|
433
398
|
},
|
|
434
|
-
"id": "
|
|
399
|
+
"id": "c2a9636780753f97",
|
|
435
400
|
"trigger": "load",
|
|
436
401
|
"entity": "product",
|
|
437
402
|
"action": "view",
|
|
438
403
|
"timestamp": 1700000100,
|
|
439
404
|
"timing": 3.14,
|
|
440
|
-
"group": "gr0up",
|
|
441
|
-
"count": 1,
|
|
442
|
-
"version": {
|
|
443
|
-
"source": "3.4.2",
|
|
444
|
-
"tagging": 1
|
|
445
|
-
},
|
|
446
405
|
"source": {
|
|
447
|
-
"type": "
|
|
448
|
-
"
|
|
449
|
-
"previous_id": "http://remotehost:9001"
|
|
406
|
+
"type": "collector",
|
|
407
|
+
"schema": "4"
|
|
450
408
|
}
|
|
451
409
|
},
|
|
452
410
|
"out": [
|
|
@@ -497,35 +455,21 @@
|
|
|
497
455
|
"entity": "child",
|
|
498
456
|
"data": {
|
|
499
457
|
"is": "subordinated"
|
|
500
|
-
},
|
|
501
|
-
"nested": [],
|
|
502
|
-
"context": {
|
|
503
|
-
"element": [
|
|
504
|
-
"child",
|
|
505
|
-
0
|
|
506
|
-
]
|
|
507
458
|
}
|
|
508
459
|
}
|
|
509
460
|
],
|
|
510
461
|
"consent": {
|
|
511
462
|
"functional": true
|
|
512
463
|
},
|
|
513
|
-
"id": "
|
|
464
|
+
"id": "0fa6b1872608cbec",
|
|
514
465
|
"trigger": "load",
|
|
515
466
|
"entity": "page",
|
|
516
467
|
"action": "view",
|
|
517
468
|
"timestamp": 1700000102,
|
|
518
469
|
"timing": 3.14,
|
|
519
|
-
"group": "gr0up",
|
|
520
|
-
"count": 1,
|
|
521
|
-
"version": {
|
|
522
|
-
"source": "3.4.2",
|
|
523
|
-
"tagging": 1
|
|
524
|
-
},
|
|
525
470
|
"source": {
|
|
526
|
-
"type": "
|
|
527
|
-
"
|
|
528
|
-
"previous_id": "http://remotehost:9001"
|
|
471
|
+
"type": "collector",
|
|
472
|
+
"schema": "4"
|
|
529
473
|
}
|
|
530
474
|
},
|
|
531
475
|
"settings": {
|
|
@@ -642,22 +586,15 @@
|
|
|
642
586
|
"consent": {
|
|
643
587
|
"functional": true
|
|
644
588
|
},
|
|
645
|
-
"id": "
|
|
589
|
+
"id": "24f291f9669985a2",
|
|
646
590
|
"trigger": "load",
|
|
647
591
|
"entity": "order",
|
|
648
592
|
"action": "complete",
|
|
649
593
|
"timestamp": 1700000101,
|
|
650
594
|
"timing": 3.14,
|
|
651
|
-
"group": "gr0up",
|
|
652
|
-
"count": 1,
|
|
653
|
-
"version": {
|
|
654
|
-
"source": "3.4.2",
|
|
655
|
-
"tagging": 1
|
|
656
|
-
},
|
|
657
595
|
"source": {
|
|
658
|
-
"type": "
|
|
659
|
-
"
|
|
660
|
-
"previous_id": "http://remotehost:9001"
|
|
596
|
+
"type": "collector",
|
|
597
|
+
"schema": "4"
|
|
661
598
|
}
|
|
662
599
|
},
|
|
663
600
|
"mapping": {
|
|
@@ -706,39 +643,25 @@
|
|
|
706
643
|
"entity": "child",
|
|
707
644
|
"data": {
|
|
708
645
|
"is": "subordinated"
|
|
709
|
-
},
|
|
710
|
-
"nested": [],
|
|
711
|
-
"context": {
|
|
712
|
-
"element": [
|
|
713
|
-
"child",
|
|
714
|
-
0
|
|
715
|
-
]
|
|
716
646
|
}
|
|
717
647
|
}
|
|
718
648
|
],
|
|
719
649
|
"consent": {
|
|
720
650
|
"functional": true
|
|
721
651
|
},
|
|
722
|
-
"id": "
|
|
652
|
+
"id": "06b023c31d83dbd4",
|
|
723
653
|
"trigger": "load",
|
|
724
654
|
"entity": "page",
|
|
725
655
|
"action": "view",
|
|
726
656
|
"timestamp": 1700000105,
|
|
727
657
|
"timing": 3.14,
|
|
728
|
-
"group": "gr0up",
|
|
729
|
-
"count": 1,
|
|
730
|
-
"version": {
|
|
731
|
-
"source": "3.4.2",
|
|
732
|
-
"tagging": 1
|
|
733
|
-
},
|
|
734
658
|
"source": {
|
|
735
|
-
"type": "
|
|
736
|
-
"
|
|
737
|
-
"previous_id": "http://remotehost:9001"
|
|
659
|
+
"type": "collector",
|
|
660
|
+
"schema": "4"
|
|
738
661
|
}
|
|
739
662
|
},
|
|
740
663
|
"mapping": {
|
|
741
|
-
"
|
|
664
|
+
"silent": true,
|
|
742
665
|
"settings": {
|
|
743
666
|
"page": {
|
|
744
667
|
"map": {
|
|
@@ -798,39 +721,25 @@
|
|
|
798
721
|
"entity": "child",
|
|
799
722
|
"data": {
|
|
800
723
|
"is": "subordinated"
|
|
801
|
-
},
|
|
802
|
-
"nested": [],
|
|
803
|
-
"context": {
|
|
804
|
-
"element": [
|
|
805
|
-
"child",
|
|
806
|
-
0
|
|
807
|
-
]
|
|
808
724
|
}
|
|
809
725
|
}
|
|
810
726
|
],
|
|
811
727
|
"consent": {
|
|
812
728
|
"functional": true
|
|
813
729
|
},
|
|
814
|
-
"id": "
|
|
730
|
+
"id": "6d6d217f75b37c8a",
|
|
815
731
|
"trigger": "test",
|
|
816
732
|
"entity": "screen",
|
|
817
733
|
"action": "view",
|
|
818
734
|
"timestamp": 1700000106,
|
|
819
735
|
"timing": 3.14,
|
|
820
|
-
"group": "gr0up",
|
|
821
|
-
"count": 1,
|
|
822
|
-
"version": {
|
|
823
|
-
"source": "3.4.2",
|
|
824
|
-
"tagging": 1
|
|
825
|
-
},
|
|
826
736
|
"source": {
|
|
827
|
-
"type": "
|
|
828
|
-
"
|
|
829
|
-
"previous_id": "http://remotehost:9001"
|
|
737
|
+
"type": "collector",
|
|
738
|
+
"schema": "4"
|
|
830
739
|
}
|
|
831
740
|
},
|
|
832
741
|
"mapping": {
|
|
833
|
-
"
|
|
742
|
+
"silent": true,
|
|
834
743
|
"settings": {
|
|
835
744
|
"screen": {
|
|
836
745
|
"map": {
|
|
@@ -891,39 +800,25 @@
|
|
|
891
800
|
"entity": "child",
|
|
892
801
|
"data": {
|
|
893
802
|
"is": "subordinated"
|
|
894
|
-
},
|
|
895
|
-
"nested": [],
|
|
896
|
-
"context": {
|
|
897
|
-
"element": [
|
|
898
|
-
"child",
|
|
899
|
-
0
|
|
900
|
-
]
|
|
901
803
|
}
|
|
902
804
|
}
|
|
903
805
|
],
|
|
904
806
|
"consent": {
|
|
905
807
|
"functional": true
|
|
906
808
|
},
|
|
907
|
-
"id": "
|
|
809
|
+
"id": "3474daa55039e38c",
|
|
908
810
|
"trigger": "test",
|
|
909
811
|
"entity": "user",
|
|
910
812
|
"action": "login",
|
|
911
813
|
"timestamp": 1700000103,
|
|
912
814
|
"timing": 3.14,
|
|
913
|
-
"group": "gr0up",
|
|
914
|
-
"count": 1,
|
|
915
|
-
"version": {
|
|
916
|
-
"source": "3.4.2",
|
|
917
|
-
"tagging": 1
|
|
918
|
-
},
|
|
919
815
|
"source": {
|
|
920
|
-
"type": "
|
|
921
|
-
"
|
|
922
|
-
"previous_id": "http://remotehost:9001"
|
|
816
|
+
"type": "collector",
|
|
817
|
+
"schema": "4"
|
|
923
818
|
}
|
|
924
819
|
},
|
|
925
820
|
"mapping": {
|
|
926
|
-
"
|
|
821
|
+
"silent": true,
|
|
927
822
|
"settings": {
|
|
928
823
|
"identify": {
|
|
929
824
|
"map": {
|
|
@@ -990,35 +885,21 @@
|
|
|
990
885
|
"entity": "child",
|
|
991
886
|
"data": {
|
|
992
887
|
"is": "subordinated"
|
|
993
|
-
},
|
|
994
|
-
"nested": [],
|
|
995
|
-
"context": {
|
|
996
|
-
"element": [
|
|
997
|
-
"child",
|
|
998
|
-
0
|
|
999
|
-
]
|
|
1000
888
|
}
|
|
1001
889
|
}
|
|
1002
890
|
],
|
|
1003
891
|
"consent": {
|
|
1004
892
|
"functional": true
|
|
1005
893
|
},
|
|
1006
|
-
"id": "
|
|
894
|
+
"id": "dab2402758d4071b",
|
|
1007
895
|
"trigger": "test",
|
|
1008
896
|
"entity": "debug",
|
|
1009
897
|
"action": "noise",
|
|
1010
898
|
"timestamp": 1700000109,
|
|
1011
899
|
"timing": 3.14,
|
|
1012
|
-
"group": "gr0up",
|
|
1013
|
-
"count": 1,
|
|
1014
|
-
"version": {
|
|
1015
|
-
"source": "3.4.2",
|
|
1016
|
-
"tagging": 1
|
|
1017
|
-
},
|
|
1018
900
|
"source": {
|
|
1019
|
-
"type": "
|
|
1020
|
-
"
|
|
1021
|
-
"previous_id": "http://remotehost:9001"
|
|
901
|
+
"type": "collector",
|
|
902
|
+
"schema": "4"
|
|
1022
903
|
}
|
|
1023
904
|
},
|
|
1024
905
|
"mapping": {
|