@eventvisor/sdk 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","mappings":"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","sources":["webpack://@eventvisor/sdk/./src/datafileReader.ts","webpack://@eventvisor/sdk/./src/logger.ts","webpack://@eventvisor/sdk/./src/emitter.ts","webpack://@eventvisor/sdk/./src/persister.ts","webpack://@eventvisor/sdk/./src/attributesManager.ts","webpack://@eventvisor/sdk/./src/modulesManager.ts","webpack://@eventvisor/sdk/./src/sourceResolver.ts","webpack://@eventvisor/sdk/./src/compareVersions.ts","webpack://@eventvisor/sdk/./src/conditions.ts","webpack://@eventvisor/sdk/./src/murmurhash.ts","webpack://@eventvisor/sdk/./src/bucketer.ts","webpack://@eventvisor/sdk/./src/transformer.ts","webpack://@eventvisor/sdk/./src/validator.ts","webpack://@eventvisor/sdk/./src/effectsManager.ts","webpack://@eventvisor/sdk/./src/instance.ts"],"sourcesContent":["import {\n AttributeName,\n DatafileContent,\n DestinationName,\n EffectName,\n EventName,\n Persist,\n ComplexPersist,\n Attribute,\n Effect,\n Event,\n Destination,\n} from \"@eventvisor/types\";\n\nimport { Logger } from \"./logger\";\n\nexport interface DatafileReaderOptions {\n datafile: DatafileContent;\n logger: Logger;\n}\n\nexport type GetDatafileReader = () => DatafileReader;\n\nexport type GetRegex = (regexString: string, regexFlags?: string) => RegExp;\n\nexport const emptyDatafile: DatafileContent = {\n schemaVersion: \"1\",\n revision: \"0\",\n\n attributes: {},\n events: {},\n destinations: {},\n effects: {},\n};\n\nexport function getComplexPersists(persist: Persist): ComplexPersist[] {\n let result: ComplexPersist[] = [];\n\n if (typeof persist === \"string\") {\n result.push({ storage: persist });\n } else if (Array.isArray(persist)) {\n for (const p of persist) {\n const r = getComplexPersists(p);\n\n if (r) {\n result = result.concat(r);\n }\n }\n } else if (typeof persist === \"object\") {\n result.push(persist);\n }\n\n return result;\n}\n\nexport class DatafileReader {\n private schemaVersion: string;\n private revision: string;\n\n private datafile: DatafileContent;\n private logger: Logger;\n private regexCache: Record<string, RegExp>;\n\n constructor(options: DatafileReaderOptions) {\n const { datafile, logger } = options;\n\n this.datafile = datafile;\n this.schemaVersion = datafile.schemaVersion;\n this.revision = datafile.revision;\n\n this.regexCache = {};\n\n this.logger = logger;\n }\n\n getSchemaVersion(): string {\n return this.schemaVersion;\n }\n\n getRevision(): string {\n return this.revision;\n }\n\n getAttribute(attributeName: AttributeName): Attribute | undefined {\n return this.datafile.attributes[attributeName];\n }\n\n getAttributeNames(): AttributeName[] {\n return Object.keys(this.datafile.attributes);\n }\n\n getEvent(eventName: EventName): Event | undefined {\n return this.datafile.events[eventName];\n }\n\n getDestination(destinationName: DestinationName): Destination | undefined {\n return this.datafile.destinations[destinationName];\n }\n\n getDestinationNames(): DestinationName[] {\n return Object.keys(this.datafile.destinations);\n }\n\n getEffect(effectName: EffectName): Effect | undefined {\n return this.datafile.effects[effectName];\n }\n\n getEffectNames(): EffectName[] {\n return Object.keys(this.datafile.effects);\n }\n\n getRegex(regexString: string, regexFlags?: string): RegExp {\n const flags = regexFlags || \"\";\n const cacheKey = `${regexString}-${flags}`;\n\n if (this.regexCache[cacheKey]) {\n return this.regexCache[cacheKey];\n }\n\n const regex = new RegExp(regexString, flags);\n this.regexCache[cacheKey] = regex;\n\n return regex;\n }\n\n getPersists(schema: Attribute | Effect): ComplexPersist[] | null {\n if (!schema || !schema.persist) {\n return null;\n }\n\n return getComplexPersists(schema.persist);\n }\n}\n","export type LogLevel = \"fatal\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport type LogMessage = string;\n\nexport interface LogDetails {\n [key: string]: any;\n}\n\nexport type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;\n\nexport interface CreateLoggerOptions {\n level?: LogLevel;\n handler?: LogHandler;\n}\n\nexport const loggerPrefix = \"[Eventvisor]\";\n\nexport const defaultLogHandler: LogHandler = function defaultLogHandler(\n level,\n message,\n details = {},\n) {\n let method = \"log\";\n\n if (level === \"info\") {\n method = \"info\";\n } else if (level === \"warn\") {\n method = \"warn\";\n } else if (level === \"error\") {\n method = \"error\";\n }\n\n console[method](loggerPrefix, message, details);\n};\n\nexport class Logger {\n static allLevels: LogLevel[] = [\n \"fatal\",\n \"error\",\n \"warn\",\n \"info\",\n\n // not enabled by default\n \"debug\",\n ];\n\n static defaultLevel: LogLevel = \"info\";\n\n private level: LogLevel;\n private handle: LogHandler;\n\n constructor(options: CreateLoggerOptions) {\n this.level = options.level || Logger.defaultLevel;\n this.handle = options.handler || defaultLogHandler;\n }\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n log(level: LogLevel, message: LogMessage, details?: LogDetails) {\n const shouldHandle = Logger.allLevels.indexOf(this.level) >= Logger.allLevels.indexOf(level);\n\n if (!shouldHandle) {\n return;\n }\n\n this.handle(level, message, details);\n }\n\n debug(message: LogMessage, details?: LogDetails) {\n this.log(\"debug\", message, details);\n }\n\n info(message: LogMessage, details?: LogDetails) {\n this.log(\"info\", message, details);\n }\n\n warn(message: LogMessage, details?: LogDetails) {\n this.log(\"warn\", message, details);\n }\n\n error(message: LogMessage, details?: LogDetails) {\n this.log(\"error\", message, details);\n }\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n return new Logger(options);\n}\n","export type EmitType =\n | \"ready\"\n | \"datafile_set\"\n | \"attribute_set\"\n | \"attribute_removed\"\n | \"event_tracked\";\n\nexport type EventDetails = Record<string, unknown>;\n\nexport type EventCallback = (details: EventDetails) => void;\n\nexport type Listeners = Record<EmitType, EventCallback[]> | {}; // eslint-disable-line\n\nexport class Emitter {\n listeners: Listeners;\n\n constructor() {\n this.listeners = {};\n }\n\n on(emitType: EmitType, callback: EventCallback) {\n if (!this.listeners[emitType]) {\n this.listeners[emitType] = [];\n }\n\n const listeners = this.listeners[emitType];\n listeners.push(callback);\n\n let isActive = true;\n\n return function unsubscribe() {\n if (!isActive) {\n return;\n }\n\n isActive = false;\n\n const index = listeners.indexOf(callback);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n };\n }\n\n trigger(emitType: EmitType, details: EventDetails = {}) {\n const listeners = this.listeners[emitType];\n\n if (!listeners) {\n return;\n }\n\n listeners.forEach(function (listener) {\n try {\n listener(details);\n } catch (err) {\n console.error(err);\n }\n });\n }\n\n clearAll() {\n this.listeners = {};\n }\n}\n","import type { Attribute, Effect, Value, ComplexPersist } from \"@eventvisor/types\";\nimport type { DatafileReader } from \"./datafileReader\";\nimport type { ConditionsChecker } from \"./conditions\";\nimport type { ModulesManager } from \"./modulesManager\";\n\nexport type EntityMap = Record<string, Value>;\n\nexport interface InitializeFromStorageOptions {\n datafileReader: DatafileReader;\n conditionsChecker: ConditionsChecker;\n modulesManager: ModulesManager;\n storageKeyPrefix: string;\n getEntityNames: () => string[];\n getEntity: (entityName: string) => Attribute | Effect | undefined;\n}\n\nexport interface FindPersistOptions {\n persists: ComplexPersist[];\n entityName: string;\n conditionsChecker: ConditionsChecker;\n payload: Value;\n}\n\nexport async function findPersist(\n options: FindPersistOptions,\n): Promise<ComplexPersist | undefined> {\n const { persists, entityName, conditionsChecker, payload } = options;\n\n for (const persist of persists) {\n if (!persist.conditions) {\n return persist;\n }\n\n const isMatched = await conditionsChecker.allAreMatched(persist.conditions, {\n attributeName: entityName,\n effectName: entityName,\n payload,\n });\n\n if (isMatched) {\n return persist;\n }\n }\n}\n\nexport async function initializeFromStorage({\n datafileReader,\n conditionsChecker,\n modulesManager,\n storageKeyPrefix,\n getEntityNames,\n getEntity,\n}: InitializeFromStorageOptions): Promise<EntityMap> {\n const entityNames = getEntityNames();\n const entityMap: EntityMap = {};\n\n for (const entityName of entityNames) {\n const schema = getEntity(entityName);\n\n if (!schema) {\n continue;\n }\n\n const persists = datafileReader.getPersists(schema);\n\n if (!persists) {\n continue;\n }\n\n const persist = await findPersist({ persists, entityName, conditionsChecker, payload: {} });\n\n if (!persist) {\n continue;\n }\n\n // read from storage\n const value = await modulesManager.readFromStorage(\n persist.storage,\n `${storageKeyPrefix}${entityName}`,\n );\n\n if (value !== null && value !== undefined) {\n entityMap[entityName] = value;\n }\n }\n\n return entityMap;\n}\n\nexport interface PersistEntityOptions {\n datafileReader: DatafileReader;\n conditionsChecker: ConditionsChecker;\n modulesManager: ModulesManager;\n storageKeyPrefix: string;\n entityName: string;\n entity: Attribute | Effect | undefined;\n value: Value;\n}\n\nexport async function persistEntity({\n datafileReader,\n conditionsChecker,\n modulesManager,\n storageKeyPrefix,\n entityName,\n entity,\n value,\n}: PersistEntityOptions) {\n if (!entity) {\n return;\n }\n\n const persists = datafileReader.getPersists(entity);\n\n if (!persists) {\n return;\n }\n\n const persist = await findPersist({ persists, entityName, conditionsChecker, payload: value });\n\n if (!persist) {\n return;\n }\n\n await modulesManager.writeToStorage(persist.storage, `${storageKeyPrefix}${entityName}`, value);\n}\n\nexport interface RemoveEntityOptions {\n datafileReader: DatafileReader;\n conditionsChecker: ConditionsChecker;\n modulesManager: ModulesManager;\n storageKeyPrefix: string;\n entityName: string;\n entity: Attribute | Effect | undefined;\n}\n\nexport async function removeEntity({\n datafileReader,\n conditionsChecker,\n modulesManager,\n storageKeyPrefix,\n entityName,\n entity,\n}: RemoveEntityOptions) {\n if (!entity) {\n return;\n }\n\n const persists = datafileReader.getPersists(entity);\n\n if (!persists) {\n return;\n }\n\n const persist = await findPersist({ persists, entityName, conditionsChecker, payload: {} });\n\n if (!persist) {\n return;\n }\n\n await modulesManager.removeFromStorage(persist.storage, `${storageKeyPrefix}${entityName}`);\n}\n","import type { AttributeName, Value } from \"@eventvisor/types\";\n\nimport type { GetDatafileReader } from \"./datafileReader\";\nimport type { GetConditionsChecker } from \"./conditions\";\nimport type { ModulesManager } from \"./modulesManager\";\nimport type { Emitter } from \"./emitter\";\nimport type { Logger } from \"./logger\";\nimport type { GetTransformer } from \"./transformer\";\nimport type { Validator } from \"./validator\";\nimport { initializeFromStorage, persistEntity, removeEntity } from \"./persister\";\n\nexport type AttributesMap = Record<AttributeName, Value>;\n\nexport interface AttributesManagerOptions {\n logger: Logger;\n emitter: Emitter;\n getDatafileReader: GetDatafileReader;\n getTransformer: GetTransformer;\n getConditionsChecker: GetConditionsChecker;\n validator: Validator;\n modulesManager: ModulesManager;\n}\n\nexport class AttributesManager {\n private logger: Logger;\n private getDatafileReader: GetDatafileReader;\n private emitter: Emitter;\n private getTransformer: GetTransformer;\n private getConditionsChecker: GetConditionsChecker;\n private validator: Validator;\n private modulesManager: ModulesManager;\n\n private attributesMap: AttributesMap;\n\n constructor(options: AttributesManagerOptions) {\n const {\n logger,\n getDatafileReader,\n emitter,\n getTransformer,\n getConditionsChecker,\n validator,\n modulesManager,\n } = options;\n\n this.logger = logger;\n this.getDatafileReader = getDatafileReader;\n this.emitter = emitter;\n this.getTransformer = getTransformer;\n this.getConditionsChecker = getConditionsChecker;\n this.validator = validator;\n this.modulesManager = modulesManager;\n\n // @TODO: initial attributes from SDK options\n this.attributesMap = {};\n }\n\n async initialize(): Promise<void> {\n // read form storage\n await this.initializeFromStorage();\n }\n\n private async initializeFromStorage(): Promise<void> {\n const datafileReader = this.getDatafileReader();\n\n const result = await initializeFromStorage({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"attributes_\",\n getEntityNames: () => datafileReader.getAttributeNames(),\n getEntity: (entityName: string) => datafileReader.getAttribute(entityName),\n });\n\n this.attributesMap = result;\n }\n\n async setAttribute(attributeName: AttributeName, value: Value): Promise<Value | null> {\n const datafileReader = this.getDatafileReader();\n\n /**\n * Find\n */\n const attributeSchema = datafileReader.getAttribute(attributeName);\n\n if (!attributeSchema) {\n this.logger.error(`Attribute schema not found`, {\n attributeName,\n });\n\n return null;\n }\n\n /**\n * Deprecated\n */\n if (attributeSchema.deprecated) {\n this.logger.warn(`Attribute is deprecated`, { attributeName });\n }\n\n /**\n * Validate\n */\n const validationResult = await this.validator.validate(attributeSchema, value);\n\n if (!validationResult.valid) {\n this.logger.warn(`Attribute validation failed`, {\n attributeName,\n errors: validationResult.errors,\n });\n\n return null;\n }\n\n const validatedValue = validationResult.value;\n\n /**\n * Transform\n */\n const transformedValue = attributeSchema.transforms\n ? await this.getTransformer().applyAll(validatedValue, attributeSchema.transforms, {\n payload: validatedValue,\n attributeName,\n })\n : validatedValue;\n\n /**\n * Set\n */\n this.attributesMap[attributeName] = transformedValue;\n\n this.emitter.trigger(\"attribute_set\", { attributeName });\n this.logger.debug(`Attribute set`, { attributeName });\n\n /**\n * Persist\n */\n await persistEntity({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"attributes_\",\n entityName: attributeName,\n entity: attributeSchema,\n value,\n });\n\n return transformedValue;\n }\n\n isAttributeSet(attributeName: AttributeName): boolean {\n return this.attributesMap[attributeName] !== undefined;\n }\n\n getAttributesMap(): AttributesMap {\n return this.attributesMap;\n }\n\n getAttributeValue(attributeName: AttributeName): Value | null {\n return this.attributesMap[attributeName] || null;\n }\n\n async removeAttribute(attributeName: AttributeName): Promise<void> {\n const datafileReader = this.getDatafileReader();\n\n await removeEntity({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"attributes_\",\n entityName: attributeName,\n entity: datafileReader.getAttribute(attributeName),\n });\n\n delete this.attributesMap[attributeName];\n\n this.emitter.trigger(\"attribute_removed\", {\n attributeName,\n });\n }\n}\n","import type {\n Value,\n Effect,\n Step,\n EventName,\n DestinationName,\n EffectName,\n EventLevel,\n} from \"@eventvisor/types\";\n\nimport type { Logger } from \"./logger\";\nimport type { DatafileReader } from \"./datafileReader\";\nimport type { SourceResolver } from \"./sourceResolver\";\n\nexport type ModuleName = string;\n\nexport interface LookupOptions {\n key: string;\n}\n\n// export interface TransformOptions {\n// key: string;\n// value: Value;\n// }\n\nexport interface HandleOptions {\n effectName: EffectName;\n effect: Effect;\n step: Step;\n payload: Value;\n}\n\nexport interface TransportOptions {\n destinationName: DestinationName;\n eventName: EventName;\n eventLevel?: EventLevel;\n payload: Value; // @TODO: rename to body?\n}\n\nexport interface ReadFromStorageOptions {\n key: string;\n}\n\nexport interface WriteToStorageOptions {\n key: string;\n value: Value;\n}\n\nexport interface RemoveFromStorageOptions {\n key: string;\n}\n\nexport interface ModuleDependencies {\n datafileReader: DatafileReader;\n logger: Logger;\n sourceResolver: SourceResolver; // @TODO: single resolveSource function?\n}\n\nexport interface Module {\n name: ModuleName;\n\n // initialize?\n\n lookup?: (options: LookupOptions, deps: ModuleDependencies) => Promise<Value>;\n\n // transform?: (options: TransformOptions, deps: ModuleDependencies) => Promise<Value>;\n\n handle?: (options: HandleOptions, deps: ModuleDependencies) => Promise<void>;\n\n transport?: (options: TransportOptions, deps: ModuleDependencies) => Promise<void>;\n\n readFromStorage?: (options: ReadFromStorageOptions, deps: ModuleDependencies) => Promise<Value>;\n writeToStorage?: (options: WriteToStorageOptions, deps: ModuleDependencies) => Promise<void>;\n removeFromStorage?: (\n options: RemoveFromStorageOptions,\n deps: ModuleDependencies,\n ) => Promise<void>;\n}\n\nexport interface ModulesManagerOptions {\n logger: Logger;\n getDatafileReader: () => DatafileReader;\n getSourceResolver: () => SourceResolver;\n}\n\nexport class ModulesManager {\n private logger: Logger;\n private getDatafileReader: () => DatafileReader;\n private getSourceResolver: () => SourceResolver;\n\n // @TODO: can be optimized further by keeping only array of names, but keeping actual modules in an object\n private modules: Module[];\n\n constructor(options: ModulesManagerOptions) {\n const { logger, getDatafileReader, getSourceResolver } = options;\n\n this.logger = logger;\n this.getDatafileReader = getDatafileReader;\n this.getSourceResolver = getSourceResolver;\n this.modules = [];\n }\n\n registerModule(module: Module) {\n if (this.modules.find((m) => m.name === module.name)) {\n this.logger.error(`Module ${module.name} already registered`);\n\n return;\n }\n\n this.modules.push(module);\n }\n\n getModule(name: string) {\n return this.modules.find((module) => module.name === name);\n }\n\n removeModule(name: string) {\n const module = this.getModule(name);\n\n if (!module) {\n this.logger.error(`Module ${name} not found`);\n\n return;\n }\n\n this.modules = this.modules.filter((module) => module.name !== name);\n }\n\n getModuleDependencies(): ModuleDependencies {\n return {\n datafileReader: this.getDatafileReader(),\n logger: this.logger,\n sourceResolver: this.getSourceResolver(),\n };\n }\n\n async lookup(fullKey: string): Promise<Value> {\n const [moduleName, ...keyParts] = fullKey.split(\".\");\n const key = keyParts.join(\".\");\n\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.lookup) {\n try {\n return await moduleInstance.lookup({ key }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in lookup`, { moduleName, key, error });\n\n return null;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"lookup\" function`);\n\n return null;\n }\n\n async handle(\n fullKey: string,\n effectName: EffectName,\n effect: Effect,\n step: Step,\n payload: Value,\n ): Promise<void> {\n const [moduleName, key] = fullKey.split(\".\"); // eslint-disable-line\n\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.handle) {\n try {\n return await moduleInstance.handle(\n { effectName, effect, step, payload },\n this.getModuleDependencies(),\n );\n } catch (error) {\n this.logger.error(`Error in handle`, { moduleName, effectName, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"handle\" function`);\n\n return;\n }\n\n transportExists(fullKey: string): boolean {\n const [moduleName, key] = fullKey.split(\".\"); // eslint-disable-line\n\n const moduleInstance = this.getModule(moduleName);\n\n return !!(moduleInstance && moduleInstance.transport);\n }\n\n // @TODO: change multiple args to single options object\n async transport(\n fullKey: string,\n destinationName: DestinationName,\n eventName: EventName,\n payload: Value,\n eventLevel?: EventLevel,\n ): Promise<void> {\n const [moduleName, key] = fullKey.split(\".\"); // eslint-disable-line\n\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.transport) {\n try {\n return await moduleInstance.transport(\n { destinationName, eventName, eventLevel, payload },\n this.getModuleDependencies(),\n );\n } catch (error) {\n this.logger.error(`Error in transport`, { moduleName, destinationName, eventName, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"transport\" function`);\n }\n\n async readFromStorage(moduleName: ModuleName, key: string): Promise<Value> {\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.readFromStorage) {\n try {\n return await moduleInstance.readFromStorage({ key }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in readFromStorage`, { moduleName, key, error });\n\n return null;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"readFromStorage\" function`);\n\n return null;\n }\n\n async writeToStorage(moduleName: ModuleName, key: string, value: Value): Promise<void> {\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.writeToStorage) {\n try {\n return await moduleInstance.writeToStorage({ key, value }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in writeToStorage`, { moduleName, key, value, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"writeToStorage\" function`);\n\n return;\n }\n\n async removeFromStorage(moduleName: ModuleName, key: string): Promise<void> {\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.removeFromStorage) {\n try {\n return await moduleInstance.removeFromStorage({ key }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in removeFromStorage`, { moduleName, key, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"removeFromStorage\" function`);\n\n return;\n }\n}\n","import type { Source, SourceBase, Value, Inputs } from \"@eventvisor/types\";\n\nimport type { ModulesManager } from \"./modulesManager\";\nimport type { Logger } from \"./logger\";\nimport type { AttributesManager } from \"./attributesManager\";\nimport type { EffectsManager } from \"./effectsManager\";\n\nexport type GetSourceResolver = () => SourceResolver;\n\nconst SOURCE_PATH_SEPARATOR = \".\";\n\nexport interface SourceResolverOptions {\n logger: Logger;\n modulesManager: ModulesManager;\n attributesManager: AttributesManager;\n effectsManager: EffectsManager;\n}\n\nexport interface SourcePath {\n name: string;\n path: string[]; // dot-separated path after the name\n fullKey: string;\n}\n\nexport type SourceOrigin = SourcePath & {\n originType: \"attribute\" | \"attributes\" | \"effect\" | \"payload\" | \"lookup\" | string;\n};\n\nfunction findValueAtPath(obj: any, path: string[]): any {\n return path.reduce((acc, part) => acc[part], obj);\n}\n\n// @TODO: redo it with a better approach\nexport class SourceResolver {\n private logger: Logger;\n\n private modulesManager: ModulesManager;\n private attributesManager: AttributesManager;\n private effectsManager: EffectsManager;\n\n constructor(options: SourceResolverOptions) {\n const { logger, modulesManager, attributesManager, effectsManager } = options;\n\n this.logger = logger;\n this.modulesManager = modulesManager;\n this.attributesManager = attributesManager;\n this.effectsManager = effectsManager;\n }\n\n getPath(p: string): SourcePath {\n const parts = p.split(SOURCE_PATH_SEPARATOR);\n\n return {\n name: parts[0],\n path: parts.slice(1),\n fullKey: p,\n };\n }\n\n getOrigin(source: Source | Partial<SourceBase>): SourceOrigin | SourceOrigin[] | null {\n if (typeof source === \"string\") {\n const parts = source.split(SOURCE_PATH_SEPARATOR);\n const originType = parts[0] as SourceOrigin[\"originType\"];\n\n // @TODO: validate type as one of known types\n\n return {\n originType,\n name: parts[1],\n path: parts.slice(2),\n fullKey: source,\n };\n }\n\n // @TODO: fix it better\n if (\"source\" in source) {\n return this.getOrigin(source.source as string);\n }\n\n if (\"source\" in source) {\n return this.getOrigin(source.source as string);\n }\n\n if (\"attribute\" in source) {\n return {\n originType: \"attribute\",\n ...this.getPath(source.attribute as string), // @TODO: consider array of strings here\n };\n }\n\n if (\"effect\" in source) {\n return {\n originType: \"effect\",\n ...this.getPath(source.effect as string),\n };\n }\n\n if (\"payload\" in source) {\n if (Array.isArray(source.payload)) {\n return source.payload.map((p) => ({\n originType: \"payload\",\n ...this.getPath(p as string),\n }));\n } else {\n return {\n originType: \"payload\",\n ...this.getPath(source.payload as string),\n };\n }\n }\n\n if (\"lookup\" in source) {\n return {\n originType: \"lookup\",\n ...this.getPath(source.lookup as string),\n };\n }\n\n if (\"state\" in source) {\n return {\n originType: \"state\",\n ...this.getPath(source.state as string),\n };\n }\n\n return null;\n }\n\n async resolveByOrigin(origin: SourceOrigin | null, inputs: Inputs = {}): Promise<Value> {\n if (origin === null) {\n return null;\n }\n\n if (origin.originType === \"attributes\") {\n const result = origin.name\n ? this.attributesManager.getAttributeValue(origin.name)\n : this.attributesManager.getAttributesMap();\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"attribute\") {\n const result = this.attributesManager.getAttributeValue(origin.name);\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"effects\") {\n const result = origin.name\n ? this.effectsManager.getStateValue(origin.name)\n : this.effectsManager.getAllStates();\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"effect\") {\n const result = this.effectsManager.getStateValue(origin.name);\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"lookup\") {\n return this.modulesManager.lookup(origin.fullKey);\n }\n\n // if (origin.originType === \"payload\" && inputs.payload) {\n // return findValueAtPath(inputs.payload, [...origin.path, ...[origin.name]]); // @TODO: make it better\n // }\n\n // if (origin.originType === \"attributes\" && inputs.attributes) {\n // const p = [...origin.path, ...[origin.name]].filter(Boolean);\n // return findValueAtPath(inputs[\"attributes\"], p); // @TODO: make it better\n // }\n\n // handle any other input that is not known early\n if (typeof inputs[origin.originType] !== \"undefined\") {\n return findValueAtPath(\n inputs[origin.originType],\n [...[origin.name, ...origin.path]].filter(Boolean),\n ); // @TODO: make it better\n }\n\n return null;\n }\n\n async resolve(source: Source | Partial<SourceBase>, inputs: Inputs = {}): Promise<Value> {\n const origin = this.getOrigin(source);\n\n if (Array.isArray(origin)) {\n return Promise.all(origin.map((o) => this.resolveByOrigin(o, inputs)));\n }\n\n const result = await this.resolveByOrigin(origin, inputs);\n\n return result;\n }\n}\n","// taken from: https://github.com/omichelsen/compare-versions\n// this is done to avoid loading the whole package\n\n/*\nThe MIT License (MIT)\n\nCopyright (c) 2015-2021 Ole Michelsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */\n\nexport const semver =\n /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\n\nexport const validateAndParse = (version: string) => {\n if (typeof version !== \"string\") {\n throw new TypeError(\"Invalid argument expected string\");\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\n\nconst isWildcard = (s: string) => s === \"*\" || s === \"x\" || s === \"X\";\n\nconst forceType = (a: string | number, b: string | number) =>\n typeof a !== typeof b ? [String(a), String(b)] : [a, b];\n\nconst tryParse = (v: string) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\n\nconst compareStrings = (a: string, b: string) => {\n if (isWildcard(a) || isWildcard(b)) return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp) return 1;\n if (ap < bp) return -1;\n return 0;\n};\n\nexport const compareSegments = (\n a: string | string[] | RegExpMatchArray,\n b: string | string[] | RegExpMatchArray,\n) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || \"0\", b[i] || \"0\");\n if (r !== 0) return r;\n }\n return 0;\n};\n\nexport const compareVersions = (v1: string, v2: string) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0) return r;\n\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split(\".\"), p2.split(\".\"));\n } else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n\n return 0;\n};\n","import type { PlainCondition, Condition, Inputs } from \"@eventvisor/types\";\n\nimport type { GetRegex } from \"./datafileReader\";\nimport type { SourceResolver } from \"./sourceResolver\";\n\nimport { compareVersions } from \"./compareVersions\";\nimport { Logger } from \"./logger\";\n\nexport type GetConditionsChecker = () => ConditionsChecker;\n\nexport interface ConditionsCheckerOptions {\n getRegex: GetRegex;\n sourceResolver: SourceResolver;\n logger: Logger;\n}\n\nexport class ConditionsChecker {\n private getRegex: GetRegex;\n private sourceResolver: SourceResolver;\n private logger: Logger;\n\n constructor(options: ConditionsCheckerOptions) {\n this.getRegex = options.getRegex;\n this.sourceResolver = options.sourceResolver;\n this.logger = options.logger;\n }\n\n async isMatched(condition: PlainCondition, inputs: Inputs): Promise<boolean> {\n const { operator, value, regexFlags } = condition;\n\n const sourceValue = await this.sourceResolver.resolve(condition, inputs);\n\n if (operator === \"equals\") {\n return sourceValue === value;\n } else if (operator === \"notEquals\") {\n return sourceValue !== value;\n } else if (operator === \"before\" || operator === \"after\") {\n // date comparisons\n const valueInContext = sourceValue as string | Date;\n\n const dateInContext =\n valueInContext instanceof Date ? valueInContext : new Date(valueInContext);\n const dateInCondition = value instanceof Date ? value : new Date(value as string);\n\n return operator === \"before\"\n ? dateInContext < dateInCondition\n : dateInContext > dateInCondition;\n } else if (\n Array.isArray(value) &&\n ([\"string\", \"number\"].indexOf(typeof sourceValue) !== -1 || sourceValue === null)\n ) {\n // in / notIn (where condition value is an array)\n const valueInContext = sourceValue as string;\n\n if (operator === \"in\") {\n return value.indexOf(valueInContext) !== -1;\n } else if (operator === \"notIn\") {\n return value.indexOf(valueInContext) === -1;\n }\n } else if (typeof sourceValue === \"string\" && typeof value === \"string\") {\n // string\n const valueInContext = sourceValue as string;\n\n if (operator === \"contains\") {\n return valueInContext.indexOf(value) !== -1;\n } else if (operator === \"notContains\") {\n return valueInContext.indexOf(value) === -1;\n } else if (operator === \"startsWith\") {\n return valueInContext.startsWith(value);\n } else if (operator === \"endsWith\") {\n return valueInContext.endsWith(value);\n } else if (operator === \"semverEquals\") {\n return compareVersions(valueInContext, value) === 0;\n } else if (operator === \"semverNotEquals\") {\n return compareVersions(valueInContext, value) !== 0;\n } else if (operator === \"semverGreaterThan\") {\n return compareVersions(valueInContext, value) === 1;\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return compareVersions(valueInContext, value) >= 0;\n } else if (operator === \"semverLessThan\") {\n return compareVersions(valueInContext, value) === -1;\n } else if (operator === \"semverLessThanOrEquals\") {\n return compareVersions(valueInContext, value) <= 0;\n } else if (operator === \"matches\") {\n const regex = this.getRegex(value, regexFlags || \"\");\n return regex.test(valueInContext);\n } else if (operator === \"notMatches\") {\n const regex = this.getRegex(value, regexFlags || \"\");\n return !regex.test(valueInContext);\n }\n } else if (typeof sourceValue === \"number\" && typeof value === \"number\") {\n // numeric\n const valueInContext = sourceValue as number;\n\n if (operator === \"greaterThan\") {\n return valueInContext > value;\n } else if (operator === \"greaterThanOrEquals\") {\n return valueInContext >= value;\n } else if (operator === \"lessThan\") {\n return valueInContext < value;\n } else if (operator === \"lessThanOrEquals\") {\n return valueInContext <= value;\n }\n } else if (operator === \"exists\") {\n // @TODO: may require extra care for null values\n return typeof sourceValue !== \"undefined\";\n } else if (operator === \"notExists\") {\n return typeof sourceValue === \"undefined\";\n } else if (Array.isArray(sourceValue) && typeof value === \"string\") {\n // includes / notIncludes (where context value is an array)\n const valueInContext = sourceValue as string[];\n\n if (operator === \"includes\") {\n return valueInContext.indexOf(value) > -1;\n } else if (operator === \"notIncludes\") {\n return valueInContext.indexOf(value) === -1;\n }\n }\n\n return false;\n }\n\n private async _allAreMatched(\n conditions: Condition[] | Condition,\n inputs: Inputs,\n ): Promise<boolean> {\n if (typeof conditions === \"string\") {\n if (conditions === \"*\") {\n return true;\n }\n\n return false;\n }\n\n if (\"operator\" in conditions) {\n try {\n return this.isMatched(conditions, inputs);\n } catch (e) {\n this.logger.warn(e.message, {\n error: e,\n details: {\n condition: conditions,\n },\n });\n\n return false;\n }\n }\n\n if (\"and\" in conditions && Array.isArray(conditions.and)) {\n for (const c of conditions.and) {\n if (!(await this._allAreMatched(c, inputs))) {\n return false; // If any condition fails, return false\n }\n }\n return true; // All conditions passed\n }\n\n if (\"or\" in conditions && Array.isArray(conditions.or)) {\n for (const c of conditions.or) {\n if (await this._allAreMatched(c, inputs)) {\n return true; // If any condition passes, return true\n }\n }\n return false; // No conditions passed\n }\n\n if (\"not\" in conditions && Array.isArray(conditions.not)) {\n for (const c of conditions.not) {\n if (await this._allAreMatched(c, inputs)) {\n return false; // If any condition passes, return false (since this is NOT)\n }\n }\n return true; // No conditions passed, which is what we want for NOT\n }\n\n if (Array.isArray(conditions)) {\n let result = true;\n for (const c of conditions) {\n if (!(await this._allAreMatched(c, inputs))) {\n result = false;\n break;\n }\n }\n\n return result;\n }\n\n return false;\n }\n\n async allAreMatched(conditions: Condition[] | Condition, inputs: Inputs): Promise<boolean> {\n const parsedConditions = this.parseIfStringified(conditions);\n\n const result = this._allAreMatched(parsedConditions, inputs);\n\n return result;\n }\n\n parseIfStringified(conditions: Condition | Condition[]): Condition | Condition[] {\n if (typeof conditions !== \"string\") {\n // already parsed\n return conditions;\n }\n\n if (conditions === \"*\") {\n // everyone\n return conditions;\n }\n\n try {\n return JSON.parse(conditions);\n } catch (e) {\n this.logger.error(\"Error parsing conditions\", {\n error: e,\n details: {\n conditions,\n },\n });\n\n return conditions;\n }\n }\n}\n","// v3 function taken from: https://github.com/perezd/node-murmurhash\n// this has been done to avoid loading v2 function which is not used in the SDK\n\n/**\n * Copyright (c) 2020 Gary Court, Derek Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nconst createBuffer = (val) => new TextEncoder().encode(val);\n\nexport function MurmurHashV3(key, seed) {\n if (typeof key === \"string\") key = createBuffer(key);\n\n let remainder, bytes, h1, h1b, c1, c2, k1, i;\n\n remainder = key.length & 3; // key.length % 4\n bytes = key.length - remainder;\n h1 = seed;\n c1 = 0xcc9e2d51;\n c2 = 0x1b873593;\n i = 0;\n\n while (i < bytes) {\n k1 =\n (key[i] & 0xff) |\n ((key[++i] & 0xff) << 8) |\n ((key[++i] & 0xff) << 16) |\n ((key[++i] & 0xff) << 24);\n ++i;\n\n k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff;\n h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16);\n }\n\n k1 = 0;\n\n switch (remainder) {\n case 3:\n k1 ^= (key[i + 2] & 0xff) << 16;\n case 2:\n k1 ^= (key[i + 1] & 0xff) << 8;\n case 1:\n k1 ^= key[i] & 0xff;\n\n k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n","import type { Sample, SampleBy, Inputs } from \"@eventvisor/types\";\n\nimport type { Logger } from \"./logger\";\nimport { MurmurHashV3 } from \"./murmurhash\";\nimport type { SourceResolver } from \"./sourceResolver\";\nimport type { ConditionsChecker } from \"./conditions\";\nimport type { Transformer } from \"./transformer\";\n\nexport type BucketKey = string;\nexport type BucketValue = number; // 0 to 100,000 (100% * 1000 to include three decimal places in same integer)\n\n/**\n * Generic hashing\n */\nconst HASH_SEED = 1;\nconst MAX_HASH_VALUE = Math.pow(2, 32);\n\nexport const MAX_BUCKETED_NUMBER = 100000; // 100% * 1000 to include three decimal places in the same integer value\n\nexport function getBucketedNumber(bucketKey: string): BucketValue {\n const hashValue = MurmurHashV3(bucketKey, HASH_SEED);\n const ratio = hashValue / MAX_HASH_VALUE;\n\n return Math.floor(ratio * MAX_BUCKETED_NUMBER);\n}\n\n/**\n * Bucket key\n */\nconst DEFAULT_BUCKET_KEY_SEPARATOR = \".\";\n\nexport class BucketerOptions {\n logger: Logger;\n sourceResolver: SourceResolver;\n conditionsChecker: ConditionsChecker;\n transformer: Transformer;\n}\n\nexport interface SampleResult {\n isSampled: boolean;\n matchedSample?: Sample;\n bucketedNumber?: number;\n bucketKey?: BucketKey;\n}\n\nexport class Bucketer {\n private logger: Logger;\n private sourceResolver: SourceResolver;\n private conditionsChecker: ConditionsChecker;\n private transformer: Transformer;\n\n constructor(options: BucketerOptions) {\n this.logger = options.logger;\n this.sourceResolver = options.sourceResolver;\n this.conditionsChecker = options.conditionsChecker;\n this.transformer = options.transformer;\n }\n\n async getBucketKey(sampleBy: SampleBy, inputs: Inputs): Promise<BucketKey> {\n let type;\n let sources;\n\n if (typeof sampleBy === \"string\") {\n type = \"plain\";\n sources = [sampleBy];\n } else if (Array.isArray(sampleBy)) {\n type = \"and\";\n sources = sampleBy;\n } else if (typeof sampleBy === \"object\" && \"or\" in sampleBy && Array.isArray(sampleBy.or)) {\n type = \"or\";\n sources = sampleBy.or;\n } else if (typeof sampleBy === \"object\") {\n type = \"and\";\n sources = [sampleBy];\n } else {\n this.logger.error(\"invalid sampleBy\", { sampleBy });\n\n throw new Error(\"invalid sampleBy\");\n }\n\n const bucketKey: string[] = [];\n\n for (const source of sources) {\n const sourceValue = await this.sourceResolver.resolve(source, inputs);\n\n if (typeof sourceValue === \"undefined\") {\n continue;\n }\n\n if (type === \"plain\" || type === \"and\") {\n bucketKey.push(String(sourceValue));\n } else {\n // or\n if (bucketKey.length === 0) {\n bucketKey.push(String(sourceValue));\n }\n }\n }\n\n return bucketKey.join(DEFAULT_BUCKET_KEY_SEPARATOR);\n }\n\n async isSampled(sample: Sample | Sample[], inputs: Inputs): Promise<SampleResult> {\n const samples = Array.isArray(sample) ? sample : [sample];\n\n const matchedSample = samples.find(async (sample) => {\n if (!sample.conditions) {\n return true;\n }\n\n const isMatched = await this.conditionsChecker.allAreMatched(sample.conditions, inputs);\n\n return isMatched;\n });\n\n if (matchedSample) {\n const bucketKey = await this.getBucketKey(matchedSample.by, inputs);\n\n const bucketedNumber = getBucketedNumber(bucketKey);\n\n if (\n matchedSample.percentage &&\n matchedSample.percentage > 0 &&\n bucketedNumber < matchedSample.percentage\n ) {\n return {\n isSampled: false,\n matchedSample,\n bucketedNumber,\n bucketKey,\n };\n }\n\n if (\n matchedSample.range &&\n bucketedNumber < matchedSample.range[0] &&\n bucketedNumber > matchedSample.range[1]\n ) {\n return {\n isSampled: false,\n matchedSample,\n bucketedNumber,\n bucketKey,\n };\n }\n }\n\n return {\n isSampled: true,\n };\n }\n}\n","import type { Value, Transform, Inputs } from \"@eventvisor/types\";\n\nimport type { Logger } from \"./logger\";\nimport type { ConditionsChecker } from \"./conditions\";\nimport type { SourceResolver } from \"./sourceResolver\";\n\nexport type GetTransformer = () => Transformer;\n\nexport interface TransformerOptions {\n logger: Logger;\n conditionsChecker: ConditionsChecker;\n sourceResolver: SourceResolver;\n}\n\nexport class Transformer {\n private logger: Logger;\n private conditionsChecker: ConditionsChecker;\n private sourceResolver: SourceResolver;\n\n constructor(options: TransformerOptions) {\n this.logger = options.logger;\n this.conditionsChecker = options.conditionsChecker;\n this.sourceResolver = options.sourceResolver;\n }\n\n async applyAll(value: Value, transforms: Transform[], inputs: Inputs = {}): Promise<Value> {\n let result = value;\n\n for (const transform of transforms) {\n /**\n * Conditions\n */\n if (transform.conditions) {\n const conditionMatched = await this.conditionsChecker.allAreMatched(\n transform.conditions,\n inputs,\n );\n\n if (!conditionMatched) {\n continue;\n }\n }\n\n /**\n * Source value\n */\n let sourceValue = await this.sourceResolver.resolve(transform, inputs);\n\n // when Transform has no source, but only target\n if (sourceValue === null || sourceValue === undefined) {\n if (transform.target) {\n sourceValue = await this.sourceResolver.resolve(\n {\n payload: transform.target,\n },\n typeof inputs.payload === \"undefined\"\n ? {\n ...inputs,\n payload: value,\n }\n : inputs,\n );\n }\n }\n\n /**\n * Transform value\n */\n // plain target\n if (transform.target) {\n // @TODO: target is always single string. tidy it up\n const targets = Array.isArray(transform.target) ? transform.target : [transform.target];\n\n for (const target of targets) {\n // @TODO: use if/elseif below later\n\n // string only\n if (typeof sourceValue === \"string\") {\n if (transform.type === \"trim\") {\n result = Transformer.setValueAtPath(result, target, sourceValue.trim());\n }\n }\n\n // array only\n if (Array.isArray(sourceValue)) {\n if (transform.type === \"concat\") {\n const separator = transform.separator || \" \";\n result = Transformer.setValueAtPath(result, target, sourceValue.join(separator));\n }\n }\n\n // others\n if (transform.type === \"set\") {\n if (\"value\" in transform) {\n result = Transformer.setValueAtPath(result, target, transform.value);\n } else {\n result = Transformer.setValueAtPath(result, target, sourceValue);\n }\n }\n\n if (transform.type === \"remove\") {\n result = Transformer.removeValueAt(result, target);\n }\n\n // to other types\n if (transform.type === \"toInteger\") {\n result = Transformer.setValueAtPath(result, target, parseInt(String(sourceValue)));\n } else if (transform.type === \"toDouble\") {\n result = Transformer.setValueAtPath(result, target, parseFloat(String(sourceValue)));\n } else if (transform.type === \"toString\") {\n result = Transformer.setValueAtPath(result, target, String(sourceValue) || \"\");\n } else if (transform.type === \"toBoolean\") {\n const lowerCasedValue = String(sourceValue).toLowerCase();\n\n result = Transformer.setValueAtPath(\n result,\n target,\n [\"true\", \"1\", \"checked\", \"yes\", \"on\", \"y\"].indexOf(lowerCasedValue) !== -1 ||\n sourceValue === true,\n );\n }\n }\n } else {\n // without target (meaning, self)\n\n // set\n if (transform.type === \"set\") {\n if (\"value\" in transform) {\n result = transform.value;\n }\n }\n }\n\n if (transform.type === \"spread\") {\n if (transform.target) {\n const currentTargetValue = Transformer.getValueAtPath(result, transform.target);\n result = Transformer.setValueAtPath(result, transform.target, {\n ...((currentTargetValue as object) || {}),\n ...((sourceValue as object) || {}),\n });\n } else {\n result = {\n ...((result as object) || {}),\n ...((sourceValue as object) || {}),\n };\n }\n }\n\n // mathematical\n if (transform.type === \"increment\") {\n const by = typeof transform.value === \"number\" ? transform.value : 1;\n\n if (transform.target) {\n result = Transformer.setValueAtPath(result, transform.target, Number(sourceValue) + by);\n } else {\n result = (result as number) + by;\n }\n } else if (transform.type === \"decrement\") {\n const by = typeof transform.value === \"number\" ? transform.value : 1;\n\n if (transform.target) {\n result = Transformer.setValueAtPath(result, transform.target, Number(sourceValue) - by);\n } else {\n result = (result as number) - by;\n }\n }\n\n // target map\n if (transform.targetMap) {\n const targetMaps: Record<string, string>[] = [];\n\n // @TODO: tidy it up\n if (Array.isArray(transform.targetMap)) {\n for (const targetMap of transform.targetMap) {\n Object.entries(targetMap).forEach(([key, value]) => {\n targetMaps.push({ [key]: value });\n });\n }\n } else {\n Object.entries(transform.targetMap).forEach(([key, value]) => {\n targetMaps.push({ [key]: value });\n });\n }\n\n for (const targetMap of targetMaps) {\n // rename\n if (transform.type === \"rename\") {\n result = Transformer.renameValueAt(result, targetMap as Record<string, string>);\n }\n }\n }\n }\n\n return result;\n }\n\n // Helper function to rename value at path\n public static renameValueAt(obj: any, target: Record<string, string>): any {\n if (!obj || typeof obj !== \"object\") return obj;\n if (!target || typeof target !== \"object\") return obj;\n\n const entries = Object.entries(target);\n if (entries.length === 0) return obj;\n\n const [oldKey, newKey] = entries[0];\n if (!oldKey || !newKey) return obj;\n\n // Get the value at old path\n const oldValue = Transformer.getValueAtPath(obj, oldKey);\n if (oldValue === undefined) return obj;\n\n // Create a copy to avoid mutating the original\n const result = JSON.parse(JSON.stringify(obj));\n\n // Remove old property\n const oldKeys = oldKey.split(\".\");\n let current = result;\n\n // Navigate to parent of old property\n for (let i = 0; i < oldKeys.length - 1; i++) {\n const key = oldKeys[i];\n if (current[key] === undefined) return result;\n current = current[key];\n }\n\n // Remove old property\n delete current[oldKeys[oldKeys.length - 1]];\n\n // Set at new path\n return Transformer.setValueAtPath(result, newKey, oldValue);\n }\n\n // Helper function to get value at path\n public static getValueAtPath(obj: any, path: string): any {\n if (!path || typeof path !== \"string\") return undefined;\n\n const keys = path.split(\".\");\n let current = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined) return undefined;\n if (typeof current === \"object\" && !Array.isArray(current)) {\n current = (current as any)[key];\n } else if (Array.isArray(current) && /^\\d+$/.test(key)) {\n current = current[parseInt(key)];\n } else {\n return undefined;\n }\n }\n\n return current;\n }\n\n // Helper function to set value at path\n public static setValueAtPath(obj: any, path: string, value: any): any {\n if (!path || typeof path !== \"string\") return obj;\n if (obj === null || obj === undefined) return obj;\n\n // Create a copy to avoid mutating the original\n const result = JSON.parse(JSON.stringify(obj));\n const keys = path.split(\".\");\n let current = result as any;\n\n // Navigate to the parent of the target path\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (current[key] === undefined) {\n // Create nested object or array as needed\n if (/^\\d+$/.test(keys[i + 1])) {\n current[key] = [];\n } else {\n current[key] = {};\n }\n }\n current = current[key];\n }\n\n // Set the final value\n const finalKey = keys[keys.length - 1];\n current[finalKey] = value;\n\n return result;\n }\n\n // Helper function to remove value at path\n public static removeValueAt(obj: any, path: string): any {\n if (!path || typeof path !== \"string\") return obj;\n if (obj === null || obj === undefined) return obj;\n\n // Create a copy to avoid mutating the original\n const result = JSON.parse(JSON.stringify(obj));\n const keys = path.split(\".\");\n let current = result as any;\n\n // Navigate to the parent of the target path\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (current[key] === undefined) {\n return result; // Path doesn't exist, nothing to remove\n }\n current = current[key];\n }\n\n // Remove the property\n const finalKey = keys[keys.length - 1];\n if (Array.isArray(current)) {\n if (/^\\d+$/.test(finalKey)) {\n current.splice(parseInt(finalKey), 1);\n }\n } else if (typeof current === \"object\" && current !== null) {\n delete current[finalKey];\n }\n\n return result;\n }\n}\n","import { JSONSchema, Value } from \"@eventvisor/types\";\n\nimport type { GetSourceResolver } from \"./sourceResolver\";\nimport type { Logger } from \"./logger\";\n\nexport interface ValidatorOptions {\n logger: Logger;\n getSourceResolver: GetSourceResolver;\n}\n\nexport class Validator {\n private logger: Logger;\n private getSourceResolver: GetSourceResolver;\n\n constructor(options: ValidatorOptions) {\n this.logger = options.logger;\n this.getSourceResolver = options.getSourceResolver;\n }\n\n validate(schema: JSONSchema, value: Value): Promise<ValidationResult> {\n const deps: ValidationDependencies = {};\n\n return validate(schema, value, deps);\n }\n}\n\nexport interface ValidationError {\n path: string;\n message: string;\n schema?: JSONSchema;\n value?: Value;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors?: ValidationError[];\n value?: Value;\n}\n\nexport interface ValidationDependencies {\n [key: string]: any;\n}\n\nexport async function validate(\n schema: JSONSchema,\n value: Value,\n deps: ValidationDependencies,\n): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const result = validateValue(schema, value, \"\", errors, deps);\n\n // Only apply default if there are no validation errors and result is undefined\n if (result === undefined && errors.length === 0 && schema.default !== undefined) {\n return {\n valid: true,\n value: schema.default,\n errors: [],\n };\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n value: result,\n };\n}\n\nfunction validateValue(\n schema: JSONSchema,\n value: Value,\n path: string,\n errors: ValidationError[],\n deps: ValidationDependencies,\n): Value | undefined {\n // Handle null values\n if (value === null) {\n if ((schema.type as any) === \"null\" || schema.enum?.includes(null)) {\n return value;\n }\n if (schema.type && (schema.type as any) !== \"null\") {\n errors.push({\n path,\n message: `Expected type ${schema.type}, got null`,\n schema,\n value,\n });\n return undefined;\n }\n }\n\n // Handle undefined values\n if (value === undefined) {\n if (schema.default !== undefined) {\n return schema.default;\n }\n if (schema.type) {\n errors.push({\n path,\n message: `Required field missing`,\n schema,\n value,\n });\n return undefined;\n }\n return undefined;\n }\n\n // Type validation (but allow number for integer type to handle specific validation)\n if (schema.type && schema.type !== \"integer\") {\n const typeValid = validateType(schema.type, value);\n if (!typeValid) {\n errors.push({\n path,\n message: `Expected type ${schema.type}, got ${typeof value}`,\n schema,\n value,\n });\n return undefined;\n }\n }\n\n // Const validation\n if (schema.const !== undefined && value !== schema.const) {\n errors.push({\n path,\n message: `Value must be exactly ${JSON.stringify(schema.const)}`,\n schema,\n value,\n });\n return undefined;\n }\n\n // Enum validation\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push({\n path,\n message: `Value must be one of: ${schema.enum.map((v) => JSON.stringify(v)).join(\", \")}`,\n schema,\n value,\n });\n return undefined;\n }\n\n let result = value;\n\n // Object validation\n if (typeof value === \"object\" && !Array.isArray(value) && schema.properties) {\n // Handle JavaScript Error objects specially\n let obj: Record<string, Value>;\n if (value instanceof Error) {\n obj = {\n name: value.name,\n message: value.message,\n stack: value.stack,\n ...(value as any), // Include any additional properties\n };\n } else {\n obj = value as Record<string, Value>;\n }\n const validatedObj: Record<string, Value> = {};\n\n // Validate required properties\n if (schema.required) {\n for (const requiredProp of schema.required) {\n if (!(requiredProp in obj)) {\n if (schema.properties[requiredProp]?.default !== undefined) {\n validatedObj[requiredProp] = schema.properties[requiredProp].default!;\n } else {\n errors.push({\n path: path ? `${path}.${requiredProp}` : requiredProp,\n message: `Required property '${requiredProp}' is missing`,\n schema: schema.properties[requiredProp],\n value: undefined,\n });\n }\n }\n }\n }\n\n // Validate all properties\n for (const [prop, propValue] of Object.entries(obj)) {\n if (schema.properties && schema.properties[prop]) {\n const propSchema = schema.properties[prop];\n const propPath = path ? `${path}.${prop}` : prop;\n const validatedProp = validateValue(propSchema, propValue, propPath, errors, deps);\n if (validatedProp !== undefined) {\n validatedObj[prop] = validatedProp;\n }\n } else {\n // Allow additional properties by default (JSON Schema behavior)\n validatedObj[prop] = propValue;\n }\n }\n\n // Apply defaults for missing optional properties\n if (schema.properties) {\n for (const [prop, propSchema] of Object.entries(schema.properties)) {\n if (!(prop in validatedObj) && propSchema.default !== undefined) {\n validatedObj[prop] = propSchema.default;\n }\n }\n }\n\n result = validatedObj;\n }\n\n // Array validation\n if (Array.isArray(value)) {\n // Array length validation - check before processing items\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n errors.push({\n path,\n message: `Array must have at least ${schema.minItems} items, got ${value.length}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n errors.push({\n path,\n message: `Array must have at most ${schema.maxItems} items, got ${value.length}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.items) {\n const validatedArray: Value[] = [];\n\n if (Array.isArray(schema.items)) {\n // Tuple validation\n for (let i = 0; i < value.length; i++) {\n const itemSchema = schema.items[i];\n if (itemSchema) {\n const itemPath = `${path}[${i}]`;\n const validatedItem = validateValue(itemSchema, value[i], itemPath, errors, deps);\n if (validatedItem !== undefined) {\n validatedArray.push(validatedItem);\n }\n } else {\n validatedArray.push(value[i]);\n }\n }\n } else {\n // Single schema for all items\n for (let i = 0; i < value.length; i++) {\n const itemPath = `${path}[${i}]`;\n const validatedItem = validateValue(schema.items, value[i], itemPath, errors, deps);\n if (validatedItem !== undefined) {\n validatedArray.push(validatedItem);\n }\n }\n }\n\n result = validatedArray;\n } else {\n result = value;\n }\n }\n\n // String validation\n if (typeof value === \"string\") {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n errors.push({\n path,\n message: `String must be at least ${schema.minLength} characters long`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n errors.push({\n path,\n message: `String must be at most ${schema.maxLength} characters long`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.pattern) {\n const regex = new RegExp(schema.pattern);\n if (!regex.test(value)) {\n errors.push({\n path,\n message: `String must match pattern: ${schema.pattern}`,\n schema,\n value,\n });\n return undefined;\n }\n }\n }\n\n // Number validation\n if (typeof value === \"number\") {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push({\n path,\n message: `Number must be at least ${schema.minimum}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push({\n path,\n message: `Number must be at most ${schema.maximum}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.type === \"integer\" && !Number.isInteger(value)) {\n errors.push({\n path,\n message: \"Number must be an integer\",\n schema,\n value,\n });\n return undefined;\n }\n }\n\n // Integer type validation (after number validation)\n if (schema.type === \"integer\" && typeof value !== \"number\") {\n errors.push({\n path,\n message: `Expected type integer, got ${typeof value}`,\n schema,\n value,\n });\n return undefined;\n }\n\n return result;\n}\n\nfunction validateType(expectedType: string, value: Value): boolean {\n switch (expectedType) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\";\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"null\":\n return value === null;\n case \"object\":\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n case \"array\":\n return Array.isArray(value);\n default:\n return true; // Unknown type, assume valid\n }\n}\n","import type { EventName, AttributeName, EffectName, Value, EffectOnType } from \"@eventvisor/types\";\n\nimport type { GetDatafileReader } from \"./datafileReader\";\nimport type { Logger } from \"./logger\";\nimport type { GetTransformer } from \"./transformer\";\nimport type { GetConditionsChecker } from \"./conditions\";\nimport type { ModulesManager } from \"./modulesManager\";\nimport { initializeFromStorage, persistEntity } from \"./persister\";\n\nexport type StatesByEffect = Record<EffectName, Value>;\n\nexport interface DispatchOptions {\n eventType: EffectOnType;\n name: EventName | AttributeName;\n value: Value;\n}\n\nexport interface EffectsManagerOptions {\n logger: Logger;\n getDatafileReader: GetDatafileReader;\n getTransformer: GetTransformer;\n getConditionsChecker: GetConditionsChecker;\n modulesManager: ModulesManager;\n}\n\nexport class EffectsManager {\n private logger: Logger;\n private getDatafileReader: GetDatafileReader;\n private getTransformer: GetTransformer;\n private getConditionsChecker: GetConditionsChecker;\n private modulesManager: ModulesManager;\n\n private statesByEffect: StatesByEffect = {};\n\n constructor(options: EffectsManagerOptions) {\n this.logger = options.logger;\n this.getDatafileReader = options.getDatafileReader;\n this.getTransformer = options.getTransformer;\n this.getConditionsChecker = options.getConditionsChecker;\n this.modulesManager = options.modulesManager;\n }\n\n async initialize(): Promise<void> {\n const datafileReader = this.getDatafileReader();\n const effects = datafileReader.getEffectNames();\n\n const persistedResult = await initializeFromStorage({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"effects_\",\n getEntityNames: () => datafileReader.getEffectNames(),\n getEntity: (entityName: string) => datafileReader.getEffect(entityName),\n });\n\n for (const effectName of effects) {\n const effect = datafileReader.getEffect(effectName);\n\n if (!effect) {\n continue;\n }\n\n if (typeof this.statesByEffect[effectName] !== \"undefined\") {\n // possibly called via refresh() method after initialization\n continue;\n }\n\n if (typeof persistedResult[effectName] !== \"undefined\") {\n // from storage\n this.statesByEffect[effectName] = persistedResult[effectName];\n } else {\n // from initial state of effect\n if (typeof effect.state !== \"undefined\") {\n if (typeof this.statesByEffect[effectName] === \"undefined\") {\n this.statesByEffect[effectName] = effect.state;\n }\n }\n }\n }\n }\n\n async dispatch(dispatchOptions: DispatchOptions) {\n // @TODO: rename to actionType\n const { eventType, name, value } = dispatchOptions;\n\n const datafileReader = this.getDatafileReader();\n const conditionsChecker = this.getConditionsChecker();\n const transformer = this.getTransformer();\n\n const allEffects = datafileReader.getEffectNames();\n\n for (const effectName of allEffects) {\n const effect = datafileReader.getEffect(effectName);\n\n if (!effect) {\n continue;\n }\n\n if (eventType === \"event_tracked\") {\n if (Array.isArray(effect.on) && !effect.on.includes(\"event_tracked\")) {\n continue;\n }\n\n if (typeof effect.on === \"object\" && !effect.on[\"event_tracked\"]?.includes(name)) {\n continue;\n }\n }\n\n if (eventType === \"attribute_set\") {\n if (Array.isArray(effect.on) && !effect.on.includes(\"attribute_set\")) {\n continue;\n }\n\n if (typeof effect.on === \"object\" && !effect.on[\"attribute_set\"]?.includes(name)) {\n continue;\n }\n }\n\n // conditions\n if (effect.conditions) {\n const isMatched = await conditionsChecker.allAreMatched(effect.conditions, {\n payload: value,\n eventName: eventType === \"event_tracked\" ? name : undefined,\n attributeName: eventType === \"attribute_set\" ? name : undefined,\n state: this.statesByEffect[effectName],\n });\n\n if (!isMatched) {\n continue;\n }\n }\n\n // steps\n if (effect.steps) {\n for (const step of effect.steps) {\n let stepPassed = true;\n\n // conditions\n if (step.conditions) {\n const conditionsChecker = this.getConditionsChecker();\n const isMatched = await conditionsChecker.allAreMatched(step.conditions, {\n payload: value,\n eventName: eventType === \"event_tracked\" ? name : undefined,\n attributeName: eventType === \"attribute_set\" ? name : undefined,\n state: this.statesByEffect[effectName],\n });\n\n if (!isMatched) {\n continue;\n }\n }\n\n // handler\n if (step.handler) {\n try {\n await this.modulesManager.handle(step.handler, effectName, effect, step, value);\n } catch (handlerError) {\n this.logger.error(`Effect handler error`, {\n effectName,\n step,\n error: handlerError,\n });\n\n stepPassed = false;\n }\n }\n\n // continueOnError\n if (!stepPassed && typeof step.continueOnError === \"boolean\" && !step.continueOnError) {\n break;\n }\n\n // transforms\n if (step.transforms) {\n this.statesByEffect[effectName] = await transformer.applyAll(\n this.statesByEffect[effectName],\n step.transforms,\n {\n eventName: eventType === \"event_tracked\" ? name : undefined,\n attributeName: eventType === \"attribute_set\" ? name : undefined,\n state: this.statesByEffect[effectName],\n },\n );\n }\n }\n }\n\n // persist\n await persistEntity({\n datafileReader,\n conditionsChecker,\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"effects_\",\n entityName: effectName,\n entity: effect,\n value: this.statesByEffect[effectName],\n });\n }\n }\n\n // called after datafile refresh\n refresh() {\n // @TODO: think\n this.initialize();\n }\n\n getAllStates() {\n return this.statesByEffect;\n }\n\n getStateValue(name: EffectName) {\n return this.statesByEffect[name];\n }\n}\n","import {\n AttributeName,\n DatafileContent,\n EventName,\n EffectName,\n Value,\n Action,\n} from \"@eventvisor/types\";\n\nimport { DatafileReader, emptyDatafile } from \"./datafileReader\";\nimport { createLogger, Logger, LogLevel } from \"./logger\";\nimport { Emitter, EmitType, EventCallback } from \"./emitter\";\nimport { AttributesManager } from \"./attributesManager\";\nimport { Module, ModuleName, ModulesManager } from \"./modulesManager\";\nimport { SourceResolver } from \"./sourceResolver\";\nimport { ConditionsChecker } from \"./conditions\";\nimport { Bucketer } from \"./bucketer\";\nimport { Transformer } from \"./transformer\";\nimport { Validator } from \"./validator\";\nimport { EffectsManager } from \"./effectsManager\";\n\nexport interface InstanceOptions {\n datafile?: DatafileContent;\n logLevel?: LogLevel;\n logger?: Logger;\n modules?: Module[];\n\n // @TODO\n // initialAttributes?: Record<AttributeName, Value>;\n}\n\nexport class Eventvisor {\n private datafileReader: DatafileReader;\n private logger: Logger;\n private emitter: Emitter;\n private attributesManager: AttributesManager;\n private modulesManager: ModulesManager;\n private effectsManager: EffectsManager;\n private sourceResolver: SourceResolver;\n private conditionsChecker: ConditionsChecker;\n private transformer: Transformer;\n private bucketer: Bucketer;\n private validator: Validator;\n\n private ready: boolean = false;\n private queue: Action[] = [];\n private queueProcessing: boolean = false;\n\n constructor(options: InstanceOptions = {}) {\n /**\n * Core instances without interdependencies\n *\n * @TODO: sort out this dependency mess!!\n */\n this.logger =\n options.logger ||\n createLogger({\n level: options.logLevel || Logger.defaultLevel,\n });\n\n this.datafileReader = new DatafileReader({\n datafile: options.datafile || emptyDatafile,\n logger: this.logger,\n });\n\n this.emitter = new Emitter();\n\n /**\n * Instances with interdependencies\n */\n this.modulesManager = new ModulesManager({\n logger: this.logger,\n getDatafileReader: () => this.datafileReader,\n getSourceResolver: () => this.sourceResolver,\n });\n\n this.validator = new Validator({\n logger: this.logger,\n getSourceResolver: () => this.sourceResolver,\n });\n\n this.attributesManager = new AttributesManager({\n logger: this.logger,\n emitter: this.emitter,\n validator: this.validator,\n getDatafileReader: () => this.datafileReader,\n getTransformer: () => this.transformer,\n getConditionsChecker: () => this.conditionsChecker,\n modulesManager: this.modulesManager,\n });\n\n this.effectsManager = new EffectsManager({\n logger: this.logger,\n getDatafileReader: () => this.datafileReader,\n getTransformer: () => this.transformer,\n getConditionsChecker: () => this.conditionsChecker,\n modulesManager: this.modulesManager,\n });\n\n this.sourceResolver = new SourceResolver({\n logger: this.logger,\n modulesManager: this.modulesManager,\n attributesManager: this.attributesManager,\n effectsManager: this.effectsManager,\n });\n\n this.conditionsChecker = new ConditionsChecker({\n logger: this.logger,\n getRegex: (regexString, regexFlags) => this.datafileReader.getRegex(regexString, regexFlags),\n sourceResolver: this.sourceResolver,\n });\n\n this.transformer = new Transformer({\n logger: this.logger,\n conditionsChecker: this.conditionsChecker,\n sourceResolver: this.sourceResolver,\n });\n\n this.bucketer = new Bucketer({\n logger: this.logger,\n sourceResolver: this.sourceResolver,\n conditionsChecker: this.conditionsChecker,\n transformer: this.transformer,\n });\n\n /**\n * Ready\n */\n if (options.modules) {\n for (const module of options.modules) {\n this.modulesManager.registerModule(module);\n }\n }\n\n Promise.all([this.effectsManager.initialize(), this.attributesManager.initialize()])\n .then(() => {\n this.ready = true;\n this.emitter.trigger(\"ready\");\n this.logger.debug(\"Eventvisor SDK is ready\");\n })\n .catch((error) => {\n this.logger.error(\"initialization failed\", error);\n });\n\n this.logger.info(\"Eventvisor SDK initialized\");\n }\n\n isReady() {\n return this.ready;\n }\n\n async onReady(): Promise<void> {\n if (this.ready) {\n return;\n }\n\n return new Promise((resolve) => {\n const unsubscribe = this.emitter.on(\"ready\", () => {\n unsubscribe();\n resolve();\n });\n });\n }\n\n getRevision() {\n return this.datafileReader.getRevision();\n }\n\n setLogLevel(level: LogLevel) {\n return this.logger.setLevel(level);\n }\n\n setDatafile(datafile: DatafileContent) {\n try {\n const newDatafileReader = new DatafileReader({\n datafile,\n logger: this.logger,\n });\n\n this.datafileReader = newDatafileReader;\n\n this.effectsManager.refresh();\n\n this.emitter.trigger(\"datafile_set\");\n } catch (error) {\n this.logger.error(\"Error setting datafile\", {\n error,\n });\n }\n }\n\n on(emitType: EmitType, callback: EventCallback) {\n return this.emitter.on(emitType, callback);\n }\n\n /**\n * Queue\n */\n private addToQueue(action: Action) {\n this.queue.push(action);\n }\n\n // @TODO: make it better\n private async processQueue() {\n if (this.queue.length === 0) {\n return;\n }\n\n if (this.queueProcessing) {\n return;\n }\n\n this.queueProcessing = true;\n\n const action = this.queue.shift();\n\n if (!action) {\n this.queueProcessing = false;\n\n return;\n }\n\n try {\n if (action.type === \"track\") {\n await this.trackAsync(action.name, action.value);\n } else if (action.type === \"setAttribute\") {\n await this.setAttributeAsync(action.name, action.value);\n } else if (action.type === \"removeAttribute\") {\n await this.removeAttributeAsync(action.name);\n } else if (action.type === \"removeAttribute\") {\n await this.removeAttributeAsync(action.name);\n }\n } catch (error) {\n this.logger.error(`Error processing queue`, {\n error,\n action,\n });\n }\n\n this.queueProcessing = false;\n\n await this.processQueue();\n }\n\n /**\n * Attribute\n */\n async setAttributeAsync(attributeName: AttributeName, value: Value) {\n const result = await this.attributesManager.setAttribute(attributeName, value);\n\n /**\n * Effects\n */\n await this.effectsManager.dispatch({\n eventType: \"attribute_set\",\n name: attributeName,\n value: result,\n });\n\n return result;\n }\n\n setAttribute(attributeName: AttributeName, value: Value) {\n this.addToQueue({\n type: \"setAttribute\",\n name: attributeName,\n value,\n });\n\n this.processQueue();\n }\n\n getAttributeValue(attributeName: AttributeName) {\n return this.attributesManager.getAttributeValue(attributeName);\n }\n\n getAttributes() {\n return this.attributesManager.getAttributesMap();\n }\n\n isAttributeSet(attributeName: AttributeName) {\n return this.attributesManager.isAttributeSet(attributeName);\n }\n\n removeAttributeAsync(attributeName: AttributeName) {\n return this.attributesManager.removeAttribute(attributeName);\n }\n\n removeAttribute(attributeName: AttributeName) {\n this.addToQueue({\n type: \"removeAttribute\",\n name: attributeName,\n });\n\n this.processQueue();\n }\n\n /**\n * Modules\n */\n registerModule(module: Module) {\n return this.modulesManager.registerModule(module);\n }\n\n removeModule(moduleName: ModuleName) {\n return this.modulesManager.removeModule(moduleName);\n }\n\n /**\n * Event\n */\n async trackAsync(eventName: EventName, value: Value): Promise<Value | null> {\n /**\n * Find\n */\n const eventSchema = this.datafileReader.getEvent(eventName);\n\n if (!eventSchema) {\n this.logger.error(`Event schema not found in datafile`, { eventName });\n\n return null; // @TODO: allow to continue based on SDK instance options later\n }\n\n const eventLevel = eventSchema.level || \"info\";\n\n /**\n * Deprecated\n */\n if (eventSchema.deprecated) {\n this.logger.warn(`Event is deprecated`, { eventName });\n }\n\n /**\n * Validate\n */\n const validationResult = await this.validator.validate(eventSchema, value);\n\n if (!validationResult.valid) {\n this.logger.warn(`Event validation failed`, {\n eventName,\n errors: validationResult.errors,\n });\n\n return null; // @TODO: allow to continue based on schema later\n }\n\n const validatedValue = validationResult.value;\n\n /**\n * Conditions\n */\n if (eventSchema.conditions) {\n const isMatched = await this.conditionsChecker.allAreMatched(eventSchema.conditions, {\n // @TODO: rename to eventPayload to be explicit?\n eventName,\n eventLevel,\n payload: validatedValue,\n });\n\n if (!isMatched) {\n this.logger.debug(`Event conditions not matched`, {\n eventName,\n conditions: eventSchema.conditions,\n });\n\n return null;\n }\n }\n\n /**\n * Sample\n */\n if (eventSchema.sample) {\n const sampleResult = await this.bucketer.isSampled(eventSchema.sample, {\n eventName,\n eventLevel,\n payload: validatedValue,\n });\n\n if (!sampleResult.isSampled) {\n this.logger.debug(`Event sample not matched`, {\n eventName,\n matchedSample: sampleResult.matchedSample,\n bucketedNumber: sampleResult.bucketedNumber,\n bucketKey: sampleResult.bucketKey,\n });\n\n return null;\n }\n }\n\n /**\n * Transform\n */\n let transformedValue = validatedValue;\n\n if (eventSchema.transforms) {\n transformedValue = await this.transformer.applyAll(validatedValue, eventSchema.transforms, {\n eventName,\n eventLevel,\n payload: validatedValue,\n });\n }\n\n /**\n * Effects\n */\n await this.effectsManager.dispatch({\n eventType: \"event_tracked\",\n name: eventName,\n value: transformedValue,\n });\n\n /**\n * Destinations\n */\n const destinationNames = this.datafileReader.getDestinationNames();\n\n for (const destinationName of destinationNames) {\n const destination = this.datafileReader.getDestination(destinationName);\n\n if (!destination) {\n continue;\n }\n\n const transportExists = this.modulesManager.transportExists(destination.transport);\n\n if (!transportExists) {\n this.logger.error(`Destination has no transport`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n\n let transportBody = transformedValue;\n\n /**\n * Event.destinations\n */\n if (\n eventSchema.destinations &&\n typeof eventSchema.destinations[destinationName] !== \"undefined\"\n ) {\n const destinationOverride = eventSchema.destinations[destinationName];\n\n if (destinationOverride === false) {\n this.logger.debug(`Event has destination disabled`, {\n eventName,\n destinationName,\n });\n\n continue;\n } else if (typeof destinationOverride === \"object\") {\n // conditions\n if (destinationOverride.conditions) {\n const isMatched = await this.conditionsChecker.allAreMatched(\n destinationOverride.conditions,\n {\n eventName,\n eventLevel,\n payload: transportBody,\n },\n );\n\n if (!isMatched) {\n this.logger.debug(`Destination conditions not matched for event`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n\n // sample\n if (destinationOverride.sample) {\n const sampleResult = await this.bucketer.isSampled(destinationOverride.sample, {\n eventName,\n eventLevel,\n payload: transportBody,\n });\n\n if (!sampleResult.isSampled) {\n this.logger.debug(`Destination sample not matched for event`, {\n eventName,\n destinationName,\n matchedSample: sampleResult.matchedSample,\n bucketedNumber: sampleResult.bucketedNumber,\n bucketKey: sampleResult.bucketKey,\n });\n\n continue;\n }\n }\n\n // transform\n if (destinationOverride.transforms) {\n // @TODO: make sure this transformed value is only affecting the specific desired destination and not others\n transportBody = await this.transformer.applyAll(\n transformedValue,\n destinationOverride.transforms,\n {\n eventName,\n eventLevel,\n payload: transportBody,\n },\n );\n }\n }\n }\n }\n\n /**\n * Destination itself\n */\n\n // conditions\n if (destination.conditions) {\n const isMatched = await this.conditionsChecker.allAreMatched(destination.conditions, {\n eventName,\n eventLevel,\n payload: transformedValue,\n });\n\n if (!isMatched) {\n this.logger.debug(`Destination conditions not matched`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n }\n\n // sample\n if (destination.sample) {\n const sampleResult = await this.bucketer.isSampled(destination.sample, {\n eventName,\n eventLevel,\n payload: transportBody,\n });\n\n if (!sampleResult.isSampled) {\n this.logger.debug(`Destination sample not matched`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n }\n\n // transform\n if (destination.transforms) {\n transportBody = await this.transformer.applyAll(transportBody, destination.transforms, {\n eventName,\n eventLevel,\n payload: transportBody,\n destinationName,\n attributes: this.attributesManager.getAttributesMap(), // @TODO: check if needed\n });\n }\n\n // hand over to module for transporting\n // @TODO: decide about \"await\" or not\n // @TODO: batch\n // @TODO: retry\n await this.modulesManager.transport(\n destination.transport,\n destinationName,\n eventName,\n transportBody,\n eventLevel,\n );\n }\n\n return transformedValue;\n }\n\n track(eventName: EventName, value: Value) {\n this.addToQueue({\n type: \"track\",\n name: eventName,\n value,\n });\n\n this.processQueue();\n }\n\n /**\n * Effect's state\n */\n getStateValue(name: EffectName) {\n return this.effectsManager.getStateValue(name);\n }\n\n /**\n * @TODO: implement\n */\n spawn() {\n // create child instance here\n }\n}\n\nexport function createInstance(options: InstanceOptions = {}): Eventvisor {\n return new Eventvisor(options);\n}\n"],"names":["emptyDatafile","schemaVersion","revision","attributes","events","destinations","effects","getComplexPersists","persist","result","push","storage","Array","isArray","p","r","concat","DatafileReader","constructor","options","datafile","logger","this","regexCache","getSchemaVersion","getRevision","getAttribute","attributeName","getAttributeNames","Object","keys","getEvent","eventName","getDestination","destinationName","getDestinationNames","getEffect","effectName","getEffectNames","getRegex","regexString","regexFlags","flags","cacheKey","regex","RegExp","getPersists","schema","loggerPrefix","defaultLogHandler","level","message","details","method","console","Logger","defaultLevel","handle","handler","setLevel","log","allLevels","indexOf","debug","info","warn","error","createLogger","Emitter","listeners","on","emitType","callback","isActive","index","splice","trigger","forEach","listener","err","clearAll","findPersist","persists","entityName","conditionsChecker","payload","conditions","allAreMatched","initializeFromStorage","datafileReader","modulesManager","storageKeyPrefix","getEntityNames","getEntity","entityNames","entityMap","value","readFromStorage","persistEntity","entity","writeToStorage","AttributesManager","getDatafileReader","emitter","getTransformer","getConditionsChecker","validator","attributesMap","initialize","setAttribute","attributeSchema","deprecated","validationResult","validate","valid","errors","validatedValue","transformedValue","transforms","applyAll","isAttributeSet","undefined","getAttributesMap","getAttributeValue","removeAttribute","removeFromStorage","removeEntity","ModulesManager","getSourceResolver","modules","registerModule","module","find","m","name","getModule","removeModule","filter","getModuleDependencies","sourceResolver","lookup","fullKey","moduleName","keyParts","split","key","join","moduleInstance","effect","step","transportExists","transport","eventLevel","findValueAtPath","obj","path","reduce","acc","part","SourceResolver","attributesManager","effectsManager","getPath","parts","slice","getOrigin","source","originType","attribute","map","state","resolveByOrigin","origin","inputs","length","getStateValue","getAllStates","Boolean","resolve","Promise","all","o","semver","validateAndParse","version","TypeError","match","Error","shift","isWildcard","s","tryParse","v","n","parseInt","isNaN","compareStrings","a","b","ap","bp","String","forceType","compareSegments","i","Math","max","compareVersions","v1","v2","n1","n2","p1","pop","p2","ConditionsChecker","isMatched","condition","operator","sourceValue","dateInContext","Date","dateInCondition","valueInContext","startsWith","endsWith","test","_allAreMatched","e","and","c","or","not","parsedConditions","parseIfStringified","JSON","parse","MurmurHashV3","seed","val","remainder","bytes","h1","h1b","c1","c2","k1","TextEncoder","encode","MAX_HASH_VALUE","pow","MAX_BUCKETED_NUMBER","getBucketedNumber","bucketKey","ratio","floor","BucketerOptions","Bucketer","transformer","getBucketKey","sampleBy","type","sources","isSampled","sample","matchedSample","by","bucketedNumber","percentage","range","Transformer","transform","target","targets","setValueAtPath","trim","separator","removeValueAt","parseFloat","lowerCasedValue","toLowerCase","currentTargetValue","getValueAtPath","Number","targetMap","targetMaps","entries","renameValueAt","oldKey","newKey","oldValue","stringify","oldKeys","current","finalKey","Validator","deps","validateValue","default","enum","includes","typeValid","expectedType","isInteger","validateType","const","properties","stack","validatedObj","required","requiredProp","prop","propValue","validatedProp","propSchema","minItems","maxItems","items","validatedArray","itemSchema","itemPath","validatedItem","minLength","maxLength","pattern","minimum","maximum","EffectsManager","statesByEffect","persistedResult","dispatch","dispatchOptions","eventType","allEffects","steps","stepPassed","handlerError","continueOnError","refresh","Eventvisor","ready","queue","queueProcessing","logLevel","bucketer","then","catch","isReady","onReady","unsubscribe","setLogLevel","setDatafile","newDatafileReader","addToQueue","action","processQueue","trackAsync","setAttributeAsync","removeAttributeAsync","getAttributes","eventSchema","sampleResult","destinationNames","destination","transportBody","destinationOverride","track","spawn","createInstance"],"sourceRoot":""}
1
+ {"version":3,"file":"index.mjs","mappings":"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","sources":["webpack://@eventvisor/sdk/./src/datafileReader.ts","webpack://@eventvisor/sdk/./src/logger.ts","webpack://@eventvisor/sdk/./src/emitter.ts","webpack://@eventvisor/sdk/./src/persister.ts","webpack://@eventvisor/sdk/./src/attributesManager.ts","webpack://@eventvisor/sdk/./src/modulesManager.ts","webpack://@eventvisor/sdk/./src/sourceResolver.ts","webpack://@eventvisor/sdk/./src/compareVersions.ts","webpack://@eventvisor/sdk/./src/conditions.ts","webpack://@eventvisor/sdk/./src/murmurhash.ts","webpack://@eventvisor/sdk/./src/bucketer.ts","webpack://@eventvisor/sdk/./src/transformer.ts","webpack://@eventvisor/sdk/./src/validator.ts","webpack://@eventvisor/sdk/./src/effectsManager.ts","webpack://@eventvisor/sdk/./src/instance.ts"],"sourcesContent":["import {\n AttributeName,\n DatafileContent,\n DestinationName,\n EffectName,\n EventName,\n Persist,\n ComplexPersist,\n Attribute,\n Effect,\n Event,\n Destination,\n} from \"@eventvisor/types\";\n\nimport { Logger } from \"./logger\";\n\nexport interface DatafileReaderOptions {\n datafile: DatafileContent;\n logger: Logger;\n}\n\nexport type GetDatafileReader = () => DatafileReader;\n\nexport type GetRegex = (regexString: string, regexFlags?: string) => RegExp;\n\nexport const emptyDatafile: DatafileContent = {\n schemaVersion: \"1\",\n revision: \"0\",\n\n attributes: {},\n events: {},\n destinations: {},\n effects: {},\n};\n\nexport function getComplexPersists(persist: Persist): ComplexPersist[] {\n let result: ComplexPersist[] = [];\n\n if (typeof persist === \"string\") {\n result.push({ storage: persist });\n } else if (Array.isArray(persist)) {\n for (const p of persist) {\n const r = getComplexPersists(p);\n\n if (r) {\n result = result.concat(r);\n }\n }\n } else if (typeof persist === \"object\") {\n result.push(persist);\n }\n\n return result;\n}\n\nexport class DatafileReader {\n private schemaVersion: string;\n private revision: string;\n\n private datafile: DatafileContent;\n private logger: Logger;\n private regexCache: Record<string, RegExp>;\n\n constructor(options: DatafileReaderOptions) {\n const { datafile, logger } = options;\n\n this.datafile = datafile;\n this.schemaVersion = datafile.schemaVersion;\n this.revision = datafile.revision;\n\n this.regexCache = {};\n\n this.logger = logger;\n }\n\n getSchemaVersion(): string {\n return this.schemaVersion;\n }\n\n getRevision(): string {\n return this.revision;\n }\n\n getAttribute(attributeName: AttributeName): Attribute | undefined {\n return this.datafile.attributes[attributeName];\n }\n\n getAttributeNames(): AttributeName[] {\n return Object.keys(this.datafile.attributes);\n }\n\n getEvent(eventName: EventName): Event | undefined {\n return this.datafile.events[eventName];\n }\n\n getDestination(destinationName: DestinationName): Destination | undefined {\n return this.datafile.destinations[destinationName];\n }\n\n getDestinationNames(): DestinationName[] {\n return Object.keys(this.datafile.destinations);\n }\n\n getEffect(effectName: EffectName): Effect | undefined {\n return this.datafile.effects[effectName];\n }\n\n getEffectNames(): EffectName[] {\n return Object.keys(this.datafile.effects);\n }\n\n getRegex(regexString: string, regexFlags?: string): RegExp {\n const flags = regexFlags || \"\";\n const cacheKey = `${regexString}-${flags}`;\n\n if (this.regexCache[cacheKey]) {\n return this.regexCache[cacheKey];\n }\n\n const regex = new RegExp(regexString, flags);\n this.regexCache[cacheKey] = regex;\n\n return regex;\n }\n\n getPersists(schema: Attribute | Effect): ComplexPersist[] | null {\n if (!schema || !schema.persist) {\n return null;\n }\n\n return getComplexPersists(schema.persist);\n }\n}\n","export type LogLevel = \"fatal\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport type LogMessage = string;\n\nexport interface LogDetails {\n [key: string]: any;\n}\n\nexport type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;\n\nexport interface CreateLoggerOptions {\n level?: LogLevel;\n handler?: LogHandler;\n}\n\nexport const loggerPrefix = \"[Eventvisor]\";\n\nexport const defaultLogHandler: LogHandler = function defaultLogHandler(\n level,\n message,\n details = {},\n) {\n let method = \"log\";\n\n if (level === \"info\") {\n method = \"info\";\n } else if (level === \"warn\") {\n method = \"warn\";\n } else if (level === \"error\") {\n method = \"error\";\n }\n\n console[method](loggerPrefix, message, details);\n};\n\nexport class Logger {\n static allLevels: LogLevel[] = [\n \"fatal\",\n \"error\",\n \"warn\",\n \"info\",\n\n // not enabled by default\n \"debug\",\n ];\n\n static defaultLevel: LogLevel = \"info\";\n\n private level: LogLevel;\n private handle: LogHandler;\n\n constructor(options: CreateLoggerOptions) {\n this.level = options.level || Logger.defaultLevel;\n this.handle = options.handler || defaultLogHandler;\n }\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n log(level: LogLevel, message: LogMessage, details?: LogDetails) {\n const shouldHandle = Logger.allLevels.indexOf(this.level) >= Logger.allLevels.indexOf(level);\n\n if (!shouldHandle) {\n return;\n }\n\n this.handle(level, message, details);\n }\n\n debug(message: LogMessage, details?: LogDetails) {\n this.log(\"debug\", message, details);\n }\n\n info(message: LogMessage, details?: LogDetails) {\n this.log(\"info\", message, details);\n }\n\n warn(message: LogMessage, details?: LogDetails) {\n this.log(\"warn\", message, details);\n }\n\n error(message: LogMessage, details?: LogDetails) {\n this.log(\"error\", message, details);\n }\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n return new Logger(options);\n}\n","export type EmitType =\n | \"ready\"\n | \"datafile_set\"\n | \"attribute_set\"\n | \"attribute_removed\"\n | \"event_tracked\";\n\nexport type EventDetails = Record<string, unknown>;\n\nexport type EventCallback = (details: EventDetails) => void;\n\nexport type Listeners = Record<EmitType, EventCallback[]> | {}; // eslint-disable-line\n\nexport class Emitter {\n listeners: Listeners;\n\n constructor() {\n this.listeners = {};\n }\n\n on(emitType: EmitType, callback: EventCallback) {\n if (!this.listeners[emitType]) {\n this.listeners[emitType] = [];\n }\n\n const listeners = this.listeners[emitType];\n listeners.push(callback);\n\n let isActive = true;\n\n return function unsubscribe() {\n if (!isActive) {\n return;\n }\n\n isActive = false;\n\n const index = listeners.indexOf(callback);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n };\n }\n\n trigger(emitType: EmitType, details: EventDetails = {}) {\n const listeners = this.listeners[emitType];\n\n if (!listeners) {\n return;\n }\n\n listeners.forEach(function (listener) {\n try {\n listener(details);\n } catch (err) {\n console.error(err);\n }\n });\n }\n\n clearAll() {\n this.listeners = {};\n }\n}\n","import type { Attribute, Effect, Value, ComplexPersist } from \"@eventvisor/types\";\nimport type { DatafileReader } from \"./datafileReader\";\nimport type { ConditionsChecker } from \"./conditions\";\nimport type { ModulesManager } from \"./modulesManager\";\n\nexport type EntityMap = Record<string, Value>;\n\nexport interface InitializeFromStorageOptions {\n datafileReader: DatafileReader;\n conditionsChecker: ConditionsChecker;\n modulesManager: ModulesManager;\n storageKeyPrefix: string;\n getEntityNames: () => string[];\n getEntity: (entityName: string) => Attribute | Effect | undefined;\n}\n\nexport interface FindPersistOptions {\n persists: ComplexPersist[];\n entityName: string;\n conditionsChecker: ConditionsChecker;\n payload: Value;\n}\n\nexport async function findPersist(\n options: FindPersistOptions,\n): Promise<ComplexPersist | undefined> {\n const { persists, entityName, conditionsChecker, payload } = options;\n\n for (const persist of persists) {\n if (!persist.conditions) {\n return persist;\n }\n\n const isMatched = await conditionsChecker.allAreMatched(persist.conditions, {\n attributeName: entityName,\n effectName: entityName,\n payload,\n });\n\n if (isMatched) {\n return persist;\n }\n }\n}\n\nexport async function initializeFromStorage({\n datafileReader,\n conditionsChecker,\n modulesManager,\n storageKeyPrefix,\n getEntityNames,\n getEntity,\n}: InitializeFromStorageOptions): Promise<EntityMap> {\n const entityNames = getEntityNames();\n const entityMap: EntityMap = {};\n\n for (const entityName of entityNames) {\n const schema = getEntity(entityName);\n\n if (!schema) {\n continue;\n }\n\n const persists = datafileReader.getPersists(schema);\n\n if (!persists) {\n continue;\n }\n\n const persist = await findPersist({ persists, entityName, conditionsChecker, payload: {} });\n\n if (!persist) {\n continue;\n }\n\n // read from storage\n const value = await modulesManager.readFromStorage(\n persist.storage,\n `${storageKeyPrefix}${entityName}`,\n );\n\n if (value !== null && value !== undefined) {\n entityMap[entityName] = value;\n }\n }\n\n return entityMap;\n}\n\nexport interface PersistEntityOptions {\n datafileReader: DatafileReader;\n conditionsChecker: ConditionsChecker;\n modulesManager: ModulesManager;\n storageKeyPrefix: string;\n entityName: string;\n entity: Attribute | Effect | undefined;\n value: Value;\n}\n\nexport async function persistEntity({\n datafileReader,\n conditionsChecker,\n modulesManager,\n storageKeyPrefix,\n entityName,\n entity,\n value,\n}: PersistEntityOptions) {\n if (!entity) {\n return;\n }\n\n const persists = datafileReader.getPersists(entity);\n\n if (!persists) {\n return;\n }\n\n const persist = await findPersist({ persists, entityName, conditionsChecker, payload: value });\n\n if (!persist) {\n return;\n }\n\n await modulesManager.writeToStorage(persist.storage, `${storageKeyPrefix}${entityName}`, value);\n}\n\nexport interface RemoveEntityOptions {\n datafileReader: DatafileReader;\n conditionsChecker: ConditionsChecker;\n modulesManager: ModulesManager;\n storageKeyPrefix: string;\n entityName: string;\n entity: Attribute | Effect | undefined;\n}\n\nexport async function removeEntity({\n datafileReader,\n conditionsChecker,\n modulesManager,\n storageKeyPrefix,\n entityName,\n entity,\n}: RemoveEntityOptions) {\n if (!entity) {\n return;\n }\n\n const persists = datafileReader.getPersists(entity);\n\n if (!persists) {\n return;\n }\n\n const persist = await findPersist({ persists, entityName, conditionsChecker, payload: {} });\n\n if (!persist) {\n return;\n }\n\n await modulesManager.removeFromStorage(persist.storage, `${storageKeyPrefix}${entityName}`);\n}\n","import type { AttributeName, Value } from \"@eventvisor/types\";\n\nimport type { GetDatafileReader } from \"./datafileReader\";\nimport type { GetConditionsChecker } from \"./conditions\";\nimport type { ModulesManager } from \"./modulesManager\";\nimport type { Emitter } from \"./emitter\";\nimport type { Logger } from \"./logger\";\nimport type { GetTransformer } from \"./transformer\";\nimport type { Validator } from \"./validator\";\nimport { initializeFromStorage, persistEntity, removeEntity } from \"./persister\";\n\nexport type AttributesMap = Record<AttributeName, Value>;\n\nexport interface AttributesManagerOptions {\n logger: Logger;\n emitter: Emitter;\n getDatafileReader: GetDatafileReader;\n getTransformer: GetTransformer;\n getConditionsChecker: GetConditionsChecker;\n validator: Validator;\n modulesManager: ModulesManager;\n}\n\nexport class AttributesManager {\n private logger: Logger;\n private getDatafileReader: GetDatafileReader;\n private emitter: Emitter;\n private getTransformer: GetTransformer;\n private getConditionsChecker: GetConditionsChecker;\n private validator: Validator;\n private modulesManager: ModulesManager;\n\n private attributesMap: AttributesMap;\n\n constructor(options: AttributesManagerOptions) {\n const {\n logger,\n getDatafileReader,\n emitter,\n getTransformer,\n getConditionsChecker,\n validator,\n modulesManager,\n } = options;\n\n this.logger = logger;\n this.getDatafileReader = getDatafileReader;\n this.emitter = emitter;\n this.getTransformer = getTransformer;\n this.getConditionsChecker = getConditionsChecker;\n this.validator = validator;\n this.modulesManager = modulesManager;\n\n // @TODO: initial attributes from SDK options\n this.attributesMap = {};\n }\n\n async initialize(): Promise<void> {\n // read form storage\n await this.initializeFromStorage();\n }\n\n private async initializeFromStorage(): Promise<void> {\n const datafileReader = this.getDatafileReader();\n\n const result = await initializeFromStorage({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"attributes_\",\n getEntityNames: () => datafileReader.getAttributeNames(),\n getEntity: (entityName: string) => datafileReader.getAttribute(entityName),\n });\n\n this.attributesMap = result;\n }\n\n async setAttribute(attributeName: AttributeName, value: Value): Promise<Value | null> {\n const datafileReader = this.getDatafileReader();\n\n /**\n * Find\n */\n const attributeSchema = datafileReader.getAttribute(attributeName);\n\n if (!attributeSchema) {\n this.logger.error(`Attribute schema not found`, {\n attributeName,\n });\n\n return null;\n }\n\n /**\n * Deprecated\n */\n if (attributeSchema.deprecated) {\n this.logger.warn(`Attribute is deprecated`, { attributeName });\n }\n\n /**\n * Validate\n */\n const validationResult = await this.validator.validate(attributeSchema, value);\n\n if (!validationResult.valid) {\n this.logger.warn(`Attribute validation failed`, {\n attributeName,\n errors: validationResult.errors,\n });\n\n return null;\n }\n\n const validatedValue = validationResult.value;\n\n /**\n * Transform\n */\n const transformedValue = attributeSchema.transforms\n ? await this.getTransformer().applyAll(validatedValue, attributeSchema.transforms, {\n payload: validatedValue,\n attributeName,\n })\n : validatedValue;\n\n /**\n * Set\n */\n this.attributesMap[attributeName] = transformedValue;\n\n this.emitter.trigger(\"attribute_set\", { attributeName });\n this.logger.debug(`Attribute set`, { attributeName });\n\n /**\n * Persist\n */\n await persistEntity({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"attributes_\",\n entityName: attributeName,\n entity: attributeSchema,\n value,\n });\n\n return transformedValue;\n }\n\n isAttributeSet(attributeName: AttributeName): boolean {\n return this.attributesMap[attributeName] !== undefined;\n }\n\n getAttributesMap(): AttributesMap {\n return this.attributesMap;\n }\n\n getAttributeValue(attributeName: AttributeName): Value | null {\n return this.attributesMap[attributeName] || null;\n }\n\n async removeAttribute(attributeName: AttributeName): Promise<void> {\n const datafileReader = this.getDatafileReader();\n\n await removeEntity({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"attributes_\",\n entityName: attributeName,\n entity: datafileReader.getAttribute(attributeName),\n });\n\n delete this.attributesMap[attributeName];\n\n this.emitter.trigger(\"attribute_removed\", {\n attributeName,\n });\n }\n}\n","import type {\n Value,\n Effect,\n Step,\n EventName,\n DestinationName,\n EffectName,\n EventLevel,\n} from \"@eventvisor/types\";\n\nimport type { Logger } from \"./logger\";\nimport type { DatafileReader } from \"./datafileReader\";\nimport type { SourceResolver } from \"./sourceResolver\";\n\nexport type ModuleName = string;\n\nexport interface LookupOptions {\n key: string;\n}\n\n// export interface TransformOptions {\n// key: string;\n// value: Value;\n// }\n\nexport interface HandleOptions {\n effectName: EffectName;\n effect: Effect;\n step: Step;\n payload: Value;\n}\n\nexport interface TransportOptions {\n destinationName: DestinationName;\n eventName: EventName;\n eventLevel?: EventLevel;\n payload: Value; // @TODO: rename to body?\n error?: Error;\n}\n\nexport interface ReadFromStorageOptions {\n key: string;\n}\n\nexport interface WriteToStorageOptions {\n key: string;\n value: Value;\n}\n\nexport interface RemoveFromStorageOptions {\n key: string;\n}\n\nexport interface ModuleDependencies {\n datafileReader: DatafileReader;\n logger: Logger;\n sourceResolver: SourceResolver; // @TODO: single resolveSource function?\n}\n\nexport interface Module {\n name: ModuleName;\n\n // initialize?\n\n lookup?: (options: LookupOptions, deps: ModuleDependencies) => Promise<Value>;\n\n // transform?: (options: TransformOptions, deps: ModuleDependencies) => Promise<Value>;\n\n handle?: (options: HandleOptions, deps: ModuleDependencies) => Promise<void>;\n\n transport?: (options: TransportOptions, deps: ModuleDependencies) => Promise<void>;\n\n readFromStorage?: (options: ReadFromStorageOptions, deps: ModuleDependencies) => Promise<Value>;\n writeToStorage?: (options: WriteToStorageOptions, deps: ModuleDependencies) => Promise<void>;\n removeFromStorage?: (\n options: RemoveFromStorageOptions,\n deps: ModuleDependencies,\n ) => Promise<void>;\n}\n\nexport interface ModulesManagerOptions {\n logger: Logger;\n getDatafileReader: () => DatafileReader;\n getSourceResolver: () => SourceResolver;\n}\n\nexport class ModulesManager {\n private logger: Logger;\n private getDatafileReader: () => DatafileReader;\n private getSourceResolver: () => SourceResolver;\n\n // @TODO: can be optimized further by keeping only array of names, but keeping actual modules in an object\n private modules: Module[];\n\n constructor(options: ModulesManagerOptions) {\n const { logger, getDatafileReader, getSourceResolver } = options;\n\n this.logger = logger;\n this.getDatafileReader = getDatafileReader;\n this.getSourceResolver = getSourceResolver;\n this.modules = [];\n }\n\n registerModule(module: Module) {\n if (this.modules.find((m) => m.name === module.name)) {\n this.logger.error(`Module ${module.name} already registered`);\n\n return;\n }\n\n this.modules.push(module);\n }\n\n getModule(name: string) {\n return this.modules.find((module) => module.name === name);\n }\n\n removeModule(name: string) {\n const module = this.getModule(name);\n\n if (!module) {\n this.logger.error(`Module ${name} not found`);\n\n return;\n }\n\n this.modules = this.modules.filter((module) => module.name !== name);\n }\n\n getModuleDependencies(): ModuleDependencies {\n return {\n datafileReader: this.getDatafileReader(),\n logger: this.logger,\n sourceResolver: this.getSourceResolver(),\n };\n }\n\n async lookup(fullKey: string): Promise<Value> {\n const [moduleName, ...keyParts] = fullKey.split(\".\");\n const key = keyParts.join(\".\");\n\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.lookup) {\n try {\n return await moduleInstance.lookup({ key }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in lookup`, { moduleName, key, error });\n\n return null;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"lookup\" function`);\n\n return null;\n }\n\n async handle(\n fullKey: string,\n effectName: EffectName,\n effect: Effect,\n step: Step,\n payload: Value,\n ): Promise<void> {\n const [moduleName, key] = fullKey.split(\".\"); // eslint-disable-line\n\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.handle) {\n try {\n return await moduleInstance.handle(\n { effectName, effect, step, payload },\n this.getModuleDependencies(),\n );\n } catch (error) {\n this.logger.error(`Error in handle`, { moduleName, effectName, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"handle\" function`);\n\n return;\n }\n\n transportExists(fullKey: string): boolean {\n const [moduleName, key] = fullKey.split(\".\"); // eslint-disable-line\n\n const moduleInstance = this.getModule(moduleName);\n\n return !!(moduleInstance && moduleInstance.transport);\n }\n\n // @TODO: change multiple args to single options object\n async transport(\n fullKey: string,\n destinationName: DestinationName,\n eventName: EventName,\n payload: Value,\n eventLevel?: EventLevel,\n error?: Error,\n ): Promise<void> {\n const [moduleName, key] = fullKey.split(\".\"); // eslint-disable-line\n\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.transport) {\n try {\n return await moduleInstance.transport(\n { destinationName, eventName, eventLevel, payload, error },\n this.getModuleDependencies(),\n );\n } catch (error) {\n this.logger.error(`Error in transport`, { moduleName, destinationName, eventName, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"transport\" function`);\n }\n\n async readFromStorage(moduleName: ModuleName, key: string): Promise<Value> {\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.readFromStorage) {\n try {\n return await moduleInstance.readFromStorage({ key }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in readFromStorage`, { moduleName, key, error });\n\n return null;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"readFromStorage\" function`);\n\n return null;\n }\n\n async writeToStorage(moduleName: ModuleName, key: string, value: Value): Promise<void> {\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.writeToStorage) {\n try {\n return await moduleInstance.writeToStorage({ key, value }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in writeToStorage`, { moduleName, key, value, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"writeToStorage\" function`);\n\n return;\n }\n\n async removeFromStorage(moduleName: ModuleName, key: string): Promise<void> {\n const moduleInstance = this.getModule(moduleName);\n\n if (moduleInstance && moduleInstance.removeFromStorage) {\n try {\n return await moduleInstance.removeFromStorage({ key }, this.getModuleDependencies());\n } catch (error) {\n this.logger.error(`Error in removeFromStorage`, { moduleName, key, error });\n\n return;\n }\n }\n\n this.logger.error(`Module \"${moduleName}\" not found with \"removeFromStorage\" function`);\n\n return;\n }\n}\n","import type { Source, SourceBase, Value, Inputs } from \"@eventvisor/types\";\n\nimport type { ModulesManager } from \"./modulesManager\";\nimport type { Logger } from \"./logger\";\nimport type { AttributesManager } from \"./attributesManager\";\nimport type { EffectsManager } from \"./effectsManager\";\n\nexport type GetSourceResolver = () => SourceResolver;\n\nconst SOURCE_PATH_SEPARATOR = \".\";\n\nexport interface SourceResolverOptions {\n logger: Logger;\n modulesManager: ModulesManager;\n attributesManager: AttributesManager;\n effectsManager: EffectsManager;\n}\n\nexport interface SourcePath {\n name: string;\n path: string[]; // dot-separated path after the name\n fullKey: string;\n}\n\nexport type SourceOrigin = SourcePath & {\n originType: \"attribute\" | \"attributes\" | \"effect\" | \"payload\" | \"lookup\" | string;\n};\n\nfunction findValueAtPath(obj: any, path: string[]): any {\n return path.reduce((acc, part) => acc[part], obj);\n}\n\n// @TODO: redo it with a better approach\nexport class SourceResolver {\n private logger: Logger;\n\n private modulesManager: ModulesManager;\n private attributesManager: AttributesManager;\n private effectsManager: EffectsManager;\n\n constructor(options: SourceResolverOptions) {\n const { logger, modulesManager, attributesManager, effectsManager } = options;\n\n this.logger = logger;\n this.modulesManager = modulesManager;\n this.attributesManager = attributesManager;\n this.effectsManager = effectsManager;\n }\n\n getPath(p: string): SourcePath {\n const parts = p.split(SOURCE_PATH_SEPARATOR);\n\n return {\n name: parts[0],\n path: parts.slice(1),\n fullKey: p,\n };\n }\n\n getOrigin(source: Source | Partial<SourceBase>): SourceOrigin | SourceOrigin[] | null {\n if (typeof source === \"string\") {\n const parts = source.split(SOURCE_PATH_SEPARATOR);\n const originType = parts[0] as SourceOrigin[\"originType\"];\n\n // @TODO: validate type as one of known types\n\n return {\n originType,\n name: parts[1],\n path: parts.slice(2),\n fullKey: source,\n };\n }\n\n // @TODO: fix it better\n if (\"source\" in source) {\n return this.getOrigin(source.source as string);\n }\n\n if (\"source\" in source) {\n return this.getOrigin(source.source as string);\n }\n\n if (\"attribute\" in source) {\n return {\n originType: \"attribute\",\n ...this.getPath(source.attribute as string), // @TODO: consider array of strings here\n };\n }\n\n if (\"effect\" in source) {\n return {\n originType: \"effect\",\n ...this.getPath(source.effect as string),\n };\n }\n\n if (\"payload\" in source) {\n if (Array.isArray(source.payload)) {\n return source.payload.map((p) => ({\n originType: \"payload\",\n ...this.getPath(p as string),\n }));\n } else {\n return {\n originType: \"payload\",\n ...this.getPath(source.payload as string),\n };\n }\n }\n\n if (\"lookup\" in source) {\n return {\n originType: \"lookup\",\n ...this.getPath(source.lookup as string),\n };\n }\n\n if (\"state\" in source) {\n return {\n originType: \"state\",\n ...this.getPath(source.state as string),\n };\n }\n\n return null;\n }\n\n async resolveByOrigin(origin: SourceOrigin | null, inputs: Inputs = {}): Promise<Value> {\n if (origin === null) {\n return null;\n }\n\n if (origin.originType === \"attributes\") {\n const result = origin.name\n ? this.attributesManager.getAttributeValue(origin.name)\n : this.attributesManager.getAttributesMap();\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"attribute\") {\n const result = this.attributesManager.getAttributeValue(origin.name);\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"effects\") {\n const result = origin.name\n ? this.effectsManager.getStateValue(origin.name)\n : this.effectsManager.getAllStates();\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"effect\") {\n const result = this.effectsManager.getStateValue(origin.name);\n\n if (origin.path.length > 0) {\n return findValueAtPath(result, origin.path);\n }\n\n return result;\n }\n\n if (origin.originType === \"lookup\") {\n return this.modulesManager.lookup(origin.fullKey);\n }\n\n // if (origin.originType === \"payload\" && inputs.payload) {\n // return findValueAtPath(inputs.payload, [...origin.path, ...[origin.name]]); // @TODO: make it better\n // }\n\n // if (origin.originType === \"attributes\" && inputs.attributes) {\n // const p = [...origin.path, ...[origin.name]].filter(Boolean);\n // return findValueAtPath(inputs[\"attributes\"], p); // @TODO: make it better\n // }\n\n // handle any other input that is not known early\n if (typeof inputs[origin.originType] !== \"undefined\") {\n return findValueAtPath(\n inputs[origin.originType],\n [...[origin.name, ...origin.path]].filter(Boolean),\n ); // @TODO: make it better\n }\n\n return null;\n }\n\n async resolve(source: Source | Partial<SourceBase>, inputs: Inputs = {}): Promise<Value> {\n const origin = this.getOrigin(source);\n\n if (Array.isArray(origin)) {\n return Promise.all(origin.map((o) => this.resolveByOrigin(o, inputs)));\n }\n\n const result = await this.resolveByOrigin(origin, inputs);\n\n return result;\n }\n}\n","// taken from: https://github.com/omichelsen/compare-versions\n// this is done to avoid loading the whole package\n\n/*\nThe MIT License (MIT)\n\nCopyright (c) 2015-2021 Ole Michelsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */\n\nexport const semver =\n /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\n\nexport const validateAndParse = (version: string) => {\n if (typeof version !== \"string\") {\n throw new TypeError(\"Invalid argument expected string\");\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\n\nconst isWildcard = (s: string) => s === \"*\" || s === \"x\" || s === \"X\";\n\nconst forceType = (a: string | number, b: string | number) =>\n typeof a !== typeof b ? [String(a), String(b)] : [a, b];\n\nconst tryParse = (v: string) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\n\nconst compareStrings = (a: string, b: string) => {\n if (isWildcard(a) || isWildcard(b)) return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp) return 1;\n if (ap < bp) return -1;\n return 0;\n};\n\nexport const compareSegments = (\n a: string | string[] | RegExpMatchArray,\n b: string | string[] | RegExpMatchArray,\n) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || \"0\", b[i] || \"0\");\n if (r !== 0) return r;\n }\n return 0;\n};\n\nexport const compareVersions = (v1: string, v2: string) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0) return r;\n\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split(\".\"), p2.split(\".\"));\n } else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n\n return 0;\n};\n","import type { PlainCondition, Condition, Inputs } from \"@eventvisor/types\";\n\nimport type { GetRegex } from \"./datafileReader\";\nimport type { SourceResolver } from \"./sourceResolver\";\n\nimport { compareVersions } from \"./compareVersions\";\nimport { Logger } from \"./logger\";\n\nexport type GetConditionsChecker = () => ConditionsChecker;\n\nexport interface ConditionsCheckerOptions {\n getRegex: GetRegex;\n sourceResolver: SourceResolver;\n logger: Logger;\n}\n\nexport class ConditionsChecker {\n private getRegex: GetRegex;\n private sourceResolver: SourceResolver;\n private logger: Logger;\n\n constructor(options: ConditionsCheckerOptions) {\n this.getRegex = options.getRegex;\n this.sourceResolver = options.sourceResolver;\n this.logger = options.logger;\n }\n\n async isMatched(condition: PlainCondition, inputs: Inputs): Promise<boolean> {\n const { operator, value, regexFlags } = condition;\n\n const sourceValue = await this.sourceResolver.resolve(condition, inputs);\n\n if (operator === \"equals\") {\n return sourceValue === value;\n } else if (operator === \"notEquals\") {\n return sourceValue !== value;\n } else if (operator === \"before\" || operator === \"after\") {\n // date comparisons\n const valueInContext = sourceValue as string | Date;\n\n const dateInContext =\n valueInContext instanceof Date ? valueInContext : new Date(valueInContext);\n const dateInCondition = value instanceof Date ? value : new Date(value as string);\n\n return operator === \"before\"\n ? dateInContext < dateInCondition\n : dateInContext > dateInCondition;\n } else if (\n Array.isArray(value) &&\n ([\"string\", \"number\"].indexOf(typeof sourceValue) !== -1 || sourceValue === null)\n ) {\n // in / notIn (where condition value is an array)\n const valueInContext = sourceValue as string;\n\n if (operator === \"in\") {\n return value.indexOf(valueInContext) !== -1;\n } else if (operator === \"notIn\") {\n return value.indexOf(valueInContext) === -1;\n }\n } else if (typeof sourceValue === \"string\" && typeof value === \"string\") {\n // string\n const valueInContext = sourceValue as string;\n\n if (operator === \"contains\") {\n return valueInContext.indexOf(value) !== -1;\n } else if (operator === \"notContains\") {\n return valueInContext.indexOf(value) === -1;\n } else if (operator === \"startsWith\") {\n return valueInContext.startsWith(value);\n } else if (operator === \"endsWith\") {\n return valueInContext.endsWith(value);\n } else if (operator === \"semverEquals\") {\n return compareVersions(valueInContext, value) === 0;\n } else if (operator === \"semverNotEquals\") {\n return compareVersions(valueInContext, value) !== 0;\n } else if (operator === \"semverGreaterThan\") {\n return compareVersions(valueInContext, value) === 1;\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return compareVersions(valueInContext, value) >= 0;\n } else if (operator === \"semverLessThan\") {\n return compareVersions(valueInContext, value) === -1;\n } else if (operator === \"semverLessThanOrEquals\") {\n return compareVersions(valueInContext, value) <= 0;\n } else if (operator === \"matches\") {\n const regex = this.getRegex(value, regexFlags || \"\");\n return regex.test(valueInContext);\n } else if (operator === \"notMatches\") {\n const regex = this.getRegex(value, regexFlags || \"\");\n return !regex.test(valueInContext);\n }\n } else if (typeof sourceValue === \"number\" && typeof value === \"number\") {\n // numeric\n const valueInContext = sourceValue as number;\n\n if (operator === \"greaterThan\") {\n return valueInContext > value;\n } else if (operator === \"greaterThanOrEquals\") {\n return valueInContext >= value;\n } else if (operator === \"lessThan\") {\n return valueInContext < value;\n } else if (operator === \"lessThanOrEquals\") {\n return valueInContext <= value;\n }\n } else if (operator === \"exists\") {\n // @TODO: may require extra care for null values\n return typeof sourceValue !== \"undefined\";\n } else if (operator === \"notExists\") {\n return typeof sourceValue === \"undefined\";\n } else if (Array.isArray(sourceValue) && typeof value === \"string\") {\n // includes / notIncludes (where context value is an array)\n const valueInContext = sourceValue as string[];\n\n if (operator === \"includes\") {\n return valueInContext.indexOf(value) > -1;\n } else if (operator === \"notIncludes\") {\n return valueInContext.indexOf(value) === -1;\n }\n }\n\n return false;\n }\n\n private async _allAreMatched(\n conditions: Condition[] | Condition,\n inputs: Inputs,\n ): Promise<boolean> {\n if (typeof conditions === \"string\") {\n if (conditions === \"*\") {\n return true;\n }\n\n return false;\n }\n\n if (\"operator\" in conditions) {\n try {\n return this.isMatched(conditions, inputs);\n } catch (e) {\n this.logger.warn(e.message, {\n error: e,\n details: {\n condition: conditions,\n },\n });\n\n return false;\n }\n }\n\n if (\"and\" in conditions && Array.isArray(conditions.and)) {\n for (const c of conditions.and) {\n if (!(await this._allAreMatched(c, inputs))) {\n return false; // If any condition fails, return false\n }\n }\n return true; // All conditions passed\n }\n\n if (\"or\" in conditions && Array.isArray(conditions.or)) {\n for (const c of conditions.or) {\n if (await this._allAreMatched(c, inputs)) {\n return true; // If any condition passes, return true\n }\n }\n return false; // No conditions passed\n }\n\n if (\"not\" in conditions && Array.isArray(conditions.not)) {\n for (const c of conditions.not) {\n if (await this._allAreMatched(c, inputs)) {\n return false; // If any condition passes, return false (since this is NOT)\n }\n }\n return true; // No conditions passed, which is what we want for NOT\n }\n\n if (Array.isArray(conditions)) {\n let result = true;\n for (const c of conditions) {\n if (!(await this._allAreMatched(c, inputs))) {\n result = false;\n break;\n }\n }\n\n return result;\n }\n\n return false;\n }\n\n async allAreMatched(conditions: Condition[] | Condition, inputs: Inputs): Promise<boolean> {\n const parsedConditions = this.parseIfStringified(conditions);\n\n const result = this._allAreMatched(parsedConditions, inputs);\n\n return result;\n }\n\n parseIfStringified(conditions: Condition | Condition[]): Condition | Condition[] {\n if (typeof conditions !== \"string\") {\n // already parsed\n return conditions;\n }\n\n if (conditions === \"*\") {\n // everyone\n return conditions;\n }\n\n try {\n return JSON.parse(conditions);\n } catch (e) {\n this.logger.error(\"Error parsing conditions\", {\n error: e,\n details: {\n conditions,\n },\n });\n\n return conditions;\n }\n }\n}\n","// v3 function taken from: https://github.com/perezd/node-murmurhash\n// this has been done to avoid loading v2 function which is not used in the SDK\n\n/**\n * Copyright (c) 2020 Gary Court, Derek Perez\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nconst createBuffer = (val) => new TextEncoder().encode(val);\n\nexport function MurmurHashV3(key, seed) {\n if (typeof key === \"string\") key = createBuffer(key);\n\n let remainder, bytes, h1, h1b, c1, c2, k1, i;\n\n remainder = key.length & 3; // key.length % 4\n bytes = key.length - remainder;\n h1 = seed;\n c1 = 0xcc9e2d51;\n c2 = 0x1b873593;\n i = 0;\n\n while (i < bytes) {\n k1 =\n (key[i] & 0xff) |\n ((key[++i] & 0xff) << 8) |\n ((key[++i] & 0xff) << 16) |\n ((key[++i] & 0xff) << 24);\n ++i;\n\n k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff;\n h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16);\n }\n\n k1 = 0;\n\n switch (remainder) {\n case 3:\n k1 ^= (key[i + 2] & 0xff) << 16;\n case 2:\n k1 ^= (key[i + 1] & 0xff) << 8;\n case 1:\n k1 ^= key[i] & 0xff;\n\n k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n}\n","import type { Sample, SampleBy, Inputs } from \"@eventvisor/types\";\n\nimport type { Logger } from \"./logger\";\nimport { MurmurHashV3 } from \"./murmurhash\";\nimport type { SourceResolver } from \"./sourceResolver\";\nimport type { ConditionsChecker } from \"./conditions\";\nimport type { Transformer } from \"./transformer\";\n\nexport type BucketKey = string;\nexport type BucketValue = number; // 0 to 100,000 (100% * 1000 to include three decimal places in same integer)\n\n/**\n * Generic hashing\n */\nconst HASH_SEED = 1;\nconst MAX_HASH_VALUE = Math.pow(2, 32);\n\nexport const MAX_BUCKETED_NUMBER = 100000; // 100% * 1000 to include three decimal places in the same integer value\n\nexport function getBucketedNumber(bucketKey: string): BucketValue {\n const hashValue = MurmurHashV3(bucketKey, HASH_SEED);\n const ratio = hashValue / MAX_HASH_VALUE;\n\n return Math.floor(ratio * MAX_BUCKETED_NUMBER);\n}\n\n/**\n * Bucket key\n */\nconst DEFAULT_BUCKET_KEY_SEPARATOR = \".\";\n\nexport class BucketerOptions {\n logger: Logger;\n sourceResolver: SourceResolver;\n conditionsChecker: ConditionsChecker;\n transformer: Transformer;\n}\n\nexport interface SampleResult {\n isSampled: boolean;\n matchedSample?: Sample;\n bucketedNumber?: number;\n bucketKey?: BucketKey;\n}\n\nexport class Bucketer {\n private logger: Logger;\n private sourceResolver: SourceResolver;\n private conditionsChecker: ConditionsChecker;\n private transformer: Transformer;\n\n constructor(options: BucketerOptions) {\n this.logger = options.logger;\n this.sourceResolver = options.sourceResolver;\n this.conditionsChecker = options.conditionsChecker;\n this.transformer = options.transformer;\n }\n\n async getBucketKey(sampleBy: SampleBy, inputs: Inputs): Promise<BucketKey> {\n let type;\n let sources;\n\n if (typeof sampleBy === \"string\") {\n type = \"plain\";\n sources = [sampleBy];\n } else if (Array.isArray(sampleBy)) {\n type = \"and\";\n sources = sampleBy;\n } else if (typeof sampleBy === \"object\" && \"or\" in sampleBy && Array.isArray(sampleBy.or)) {\n type = \"or\";\n sources = sampleBy.or;\n } else if (typeof sampleBy === \"object\") {\n type = \"and\";\n sources = [sampleBy];\n } else {\n this.logger.error(\"invalid sampleBy\", { sampleBy });\n\n throw new Error(\"invalid sampleBy\");\n }\n\n const bucketKey: string[] = [];\n\n for (const source of sources) {\n const sourceValue = await this.sourceResolver.resolve(source, inputs);\n\n if (typeof sourceValue === \"undefined\") {\n continue;\n }\n\n if (type === \"plain\" || type === \"and\") {\n bucketKey.push(String(sourceValue));\n } else {\n // or\n if (bucketKey.length === 0) {\n bucketKey.push(String(sourceValue));\n }\n }\n }\n\n return bucketKey.join(DEFAULT_BUCKET_KEY_SEPARATOR);\n }\n\n async isSampled(sample: Sample | Sample[], inputs: Inputs): Promise<SampleResult> {\n const samples = Array.isArray(sample) ? sample : [sample];\n\n const matchedSample = samples.find(async (sample) => {\n if (!sample.conditions) {\n return true;\n }\n\n const isMatched = await this.conditionsChecker.allAreMatched(sample.conditions, inputs);\n\n return isMatched;\n });\n\n if (matchedSample) {\n const bucketKey = await this.getBucketKey(matchedSample.by, inputs);\n\n const bucketedNumber = getBucketedNumber(bucketKey);\n\n if (\n matchedSample.percentage &&\n matchedSample.percentage > 0 &&\n bucketedNumber < matchedSample.percentage\n ) {\n return {\n isSampled: false,\n matchedSample,\n bucketedNumber,\n bucketKey,\n };\n }\n\n if (\n matchedSample.range &&\n bucketedNumber < matchedSample.range[0] &&\n bucketedNumber > matchedSample.range[1]\n ) {\n return {\n isSampled: false,\n matchedSample,\n bucketedNumber,\n bucketKey,\n };\n }\n }\n\n return {\n isSampled: true,\n };\n }\n}\n","import type { Value, Transform, Inputs } from \"@eventvisor/types\";\n\nimport type { Logger } from \"./logger\";\nimport type { ConditionsChecker } from \"./conditions\";\nimport type { SourceResolver } from \"./sourceResolver\";\n\nexport type GetTransformer = () => Transformer;\n\nexport interface TransformerOptions {\n logger: Logger;\n conditionsChecker: ConditionsChecker;\n sourceResolver: SourceResolver;\n}\n\nexport class Transformer {\n private logger: Logger;\n private conditionsChecker: ConditionsChecker;\n private sourceResolver: SourceResolver;\n\n constructor(options: TransformerOptions) {\n this.logger = options.logger;\n this.conditionsChecker = options.conditionsChecker;\n this.sourceResolver = options.sourceResolver;\n }\n\n async applyAll(value: Value, transforms: Transform[], inputs: Inputs = {}): Promise<Value> {\n let result = value;\n\n for (const transform of transforms) {\n /**\n * Conditions\n */\n if (transform.conditions) {\n const conditionMatched = await this.conditionsChecker.allAreMatched(\n transform.conditions,\n inputs,\n );\n\n if (!conditionMatched) {\n continue;\n }\n }\n\n /**\n * Source value\n */\n let sourceValue = await this.sourceResolver.resolve(transform, inputs);\n\n // when Transform has no source, but only target\n if (sourceValue === null || sourceValue === undefined) {\n if (transform.target) {\n sourceValue = await this.sourceResolver.resolve(\n {\n payload: transform.target,\n },\n typeof inputs.payload === \"undefined\"\n ? {\n ...inputs,\n payload: value,\n }\n : inputs,\n );\n }\n }\n\n /**\n * Transform value\n */\n // plain target\n if (transform.target) {\n // @TODO: target is always single string. tidy it up\n const targets = Array.isArray(transform.target) ? transform.target : [transform.target];\n\n for (const target of targets) {\n // @TODO: use if/elseif below later\n\n // string only\n if (typeof sourceValue === \"string\") {\n if (transform.type === \"trim\") {\n result = Transformer.setValueAtPath(result, target, sourceValue.trim());\n }\n }\n\n // array only\n if (Array.isArray(sourceValue)) {\n if (transform.type === \"concat\") {\n const separator = transform.separator || \" \";\n result = Transformer.setValueAtPath(result, target, sourceValue.join(separator));\n }\n }\n\n // others\n if (transform.type === \"set\") {\n if (\"value\" in transform) {\n result = Transformer.setValueAtPath(result, target, transform.value);\n } else {\n result = Transformer.setValueAtPath(result, target, sourceValue);\n }\n }\n\n if (transform.type === \"remove\") {\n result = Transformer.removeValueAt(result, target);\n }\n\n // to other types\n if (transform.type === \"toInteger\") {\n result = Transformer.setValueAtPath(result, target, parseInt(String(sourceValue)));\n } else if (transform.type === \"toDouble\") {\n result = Transformer.setValueAtPath(result, target, parseFloat(String(sourceValue)));\n } else if (transform.type === \"toString\") {\n result = Transformer.setValueAtPath(result, target, String(sourceValue) || \"\");\n } else if (transform.type === \"toBoolean\") {\n const lowerCasedValue = String(sourceValue).toLowerCase();\n\n result = Transformer.setValueAtPath(\n result,\n target,\n [\"true\", \"1\", \"checked\", \"yes\", \"on\", \"y\"].indexOf(lowerCasedValue) !== -1 ||\n sourceValue === true,\n );\n }\n }\n } else {\n // without target (meaning, self)\n\n // set\n if (transform.type === \"set\") {\n if (\"value\" in transform) {\n result = transform.value;\n }\n }\n }\n\n if (transform.type === \"spread\") {\n if (transform.target) {\n const currentTargetValue = Transformer.getValueAtPath(result, transform.target);\n result = Transformer.setValueAtPath(result, transform.target, {\n ...((currentTargetValue as object) || {}),\n ...((sourceValue as object) || {}),\n });\n } else {\n result = {\n ...((result as object) || {}),\n ...((sourceValue as object) || {}),\n };\n }\n }\n\n // mathematical\n if (transform.type === \"increment\") {\n const by = typeof transform.value === \"number\" ? transform.value : 1;\n\n if (transform.target) {\n result = Transformer.setValueAtPath(result, transform.target, Number(sourceValue) + by);\n } else {\n result = (result as number) + by;\n }\n } else if (transform.type === \"decrement\") {\n const by = typeof transform.value === \"number\" ? transform.value : 1;\n\n if (transform.target) {\n result = Transformer.setValueAtPath(result, transform.target, Number(sourceValue) - by);\n } else {\n result = (result as number) - by;\n }\n }\n\n // target map\n if (transform.targetMap) {\n const targetMaps: Record<string, string>[] = [];\n\n // @TODO: tidy it up\n if (Array.isArray(transform.targetMap)) {\n for (const targetMap of transform.targetMap) {\n Object.entries(targetMap).forEach(([key, value]) => {\n targetMaps.push({ [key]: value });\n });\n }\n } else {\n Object.entries(transform.targetMap).forEach(([key, value]) => {\n targetMaps.push({ [key]: value });\n });\n }\n\n for (const targetMap of targetMaps) {\n // rename\n if (transform.type === \"rename\") {\n result = Transformer.renameValueAt(result, targetMap as Record<string, string>);\n }\n }\n }\n }\n\n return result;\n }\n\n // Helper function to rename value at path\n public static renameValueAt(obj: any, target: Record<string, string>): any {\n if (!obj || typeof obj !== \"object\") return obj;\n if (!target || typeof target !== \"object\") return obj;\n\n const entries = Object.entries(target);\n if (entries.length === 0) return obj;\n\n const [oldKey, newKey] = entries[0];\n if (!oldKey || !newKey) return obj;\n\n // Get the value at old path\n const oldValue = Transformer.getValueAtPath(obj, oldKey);\n if (oldValue === undefined) return obj;\n\n // Create a copy to avoid mutating the original\n const result = JSON.parse(JSON.stringify(obj));\n\n // Remove old property\n const oldKeys = oldKey.split(\".\");\n let current = result;\n\n // Navigate to parent of old property\n for (let i = 0; i < oldKeys.length - 1; i++) {\n const key = oldKeys[i];\n if (current[key] === undefined) return result;\n current = current[key];\n }\n\n // Remove old property\n delete current[oldKeys[oldKeys.length - 1]];\n\n // Set at new path\n return Transformer.setValueAtPath(result, newKey, oldValue);\n }\n\n // Helper function to get value at path\n public static getValueAtPath(obj: any, path: string): any {\n if (!path || typeof path !== \"string\") return undefined;\n\n const keys = path.split(\".\");\n let current = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined) return undefined;\n if (typeof current === \"object\" && !Array.isArray(current)) {\n current = (current as any)[key];\n } else if (Array.isArray(current) && /^\\d+$/.test(key)) {\n current = current[parseInt(key)];\n } else {\n return undefined;\n }\n }\n\n return current;\n }\n\n // Helper function to set value at path\n public static setValueAtPath(obj: any, path: string, value: any): any {\n if (!path || typeof path !== \"string\") return obj;\n if (obj === null || obj === undefined) return obj;\n\n // Create a copy to avoid mutating the original\n const result = JSON.parse(JSON.stringify(obj));\n const keys = path.split(\".\");\n let current = result as any;\n\n // Navigate to the parent of the target path\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (current[key] === undefined) {\n // Create nested object or array as needed\n if (/^\\d+$/.test(keys[i + 1])) {\n current[key] = [];\n } else {\n current[key] = {};\n }\n }\n current = current[key];\n }\n\n // Set the final value\n const finalKey = keys[keys.length - 1];\n current[finalKey] = value;\n\n return result;\n }\n\n // Helper function to remove value at path\n public static removeValueAt(obj: any, path: string): any {\n if (!path || typeof path !== \"string\") return obj;\n if (obj === null || obj === undefined) return obj;\n\n // Create a copy to avoid mutating the original\n const result = JSON.parse(JSON.stringify(obj));\n const keys = path.split(\".\");\n let current = result as any;\n\n // Navigate to the parent of the target path\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (current[key] === undefined) {\n return result; // Path doesn't exist, nothing to remove\n }\n current = current[key];\n }\n\n // Remove the property\n const finalKey = keys[keys.length - 1];\n if (Array.isArray(current)) {\n if (/^\\d+$/.test(finalKey)) {\n current.splice(parseInt(finalKey), 1);\n }\n } else if (typeof current === \"object\" && current !== null) {\n delete current[finalKey];\n }\n\n return result;\n }\n}\n","import { JSONSchema, Value } from \"@eventvisor/types\";\n\nimport type { GetSourceResolver } from \"./sourceResolver\";\nimport type { Logger } from \"./logger\";\n\nexport interface ValidatorOptions {\n logger: Logger;\n getSourceResolver: GetSourceResolver;\n}\n\nexport class Validator {\n private logger: Logger;\n private getSourceResolver: GetSourceResolver;\n\n constructor(options: ValidatorOptions) {\n this.logger = options.logger;\n this.getSourceResolver = options.getSourceResolver;\n }\n\n validate(schema: JSONSchema, value: Value): Promise<ValidationResult> {\n const deps: ValidationDependencies = {};\n\n return validate(schema, value, deps);\n }\n}\n\nexport interface ValidationError {\n path: string;\n message: string;\n schema?: JSONSchema;\n value?: Value;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors?: ValidationError[];\n value?: Value;\n}\n\nexport interface ValidationDependencies {\n [key: string]: any;\n}\n\nexport async function validate(\n schema: JSONSchema,\n value: Value,\n deps: ValidationDependencies,\n): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const result = validateValue(schema, value, \"\", errors, deps);\n\n // Only apply default if there are no validation errors and result is undefined\n if (result === undefined && errors.length === 0 && schema.default !== undefined) {\n return {\n valid: true,\n value: schema.default,\n errors: [],\n };\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n value: result,\n };\n}\n\nfunction validateValue(\n schema: JSONSchema,\n value: Value,\n path: string,\n errors: ValidationError[],\n deps: ValidationDependencies,\n): Value | undefined {\n // Handle null values\n if (value === null) {\n if ((schema.type as any) === \"null\" || schema.enum?.includes(null)) {\n return value;\n }\n if (schema.type && (schema.type as any) !== \"null\") {\n errors.push({\n path,\n message: `Expected type ${schema.type}, got null`,\n schema,\n value,\n });\n return undefined;\n }\n }\n\n // Handle undefined values\n if (value === undefined) {\n if (schema.default !== undefined) {\n return schema.default;\n }\n if (schema.type) {\n errors.push({\n path,\n message: `Required field missing`,\n schema,\n value,\n });\n return undefined;\n }\n return undefined;\n }\n\n // Type validation (but allow number for integer type to handle specific validation)\n if (schema.type && schema.type !== \"integer\") {\n const typeValid = validateType(schema.type, value);\n if (!typeValid) {\n errors.push({\n path,\n message: `Expected type ${schema.type}, got ${typeof value}`,\n schema,\n value,\n });\n return undefined;\n }\n }\n\n // Const validation\n if (schema.const !== undefined && value !== schema.const) {\n errors.push({\n path,\n message: `Value must be exactly ${JSON.stringify(schema.const)}`,\n schema,\n value,\n });\n return undefined;\n }\n\n // Enum validation\n if (schema.enum && !schema.enum.includes(value)) {\n errors.push({\n path,\n message: `Value must be one of: ${schema.enum.map((v) => JSON.stringify(v)).join(\", \")}`,\n schema,\n value,\n });\n return undefined;\n }\n\n let result = value;\n\n // Object validation\n if (typeof value === \"object\" && !Array.isArray(value) && schema.properties) {\n // Handle JavaScript Error objects specially\n let obj: Record<string, Value>;\n if (value instanceof Error) {\n obj = {\n name: value.name,\n message: value.message,\n stack: value.stack,\n ...(value as any), // Include any additional properties\n };\n } else {\n obj = value as Record<string, Value>;\n }\n const validatedObj: Record<string, Value> = {};\n\n // Validate required properties\n if (schema.required) {\n for (const requiredProp of schema.required) {\n if (!(requiredProp in obj)) {\n if (schema.properties[requiredProp]?.default !== undefined) {\n validatedObj[requiredProp] = schema.properties[requiredProp].default!;\n } else {\n errors.push({\n path: path ? `${path}.${requiredProp}` : requiredProp,\n message: `Required property '${requiredProp}' is missing`,\n schema: schema.properties[requiredProp],\n value: undefined,\n });\n }\n }\n }\n }\n\n // Validate all properties\n for (const [prop, propValue] of Object.entries(obj)) {\n if (schema.properties && schema.properties[prop]) {\n const propSchema = schema.properties[prop];\n const propPath = path ? `${path}.${prop}` : prop;\n const validatedProp = validateValue(propSchema, propValue, propPath, errors, deps);\n if (validatedProp !== undefined) {\n validatedObj[prop] = validatedProp;\n }\n } else {\n // Allow additional properties by default (JSON Schema behavior)\n validatedObj[prop] = propValue;\n }\n }\n\n // Apply defaults for missing optional properties\n if (schema.properties) {\n for (const [prop, propSchema] of Object.entries(schema.properties)) {\n if (!(prop in validatedObj) && propSchema.default !== undefined) {\n validatedObj[prop] = propSchema.default;\n }\n }\n }\n\n result = validatedObj;\n }\n\n // Array validation\n if (Array.isArray(value)) {\n // Array length validation - check before processing items\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n errors.push({\n path,\n message: `Array must have at least ${schema.minItems} items, got ${value.length}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n errors.push({\n path,\n message: `Array must have at most ${schema.maxItems} items, got ${value.length}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.items) {\n const validatedArray: Value[] = [];\n\n if (Array.isArray(schema.items)) {\n // Tuple validation\n for (let i = 0; i < value.length; i++) {\n const itemSchema = schema.items[i];\n if (itemSchema) {\n const itemPath = `${path}[${i}]`;\n const validatedItem = validateValue(itemSchema, value[i], itemPath, errors, deps);\n if (validatedItem !== undefined) {\n validatedArray.push(validatedItem);\n }\n } else {\n validatedArray.push(value[i]);\n }\n }\n } else {\n // Single schema for all items\n for (let i = 0; i < value.length; i++) {\n const itemPath = `${path}[${i}]`;\n const validatedItem = validateValue(schema.items, value[i], itemPath, errors, deps);\n if (validatedItem !== undefined) {\n validatedArray.push(validatedItem);\n }\n }\n }\n\n result = validatedArray;\n } else {\n result = value;\n }\n }\n\n // String validation\n if (typeof value === \"string\") {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n errors.push({\n path,\n message: `String must be at least ${schema.minLength} characters long`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n errors.push({\n path,\n message: `String must be at most ${schema.maxLength} characters long`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.pattern) {\n const regex = new RegExp(schema.pattern);\n if (!regex.test(value)) {\n errors.push({\n path,\n message: `String must match pattern: ${schema.pattern}`,\n schema,\n value,\n });\n return undefined;\n }\n }\n }\n\n // Number validation\n if (typeof value === \"number\") {\n if (schema.minimum !== undefined && value < schema.minimum) {\n errors.push({\n path,\n message: `Number must be at least ${schema.minimum}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.maximum !== undefined && value > schema.maximum) {\n errors.push({\n path,\n message: `Number must be at most ${schema.maximum}`,\n schema,\n value,\n });\n return undefined;\n }\n\n if (schema.type === \"integer\" && !Number.isInteger(value)) {\n errors.push({\n path,\n message: \"Number must be an integer\",\n schema,\n value,\n });\n return undefined;\n }\n }\n\n // Integer type validation (after number validation)\n if (schema.type === \"integer\" && typeof value !== \"number\") {\n errors.push({\n path,\n message: `Expected type integer, got ${typeof value}`,\n schema,\n value,\n });\n return undefined;\n }\n\n return result;\n}\n\nfunction validateType(expectedType: string, value: Value): boolean {\n switch (expectedType) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\";\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"null\":\n return value === null;\n case \"object\":\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n case \"array\":\n return Array.isArray(value);\n default:\n return true; // Unknown type, assume valid\n }\n}\n","import type { EventName, AttributeName, EffectName, Value, EffectOnType } from \"@eventvisor/types\";\n\nimport type { GetDatafileReader } from \"./datafileReader\";\nimport type { Logger } from \"./logger\";\nimport type { GetTransformer } from \"./transformer\";\nimport type { GetConditionsChecker } from \"./conditions\";\nimport type { ModulesManager } from \"./modulesManager\";\nimport { initializeFromStorage, persistEntity } from \"./persister\";\n\nexport type StatesByEffect = Record<EffectName, Value>;\n\nexport interface DispatchOptions {\n eventType: EffectOnType;\n name: EventName | AttributeName;\n value: Value;\n}\n\nexport interface EffectsManagerOptions {\n logger: Logger;\n getDatafileReader: GetDatafileReader;\n getTransformer: GetTransformer;\n getConditionsChecker: GetConditionsChecker;\n modulesManager: ModulesManager;\n}\n\nexport class EffectsManager {\n private logger: Logger;\n private getDatafileReader: GetDatafileReader;\n private getTransformer: GetTransformer;\n private getConditionsChecker: GetConditionsChecker;\n private modulesManager: ModulesManager;\n\n private statesByEffect: StatesByEffect = {};\n\n constructor(options: EffectsManagerOptions) {\n this.logger = options.logger;\n this.getDatafileReader = options.getDatafileReader;\n this.getTransformer = options.getTransformer;\n this.getConditionsChecker = options.getConditionsChecker;\n this.modulesManager = options.modulesManager;\n }\n\n async initialize(): Promise<void> {\n const datafileReader = this.getDatafileReader();\n const effects = datafileReader.getEffectNames();\n\n const persistedResult = await initializeFromStorage({\n datafileReader,\n conditionsChecker: this.getConditionsChecker(),\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"effects_\",\n getEntityNames: () => datafileReader.getEffectNames(),\n getEntity: (entityName: string) => datafileReader.getEffect(entityName),\n });\n\n for (const effectName of effects) {\n const effect = datafileReader.getEffect(effectName);\n\n if (!effect) {\n continue;\n }\n\n if (typeof this.statesByEffect[effectName] !== \"undefined\") {\n // possibly called via refresh() method after initialization\n continue;\n }\n\n if (typeof persistedResult[effectName] !== \"undefined\") {\n // from storage\n this.statesByEffect[effectName] = persistedResult[effectName];\n } else {\n // from initial state of effect\n if (typeof effect.state !== \"undefined\") {\n if (typeof this.statesByEffect[effectName] === \"undefined\") {\n this.statesByEffect[effectName] = effect.state;\n }\n }\n }\n }\n }\n\n async dispatch(dispatchOptions: DispatchOptions) {\n // @TODO: rename to actionType\n const { eventType, name, value } = dispatchOptions;\n\n const datafileReader = this.getDatafileReader();\n const conditionsChecker = this.getConditionsChecker();\n const transformer = this.getTransformer();\n\n const allEffects = datafileReader.getEffectNames();\n\n for (const effectName of allEffects) {\n const effect = datafileReader.getEffect(effectName);\n\n if (!effect) {\n continue;\n }\n\n if (eventType === \"event_tracked\") {\n if (Array.isArray(effect.on) && !effect.on.includes(\"event_tracked\")) {\n continue;\n }\n\n if (typeof effect.on === \"object\" && !effect.on[\"event_tracked\"]?.includes(name)) {\n continue;\n }\n }\n\n if (eventType === \"attribute_set\") {\n if (Array.isArray(effect.on) && !effect.on.includes(\"attribute_set\")) {\n continue;\n }\n\n if (typeof effect.on === \"object\" && !effect.on[\"attribute_set\"]?.includes(name)) {\n continue;\n }\n }\n\n // conditions\n if (effect.conditions) {\n const isMatched = await conditionsChecker.allAreMatched(effect.conditions, {\n payload: value,\n eventName: eventType === \"event_tracked\" ? name : undefined,\n attributeName: eventType === \"attribute_set\" ? name : undefined,\n state: this.statesByEffect[effectName],\n });\n\n if (!isMatched) {\n continue;\n }\n }\n\n // steps\n if (effect.steps) {\n for (const step of effect.steps) {\n let stepPassed = true;\n\n // conditions\n if (step.conditions) {\n const conditionsChecker = this.getConditionsChecker();\n const isMatched = await conditionsChecker.allAreMatched(step.conditions, {\n payload: value,\n eventName: eventType === \"event_tracked\" ? name : undefined,\n attributeName: eventType === \"attribute_set\" ? name : undefined,\n state: this.statesByEffect[effectName],\n });\n\n if (!isMatched) {\n continue;\n }\n }\n\n // handler\n if (step.handler) {\n try {\n await this.modulesManager.handle(step.handler, effectName, effect, step, value);\n } catch (handlerError) {\n this.logger.error(`Effect handler error`, {\n effectName,\n step,\n error: handlerError,\n });\n\n stepPassed = false;\n }\n }\n\n // continueOnError\n if (!stepPassed && typeof step.continueOnError === \"boolean\" && !step.continueOnError) {\n break;\n }\n\n // transforms\n if (step.transforms) {\n this.statesByEffect[effectName] = await transformer.applyAll(\n this.statesByEffect[effectName],\n step.transforms,\n {\n eventName: eventType === \"event_tracked\" ? name : undefined,\n attributeName: eventType === \"attribute_set\" ? name : undefined,\n state: this.statesByEffect[effectName],\n },\n );\n }\n }\n }\n\n // persist\n await persistEntity({\n datafileReader,\n conditionsChecker,\n modulesManager: this.modulesManager,\n storageKeyPrefix: \"effects_\",\n entityName: effectName,\n entity: effect,\n value: this.statesByEffect[effectName],\n });\n }\n }\n\n // called after datafile refresh\n refresh() {\n // @TODO: think\n this.initialize();\n }\n\n getAllStates() {\n return this.statesByEffect;\n }\n\n getStateValue(name: EffectName) {\n return this.statesByEffect[name];\n }\n}\n","import {\n AttributeName,\n DatafileContent,\n EventName,\n EffectName,\n Value,\n Action,\n} from \"@eventvisor/types\";\n\nimport { DatafileReader, emptyDatafile } from \"./datafileReader\";\nimport { createLogger, Logger, LogLevel } from \"./logger\";\nimport { Emitter, EmitType, EventCallback } from \"./emitter\";\nimport { AttributesManager } from \"./attributesManager\";\nimport { Module, ModuleName, ModulesManager } from \"./modulesManager\";\nimport { SourceResolver } from \"./sourceResolver\";\nimport { ConditionsChecker } from \"./conditions\";\nimport { Bucketer } from \"./bucketer\";\nimport { Transformer } from \"./transformer\";\nimport { Validator } from \"./validator\";\nimport { EffectsManager } from \"./effectsManager\";\n\nexport interface InstanceOptions {\n datafile?: DatafileContent;\n logLevel?: LogLevel;\n logger?: Logger;\n modules?: Module[];\n\n // @TODO\n // initialAttributes?: Record<AttributeName, Value>;\n}\n\nexport class Eventvisor {\n private datafileReader: DatafileReader;\n private logger: Logger;\n private emitter: Emitter;\n private attributesManager: AttributesManager;\n private modulesManager: ModulesManager;\n private effectsManager: EffectsManager;\n private sourceResolver: SourceResolver;\n private conditionsChecker: ConditionsChecker;\n private transformer: Transformer;\n private bucketer: Bucketer;\n private validator: Validator;\n\n private ready: boolean = false;\n private queue: Action[] = [];\n private queueProcessing: boolean = false;\n\n constructor(options: InstanceOptions = {}) {\n /**\n * Core instances without interdependencies\n *\n * @TODO: sort out this dependency mess!!\n */\n this.logger =\n options.logger ||\n createLogger({\n level: options.logLevel || Logger.defaultLevel,\n });\n\n this.datafileReader = new DatafileReader({\n datafile: options.datafile || emptyDatafile,\n logger: this.logger,\n });\n\n this.emitter = new Emitter();\n\n /**\n * Instances with interdependencies\n */\n this.modulesManager = new ModulesManager({\n logger: this.logger,\n getDatafileReader: () => this.datafileReader,\n getSourceResolver: () => this.sourceResolver,\n });\n\n this.validator = new Validator({\n logger: this.logger,\n getSourceResolver: () => this.sourceResolver,\n });\n\n this.attributesManager = new AttributesManager({\n logger: this.logger,\n emitter: this.emitter,\n validator: this.validator,\n getDatafileReader: () => this.datafileReader,\n getTransformer: () => this.transformer,\n getConditionsChecker: () => this.conditionsChecker,\n modulesManager: this.modulesManager,\n });\n\n this.effectsManager = new EffectsManager({\n logger: this.logger,\n getDatafileReader: () => this.datafileReader,\n getTransformer: () => this.transformer,\n getConditionsChecker: () => this.conditionsChecker,\n modulesManager: this.modulesManager,\n });\n\n this.sourceResolver = new SourceResolver({\n logger: this.logger,\n modulesManager: this.modulesManager,\n attributesManager: this.attributesManager,\n effectsManager: this.effectsManager,\n });\n\n this.conditionsChecker = new ConditionsChecker({\n logger: this.logger,\n getRegex: (regexString, regexFlags) => this.datafileReader.getRegex(regexString, regexFlags),\n sourceResolver: this.sourceResolver,\n });\n\n this.transformer = new Transformer({\n logger: this.logger,\n conditionsChecker: this.conditionsChecker,\n sourceResolver: this.sourceResolver,\n });\n\n this.bucketer = new Bucketer({\n logger: this.logger,\n sourceResolver: this.sourceResolver,\n conditionsChecker: this.conditionsChecker,\n transformer: this.transformer,\n });\n\n /**\n * Ready\n */\n if (options.modules) {\n for (const module of options.modules) {\n this.modulesManager.registerModule(module);\n }\n }\n\n Promise.all([this.effectsManager.initialize(), this.attributesManager.initialize()])\n .then(() => {\n this.ready = true;\n this.emitter.trigger(\"ready\");\n this.logger.debug(\"Eventvisor SDK is ready\");\n })\n .catch((error) => {\n this.logger.error(\"initialization failed\", error);\n });\n\n this.logger.info(\"Eventvisor SDK initialized\");\n }\n\n isReady() {\n return this.ready;\n }\n\n async onReady(): Promise<void> {\n if (this.ready) {\n return;\n }\n\n return new Promise((resolve) => {\n const unsubscribe = this.emitter.on(\"ready\", () => {\n unsubscribe();\n resolve();\n });\n });\n }\n\n getRevision() {\n return this.datafileReader.getRevision();\n }\n\n setLogLevel(level: LogLevel) {\n return this.logger.setLevel(level);\n }\n\n setDatafile(datafile: DatafileContent) {\n try {\n const newDatafileReader = new DatafileReader({\n datafile,\n logger: this.logger,\n });\n\n this.datafileReader = newDatafileReader;\n\n this.effectsManager.refresh();\n\n this.emitter.trigger(\"datafile_set\");\n } catch (error) {\n this.logger.error(\"Error setting datafile\", {\n error,\n });\n }\n }\n\n on(emitType: EmitType, callback: EventCallback) {\n return this.emitter.on(emitType, callback);\n }\n\n /**\n * Queue\n */\n private addToQueue(action: Action) {\n this.queue.push(action);\n }\n\n // @TODO: make it better\n private async processQueue() {\n if (this.queue.length === 0) {\n return;\n }\n\n if (this.queueProcessing) {\n return;\n }\n\n this.queueProcessing = true;\n\n const action = this.queue.shift();\n\n if (!action) {\n this.queueProcessing = false;\n\n return;\n }\n\n try {\n if (action.type === \"track\") {\n await this.trackAsync(action.name, action.value);\n } else if (action.type === \"setAttribute\") {\n await this.setAttributeAsync(action.name, action.value);\n } else if (action.type === \"removeAttribute\") {\n await this.removeAttributeAsync(action.name);\n }\n } catch (error) {\n this.logger.error(`Error processing queue`, {\n error,\n action,\n });\n }\n\n this.queueProcessing = false;\n\n await this.processQueue();\n }\n\n /**\n * Attribute\n */\n async setAttributeAsync(attributeName: AttributeName, value: Value) {\n const result = await this.attributesManager.setAttribute(attributeName, value);\n\n /**\n * Effects\n */\n await this.effectsManager.dispatch({\n eventType: \"attribute_set\",\n name: attributeName,\n value: result,\n });\n\n return result;\n }\n\n setAttribute(attributeName: AttributeName, value: Value) {\n this.addToQueue({\n type: \"setAttribute\",\n name: attributeName,\n value,\n });\n\n this.processQueue();\n }\n\n getAttributeValue(attributeName: AttributeName) {\n return this.attributesManager.getAttributeValue(attributeName);\n }\n\n getAttributes() {\n return this.attributesManager.getAttributesMap();\n }\n\n isAttributeSet(attributeName: AttributeName) {\n return this.attributesManager.isAttributeSet(attributeName);\n }\n\n removeAttributeAsync(attributeName: AttributeName) {\n return this.attributesManager.removeAttribute(attributeName);\n }\n\n removeAttribute(attributeName: AttributeName) {\n this.addToQueue({\n type: \"removeAttribute\",\n name: attributeName,\n });\n\n this.processQueue();\n }\n\n /**\n * Modules\n */\n registerModule(module: Module) {\n return this.modulesManager.registerModule(module);\n }\n\n removeModule(moduleName: ModuleName) {\n return this.modulesManager.removeModule(moduleName);\n }\n\n /**\n * Event\n */\n async trackAsync(eventName: EventName, value: Value): Promise<Value | null> {\n /**\n * Find\n */\n const eventSchema = this.datafileReader.getEvent(eventName);\n\n if (!eventSchema) {\n this.logger.error(`Event schema not found in datafile`, { eventName });\n\n return null; // @TODO: allow to continue based on SDK instance options later\n }\n\n const eventLevel = eventSchema.level || \"info\";\n\n /**\n * Deprecated\n */\n if (eventSchema.deprecated) {\n this.logger.warn(`Event is deprecated`, { eventName });\n }\n\n /**\n * Validate\n */\n let error: Error | undefined = value instanceof Error ? value : undefined;\n const validationResult = await this.validator.validate(eventSchema, value);\n\n if (!validationResult.valid) {\n this.logger.warn(`Event validation failed`, {\n eventName,\n errors: validationResult.errors,\n });\n\n return null; // @TODO: allow to continue based on schema later\n }\n\n const validatedValue = validationResult.value;\n\n /**\n * Conditions\n */\n if (eventSchema.conditions) {\n const isMatched = await this.conditionsChecker.allAreMatched(eventSchema.conditions, {\n // @TODO: rename to eventPayload to be explicit?\n eventName,\n eventLevel,\n payload: validatedValue,\n });\n\n if (!isMatched) {\n this.logger.debug(`Event conditions not matched`, {\n eventName,\n conditions: eventSchema.conditions,\n });\n\n return null;\n }\n }\n\n /**\n * Sample\n */\n if (eventSchema.sample) {\n const sampleResult = await this.bucketer.isSampled(eventSchema.sample, {\n eventName,\n eventLevel,\n payload: validatedValue,\n });\n\n if (!sampleResult.isSampled) {\n this.logger.debug(`Event sample not matched`, {\n eventName,\n matchedSample: sampleResult.matchedSample,\n bucketedNumber: sampleResult.bucketedNumber,\n bucketKey: sampleResult.bucketKey,\n });\n\n return null;\n }\n }\n\n /**\n * Transform\n */\n let transformedValue = validatedValue;\n\n if (eventSchema.transforms) {\n transformedValue = await this.transformer.applyAll(validatedValue, eventSchema.transforms, {\n eventName,\n eventLevel,\n payload: validatedValue,\n });\n }\n\n /**\n * Effects\n */\n await this.effectsManager.dispatch({\n eventType: \"event_tracked\",\n name: eventName,\n value: transformedValue,\n });\n\n /**\n * Destinations\n */\n const destinationNames = this.datafileReader.getDestinationNames();\n\n for (const destinationName of destinationNames) {\n const destination = this.datafileReader.getDestination(destinationName);\n\n if (!destination) {\n continue;\n }\n\n const transportExists = this.modulesManager.transportExists(destination.transport);\n\n if (!transportExists) {\n this.logger.error(`Destination has no transport`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n\n let transportBody = transformedValue;\n\n /**\n * Event.destinations\n */\n if (\n eventSchema.destinations &&\n typeof eventSchema.destinations[destinationName] !== \"undefined\"\n ) {\n const destinationOverride = eventSchema.destinations[destinationName];\n\n if (destinationOverride === false) {\n this.logger.debug(`Event has destination disabled`, {\n eventName,\n destinationName,\n });\n\n continue;\n } else if (typeof destinationOverride === \"object\") {\n // conditions\n if (destinationOverride.conditions) {\n const isMatched = await this.conditionsChecker.allAreMatched(\n destinationOverride.conditions,\n {\n eventName,\n eventLevel,\n payload: transportBody,\n },\n );\n\n if (!isMatched) {\n this.logger.debug(`Destination conditions not matched for event`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n\n // sample\n if (destinationOverride.sample) {\n const sampleResult = await this.bucketer.isSampled(destinationOverride.sample, {\n eventName,\n eventLevel,\n payload: transportBody,\n });\n\n if (!sampleResult.isSampled) {\n this.logger.debug(`Destination sample not matched for event`, {\n eventName,\n destinationName,\n matchedSample: sampleResult.matchedSample,\n bucketedNumber: sampleResult.bucketedNumber,\n bucketKey: sampleResult.bucketKey,\n });\n\n continue;\n }\n }\n\n // transform\n if (destinationOverride.transforms) {\n // @TODO: make sure this transformed value is only affecting the specific desired destination and not others\n transportBody = await this.transformer.applyAll(\n transformedValue,\n destinationOverride.transforms,\n {\n eventName,\n eventLevel,\n payload: transportBody,\n },\n );\n }\n }\n }\n }\n\n /**\n * Destination itself\n */\n\n // conditions\n if (destination.conditions) {\n const isMatched = await this.conditionsChecker.allAreMatched(destination.conditions, {\n eventName,\n eventLevel,\n payload: transformedValue,\n });\n\n if (!isMatched) {\n this.logger.debug(`Destination conditions not matched`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n }\n\n // sample\n if (destination.sample) {\n const sampleResult = await this.bucketer.isSampled(destination.sample, {\n eventName,\n eventLevel,\n payload: transportBody,\n });\n\n if (!sampleResult.isSampled) {\n this.logger.debug(`Destination sample not matched`, {\n eventName,\n destinationName,\n });\n\n continue;\n }\n }\n\n // transform\n if (destination.transforms) {\n transportBody = await this.transformer.applyAll(transportBody, destination.transforms, {\n eventName,\n eventLevel,\n payload: transportBody,\n destinationName,\n attributes: this.attributesManager.getAttributesMap(), // @TODO: check if needed\n });\n }\n\n // hand over to module for transporting\n // @TODO: decide about \"await\" or not\n // @TODO: batch\n // @TODO: retry\n await this.modulesManager.transport(\n destination.transport,\n destinationName,\n eventName,\n transportBody,\n eventLevel,\n error,\n );\n }\n\n return transformedValue;\n }\n\n track(eventName: EventName, value: Value) {\n this.addToQueue({\n type: \"track\",\n name: eventName,\n value,\n });\n\n this.processQueue();\n }\n\n /**\n * Effect's state\n */\n getStateValue(name: EffectName) {\n return this.effectsManager.getStateValue(name);\n }\n\n /**\n * @TODO: implement\n */\n spawn() {\n // create child instance here\n }\n}\n\nexport function createInstance(options: InstanceOptions = {}): Eventvisor {\n return new Eventvisor(options);\n}\n"],"names":["emptyDatafile","schemaVersion","revision","attributes","events","destinations","effects","getComplexPersists","persist","result","push","storage","Array","isArray","p","r","concat","DatafileReader","constructor","options","datafile","logger","this","regexCache","getSchemaVersion","getRevision","getAttribute","attributeName","getAttributeNames","Object","keys","getEvent","eventName","getDestination","destinationName","getDestinationNames","getEffect","effectName","getEffectNames","getRegex","regexString","regexFlags","flags","cacheKey","regex","RegExp","getPersists","schema","loggerPrefix","defaultLogHandler","level","message","details","method","console","Logger","defaultLevel","handle","handler","setLevel","log","allLevels","indexOf","debug","info","warn","error","createLogger","Emitter","listeners","on","emitType","callback","isActive","index","splice","trigger","forEach","listener","err","clearAll","findPersist","persists","entityName","conditionsChecker","payload","conditions","allAreMatched","initializeFromStorage","datafileReader","modulesManager","storageKeyPrefix","getEntityNames","getEntity","entityNames","entityMap","value","readFromStorage","persistEntity","entity","writeToStorage","AttributesManager","getDatafileReader","emitter","getTransformer","getConditionsChecker","validator","attributesMap","initialize","setAttribute","attributeSchema","deprecated","validationResult","validate","valid","errors","validatedValue","transformedValue","transforms","applyAll","isAttributeSet","undefined","getAttributesMap","getAttributeValue","removeAttribute","removeFromStorage","removeEntity","ModulesManager","getSourceResolver","modules","registerModule","module","find","m","name","getModule","removeModule","filter","getModuleDependencies","sourceResolver","lookup","fullKey","moduleName","keyParts","split","key","join","moduleInstance","effect","step","transportExists","transport","eventLevel","findValueAtPath","obj","path","reduce","acc","part","SourceResolver","attributesManager","effectsManager","getPath","parts","slice","getOrigin","source","originType","attribute","map","state","resolveByOrigin","origin","inputs","length","getStateValue","getAllStates","Boolean","resolve","Promise","all","o","semver","validateAndParse","version","TypeError","match","Error","shift","isWildcard","s","tryParse","v","n","parseInt","isNaN","compareStrings","a","b","ap","bp","String","forceType","compareSegments","i","Math","max","compareVersions","v1","v2","n1","n2","p1","pop","p2","ConditionsChecker","isMatched","condition","operator","sourceValue","dateInContext","Date","dateInCondition","valueInContext","startsWith","endsWith","test","_allAreMatched","e","and","c","or","not","parsedConditions","parseIfStringified","JSON","parse","MurmurHashV3","seed","val","remainder","bytes","h1","h1b","c1","c2","k1","TextEncoder","encode","MAX_HASH_VALUE","pow","MAX_BUCKETED_NUMBER","getBucketedNumber","bucketKey","ratio","floor","BucketerOptions","Bucketer","transformer","getBucketKey","sampleBy","type","sources","isSampled","sample","matchedSample","by","bucketedNumber","percentage","range","Transformer","transform","target","targets","setValueAtPath","trim","separator","removeValueAt","parseFloat","lowerCasedValue","toLowerCase","currentTargetValue","getValueAtPath","Number","targetMap","targetMaps","entries","renameValueAt","oldKey","newKey","oldValue","stringify","oldKeys","current","finalKey","Validator","deps","validateValue","default","enum","includes","typeValid","expectedType","isInteger","validateType","const","properties","stack","validatedObj","required","requiredProp","prop","propValue","validatedProp","propSchema","minItems","maxItems","items","validatedArray","itemSchema","itemPath","validatedItem","minLength","maxLength","pattern","minimum","maximum","EffectsManager","statesByEffect","persistedResult","dispatch","dispatchOptions","eventType","allEffects","steps","stepPassed","handlerError","continueOnError","refresh","Eventvisor","ready","queue","queueProcessing","logLevel","bucketer","then","catch","isReady","onReady","unsubscribe","setLogLevel","setDatafile","newDatafileReader","addToQueue","action","processQueue","trackAsync","setAttributeAsync","removeAttributeAsync","getAttributes","eventSchema","sampleResult","destinationNames","destination","transportBody","destinationOverride","track","spawn","createInstance"],"sourceRoot":""}