UNPKG

autotel

Version:
1 lines 27.9 kB
{"version":3,"sources":["../src/business-baggage.ts"],"names":["propagation","context"],"mappings":"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","file":"chunk-INJD3G4K.cjs","sourcesContent":["/**\n * Safe baggage propagation with guardrails\n *\n * Provides type-safe baggage schemas with built-in protection against\n * common pitfalls: high-cardinality values, PII leakage, and oversized payloads.\n *\n * @example Define a custom schema\n * ```typescript\n * import { createSafeBaggageSchema } from 'autotel/business-baggage';\n *\n * const OrderBaggage = createSafeBaggageSchema({\n * orderId: { type: 'string' },\n * customerId: { type: 'string', hash: true }, // Auto-hash for privacy\n * priority: { type: 'enum', values: ['low', 'normal', 'high'] },\n * });\n *\n * // Usage in traced function\n * OrderBaggage.set(ctx, { orderId: 'ord-123', customerId: 'cust-456', priority: 'high' });\n * const { orderId, priority } = OrderBaggage.get(ctx);\n * ```\n *\n * @example Use pre-built BusinessBaggage\n * ```typescript\n * import { BusinessBaggage } from 'autotel/business-baggage';\n *\n * BusinessBaggage.set(ctx, { tenantId: 'acme', userId: 'user-123' });\n * const { tenantId } = BusinessBaggage.get(ctx);\n * ```\n *\n * @module\n */\n\nimport { context, propagation } from '@opentelemetry/api';\nimport type { TraceContext } from './trace-context';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Supported field types in baggage schema\n */\nexport type BaggageFieldType = 'string' | 'number' | 'boolean' | 'enum';\n\n/**\n * Field definition in a baggage schema\n */\nexport interface BaggageFieldDefinition {\n /** Field type */\n type: BaggageFieldType;\n\n /** Maximum length for string values (default: 256) */\n maxLength?: number;\n\n /** Hash value before storing (for privacy) */\n hash?: boolean;\n\n /** Allowed values for enum type */\n values?: readonly string[];\n\n /** Default value if not provided */\n defaultValue?: string | number | boolean;\n\n /** Whether field is required */\n required?: boolean;\n\n /** Custom validation function */\n validate?: (value: unknown) => boolean;\n}\n\n/**\n * Options for creating a safe baggage schema\n */\nexport interface SafeBaggageOptions {\n /** Maximum key length (default: 64) */\n maxKeyLength?: number;\n\n /** Maximum value length (default: 256) */\n maxValueLength?: number;\n\n /** Maximum total baggage size in bytes (default: 8192) */\n maxTotalSize?: number;\n\n /** Prefix for all keys (default: none) */\n prefix?: string;\n\n /** Hash high-cardinality values automatically */\n hashHighCardinality?: boolean;\n\n /** Detect and redact PII patterns */\n redactPII?: boolean;\n\n /** Allowed keys whitelist (others rejected) */\n allowedKeys?: string[];\n\n /** Custom error handler */\n onError?: (error: BaggageError) => void;\n}\n\n/**\n * Schema definition type - maps field names to definitions\n */\nexport type BaggageSchemaDefinition = Record<string, BaggageFieldDefinition>;\n\n/**\n * Inferred type from schema definition\n */\nexport type InferBaggageType<T extends BaggageSchemaDefinition> = {\n [K in keyof T]?: T[K]['type'] extends 'string'\n ? string\n : T[K]['type'] extends 'number'\n ? number\n : T[K]['type'] extends 'boolean'\n ? boolean\n : T[K]['type'] extends 'enum'\n ? T[K]['values'] extends readonly string[]\n ? T[K]['values'][number]\n : string\n : unknown;\n};\n\n/**\n * Baggage error details\n */\nexport interface BaggageError {\n type: 'validation' | 'size' | 'pii' | 'key_length' | 'value_length';\n key: string;\n message: string;\n value?: unknown;\n}\n\n/**\n * Safe baggage schema interface\n */\nexport interface SafeBaggageSchema<T extends BaggageSchemaDefinition> {\n /**\n * Get baggage values from context\n */\n get(ctx?: TraceContext): Partial<InferBaggageType<T>>;\n\n /**\n * Set baggage values in context\n * Returns new context with baggage (for context propagation)\n */\n set(\n ctx: TraceContext | undefined,\n values: Partial<InferBaggageType<T>>,\n ): void;\n\n /**\n * Get a single baggage value\n */\n getValue<K extends keyof T>(\n key: K,\n ctx?: TraceContext,\n ): InferBaggageType<T>[K] | undefined;\n\n /**\n * Set a single baggage value\n */\n setValue<K extends keyof T>(\n key: K,\n value: InferBaggageType<T>[K],\n ctx?: TraceContext,\n ): void;\n\n /**\n * Clear all schema baggage values\n */\n clear(ctx?: TraceContext): void;\n\n /**\n * Get all baggage as headers for propagation\n */\n toHeaders(ctx?: TraceContext): Record<string, string>;\n\n /**\n * Restore baggage from headers\n */\n fromHeaders(headers: Record<string, string>, ctx?: TraceContext): void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_MAX_KEY_LENGTH = 64;\nconst DEFAULT_MAX_VALUE_LENGTH = 256;\nconst DEFAULT_MAX_TOTAL_SIZE = 8192;\n\n// PII patterns to detect and redact\nconst PII_PATTERNS = [\n /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b/, // Email\n /\\b\\d{3}[-.]?\\d{3}[-.]?\\d{4}\\b/, // Phone (US)\n /\\b\\d{3}[-]?\\d{2}[-]?\\d{4}\\b/, // SSN\n /\\b\\d{16}\\b/, // Credit card (basic)\n];\n\n// High-cardinality value patterns\nconst HIGH_CARDINALITY_PATTERNS = [\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, // UUID\n /^\\d{13,}$/, // Timestamps\n /^[A-Za-z0-9+/]{20,}={0,2}$/, // Base64\n];\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Create a safe baggage schema with validation and guardrails\n *\n * @param schema - Field definitions\n * @param options - Safety options\n * @returns Type-safe baggage schema\n *\n * @example\n * ```typescript\n * const MyBaggage = createSafeBaggageSchema({\n * userId: { type: 'string', hash: true },\n * region: { type: 'enum', values: ['us', 'eu', 'ap'] },\n * debug: { type: 'boolean', defaultValue: false },\n * });\n * ```\n */\nexport function createSafeBaggageSchema<T extends BaggageSchemaDefinition>(\n schema: T,\n options: SafeBaggageOptions = {},\n): SafeBaggageSchema<T> {\n const {\n maxKeyLength = DEFAULT_MAX_KEY_LENGTH,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n maxTotalSize = DEFAULT_MAX_TOTAL_SIZE,\n prefix = '',\n hashHighCardinality = false,\n redactPII = false,\n allowedKeys,\n onError,\n } = options;\n\n // Validate schema keys\n const schemaKeys = new Set(Object.keys(schema));\n if (allowedKeys) {\n for (const key of schemaKeys) {\n if (!allowedKeys.includes(key)) {\n throw new Error(`Key \"${key}\" not in allowedKeys whitelist`);\n }\n }\n }\n\n // Prefix a key\n const prefixKey = (key: string): string =>\n prefix ? `${prefix}.${key}` : key;\n\n // Hash a value using simple FNV-1a (synchronous, no crypto dependency)\n const hashValue = (value: string): string => {\n let hash = 2_166_136_261;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.codePointAt(i) ?? 0;\n hash = (hash * 16_777_619) >>> 0;\n }\n return `h_${hash.toString(16)}`;\n };\n\n // Check for PII\n const containsPII = (value: string): boolean => {\n return PII_PATTERNS.some((pattern) => pattern.test(value));\n };\n\n // Check for high-cardinality\n const isHighCardinality = (value: string): boolean => {\n return HIGH_CARDINALITY_PATTERNS.some((pattern) => pattern.test(value));\n };\n\n // Validate and transform a single value\n const validateAndTransform = (\n key: string,\n value: unknown,\n fieldDef: BaggageFieldDefinition,\n ): string | null => {\n const fullKey = prefixKey(key);\n\n // Check key length\n if (fullKey.length > maxKeyLength) {\n onError?.({\n type: 'key_length',\n key,\n message: `Key \"${key}\" exceeds max length ${maxKeyLength}`,\n });\n return null;\n }\n\n // Handle undefined/null with default\n if (value === undefined || value === null) {\n if (fieldDef.required) {\n onError?.({\n type: 'validation',\n key,\n message: `Required field \"${key}\" is missing`,\n });\n return null;\n }\n if (fieldDef.defaultValue === undefined) {\n return null;\n } else {\n value = fieldDef.defaultValue;\n }\n }\n\n // Type validation\n let stringValue: string;\n\n switch (fieldDef.type) {\n case 'string': {\n if (typeof value !== 'string') {\n onError?.({\n type: 'validation',\n key,\n message: `Field \"${key}\" expected string, got ${typeof value}`,\n value,\n });\n return null;\n }\n stringValue = value;\n break;\n }\n\n case 'number': {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n onError?.({\n type: 'validation',\n key,\n message: `Field \"${key}\" expected number, got ${typeof value}`,\n value,\n });\n return null;\n }\n stringValue = String(value);\n break;\n }\n\n case 'boolean': {\n if (typeof value !== 'boolean') {\n onError?.({\n type: 'validation',\n key,\n message: `Field \"${key}\" expected boolean, got ${typeof value}`,\n value,\n });\n return null;\n }\n stringValue = String(value);\n break;\n }\n\n case 'enum': {\n if (!fieldDef.values?.includes(String(value))) {\n onError?.({\n type: 'validation',\n key,\n message: `Field \"${key}\" value \"${value}\" not in allowed values: ${fieldDef.values?.join(', ')}`,\n value,\n });\n return null;\n }\n stringValue = String(value);\n break;\n }\n\n default: {\n stringValue = String(value);\n }\n }\n\n // Custom validation\n if (fieldDef.validate && !fieldDef.validate(value)) {\n onError?.({\n type: 'validation',\n key,\n message: `Field \"${key}\" failed custom validation`,\n value,\n });\n return null;\n }\n\n // PII check\n if (redactPII && containsPII(stringValue)) {\n onError?.({\n type: 'pii',\n key,\n message: `Field \"${key}\" contains PII pattern`,\n value: '[REDACTED]',\n });\n stringValue = hashValue(stringValue);\n }\n\n // Hash if requested or high-cardinality\n if (\n fieldDef.hash ||\n (hashHighCardinality && isHighCardinality(stringValue))\n ) {\n stringValue = hashValue(stringValue);\n }\n\n // Length validation\n const maxLen = fieldDef.maxLength ?? maxValueLength;\n if (stringValue.length > maxLen) {\n onError?.({\n type: 'value_length',\n key,\n message: `Field \"${key}\" value exceeds max length ${maxLen}`,\n value: stringValue,\n });\n stringValue = stringValue.slice(0, maxLen);\n }\n\n return stringValue;\n };\n\n // Parse value back from baggage string\n const parseValue = (\n key: string,\n stringValue: string,\n fieldDef: BaggageFieldDefinition,\n ): unknown => {\n switch (fieldDef.type) {\n case 'number': {\n return Number.parseFloat(stringValue);\n }\n case 'boolean': {\n return stringValue === 'true';\n }\n default: {\n return stringValue;\n }\n }\n };\n\n return {\n get(): Partial<InferBaggageType<T>> {\n const baggage = propagation.getBaggage(context.active());\n if (!baggage) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, fieldDef] of Object.entries(schema)) {\n const fullKey = prefixKey(key);\n const entry = baggage.getEntry(fullKey);\n\n if (entry) {\n result[key] = parseValue(key, entry.value, fieldDef);\n } else if (fieldDef.defaultValue !== undefined) {\n result[key] = fieldDef.defaultValue;\n }\n }\n\n return result as Partial<InferBaggageType<T>>;\n },\n\n set(\n ctx: TraceContext | undefined,\n values: Partial<InferBaggageType<T>>,\n ): void {\n let baggage =\n propagation.getBaggage(context.active()) ?? propagation.createBaggage();\n let totalSize = 0;\n\n // Calculate existing size\n for (const [key, entry] of baggage.getAllEntries()) {\n totalSize += key.length + entry.value.length;\n }\n\n for (const [key, value] of Object.entries(values)) {\n const fieldDef = schema[key];\n if (!fieldDef) continue;\n\n const fullKey = prefixKey(key);\n const stringValue = validateAndTransform(key, value, fieldDef);\n\n if (stringValue !== null) {\n // Check total size\n const entrySize = fullKey.length + stringValue.length;\n if (totalSize + entrySize > maxTotalSize) {\n onError?.({\n type: 'size',\n key,\n message: `Adding \"${key}\" would exceed max baggage size ${maxTotalSize}`,\n value,\n });\n continue;\n }\n\n baggage = baggage.setEntry(fullKey, { value: stringValue });\n totalSize += entrySize;\n }\n }\n\n // Update context with new baggage\n const newContext = propagation.setBaggage(context.active(), baggage);\n // Note: This only works if the caller propagates the context\n // In OTel, baggage propagation happens via context.with()\n // For now we set on active context\n propagation.setBaggage(newContext, baggage);\n },\n\n getValue<K extends keyof T>(key: K): InferBaggageType<T>[K] | undefined {\n const baggage = propagation.getBaggage(context.active());\n if (!baggage) return undefined;\n\n const fullKey = prefixKey(String(key));\n const entry = baggage.getEntry(fullKey);\n const fieldDef = schema[String(key)];\n\n if (!entry) {\n return fieldDef?.defaultValue as InferBaggageType<T>[K] | undefined;\n }\n\n if (!fieldDef) {\n return undefined;\n }\n\n return parseValue(\n String(key),\n entry.value,\n fieldDef,\n ) as InferBaggageType<T>[K];\n },\n\n setValue<K extends keyof T>(\n key: K,\n value: InferBaggageType<T>[K],\n ctx?: TraceContext,\n ): void {\n this.set(ctx, { [key]: value } as Partial<InferBaggageType<T>>);\n },\n\n clear(): void {\n let baggage = propagation.getBaggage(context.active());\n if (!baggage) return;\n\n for (const key of Object.keys(schema)) {\n const fullKey = prefixKey(key);\n baggage = baggage.removeEntry(fullKey);\n }\n\n propagation.setBaggage(context.active(), baggage);\n },\n\n toHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n propagation.inject(context.active(), headers);\n return headers;\n },\n\n fromHeaders(headers: Record<string, string>, ctx?: TraceContext): void {\n const extractedContext = propagation.extract(context.active(), headers);\n const baggage = propagation.getBaggage(extractedContext);\n\n if (baggage) {\n const values: Record<string, unknown> = {};\n\n for (const [key, fieldDef] of Object.entries(schema)) {\n const fullKey = prefixKey(key);\n const entry = baggage.getEntry(fullKey);\n\n if (entry) {\n values[key] = parseValue(key, entry.value, fieldDef);\n }\n }\n\n this.set(ctx, values as Partial<InferBaggageType<T>>);\n }\n },\n };\n}\n\n// ============================================================================\n// Pre-built Business Context Schema\n// ============================================================================\n\n/**\n * Pre-built baggage schema for common business context fields\n *\n * Fields:\n * - `tenantId`: Multi-tenant identifier (string, max 64 chars)\n * - `userId`: User identifier (hashed for privacy)\n * - `correlationId`: Request correlation ID (string)\n * - `workflowId`: Workflow/saga instance ID (string)\n * - `priority`: Request priority (low, normal, high, critical)\n * - `region`: Geographic region (string)\n * - `channel`: Request channel (web, mobile, api, internal)\n *\n * @example\n * ```typescript\n * import { BusinessBaggage } from 'autotel/business-baggage';\n *\n * // Set business context at entry point\n * BusinessBaggage.set(ctx, {\n * tenantId: 'acme-corp',\n * userId: 'user-123',\n * priority: 'high',\n * channel: 'api',\n * });\n *\n * // Access anywhere in the trace\n * const { tenantId, priority } = BusinessBaggage.get(ctx);\n * ```\n */\nexport const BusinessBaggage = createSafeBaggageSchema(\n {\n tenantId: {\n type: 'string',\n maxLength: 64,\n },\n userId: {\n type: 'string',\n hash: true, // Auto-hash for privacy\n maxLength: 64,\n },\n correlationId: {\n type: 'string',\n maxLength: 128,\n },\n workflowId: {\n type: 'string',\n maxLength: 128,\n },\n priority: {\n type: 'enum',\n values: ['low', 'normal', 'high', 'critical'] as const,\n defaultValue: 'normal',\n },\n region: {\n type: 'string',\n maxLength: 32,\n },\n channel: {\n type: 'enum',\n values: [\n 'web',\n 'mobile',\n 'api',\n 'internal',\n 'webhook',\n 'scheduled',\n ] as const,\n },\n },\n {\n prefix: 'biz',\n redactPII: true,\n hashHighCardinality: true,\n },\n);\n\n/**\n * Type alias for BusinessBaggage values\n */\nexport type BusinessBaggageValues = {\n tenantId?: string;\n userId?: string;\n correlationId?: string;\n workflowId?: string;\n priority?: 'low' | 'normal' | 'high' | 'critical';\n region?: string;\n channel?: 'web' | 'mobile' | 'api' | 'internal' | 'webhook' | 'scheduled';\n};\n"]}