{"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"]}