@walkeros/server-source-aws 4.0.1-next-1778284185788 → 4.0.2

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/types.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts","../src/sqs/index.ts","../src/sqs/decoder.ts","../src/sqs/config.ts","../src/sqs/setup.ts","../src/sqs/types.ts"],"sourcesContent":["export * from './lambda';\nexport { default as sourceLambda } from './lambda';\nexport { default as sourceSqs } from './sqs';\nexport * as SourceSqs from './sqs/types';\n","import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\n\nexport * as SourceLambda from './types';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const userSettings = config.settings || {};\n const settings = {\n ...userSettings,\n cors: userSettings.cors ?? true,\n timeout: userSettings.timeout ?? 30000,\n enablePixelTracking: userSettings.enablePixelTracking ?? true,\n healthPath: userSettings.healthPath ?? '/health',\n };\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n // If body is not a valid object, push {} to let source.before transformers handle raw input via ingest\n if (!body || typeof body !== 'object') {\n await envPush({});\n return createResponse(\n 200,\n { success: true, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport type { z } from '@walkeros/core/dev';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n lambda: { type: 'lambda'; platform: 'server' };\n }\n}\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\n","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n warn: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noopFn,\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const lambdaPost: Flow.StepExample = {\n title: 'Lambda POST',\n description:\n 'An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'POST', path: '/collect' },\n requestId: 'req-123',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\n title: 'API Gateway v1 POST',\n description:\n 'A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n httpMethod: 'POST',\n path: '/collect',\n requestContext: {\n requestId: 'req-789',\n identity: { sourceIp: '203.0.113.42' },\n },\n queryStringParameters: null,\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const lambdaGet: Flow.StepExample = {\n title: 'Lambda GET',\n description:\n 'An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.',\n trigger: { type: 'GET' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'GET', path: '/collect' },\n requestId: 'req-456',\n },\n rawQueryString: 'e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n e: 'page view',\n d: '{\"title\":\"Home\"}',\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport type { LambdaEvent, LambdaContext, LambdaResult } from '../types';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n [key: string]: unknown;\n}\n\nexport interface Result {\n statusCode: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\n/**\n * Find the lambda source instance from the collector's registered sources.\n */\nfunction findLambdaSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'lambda') return source;\n }\n}\n\n/**\n * Lambda source createTrigger.\n *\n * Boots the collector via startFlow, then invokes the Lambda source's push()\n * with a real API Gateway event and a minimal Lambda context.\n *\n * Content is the raw Lambda event object (API Gateway v1 or v2 format).\n * Result contains statusCode, parsed body, and headers.\n *\n * @example\n * const { trigger, flow } = await createTrigger(config);\n * const result = await trigger('POST')({ version: '2.0', ... });\n * console.log(result.statusCode, result.body);\n */\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n // Lazy startFlow\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findLambdaSource(flow.collector);\n if (!source) throw new Error('Lambda source not found in collector');\n\n // Create minimal Lambda context\n const lambdaContext = {\n awsRequestId: `test-${Date.now()}`,\n } as unknown as LambdaContext;\n\n // Call source.push with the raw Lambda event + context\n const pushFn = (\n source as unknown as {\n push: (...args: unknown[]) => Promise<LambdaResult>;\n }\n ).push;\n const lambdaResult = await pushFn(\n content as unknown as LambdaEvent,\n lambdaContext,\n );\n\n // Parse response\n let body: unknown;\n try {\n body = JSON.parse(lambdaResult.body || '{}');\n } catch {\n body = lambdaResult.body;\n }\n\n const headers: Record<string, string> = {};\n if (lambdaResult.headers) {\n for (const [k, v] of Object.entries(lambdaResult.headers)) {\n if (v !== undefined) headers[k] = String(v);\n }\n }\n\n return {\n statusCode: lambdaResult.statusCode,\n body,\n headers,\n };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/**\n * Legacy trigger — takes a source instance directly.\n * Preserved for CLI simulate path.\n */\nfunction trigger(source: {\n push: (event: LambdaEvent, context: LambdaContext) => Promise<LambdaResult>;\n}): (content: Content) => Promise<LambdaResult> {\n return async (content: Content) => {\n const lambdaEvent = { ...(content as Record<string, unknown>) };\n\n // Adapt body format: step examples may use `name`, source expects `event`\n if (lambdaEvent.body && typeof lambdaEvent.body === 'string') {\n const body = JSON.parse(lambdaEvent.body);\n if (body.name && !body.event) {\n lambdaEvent.body = JSON.stringify({\n ...body,\n event: body.name,\n name: undefined,\n });\n }\n }\n\n const context: LambdaContext = {\n awsRequestId: 'test-req',\n } as unknown as LambdaContext;\n\n return source.push(lambdaEvent as unknown as LambdaEvent, context);\n };\n}\n\nexport { createTrigger, trigger };\n","import {\n DeleteMessageCommand,\n GetQueueAttributesCommand,\n GetQueueUrlCommand,\n ReceiveMessageCommand,\n SQSClient,\n} from '@aws-sdk/client-sqs';\nimport type { Collector, Logger, Source, WalkerOS } from '@walkeros/core';\nimport type {\n Settings,\n SyntheticMessage,\n SyntheticPushResult,\n Types,\n} from './types';\nimport { decodeBody, DecoderError } from './decoder';\nimport { getConfig } from './config';\nimport { setup } from './setup';\n\nexport { setup } from './setup';\n\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30000;\nconst RECEIVE_RETRY_BACKOFF_MS = 1000;\n\ninterface MessageDispatch {\n id: string;\n body: string;\n receiptHandle?: string;\n ack(): Promise<void>;\n nack(): Promise<void>;\n}\n\nfunction toDeepPartialEvent(value: unknown): WalkerOS.DeepPartialEvent {\n if (typeof value === 'object' && value !== null) {\n // Plain object payloads pass through. The collector treats them as\n // DeepPartialEvent shapes; downstream transformers see the same data.\n return value as WalkerOS.DeepPartialEvent;\n }\n if (typeof value === 'string') return { data: { payload: value } };\n if (Buffer.isBuffer(value))\n return { data: { payload: value.toString('base64') } };\n return { data: { payload: String(value) } };\n}\n\nasync function handleMessage(args: {\n message: MessageDispatch;\n settings: Settings;\n pushFn: Collector.PushFn;\n logger: Logger.Instance;\n}): Promise<void> {\n const { message, settings, pushFn, logger } = args;\n try {\n const decoded = decodeBody(\n message.id,\n message.body,\n settings.decoder ?? 'json',\n );\n if (decoded === null || decoded === undefined) {\n logger.debug('SQS message acked-and-dropped (decoder returned null)', {\n id: message.id,\n });\n await message.ack();\n return;\n }\n await pushFn(toDeepPartialEvent(decoded));\n await message.ack();\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n if (err instanceof DecoderError) {\n logger.error('SQS message decode failed', { id: message.id, error });\n } else {\n logger.error('SQS message handler failed', { id: message.id, error });\n }\n if (settings.onPushError === 'ack') await message.ack();\n else await message.nack();\n }\n}\n\nfunction isQueueDoesNotExist(err: unknown): boolean {\n if (typeof err !== 'object' || err === null) return false;\n if (!('name' in err)) return false;\n const obj: { name?: unknown } = err;\n return (\n obj.name === 'QueueDoesNotExist' ||\n obj.name === 'AWS.SimpleQueueService.NonExistentQueue'\n );\n}\n\ninterface ClientWithDestroy {\n destroy?: () => void;\n}\n\nfunction tryDestroyClient(client: SQSClient, logger: Logger.Instance): void {\n // SQSClient implements destroy() in modern SDK versions; older versions\n // do not. Wrap defensively.\n const candidate: ClientWithDestroy = client;\n if (typeof candidate.destroy !== 'function') return;\n try {\n candidate.destroy();\n } catch (err) {\n logger.debug('SQS client destroy failed (non-fatal)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\ninterface FetchedMessage {\n MessageId: string;\n ReceiptHandle: string;\n Body: string;\n}\n\nfunction isFetchedMessage(value: unknown): value is FetchedMessage {\n if (typeof value !== 'object' || value === null) return false;\n const obj: {\n MessageId?: unknown;\n ReceiptHandle?: unknown;\n Body?: unknown;\n } = value;\n return (\n typeof obj.MessageId === 'string' &&\n typeof obj.ReceiptHandle === 'string' &&\n typeof obj.Body === 'string'\n );\n}\n\n/**\n * AWS SQS source.\n *\n * Long-running poll-and-forward subscriber. init() validates the queue exists,\n * captures the canonical queueUrl, and starts the long-poll loop as a\n * background task. push() accepts an optional synthetic message (used by\n * tests / triggers) and dispatches it through the same handler the loop uses;\n * called without arguments (production) it is a no-op since SQS is event-driven.\n *\n * destroy() stops the loop, drains in-flight handlers, and force-closes after\n * shutdownTimeoutMs (default 30000).\n */\nexport const sourceSqs: Source.Init<Types> = async (context) => {\n const { config: partialConfig = {}, env, logger, id } = context;\n const config = getConfig(partialConfig, env, logger);\n const settings: Settings = config.settings;\n\n // Resolve queueUrl from queueName at init time.\n if (!settings.queueUrl) {\n try {\n const res = await settings.client.send(\n new GetQueueUrlCommand({ QueueName: settings.queueName }),\n );\n if (!res.QueueUrl) {\n return logger.throw(\n `SQS queue not found: ${settings.queueName}. ` +\n `Run \"walkeros setup source.${id}\" to create it.`,\n );\n }\n settings.queueUrl = res.QueueUrl;\n } catch (err) {\n if (isQueueDoesNotExist(err)) {\n return logger.throw(\n `SQS queue not found: ${settings.queueName}. ` +\n `Run \"walkeros setup source.${id}\" to create it.`,\n );\n }\n throw err;\n }\n }\n\n // Capture queueArn for downstream use (e.g. SNS subscription verification).\n if (!settings.queueArn) {\n try {\n const res = await settings.client.send(\n new GetQueueAttributesCommand({\n QueueUrl: settings.queueUrl,\n AttributeNames: ['QueueArn'],\n }),\n );\n settings.queueArn = res.Attributes?.QueueArn;\n } catch (err) {\n // ARN is informational; continue without it.\n logger.debug('SQS GetQueueAttributesCommand failed (non-fatal)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Long-poll loop control flag and in-flight tracker.\n let stopped = false;\n const inFlight = new Set<Promise<void>>();\n\n const loop = async (): Promise<void> => {\n while (!stopped) {\n try {\n const res = await settings.client.send(\n new ReceiveMessageCommand({\n QueueUrl: settings.queueUrl,\n MaxNumberOfMessages: settings.maxMessages ?? 10,\n WaitTimeSeconds: settings.waitTimeSeconds ?? 20,\n VisibilityTimeout: settings.visibilityTimeout,\n MessageAttributeNames: ['All'],\n AttributeNames: ['All'],\n }),\n );\n const messages = res.Messages ?? [];\n for (const msg of messages) {\n if (!isFetchedMessage(msg)) {\n logger.warn('SQS received malformed message; skipping', {\n messageId:\n typeof msg.MessageId === 'string' ? msg.MessageId : undefined,\n });\n continue;\n }\n const fetched: FetchedMessage = msg;\n const dispatch: MessageDispatch = {\n id: fetched.MessageId,\n body: fetched.Body,\n receiptHandle: fetched.ReceiptHandle,\n ack: async () => {\n await settings.client.send(\n new DeleteMessageCommand({\n QueueUrl: settings.queueUrl ?? '',\n ReceiptHandle: fetched.ReceiptHandle,\n }),\n );\n },\n nack: async () => {\n // SQS has no explicit nack: skipping DeleteMessage causes\n // redelivery after VisibilityTimeout expires.\n },\n };\n const handler = handleMessage({\n message: dispatch,\n settings,\n pushFn: env.push,\n logger,\n });\n inFlight.add(handler);\n handler.finally(() => {\n inFlight.delete(handler);\n });\n }\n } catch (err) {\n if (stopped) break;\n const error = err instanceof Error ? err.message : String(err);\n if (isQueueDoesNotExist(err)) {\n logger.error(\n `SQS queue \"${settings.queueName}\" not found at runtime. ` +\n `Run \"walkeros setup source.${id}\" to create it. Original: ${error}`,\n );\n // Stop the loop on a fatal error; operator must intervene.\n stopped = true;\n break;\n }\n logger.error('SQS receive error (will retry)', { error });\n // Backoff before retry to avoid tight-looping on persistent errors.\n await new Promise((r) => setTimeout(r, RECEIVE_RETRY_BACKOFF_MS));\n }\n }\n };\n\n // Launch the loop without awaiting so init returns immediately. Track the\n // promise so destroy() can await it before resolving (prevents leaked\n // timers in test runs).\n const loopPromise = loop();\n\n return {\n type: 'sqs',\n config,\n setup,\n push: async (\n content?: SyntheticMessage,\n ): Promise<SyntheticPushResult | void> => {\n if (!content) return;\n const result: SyntheticPushResult = { acked: false, nacked: false };\n await handleMessage({\n message: {\n id: content.MessageId,\n body: content.Body,\n receiptHandle: content.ReceiptHandle,\n ack: async () => {\n result.acked = true;\n },\n nack: async () => {\n result.nacked = true;\n },\n },\n settings,\n pushFn: env.push,\n logger,\n });\n return result;\n },\n destroy: async () => {\n stopped = true;\n const timeoutMs =\n settings.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;\n let timer: NodeJS.Timeout | undefined;\n try {\n await Promise.race([\n (async () => {\n // Wait for the loop to exit AND in-flight handlers to drain.\n await loopPromise;\n await Promise.all(Array.from(inFlight));\n })(),\n new Promise<void>((resolve) => {\n timer = setTimeout(() => {\n logger.warn(\n `SQS source close timed out after ${timeoutMs}ms; forcing close.`,\n );\n resolve();\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n tryDestroyClient(settings.client, logger);\n }\n },\n };\n};\n\nexport default sourceSqs;\n","import type { Decoder } from './types';\n\nexport class DecoderError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DecoderError';\n }\n}\n\n/**\n * Decode an SQS message body string.\n *\n * - 'json': JSON.parse(body). Throws DecoderError on parse failure.\n * - 'text': body returned as-is.\n * - 'raw': Buffer.from(body, 'utf8').\n */\nexport function decodeBody(\n messageId: string,\n body: string,\n decoder: Decoder,\n): unknown {\n if (decoder === 'raw') return Buffer.from(body, 'utf8');\n if (decoder === 'text') return body;\n // json\n try {\n return JSON.parse(body);\n } catch (err) {\n throw new DecoderError(\n `SQS message ${messageId} JSON decode failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n}\n","import { SQSClient } from '@aws-sdk/client-sqs';\nimport type { Logger } from '@walkeros/core';\nimport type {\n Config,\n Env,\n InitSettings,\n PartialConfig,\n Settings,\n} from './types';\n\nconst DEFAULT_REGION = 'eu-central-1';\nconst DEFAULT_DECODER = 'json' as const;\nconst DEFAULT_MAX_MESSAGES = 10;\nconst DEFAULT_WAIT_TIME = 20;\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30000;\nconst DEFAULT_ON_PUSH_ERROR = 'nack' as const;\n\n/**\n * Runtime config with the narrow Settings shape (all defaults applied).\n *\n * The framework's `Source.Config` types `settings` as `InitSettings | undefined`;\n * this alias reflects the post-getConfig invariant where settings is fully\n * resolved and the SQSClient handle is built.\n */\nexport type RuntimeConfig = Omit<Config, 'settings'> & { settings: Settings };\n\n/**\n * Validate and normalize the partial config into a runtime Config.\n *\n * The client is built once: prefer pre-supplied `settings.client`, then env-\n * injected constructor (tests/DI), then the static SDK import. `Settings.client`\n * is always populated before init/destroy run.\n */\nexport function getConfig(\n partial: PartialConfig = {},\n env: Env | undefined,\n logger: Logger.Instance,\n): RuntimeConfig {\n const empty: Partial<InitSettings> = {};\n const partialSettings: Partial<InitSettings> = partial.settings ?? empty;\n const queueName =\n typeof partialSettings.queueName === 'string'\n ? partialSettings.queueName\n : '';\n if (!queueName) logger.throw('Config settings queueName missing');\n\n const region = partialSettings.region ?? DEFAULT_REGION;\n\n let client = partialSettings.client;\n if (!client) {\n const Constructor = env?.AWS?.SQSClient ?? SQSClient;\n client = new Constructor({ region, ...partialSettings.config });\n }\n\n const settings: Settings = {\n ...partialSettings,\n client,\n queueName,\n region,\n queueUrl: partialSettings.queueUrl,\n config: partialSettings.config,\n decoder: partialSettings.decoder ?? DEFAULT_DECODER,\n maxMessages: partialSettings.maxMessages ?? DEFAULT_MAX_MESSAGES,\n waitTimeSeconds: partialSettings.waitTimeSeconds ?? DEFAULT_WAIT_TIME,\n visibilityTimeout: partialSettings.visibilityTimeout,\n shutdownTimeoutMs:\n partialSettings.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS,\n onPushError: partialSettings.onPushError ?? DEFAULT_ON_PUSH_ERROR,\n };\n\n return { ...partial, settings };\n}\n","import {\n CreateQueueCommand,\n GetQueueAttributesCommand,\n SQSClient,\n} from '@aws-sdk/client-sqs';\nimport { SNSClient, SubscribeCommand } from '@aws-sdk/client-sns';\nimport type { Logger } from '@walkeros/core';\nimport { resolveSetup } from '@walkeros/core';\nimport type { Config, Env, Setup, SetupFn } from './types';\n\nconst DEFAULT_REGION = 'eu-central-1';\nconst DEFAULT_VISIBILITY_TIMEOUT_SECONDS = 30;\nconst DEFAULT_MESSAGE_RETENTION_SECONDS = 345600;\nconst DEFAULT_MAXIMUM_MESSAGE_SIZE = 262144;\nconst DEFAULT_DLQ_MAX_RECEIVE_COUNT = 5;\nconst DLQ_RETENTION_SECONDS = 1209600; // 14 days, AWS max\n\nexport const DEFAULT_SETUP: Setup = {\n region: DEFAULT_REGION,\n fifoQueue: false,\n visibilityTimeoutSeconds: DEFAULT_VISIBILITY_TIMEOUT_SECONDS,\n messageRetentionSeconds: DEFAULT_MESSAGE_RETENTION_SECONDS,\n maximumMessageSize: DEFAULT_MAXIMUM_MESSAGE_SIZE,\n};\n\nexport interface SetupResult {\n queueCreated: boolean;\n queueUrl: string;\n queueArn: string;\n dlqCreated?: boolean;\n dlqArn?: string;\n subscriptionArn?: string;\n}\n\ninterface QueueExistsError {\n name: string;\n}\n\nfunction hasName(err: unknown): err is QueueExistsError {\n if (typeof err !== 'object' || err === null) return false;\n const obj: { name?: unknown } = err;\n return typeof obj.name === 'string';\n}\n\nfunction isQueueNameExists(err: unknown): boolean {\n if (!hasName(err)) return false;\n return (\n err.name === 'QueueNameExists' ||\n err.name === 'QueueAlreadyExists' ||\n err.name === 'AWS.SimpleQueueService.QueueNameExists'\n );\n}\n\ninterface BuildQueueAttributesArgs {\n options: Setup;\n dlqArn: string | undefined;\n queuePolicy: string | undefined;\n}\n\nfunction buildQueueAttributes(\n args: BuildQueueAttributesArgs,\n): Record<string, string> {\n const { options, dlqArn, queuePolicy } = args;\n const attrs: Record<string, string> = {};\n attrs.VisibilityTimeout = String(\n options.visibilityTimeoutSeconds ?? DEFAULT_VISIBILITY_TIMEOUT_SECONDS,\n );\n attrs.MessageRetentionPeriod = String(\n options.messageRetentionSeconds ?? DEFAULT_MESSAGE_RETENTION_SECONDS,\n );\n attrs.MaximumMessageSize = String(\n options.maximumMessageSize ?? DEFAULT_MAXIMUM_MESSAGE_SIZE,\n );\n if (options.kmsMasterKeyId) {\n attrs.KmsMasterKeyId = options.kmsMasterKeyId;\n }\n if (options.fifoQueue) {\n attrs.FifoQueue = 'true';\n attrs.ContentBasedDeduplication = 'true';\n }\n if (dlqArn) {\n const maxReceiveCount =\n options.deadLetterQueue?.maxReceiveCount ?? DEFAULT_DLQ_MAX_RECEIVE_COUNT;\n attrs.RedrivePolicy = JSON.stringify({\n deadLetterTargetArn: dlqArn,\n maxReceiveCount,\n });\n }\n if (queuePolicy) {\n attrs.Policy = queuePolicy;\n }\n return attrs;\n}\n\nfunction buildDlqAttributes(args: {\n fifoQueue: boolean;\n kmsMasterKeyId?: string;\n}): Record<string, string> {\n const attrs: Record<string, string> = {};\n attrs.MessageRetentionPeriod = String(DLQ_RETENTION_SECONDS);\n if (args.kmsMasterKeyId) {\n attrs.KmsMasterKeyId = args.kmsMasterKeyId;\n }\n if (args.fifoQueue) {\n attrs.FifoQueue = 'true';\n attrs.ContentBasedDeduplication = 'true';\n }\n return attrs;\n}\n\nfunction buildDlqTags(\n parentTags: Record<string, string> | undefined,\n): Record<string, string> {\n return {\n ...(parentTags ?? {}),\n walkerOS: 'dlq',\n };\n}\n\ninterface BuildPolicyArgs {\n sourceId: string;\n topicArn: string;\n}\n\nfunction buildSnsQueuePolicy(args: BuildPolicyArgs): string {\n // Placeholder Resource value; AWS does not require it to match the actual\n // queue ARN at policy-attach time when the queue is being created in the\n // same call. The Sid keys the statement so re-runs upsert in place.\n return JSON.stringify({\n Version: '2012-10-17',\n Statement: [\n {\n Sid: `walkerOSAllowSNSPublish-${args.sourceId}`,\n Effect: 'Allow',\n Principal: { Service: 'sns.amazonaws.com' },\n Action: 'SQS:SendMessage',\n Resource: '*',\n Condition: {\n ArnEquals: {\n 'aws:SourceArn': args.topicArn,\n },\n },\n },\n ],\n });\n}\n\ninterface EnsureQueueArgs {\n sqs: SQSClient;\n logger: Logger.Instance;\n queueName: string;\n attributes: Record<string, string>;\n tags?: Record<string, string>;\n}\n\ninterface EnsureQueueResult {\n queueCreated: boolean;\n queueUrl: string;\n queueArn: string;\n}\n\n/**\n * Authoritative-apply: a single CreateQueueCommand with the full declared\n * attribute map and tags. AWS treats identical inputs as success; on\n * QueueNameExists (different attrs) we hard-fail with an actionable message.\n * Setup never calls SetQueueAttributesCommand.\n */\nasync function ensureQueue(args: EnsureQueueArgs): Promise<EnsureQueueResult> {\n const { sqs, logger, queueName, attributes, tags } = args;\n let queueUrl: string;\n let queueCreated = false;\n try {\n const res = await sqs.send(\n new CreateQueueCommand({\n QueueName: queueName,\n Attributes: attributes,\n tags,\n }),\n );\n queueUrl = res.QueueUrl ?? '';\n queueCreated = true;\n logger.info(`SQS queue \"${queueName}\" created.`);\n } catch (err) {\n if (isQueueNameExists(err)) {\n const message = err instanceof Error ? err.message : String(err);\n return logger.throw(\n `SQS queue \"${queueName}\" exists with different attributes (${message}). ` +\n `Setup will not mutate an existing queue's attributes. Delete or rename the queue, then re-run setup.`,\n );\n }\n throw err;\n }\n if (!queueUrl) {\n return logger.throw(\n `SQS CreateQueueCommand returned no QueueUrl for \"${queueName}\".`,\n );\n }\n // Fetch QueueArn for downstream Subscribe / RedrivePolicy use.\n const attrsRes = await sqs.send(\n new GetQueueAttributesCommand({\n QueueUrl: queueUrl,\n AttributeNames: ['QueueArn'],\n }),\n );\n const queueArn = attrsRes.Attributes?.QueueArn ?? '';\n if (!queueArn) {\n return logger.throw(\n `SQS GetQueueAttributesCommand returned no QueueArn for \"${queueName}\".`,\n );\n }\n return { queueCreated, queueUrl, queueArn };\n}\n\nfunction dlqName(queueName: string, fifo: boolean): string {\n if (fifo) {\n // FIFO queue names must end in .fifo. Strip the suffix if present, append -dlq, then re-add.\n const base = queueName.endsWith('.fifo')\n ? queueName.slice(0, -'.fifo'.length)\n : queueName;\n return `${base}-dlq.fifo`;\n }\n return `${queueName}-dlq`;\n}\n\nexport const setup: SetupFn = async (context) => {\n const { id, config, env, logger } = context;\n\n const merged = resolveSetup<Setup>(config.setup, DEFAULT_SETUP);\n if (!merged) {\n logger.debug('SQS source setup skipped (config.setup is falsy).');\n return undefined;\n }\n const options: Setup = { ...DEFAULT_SETUP, ...merged };\n\n const settings = config.settings;\n if (!settings) return logger.throw('setup: settings missing');\n\n const queueName = settings.queueName;\n if (!queueName) return logger.throw('setup: settings.queueName is missing');\n\n const region = options.region ?? DEFAULT_REGION;\n\n // Construct clients via env override (tests) or static SDK import (prod).\n const SqsCtor = env.AWS?.SQSClient ?? SQSClient;\n const sqs = new SqsCtor({ region });\n\n // 1. Optional DLQ first (so we have its ARN for RedrivePolicy on the main queue).\n let dlqArn: string | undefined;\n let dlqCreated = false;\n if (options.deadLetterQueue?.arn) {\n dlqArn = options.deadLetterQueue.arn;\n } else if (options.deadLetterQueue?.create) {\n const dlqResult = await ensureQueue({\n sqs,\n logger,\n queueName: dlqName(queueName, options.fifoQueue ?? false),\n attributes: buildDlqAttributes({\n fifoQueue: options.fifoQueue ?? false,\n kmsMasterKeyId: options.kmsMasterKeyId,\n }),\n tags: buildDlqTags(options.tags),\n });\n dlqArn = dlqResult.queueArn;\n dlqCreated = dlqResult.queueCreated;\n }\n\n // 2. Main queue.\n const finalQueueName = options.fifoQueue\n ? queueName.endsWith('.fifo')\n ? queueName\n : `${queueName}.fifo`\n : queueName;\n const queuePolicy = options.subscribeToSnsTopic\n ? buildSnsQueuePolicy({\n sourceId: id,\n topicArn: options.subscribeToSnsTopic.topicArn,\n })\n : undefined;\n\n const mainAttrs = buildQueueAttributes({\n options,\n dlqArn,\n queuePolicy,\n });\n const mainResult = await ensureQueue({\n sqs,\n logger,\n queueName: finalQueueName,\n attributes: mainAttrs,\n tags: options.tags,\n });\n\n // 3. Optional SNS subscription.\n let subscriptionArn: string | undefined;\n if (options.subscribeToSnsTopic) {\n const SnsCtor = env.AWS?.SNSClient ?? SNSClient;\n const sns = new SnsCtor({ region });\n const subAttrs: Record<string, string> = {};\n if (options.subscribeToSnsTopic.rawMessageDelivery) {\n subAttrs.RawMessageDelivery = 'true';\n }\n if (options.subscribeToSnsTopic.filterPolicy) {\n subAttrs.FilterPolicy = JSON.stringify(\n options.subscribeToSnsTopic.filterPolicy,\n );\n }\n const subscribeRes = await sns.send(\n new SubscribeCommand({\n TopicArn: options.subscribeToSnsTopic.topicArn,\n Protocol: 'sqs',\n Endpoint: mainResult.queueArn,\n Attributes: Object.keys(subAttrs).length > 0 ? subAttrs : undefined,\n ReturnSubscriptionArn: true,\n }),\n );\n subscriptionArn = subscribeRes.SubscriptionArn ?? undefined;\n logger.info('SQS source setup: SNS subscription created', {\n topicArn: options.subscribeToSnsTopic.topicArn,\n subscriptionArn,\n });\n }\n\n const result: SetupResult = {\n queueCreated: mainResult.queueCreated,\n queueUrl: mainResult.queueUrl,\n queueArn: mainResult.queueArn,\n dlqCreated: dlqArn ? dlqCreated : undefined,\n dlqArn,\n subscriptionArn,\n };\n return result;\n};\n","import type {\n Source as CoreSource,\n SetupFn as CoreSetupFn,\n} from '@walkeros/core';\nimport type {\n SQSClient,\n SQSClientConfig,\n Message,\n ReceiveMessageCommand,\n DeleteMessageCommand,\n CreateQueueCommand,\n GetQueueUrlCommand,\n GetQueueAttributesCommand,\n} from '@aws-sdk/client-sqs';\nimport type { SNSClient, SubscribeCommand } from '@aws-sdk/client-sns';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n sqs: { type: 'sqs'; platform: 'server' };\n }\n}\n\nexport type Decoder = 'json' | 'text' | 'raw';\n\nexport interface Settings {\n // User-supplied OR populated by getConfig(); single field for both. Mirrors the Pub/Sub pull source.\n client: SQSClient;\n // Required. Used by setup to provision and by init to resolve the URL.\n queueName: string;\n // AWS region. Default: 'eu-central-1'.\n region?: string;\n // Optional pre-resolved URL. When unset, init resolves via GetQueueUrlCommand.\n queueUrl?: string;\n // SDK client config (credentials, etc.). Optional.\n config?: SQSClientConfig;\n // Decoder for message body. Default: 'json'.\n decoder?: Decoder;\n // Receive batch size. Cap 10, default 10.\n maxMessages?: number;\n // Long-poll duration in seconds. Cap 20, default 20.\n waitTimeSeconds?: number;\n // Per-receive visibility timeout override. Default: queue's configured value.\n visibilityTimeout?: number;\n // Graceful shutdown timeout in ms. Default: 30000.\n shutdownTimeoutMs?: number;\n // Error policy: 'ack' (DeleteMessage to drop) or 'nack' (no DeleteMessage, redeliver). Default: 'nack'.\n onPushError?: 'nack' | 'ack';\n // Runtime-only handle populated by init(); not user-facing.\n queueArn?: string;\n}\n\nexport interface InitSettings {\n queueName: string;\n client?: SQSClient;\n region?: string;\n queueUrl?: string;\n config?: SQSClientConfig;\n decoder?: Decoder;\n maxMessages?: number;\n waitTimeSeconds?: number;\n visibilityTimeout?: number;\n shutdownTimeoutMs?: number;\n onPushError?: 'nack' | 'ack';\n}\n\n// Mapping has no per-event fields in v1: SQS messages have no native ordering\n// key, no per-event visibility-extension API, no per-event delete strategy that\n// SQS itself consumes. Future per-event fields will be introduced when a real\n// feature needs them.\nexport interface Mapping {\n // Reserved for future use.\n}\n\n/**\n * Synthetic message input used by tests / triggers to dispatch through the\n * same handler the long-poll loop uses, without involving real SQS.\n *\n * In production, push() is invoked without arguments and is a no-op:\n * SQS is event-driven, the long-poll loop is the canonical delivery path.\n * Tests pass a synthetic input to dispatch directly.\n */\nexport interface SyntheticMessage {\n MessageId: string;\n Body: string;\n ReceiptHandle?: string;\n Attributes?: Record<string, string>;\n MessageAttributes?: Record<\n string,\n { DataType: string; StringValue?: string }\n >;\n}\n\nexport interface SyntheticPushResult {\n acked: boolean;\n nacked: boolean;\n}\n\nexport type Push = (\n content?: SyntheticMessage,\n) => Promise<SyntheticPushResult | void>;\n\nexport interface Env extends CoreSource.Env {\n AWS?: {\n SQSClient: typeof SQSClient;\n ReceiveMessageCommand: typeof ReceiveMessageCommand;\n DeleteMessageCommand: typeof DeleteMessageCommand;\n CreateQueueCommand: typeof CreateQueueCommand;\n GetQueueUrlCommand: typeof GetQueueUrlCommand;\n GetQueueAttributesCommand: typeof GetQueueAttributesCommand;\n // SNS used by setup only when subscribeToSnsTopic is set.\n SNSClient?: typeof SNSClient;\n SubscribeCommand?: typeof SubscribeCommand;\n };\n}\n\n/**\n * Provisioning options for `walkeros setup source.<id>`.\n *\n * Triggered only by the explicit CLI command. Idempotent. Never auto-run.\n *\n * `queueName` lives in Settings (one source of truth for setup AND runtime poll).\n */\nexport interface Setup {\n /** AWS region. Default: 'eu-central-1'. */\n region?: string;\n /** FIFO queue with content-based deduplication. Default: false. */\n fifoQueue?: boolean;\n /** Visibility timeout in seconds. Default: 30. */\n visibilityTimeoutSeconds?: number;\n /** Message retention period in seconds. Default: 345600 (4 days). */\n messageRetentionSeconds?: number;\n /** Max message size in bytes. Default: 262144 (256 KB). */\n maximumMessageSize?: number;\n /** KMS key for at-rest encryption. Optional. */\n kmsMasterKeyId?: string;\n /** Optional dead-letter queue. */\n deadLetterQueue?: {\n /** ARN of an existing DLQ. Mutually exclusive with `create: true`. */\n arn?: string;\n /** Create a sibling DLQ named <queueName>-dlq. Default: false. */\n create?: boolean;\n /** Max receive count before message goes to DLQ. Default: 5. */\n maxReceiveCount?: number;\n };\n /** Tags applied to the queue (and inherited by an auto-created DLQ). */\n tags?: Record<string, string>;\n /** Optional: subscribe this queue to an SNS topic. Creates SNS subscription + queue policy. */\n subscribeToSnsTopic?: {\n /** Topic ARN to subscribe to. Required. */\n topicArn: string;\n /** Deliver SNS messages without the SNS envelope. Default: false. */\n rawMessageDelivery?: boolean;\n /** SNS filter policy (subscription-time message filtering). */\n filterPolicy?: Record<string, unknown>;\n };\n}\n\n// Source.Types has 6 slots: <Settings, Mapping, Push, Env, InitSettings, Setup>.\n// Setup MUST be in slot 6; mis-positioning silently demotes Config['setup'] to unknown.\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings,\n Setup\n>;\n\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\nexport type SetupFn = CoreSetupFn<Config, Env>;\n\n// Re-export SDK types used in this package's public surface.\nexport type { SQSClient, SQSClientConfig, Message, SNSClient };\n"],"mappings":"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","names":["types_exports","import_core","push","trigger","k","v","push","context","import_client_sqs","import_client_sqs","import_core","DEFAULT_REGION","DEFAULT_SHUTDOWN_TIMEOUT_MS","r","types_exports"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lambda/index.ts","../src/lambda/utils.ts","../src/lambda/push.ts","../src/lambda/types.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts","../src/sqs/index.ts","../src/sqs/decoder.ts","../src/sqs/config.ts","../src/sqs/setup.ts","../src/sqs/types.ts"],"sourcesContent":["export * from './lambda';\nexport { default as sourceLambda } from './lambda';\nexport { default as sourceSqs } from './sqs';\nexport * as SourceSqs from './sqs/types';\n","import type { LambdaSource, EventRequest, Types } from './types';\nimport type { Source } from '@walkeros/core';\nimport { requestToData } from '@walkeros/core';\nimport {\n parseEvent,\n parseBody,\n isEventRequest,\n getCorsHeaders,\n createResponse,\n createPixelResponse,\n getPath,\n} from './utils';\nimport { processEvent } from './push';\n\nexport * as SourceLambda from './types';\n\n// Export examples\nexport * as examples from './examples';\n\nexport const sourceLambda: Source.Init<Types> = async (context) => {\n const { config = {}, env, setIngest } = context;\n const { push: envPush } = env;\n\n const userSettings = config.settings || {};\n const settings = {\n ...userSettings,\n cors: userSettings.cors ?? true,\n timeout: userSettings.timeout ?? 30000,\n enablePixelTracking: userSettings.enablePixelTracking ?? true,\n healthPath: userSettings.healthPath ?? '/health',\n };\n\n const fullConfig: Source.Config<Types> = {\n ...config,\n settings,\n };\n\n const push: Types['push'] = async (event, context) => {\n const requestId = context.awsRequestId;\n let parsed;\n\n try {\n const corsHeaders = getCorsHeaders(settings.cors || false);\n parsed = parseEvent(event);\n const path = getPath(event);\n\n // Health check\n if (settings.healthPath && path === settings.healthPath) {\n return createResponse(\n 200,\n {\n status: 'ok',\n timestamp: Date.now(),\n source: 'lambda',\n requestId,\n },\n corsHeaders,\n requestId,\n );\n }\n\n // Handle OPTIONS for CORS preflight\n if (parsed.method === 'OPTIONS') {\n return createResponse(204, '', corsHeaders, requestId);\n }\n\n // Extract ingest metadata from Lambda event (if config.ingest is defined)\n await setIngest(event);\n\n // Handle GET for pixel tracking\n if (parsed.method === 'GET') {\n if (!settings.enablePixelTracking) {\n return createResponse(\n 405,\n { success: false, error: 'GET not allowed', requestId },\n corsHeaders,\n requestId,\n );\n }\n if (parsed.queryString) {\n const parsedData = requestToData(parsed.queryString);\n if (parsedData && typeof parsedData === 'object') {\n await envPush(parsedData);\n }\n }\n return createPixelResponse(corsHeaders, requestId);\n }\n\n // Handle POST for event data\n if (parsed.method === 'POST') {\n if (!parsed.body) {\n return createResponse(\n 400,\n { success: false, error: 'Request body is required', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n const body = parseBody(parsed.body, parsed.isBase64Encoded);\n\n // If body is not a valid object, push {} to let source.before transformers handle raw input via ingest\n if (!body || typeof body !== 'object') {\n await envPush({});\n return createResponse(\n 200,\n { success: true, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n if (isEventRequest(body)) {\n const result = await processEvent(\n body as EventRequest,\n envPush,\n env.logger,\n requestId,\n );\n\n if (result.error) {\n return createResponse(\n 400,\n { success: false, error: result.error, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 200,\n { success: true, id: result.id, requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 400,\n { success: false, error: 'Invalid request format', requestId },\n corsHeaders,\n requestId,\n );\n }\n\n return createResponse(\n 405,\n { success: false, error: 'Method not allowed', requestId },\n corsHeaders,\n requestId,\n );\n } catch (error) {\n // Log handler errors with context - per using-logger skill\n env.logger?.error('Lambda handler error', {\n error,\n requestId,\n method: parsed?.method,\n });\n return createResponse(\n 500,\n {\n success: false,\n error:\n error instanceof Error ? error.message : 'Internal server error',\n requestId,\n },\n {},\n requestId,\n );\n }\n };\n\n return {\n type: 'lambda',\n config: fullConfig,\n push,\n };\n};\n\nexport default sourceLambda;\n","import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';\nimport type {\n LambdaEvent,\n ParsedRequest,\n CorsOptions,\n RequestBody,\n EventRequest,\n} from './types';\n\nexport function isAPIGatewayV2(\n event: LambdaEvent,\n): event is APIGatewayProxyEventV2 {\n return 'version' in event && event.version === '2.0';\n}\n\nexport function parseEvent(event: LambdaEvent): ParsedRequest {\n if (isAPIGatewayV2(event)) {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n return {\n method: event.requestContext.http.method,\n body: event.body,\n queryString: event.rawQueryString || null,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n } else {\n const headers: Record<string, string> = {};\n if (event.headers) {\n Object.entries(event.headers).forEach(([key, value]) => {\n if (value) headers[key.toLowerCase()] = value;\n });\n }\n let queryString: string | null = null;\n if (event.queryStringParameters) {\n const params = new URLSearchParams();\n Object.entries(event.queryStringParameters).forEach(([key, value]) => {\n if (value) params.append(key, value);\n });\n queryString = params.toString() || null;\n }\n return {\n method: event.httpMethod,\n body: event.body,\n queryString,\n headers,\n isBase64Encoded: event.isBase64Encoded || false,\n };\n }\n}\n\nexport function getPath(event: LambdaEvent): string {\n if (isAPIGatewayV2(event)) {\n return event.rawPath;\n } else {\n return event.path;\n }\n}\n\nexport function parseBody(body: unknown, isBase64Encoded: boolean): unknown {\n if (!body || typeof body !== 'string') return body;\n try {\n const decoded = isBase64Encoded\n ? Buffer.from(body, 'base64').toString('utf8')\n : body;\n return JSON.parse(decoded);\n } catch {\n return body;\n }\n}\n\nexport function isEventRequest(body: unknown): body is EventRequest {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'event' in body &&\n typeof (body as EventRequest).event === 'string'\n );\n}\n\nexport function getCorsHeaders(\n corsOptions: boolean | CorsOptions,\n): Record<string, string> {\n if (!corsOptions) return {};\n if (corsOptions === true) {\n return {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization',\n 'Access-Control-Max-Age': '3600',\n };\n }\n\n const headers: Record<string, string> = {};\n\n if (corsOptions.origin) {\n const origin = Array.isArray(corsOptions.origin)\n ? corsOptions.origin.join(', ')\n : corsOptions.origin;\n headers['Access-Control-Allow-Origin'] = origin;\n }\n if (corsOptions.methods) {\n headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');\n }\n if (corsOptions.headers) {\n headers['Access-Control-Allow-Headers'] = corsOptions.headers.join(', ');\n }\n if (corsOptions.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n if (corsOptions.maxAge !== undefined) {\n headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();\n }\n\n return headers;\n}\n\nexport function createResponse(\n statusCode: number,\n body: unknown,\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type':\n typeof body === 'object' ? 'application/json' : 'text/plain',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode,\n headers: responseHeaders,\n body: typeof body === 'object' ? JSON.stringify(body) : String(body),\n isBase64Encoded: false,\n };\n}\n\nexport function createPixelResponse(\n headers: Record<string, string> = {},\n requestId?: string,\n): APIGatewayProxyResult {\n const responseHeaders: Record<string, string> = {\n 'Content-Type': 'image/gif',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n ...headers,\n };\n\n if (requestId) {\n responseHeaders['X-Request-ID'] = requestId;\n }\n\n return {\n statusCode: 200,\n headers: responseHeaders,\n body: 'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',\n isBase64Encoded: true,\n };\n}\n","import type { Collector, WalkerOS, Logger } from '@walkeros/core';\nimport type { EventRequest } from './types';\n\nexport async function processEvent(\n eventReq: EventRequest,\n push: Collector.PushFn,\n logger?: Logger.Instance,\n requestId?: string,\n): Promise<{ id?: string; error?: string }> {\n try {\n const result = await push({\n name: eventReq.event,\n data: (eventReq.data || {}) as WalkerOS.Properties,\n context: eventReq.context as WalkerOS.OrderedProperties | undefined,\n user: eventReq.user as WalkerOS.User | undefined,\n globals: eventReq.globals as WalkerOS.Properties | undefined,\n consent: eventReq.consent as WalkerOS.Consent | undefined,\n });\n\n return { id: result?.event?.id };\n } catch (error) {\n // Log with structured context - per using-logger skill\n logger?.error('Event processing failed', {\n error,\n eventName: eventReq.event,\n requestId,\n });\n return { error: error instanceof Error ? error.message : 'Unknown error' };\n }\n}\n","import type { WalkerOS, Source as CoreSource } from '@walkeros/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n APIGatewayProxyResult,\n Context,\n} from 'aws-lambda';\nimport type { SettingsSchema, CorsOptionsSchema } from './schemas';\nimport type { z } from '@walkeros/core/dev';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n lambda: { type: 'lambda'; platform: 'server' };\n }\n}\n\n// Lambda event types\nexport type LambdaEvent = APIGatewayProxyEvent | APIGatewayProxyEventV2;\nexport type LambdaResult = APIGatewayProxyResult;\nexport type LambdaContext = Context;\n\n// Types inferred from Zod schemas\nexport type Settings = z.infer<typeof SettingsSchema>;\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {\n // Custom source event mapping properties\n}\n\n// Lambda-specific push type\nexport type Push = (\n event: LambdaEvent,\n context: LambdaContext,\n) => Promise<LambdaResult>;\n\nexport interface Env extends CoreSource.Env {\n lambdaEvent?: LambdaEvent;\n lambdaContext?: LambdaContext;\n}\n\n// Type bundle (must be after Settings, Mapping, Push, Env are defined)\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings\n>;\n\nexport interface LambdaSource extends Omit<CoreSource.Instance<Types>, 'push'> {\n push: Push;\n}\n\n// Convenience Config type\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\n\n// Lambda source doesn't follow standard Source.Init pattern due to Lambda handler interface\n\nexport interface EventRequest {\n event: string;\n data?: WalkerOS.AnyObject;\n context?: WalkerOS.AnyObject;\n user?: WalkerOS.AnyObject;\n globals?: WalkerOS.AnyObject;\n consent?: WalkerOS.AnyObject;\n}\n\nexport interface EventResponse {\n success: boolean;\n id?: string;\n error?: string;\n}\n\nexport type RequestBody = EventRequest;\nexport type ResponseBody = EventResponse;\n\n// Parsed request data structure\nexport interface ParsedRequest {\n method: string;\n body: unknown;\n queryString: string | null;\n headers: Record<string, string>;\n isBase64Encoded: boolean;\n}\n","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for AWS Lambda source\n *\n * These environments provide standardized mock structures for testing\n * Lambda event handling without requiring actual Lambda deployment.\n */\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopFn = () => {};\nconst noopLogger: Logger.Instance = {\n error: noopFn,\n warn: noopFn,\n info: noopFn,\n debug: noopFn,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noopFn,\n scope: () => noopLogger,\n};\n\n/**\n * Standard mock environment for testing Lambda source\n *\n * Use this for testing Lambda event ingestion and request/response handling\n * without requiring a real AWS Lambda environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const lambdaPost: Flow.StepExample = {\n title: 'Lambda POST',\n description:\n 'An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'POST', path: '/collect' },\n requestId: 'req-123',\n },\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const apiGatewayV1Post: Flow.StepExample = {\n title: 'API Gateway v1 POST',\n description:\n 'A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.',\n trigger: { type: 'POST' },\n in: {\n httpMethod: 'POST',\n path: '/collect',\n requestContext: {\n requestId: 'req-789',\n identity: { sourceIp: '203.0.113.42' },\n },\n queryStringParameters: null,\n body: JSON.stringify({\n event: 'page view',\n data: { title: 'Home' },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n },\n ],\n ],\n};\n\nexport const lambdaGet: Flow.StepExample = {\n title: 'Lambda GET',\n description:\n 'An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.',\n trigger: { type: 'GET' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'GET', path: '/collect' },\n requestId: 'req-456',\n },\n rawQueryString: 'e=page+view&d=%7B%22title%22%3A%22Home%22%7D',\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n e: 'page view',\n d: '{\"title\":\"Home\"}',\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport type { LambdaEvent, LambdaContext, LambdaResult } from '../types';\nimport { startFlow } from '@walkeros/collector';\n\nexport interface Content {\n [key: string]: unknown;\n}\n\nexport interface Result {\n statusCode: number;\n body: unknown;\n headers: Record<string, string>;\n}\n\n/**\n * Find the lambda source instance from the collector's registered sources.\n */\nfunction findLambdaSource(collector: Collector.Instance) {\n for (const source of Object.values(collector.sources || {})) {\n if ((source as { type?: string }).type === 'lambda') return source;\n }\n}\n\n/**\n * Lambda source createTrigger.\n *\n * Boots the collector via startFlow, then invokes the Lambda source's push()\n * with a real API Gateway event and a minimal Lambda context.\n *\n * Content is the raw Lambda event object (API Gateway v1 or v2 format).\n * Result contains statusCode, parsed body, and headers.\n *\n * @example\n * const { trigger, flow } = await createTrigger(config);\n * const result = await trigger('POST')({ version: '2.0', ... });\n * console.log(result.statusCode, result.body);\n */\nconst createTrigger: Trigger.CreateFn<Content, Result> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<Content, Result> =\n () =>\n async (content: Content): Promise<Result> => {\n // Lazy startFlow\n if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findLambdaSource(flow.collector);\n if (!source) throw new Error('Lambda source not found in collector');\n\n // Create minimal Lambda context\n const lambdaContext = {\n awsRequestId: `test-${Date.now()}`,\n } as unknown as LambdaContext;\n\n // Call source.push with the raw Lambda event + context\n const pushFn = (\n source as unknown as {\n push: (...args: unknown[]) => Promise<LambdaResult>;\n }\n ).push;\n const lambdaResult = await pushFn(\n content as unknown as LambdaEvent,\n lambdaContext,\n );\n\n // Parse response\n let body: unknown;\n try {\n body = JSON.parse(lambdaResult.body || '{}');\n } catch {\n body = lambdaResult.body;\n }\n\n const headers: Record<string, string> = {};\n if (lambdaResult.headers) {\n for (const [k, v] of Object.entries(lambdaResult.headers)) {\n if (v !== undefined) headers[k] = String(v);\n }\n }\n\n return {\n statusCode: lambdaResult.statusCode,\n body,\n headers,\n };\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/**\n * Legacy trigger — takes a source instance directly.\n * Preserved for CLI simulate path.\n */\nfunction trigger(source: {\n push: (event: LambdaEvent, context: LambdaContext) => Promise<LambdaResult>;\n}): (content: Content) => Promise<LambdaResult> {\n return async (content: Content) => {\n const lambdaEvent = { ...(content as Record<string, unknown>) };\n\n // Adapt body format: step examples may use `name`, source expects `event`\n if (lambdaEvent.body && typeof lambdaEvent.body === 'string') {\n const body = JSON.parse(lambdaEvent.body);\n if (body.name && !body.event) {\n lambdaEvent.body = JSON.stringify({\n ...body,\n event: body.name,\n name: undefined,\n });\n }\n }\n\n const context: LambdaContext = {\n awsRequestId: 'test-req',\n } as unknown as LambdaContext;\n\n return source.push(lambdaEvent as unknown as LambdaEvent, context);\n };\n}\n\nexport { createTrigger, trigger };\n","import {\n DeleteMessageCommand,\n GetQueueAttributesCommand,\n GetQueueUrlCommand,\n ReceiveMessageCommand,\n SQSClient,\n} from '@aws-sdk/client-sqs';\nimport type { Collector, Logger, Source, WalkerOS } from '@walkeros/core';\nimport type {\n Settings,\n SyntheticMessage,\n SyntheticPushResult,\n Types,\n} from './types';\nimport { decodeBody, DecoderError } from './decoder';\nimport { getConfig } from './config';\nimport { setup } from './setup';\n\nexport { setup } from './setup';\n\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30000;\nconst RECEIVE_RETRY_BACKOFF_MS = 1000;\n\ninterface MessageDispatch {\n id: string;\n body: string;\n receiptHandle?: string;\n ack(): Promise<void>;\n nack(): Promise<void>;\n}\n\nfunction toDeepPartialEvent(value: unknown): WalkerOS.DeepPartialEvent {\n if (typeof value === 'object' && value !== null) {\n // Plain object payloads pass through. The collector treats them as\n // DeepPartialEvent shapes; downstream transformers see the same data.\n return value as WalkerOS.DeepPartialEvent;\n }\n if (typeof value === 'string') return { data: { payload: value } };\n if (Buffer.isBuffer(value))\n return { data: { payload: value.toString('base64') } };\n return { data: { payload: String(value) } };\n}\n\nasync function handleMessage(args: {\n message: MessageDispatch;\n settings: Settings;\n pushFn: Collector.PushFn;\n logger: Logger.Instance;\n}): Promise<void> {\n const { message, settings, pushFn, logger } = args;\n try {\n const decoded = decodeBody(\n message.id,\n message.body,\n settings.decoder ?? 'json',\n );\n if (decoded === null || decoded === undefined) {\n logger.debug('SQS message acked-and-dropped (decoder returned null)', {\n id: message.id,\n });\n await message.ack();\n return;\n }\n await pushFn(toDeepPartialEvent(decoded));\n await message.ack();\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n if (err instanceof DecoderError) {\n logger.error('SQS message decode failed', { id: message.id, error });\n } else {\n logger.error('SQS message handler failed', { id: message.id, error });\n }\n if (settings.onPushError === 'ack') await message.ack();\n else await message.nack();\n }\n}\n\nfunction isQueueDoesNotExist(err: unknown): boolean {\n if (typeof err !== 'object' || err === null) return false;\n if (!('name' in err)) return false;\n const obj: { name?: unknown } = err;\n return (\n obj.name === 'QueueDoesNotExist' ||\n obj.name === 'AWS.SimpleQueueService.NonExistentQueue'\n );\n}\n\ninterface ClientWithDestroy {\n destroy?: () => void;\n}\n\nfunction tryDestroyClient(client: SQSClient, logger: Logger.Instance): void {\n // SQSClient implements destroy() in modern SDK versions; older versions\n // do not. Wrap defensively.\n const candidate: ClientWithDestroy = client;\n if (typeof candidate.destroy !== 'function') return;\n try {\n candidate.destroy();\n } catch (err) {\n logger.debug('SQS client destroy failed (non-fatal)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\ninterface FetchedMessage {\n MessageId: string;\n ReceiptHandle: string;\n Body: string;\n}\n\nfunction isFetchedMessage(value: unknown): value is FetchedMessage {\n if (typeof value !== 'object' || value === null) return false;\n const obj: {\n MessageId?: unknown;\n ReceiptHandle?: unknown;\n Body?: unknown;\n } = value;\n return (\n typeof obj.MessageId === 'string' &&\n typeof obj.ReceiptHandle === 'string' &&\n typeof obj.Body === 'string'\n );\n}\n\n/**\n * AWS SQS source.\n *\n * Long-running poll-and-forward subscriber. init() validates the queue exists,\n * captures the canonical queueUrl, and starts the long-poll loop as a\n * background task. push() accepts an optional synthetic message (used by\n * tests / triggers) and dispatches it through the same handler the loop uses;\n * called without arguments (production) it is a no-op since SQS is event-driven.\n *\n * destroy() stops the loop, drains in-flight handlers, and force-closes after\n * shutdownTimeoutMs (default 30000).\n */\nexport const sourceSqs: Source.Init<Types> = async (context) => {\n const { config: partialConfig = {}, env, logger, id } = context;\n const config = getConfig(partialConfig, env, logger);\n const settings: Settings = config.settings;\n\n // Resolve queueUrl from queueName at init time.\n if (!settings.queueUrl) {\n try {\n const res = await settings.client.send(\n new GetQueueUrlCommand({ QueueName: settings.queueName }),\n );\n if (!res.QueueUrl) {\n return logger.throw(\n `SQS queue not found: ${settings.queueName}. ` +\n `Run \"walkeros setup source.${id}\" to create it.`,\n );\n }\n settings.queueUrl = res.QueueUrl;\n } catch (err) {\n if (isQueueDoesNotExist(err)) {\n return logger.throw(\n `SQS queue not found: ${settings.queueName}. ` +\n `Run \"walkeros setup source.${id}\" to create it.`,\n );\n }\n throw err;\n }\n }\n\n // Capture queueArn for downstream use (e.g. SNS subscription verification).\n if (!settings.queueArn) {\n try {\n const res = await settings.client.send(\n new GetQueueAttributesCommand({\n QueueUrl: settings.queueUrl,\n AttributeNames: ['QueueArn'],\n }),\n );\n settings.queueArn = res.Attributes?.QueueArn;\n } catch (err) {\n // ARN is informational; continue without it.\n logger.debug('SQS GetQueueAttributesCommand failed (non-fatal)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Long-poll loop control flag and in-flight tracker.\n let stopped = false;\n const inFlight = new Set<Promise<void>>();\n\n const loop = async (): Promise<void> => {\n while (!stopped) {\n try {\n const res = await settings.client.send(\n new ReceiveMessageCommand({\n QueueUrl: settings.queueUrl,\n MaxNumberOfMessages: settings.maxMessages ?? 10,\n WaitTimeSeconds: settings.waitTimeSeconds ?? 20,\n VisibilityTimeout: settings.visibilityTimeout,\n MessageAttributeNames: ['All'],\n AttributeNames: ['All'],\n }),\n );\n const messages = res.Messages ?? [];\n for (const msg of messages) {\n if (!isFetchedMessage(msg)) {\n logger.warn('SQS received malformed message; skipping', {\n messageId:\n typeof msg.MessageId === 'string' ? msg.MessageId : undefined,\n });\n continue;\n }\n const fetched: FetchedMessage = msg;\n const dispatch: MessageDispatch = {\n id: fetched.MessageId,\n body: fetched.Body,\n receiptHandle: fetched.ReceiptHandle,\n ack: async () => {\n await settings.client.send(\n new DeleteMessageCommand({\n QueueUrl: settings.queueUrl ?? '',\n ReceiptHandle: fetched.ReceiptHandle,\n }),\n );\n },\n nack: async () => {\n // SQS has no explicit nack: skipping DeleteMessage causes\n // redelivery after VisibilityTimeout expires.\n },\n };\n const handler = handleMessage({\n message: dispatch,\n settings,\n pushFn: env.push,\n logger,\n });\n inFlight.add(handler);\n handler.finally(() => {\n inFlight.delete(handler);\n });\n }\n } catch (err) {\n if (stopped) break;\n const error = err instanceof Error ? err.message : String(err);\n if (isQueueDoesNotExist(err)) {\n logger.error(\n `SQS queue \"${settings.queueName}\" not found at runtime. ` +\n `Run \"walkeros setup source.${id}\" to create it. Original: ${error}`,\n );\n // Stop the loop on a fatal error; operator must intervene.\n stopped = true;\n break;\n }\n logger.error('SQS receive error (will retry)', { error });\n // Backoff before retry to avoid tight-looping on persistent errors.\n await new Promise((r) => setTimeout(r, RECEIVE_RETRY_BACKOFF_MS));\n }\n }\n };\n\n // Launch the loop without awaiting so init returns immediately. Track the\n // promise so destroy() can await it before resolving (prevents leaked\n // timers in test runs).\n const loopPromise = loop();\n\n return {\n type: 'sqs',\n config,\n setup,\n push: async (\n content?: SyntheticMessage,\n ): Promise<SyntheticPushResult | void> => {\n if (!content) return;\n const result: SyntheticPushResult = { acked: false, nacked: false };\n await handleMessage({\n message: {\n id: content.MessageId,\n body: content.Body,\n receiptHandle: content.ReceiptHandle,\n ack: async () => {\n result.acked = true;\n },\n nack: async () => {\n result.nacked = true;\n },\n },\n settings,\n pushFn: env.push,\n logger,\n });\n return result;\n },\n destroy: async () => {\n stopped = true;\n const timeoutMs =\n settings.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;\n let timer: NodeJS.Timeout | undefined;\n try {\n await Promise.race([\n (async () => {\n // Wait for the loop to exit AND in-flight handlers to drain.\n await loopPromise;\n await Promise.all(Array.from(inFlight));\n })(),\n new Promise<void>((resolve) => {\n timer = setTimeout(() => {\n logger.warn(\n `SQS source close timed out after ${timeoutMs}ms; forcing close.`,\n );\n resolve();\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n tryDestroyClient(settings.client, logger);\n }\n },\n };\n};\n\nexport default sourceSqs;\n","import type { Decoder } from './types';\n\nexport class DecoderError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DecoderError';\n }\n}\n\n/**\n * Decode an SQS message body string.\n *\n * - 'json': JSON.parse(body). Throws DecoderError on parse failure.\n * - 'text': body returned as-is.\n * - 'raw': Buffer.from(body, 'utf8').\n */\nexport function decodeBody(\n messageId: string,\n body: string,\n decoder: Decoder,\n): unknown {\n if (decoder === 'raw') return Buffer.from(body, 'utf8');\n if (decoder === 'text') return body;\n // json\n try {\n return JSON.parse(body);\n } catch (err) {\n throw new DecoderError(\n `SQS message ${messageId} JSON decode failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n}\n","import { SQSClient } from '@aws-sdk/client-sqs';\nimport type { Logger } from '@walkeros/core';\nimport type {\n Config,\n Env,\n InitSettings,\n PartialConfig,\n Settings,\n} from './types';\n\nconst DEFAULT_REGION = 'eu-central-1';\nconst DEFAULT_DECODER = 'json' as const;\nconst DEFAULT_MAX_MESSAGES = 10;\nconst DEFAULT_WAIT_TIME = 20;\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30000;\nconst DEFAULT_ON_PUSH_ERROR = 'nack' as const;\n\n/**\n * Runtime config with the narrow Settings shape (all defaults applied).\n *\n * The framework's `Source.Config` types `settings` as `InitSettings | undefined`;\n * this alias reflects the post-getConfig invariant where settings is fully\n * resolved and the SQSClient handle is built.\n */\nexport type RuntimeConfig = Omit<Config, 'settings'> & { settings: Settings };\n\n/**\n * Validate and normalize the partial config into a runtime Config.\n *\n * The client is built once: prefer pre-supplied `settings.client`, then env-\n * injected constructor (tests/DI), then the static SDK import. `Settings.client`\n * is always populated before init/destroy run.\n */\nexport function getConfig(\n partial: PartialConfig = {},\n env: Env | undefined,\n logger: Logger.Instance,\n): RuntimeConfig {\n const empty: Partial<InitSettings> = {};\n const partialSettings: Partial<InitSettings> = partial.settings ?? empty;\n const queueName =\n typeof partialSettings.queueName === 'string'\n ? partialSettings.queueName\n : '';\n if (!queueName) logger.throw('Config settings queueName missing');\n\n const region = partialSettings.region ?? DEFAULT_REGION;\n\n let client = partialSettings.client;\n if (!client) {\n const Constructor = env?.AWS?.SQSClient ?? SQSClient;\n client = new Constructor({ region, ...partialSettings.config });\n }\n\n const settings: Settings = {\n ...partialSettings,\n client,\n queueName,\n region,\n queueUrl: partialSettings.queueUrl,\n config: partialSettings.config,\n decoder: partialSettings.decoder ?? DEFAULT_DECODER,\n maxMessages: partialSettings.maxMessages ?? DEFAULT_MAX_MESSAGES,\n waitTimeSeconds: partialSettings.waitTimeSeconds ?? DEFAULT_WAIT_TIME,\n visibilityTimeout: partialSettings.visibilityTimeout,\n shutdownTimeoutMs:\n partialSettings.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS,\n onPushError: partialSettings.onPushError ?? DEFAULT_ON_PUSH_ERROR,\n };\n\n return { ...partial, settings };\n}\n","import {\n CreateQueueCommand,\n GetQueueAttributesCommand,\n SQSClient,\n} from '@aws-sdk/client-sqs';\nimport { SNSClient, SubscribeCommand } from '@aws-sdk/client-sns';\nimport type { Logger } from '@walkeros/core';\nimport { resolveSetup } from '@walkeros/core';\nimport type { Config, Env, Setup, SetupFn } from './types';\n\nconst DEFAULT_REGION = 'eu-central-1';\nconst DEFAULT_VISIBILITY_TIMEOUT_SECONDS = 30;\nconst DEFAULT_MESSAGE_RETENTION_SECONDS = 345600;\nconst DEFAULT_MAXIMUM_MESSAGE_SIZE = 262144;\nconst DEFAULT_DLQ_MAX_RECEIVE_COUNT = 5;\nconst DLQ_RETENTION_SECONDS = 1209600; // 14 days, AWS max\n\nexport const DEFAULT_SETUP: Setup = {\n region: DEFAULT_REGION,\n fifoQueue: false,\n visibilityTimeoutSeconds: DEFAULT_VISIBILITY_TIMEOUT_SECONDS,\n messageRetentionSeconds: DEFAULT_MESSAGE_RETENTION_SECONDS,\n maximumMessageSize: DEFAULT_MAXIMUM_MESSAGE_SIZE,\n};\n\nexport interface SetupResult {\n queueCreated: boolean;\n queueUrl: string;\n queueArn: string;\n dlqCreated?: boolean;\n dlqArn?: string;\n subscriptionArn?: string;\n}\n\ninterface QueueExistsError {\n name: string;\n}\n\nfunction hasName(err: unknown): err is QueueExistsError {\n if (typeof err !== 'object' || err === null) return false;\n const obj: { name?: unknown } = err;\n return typeof obj.name === 'string';\n}\n\nfunction isQueueNameExists(err: unknown): boolean {\n if (!hasName(err)) return false;\n return (\n err.name === 'QueueNameExists' ||\n err.name === 'QueueAlreadyExists' ||\n err.name === 'AWS.SimpleQueueService.QueueNameExists'\n );\n}\n\ninterface BuildQueueAttributesArgs {\n options: Setup;\n dlqArn: string | undefined;\n queuePolicy: string | undefined;\n}\n\nfunction buildQueueAttributes(\n args: BuildQueueAttributesArgs,\n): Record<string, string> {\n const { options, dlqArn, queuePolicy } = args;\n const attrs: Record<string, string> = {};\n attrs.VisibilityTimeout = String(\n options.visibilityTimeoutSeconds ?? DEFAULT_VISIBILITY_TIMEOUT_SECONDS,\n );\n attrs.MessageRetentionPeriod = String(\n options.messageRetentionSeconds ?? DEFAULT_MESSAGE_RETENTION_SECONDS,\n );\n attrs.MaximumMessageSize = String(\n options.maximumMessageSize ?? DEFAULT_MAXIMUM_MESSAGE_SIZE,\n );\n if (options.kmsMasterKeyId) {\n attrs.KmsMasterKeyId = options.kmsMasterKeyId;\n }\n if (options.fifoQueue) {\n attrs.FifoQueue = 'true';\n attrs.ContentBasedDeduplication = 'true';\n }\n if (dlqArn) {\n const maxReceiveCount =\n options.deadLetterQueue?.maxReceiveCount ?? DEFAULT_DLQ_MAX_RECEIVE_COUNT;\n attrs.RedrivePolicy = JSON.stringify({\n deadLetterTargetArn: dlqArn,\n maxReceiveCount,\n });\n }\n if (queuePolicy) {\n attrs.Policy = queuePolicy;\n }\n return attrs;\n}\n\nfunction buildDlqAttributes(args: {\n fifoQueue: boolean;\n kmsMasterKeyId?: string;\n}): Record<string, string> {\n const attrs: Record<string, string> = {};\n attrs.MessageRetentionPeriod = String(DLQ_RETENTION_SECONDS);\n if (args.kmsMasterKeyId) {\n attrs.KmsMasterKeyId = args.kmsMasterKeyId;\n }\n if (args.fifoQueue) {\n attrs.FifoQueue = 'true';\n attrs.ContentBasedDeduplication = 'true';\n }\n return attrs;\n}\n\nfunction buildDlqTags(\n parentTags: Record<string, string> | undefined,\n): Record<string, string> {\n return {\n ...(parentTags ?? {}),\n walkerOS: 'dlq',\n };\n}\n\ninterface BuildPolicyArgs {\n sourceId: string;\n topicArn: string;\n}\n\nfunction buildSnsQueuePolicy(args: BuildPolicyArgs): string {\n // Placeholder Resource value; AWS does not require it to match the actual\n // queue ARN at policy-attach time when the queue is being created in the\n // same call. The Sid keys the statement so re-runs upsert in place.\n return JSON.stringify({\n Version: '2012-10-17',\n Statement: [\n {\n Sid: `walkerOSAllowSNSPublish-${args.sourceId}`,\n Effect: 'Allow',\n Principal: { Service: 'sns.amazonaws.com' },\n Action: 'SQS:SendMessage',\n Resource: '*',\n Condition: {\n ArnEquals: {\n 'aws:SourceArn': args.topicArn,\n },\n },\n },\n ],\n });\n}\n\ninterface EnsureQueueArgs {\n sqs: SQSClient;\n logger: Logger.Instance;\n queueName: string;\n attributes: Record<string, string>;\n tags?: Record<string, string>;\n}\n\ninterface EnsureQueueResult {\n queueCreated: boolean;\n queueUrl: string;\n queueArn: string;\n}\n\n/**\n * Authoritative-apply: a single CreateQueueCommand with the full declared\n * attribute map and tags. AWS treats identical inputs as success; on\n * QueueNameExists (different attrs) we hard-fail with an actionable message.\n * Setup never calls SetQueueAttributesCommand.\n */\nasync function ensureQueue(args: EnsureQueueArgs): Promise<EnsureQueueResult> {\n const { sqs, logger, queueName, attributes, tags } = args;\n let queueUrl: string;\n let queueCreated = false;\n try {\n const res = await sqs.send(\n new CreateQueueCommand({\n QueueName: queueName,\n Attributes: attributes,\n tags,\n }),\n );\n queueUrl = res.QueueUrl ?? '';\n queueCreated = true;\n logger.info(`SQS queue \"${queueName}\" created.`);\n } catch (err) {\n if (isQueueNameExists(err)) {\n const message = err instanceof Error ? err.message : String(err);\n return logger.throw(\n `SQS queue \"${queueName}\" exists with different attributes (${message}). ` +\n `Setup will not mutate an existing queue's attributes. Delete or rename the queue, then re-run setup.`,\n );\n }\n throw err;\n }\n if (!queueUrl) {\n return logger.throw(\n `SQS CreateQueueCommand returned no QueueUrl for \"${queueName}\".`,\n );\n }\n // Fetch QueueArn for downstream Subscribe / RedrivePolicy use.\n const attrsRes = await sqs.send(\n new GetQueueAttributesCommand({\n QueueUrl: queueUrl,\n AttributeNames: ['QueueArn'],\n }),\n );\n const queueArn = attrsRes.Attributes?.QueueArn ?? '';\n if (!queueArn) {\n return logger.throw(\n `SQS GetQueueAttributesCommand returned no QueueArn for \"${queueName}\".`,\n );\n }\n return { queueCreated, queueUrl, queueArn };\n}\n\nfunction dlqName(queueName: string, fifo: boolean): string {\n if (fifo) {\n // FIFO queue names must end in .fifo. Strip the suffix if present, append -dlq, then re-add.\n const base = queueName.endsWith('.fifo')\n ? queueName.slice(0, -'.fifo'.length)\n : queueName;\n return `${base}-dlq.fifo`;\n }\n return `${queueName}-dlq`;\n}\n\nexport const setup: SetupFn = async (context) => {\n const { id, config, env, logger } = context;\n\n const merged = resolveSetup<Setup>(config.setup, DEFAULT_SETUP);\n if (!merged) {\n logger.debug('SQS source setup skipped (config.setup is falsy).');\n return undefined;\n }\n const options: Setup = { ...DEFAULT_SETUP, ...merged };\n\n const settings = config.settings;\n if (!settings) return logger.throw('setup: settings missing');\n\n const queueName = settings.queueName;\n if (!queueName) return logger.throw('setup: settings.queueName is missing');\n\n const region = options.region ?? DEFAULT_REGION;\n\n // Construct clients via env override (tests) or static SDK import (prod).\n const SqsCtor = env.AWS?.SQSClient ?? SQSClient;\n const sqs = new SqsCtor({ region });\n\n // 1. Optional DLQ first (so we have its ARN for RedrivePolicy on the main queue).\n let dlqArn: string | undefined;\n let dlqCreated = false;\n if (options.deadLetterQueue?.arn) {\n dlqArn = options.deadLetterQueue.arn;\n } else if (options.deadLetterQueue?.create) {\n const dlqResult = await ensureQueue({\n sqs,\n logger,\n queueName: dlqName(queueName, options.fifoQueue ?? false),\n attributes: buildDlqAttributes({\n fifoQueue: options.fifoQueue ?? false,\n kmsMasterKeyId: options.kmsMasterKeyId,\n }),\n tags: buildDlqTags(options.tags),\n });\n dlqArn = dlqResult.queueArn;\n dlqCreated = dlqResult.queueCreated;\n }\n\n // 2. Main queue.\n const finalQueueName = options.fifoQueue\n ? queueName.endsWith('.fifo')\n ? queueName\n : `${queueName}.fifo`\n : queueName;\n const queuePolicy = options.subscribeToSnsTopic\n ? buildSnsQueuePolicy({\n sourceId: id,\n topicArn: options.subscribeToSnsTopic.topicArn,\n })\n : undefined;\n\n const mainAttrs = buildQueueAttributes({\n options,\n dlqArn,\n queuePolicy,\n });\n const mainResult = await ensureQueue({\n sqs,\n logger,\n queueName: finalQueueName,\n attributes: mainAttrs,\n tags: options.tags,\n });\n\n // 3. Optional SNS subscription.\n let subscriptionArn: string | undefined;\n if (options.subscribeToSnsTopic) {\n const SnsCtor = env.AWS?.SNSClient ?? SNSClient;\n const sns = new SnsCtor({ region });\n const subAttrs: Record<string, string> = {};\n if (options.subscribeToSnsTopic.rawMessageDelivery) {\n subAttrs.RawMessageDelivery = 'true';\n }\n if (options.subscribeToSnsTopic.filterPolicy) {\n subAttrs.FilterPolicy = JSON.stringify(\n options.subscribeToSnsTopic.filterPolicy,\n );\n }\n const subscribeRes = await sns.send(\n new SubscribeCommand({\n TopicArn: options.subscribeToSnsTopic.topicArn,\n Protocol: 'sqs',\n Endpoint: mainResult.queueArn,\n Attributes: Object.keys(subAttrs).length > 0 ? subAttrs : undefined,\n ReturnSubscriptionArn: true,\n }),\n );\n subscriptionArn = subscribeRes.SubscriptionArn ?? undefined;\n logger.info('SQS source setup: SNS subscription created', {\n topicArn: options.subscribeToSnsTopic.topicArn,\n subscriptionArn,\n });\n }\n\n const result: SetupResult = {\n queueCreated: mainResult.queueCreated,\n queueUrl: mainResult.queueUrl,\n queueArn: mainResult.queueArn,\n dlqCreated: dlqArn ? dlqCreated : undefined,\n dlqArn,\n subscriptionArn,\n };\n return result;\n};\n","import type {\n Source as CoreSource,\n SetupFn as CoreSetupFn,\n} from '@walkeros/core';\nimport type {\n SQSClient,\n SQSClientConfig,\n Message,\n ReceiveMessageCommand,\n DeleteMessageCommand,\n CreateQueueCommand,\n GetQueueUrlCommand,\n GetQueueAttributesCommand,\n} from '@aws-sdk/client-sqs';\nimport type { SNSClient, SubscribeCommand } from '@aws-sdk/client-sns';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n sqs: { type: 'sqs'; platform: 'server' };\n }\n}\n\nexport type Decoder = 'json' | 'text' | 'raw';\n\nexport interface Settings {\n // User-supplied OR populated by getConfig(); single field for both. Mirrors the Pub/Sub pull source.\n client: SQSClient;\n // Required. Used by setup to provision and by init to resolve the URL.\n queueName: string;\n // AWS region. Default: 'eu-central-1'.\n region?: string;\n // Optional pre-resolved URL. When unset, init resolves via GetQueueUrlCommand.\n queueUrl?: string;\n // SDK client config (credentials, etc.). Optional.\n config?: SQSClientConfig;\n // Decoder for message body. Default: 'json'.\n decoder?: Decoder;\n // Receive batch size. Cap 10, default 10.\n maxMessages?: number;\n // Long-poll duration in seconds. Cap 20, default 20.\n waitTimeSeconds?: number;\n // Per-receive visibility timeout override. Default: queue's configured value.\n visibilityTimeout?: number;\n // Graceful shutdown timeout in ms. Default: 30000.\n shutdownTimeoutMs?: number;\n // Error policy: 'ack' (DeleteMessage to drop) or 'nack' (no DeleteMessage, redeliver). Default: 'nack'.\n onPushError?: 'nack' | 'ack';\n // Runtime-only handle populated by init(); not user-facing.\n queueArn?: string;\n}\n\nexport interface InitSettings {\n queueName: string;\n client?: SQSClient;\n region?: string;\n queueUrl?: string;\n config?: SQSClientConfig;\n decoder?: Decoder;\n maxMessages?: number;\n waitTimeSeconds?: number;\n visibilityTimeout?: number;\n shutdownTimeoutMs?: number;\n onPushError?: 'nack' | 'ack';\n}\n\n// Mapping has no per-event fields in v1: SQS messages have no native ordering\n// key, no per-event visibility-extension API, no per-event delete strategy that\n// SQS itself consumes. Future per-event fields will be introduced when a real\n// feature needs them.\nexport interface Mapping {\n // Reserved for future use.\n}\n\n/**\n * Synthetic message input used by tests / triggers to dispatch through the\n * same handler the long-poll loop uses, without involving real SQS.\n *\n * In production, push() is invoked without arguments and is a no-op:\n * SQS is event-driven, the long-poll loop is the canonical delivery path.\n * Tests pass a synthetic input to dispatch directly.\n */\nexport interface SyntheticMessage {\n MessageId: string;\n Body: string;\n ReceiptHandle?: string;\n Attributes?: Record<string, string>;\n MessageAttributes?: Record<\n string,\n { DataType: string; StringValue?: string }\n >;\n}\n\nexport interface SyntheticPushResult {\n acked: boolean;\n nacked: boolean;\n}\n\nexport type Push = (\n content?: SyntheticMessage,\n) => Promise<SyntheticPushResult | void>;\n\nexport interface Env extends CoreSource.Env {\n AWS?: {\n SQSClient: typeof SQSClient;\n ReceiveMessageCommand: typeof ReceiveMessageCommand;\n DeleteMessageCommand: typeof DeleteMessageCommand;\n CreateQueueCommand: typeof CreateQueueCommand;\n GetQueueUrlCommand: typeof GetQueueUrlCommand;\n GetQueueAttributesCommand: typeof GetQueueAttributesCommand;\n // SNS used by setup only when subscribeToSnsTopic is set.\n SNSClient?: typeof SNSClient;\n SubscribeCommand?: typeof SubscribeCommand;\n };\n}\n\n/**\n * Provisioning options for `walkeros setup source.<id>`.\n *\n * Triggered only by the explicit CLI command. Idempotent. Never auto-run.\n *\n * `queueName` lives in Settings (one source of truth for setup AND runtime poll).\n */\nexport interface Setup {\n /** AWS region. Default: 'eu-central-1'. */\n region?: string;\n /** FIFO queue with content-based deduplication. Default: false. */\n fifoQueue?: boolean;\n /** Visibility timeout in seconds. Default: 30. */\n visibilityTimeoutSeconds?: number;\n /** Message retention period in seconds. Default: 345600 (4 days). */\n messageRetentionSeconds?: number;\n /** Max message size in bytes. Default: 262144 (256 KB). */\n maximumMessageSize?: number;\n /** KMS key for at-rest encryption. Optional. */\n kmsMasterKeyId?: string;\n /** Optional dead-letter queue. */\n deadLetterQueue?: {\n /** ARN of an existing DLQ. Mutually exclusive with `create: true`. */\n arn?: string;\n /** Create a sibling DLQ named <queueName>-dlq. Default: false. */\n create?: boolean;\n /** Max receive count before message goes to DLQ. Default: 5. */\n maxReceiveCount?: number;\n };\n /** Tags applied to the queue (and inherited by an auto-created DLQ). */\n tags?: Record<string, string>;\n /** Optional: subscribe this queue to an SNS topic. Creates SNS subscription + queue policy. */\n subscribeToSnsTopic?: {\n /** Topic ARN to subscribe to. Required. */\n topicArn: string;\n /** Deliver SNS messages without the SNS envelope. Default: false. */\n rawMessageDelivery?: boolean;\n /** SNS filter policy (subscription-time message filtering). */\n filterPolicy?: Record<string, unknown>;\n };\n}\n\n// Source.Types has 6 slots: <Settings, Mapping, Push, Env, InitSettings, Setup>.\n// Setup MUST be in slot 6; mis-positioning silently demotes Config['setup'] to unknown.\nexport type Types = CoreSource.Types<\n Settings,\n Mapping,\n Push,\n Env,\n InitSettings,\n Setup\n>;\n\nexport type Config = CoreSource.Config<Types>;\nexport type PartialConfig = CoreSource.PartialConfig<Types>;\nexport type SetupFn = CoreSetupFn<Config, Env>;\n\n// Re-export SDK types used in this package's public surface.\nexport type { SQSClient, SQSClientConfig, Message, SNSClient };\n"],"mappings":"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","names":["types_exports","import_core","push","trigger","k","v","push","context","import_client_sqs","import_client_sqs","import_core","DEFAULT_REGION","DEFAULT_SHUTDOWN_TIMEOUT_MS","r","types_exports"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={title:"Lambda POST",description:"An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-123"},body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},apiGatewayV1Post={title:"API Gateway v1 POST",description:"A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{httpMethod:"POST",path:"/collect",requestContext:{requestId:"req-789",identity:{sourceIp:"203.0.113.42"}},queryStringParameters:null,body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},lambdaGet={title:"Lambda GET",description:"An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.",trigger:{type:"GET"},in:{version:"2.0",requestContext:{http:{method:"GET",path:"/collect"},requestId:"req-456"},rawQueryString:"e=page+view&d=%7B%22title%22%3A%22Home%22%7D",isBase64Encoded:!1},out:[["elb",{e:"page view",d:'{"title":"Home"}'}]]};import{assign as o}from"@walkeros/core";import{assign as r,createLogger as i}from"@walkeros/core";import{assign as a,buildCacheContext as c,clone as u,compileCache as f,checkCache as l,storeCache as d,compileNext as g,createIngest as m,debounce as p,getId as h,getGrantedConsent as y,isDefined as b,isFunction as v,isObject as w,isRouteArray as k,processEventMapping as C,resolveNext as O,tryCatchAsync as j,useHooks as q}from"@walkeros/core";import{isArray as x}from"@walkeros/core";import{tryCatch as A,tryCatchAsync as S}from"@walkeros/core";import{createIngest as D,getMappingValue as $,tryCatchAsync as E,compileNext as _,resolveNext as I,isRouteArray as P,compileCache as R,checkCache as M,storeCache as H,applyUpdate as T,buildCacheContext as G}from"@walkeros/core";import{createIngest as B,isObject as N,tryCatchAsync as U,useHooks as F,compileNext as W,resolveNext as z,isRouteArray as L,compileCache as V,checkCache as J,storeCache as K,buildCacheContext as Q}from"@walkeros/core";import{assign as Oe,getSpanId as je,isFunction as qe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as _e,getGrantedConsent as Ie,processEventMapping as Pe,tryCatchAsync as Re,useHooks as Me}from"@walkeros/core";import{useHooks as Te,tryCatchAsync as Ge}from"@walkeros/core";import{useHooks as Be}from"@walkeros/core";var t_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;e2&&!L(e2)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:B(t2),config:n2.config,env:se(n2.config.env)};s2.debug("init");const i2=await F(n2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:i2?.env||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...se(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await F(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}async function oe(e,n2,t2,o2,s2,r2,i2){i2&&s2?._meta&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await U(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{event:null,respond:c2};if(i2&&void 0!==r3.config?.chainMocks?.[i2]){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,f2=u2?V(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=Q(s2,a2),n3=J(f2,l2,e2,`t:${o3}`);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee("string"==typeof g2||Array.isArray(g2)&&!L(g2)?g2:z(W(g2),Q(s2,a2))||void 0,Y(n2));if(t3.length>0){const o4=await oe(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:o4.respond??c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=await U(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:B("unknown");if(t3.next){let s3=t3.next;if(L(t3.next)){const e2=W(t3.next);s3=z(e2,Q(u4,o4))}if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return oe(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?oe(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){let o5=r4;if(L(r4)){const e2=W(r4);if(o5=z(e2,Q(s2,a2)),!o5){t3&&(a2=t3);continue}}const u3=ee(o5,Y(n2));return u3.length>0?oe(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&K(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&L(r3.config.next)){const t3=r3.config.next,o4=W(t3),u3=z(o4,Q(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return oe(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function se(e){return e&&N(e)?e:{}}async function re(e,n2){if(!n2.on||!n2.queueOn?.length)return;const t2=n2.queueOn;n2.queueOn=[];for(const{type:e2,data:o2}of t2)await E(n2.on)(e2,o2)}function ie(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ae(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=D(n2);const d2=u2?R({...u2,full:u2.full??!0}):void 0,g2=_(a2),m2=Array.isArray(a2)&&P(a2)||!g2?void 0:ee(I(g2),Y(e.transformers)),p2=_(c2),h2=Array.isArray(c2)&&P(c2)||!p2?void 0:ee(I(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),b2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=h2??(p2?ee(I(p2,G(l2)),Y(e.transformers)):[]);if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await oe(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const o4=G(l2),s3=M(d2,t4,o4,`s:${n2}`);if(s3){if("HIT"===s3.status&&void 0!==s3.value&&d2.full){let n3=s3.value;return s3.rule.update&&(n3=await T(n3,s3.rule.update,{...o4,cache:{status:"HIT"}},e)),f2?.(n3),{ok:!0}}if("MISS"===s3.status&&d2.full&&f2){const n3=f2,i4=s3.rule.update,a4={...o4,cache:{status:"MISS"}},c4=s3.key,u4=s3.rule.ttl;f2=o5=>{H(t4,c4,o5,u4),i4?r3=(async()=>{const t5=await T(o5,i4,a4,e);n3(t5)})():n3(o5)}}"MISS"!==s3.status||d2.full||H(t4,s3.key,!0,s3.rule.ttl)}}}const c3=m2??(g2?ee(I(g2,G(l2)),Y(e.transformers)):[]),u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},v2={collector:e,logger:y2,id:n2,config:s2,env:b2,setIngest:async t3=>{if(!s2.ingest)return void(l2=D(n2));const o3=await $(t3,s2.ingest,{collector:e}),r3=D(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await E(o2)(v2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return b2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function ue(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function le(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:Ce(n2.env,n2.config.env)};A(n2.on)(o2,a2)}function de(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,o3){const s3=o3||e2.consent,r3=ue(e2,t_Commands.Consent);n3.forEach(e3=>{Object.keys(s3).filter(n4=>n4 in e3).forEach(n4=>{A(e3[n4])(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Ready);n3.forEach(e3=>{A(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=ue(e2,t_Commands.Run);n3.forEach(e3=>{A(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=ue(e2,t_Commands.Session);n3.forEach(n4=>{A(n4)(e2.session,o3)})}(e,o2);break;default:{const t2=ue(e,n2);o2.forEach(e2=>{"function"==typeof e2&&A(e2)(r2,t2)});break}}}function me(e,n2,t2,o2){if(!e)return[];if(n2){const e2=O(n2,c(o2));return e2?ee(e2,Y(t2)):[]}return ee(e,Y(t2))}async function pe(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!v(o2.push))return ve({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:Ce(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=h(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),he(e,void 0,{},{[d2]:l2})}async function he(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return ve({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let h3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&h3.push(u(n2));const b3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:m("unknown");if(!h3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!h3.length&&s3.queueOn?.length){let n3=!1;try{n3=await ye(e,s3,o3)}catch(n4){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const v3=[],w3=h3.filter(e2=>{const n3=y(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,v3.push(e2),!1)});if(s3.queuePush.push(...w3),!v3.length)return{id:o3,destination:s3,queue:h3};let C2,O2,q2=!1;try{q2=await ye(e,s3,o3)}catch(n3){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n3 instanceof Error?n3.message:String(n3)})}if(!q2)return{id:o3,destination:s3,queue:h3};s3.dlq||(s3.dlq=[]);const x2=s3.config.before,A2=me(x2,x2&&k(x2)?g(x2):void 0,e.transformers,b3),S2=s3.config.next,D2=S2&&k(S2)?g(S2):void 0,$2=s3.config?.cache,E2=$2?f($2):void 0,_2=E2?X(E2,e):void 0;let I2=0;return await Promise.all(v3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(p2,n3.user),E2?.full&&_2){const e2=c(b3,n3),t3=l(E2,_2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await oe(e,e.transformers,A2,n3,b3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(E2&&!E2.full&&_2){const e2=c(b3,u2),t3=l(E2,_2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const h4=await j(be,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),C2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,b3,f2);if(I2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&d(_2,r3.key,h4??!0,r3.ttl),void 0!==h4&&(O2=h4),!m2&&S2){void 0!==h4&&(b3._response=h4);const n4=me(S2,D2,e.transformers,b3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,n4,u2,b3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:C2,response:O2,totalDuration:I2}})),b2={},v2={},w2={};for(const n3 of h2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,w2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?v2[n3.id]=t3:(b2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return ve({event:n2,...Object.keys(b2).length&&{done:b2},...Object.keys(v2).length&&{queued:v2},...Object.keys(w2).length&&{failed:w2}})}async function ye(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:Ce(n2.env,n2.config.env)};s2.debug("init");const i2=await q(n2.init,"DestinationInit",e.hooks,e.logger)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},n2.queueOn?.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)le(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function be(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await C(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!l2?.batch||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await q(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:p(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...Ce(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),q(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),b(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function ve(e){return{ok:!e?.failed,...e}}function we(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=Ce(n2.env,o2);return{...n2,config:a2,env:c2}}function Ce(e,n2){return e||n2?n2?e&&w(e)&&w(n2)?{...e,...n2}:n2:e:{}}async function Se(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:o3.env??{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function De(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:Ae(o2)&&(Oe(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if(Ae(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=o(e.consent,t2),{update:t2}}(e,o2);a2=n3,c2=!0}break;case t_Commands.Custom:Ae(o2)&&(e.custom=Oe(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:Ae(o2)&&("code"in o2&&Ae(o2.code)?i2=await pe(e,o2,r2):qe(o2.push)&&(i2=await pe(e,{code:o2},r2)));break;case t_Commands.Globals:Ae(o2)&&(e.globals=Oe(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:xe(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=x(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,de(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=Oe(e.consent,n2.consent)),n2.user&&(e.user=Oe(e.user,n2.user)),n2.globals&&(e.globals=Oe(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=Oe(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await he(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await Se(e2.sources,"source",n3),await Se(e2.destinations,"destination",n3),await Se(e2.transformers,"transformer",n3),await Se(e2.stores,"store",n3)}(e);break;case t_Commands.User:Ae(o2)&&(Oe(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const t2 of Object.values(e.sources)){if(t2.config.require?.length){const e2=t2.config.require.indexOf(n2);-1!==e2&&t2.config.require.splice(e2,1)}t2.on&&(ie(t2)?!1===await S(t2.on)(n2,r2)&&(a2=!0):(t2.queueOn=t2.queueOn||[],t2.queueOn.push({type:n2,data:r2})))}Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});le(e,o3,t2,n2,r2)}});for(const n3 of Object.values(e.sources))ie(n3)&&n3.queueOn?.length&&await re(0,n3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,n3){for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=we(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),de(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await he(e)),i2||ve({ok:!0})}function $e(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${t2} ${o2}`,data:i2={},context:a2={},globals:c2=e.globals,custom:u2={},user:f2=e.user,nested:l2=[],consent:d2=e.consent,id:g2=je(),trigger:m2="",entity:p2=t2,action:h2=o2,timing:y2=0,source:b2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:f2,nested:l2,consent:d2,id:g2,trigger:m2,entity:p2,action:h2,timestamp:s2,timing:y2,source:b2}}async function Ne(e){const n2=r({globalsStatic:{},sessionStatic:{},run:!0},e,{merge:!1,extend:!1}),t2={level:e.logger?.level,handler:e.logger?.handler},o2=i(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return Me(async(t2,o2={})=>await Re(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,f2,l2):void 0,p2=i2??_e(r2||"unknown");if(c2){const n3=await Pe(g2,c2,e);if(n3.ignore)return ve({ok:!0});if(c2.consent&&!Ie(c2.consent,e.consent,n3.event.consent))return ve({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await oe(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return ve({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=$e(e,o4);return he(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return o3[0]??ve({ok:!0})}g2=t3.event}const h2=n2(g2),y2=$e(e,h2),b2=await he(e,y2,{id:r2,ingest:p2,respond:d2},m2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return b2},()=>ve({ok:!1}))(),"Push",e.hooks,e.logger)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.0.1-next-1778284185788"},...e2})),a2.command=(n3=De,Te(async(t3,o3,s3)=>await Ge(async()=>await n3(e2,t3,o3,s3),()=>ve({ok:!1}))(),"Command",(e2=a2).hooks,e2.logger));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=Be(f2,"StoreGet",e2.hooks,e2.logger),u2.set=Be(l2,"StoreSet",e2.hooks,e2.logger),u2.delete=Be(d2,"StoreDelete",e2.hooks,e2.logger),t3[o3]=u2}return t3}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),!a2.stores.__cache){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return a2.destinations=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2))s2.config?.require?.length?e.pending.destinations[o2]=s2:t2[o2]=we(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:B(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Ue(e){e=e||{};const n2=await Ne(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return ve({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ae(e,o2,s2);if(!n3)continue;const r2=s2.config?.require;n3.config={...n3.config,init:!1,...r2?{require:[...r2]}:{}},t2[o2]=n3}Object.assign(e.sources,t2);for(const n3 of Object.keys(t2)){const t3=e.sources[n3];t3.init&&await E(t3.init.bind(t3))(),t3.config.init=!0,ie(t3)&&await re(0,t3)}return t2}(n2,e.sources||{});const{consent:s2,user:r2,globals:i2,custom:a2}=e;s2&&await n2.command("consent",s2),r2&&await n2.command("user",r2),i2&&Object.assign(n2.globals,i2),a2&&Object.assign(n2.custom,a2),n2.config.run&&await n2.command("run");let c2=t2.push;const u2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),f2=u2.find(e2=>e2.config.primary);return f2?c2=f2.push:u2.length>0&&(c2=u2[0].push),{collector:n2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await Ue(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch{body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var lambda_default=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,userSettings=config.settings||{},settings={...userSettings,cors:userSettings.cors??!0,timeout:userSettings.timeout??3e4,enablePixelTracking:userSettings.enablePixelTracking??!0,healthPath:userSettings.healthPath??"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,context2)=>{const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&&params.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch{return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:result?.event?.id}}catch(error){return logger?.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return env.logger?.error("Lambda handler error",{error:error,requestId:requestId,method:parsed?.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};import{DeleteMessageCommand,GetQueueAttributesCommand as GetQueueAttributesCommand2,GetQueueUrlCommand,ReceiveMessageCommand}from"@aws-sdk/client-sqs";var DecoderError=class extends Error{constructor(message){super(message),this.name="DecoderError"}};import{SQSClient}from"@aws-sdk/client-sqs";import{CreateQueueCommand,GetQueueAttributesCommand,SQSClient as SQSClient2}from"@aws-sdk/client-sqs";import{SNSClient,SubscribeCommand}from"@aws-sdk/client-sns";import{resolveSetup}from"@walkeros/core";var DEFAULT_SETUP={region:"eu-central-1",fifoQueue:!1,visibilityTimeoutSeconds:30,messageRetentionSeconds:345600,maximumMessageSize:262144};function buildDlqAttributes(args){const attrs={};return attrs.MessageRetentionPeriod=String(1209600),args.kmsMasterKeyId&&(attrs.KmsMasterKeyId=args.kmsMasterKeyId),args.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),attrs}async function ensureQueue(args){const{sqs:sqs,logger:logger,queueName:queueName,attributes:attributes,tags:tags}=args;let queueUrl,queueCreated=!1;try{queueUrl=(await sqs.send(new CreateQueueCommand({QueueName:queueName,Attributes:attributes,tags:tags}))).QueueUrl??"",queueCreated=!0,logger.info(`SQS queue "${queueName}" created.`)}catch(err){if(function(err){return!!function(err){return"object"==typeof err&&null!==err&&"string"==typeof err.name}(err)&&("QueueNameExists"===err.name||"QueueAlreadyExists"===err.name||"AWS.SimpleQueueService.QueueNameExists"===err.name)}(err)){const message=err instanceof Error?err.message:String(err);return logger.throw(`SQS queue "${queueName}" exists with different attributes (${message}). Setup will not mutate an existing queue's attributes. Delete or rename the queue, then re-run setup.`)}throw err}if(!queueUrl)return logger.throw(`SQS CreateQueueCommand returned no QueueUrl for "${queueName}".`);const attrsRes=await sqs.send(new GetQueueAttributesCommand({QueueUrl:queueUrl,AttributeNames:["QueueArn"]})),queueArn=attrsRes.Attributes?.QueueArn??"";return queueArn?{queueCreated:queueCreated,queueUrl:queueUrl,queueArn:queueArn}:logger.throw(`SQS GetQueueAttributesCommand returned no QueueArn for "${queueName}".`)}function dlqName(queueName,fifo){if(fifo){return`${queueName.endsWith(".fifo")?queueName.slice(0,-5):queueName}-dlq.fifo`}return`${queueName}-dlq`}var setup=async context=>{const{id:id,config:config,env:env,logger:logger}=context,merged=resolveSetup(config.setup,DEFAULT_SETUP);if(!merged)return void logger.debug("SQS source setup skipped (config.setup is falsy).");const options={...DEFAULT_SETUP,...merged},settings=config.settings;if(!settings)return logger.throw("setup: settings missing");const queueName=settings.queueName;if(!queueName)return logger.throw("setup: settings.queueName is missing");const region=options.region??"eu-central-1",sqs=new(env.AWS?.SQSClient??SQSClient2)({region:region});let dlqArn,dlqCreated=!1;if(options.deadLetterQueue?.arn)dlqArn=options.deadLetterQueue.arn;else if(options.deadLetterQueue?.create){const dlqResult=await ensureQueue({sqs:sqs,logger:logger,queueName:dlqName(queueName,options.fifoQueue??!1),attributes:buildDlqAttributes({fifoQueue:options.fifoQueue??!1,kmsMasterKeyId:options.kmsMasterKeyId}),tags:(parentTags=options.tags,{...parentTags??{},walkerOS:"dlq"})});dlqArn=dlqResult.queueArn,dlqCreated=dlqResult.queueCreated}var parentTags;const finalQueueName=options.fifoQueue?queueName.endsWith(".fifo")?queueName:`${queueName}.fifo`:queueName;var args;const mainAttrs=function(args){const{options:options,dlqArn:dlqArn,queuePolicy:queuePolicy}=args,attrs={};if(attrs.VisibilityTimeout=String(options.visibilityTimeoutSeconds??30),attrs.MessageRetentionPeriod=String(options.messageRetentionSeconds??345600),attrs.MaximumMessageSize=String(options.maximumMessageSize??262144),options.kmsMasterKeyId&&(attrs.KmsMasterKeyId=options.kmsMasterKeyId),options.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),dlqArn){const maxReceiveCount=options.deadLetterQueue?.maxReceiveCount??5;attrs.RedrivePolicy=JSON.stringify({deadLetterTargetArn:dlqArn,maxReceiveCount:maxReceiveCount})}return queuePolicy&&(attrs.Policy=queuePolicy),attrs}({options:options,dlqArn:dlqArn,queuePolicy:options.subscribeToSnsTopic?(args={sourceId:id,topicArn:options.subscribeToSnsTopic.topicArn},JSON.stringify({Version:"2012-10-17",Statement:[{Sid:`walkerOSAllowSNSPublish-${args.sourceId}`,Effect:"Allow",Principal:{Service:"sns.amazonaws.com"},Action:"SQS:SendMessage",Resource:"*",Condition:{ArnEquals:{"aws:SourceArn":args.topicArn}}}]})):void 0}),mainResult=await ensureQueue({sqs:sqs,logger:logger,queueName:finalQueueName,attributes:mainAttrs,tags:options.tags});let subscriptionArn;if(options.subscribeToSnsTopic){const sns=new(env.AWS?.SNSClient??SNSClient)({region:region}),subAttrs={};options.subscribeToSnsTopic.rawMessageDelivery&&(subAttrs.RawMessageDelivery="true"),options.subscribeToSnsTopic.filterPolicy&&(subAttrs.FilterPolicy=JSON.stringify(options.subscribeToSnsTopic.filterPolicy));subscriptionArn=(await sns.send(new SubscribeCommand({TopicArn:options.subscribeToSnsTopic.topicArn,Protocol:"sqs",Endpoint:mainResult.queueArn,Attributes:Object.keys(subAttrs).length>0?subAttrs:void 0,ReturnSubscriptionArn:!0}))).SubscriptionArn??void 0,logger.info("SQS source setup: SNS subscription created",{topicArn:options.subscribeToSnsTopic.topicArn,subscriptionArn:subscriptionArn})}return{queueCreated:mainResult.queueCreated,queueUrl:mainResult.queueUrl,queueArn:mainResult.queueArn,dlqCreated:dlqArn?dlqCreated:void 0,dlqArn:dlqArn,subscriptionArn:subscriptionArn}};async function handleMessage(args){const{message:message,settings:settings,pushFn:pushFn,logger:logger}=args;try{const decoded=function(messageId,body,decoder){if("raw"===decoder)return Buffer.from(body,"utf8");if("text"===decoder)return body;try{return JSON.parse(body)}catch(err){throw new DecoderError(`SQS message ${messageId} JSON decode failed: ${err instanceof Error?err.message:String(err)}`)}}(message.id,message.body,settings.decoder??"json");if(null==decoded)return logger.debug("SQS message acked-and-dropped (decoder returned null)",{id:message.id}),void await message.ack();await pushFn((value=decoded,"object"==typeof value&&null!==value?value:"string"==typeof value?{data:{payload:value}}:Buffer.isBuffer(value)?{data:{payload:value.toString("base64")}}:{data:{payload:String(value)}})),await message.ack()}catch(err){const error=err instanceof Error?err.message:String(err);err instanceof DecoderError?logger.error("SQS message decode failed",{id:message.id,error:error}):logger.error("SQS message handler failed",{id:message.id,error:error}),"ack"===settings.onPushError?await message.ack():await message.nack()}var value}function isQueueDoesNotExist(err){if("object"!=typeof err||null===err)return!1;if(!("name"in err))return!1;const obj=err;return"QueueDoesNotExist"===obj.name||"AWS.SimpleQueueService.NonExistentQueue"===obj.name}function isFetchedMessage(value){if("object"!=typeof value||null===value)return!1;const obj=value;return"string"==typeof obj.MessageId&&"string"==typeof obj.ReceiptHandle&&"string"==typeof obj.Body}var sqs_default=async context=>{const{config:partialConfig={},env:env,logger:logger,id:id}=context,config=function(partial={},env,logger){const partialSettings=partial.settings??{},queueName="string"==typeof partialSettings.queueName?partialSettings.queueName:"";queueName||logger.throw("Config settings queueName missing");const region=partialSettings.region??"eu-central-1";let client=partialSettings.client;client||(client=new(env?.AWS?.SQSClient??SQSClient)({region:region,...partialSettings.config}));const settings={...partialSettings,client:client,queueName:queueName,region:region,queueUrl:partialSettings.queueUrl,config:partialSettings.config,decoder:partialSettings.decoder??"json",maxMessages:partialSettings.maxMessages??10,waitTimeSeconds:partialSettings.waitTimeSeconds??20,visibilityTimeout:partialSettings.visibilityTimeout,shutdownTimeoutMs:partialSettings.shutdownTimeoutMs??3e4,onPushError:partialSettings.onPushError??"nack"};return{...partial,settings:settings}}(partialConfig,env,logger),settings=config.settings;if(!settings.queueUrl)try{const res=await settings.client.send(new GetQueueUrlCommand({QueueName:settings.queueName}));if(!res.QueueUrl)return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);settings.queueUrl=res.QueueUrl}catch(err){if(isQueueDoesNotExist(err))return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);throw err}if(!settings.queueArn)try{const res=await settings.client.send(new GetQueueAttributesCommand2({QueueUrl:settings.queueUrl,AttributeNames:["QueueArn"]}));settings.queueArn=res.Attributes?.QueueArn}catch(err){logger.debug("SQS GetQueueAttributesCommand failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}let stopped=!1;const inFlight=new Set,loopPromise=(async()=>{for(;!stopped;)try{const messages=(await settings.client.send(new ReceiveMessageCommand({QueueUrl:settings.queueUrl,MaxNumberOfMessages:settings.maxMessages??10,WaitTimeSeconds:settings.waitTimeSeconds??20,VisibilityTimeout:settings.visibilityTimeout,MessageAttributeNames:["All"],AttributeNames:["All"]}))).Messages??[];for(const msg of messages){if(!isFetchedMessage(msg)){logger.warn("SQS received malformed message; skipping",{messageId:"string"==typeof msg.MessageId?msg.MessageId:void 0});continue}const fetched=msg,handler=handleMessage({message:{id:fetched.MessageId,body:fetched.Body,receiptHandle:fetched.ReceiptHandle,ack:async()=>{await settings.client.send(new DeleteMessageCommand({QueueUrl:settings.queueUrl??"",ReceiptHandle:fetched.ReceiptHandle}))},nack:async()=>{}},settings:settings,pushFn:env.push,logger:logger});inFlight.add(handler),handler.finally(()=>{inFlight.delete(handler)})}}catch(err){if(stopped)break;const error=err instanceof Error?err.message:String(err);if(isQueueDoesNotExist(err)){logger.error(`SQS queue "${settings.queueName}" not found at runtime. Run "walkeros setup source.${id}" to create it. Original: ${error}`),stopped=!0;break}logger.error("SQS receive error (will retry)",{error:error}),await new Promise(r2=>setTimeout(r2,1e3))}})();return{type:"sqs",config:config,setup:setup,push:async content=>{if(!content)return;const result={acked:!1,nacked:!1};return await handleMessage({message:{id:content.MessageId,body:content.Body,receiptHandle:content.ReceiptHandle,ack:async()=>{result.acked=!0},nack:async()=>{result.nacked=!0}},settings:settings,pushFn:env.push,logger:logger}),result},destroy:async()=>{stopped=!0;const timeoutMs=settings.shutdownTimeoutMs??3e4;let timer;try{await Promise.race([(async()=>{await loopPromise,await Promise.all(Array.from(inFlight))})(),new Promise(resolve=>{timer=setTimeout(()=>{logger.warn(`SQS source close timed out after ${timeoutMs}ms; forcing close.`),resolve()},timeoutMs)})])}finally{timer&&clearTimeout(timer),function(client,logger){const candidate=client;if("function"==typeof candidate.destroy)try{candidate.destroy()}catch(err){logger.debug("SQS client destroy failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}(settings.client,logger)}}}},types_exports2={};export{types_exports as SourceLambda,types_exports2 as SourceSqs,examples_exports as examples,lambda_default as sourceLambda,sqs_default as sourceSqs};//# sourceMappingURL=index.mjs.map
1
+ var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={title:"Lambda POST",description:"An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-123"},body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},apiGatewayV1Post={title:"API Gateway v1 POST",description:"A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{httpMethod:"POST",path:"/collect",requestContext:{requestId:"req-789",identity:{sourceIp:"203.0.113.42"}},queryStringParameters:null,body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},lambdaGet={title:"Lambda GET",description:"An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.",trigger:{type:"GET"},in:{version:"2.0",requestContext:{http:{method:"GET",path:"/collect"},requestId:"req-456"},rawQueryString:"e=page+view&d=%7B%22title%22%3A%22Home%22%7D",isBase64Encoded:!1},out:[["elb",{e:"page view",d:'{"title":"Home"}'}]]};import{assign as o}from"@walkeros/core";import{assign as r,createLogger as i}from"@walkeros/core";import{assign as a,buildCacheContext as c,clone as u,compileCache as f,checkCache as l,storeCache as d,compileNext as g,createIngest as m,debounce as p,getId as h,getGrantedConsent as y,isDefined as b,isFunction as v,isObject as w,isRouteArray as k,processEventMapping as C,resolveNext as O,tryCatchAsync as j,useHooks as q}from"@walkeros/core";import{isArray as A}from"@walkeros/core";import{tryCatch as x,tryCatchAsync as S}from"@walkeros/core";import{createIngest as D,getMappingValue as $,tryCatchAsync as E,compileNext as _,resolveNext as I,isRouteArray as P,compileCache as R,checkCache as M,storeCache as H,applyUpdate as T,buildCacheContext as G}from"@walkeros/core";import{createIngest as B,isObject as N,tryCatchAsync as U,useHooks as F,compileNext as W,resolveNext as z,isRouteArray as L,compileCache as V,checkCache as J,storeCache as K,buildCacheContext as Q}from"@walkeros/core";import{assign as je,getSpanId as qe,isFunction as Ae,isString as xe}from"@walkeros/core";import{isObject as Se}from"@walkeros/core";import{createIngest as Ie,getGrantedConsent as Pe,processEventMapping as Re,tryCatchAsync as Me,useHooks as He}from"@walkeros/core";import{useHooks as Ge,tryCatchAsync as Be}from"@walkeros/core";import{useHooks as Ne}from"@walkeros/core";var t_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function X(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function Y(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;e2&&!L(e2)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:B(t2),config:n2.config,env:re(n2.config.env)};s2.debug("init");const i2=await F(n2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:i2?.env||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...re(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await F(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}function oe(e,n2){if(e)return"string"==typeof e||Array.isArray(e)&&!L(e)?e:z(W(e),n2)??void 0}async function se(e,n2,t2,o2,s2,r2,i2){i2&&s2?._meta&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await U(ne)(e,r3,o3))return e.logger.error(`Transformer init failed: ${o3}`),{event:null,respond:c2};if(i2&&void 0!==r3.config?.chainMocks?.[i2]){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,f2=u2?V(u2):void 0,l2=f2?X(f2,e):void 0;let d2;if(f2&&l2){const e2=Q(s2,a2),n3=J(f2,l2,e2,`t:${o3}`);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,f2.full)return{event:a2,respond:c2};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=ee(oe(g2,Q(s2,a2)),Y(n2));if(t3.length>0){const o4=await se(e,n2,t3,a2,s2,c2,i2);if(null===o4.event)return{event:null,respond:o4.respond??c2};o4.respond&&(c2=o4.respond),a2=Array.isArray(o4.event)?o4.event[0]:o4.event}}const m2=await U(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===m2)return{event:null,respond:c2};if(Array.isArray(m2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(m2.map(async t3=>{const o4=t3.event||a2,u4=s2?{...s2,_meta:{...s2._meta,path:[...s2._meta.path]}}:B("unknown");if(t3.next){const s3=oe(t3.next,Q(u4,o4));if(s3){const t4=ee(s3,Y(n2));if(t4.length>0)return se(e,n2,t4,o4,u4,c2,i2)}return{event:o4,respond:c2}}return r4.length>0?se(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let f3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(f3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?l3.push(...n3.event):l3.push(n3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:f3}:1===l3.length?{event:l3[0],respond:f3}:{event:l3,respond:f3}}if(m2&&"object"==typeof m2){const{event:t3,respond:o4,next:r4}=m2;if(o4&&(c2=o4),r4){const o5=oe(r4,Q(s2,a2));if(!o5){t3&&(a2=t3);continue}const u3=ee(o5,Y(n2));return u3.length>0?se(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}t3&&(a2=t3)}if(d2&&l2&&K(l2,d2.key,a2,d2.ttl),(!m2||"object"==typeof m2&&!m2.next)&&r3.config.next&&L(r3.config.next)){const t3=r3.config.next,o4=W(t3),u3=z(o4,Q(s2,a2));if(u3){const t4=ee(u3,Y(n2));if(t4.length>0)return se(e,n2,t4,a2,s2,c2,i2)}return{event:a2,respond:c2}}}return{event:a2,respond:c2}}function re(e){return e&&N(e)?e:{}}async function ie(e,n2){if(!n2.on||!n2.queueOn?.length)return;const t2=n2.queueOn;n2.queueOn=[];for(const{type:e2,data:o2}of t2)await E(n2.on)(e2,o2)}function ae(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ce(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2;let f2,l2=D(n2);const d2=u2?R({...u2,full:u2.full??!0}):void 0,g2=_(a2),m2=Array.isArray(a2)&&P(a2)||!g2?void 0:ee(I(g2),Y(e.transformers)),p2=_(c2),h2=Array.isArray(c2)&&P(c2)||!p2?void 0:ee(I(p2),Y(e.transformers)),y2=e.logger.scope("source").scope(n2),b2={push:async(t3,o3={})=>{let r3,i3=t3;const a3=h2??(p2?ee(I(p2,G(l2)),Y(e.transformers)):[]);if(a3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t4=await se(e,e.transformers,a3,i3,l2,f2,`source.${n2}.before`);if(null===t4.event)return{ok:!0};t4.respond&&(f2=t4.respond),i3=Array.isArray(t4.event)?t4.event[0]:t4.event}if(d2){const t4=X(d2,e);if(t4){const o4=G(l2),s3=M(d2,t4,o4,`s:${n2}`);if(s3){if("HIT"===s3.status&&void 0!==s3.value&&d2.full){let n3=s3.value;return s3.rule.update&&(n3=await T(n3,s3.rule.update,{...o4,cache:{status:"HIT"}},e)),f2?.(n3),{ok:!0}}if("MISS"===s3.status&&d2.full&&f2){const n3=f2,i4=s3.rule.update,a4={...o4,cache:{status:"MISS"}},c4=s3.key,u4=s3.rule.ttl;f2=o5=>{H(t4,c4,o5,u4),i4?r3=(async()=>{const t5=await T(o5,i4,a4,e);n3(t5)})():n3(o5)}}"MISS"!==s3.status||d2.full||H(t4,s3.key,!0,s3.rule.ttl)}}}const c3=m2??(g2?ee(I(g2,G(l2)),Y(e.transformers)):[]),u3=await e.push(i3,{...o3,id:n2,ingest:l2,respond:f2,mapping:s2,preChain:c3});return r3&&await r3,u3},command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:y2,...r2},v2={collector:e,logger:y2,id:n2,config:s2,env:b2,setIngest:async t3=>{if(!s2.ingest)return void(l2=D(n2));const o3=await $(t3,s2.ingest,{collector:e}),r3=D(n2);l2={...r3,...o3,_meta:r3._meta}},setRespond:e2=>{f2=e2}},w2=await E(o2)(v2);if(!w2)return;const k2=w2.type||"unknown",C2=e.logger.scope(k2).scope(n2);return b2.logger=C2,i2&&(w2.config={...w2.config,primary:i2}),w2}function fe(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function de(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:Oe(n2.env,n2.config.env)};x(n2.on)(o2,a2)}function ge(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,o3){const s3=o3||e2.consent,r3=fe(e2,t_Commands.Consent);n3.forEach(e3=>{Object.keys(s3).filter(n4=>n4 in e3).forEach(n4=>{x(e3[n4])(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=fe(e2,t_Commands.Ready);n3.forEach(e3=>{x(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=fe(e2,t_Commands.Run);n3.forEach(e3=>{x(e3)(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=fe(e2,t_Commands.Session);n3.forEach(n4=>{x(n4)(e2.session,o3)})}(e,o2);break;default:{const t2=fe(e,n2);o2.forEach(e2=>{"function"==typeof e2&&x(e2)(r2,t2)});break}}}function pe(e,n2,t2,o2){if(!e)return[];if(n2){const e2=O(n2,c(o2));return e2?ee(e2,t2):[]}return k(e)?[]:ee(e,t2)}async function he(e,n2,t2){const{code:o2,config:s2={},env:r2={},before:i2,next:a2,cache:c2}=n2;if(!v(o2.push))return we({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=t2||s2||{init:!1};let f2=i2?{...u2,before:i2}:{...u2};a2&&(f2={...f2,next:a2}),c2&&(f2={...f2,cache:c2});const l2={...o2,config:f2,env:Oe(o2.env,r2)};let d2=l2.config.id;if(!d2)do{d2=h(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d2]);return e.destinations[d2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),ye(e,void 0,{},{[d2]:l2})}async function ye(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return we({ok:!1});n2&&(e.queue.push(n2),e.status.in++),o2||(o2=e.destinations);const h2=e.transformers?Y(e.transformers):{},b2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let b3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&b3.push(u(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:m("unknown");if(!b3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!b3.length&&s3.queueOn?.length){let n3=!1;try{n3=await be(e,s3,o3)}catch(n4){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const w3=[],C3=b3.filter(e2=>{const n3=y(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,w3.push(e2),!1)});if(s3.queuePush.push(...C3),!w3.length)return{id:o3,destination:s3,queue:b3};let O2,q2,A2=!1;try{A2=await be(e,s3,o3)}catch(n3){const t3=s3.type||"unknown";e.logger.scope(t3).error("Destination init threw",{error:n3 instanceof Error?n3.message:String(n3)})}if(!A2)return{id:o3,destination:s3,queue:b3};s3.dlq||(s3.dlq=[]);const x2=s3.config.before,S2=pe(x2,x2&&k(x2)?g(x2):void 0,h2,v3),D2=s3.config.next,$2=D2&&k(D2)?g(D2):void 0,E2=s3.config?.cache,_2=E2?f(E2):void 0,I2=_2?X(_2,e):void 0;let P2=0;return await Promise.all(w3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(p2,n3.user),_2?.full&&I2){const e2=c(v3,n3),t3=l(_2,I2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,f2=t2.respond;if(S2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await se(e,e.transformers,S2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(f2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(_2&&!_2.full&&I2){const e2=c(v3,u2),t3=l(_2,I2,e2,`d:${o3}`);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const y2=await j(ve,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),O2=n4,m2=!0,s3.dlq.push([u2,n4])})(e,s3,o3,u2,v3,f2);if(P2+=Date.now()-g2,r3&&I2&&void 0===s3.config.mock&&d(I2,r3.key,y2??!0,r3.ttl),void 0!==y2&&(q2=y2),!m2&&D2){void 0!==y2&&(v3._response=y2);const n4=pe(D2,$2,h2,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,n4,u2,v3,f2,`destination.${o3}.next`);t3.respond&&(f2=t3.respond)}}return n3})),{id:o3,destination:s3,error:O2,response:q2,totalDuration:P2}})),v2={},w2={},C2={};for(const n3 of b2){if(n3.skipped)continue;const t3={type:n3.destination.type||"unknown",data:n3.response};e.status.destinations[n3.id]||(e.status.destinations[n3.id]={count:0,failed:0,duration:0});const o3=e.status.destinations[n3.id],s3=Date.now();n3.error?(t3.error=n3.error,C2[n3.id]=t3,o3.failed++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.failed++):n3.queue&&n3.queue.length?w2[n3.id]=t3:(v2[n3.id]=t3,o3.count++,o3.lastAt=s3,o3.duration+=n3.totalDuration||0,e.status.out++)}return we({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(w2).length&&{queued:w2},...Object.keys(C2).length&&{failed:C2}})}async function be(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:Oe(n2.env,n2.config.env)};s2.debug("init");const i2=await q(n2.init,"DestinationInit",e.hooks,e.logger)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},n2.queueOn?.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)de(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function ve(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await C(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),f2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...Oe(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const l2=a2.mapping,d2=a2.mappingKey||"* *";if(!l2?.batch||!n2.pushBatch||void 0!==i2.mock){u2.debug("push",{event:a2.event.name});const t3=await q(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,f2);return u2.debug("push done"),t3}{if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,events:[],data:[]};n2.batches[d2]={batched:o4,batchFn:p(()=>{const o5=n2.batches[d2].batched,a3={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:l2,ingest:s2,env:{...Oe(n2.env,i2.env),...r2?{respond:r2}:{}}};u2.debug("push batch",{events:o5.events.length}),q(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o5,a3),u2.debug("push batch done"),o5.events=[],o5.data=[]},l2.batch)}}const o3=n2.batches[d2];o3.batched.events.push(a2.event),b(a2.data)&&o3.batched.data.push(a2.data),o3.batchFn()}return!0}function we(e){return{ok:!e?.failed,...e}}function ke(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=Oe(n2.env,o2);return{...n2,config:a2,env:c2}}function Oe(e,n2){return e||n2?n2?e&&w(e)&&w(n2)?{...e,...n2}:n2:e:{}}async function De(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:o3.env??{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function $e(e,n2,o2,r2){let i2,a2,c2=!1;switch(n2){case t_Commands.Config:Se(o2)&&(je(e.config,o2,{shallow:!1}),a2=o2,c2=!0);break;case t_Commands.Consent:if(Se(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=o(e.consent,t2),{update:t2}}(e,o2);a2=n3,c2=!0}break;case t_Commands.Custom:Se(o2)&&(e.custom=je(e.custom,o2),a2=o2,c2=!0);break;case t_Commands.Destination:Se(o2)&&("code"in o2&&Se(o2.code)?i2=await he(e,o2,r2):Ae(o2.push)&&(i2=await he(e,{code:o2},r2)));break;case t_Commands.Globals:Se(o2)&&(e.globals=je(e.globals,o2),a2=o2,c2=!0);break;case t_Commands.On:xe(o2)&&await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=A(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,ge(e,n2,r2)}(e,o2,r2);break;case t_Commands.Ready:c2=!0;break;case t_Commands.Run:i2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=je(e.consent,n2.consent)),n2.user&&(e.user=je(e.user,n2.user)),n2.globals&&(e.globals=je(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=je(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await ye(e)}(e,o2),c2=!0;break;case t_Commands.Session:c2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await De(e2.sources,"source",n3),await De(e2.destinations,"destination",n3),await De(e2.transformers,"transformer",n3),await De(e2.stores,"store",n3)}(e);break;case t_Commands.User:Se(o2)&&(je(e.user,o2,{shallow:!1}),a2=o2,c2=!0)}return c2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const t2 of Object.values(e.sources)){if(t2.config.require?.length){const e2=t2.config.require.indexOf(n2);-1!==e2&&t2.config.require.splice(e2,1)}t2.on&&(ae(t2)?!1===await S(t2.on)(n2,r2)&&(a2=!0):(t2.queueOn=t2.queueOn||[],t2.queueOn.push({type:n2,data:r2})))}Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});de(e,o3,t2,n2,r2)}});for(const n3 of Object.values(e.sources))ae(n3)&&n3.queueOn?.length&&await ie(0,n3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,n3){for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=ke(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),ge(e,n2,i2,s2),!a2}(e,n2,void 0,a2),i2=await ye(e)),i2||we({ok:!0})}function Ee(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${t2} ${o2}`,data:i2={},context:a2={},globals:c2=e.globals,custom:u2={},user:f2=e.user,nested:l2=[],consent:d2=e.consent,id:g2=qe(),trigger:m2="",entity:p2=t2,action:h2=o2,timing:y2=0,source:b2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:f2,nested:l2,consent:d2,id:g2,trigger:m2,entity:p2,action:h2,timestamp:s2,timing:y2,source:b2}}async function Ue(e){const n2=r({globalsStatic:{},sessionStatic:{},run:!0},e,{merge:!1,extend:!1}),t2={level:e.logger?.level,handler:e.logger?.handler},o2=i(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var e2,n3;a2.push=function(e,n2){return He(async(t2,o2={})=>await Me(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:f2,exclude:l2}=o2;let d2=a2,g2=t2;const m2=f2||l2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,f2,l2):void 0,p2=i2??Ie(r2||"unknown");if(c2){const n3=await Re(g2,c2,e);if(n3.ignore)return we({ok:!0});if(c2.consent&&!Pe(c2.consent,e.consent,n3.event.consent))return we({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,u2,g2,p2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return we({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=Ee(e,o4);return ye(e,s3,{id:r2,ingest:p2,respond:d2},m2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return o3[0]??we({ok:!0})}g2=t3.event}const h2=n2(g2),y2=Ee(e,h2),b2=await ye(e,y2,{id:r2,ingest:p2,respond:d2},m2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return b2},()=>we({ok:!1}))(),"Push",e.hooks,e.logger)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.0.2"},...e2})),a2.command=(n3=$e,Ge(async(t3,o3,s3)=>await Be(async()=>await n3(e2,t3,o3,s3),()=>we({ok:!1}))(),"Command",(e2=a2).hooks,e2.logger));const c2=e.stores||{};if(a2.stores=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,config:r2={},env:i2={}}=s3,a3=e2.logger.scope("store").scope(o3),c3={collector:e2,logger:a3,id:o3,config:r2,env:i2},u2=await n4(c3),f2=u2.get,l2=u2.set,d2=u2.delete;u2.get=Ne(f2,"StoreGet",e2.hooks,e2.logger),u2.set=Ne(l2,"StoreSet",e2.hooks,e2.logger),u2.delete=Ne(d2,"StoreDelete",e2.hooks,e2.logger),t3[o3]=u2}return t3}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),!a2.stores.__cache){const e2=new Map;a2.stores.__cache={type:"memory",config:{},get:n3=>{const t3=e2.get(n3);if(t3){if(!(t3.expires&&Date.now()>t3.expires))return t3.value;e2.delete(n3)}},set:(n3,t3,o3)=>{e2.set(n3,{value:t3,expires:o3?Date.now()+o3:void 0})},delete:n3=>{e2.delete(n3)}}}return a2.destinations=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2))s2.config?.require?.length?e.pending.destinations[o2]=s2:t2[o2]=ke(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,{config:i2}=Z(s3,"before"),{config:a3}=Z({...s3,config:i2},"next"),c3=Object.keys(r2).length>0?{...a3,env:r2}:a3,{cache:u2}=s3,f2=u2?{...c3,cache:u2}:c3,l2=e2.logger.scope("transformer").scope(o3),d2={collector:e2,logger:l2,id:o3,ingest:B(o3),config:f2,env:r2},g2=await n4(d2);t3[o3]=g2}return t3}(a2,e.transformers||{}),a2}async function Fe(e){e=e||{};const n2=await Ue(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3,i3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const s4=e2.replace("walker ","");return o2.command(s4,n3,t3)}let a3;if("string"==typeof e2)a3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data=n3);else{if(!e2||"object"!=typeof e2)return we({ok:!1});a3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(a3.data={...a3.data||{},...n3})}return s3&&"object"==typeof s3&&(a3.context=s3),r3&&Array.isArray(r3)&&(a3.nested=r3),i3&&"object"==typeof i3&&(a3.custom=i3),o2.push(a3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ce(e,o2,s2);if(!n3)continue;const r2=s2.config?.require;n3.config={...n3.config,init:!1,...r2?{require:[...r2]}:{}},t2[o2]=n3}Object.assign(e.sources,t2);for(const n3 of Object.keys(t2)){const t3=e.sources[n3];t3.init&&await E(t3.init.bind(t3))(),t3.config.init=!0,ae(t3)&&await ie(0,t3)}return t2}(n2,e.sources||{});const{consent:s2,user:r2,globals:i2,custom:a2}=e;s2&&await n2.command("consent",s2),r2&&await n2.command("user",r2),i2&&Object.assign(n2.globals,i2),a2&&Object.assign(n2.custom,a2),n2.config.run&&await n2.command("run");let c2=t2.push;const u2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),f2=u2.find(e2=>e2.config.primary);return f2?c2=f2.push:u2.length>0&&(c2=u2[0].push),{collector:n2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await Fe(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch{body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var lambda_default=async context=>{const{config:config={},env:env,setIngest:setIngest}=context,{push:envPush}=env,userSettings=config.settings||{},settings={...userSettings,cors:userSettings.cors??!0,timeout:userSettings.timeout??3e4,enablePixelTracking:userSettings.enablePixelTracking??!0,healthPath:userSettings.healthPath??"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,context2)=>{const requestId=context2.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&&params.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);if(settings.healthPath&&path===settings.healthPath)return createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId);if("OPTIONS"===parsed.method)return createResponse(204,"",corsHeaders,requestId);if(await setIngest(event),"GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch{return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:result?.event?.id}}catch(error){return logger?.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)}catch(error){return env.logger?.error("Lambda handler error",{error:error,requestId:requestId,method:parsed?.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};import{DeleteMessageCommand,GetQueueAttributesCommand as GetQueueAttributesCommand2,GetQueueUrlCommand,ReceiveMessageCommand}from"@aws-sdk/client-sqs";var DecoderError=class extends Error{constructor(message){super(message),this.name="DecoderError"}};import{SQSClient}from"@aws-sdk/client-sqs";import{CreateQueueCommand,GetQueueAttributesCommand,SQSClient as SQSClient2}from"@aws-sdk/client-sqs";import{SNSClient,SubscribeCommand}from"@aws-sdk/client-sns";import{resolveSetup}from"@walkeros/core";var DEFAULT_SETUP={region:"eu-central-1",fifoQueue:!1,visibilityTimeoutSeconds:30,messageRetentionSeconds:345600,maximumMessageSize:262144};function buildDlqAttributes(args){const attrs={};return attrs.MessageRetentionPeriod=String(1209600),args.kmsMasterKeyId&&(attrs.KmsMasterKeyId=args.kmsMasterKeyId),args.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),attrs}async function ensureQueue(args){const{sqs:sqs,logger:logger,queueName:queueName,attributes:attributes,tags:tags}=args;let queueUrl,queueCreated=!1;try{queueUrl=(await sqs.send(new CreateQueueCommand({QueueName:queueName,Attributes:attributes,tags:tags}))).QueueUrl??"",queueCreated=!0,logger.info(`SQS queue "${queueName}" created.`)}catch(err){if(function(err){return!!function(err){return"object"==typeof err&&null!==err&&"string"==typeof err.name}(err)&&("QueueNameExists"===err.name||"QueueAlreadyExists"===err.name||"AWS.SimpleQueueService.QueueNameExists"===err.name)}(err)){const message=err instanceof Error?err.message:String(err);return logger.throw(`SQS queue "${queueName}" exists with different attributes (${message}). Setup will not mutate an existing queue's attributes. Delete or rename the queue, then re-run setup.`)}throw err}if(!queueUrl)return logger.throw(`SQS CreateQueueCommand returned no QueueUrl for "${queueName}".`);const attrsRes=await sqs.send(new GetQueueAttributesCommand({QueueUrl:queueUrl,AttributeNames:["QueueArn"]})),queueArn=attrsRes.Attributes?.QueueArn??"";return queueArn?{queueCreated:queueCreated,queueUrl:queueUrl,queueArn:queueArn}:logger.throw(`SQS GetQueueAttributesCommand returned no QueueArn for "${queueName}".`)}function dlqName(queueName,fifo){if(fifo){return`${queueName.endsWith(".fifo")?queueName.slice(0,-5):queueName}-dlq.fifo`}return`${queueName}-dlq`}var setup=async context=>{const{id:id,config:config,env:env,logger:logger}=context,merged=resolveSetup(config.setup,DEFAULT_SETUP);if(!merged)return void logger.debug("SQS source setup skipped (config.setup is falsy).");const options={...DEFAULT_SETUP,...merged},settings=config.settings;if(!settings)return logger.throw("setup: settings missing");const queueName=settings.queueName;if(!queueName)return logger.throw("setup: settings.queueName is missing");const region=options.region??"eu-central-1",sqs=new(env.AWS?.SQSClient??SQSClient2)({region:region});let dlqArn,dlqCreated=!1;if(options.deadLetterQueue?.arn)dlqArn=options.deadLetterQueue.arn;else if(options.deadLetterQueue?.create){const dlqResult=await ensureQueue({sqs:sqs,logger:logger,queueName:dlqName(queueName,options.fifoQueue??!1),attributes:buildDlqAttributes({fifoQueue:options.fifoQueue??!1,kmsMasterKeyId:options.kmsMasterKeyId}),tags:(parentTags=options.tags,{...parentTags??{},walkerOS:"dlq"})});dlqArn=dlqResult.queueArn,dlqCreated=dlqResult.queueCreated}var parentTags;const finalQueueName=options.fifoQueue?queueName.endsWith(".fifo")?queueName:`${queueName}.fifo`:queueName;var args;const mainAttrs=function(args){const{options:options,dlqArn:dlqArn,queuePolicy:queuePolicy}=args,attrs={};if(attrs.VisibilityTimeout=String(options.visibilityTimeoutSeconds??30),attrs.MessageRetentionPeriod=String(options.messageRetentionSeconds??345600),attrs.MaximumMessageSize=String(options.maximumMessageSize??262144),options.kmsMasterKeyId&&(attrs.KmsMasterKeyId=options.kmsMasterKeyId),options.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),dlqArn){const maxReceiveCount=options.deadLetterQueue?.maxReceiveCount??5;attrs.RedrivePolicy=JSON.stringify({deadLetterTargetArn:dlqArn,maxReceiveCount:maxReceiveCount})}return queuePolicy&&(attrs.Policy=queuePolicy),attrs}({options:options,dlqArn:dlqArn,queuePolicy:options.subscribeToSnsTopic?(args={sourceId:id,topicArn:options.subscribeToSnsTopic.topicArn},JSON.stringify({Version:"2012-10-17",Statement:[{Sid:`walkerOSAllowSNSPublish-${args.sourceId}`,Effect:"Allow",Principal:{Service:"sns.amazonaws.com"},Action:"SQS:SendMessage",Resource:"*",Condition:{ArnEquals:{"aws:SourceArn":args.topicArn}}}]})):void 0}),mainResult=await ensureQueue({sqs:sqs,logger:logger,queueName:finalQueueName,attributes:mainAttrs,tags:options.tags});let subscriptionArn;if(options.subscribeToSnsTopic){const sns=new(env.AWS?.SNSClient??SNSClient)({region:region}),subAttrs={};options.subscribeToSnsTopic.rawMessageDelivery&&(subAttrs.RawMessageDelivery="true"),options.subscribeToSnsTopic.filterPolicy&&(subAttrs.FilterPolicy=JSON.stringify(options.subscribeToSnsTopic.filterPolicy));subscriptionArn=(await sns.send(new SubscribeCommand({TopicArn:options.subscribeToSnsTopic.topicArn,Protocol:"sqs",Endpoint:mainResult.queueArn,Attributes:Object.keys(subAttrs).length>0?subAttrs:void 0,ReturnSubscriptionArn:!0}))).SubscriptionArn??void 0,logger.info("SQS source setup: SNS subscription created",{topicArn:options.subscribeToSnsTopic.topicArn,subscriptionArn:subscriptionArn})}return{queueCreated:mainResult.queueCreated,queueUrl:mainResult.queueUrl,queueArn:mainResult.queueArn,dlqCreated:dlqArn?dlqCreated:void 0,dlqArn:dlqArn,subscriptionArn:subscriptionArn}};async function handleMessage(args){const{message:message,settings:settings,pushFn:pushFn,logger:logger}=args;try{const decoded=function(messageId,body,decoder){if("raw"===decoder)return Buffer.from(body,"utf8");if("text"===decoder)return body;try{return JSON.parse(body)}catch(err){throw new DecoderError(`SQS message ${messageId} JSON decode failed: ${err instanceof Error?err.message:String(err)}`)}}(message.id,message.body,settings.decoder??"json");if(null==decoded)return logger.debug("SQS message acked-and-dropped (decoder returned null)",{id:message.id}),void await message.ack();await pushFn((value=decoded,"object"==typeof value&&null!==value?value:"string"==typeof value?{data:{payload:value}}:Buffer.isBuffer(value)?{data:{payload:value.toString("base64")}}:{data:{payload:String(value)}})),await message.ack()}catch(err){const error=err instanceof Error?err.message:String(err);err instanceof DecoderError?logger.error("SQS message decode failed",{id:message.id,error:error}):logger.error("SQS message handler failed",{id:message.id,error:error}),"ack"===settings.onPushError?await message.ack():await message.nack()}var value}function isQueueDoesNotExist(err){if("object"!=typeof err||null===err)return!1;if(!("name"in err))return!1;const obj=err;return"QueueDoesNotExist"===obj.name||"AWS.SimpleQueueService.NonExistentQueue"===obj.name}function isFetchedMessage(value){if("object"!=typeof value||null===value)return!1;const obj=value;return"string"==typeof obj.MessageId&&"string"==typeof obj.ReceiptHandle&&"string"==typeof obj.Body}var sqs_default=async context=>{const{config:partialConfig={},env:env,logger:logger,id:id}=context,config=function(partial={},env,logger){const partialSettings=partial.settings??{},queueName="string"==typeof partialSettings.queueName?partialSettings.queueName:"";queueName||logger.throw("Config settings queueName missing");const region=partialSettings.region??"eu-central-1";let client=partialSettings.client;client||(client=new(env?.AWS?.SQSClient??SQSClient)({region:region,...partialSettings.config}));const settings={...partialSettings,client:client,queueName:queueName,region:region,queueUrl:partialSettings.queueUrl,config:partialSettings.config,decoder:partialSettings.decoder??"json",maxMessages:partialSettings.maxMessages??10,waitTimeSeconds:partialSettings.waitTimeSeconds??20,visibilityTimeout:partialSettings.visibilityTimeout,shutdownTimeoutMs:partialSettings.shutdownTimeoutMs??3e4,onPushError:partialSettings.onPushError??"nack"};return{...partial,settings:settings}}(partialConfig,env,logger),settings=config.settings;if(!settings.queueUrl)try{const res=await settings.client.send(new GetQueueUrlCommand({QueueName:settings.queueName}));if(!res.QueueUrl)return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);settings.queueUrl=res.QueueUrl}catch(err){if(isQueueDoesNotExist(err))return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);throw err}if(!settings.queueArn)try{const res=await settings.client.send(new GetQueueAttributesCommand2({QueueUrl:settings.queueUrl,AttributeNames:["QueueArn"]}));settings.queueArn=res.Attributes?.QueueArn}catch(err){logger.debug("SQS GetQueueAttributesCommand failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}let stopped=!1;const inFlight=new Set,loopPromise=(async()=>{for(;!stopped;)try{const messages=(await settings.client.send(new ReceiveMessageCommand({QueueUrl:settings.queueUrl,MaxNumberOfMessages:settings.maxMessages??10,WaitTimeSeconds:settings.waitTimeSeconds??20,VisibilityTimeout:settings.visibilityTimeout,MessageAttributeNames:["All"],AttributeNames:["All"]}))).Messages??[];for(const msg of messages){if(!isFetchedMessage(msg)){logger.warn("SQS received malformed message; skipping",{messageId:"string"==typeof msg.MessageId?msg.MessageId:void 0});continue}const fetched=msg,handler=handleMessage({message:{id:fetched.MessageId,body:fetched.Body,receiptHandle:fetched.ReceiptHandle,ack:async()=>{await settings.client.send(new DeleteMessageCommand({QueueUrl:settings.queueUrl??"",ReceiptHandle:fetched.ReceiptHandle}))},nack:async()=>{}},settings:settings,pushFn:env.push,logger:logger});inFlight.add(handler),handler.finally(()=>{inFlight.delete(handler)})}}catch(err){if(stopped)break;const error=err instanceof Error?err.message:String(err);if(isQueueDoesNotExist(err)){logger.error(`SQS queue "${settings.queueName}" not found at runtime. Run "walkeros setup source.${id}" to create it. Original: ${error}`),stopped=!0;break}logger.error("SQS receive error (will retry)",{error:error}),await new Promise(r2=>setTimeout(r2,1e3))}})();return{type:"sqs",config:config,setup:setup,push:async content=>{if(!content)return;const result={acked:!1,nacked:!1};return await handleMessage({message:{id:content.MessageId,body:content.Body,receiptHandle:content.ReceiptHandle,ack:async()=>{result.acked=!0},nack:async()=>{result.nacked=!0}},settings:settings,pushFn:env.push,logger:logger}),result},destroy:async()=>{stopped=!0;const timeoutMs=settings.shutdownTimeoutMs??3e4;let timer;try{await Promise.race([(async()=>{await loopPromise,await Promise.all(Array.from(inFlight))})(),new Promise(resolve=>{timer=setTimeout(()=>{logger.warn(`SQS source close timed out after ${timeoutMs}ms; forcing close.`),resolve()},timeoutMs)})])}finally{timer&&clearTimeout(timer),function(client,logger){const candidate=client;if("function"==typeof candidate.destroy)try{candidate.destroy()}catch(err){logger.debug("SQS client destroy failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}(settings.client,logger)}}}},types_exports2={};export{types_exports as SourceLambda,types_exports2 as SourceSqs,examples_exports as examples,lambda_default as sourceLambda,sqs_default as sourceSqs};//# sourceMappingURL=index.mjs.map