{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/types.ts"],"sourcesContent":["import { requestToData, isObject, isDefined } from '@walkeros/core';\nimport type { WalkerOS, Collector, Source } from '@walkeros/core';\nimport type { FetchSource, Types } from './types';\nimport {\n  createCorsHeaders,\n  createPixelResponse,\n  createJsonResponse,\n  matchPath,\n} from './utils';\n\nexport const sourceFetch: Source.Init<Types> = async (context) => {\n  const { config = {}, env } = context;\n  const userSettings = config.settings || {};\n  const settings = {\n    ...userSettings,\n    cors: userSettings.cors ?? true,\n    maxRequestSize: userSettings.maxRequestSize ?? 102400,\n    maxBatchSize: userSettings.maxBatchSize ?? 100,\n    paths:\n      userSettings.paths ??\n      (userSettings.path ? [userSettings.path] : ['/collect']),\n  };\n  const { logger } = env;\n\n  const push = async (request: Request): Promise<Response> => {\n    const startTime = Date.now();\n    void startTime;\n\n    try {\n      const url = new URL(request.url);\n      const method = request.method.toUpperCase();\n      const origin = request.headers.get('Origin');\n      const corsHeaders = createCorsHeaders(settings.cors, origin);\n\n      // Resolve route configs\n      const resolvedPaths = settings.paths.map((entry) =>\n        typeof entry === 'string'\n          ? { path: entry, methods: ['GET', 'POST'] as const }\n          : {\n              path: entry.path,\n              methods: entry.methods || (['GET', 'POST'] as const),\n            },\n      );\n\n      // Match request path against configured routes\n      const matchedRoute = resolvedPaths.find((route) =>\n        matchPath(url.pathname, route.path),\n      );\n\n      if (!matchedRoute) {\n        return createJsonResponse(\n          { success: false, error: 'Not found' },\n          404,\n          corsHeaders,\n        );\n      }\n\n      // OPTIONS (CORS preflight - no logging, routine)\n      if (method === 'OPTIONS') {\n        return new Response(null, { status: 204, headers: corsHeaders });\n      }\n\n      // Check method is allowed for this route\n      if (!matchedRoute.methods.includes(method as 'GET' | 'POST')) {\n        return createJsonResponse(\n          { success: false, error: 'Method not allowed' },\n          405,\n          corsHeaders,\n        );\n      }\n\n      // Per-request scope: each fetch invocation gets its own ingest.\n      // Fetch sources return a Response directly, not via async respond.\n      return await context.withScope(request, undefined, async (scopeEnv) => {\n        const envPush = scopeEnv.push;\n\n        // GET (pixel tracking - no logging, routine)\n        if (method === 'GET') {\n          const parsedData = requestToData(url.search);\n          if (parsedData && isObject(parsedData)) {\n            await envPush(parsedData);\n          }\n          return createPixelResponse(corsHeaders);\n        }\n\n        // POST\n        if (method === 'POST') {\n          // Check request size\n          const contentLength = request.headers.get('Content-Length');\n          if (contentLength) {\n            const size = parseInt(contentLength, 10);\n            if (size > settings.maxRequestSize) {\n              logger.error('Request too large', {\n                size,\n                limit: settings.maxRequestSize,\n              });\n              return createJsonResponse(\n                {\n                  success: false,\n                  error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n                },\n                413,\n                corsHeaders,\n              );\n            }\n          }\n\n          let eventData: unknown;\n          let bodyText: string;\n          let rawBody = false;\n\n          try {\n            bodyText = await request.text();\n\n            // Check actual body size\n            if (bodyText.length > settings.maxRequestSize) {\n              logger.error('Request body too large', {\n                size: bodyText.length,\n                limit: settings.maxRequestSize,\n              });\n              return createJsonResponse(\n                {\n                  success: false,\n                  error: `Request too large. Maximum size: ${settings.maxRequestSize} bytes`,\n                },\n                413,\n                corsHeaders,\n              );\n            }\n\n            eventData = JSON.parse(bodyText);\n          } catch {\n            // Non-JSON body: push empty event for source.before transformers\n            eventData = {};\n            rawBody = true;\n          }\n\n          if (!isDefined(eventData) || !isObject(eventData)) {\n            // Non-object body: push empty event for source.before transformers\n            eventData = {};\n            rawBody = true;\n          }\n\n          // Raw body: push empty event directly, skip validation\n          if (rawBody) {\n            const result = await processEvent(\n              eventData as WalkerOS.DeepPartialEvent,\n              envPush,\n            );\n            if (result.error) {\n              logger.error('Event processing failed', { error: result.error });\n              return createJsonResponse(\n                { success: false, error: result.error },\n                400,\n                corsHeaders,\n              );\n            }\n\n            return createJsonResponse(\n              { success: true, id: result.id, timestamp: Date.now() },\n              200,\n              corsHeaders,\n            );\n          }\n\n          // Check for batch (eventData is a validated object at this point)\n          const validData = eventData as Record<string, unknown>;\n          const isBatch =\n            'batch' in validData && Array.isArray(validData.batch);\n\n          if (isBatch) {\n            const batch = validData.batch as unknown[];\n\n            if (batch.length > settings.maxBatchSize) {\n              logger.error('Batch too large', {\n                size: batch.length,\n                limit: settings.maxBatchSize,\n              });\n              return createJsonResponse(\n                {\n                  success: false,\n                  error: `Batch too large. Maximum size: ${settings.maxBatchSize} events`,\n                },\n                400,\n                corsHeaders,\n              );\n            }\n\n            const results = await processBatch(batch, envPush, logger);\n\n            if (results.failed > 0) {\n              return createJsonResponse(\n                {\n                  success: false,\n                  processed: results.successful,\n                  failed: results.failed,\n                  errors: results.errors,\n                },\n                207,\n                corsHeaders,\n              );\n            }\n\n            return createJsonResponse(\n              {\n                success: true,\n                processed: results.successful,\n                ids: results.ids,\n              },\n              200,\n              corsHeaders,\n            );\n          }\n\n          // Forward event directly — validation is not the source's responsibility.\n          const result = await processEvent(\n            eventData as WalkerOS.DeepPartialEvent,\n            envPush,\n          );\n          if (result.error) {\n            logger.error('Event processing failed', { error: result.error });\n            return createJsonResponse(\n              { success: false, error: result.error },\n              400,\n              corsHeaders,\n            );\n          }\n\n          return createJsonResponse(\n            { success: true, id: result.id, timestamp: Date.now() },\n            200,\n            corsHeaders,\n          );\n        }\n\n        return createJsonResponse(\n          { success: false, error: 'Method not allowed' },\n          405,\n          corsHeaders,\n        );\n      });\n    } catch (error) {\n      logger.error('Internal server error', error);\n      const corsHeaders = createCorsHeaders(settings.cors);\n      return createJsonResponse(\n        {\n          success: false,\n          error:\n            error instanceof Error ? error.message : 'Internal server error',\n        },\n        500,\n        corsHeaders,\n      );\n    }\n  };\n\n  return { type: 'fetch', config: { ...config, settings }, push };\n};\n\nasync function processEvent(\n  event: WalkerOS.DeepPartialEvent,\n  push: Collector.PushFn,\n): Promise<{ id?: string; error?: string }> {\n  try {\n    const result = await push(event);\n    return { id: result?.event?.id };\n  } catch (error) {\n    return { error: error instanceof Error ? error.message : 'Unknown error' };\n  }\n}\n\nasync function processBatch(\n  events: unknown[],\n  push: Collector.PushFn,\n  logger: Types['env']['logger'],\n): Promise<{\n  successful: number;\n  failed: number;\n  ids: string[];\n  errors: Array<{ index: number; error: string }>;\n}> {\n  const results = {\n    successful: 0,\n    failed: 0,\n    ids: [] as string[],\n    errors: [] as Array<{ index: number; error: string }>,\n  };\n\n  for (let i = 0; i < events.length; i++) {\n    const event = events[i];\n\n    try {\n      const result = await push(event as WalkerOS.DeepPartialEvent);\n      if (result?.event?.id) {\n        results.ids.push(result.event.id);\n      }\n      results.successful++;\n    } catch (error) {\n      results.failed++;\n      results.errors.push({\n        index: i,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      });\n      logger.error(`Batch event ${i} processing failed`, error);\n    }\n  }\n\n  return results;\n}\n\nexport type * from './types';\nexport * as SourceFetch from './types';\nexport * from './utils';\n\nexport default sourceFetch;\n","import type { CorsOptions } from './schemas';\n\nexport function createCorsHeaders(\n  corsConfig: boolean | CorsOptions = true,\n  requestOrigin?: string | null,\n): Headers {\n  const headers = new Headers();\n\n  if (corsConfig === false) return headers;\n\n  if (corsConfig === true) {\n    headers.set('Access-Control-Allow-Origin', '*');\n    headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n    headers.set('Access-Control-Allow-Headers', 'Content-Type');\n  } else {\n    if (corsConfig.origin) {\n      let origin: string;\n      if (Array.isArray(corsConfig.origin)) {\n        origin =\n          requestOrigin && corsConfig.origin.includes(requestOrigin)\n            ? requestOrigin\n            : corsConfig.origin[0];\n      } else {\n        origin = corsConfig.origin;\n      }\n      headers.set('Access-Control-Allow-Origin', origin);\n    }\n\n    if (corsConfig.methods) {\n      headers.set(\n        'Access-Control-Allow-Methods',\n        corsConfig.methods.join(', '),\n      );\n    }\n\n    if (corsConfig.headers) {\n      headers.set(\n        'Access-Control-Allow-Headers',\n        corsConfig.headers.join(', '),\n      );\n    }\n\n    if (corsConfig.credentials) {\n      headers.set('Access-Control-Allow-Credentials', 'true');\n    }\n\n    if (corsConfig.maxAge) {\n      headers.set('Access-Control-Max-Age', String(corsConfig.maxAge));\n    }\n  }\n\n  return headers;\n}\n\nexport const TRANSPARENT_GIF_BASE64 =\n  'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\nexport function createPixelResponse(corsHeaders?: Headers): Response {\n  const binaryString = atob(TRANSPARENT_GIF_BASE64);\n  const bytes = new Uint8Array(binaryString.length);\n  for (let i = 0; i < binaryString.length; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n\n  const headers = new Headers(corsHeaders);\n  headers.set('Content-Type', 'image/gif');\n  headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');\n\n  return new Response(bytes, { status: 200, headers });\n}\n\nexport function createJsonResponse(\n  body: unknown,\n  status = 200,\n  corsHeaders?: Headers,\n): Response {\n  const headers = new Headers(corsHeaders);\n  headers.set('Content-Type', 'application/json');\n\n  return new Response(JSON.stringify(body), { status, headers });\n}\n\n/**\n * Match a request pathname against a route pattern.\n * Supports exact matches and wildcard patterns (e.g., /api/*).\n */\nexport function matchPath(requestPath: string, pattern: string): boolean {\n  if (pattern.endsWith('/*')) {\n    const prefix = pattern.slice(0, -2);\n    return requestPath === prefix || requestPath.startsWith(prefix + '/');\n  }\n  return requestPath === pattern;\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n  SettingsSchema,\n  CorsOptionsSchema,\n  RouteConfigSchema,\n} from './schemas';\nimport type { z } from '@walkeros/core/dev';\n\ndeclare module '@walkeros/core' {\n  interface SourceMap {\n    fetch: { type: 'fetch'; platform: 'server' };\n  }\n}\n\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\nexport type RouteConfig = z.infer<typeof RouteConfigSchema>;\nexport type RouteMethod = 'GET' | 'POST';\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = (request: Request) => Response | Promise<Response>;\n\nexport interface Env extends CoreSource.Env {\n  request?: Request;\n}\n\nexport type Types = CoreSource.Types<\n  Settings,\n  Mapping,\n  Push,\n  Env,\n  InitSettings\n>;\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\nexport interface FetchSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n  push: Push;\n}\n\nexport interface EventResponse {\n  success: boolean;\n  id?: string;\n  timestamp?: number;\n  error?: string;\n}\n"],"mappings":"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","names":["result"]}