@walkeros/server-destination-segment 3.3.0-next-1776098542393

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.
@@ -0,0 +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 } = settings;\n\n if (!writeKey) logger.throw('Config settings writeKey missing');\n\n const settingsConfig: Settings = {\n ...settings,\n writeKey,\n // Default identity resolution paths\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 SegmentAnalyticsMock,\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 | SegmentAnalyticsMock\n | undefined;\n const envAnalytics = (env as { analytics?: SegmentAnalyticsMock } | undefined)\n ?.analytics;\n const sdk = envAnalytics || analytics;\n\n if (!sdk) {\n logger.warn('Segment 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('Segment 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 // Build consent context\n const context = buildConsentContext(event, settings);\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 context,\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 context,\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 context,\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 context,\n );\n }\n\n // 6. 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 const params: Record<string, unknown> = {\n ...identity,\n event: eventName,\n properties,\n timestamp,\n };\n if (context) params.context = context;\n\n sdk.track(params);\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 buildConsentContext(\n event: WalkerOS.Event,\n settings: Settings,\n): Record<string, unknown> | undefined {\n const map = settings.consent;\n if (!map || Object.keys(map).length === 0) return undefined;\n\n const consentState = event.consent;\n if (!isObject(consentState)) return undefined;\n\n const categoryPreferences: Record<string, boolean> = {};\n for (const [walkerKey, segmentKey] of Object.entries(map)) {\n if (walkerKey in consentState) {\n categoryPreferences[segmentKey] = consentState[walkerKey] === true;\n }\n }\n\n if (Object.keys(categoryPreferences).length === 0) return undefined;\n\n return { consent: { categoryPreferences } };\n}\n\nfunction applyIdentify(\n sdk: SegmentAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n context?: Record<string, unknown>,\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 if (context) params.context = context;\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: SegmentAnalyticsMock,\n resolved: Record<string, unknown>,\n identity: Record<string, unknown>,\n state: RuntimeState,\n timestamp: Date,\n context?: Record<string, unknown>,\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 if (context) params.context = context;\n\n sdk.group(params);\n\n state.lastGroup = { groupId, traitsHash };\n}\n\nasync function applyPage(\n sdk: SegmentAnalyticsMock,\n pageMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n context?: Record<string, unknown>,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (pageMapping === true) {\n if (context) params.context = context;\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 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 if (context) params.context = context;\n\n sdk.page(params);\n}\n\nasync function applyScreen(\n sdk: SegmentAnalyticsMock,\n screenMapping: unknown,\n event: WalkerOS.Event,\n identity: Record<string, unknown>,\n collector: unknown,\n timestamp: Date,\n context?: Record<string, unknown>,\n): Promise<void> {\n const params: Record<string, unknown> = { ...identity, timestamp };\n\n if (screenMapping === true) {\n if (context) params.context = context;\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 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 if (context) params.context = context;\n\n sdk.screen(params);\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationServer } from '@walkeros/server-core';\nimport type { Analytics, AnalyticsSettings } from '@segment/analytics-node';\n\nexport interface Settings {\n /** Segment source write key (required). */\n writeKey: 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 /** walkerOS consent key -> Segment categoryPreferences key mapping. */\n consent?: Record<string, string>;\n /** Downstream destination filtering. Passthrough to SDK. */\n integrations?: Record<string, boolean | Record<string, unknown>>;\n // SDK constructor options (passthrough)\n /** Base URL of Segment API. Default: 'https://api.segment.io'. */\n host?: string;\n /** API path. Default: '/v1/batch'. */\n path?: string;\n /** Events to enqueue before flushing. Default: 15. */\n flushAt?: number;\n /** Max milliseconds before auto-flush. Default: 10000. */\n flushInterval?: number;\n /** Retry attempts for failed batches. Default: 3. */\n maxRetries?: number;\n /** HTTP request timeout (ms). Default: 10000. */\n httpRequestTimeout?: number;\n /** Completely disable the SDK. Default: false. */\n disable?: boolean;\n /** Runtime state -- not user-facing. Mutated by init/push. */\n _analytics?: Analytics;\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 Segment 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}\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?: SegmentAnalyticsMock;\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 SegmentAnalyticsMock {\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 closeAndFlush: (opts?: { timeout?: number }) => 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, SegmentAnalyticsMock } from './types';\nimport { getConfig } from './config';\nimport { push } from './push';\n\n// Types\nexport * as DestinationSegment from './types';\n\nexport const destinationSegment: Destination = {\n type: 'segment',\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?: SegmentAnalyticsMock } | undefined\n )?.analytics;\n\n if (!envAnalytics) {\n // Production path: create real Analytics instance\n try {\n const { Analytics } = require('@segment/analytics-node');\n const {\n writeKey,\n userId: _u,\n anonymousId: _a,\n identify: _i,\n group: _g,\n consent: _c,\n integrations: _int,\n _analytics: _existing,\n _state: _existingState,\n ...sdkOptions\n } = settings;\n\n const analytics = new Analytics({ writeKey, ...sdkOptions });\n settings._analytics = analytics;\n } catch (err) {\n logger.throw(`Failed to initialize Segment 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 SegmentAnalyticsMock).closeAndFlush({\n timeout: 5000,\n });\n }\n },\n};\n\nexport default destinationSegment;\n"],"mappings":"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","names":[]}