@walkeros/server-source-aws 4.7.0-next-1790722899482 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -2
- package/dist/dev.d.mts +24 -14
- package/dist/dev.d.ts +24 -14
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/walkerOS.json +283 -10
- package/package.json +3 -3
package/dist/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dev.ts","../src/schemas.ts","../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/sqs/schemas/index.ts","../src/sqs/schemas/settings.ts","../src/sqs/schemas/setup.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts","../src/sqs/examples/index.ts","../src/sqs/examples/env.ts","../src/sqs/examples/step.ts","../src/sqs/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './lambda/examples';\nexport * as sqsExamples from './sqs/examples';\n\nimport * as lambdaExamplesNs from './lambda/examples';\nimport * as sqsExamplesNs from './sqs/examples';\n\n/** Dev examples per export, keyed by the export names in package.json. */\nexport const exportExamples = {\n sourceLambda: lambdaExamplesNs,\n sourceSqs: sqsExamplesNs,\n};\n","// Lambda (default sub-source).\nexport { settings, SettingsSchema, type Settings } from './lambda/schemas';\nexport * from './lambda/schemas/primitives';\n\n// SQS sub-source. Prefixed so the website's <Configuration> snippet can\n// remap data.schemas.sqsSettings / sqsSetup onto data.schemas.settings.\nexport { settings as sqsSettings } from './sqs/schemas';\nexport { setup as sqsSetup } from './sqs/schemas';\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n maxBatchSize: z\n .number()\n .int()\n .min(1)\n .describe('Maximum number of events accepted in a single batch request')\n .default(100),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema exports (for website PropertyTable + MCP package_get).\nexport const settings = zodToSchema(SettingsSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source settings schema.\n *\n * Required: queueName. All other fields optional with sensible defaults\n * applied at runtime by `getConfig`.\n */\nexport const SettingsSchema = z.object({\n queueName: z\n .string()\n .min(1)\n .describe(\n 'SQS queue short name (like walkeros-events). Required for both setup and runtime poll.',\n ),\n region: z\n .string()\n .describe('AWS region (like eu-central-1). Default: eu-central-1.')\n .optional(),\n queueUrl: z\n .string()\n .url()\n .describe(\n 'Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.',\n )\n .optional(),\n client: z\n .any()\n .describe(\n 'Pre-configured AWS SQSClient instance. Bypasses construction when supplied.',\n )\n .optional(),\n config: z\n .any()\n .describe(\n 'AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).',\n )\n .optional(),\n decoder: z\n .enum(['json', 'text', 'raw'])\n .describe(\n 'Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.',\n )\n .optional(),\n maxMessages: z\n .number()\n .int()\n .min(1)\n .max(10)\n .describe('SQS receive batch size. Cap 10. Default: 10.')\n .optional(),\n waitTimeSeconds: z\n .number()\n .int()\n .min(0)\n .max(20)\n .describe('Long-poll duration in seconds. Cap 20. Default: 20.')\n .optional(),\n visibilityTimeout: z\n .number()\n .int()\n .nonnegative()\n .describe(\n 'Per-receive visibility timeout override. Default: queue-configured value.',\n )\n .optional(),\n shutdownTimeoutMs: z\n .number()\n .int()\n .positive()\n .describe(\n 'Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.',\n )\n .optional(),\n onPushError: z\n .enum(['nack', 'ack'])\n .describe(\n 'Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source setup schema.\n *\n * Provisioning options for `walkeros setup source.<id>`. Authoritative-apply:\n * declared state is written via a single CreateQueueCommand; non-declared\n * tags or attributes are left untouched.\n */\nconst TagsSchema = z.record(z.string(), z.string());\n\nexport const SetupSchema = z.object({\n region: z.string().min(1).describe('AWS region.').optional(),\n fifoQueue: z\n .boolean()\n .describe(\n 'FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.',\n )\n .optional(),\n visibilityTimeoutSeconds: z\n .number()\n .int()\n .nonnegative()\n .describe('Visibility timeout in seconds. Default: 30.')\n .optional(),\n messageRetentionSeconds: z\n .number()\n .int()\n .positive()\n .describe('Message retention period in seconds. Default: 345600 (4 days).')\n .optional(),\n maximumMessageSize: z\n .number()\n .int()\n .min(1024)\n .max(262144)\n .describe('Max message size in bytes. Default: 262144 (256 KB).')\n .optional(),\n kmsMasterKeyId: z\n .string()\n .describe('KMS key alias or ID for at-rest encryption.')\n .optional(),\n deadLetterQueue: z\n .object({\n arn: z\n .string()\n .describe(\n 'ARN of an existing DLQ. Mutually exclusive with create: true.',\n )\n .optional(),\n create: z\n .boolean()\n .describe('Create a sibling DLQ named <queueName>-dlq. Default: false.')\n .optional(),\n maxReceiveCount: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .describe('Max receive count before message goes to DLQ. Default: 5.')\n .optional(),\n })\n .describe('Optional dead-letter queue.')\n .optional(),\n tags: TagsSchema.describe(\n 'Tags applied to the queue (and inherited by an auto-created DLQ).',\n ).optional(),\n subscribeToSnsTopic: z\n .object({\n topicArn: z.string().min(1).describe('Topic ARN to subscribe to.'),\n rawMessageDelivery: z\n .boolean()\n .describe('Deliver SNS messages without the SNS envelope.')\n .optional(),\n filterPolicy: z\n .record(z.string(), z.unknown())\n .describe('SNS filter policy applied at subscription level.')\n .optional(),\n })\n .describe(\n 'Optional SNS topic subscription. Creates the subscription and the matching queue policy.',\n )\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\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 name: '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 name: '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\nexport const lambdaPostForwardsSource: Flow.StepExample = {\n title: 'Lambda POST with provenance',\n description:\n 'A POST body carrying a source map is forwarded in full, so release and trace provenance survive the crossing.',\n trigger: { type: 'POST' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'POST', path: '/collect' },\n requestId: 'req-321',\n },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n source: { release: { web: 'r1' } },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n source: { release: { web: 'r1' } },\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","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\nexport type { Content, Result } from './trigger';\n","import type {\n CreateQueueCommandOutput,\n DeleteMessageCommandOutput,\n GetQueueAttributesCommandOutput,\n GetQueueUrlCommandOutput,\n ReceiveMessageCommandOutput,\n SQSClientConfig,\n} from '@aws-sdk/client-sqs';\nimport type { Env, SqsClient } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment for the AWS SQS source.\n *\n * `push` injects a structural SQS client (`env.AWS.SQSClient`), so a\n * simulated run never reaches AWS and its `send` calls can be recorded. The\n * unit tests keep substituting the SDK module-wide via\n * `jest.mock('@aws-sdk/client-sqs')`; they use `push` without the client.\n */\n\nconst noopFn = (): void => undefined;\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\nconst createMockElbFn = (): Elb.Fn => {\n const fn: Elb.Fn = () => Promise.resolve({ ok: true });\n return fn;\n};\n\nconst QUEUE_URL =\n 'https://sqs.eu-central-1.amazonaws.com/000000000000/walkeros-events';\nconst QUEUE_ARN = 'arn:aws:sqs:eu-central-1:000000000000:walkeros-events';\n\n/** A long poll that finds nothing, kept short so a simulated run ends fast. */\nconst RECEIVE_WAIT_MS = 100;\n\n/** One response that satisfies every command the source sends. */\ntype SqsResponse = GetQueueUrlCommandOutput &\n GetQueueAttributesCommandOutput &\n ReceiveMessageCommandOutput &\n DeleteMessageCommandOutput &\n CreateQueueCommandOutput;\n\nfunction isReceive(command: object): boolean {\n if (!('input' in command)) return false;\n const { input } = command;\n return (\n typeof input === 'object' && input !== null && 'WaitTimeSeconds' in input\n );\n}\n\n/**\n * Answers every command with the queue URL and ARN and an empty receive, so\n * init resolves the queue and the long-poll loop idles without messages.\n */\nclass MockSQSClient implements SqsClient {\n constructor(public config?: SQSClientConfig) {}\n\n async send(command: object): Promise<SqsResponse> {\n if (isReceive(command)) {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, RECEIVE_WAIT_MS),\n );\n }\n return {\n $metadata: {},\n QueueUrl: QUEUE_URL,\n Attributes: { QueueArn: QUEUE_ARN },\n Messages: [],\n };\n }\n\n destroy(): void {}\n}\n\nfunction createEnv(): Env {\n return {\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}\n\n/** Standard mock environment, with the structural client for simulate. */\nexport const push: Env = Object.assign(createEnv(), {\n AWS: { SQSClient: MockSQSClient },\n});\n\n/**\n * The same environment without the client, for unit tests that substitute the\n * SDK module-wide with `jest.mock`.\n */\nexport const moduleMockEnv: Env = createEnv();\n\n/** Every request (queue lookup, receive, delete) goes through `send`. */\nexport const simulation = ['call:AWS.SQSClient.send'];\n","import type { Flow } from '@walkeros/core';\n\n/**\n * SQS source step examples.\n *\n * Each `in` is a partial SQS Message-like (MessageId, Body, optional\n * ReceiptHandle). The trigger synthesizes the missing fields and dispatches\n * through the source's `push()` (the same pipeline the long-poll loop uses).\n * `out` records the terminal state recorded by the trigger as\n * `[method, ...args]` entries.\n */\n\nconst eventPayload = {\n event: 'page view',\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n};\n\nconst orderPayload = {\n event: 'order complete',\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n};\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view from SQS',\n description:\n 'A standard SQS message body containing a walker elb event payload as JSON.',\n in: {\n MessageId: 'm-1',\n Body: JSON.stringify(eventPayload),\n },\n out: [['message.ack', 'm-1']],\n};\n\nexport const orderComplete: Flow.StepExample = {\n title: 'Order complete from SQS',\n description: 'Order complete event flowing through the long-poll loop.',\n in: {\n MessageId: 'm-2',\n Body: JSON.stringify(orderPayload),\n },\n out: [['message.ack', 'm-2']],\n};\n\nexport const decoderText: Flow.StepExample = {\n title: 'Text decoder',\n description:\n 'When decoder is \"text\", the body string flows under data.payload.',\n in: { MessageId: 'm-3', Body: 'raw text payload' },\n out: [['message.ack', 'm-3']],\n};\n\nexport const malformedJson: Flow.StepExample = {\n title: 'Malformed JSON nacks',\n description:\n 'Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.',\n in: { MessageId: 'm-4', Body: '{not json' },\n out: [['message.nack', 'm-4']],\n};\n","import type { Collector, Trigger } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport type { SyntheticMessage, SyntheticPushResult } from '../types';\n\n/**\n * Content shape for the SQS source trigger.\n *\n * The trigger synthesizes a SyntheticMessage from this partial input and\n * dispatches it through the source's `push()` (the same pipeline the\n * long-poll loop uses).\n */\nexport interface Content {\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\n/**\n * Trigger result: the recorded ack/nack as `[method, MessageId]` entries.\n * Mirrors the destination's `[method, ...args]` recording shape.\n */\nexport type Result = Array<[string, ...unknown[]]>;\n\ninterface SqsSourceLike {\n type: string;\n push: (content?: SyntheticMessage) => Promise<SyntheticPushResult | void>;\n}\n\nfunction isSqsSource(value: unknown): value is SqsSourceLike {\n if (typeof value !== 'object' || value === null) return false;\n const candidate: { type?: unknown; push?: unknown } = value;\n return candidate.type === 'sqs' && typeof candidate.push === 'function';\n}\n\nfunction findSource(collector: Collector.Instance): SqsSourceLike | undefined {\n for (const source of Object.values(collector.sources ?? {})) {\n if (isSqsSource(source)) return source;\n }\n return undefined;\n}\n\n/**\n * SQS source createTrigger.\n *\n * Boots the collector via startFlow, finds the registered SQS source, and\n * invokes its `push()` with a synthesized message. The source dispatches the\n * synthetic message through the same handler the long-poll loop uses,\n * exercising the full decode / forward / ack-nack pipeline without touching\n * real SQS infrastructure.\n */\nexport const 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 if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findSource(flow.collector);\n if (!source) {\n throw new Error(\n 'sqs source not registered in collector, ensure it is configured in sources',\n );\n }\n\n const synthetic: SyntheticMessage = {\n MessageId: content.MessageId,\n Body: content.Body,\n ReceiptHandle: content.ReceiptHandle,\n Attributes: content.Attributes,\n MessageAttributes: content.MessageAttributes,\n };\n\n const result = await source.push(synthetic);\n const recorded: Result = [];\n if (result && typeof result === 'object') {\n if (result.acked) recorded.push(['message.ack', content.MessageId]);\n if (result.nacked) recorded.push(['message.nack', content.MessageId]);\n }\n return recorded;\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAAC;AAAA,EAAA;AAAA;;;ACAA,IAAAC,cAA4B;;;ACA5B,IAAAC,cAAkB;;;ACAlB,iBAAkB;AAKX,IAAM,aAAa,aAAE,KAAK;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,IAAM,aAAa,aAAE,MAAM;AAAA,EAChC,aAAE,OAAO;AAAA,EACT,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EAClB,aAAE,QAAQ,GAAG;AACf,CAAC;AAMM,IAAM,oBAAoB,aAAE,OAAO;AAAA,EACxC,QAAQ,WAAW;AAAA,IACjB;AAAA,EACF,EAAE,SAAS;AAAA,EAEX,SAAS,aAAE,MAAM,UAAU,EAAE,SAAS,sBAAsB,EAAE,SAAS;AAAA,EAEvE,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE,SAAS;AAAA,EAE1E,aAAa,aACV,QAAQ,EACR,SAAS,oDAAoD,EAC7D,SAAS;AAAA,EAEZ,QAAQ,aACL,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,qCAAqC,EAC9C,SAAS;AACd,CAAC;;;AD9CM,IAAM,iBAAiB,cAAE,OAAO;AAAA,EACrC,MAAM,cACH,MAAM,CAAC,cAAE,QAAQ,GAAG,iBAAiB,CAAC,EACtC;AAAA,IACC;AAAA,EACF,EACC,QAAQ,IAAI;AAAA,EAEf,SAAS,cACN,OAAO,EACP,IAAI,EACJ,SAAS,EACT,IAAI,GAAM,EACV,SAAS,0DAA0D,EACnE,QAAQ,GAAK;AAAA,EAEhB,qBAAqB,cAClB,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,QAAQ,IAAI;AAAA,EAEf,cAAc,cACX,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,SAAS,6DAA6D,EACtE,QAAQ,GAAG;AAAA,EAEd,YAAY,cACT,OAAO,EACP,SAAS,4CAA4C,EACrD,QAAQ,SAAS;AACtB,CAAC;;;AD9BM,IAAM,eAAW,yBAAY,cAAc;;;AGVlD,IAAAC,cAA4B;;;ACA5B,IAAAC,cAAkB;AAQX,IAAMC,kBAAiB,cAAE,OAAO;AAAA,EACrC,WAAW,cACR,OAAO,EACP,IAAI,CAAC,EACL;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,cACL,OAAO,EACP,SAAS,wDAAwD,EACjE,SAAS;AAAA,EACZ,UAAU,cACP,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,QAAQ,cACL,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,QAAQ,cACL,IAAI,EACJ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,SAAS,cACN,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC,EAC5B;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,aAAa,cACV,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,EAAE,EACN,SAAS,8CAA8C,EACvD,SAAS;AAAA,EACZ,iBAAiB,cACd,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,EAAE,EACN,SAAS,qDAAqD,EAC9D,SAAS;AAAA,EACZ,mBAAmB,cAChB,OAAO,EACP,IAAI,EACJ,YAAY,EACZ;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,mBAAmB,cAChB,OAAO,EACP,IAAI,EACJ,SAAS,EACT;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,aAAa,cACV,KAAK,CAAC,QAAQ,KAAK,CAAC,EACpB;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;AChFD,IAAAC,cAAkB;AASlB,IAAM,aAAa,cAAE,OAAO,cAAE,OAAO,GAAG,cAAE,OAAO,CAAC;AAE3C,IAAM,cAAc,cAAE,OAAO;AAAA,EAClC,QAAQ,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,aAAa,EAAE,SAAS;AAAA,EAC3D,WAAW,cACR,QAAQ,EACR;AAAA,IACC;AAAA,EACF,EACC,SAAS;AAAA,EACZ,0BAA0B,cACvB,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,SAAS,6CAA6C,EACtD,SAAS;AAAA,EACZ,yBAAyB,cACtB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,gEAAgE,EACzE,SAAS;AAAA,EACZ,oBAAoB,cACjB,OAAO,EACP,IAAI,EACJ,IAAI,IAAI,EACR,IAAI,MAAM,EACV,SAAS,sDAAsD,EAC/D,SAAS;AAAA,EACZ,gBAAgB,cACb,OAAO,EACP,SAAS,6CAA6C,EACtD,SAAS;AAAA,EACZ,iBAAiB,cACd,OAAO;AAAA,IACN,KAAK,cACF,OAAO,EACP;AAAA,MACC;AAAA,IACF,EACC,SAAS;AAAA,IACZ,QAAQ,cACL,QAAQ,EACR,SAAS,6DAA6D,EACtE,SAAS;AAAA,IACZ,iBAAiB,cACd,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,GAAI,EACR,SAAS,2DAA2D,EACpE,SAAS;AAAA,EACd,CAAC,EACA,SAAS,6BAA6B,EACtC,SAAS;AAAA,EACZ,MAAM,WAAW;AAAA,IACf;AAAA,EACF,EAAE,SAAS;AAAA,EACX,qBAAqB,cAClB,OAAO;AAAA,IACN,UAAU,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,4BAA4B;AAAA,IACjE,oBAAoB,cACjB,QAAQ,EACR,SAAS,gDAAgD,EACzD,SAAS;AAAA,IACZ,cAAc,cACX,OAAO,cAAE,OAAO,GAAG,cAAE,QAAQ,CAAC,EAC9B,SAAS,kDAAkD,EAC3D,SAAS;AAAA,EACd,CAAC,EACA;AAAA,IACC;AAAA,EACF,EACC,SAAS;AACd,CAAC;;;AF3EM,IAAMC,gBAAW,yBAAYC,eAAc;AAC3C,IAAM,YAAQ,yBAAY,WAAW;;;AGT5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAWA,IAAM,kBAAkB,MAAc;AACpC,QAAMC,OAAM,MACV,QAAQ,QAAQ;AAAA,IACd,IAAI;AAAA,EACN,CAAC;AACH,SAAOA;AACT;AAGA,IAAM,SAAS,MAAM;AAAC;AACtB,IAAM,aAA8B;AAAA,EAClC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO,CAAC,YAA4B;AAClC,UAAM,OAAO,YAAY,WAAW,IAAI,MAAM,OAAO,IAAI;AAAA,EAC3D;AAAA,EACA,MAAM;AAAA,EACN,OAAO,MAAM;AACf;AAQO,IAAM,OAAY;AAAA,EACvB,IAAI,OAAO;AACT,WAAO,gBAAgB;AAAA,EACzB;AAAA,EACA,IAAI,UAAU;AACZ,WAAO,gBAAgB;AAAA,EACzB;AAAA,EACA,IAAI,MAAM;AACR,WAAO,gBAAgB;AAAA,EACzB;AAAA,EACA,QAAQ;AACV;;;AClDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,aAA+B;AAAA,EAC1C,OAAO;AAAA,EACP,aACE;AAAA,EACF,SAAS,EAAE,MAAM,OAAO;AAAA,EACxB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,gBAAgB;AAAA,MACd,MAAM,EAAE,QAAQ,QAAQ,MAAM,WAAW;AAAA,MACzC,WAAW;AAAA,IACb;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,OAAO;AAAA,IACxB,CAAC;AAAA,IACD,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,EAAE,OAAO,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAqC;AAAA,EAChD,OAAO;AAAA,EACP,aACE;AAAA,EACF,SAAS,EAAE,MAAM,OAAO;AAAA,EACxB,IAAI;AAAA,IACF,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,gBAAgB;AAAA,MACd,WAAW;AAAA,MACX,UAAU,EAAE,UAAU,eAAe;AAAA,IACvC;AAAA,IACA,uBAAuB;AAAA,IACvB,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,OAAO;AAAA,IACxB,CAAC;AAAA,IACD,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,EAAE,OAAO,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,YAA8B;AAAA,EACzC,OAAO;AAAA,EACP,aACE;AAAA,EACF,SAAS,EAAE,MAAM,MAAM;AAAA,EACvB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,gBAAgB;AAAA,MACd,MAAM,EAAE,QAAQ,OAAO,MAAM,WAAW;AAAA,MACxC,WAAW;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,2BAA6C;AAAA,EACxD,OAAO;AAAA,EACP,aACE;AAAA,EACF,SAAS,EAAE,MAAM,OAAO;AAAA,EACxB,IAAI;AAAA,IACF,SAAS;AAAA,IACT,gBAAgB;AAAA,MACd,MAAM,EAAE,QAAQ,QAAQ,MAAM,WAAW;AAAA,MACzC,WAAW;AAAA,IACb;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,OAAO;AAAA,MACtB,QAAQ,EAAE,SAAS,EAAE,KAAK,KAAK,EAAE;AAAA,IACnC,CAAC;AAAA,IACD,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM,EAAE,OAAO,OAAO;AAAA,QACtB,QAAQ,EAAE,SAAS,EAAE,KAAK,KAAK,EAAE;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","names":["examples_exports","settings","import_dev","import_dev","import_dev","import_dev","SettingsSchema","import_dev","settings","SettingsSchema","fn","trigger","k","v","examples_exports","createTrigger","env_exports","step_exports","env_exports","push","noopFn","noopLogger","createMockElbFn","fn","step_exports","createTrigger","trigger","result","examples_exports"]}
|
|
1
|
+
{"version":3,"sources":["../src/dev.ts","../src/lambda/examples/index.ts","../src/lambda/examples/env.ts","../src/lambda/examples/step.ts","../src/lambda/examples/trigger.ts","../src/sqs/examples/index.ts","../src/sqs/examples/env.ts","../src/sqs/examples/step.ts","../src/sqs/examples/trigger.ts","../src/lambda/schemas/index.ts","../src/lambda/schemas/settings.ts","../src/lambda/schemas/primitives.ts","../src/sqs/schemas/index.ts","../src/sqs/schemas/settings.ts","../src/sqs/schemas/setup.ts","../src/schemas.ts"],"sourcesContent":["import * as lambdaExamplesNs from './lambda/examples';\nimport * as sqsExamplesNs from './sqs/examples';\nimport * as lambdaSchemasNs from './lambda/schemas';\nimport * as sqsSchemasNs from './sqs/schemas';\n\nexport * as schemas from './schemas';\nexport * as examples from './lambda/examples';\nexport * as sqsExamples from './sqs/examples';\n\n/** Dev examples per export, keyed by the export names in package.json. */\nexport const exportExamples = {\n sourceLambda: lambdaExamplesNs,\n sourceSqs: sqsExamplesNs,\n};\n\n/** Schemas per export, keyed by the export names in package.json. */\nexport const exportSchemas = {\n sourceLambda: { settings: lambdaSchemasNs.settings },\n sourceSqs: {\n settings: sqsSchemasNs.settings,\n setup: sqsSchemasNs.setup,\n },\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 name: '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 name: '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\nexport const lambdaPostForwardsSource: Flow.StepExample = {\n title: 'Lambda POST with provenance',\n description:\n 'A POST body carrying a source map is forwarded in full, so release and trace provenance survive the crossing.',\n trigger: { type: 'POST' },\n in: {\n version: '2.0',\n requestContext: {\n http: { method: 'POST', path: '/collect' },\n requestId: 'req-321',\n },\n body: JSON.stringify({\n name: 'page view',\n data: { title: 'Home' },\n source: { release: { web: 'r1' } },\n }),\n isBase64Encoded: false,\n },\n out: [\n [\n 'elb',\n {\n name: 'page view',\n data: { title: 'Home' },\n source: { release: { web: 'r1' } },\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","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger } from './trigger';\nexport type { Content, Result } from './trigger';\n","import type {\n CreateQueueCommandOutput,\n DeleteMessageCommandOutput,\n GetQueueAttributesCommandOutput,\n GetQueueUrlCommandOutput,\n ReceiveMessageCommandOutput,\n SQSClientConfig,\n} from '@aws-sdk/client-sqs';\nimport type { Env, SqsClient } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment for the AWS SQS source.\n *\n * `push` injects a structural SQS client (`env.AWS.SQSClient`), so a\n * simulated run never reaches AWS and its `send` calls can be recorded. The\n * unit tests keep substituting the SDK module-wide via\n * `jest.mock('@aws-sdk/client-sqs')`; they use `push` without the client.\n */\n\nconst noopFn = (): void => undefined;\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\nconst createMockElbFn = (): Elb.Fn => {\n const fn: Elb.Fn = () => Promise.resolve({ ok: true });\n return fn;\n};\n\nconst QUEUE_URL =\n 'https://sqs.eu-central-1.amazonaws.com/000000000000/walkeros-events';\nconst QUEUE_ARN = 'arn:aws:sqs:eu-central-1:000000000000:walkeros-events';\n\n/** A long poll that finds nothing, kept short so a simulated run ends fast. */\nconst RECEIVE_WAIT_MS = 100;\n\n/** One response that satisfies every command the source sends. */\ntype SqsResponse = GetQueueUrlCommandOutput &\n GetQueueAttributesCommandOutput &\n ReceiveMessageCommandOutput &\n DeleteMessageCommandOutput &\n CreateQueueCommandOutput;\n\nfunction isReceive(command: object): boolean {\n if (!('input' in command)) return false;\n const { input } = command;\n return (\n typeof input === 'object' && input !== null && 'WaitTimeSeconds' in input\n );\n}\n\n/**\n * Answers every command with the queue URL and ARN and an empty receive, so\n * init resolves the queue and the long-poll loop idles without messages.\n */\nclass MockSQSClient implements SqsClient {\n constructor(public config?: SQSClientConfig) {}\n\n async send(command: object): Promise<SqsResponse> {\n if (isReceive(command)) {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, RECEIVE_WAIT_MS),\n );\n }\n return {\n $metadata: {},\n QueueUrl: QUEUE_URL,\n Attributes: { QueueArn: QUEUE_ARN },\n Messages: [],\n };\n }\n\n destroy(): void {}\n}\n\nfunction createEnv(): Env {\n return {\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}\n\n/** Standard mock environment, with the structural client for simulate. */\nexport const push: Env = Object.assign(createEnv(), {\n AWS: { SQSClient: MockSQSClient },\n});\n\n/**\n * The same environment without the client, for unit tests that substitute the\n * SDK module-wide with `jest.mock`.\n */\nexport const moduleMockEnv: Env = createEnv();\n\n/** Every request (queue lookup, receive, delete) goes through `send`. */\nexport const simulation = ['call:AWS.SQSClient.send'];\n","import type { Flow } from '@walkeros/core';\n\n/**\n * SQS source step examples.\n *\n * Each `in` is a partial SQS Message-like (MessageId, Body, optional\n * ReceiptHandle). The trigger synthesizes the missing fields and dispatches\n * through the source's `push()` (the same pipeline the long-poll loop uses).\n * `out` records the terminal state recorded by the trigger as\n * `[method, ...args]` entries.\n */\n\nconst eventPayload = {\n event: 'page view',\n data: { title: 'Documentation', url: 'https://example.com/docs' },\n};\n\nconst orderPayload = {\n event: 'order complete',\n data: { id: 'ORD-500', total: 199.99, currency: 'EUR' },\n};\n\nexport const pageView: Flow.StepExample = {\n title: 'Page view from SQS',\n description:\n 'A standard SQS message body containing a walker elb event payload as JSON.',\n in: {\n MessageId: 'm-1',\n Body: JSON.stringify(eventPayload),\n },\n out: [['message.ack', 'm-1']],\n};\n\nexport const orderComplete: Flow.StepExample = {\n title: 'Order complete from SQS',\n description: 'Order complete event flowing through the long-poll loop.',\n in: {\n MessageId: 'm-2',\n Body: JSON.stringify(orderPayload),\n },\n out: [['message.ack', 'm-2']],\n};\n\nexport const decoderText: Flow.StepExample = {\n title: 'Text decoder',\n description:\n 'When decoder is \"text\", the body string flows under data.payload.',\n in: { MessageId: 'm-3', Body: 'raw text payload' },\n out: [['message.ack', 'm-3']],\n};\n\nexport const malformedJson: Flow.StepExample = {\n title: 'Malformed JSON nacks',\n description:\n 'Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.',\n in: { MessageId: 'm-4', Body: '{not json' },\n out: [['message.nack', 'm-4']],\n};\n","import type { Collector, Trigger } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport type { SyntheticMessage, SyntheticPushResult } from '../types';\n\n/**\n * Content shape for the SQS source trigger.\n *\n * The trigger synthesizes a SyntheticMessage from this partial input and\n * dispatches it through the source's `push()` (the same pipeline the\n * long-poll loop uses).\n */\nexport interface Content {\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\n/**\n * Trigger result: the recorded ack/nack as `[method, MessageId]` entries.\n * Mirrors the destination's `[method, ...args]` recording shape.\n */\nexport type Result = Array<[string, ...unknown[]]>;\n\ninterface SqsSourceLike {\n type: string;\n push: (content?: SyntheticMessage) => Promise<SyntheticPushResult | void>;\n}\n\nfunction isSqsSource(value: unknown): value is SqsSourceLike {\n if (typeof value !== 'object' || value === null) return false;\n const candidate: { type?: unknown; push?: unknown } = value;\n return candidate.type === 'sqs' && typeof candidate.push === 'function';\n}\n\nfunction findSource(collector: Collector.Instance): SqsSourceLike | undefined {\n for (const source of Object.values(collector.sources ?? {})) {\n if (isSqsSource(source)) return source;\n }\n return undefined;\n}\n\n/**\n * SQS source createTrigger.\n *\n * Boots the collector via startFlow, finds the registered SQS source, and\n * invokes its `push()` with a synthesized message. The source dispatches the\n * synthetic message through the same handler the long-poll loop uses,\n * exercising the full decode / forward / ack-nack pipeline without touching\n * real SQS infrastructure.\n */\nexport const 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 if (!flow) {\n const result = await startFlow(config);\n flow = { collector: result.collector, elb: result.elb };\n }\n\n const source = findSource(flow.collector);\n if (!source) {\n throw new Error(\n 'sqs source not registered in collector, ensure it is configured in sources',\n );\n }\n\n const synthetic: SyntheticMessage = {\n MessageId: content.MessageId,\n Body: content.Body,\n ReceiptHandle: content.ReceiptHandle,\n Attributes: content.Attributes,\n MessageAttributes: content.MessageAttributes,\n };\n\n const result = await source.push(synthetic);\n const recorded: Result = [];\n if (result && typeof result === 'object') {\n if (result.acked) recorded.push(['message.ack', content.MessageId]);\n if (result.nacked) recorded.push(['message.nack', content.MessageId]);\n }\n return recorded;\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core/dev';\nimport { CorsOptionsSchema } from './primitives';\n\n/**\n * AWS Lambda source settings schema\n */\nexport const SettingsSchema = z.object({\n cors: z\n .union([z.boolean(), CorsOptionsSchema])\n .describe(\n 'CORS configuration: false = disabled, true = allow all origins, object = custom configuration',\n )\n .default(true),\n\n timeout: z\n .number()\n .int()\n .positive()\n .max(900000) // AWS Lambda max timeout: 15 minutes\n .describe('Request timeout in milliseconds (max: 900000 for Lambda)')\n .default(30000),\n\n enablePixelTracking: z\n .boolean()\n .describe(\n 'Enable GET requests with 1x1 transparent GIF response for pixel tracking',\n )\n .default(true),\n\n maxBatchSize: z\n .number()\n .int()\n .min(1)\n .describe('Maximum number of events accepted in a single batch request')\n .default(100),\n\n healthPath: z\n .string()\n .describe('Health check endpoint path (e.g., /health)')\n .default('/health'),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * HTTP methods enum\n */\nexport const HttpMethod = z.enum([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'HEAD',\n]);\n\n/**\n * CORS origin configuration\n * Accepts:\n * - '*' for all origins\n * - Single URL string\n * - Array of URL strings\n */\nexport const CorsOrigin = z.union([\n z.string(),\n z.array(z.string()),\n z.literal('*'),\n]);\n\n/**\n * CORS options schema\n * Configuration for Cross-Origin Resource Sharing\n */\nexport const CorsOptionsSchema = z.object({\n origin: CorsOrigin.describe(\n 'Allowed origins (* for all, URL string, or array of URLs)',\n ).optional(),\n\n methods: z.array(HttpMethod).describe('Allowed HTTP methods').optional(),\n\n headers: z.array(z.string()).describe('Allowed request headers').optional(),\n\n credentials: z\n .boolean()\n .describe('Allow credentials (cookies, authorization headers)')\n .optional(),\n\n maxAge: z\n .number()\n .int()\n .positive()\n .describe('Preflight cache duration in seconds')\n .optional(),\n});\n\nexport type CorsOptions = z.infer<typeof CorsOptionsSchema>;\n","import { zodToSchema } from '@walkeros/core/dev';\nimport { SettingsSchema } from './settings';\nimport { SetupSchema } from './setup';\n\nexport { SettingsSchema, type Settings } from './settings';\nexport { SetupSchema, type Setup } from './setup';\n\n// JSON Schema exports (for website PropertyTable + MCP package_get).\nexport const settings = zodToSchema(SettingsSchema);\nexport const setup = zodToSchema(SetupSchema);\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source settings schema.\n *\n * Required: queueName. All other fields optional with sensible defaults\n * applied at runtime by `getConfig`.\n */\nexport const SettingsSchema = z.object({\n queueName: z\n .string()\n .min(1)\n .describe(\n 'SQS queue short name (like walkeros-events). Required for both setup and runtime poll.',\n ),\n region: z\n .string()\n .describe('AWS region (like eu-central-1). Default: eu-central-1.')\n .optional(),\n queueUrl: z\n .string()\n .url()\n .describe(\n 'Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.',\n )\n .optional(),\n client: z\n .any()\n .describe(\n 'Pre-configured AWS SQSClient instance. Bypasses construction when supplied.',\n )\n .optional(),\n config: z\n .any()\n .describe(\n 'AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).',\n )\n .optional(),\n decoder: z\n .enum(['json', 'text', 'raw'])\n .describe(\n 'Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.',\n )\n .optional(),\n maxMessages: z\n .number()\n .int()\n .min(1)\n .max(10)\n .describe('SQS receive batch size. Cap 10. Default: 10.')\n .optional(),\n waitTimeSeconds: z\n .number()\n .int()\n .min(0)\n .max(20)\n .describe('Long-poll duration in seconds. Cap 20. Default: 20.')\n .optional(),\n visibilityTimeout: z\n .number()\n .int()\n .nonnegative()\n .describe(\n 'Per-receive visibility timeout override. Default: queue-configured value.',\n )\n .optional(),\n shutdownTimeoutMs: z\n .number()\n .int()\n .positive()\n .describe(\n 'Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.',\n )\n .optional(),\n onPushError: z\n .enum(['nack', 'ack'])\n .describe(\n 'Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core/dev';\n\n/**\n * AWS SQS source setup schema.\n *\n * Provisioning options for `walkeros setup source.<id>`. Authoritative-apply:\n * declared state is written via a single CreateQueueCommand; non-declared\n * tags or attributes are left untouched.\n */\nconst TagsSchema = z.record(z.string(), z.string());\n\nexport const SetupSchema = z.object({\n region: z.string().min(1).describe('AWS region.').optional(),\n fifoQueue: z\n .boolean()\n .describe(\n 'FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.',\n )\n .optional(),\n visibilityTimeoutSeconds: z\n .number()\n .int()\n .nonnegative()\n .describe('Visibility timeout in seconds. Default: 30.')\n .optional(),\n messageRetentionSeconds: z\n .number()\n .int()\n .positive()\n .describe('Message retention period in seconds. Default: 345600 (4 days).')\n .optional(),\n maximumMessageSize: z\n .number()\n .int()\n .min(1024)\n .max(262144)\n .describe('Max message size in bytes. Default: 262144 (256 KB).')\n .optional(),\n kmsMasterKeyId: z\n .string()\n .describe('KMS key alias or ID for at-rest encryption.')\n .optional(),\n deadLetterQueue: z\n .object({\n arn: z\n .string()\n .describe(\n 'ARN of an existing DLQ. Mutually exclusive with create: true.',\n )\n .optional(),\n create: z\n .boolean()\n .describe('Create a sibling DLQ named <queueName>-dlq. Default: false.')\n .optional(),\n maxReceiveCount: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .describe('Max receive count before message goes to DLQ. Default: 5.')\n .optional(),\n })\n .describe('Optional dead-letter queue.')\n .optional(),\n tags: TagsSchema.describe(\n 'Tags applied to the queue (and inherited by an auto-created DLQ).',\n ).optional(),\n subscribeToSnsTopic: z\n .object({\n topicArn: z.string().min(1).describe('Topic ARN to subscribe to.'),\n rawMessageDelivery: z\n .boolean()\n .describe('Deliver SNS messages without the SNS envelope.')\n .optional(),\n filterPolicy: z\n .record(z.string(), z.unknown())\n .describe('SNS filter policy applied at subscription level.')\n .optional(),\n })\n .describe(\n 'Optional SNS topic subscription. Creates the subscription and the matching queue policy.',\n )\n .optional(),\n});\n\nexport type Setup = z.infer<typeof SetupSchema>;\n","// Lambda (default sub-source).\nexport { settings, SettingsSchema, type Settings } from './lambda/schemas';\nexport * from './lambda/schemas/primitives';\n\n// SQS sub-source. Prefixed so the website's <Configuration> snippet can\n// remap data.schemas.sqsSettings / sqsSetup onto data.schemas.settings.\nexport { settings as sqsSettings } from './sqs/schemas';\nexport { setup as sqsSetup } from './sqs/schemas';\n"],"mappings":"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AAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","names":["examples_exports","fn","trigger","k","v","examples_exports","createTrigger","env_exports","step_exports","env_exports","push","noopFn","noopLogger","createMockElbFn","fn","step_exports","createTrigger","trigger","result","import_dev","import_dev","import_dev","import_dev","SettingsSchema","import_dev","settings","SettingsSchema","settings","examples_exports","settings"]}
|
package/dist/dev.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=(t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})},n={};t(n,{CorsOptionsSchema:()=>c,CorsOrigin:()=>a,HttpMethod:()=>i,SettingsSchema:()=>d,settings:()=>u,sqsSettings:()=>v,sqsSetup:()=>w});import{zodToSchema as o}from"@walkeros/core/dev";import{z as s}from"@walkeros/core/dev";import{z as r}from"@walkeros/core/dev";var i=r.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),a=r.union([r.string(),r.array(r.string()),r.literal("*")]),c=r.object({origin:a.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:r.array(i).describe("Allowed HTTP methods").optional(),headers:r.array(r.string()).describe("Allowed request headers").optional(),credentials:r.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:r.number().int().positive().describe("Preflight cache duration in seconds").optional()}),d=s.object({cors:s.union([s.boolean(),c]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:s.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:s.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),maxBatchSize:s.number().int().min(1).describe("Maximum number of events accepted in a single batch request").default(100),healthPath:s.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),u=o(d);import{zodToSchema as l}from"@walkeros/core/dev";import{z as p}from"@walkeros/core/dev";var f=p.object({queueName:p.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:p.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:p.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:p.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:p.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:p.enum(["json","text","raw"]).describe("Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.").optional(),maxMessages:p.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:p.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:p.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:p.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:p.enum(["nack","ack"]).describe("Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.").optional()});import{z as g}from"@walkeros/core/dev";var m=g.record(g.string(),g.string()),h=g.object({region:g.string().min(1).describe("AWS region.").optional(),fifoQueue:g.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:g.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:g.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:g.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:g.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:g.object({arn:g.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:g.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:g.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:m.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:g.object({topicArn:g.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:g.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:g.record(g.string(),g.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),v=l(f),w=l(h),y={};t(y,{createTrigger:()=>Jn,env:()=>b,step:()=>q,trigger:()=>Vn});var b={};t(b,{push:()=>E});var k=()=>()=>Promise.resolve({ok:!0}),I=()=>{},S={error:I,warn:I,info:I,debug:I,throw:e=>{throw"string"==typeof e?new Error(e):e},json:I,scope:()=>S},E={get push(){return k()},get command(){return k()},get elb(){return k()},logger:S},q={};t(q,{apiGatewayV1Post:()=>x,lambdaGet:()=>T,lambdaPost:()=>O,lambdaPostForwardsSource:()=>C});var O={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({name:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},x={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({name:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},T={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"}'}]]},C={title:"Lambda POST with provenance",description:"A POST body carrying a source map is forwarded in full, so release and trace provenance survive the crossing.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-321"},body:JSON.stringify({name:"page view",data:{title:"Home"},source:{release:{web:"r1"}}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"},source:{release:{web:"r1"}}}]]};import{assign as j}from"@walkeros/core";import{createIngest as D}from"@walkeros/core";import{assign as M,createMappingRoot as P,clone as A,compileCache as $,checkCache as _,storeCache as R,createIngest as B,debounce as H,emitStep as z,getId as G,getGrantedConsent as N,isDefined as Q,isFunction as U,isObject as L,OBSERVE_ENV_KEY as F,processEventMapping as K,stepId as W,tryCatchAsync as J,useHooks as V,compileState as Y,applyState as X}from"@walkeros/core";import{emitStep as Z}from"@walkeros/core";import{observeEnv as ee}from"@walkeros/core";import{isArray as te,FatalError as ne}from"@walkeros/core";import{tryCatch as oe,tryCatchAsync as se}from"@walkeros/core";import{stepId as re}from"@walkeros/core";import{createIngest as ie,FatalError as ae,getMappingValue as ce,getSpanId as de,parseTraceparent as ue,isScope as le,tryCatchAsync as pe,compileCache as fe,checkCache as ge,storeCache as me,applyUpdate as he,createMappingRoot as ve,compileState as we,applyState as ye}from"@walkeros/core";import{advanceChain as be,clone as ke,createIngest as Ie,deriveSpanId as Se,emitStep as Ee,FatalError as qe,isChainContinuation as Oe,isObject as xe,startChain as Te,stepId as Ce,tryCatchAsync as je,useHooks as De,compileCache as Me,checkCache as Pe,storeCache as Ae,createMappingRoot as $e,validateStepEntry as _e,processEventMapping as Re,compileState as Be,applyState as He}from"@walkeros/core";import{assign as ze,getSpanId as Ge,getTraceId as Ne,InvalidEventError as Qe,isFunction as Ue,isString as Le}from"@walkeros/core";import{isObject as Fe}from"@walkeros/core";import{OBSERVE_STORAGE_KEY as Ke,createBatchedPoster as We,createTelemetryObserver as Je,parseObserveCredential as Ve}from"@walkeros/core";import{assign as Ye,createLogger as Xe}from"@walkeros/core";import{createIngest as Ze,emitStep as et,FatalError as tt,getGrantedConsent as nt,getSpanId as ot,InvalidEventError as st,processEventMapping as rt,tryCatchAsync as it,useHooks as at}from"@walkeros/core";import{FatalError as ct,useHooks as dt,tryCatchAsync as ut}from"@walkeros/core";import{emitStep as lt,useHooks as pt}from"@walkeros/core";import{compileMatcher as ft,emitStep as gt,readCacheEnvelope as mt,wrapCacheEnvelope as ht}from"@walkeros/core";var vt={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",Scoped:"_",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function wt(e,t,n){return{traceId:e.source?.trace??t?._meta.trace??n.trace,sourceId:t?._meta.path[0],parentEventId:t?._meta.parentEventId}}function yt(e,t){const n=e.status.startedAt,o={flowId:e.name??"default",stepId:t.stepId,stepType:t.stepType,phase:t.phase,eventId:t.eventId,timestamp:new Date(t.now).toISOString(),elapsedMs:t.now-n};return t.traceId&&(o.traceId=t.traceId),t.sourceId&&(o.sourceId=t.sourceId),t.parentEventId&&(o.parentEventId=t.parentEventId),o}function bt(e,t,n,o,s){e.status.in++;const r=yt(e,{stepId:"collector.push",stepType:"collector",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now(),...wt(t,n,e)});r.skipReason="dropped",r.meta={by:o??"route",at:s},Z(e,r)}function kt(e,t,n){if(null===e||"object"!=typeof e)return e;if(n>=8||!function(e){if(Array.isArray(e))return!0;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(e))return e;const o=t.get(e);if(void 0!==o)return o;if(Array.isArray(e)){const o=[];t.set(e,o);for(const s of e)o.push(kt(s,t,n+1));return o}const s={};t.set(e,s);for(const[o,r]of Object.entries(e))s[o]="function"==typeof r?r:kt(r,t,n+1);return s}function It(e,t){try{return e[t]}catch{return"[unreadable]"}}function St(e){const t=new WeakSet,n=(e,o)=>{if(null===e)return null;if("function"==typeof e)return"[function]";if("string"==typeof e||"boolean"==typeof e)return e;if("number"==typeof e)return Number.isFinite(e)?e:null;if("bigint"==typeof e)return String(e);if("object"!=typeof e)return;const s=e;if(t.has(s))return"[circular]";if(o>=6)return"[truncated]";let r;t.add(s);try{if(Array.isArray(s))r=s.map(e=>n(e,o+1));else if(function(e){const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(s)){const e={};for(const t of Object.keys(s))e[t]=n(It(s,t),o+1);r=e}else r=function(e){try{return String(e)}catch{return"[object]"}}(s)}catch{r="[unreadable]"}return t.delete(s),r};return e.map(e=>n(e,0))}function Et(e){return e.map(e=>({fn:e.fn,args:St(e.args),ts:e.ts}))}function qt(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var Ot=new WeakMap;function xt(e,t,n,o){Ot.get(e)||(Ot.set(e,!0),t.warn(n,o))}function Tt(e){Ot.delete(e)}var Ct=()=>Date.now();function jt(e){if(void 0!==e)return"number"==typeof e?{threshold:e,cooldown:3e4}:{threshold:e.threshold??5,cooldown:e.cooldown??3e4}}function Dt(e,t,n,o,s){if("partial"===n)return;const r=((i=e)[a=t]||(i[a]={state:"closed",consecutiveFailures:0}),i[a]);var i,a;return"success"===n?(r.consecutiveFailures=0,r.state="closed",r.probing=!1,void(r.openUntil=void 0)):(r.consecutiveFailures+=1,"half-open"===r.state?(r.state="open",r.probing=!1,void(r.openUntil=Ct()+s)):void(r.consecutiveFailures>=o&&(r.state="open",r.probing=!1,r.openUntil=Ct()+s)))}function Mt(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function Pt(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function At(e){const t={error:e instanceof Error?e.message:String(e)};if(e instanceof Error&&e.name&&"Error"!==e.name&&(t.name=e.name),"object"==typeof e&&null!==e&&"code"in e){const n=e;"number"!=typeof n.code&&"string"!=typeof n.code||(t.code=n.code)}return t}function $t(e,t,n,o,s){const r=re(t,n);return(t,i)=>{try{if(i)return s?function(e,t,n,o,s,r){const i=t.dlq=t.dlq||[],a={max:t.config.dlqMax??100},c=qt(i,[o,s],a);if(c.dropped>0){const t=Pt(e.status,re("destination",n),"dlq",c.dropped);xt(i,r,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:n,cap:a.max,droppedCount:t})}else i.length<a.max&&Tt(i);const d=Mt(e,n);d.failed++,d.dlqSize=i.length,e.status.failed++;const u=jt(t.config.breaker);if(u){const o=t.config.id||n;Dt(e.status.breakers,re("destination",o),"transport-failure",u.threshold,u.cooldown)}}(e,s,n,i,t,o):e.status.failed++,void o.error("report error",{...At(t),event:i.name});e.status.connectionErrors[r]=(e.status.connectionErrors[r]??0)+1,o.error("connection error",At(t))}catch{}}}function _t(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Rt(e,t){return e?t.stores[e]:t.stores.__cache}function Bt(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}async function Ht(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:Ie(n),config:t.config,env:Vt(t.config.env),reportError:$t(e,"transformer",n,s)};s.debug("init");const i=await De(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function zt(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Vt(t.config.env),...r?{respond:r}:{}},reportError:$t(e,"transformer",n,a)};a.debug("push",{event:o.name});const d="string"==typeof o.id?o.id:"",{traceId:u,sourceId:l,parentEventId:p}=wt(o,s,e),f=Date.now(),g=yt(e,{stepId:Ce("transformer",n),stepType:"transformer",phase:"in",eventId:d,now:f,traceId:u,sourceId:l,parentEventId:p});g.inEvent=o,Ee(e,g);try{const s=await De(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=yt(e,{stepId:Ce("transformer",n),stepType:"transformer",phase:"out",eventId:d,now:r,traceId:u,sourceId:l,parentEventId:p});return i.durationMs=r-f,i.outEvent=s,Ee(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=yt(e,{stepId:Ce("transformer",n),stepType:"transformer",phase:"error",eventId:d,now:o,traceId:u,sourceId:l,parentEventId:p});throw s.durationMs=o-f,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},Ee(e,s),t}}function Gt(e){return"string"==typeof e.id?e.id:""}function Nt(e,t){const n=Gt(e);return""!==n&&""===Gt(t)?{...t,id:n}:t}function Qt(e,t,n,o){const s=(a=n,{...a,_meta:{...a._meta,path:[...a._meta.path]}}),r=ke(t),i=Gt(e);var a;if(""===i)return{event:r,ingest:s};s._meta.parentEventId=i;const c=Gt(r);return""!==c&&c!==i||(r.id=Se(i,o)),{event:r,ingest:s}}function Ut(e,t){return{copies:e,respond:t}}function Lt(e,t){if(void 0===t)return e.rest;const n=e.ownNext?e.rest.slice(1):e.rest;return[{route:t,ancestry:e.ancestry},...n]}async function Ft(e,t,n){const o=await Promise.all(t.map((t,n)=>je(Kt,t=>(e.collector.logger.scope("transformer:fork").error(`fork ${n} failed`,At(t)),{copies:[]}))(e,t))),s=[];let r,i=n,a=o.length>0;return o.forEach((e,n)=>{void 0!==t[n].respond&&e.respond&&(i=e.respond),e.stopped||(a=!1),e.stopped||0===e.copies.length?void 0===r&&(r=e.droppedBy):s.push(...e.copies)}),0===s.length?{copies:s,respond:i,...a?{stopped:!0}:{},...void 0!==r?{droppedBy:r}:{}}:Ut(s,i)}async function Kt(e,t){const{ingest:n}=t;let{stack:o,event:s,respond:r}=t,i=t.resume;for(;;){let t,a;if(i)t=i.member,a=i,i=void 0;else{const i=be(o,$e(n,s),e.transformers);if("done"===i.kind)return Ut([{event:s,ingest:n}],r);if("stop"===i.kind)return{copies:[],respond:r,stopped:!0,...void 0!==i.owner?{droppedBy:i.owner}:{}};if("fork"===i.kind){const t=s;return Ft(e,i.branches.map((e,o)=>({stack:e,...Qt(t,t,n,o),respond:void 0})),r)}const a=e.transformers[i.id];t={id:i.id,ancestry:i.ancestry,rest:i.rest,ownNext:!!a&&void 0!==a.config.next}}const c=await Wt(e,t,s,n,r,a);if("halt"===c.kind)return c.result;if("fork"===c.kind)return Ft(e,c.copies,r);s=c.event,r=c.respond,o=c.stack}}async function Wt(e,t,n,o,s,r){const{collector:i,transformers:a,chainContext:c}=e,d=t.id,u=a[d];let l=n,p=s;const f=(e=t.rest)=>({kind:"continue",event:Nt(n,l),respond:p,stack:e}),g=e=>({kind:"halt",result:e});if(!u)return i.logger.warn(`Transformer not found: ${d}`),f();const m=u.config?.cache,h=m?Me(m):void 0,v=h?_t(h,i):void 0;let w=r?.cacheMiss;if(!r){if(o._meta.path.length>256)return i.logger.error(`Max path length exceeded at ${d}`),g({copies:[],respond:p});if(o._meta.hops++,o._meta.path.push(d),!await je(Ht,e=>{if(e instanceof qe)throw e;return i.status.failed++,i.logger.scope(`transformer:${u.type||"unknown"}`).error("transformer init failed",{transformer:d,...At(e)}),!1})(i,u,d))return g({copies:[],respond:p});if(c&&void 0!==u.config?.chainMocks?.[c]){const e=u.config.chainMocks[c];return i.logger.scope(`transformer:${u.type||"unknown"}`).debug("chainMock",{chain:c}),l=e,f()}if(void 0!==u.config?.mock)return i.logger.scope(`transformer:${u.type||"unknown"}`).debug("mock"),l=u.config.mock,f();if(u.config?.disabled)return f();if(h&&v){const e=await Pe(h,v,$e(o,l));if("HIT"===e?.status&&e.value)return l=e.value,h.stop?g({copies:[{event:Nt(n,l),ingest:o}],respond:p,stopped:!0}):f();"MISS"===e?.status&&(w={key:e.key,ttl:e.rule.ttl})}if(void 0!==u.config.before){const e=await async function(e,t,n,o,s,r,i){const a=t[n],c=a?a.config.before:void 0,d=await Jt(e,t,c,o,s,r,i);return d.stopped&&0===d.copies.length&&!d.droppedBy?{...d,droppedBy:n}:d}(i,a,d,l,o,p,c),n=e.respond??p;if(0===e.copies.length||e.stopped)return g({...e,respond:n});p=n;const[s]=e.copies;if(e.copies.length>1||s.ingest!==o){const n={member:t,cacheMiss:w};return{kind:"fork",copies:e.copies.map(e=>({stack:t.rest,event:e.event,ingest:e.ingest,respond:void 0,resume:n}))}}l=s.event}}const y=u.config?.state?Be(u.config.state):void 0,b=y?.filter(e=>"get"===e.mode),k=y?.filter(e=>"set"===e.mode),I=async e=>k&&0!==k.length?He(k,e=>Rt(e,i),e,i,o):e;b&&b.length>0&&(l=await He(b,e=>Rt(e,i),l,i,o));const S=await je(zt,e=>(i.status.failed++,i.logger.scope(`transformer:${u.type||"unknown"}`).error("Push failed",At(e)),!1))(i,u,d,l,o,p);if(!1===S)return g({copies:[],respond:p,droppedBy:d});if(Array.isArray(S)&&1!==S.length){if(0===S.length)return g({copies:[],respond:p});const e=l,n=[];for(let s=0;s<S.length;s++){const r=S[s],i=await I(r.event||e);n.push({stack:Lt(t,r.next),...Qt(e,i,o,s),respond:p})}return{kind:"fork",copies:n}}const E=Array.isArray(S)?S[0]:S;let q;return E&&"object"==typeof E&&(E.respond&&(p=E.respond),E.event&&(l=E.event),q=E.next),l=await I(l),w&&v&&Ae(v,w.key,l,w.ttl),f(Lt(t,q))}async function Jt(e,t,n,o,s,r,i){const a=s??Ie("string"==typeof n?n:"chain");return void 0===n?Ut([{event:o,ingest:a}],r):(i&&(a._meta.chainPath=i),Kt({collector:e,transformers:t,chainContext:i},{stack:Oe(n)?n:Te(n),event:o,ingest:a,respond:r}))}function Vt(e){return e&&xe(e)?e:{}}async function Yt(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o)an(n)&&!pn(e,t,n)||(await pe(t.on,t=>{if(t instanceof ae)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,...At(t)})})(n,r),an(n)&&ln(e,t,n))}function Xt(e){return Boolean(e.config.init)&&!e.config.require?.length}async function Zt(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:d,terminus:u}=n,l=s.state??n.state,p=l?we(l):void 0,f=d,g=f?fe({...f,stop:f.stop??!0}):void 0,m=u??e.push,h=Boolean(u),v=async(n,o,r)=>{if(h)return m(n);let i;const d="string"==typeof n.id&&""!==n.id?n:{...n,id:de()};let u=[{event:d,ingest:r.ingest}];if(void 0!==c){const n=`source.${t}.before`,o=await Jt(e,e.transformers||{},c,d,r.ingest,r.respond,n);if(0===o.copies.length)return bt(e,d,r.ingest,o.droppedBy,n),Cn({ok:!0,dropped:!0});if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),u=o.copies}if(g){const t=_t(g,e);if(t){const n=ve(r.ingest),o=await ge(g,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&g.stop){let t=o.value;return o.rule.update&&(t=await he(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&g.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},d=o.key,u=o.rule.ttl,l=n=>{me(t,d,n,u),a?i=(async()=>{const t=await he(n,a,c,e);s(t)})():s(n)};r.respond=l}"MISS"!==o.status||g.stop||me(t,o.key,!0,o.rule.ttl)}}}p&&p.length>0&&(u=await Promise.all(u.map(async t=>({event:await ye(p,t=>Rt(t,e),t.event,e,t.ingest),ingest:t.ingest}))));let l={ok:!0};for(const e of u)l=await m(e.event,{...o,id:t,ingest:e.ingest,respond:r.respond,mapping:s,preChain:a});return i&&await i,l},w=async n=>{const o=ie(t),r=ue(le(n)?n?.headers?.traceparent:void 0);if(r&&(o._meta.trace=r.trace,o._meta.parentEventId=r.parentSpan),!s.ingest||void 0===n)return o;const i=await ce(n,s.ingest,{collector:e});return{...o,...i,_meta:o._meta}},y=e.logger.scope("source").scope(t),b={...r,push:async(e,n={})=>{const o={ingest:ie(t),respond:void 0};return v(e,n,o)},command:e.command,sources:e.sources,elb:e.elb,logger:y},k={collector:e,logger:y,id:t,config:s,env:b,withScope:async(e,t,n)=>{const o={ingest:await w(e),respond:t};return n({...b,push:(e,t={})=>v(e,t,o),ingest:o.ingest,respond:o.respond})},reportError:$t(e,"source",t,y)},I=await pe(o,n=>{if(n instanceof ae)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,...At(n)})})(k);if(!I)return;const S=I.type||"unknown",E=e.logger.scope(S).scope(t);return b.logger=E,i&&(I.config={...I.config,primary:i}),I}async function en(e){for(const[t,n]of Object.entries(e.sources)){if(Xt(n))continue;const o=n.config.require;if(!o?.length)continue;const s=o.filter(t=>!dn(e,t));s.length!==o.length&&(n.config.require=s,Xt(n)&&await Yt(e,n,t))}for(const[t,n]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[t]||e.destinations[t])continue;const o=n.config?.require;if(!o)continue;const s=o.filter(t=>!dn(e,t));if(n.config&&(n.config.require=s),s.length>0)continue;delete e.pending.destinations[t];const r=jn(n);!1!==r.config.queue&&(r.queuePush=[...e.queue]),e.destinations[t]=r}}function tn(e){if("object"!=typeof e||null===e)return!1;if(!("logger"in e))return!1;const t=e.logger;return"object"==typeof t&&null!==t&&"scope"in t&&"function"==typeof t.scope}var nn=!1;function on(){nn||(nn=!0,"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn("walkerOS: ignored an on-dispatch call with a non-collector argument"))}function sn(e,t,n,o){if(n instanceof ne)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,...At(n)})}var rn=[vt.Consent,vt.User,vt.Globals,vt.Custom];function an(e){return rn.includes(e)}function cn(e,t){switch(t){case vt.Consent:return Object.keys(e.consent).length>0;case vt.User:return Object.keys(e.user).length>0;case vt.Globals:return Object.keys(e.globals).length>0;case vt.Custom:return Object.keys(e.custom).length>0;default:return!1}}function dn(e,t){switch(t){case vt.Consent:case vt.User:case vt.Globals:case vt.Custom:return cn(e,t);case vt.Run:case vt.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function un(e,t){return e.cellVersion[String(t)]??0}function ln(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=un(e,n)}function pn(e,t,n){return e.allowed&&un(e,n)>function(e,t,n){const o=e.delivery.get(t),s=o?.[String(n)];return void 0===s?-1:s}(e,t,n)}function fn(e,t,n){const o=e.cascade;if(!o)return!0;let s=o.counts.get(t);s||(s={},o.counts.set(t,s));const r=String(n),i=(s[r]||0)+1;return s[r]=i,i<=8||(9===i&&e.logger.error("state delivery did not converge",{type:r}),!1)}function gn(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function mn(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:Dn(t.env,t.config.env),reportError:$t(e,"destination",n,i,t)};oe(t.on,t=>sn(e,"destination",t,{destId:n,type:o}))(o,a)}function hn(e,t,n,o){if(!tn(e))return void on();const s=vn(e,t,o);if(n.length)switch(t){case vt.Consent:!function(e,t,n){const o=n||e.consent,s=gn(e,vt.Consent);t.forEach(t=>{pn(e,t,vt.Consent)&&fn(e,t,vt.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{oe(t[n],t=>sn(e,"consent",t,{key:n}))(o,s)}),ln(e,t,vt.Consent))})}(e,n,o);break;case vt.Ready:!function(e,t){if(!e.allowed)return;const n=gn(e,vt.Ready);t.forEach(t=>{oe(t,t=>sn(e,"ready",t))(void 0,n)})}(e,n);break;case vt.Run:!function(e,t){if(!e.allowed)return;const n=gn(e,vt.Run);t.forEach(t=>{oe(t,t=>sn(e,"run",t))(void 0,n)})}(e,n);break;case vt.Session:!function(e,t){if(!e.session)return;const n=gn(e,vt.Session);t.forEach(t=>{oe(t,t=>sn(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=gn(e,t),r=an(t);n.forEach(n=>{"function"==typeof n&&(r&&!pn(e,n,t)||r&&!fn(e,n,t)||(oe(n,n=>sn(e,"generic",n,{type:t}))(s,o),r&&ln(e,n,t)))});break}}}function vn(e,t,n){switch(t){case vt.Consent:return n||e.consent;case vt.Session:return e.session;case vt.User:return n||e.user;case vt.Custom:return n||e.custom;case vt.Globals:return n||e.globals;case vt.Config:return n||e.config;default:return}}async function wn(e,t,n,o,s){if(!t.on)return!1;if(an(o)&&!pn(e,t,o))return!1;if(an(o)&&!fn(e,t,o))return!1;const r=await se(t.on,t=>sn(e,"source",t,{sourceId:n,type:o}))(o,s);return an(o)&&ln(e,t,o),!1===r}function yn(e){return"number"==typeof e&&e>0?e:1e4}var bn=class extends Error{constructor(e){super(e),this.name="DestinationTimeoutError"}};function kn(e,t,n){let o;const s=new Promise((e,s)=>{o=setTimeout(()=>s(new bn(n)),t)});return Promise.race([e,s]).finally(()=>{o&&clearTimeout(o)})}var In=Object.freeze({batched:!0});function Sn(e){return e===In}function En(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}async function qn(e,t,n={},o){if(!e.allowed)return Cn({ok:!1});if(!t)return On(e,void 0,n,o);const s=await async function(e,t,n={}){const o=n.ingest??D(n.id||"unknown"),s=e.config.next;if(void 0===s)return{copies:[{event:t,ingest:o}],respond:n.respond};const r=await Jt(e,e.transformers||{},s,t,o,n.respond,Hn),i=r.respond??n.respond;return 0===r.copies.length?(e.logger.debug("Event dropped by collector.next"+(r.droppedBy?` (${r.droppedBy})`:"")),bt(e,t,o,r.droppedBy,Hn),{copies:[],respond:i,dropped:!0}):r.stopped?{copies:[],respond:i}:{copies:r.copies.map(t=>({event:Rn(e,t.event,t.ingest),ingest:t.ingest})),respond:i}}(e,t,n);if(0===s.copies.length)return Cn({ok:!0,...s.dropped?{dropped:!0}:{}});const r=[];for(const t of s.copies)r.push(await On(e,t.event,{id:n.id,ingest:t.ingest,respond:s.respond},o));return r[0]}async function On(e,t,n,o){const{consent:s,user:r}=e;if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=qt(e.queue,t,{max:n});if(o.dropped>0){const t=Pt(e.status,W("collector"),"queue",o.dropped);xt(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&Tt(e.queue);e.status.in++}o||(o=e.destinations);const i=e.transformers||{},a=await Promise.all(Object.entries(o||{}).map(async([o,a])=>{if(a.config.disabled)return{id:o,destination:a,skipped:!0};const c=a.config.id||o,d=W("destination",c),u=jt(a.config.breaker);if(u&&function(e,t,n){const o=e[t];if(!o||"closed"===o.state)return!1;if("half-open"===o.state)return!0===o.probing;const s=Ct();return void 0!==o.openUntil&&s<o.openUntil||(o.state="half-open",o.probing=!0,o.openUntil=s+n,!1)}(e.status.breakers,d,u.cooldown))return{id:o,destination:a,skipped:!0};const l=t=>{u&&Dt(e.status.breakers,d,t,u.threshold,u.cooldown)},p=()=>{u&&function(e,t){const n=e[t];n&&"half-open"===n.state&&!0===n.probing&&(n.state="open",n.probing=!1)}(e.status.breakers,d)};let f=(a.queuePush||[]).map(e=>({...e,consent:s}));a.queuePush=[],t&&f.push(A(t));const g=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:B("unknown");if(!f.length&&!a.queueOn?.length)return p(),{id:o,destination:a,skipped:!0};if(!f.length&&a.queueOn?.length){if(!N(a.config.consent,s))return p(),{id:o,destination:a,skipped:!0};let t=!1;try{t=await xn(e,a,o,!0)}catch(t){e.status.failed++;const n=a.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)}),l("transport-failure")}return p(),{id:o,destination:a,skipped:!t}}const m=[],h=f.filter(t=>{const n=N(a.config.consent,s,t.consent);if(n)return t.consent=n,m.push(t),!1;const r=yt(e,{stepId:W("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now(),...wt(t,g,e)});return r.skipReason="consent",s&&(r.consent={...s}),a.config.consent&&(r.meta={required:{...a.config.consent}}),z(e,r),!0});if(h.length>0){const t=a.queuePush,n=a.config.id||o,s={max:a.config.queueMax??1e3};let r=0;for(const e of h)r+=qt(t,e,s).dropped;if(r>0){Mt(e,n);const o=Pt(e.status,W("destination",n),"queue",r);xt(t,e.logger.scope(a.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:s.max,droppedCount:o})}else t.length<s.max&&Tt(t)}if(!m.length)return p(),{id:o,destination:a,queue:f};let v,w,y=!1;try{y=await xn(e,a,o,!0)}catch(t){e.status.failed++;const n=a.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)}),l("transport-failure")}if(!y)return p(),{id:o,destination:a,queue:f};a.dlq||(a.dlq=[]);const b=a.config.before,k=a.config.next,I=a.config?.cache,S=I?$(I):void 0,E=S?_t(S,e):void 0,q=a.config?.state?Y(a.config.state):void 0,O=q?.filter(e=>"get"===e.mode),x=q?.filter(e=>"set"===e.mode);let T=0,C=0,j=0;return await Promise.all(m.map(async t=>{let s,c;if(t.user=M(r,t.user),S?.stop&&E){const e=P(g,t),n=await _(S,E,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(s={key:n.key,ttl:n.rule.ttl})}let d=[{event:t,ingest:g}],u=n.respond;if(void 0!==b){const s=`destination.${o}.before`,r=await Jt(e,i,b,t,g,n.respond,s);if(0===r.copies.length){const n=yt(e,{stepId:W("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now(),...wt(t,g,e)});return n.skipReason="dropped",n.meta={by:r.droppedBy??"route",at:s},z(e,n),t}r.respond&&(u=r.respond),d=r.copies.map(e=>({event:e.event,ingest:e.ingest}))}const l=async(t,n,s)=>{let r=s,d=!1;if(S&&!S.stop&&E){const e=P(n,t??void 0),o=await _(S,E,e);if("HIT"===o?.status)return!1;"MISS"===o?.status&&(r={key:o.key,ttl:o.rule.ttl},d=!0)}O&&O.length>0&&t&&(t=await X(O,t=>Rt(t,e),t,e,n));const l=Date.now();let p=!1;const f=await J(Tn,n=>{const s=a.type||"unknown";e.logger.scope(s).error("Push failed",{...At(n),event:t.name}),v=n,p=!0;const r=a.dlq,i=a.config.id||o,c={max:a.config.dlqMax??100},d=qt(r,[t,n],c);if(d.dropped>0){Mt(e,i);const t=Pt(e.status,W("destination",i),"dlq",d.dropped);xt(r,e.logger.scope(a.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i,cap:c.max,droppedCount:t})}else r.length<c.max&&Tt(r)})(e,a,o,t,n,u);if(T+=Date.now()-l,r&&E&&void 0===a.config.mock&&(d?R(E,r.key,f??!0,r.ttl):void 0===c&&(c=f??!0)),!p&&!Sn(f)&&x&&x.length>0&&t&&(t=await X(x,t=>Rt(t,e),t,e,n)),void 0===f||Sn(f)||(w=f),Sn(f)&&C++,!p&&k){void 0!==f&&(n._response=f);const s=await Jt(e,i,k,t,n,u,`destination.${o}.next`);s.respond&&(u=s.respond)}return!0};for(const e of d)await l(e.event,e.ingest,s)&&j++;return s&&E&&void 0!==c&&void 0===a.config.mock&&R(E,s.key,c,s.ttl),t})),{id:o,destination:a,error:v,response:w,totalDuration:T,batchedCount:C,allowedCount:m.length,pushedCount:j,canonicalId:c,breakerConfig:u}})),c={},d={},u={};for(const t of a){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};Mt(e,t.id);const s=e.status.destinations[t.id],r=Date.now();s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0;const i=t.breakerConfig,a=t.canonicalId?W("destination",t.canonicalId):void 0,l=t=>{i&&a&&Dt(e.status.breakers,a,t,i.threshold,i.cooldown)};if(t.error)o.error=t.error,u[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++,l("transport-failure");else if(t.queue&&t.queue.length)d[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0,a=t.pushedCount??i;(Math.max(0,a-n)>0||0===i)&&(c[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++,l("success"))}}return Cn({event:t,...Object.keys(c).length&&{done:c},...Object.keys(d).length&&{queued:d},...Object.keys(u).length&&{failed:u}})}async function xn(e,t,n,o=!1){if(t.init&&!t.config.init){if(!o&&function(e){const t=e.config.consent;return!!t&&Object.keys(t).length>0}(t))return e.logger.scope(t.type||"unknown").debug("init blocked: consent gate not cleared"),!1;const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:n,config:t.config,env:Dn(t.env,t.config.env),reportError:$t(e,"destination",n,r,t)};r.debug("init");const a=Date.now();let c;z(e,yt(e,{stepId:W("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await V(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),s=yt(e,{stepId:W("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw s.durationMs=o-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},z(e,s),t}if(!1===c)return c;if(t.config={...c||t.config,init:!0},t.queueOn?.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)mn(e,t,n,s,r)}r.debug("init done")}return!0}async function Tn(e,t,n,o,s,r){const{config:i}=t,a=await K(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",d=e.logger.scope(c),u={collector:e,logger:d,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...Dn(t.env,i.env),...r?{respond:r}:{}},reportError:$t(e,"destination",n,d,t)};if(void 0!==i.mock)return d.debug("mock",{event:a.event.name}),i.mock;const l=a.mapping,p=void 0!==l?.batch,f=p?a.mappingKey||"* *":" batch-all";if((p||void 0!==i.batch)&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=En(l?.batch),r=En(i.batch),a=s.wait??r.wait??3e4,c=s.size??r.size??1e3,u=s.age??r.age??3e4,g=Dn(t.env,i.env),m=H(async()=>{const o=t.batches[f],s=o.batched;if(0===s.entries.length)return;const r={key:s.key,entries:s.entries,events:s.events,data:s.data};s.entries=[],s.events=[],s.data=[];const a=r.entries[0],c={collector:e,logger:d,id:n,config:i,data:void 0,rule:o.isDefault?void 0:a.rule,ingest:a.ingest,env:{...g,...a.respond?{respond:a.respond}:{}},reportError:$t(e,"destination",n,d,t)};d.debug("push batch",{events:r.entries.length});const u=t.config.id||n,l=Mt(e,u),p=jt(t.config.breaker),m=W("destination",u),h=t=>{p&&Dt(e.status.breakers,m,t,p.threshold,p.cooldown)},v=Date.now(),w=new Map;let y,b=!1;const k=n=>{const o=t.dlq=t.dlq||[],s={max:t.config.dlqMax??100};let r=0;for(const e of n)r+=qt(o,e,s).dropped;if(r>0){const t=Pt(e.status,W("destination",u),"dlq",r);xt(o,d,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:s.max,droppedCount:t})}else o.length<s.max&&Tt(o);l.failed+=n.length,l.dlqSize=o.length,e.status.failed+=n.length};let I=r.entries.length;const S=yn(i.timeout),E=await J((o,s)=>kn(Promise.resolve(V(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,s)),S,`Destination "${n}" batch delivery timed out after ${S}ms`),e=>{I=0,b=!0,y=e,k(r.entries.map(t=>[t.event,e])),h("transport-failure"),d.error("Push batch failed",{error:e instanceof Error?e.message:String(e),entries:r.entries.length})})(r,c);if(L(q=E)&&Array.isArray(q.failed)&&E.failed.length>0){const e=[];for(const t of E.failed){const n=r.entries[t.index];if(!n||w.has(t.index))continue;const o=t.error??new Error(`Push batch entry ${t.index} failed (no per-row error provided)`);w.set(t.index,o),e.push([n.event,o])}e.length>0&&(k(e),I=Math.max(0,r.entries.length-e.length),d.error("Push batch partial failure",{failed:e.length,delivered:I,entries:r.entries.length}))}var q;const O=Date.now();r.entries.forEach((t,o)=>{const s=b||w.has(o),i=wt(t.event,t.ingest,e),a=yt(e,{stepId:W("destination",n),stepType:"destination",phase:s?"error":"flush",eventId:"string"==typeof t.event.id?t.event.id:"",now:O,traceId:i.traceId,sourceId:i.sourceId,parentEventId:i.parentEventId});if(a.batch={size:r.entries.length,index:o},a.durationMs=O-v,s){const e=b?y:w.get(o);a.error=e instanceof Error?{name:e.name,message:e.message}:{message:String(e)}}z(e,a)}),d.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-r.entries.length),I>0&&(l.count+=I,l.lastAt=Date.now(),e.status.out+=I,h("success"))},{wait:a,size:c,age:u});t.batches[f]={batched:o,isDefault:!p,batchFn:()=>{m()},flush:async()=>{await m.flush()}}}const c=t.batches[f];c.batched.entries.push({event:a.event,ingest:s,respond:r,rule:l,data:a.data}),c.batched.events.push(a.event),Q(a.data)&&c.batched.data.push(a.data);const u="string"==typeof a.event.id?a.event.id:"",g=wt(o,s,e),m=Date.now(),h=yt(e,{stepId:W("destination",n),stepType:"destination",phase:"in",eventId:u,now:m,traceId:g.traceId,sourceId:g.sourceId,parentEventId:g.parentEventId});a.mappingKey&&(h.mappingKey=a.mappingKey),a.event.consent&&(h.consent={...a.event.consent}),h.inEvent=a.event,z(e,h);const v=yt(e,{stepId:W("destination",n),stepType:"destination",phase:"out",eventId:u,now:m,traceId:g.traceId,sourceId:g.sourceId,parentEventId:g.parentEventId});a.mappingKey&&(v.mappingKey=a.mappingKey),v.outEvent=a.event,v.batch={size:c.batched.entries.length,index:c.batched.entries.length-1},z(e,v);const w=t.config.id||n,y=Mt(e,w);return y.inFlightBatch=(y.inFlightBatch??0)+1,c.batchFn(),In}{let r;if(d.debug("push",{event:a.event.name}),"trace"===e.observeLevel?.()&&Array.isArray(t.calls)&&t.calls.length>0){const e=function(e){const{simulation:t,...n}=e,o={},s=new WeakMap;for(const[e,t]of Object.entries(n))o[e]="function"==typeof t?t:kt(t,s,1);const r=ee(o,t);return{wrappedEnv:r.env,calls:r.calls,unresolved:r.unresolved}}({...u.env,simulation:t.calls});u.env=e.wrappedEnv,r=e.calls,e.unresolved.length>0&&(e.wrappedEnv[F]={paths:e.unresolved,record:(t,n)=>e.calls.push({fn:t,args:n,ts:Date.now()})})}const c="string"==typeof a.event.id?a.event.id:"",{traceId:l,sourceId:p,parentEventId:f}=wt(o,s,e),g=Date.now(),m=yt(e,{stepId:W("destination",n),stepType:"destination",phase:"in",eventId:c,now:g,traceId:l,sourceId:p,parentEventId:f});a.mappingKey&&(m.mappingKey=a.mappingKey),a.event.consent&&(m.consent={...a.event.consent}),m.inEvent=a.event,z(e,m);try{const o=yn(i.timeout),s=await kn(Promise.resolve(V(t.push,"DestinationPush",e.hooks,e.logger)(a.event,u)),o,`Destination "${n}" delivery timed out after ${o}ms`),m=Date.now(),h=yt(e,{stepId:W("destination",n),stepType:"destination",phase:"out",eventId:c,now:m,traceId:l,sourceId:p,parentEventId:f});return h.durationMs=m-g,h.outEvent=a.event,r&&r.length>0&&(h.calls=Et(r)),Q(s)&&(h.meta={...h.meta,response:s}),a.mappingKey&&(h.mappingKey=a.mappingKey),z(e,h),d.debug("push done"),s}catch(t){const o=Date.now(),s=yt(e,{stepId:W("destination",n),stepType:"destination",phase:"error",eventId:c,now:o,traceId:l,sourceId:p,parentEventId:f});throw s.durationMs=o-g,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},r&&r.length>0&&(s.calls=Et(r)),a.mappingKey&&(s.mappingKey=a.mappingKey),z(e,s),t}}}function Cn(e){return{ok:!e?.failed,...e}}function jn(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=Bt(e,"before"),{config:a}=Bt({...e,config:i},"next"),c={...t.config,...n,...a};s&&(c.cache=s),void 0!==r&&void 0===c.state&&(c.state=r);const d=Dn(t.env,o);return{...t,config:c,env:d}}function Dn(e,t){return e||t?t?e&&L(e)&&L(t)?{...e,...t}:t:e:{}}async function Mn(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};let c;try{await Promise.race([s(a),new Promise((n,o)=>{c=setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3)})])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}finally{c&&clearTimeout(c)}});await Promise.allSettled(o)}function Pn(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function An(e,t,n){let o,s,r=!1;const i=function(e){return e.cascade?()=>{}:(e.cascade={counts:new WeakMap},()=>{e.cascade=void 0})}(e);try{return await async function(){switch(t){case vt.Config:Fe(n)&&(ze(e.config,n,{shallow:!1,merge:!1}),s=n,r=!0);break;case vt.Consent:if(Fe(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=j(e.consent,n),{update:n}}(e,n);Pn(e,vt.Consent),s=t,r=!0}break;case vt.Custom:Fe(n)&&(e.custom=ze(e.custom,n),Pn(e,vt.Custom),s=n,r=!0);break;case vt.Destination:Fe(n)&&"code"in n&&Fe(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a,state:c}=t;if(!U(n.push))return Cn({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const d=o||{init:!1};let u=r?{...d,before:r}:{...d};i&&(u={...u,next:i}),a&&(u={...u,cache:a}),void 0!==c&&void 0===u.state&&(u={...u,state:c});let l=u.id;if(!l)do{l=G(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[l]||e.pending.destinations[l]);if(u.require?.length){e.pending.destinations[l]=t,await en(e);const n=e.destinations[l];return n?qn(e,void 0,{},{[l]:n}):Cn({ok:!0})}const p={...n,config:u,env:Dn(n.env,s)};return e.destinations[l]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),qn(e,void 0,{},{[l]:p})}(e,n));break;case vt.Globals:Fe(n)&&(e.globals=ze(e.globals,n),Pn(e,vt.Globals),s=n,r=!0);break;case vt.Hook:if(Fe(n)&&Le(n.name)&&Ue(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case vt.On:if(Fe(n)&&Le(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){if(!tn(e))return void on();const o=e.on,s=o[t]||[],r=te(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,hn(e,t,r)}(e,t,o)}break;case vt.Ready:r=!0;break;case vt.Run:o=await async function(e,t){e.allowed=!0,e.timing=Date.now(),e.trace=Ne(),e.count=0,t&&(t.consent&&(e.consent=ze(e.consent,t.consent),Pn(e,vt.Consent)),t.user&&(e.user=ze(e.user,t.user),Pn(e,vt.User)),t.globals&&(e.globals=ze(e.config.globalsStatic||{},t.globals),Pn(e,vt.Globals)),t.custom&&(e.custom=ze(e.custom,t.custom),Pn(e,vt.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await en(e),await async function(e){if(tn(e))for(const t of rn){if(!cn(e,t))continue;const n=vn(e,t);hn(e,t,e.on[t]||[]);for(const[o,s]of Object.entries(e.sources))Xt(s)&&await wn(e,s,o,t,n)}else on()}(e);let n=!0;const o={};if(e.preRunQueue.length){const t=e.preRunQueue.splice(0);e.logger.debug("replaying pre-run events",{count:t.length});for(const{event:s,options:r}of t){const t=await e.push(s,r);!1===t.ok&&(n=!1),t.failed&&Object.assign(o,t.failed)}}const s=await qn(e);if(n)return s;const r={...s.failed??{},...o};return{...s,ok:!1,...Object.keys(r).length>0?{failed:r}:{}}}(e,n),r=!0;break;case vt.Session:r=!0;break;case vt.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await Mn(e.sources,"source",t),await async function(e,t){const n=Object.entries(e).flatMap(([e,n])=>{const o=n.batches;if(!o)return[];const s=t.scope(n.type||"destination");return Object.values(o).map(async t=>{let n;try{await Promise.race([t.flush(),new Promise((t,o)=>{n=setTimeout(()=>o(new Error(`destination '${e}' batch flush timed out`)),5e3)})])}catch(t){s.error(`destination '${e}' batch flush failed: ${t}`)}finally{n&&clearTimeout(n)}})});await Promise.allSettled(n)}(e.destinations,t),await Mn(e.destinations,"destination",t),await Mn(e.transformers,"transformer",t),await Mn(e.stores,"store",t)}(e));break;case vt.User:Fe(n)&&(ze(e.user,n,{shallow:!1}),Pn(e,vt.User),s=n,r=!0);break;default:return e.logger.warn("unknown command",{command:t}),Cn({ok:!1})}if(r){await async function(e,t,n,o){if(!tn(e))return on(),!0;e.seenEvents.add(String(t));let s=n||[];n||(s=e.on[t]||[]);const r=vn(e,t,o);let i=!1;for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(Xt(o)?await wn(e,o,n,t,r)&&(i=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:r})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:r});mn(e,o,n,t,r)}});for(const[t,n]of Object.entries(e.sources))Xt(n)&&n.queueOn?.length&&await Yt(e,n,t);const a=Object.values(e.sources).some(e=>!Xt(e)&&e.config.require?.length);return(Object.keys(e.pending.destinations).length>0||a)&&await en(e),hn(e,t,s,o),!i}(e,t,void 0,s);const n=await qn(e);if(o&&!1===o.ok){const e={...n.failed??{},...o.failed??{}};o={...n,ok:!1,...Object.keys(e).length>0?{failed:e}:{}}}else o=n}return o||Cn({ok:!0})}()}finally{i()}}function $n(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4"},...t}}function _n(e,t,n){return Bn(e,t,n,{globals:e.globals,user:e.user,consent:e.consent})}function Rn(e,t,n){return Bn(e,$n(e,t),n,{globals:{},user:{},consent:{}})}function Bn(e,t,n,o){const s=t.name;if("string"!=typeof s)throw new Qe(void 0===s?"Event name is required":"Event name is invalid");if(!s)throw new Qe("Event name is required");const[r,i]=s.split(" ");if(!r||!i)throw new Qe("Event name is invalid");const{timestamp:a=Date.now(),name:c=`${r} ${i}`,data:d={},context:u={},globals:l={},custom:p={},user:f=o.user,nested:g=[],consent:m=o.consent,id:h=Ge(),trigger:v="",entity:w=r,action:y=i,timing:b=0,source:k={type:"collector",schema:"4"}}=t,I=k??{type:"collector",schema:"4"},S=I.count??(e.count+=1),E=I.trace??n?._meta.trace??e.trace,q={...I,count:S};void 0!==E&&(q.trace=E);const O=e.name??I.platform??"default",x=e.release??"4.7.0-next-1790722899482";return q.release={...I.release,[O]:x},{name:c,data:d,context:u,globals:ze(o.globals,l),custom:p,user:f,nested:g,consent:m,id:h,trigger:v,entity:w,action:y,timestamp:a,timing:b,source:q}}var Hn="collector.next";function zn(e,t){const n=at(async(n,o={})=>await it(async()=>{if(!e.allowed){const t=e.config.queueMax;if(void 0===t)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const s=qt(e.preRunQueue,{event:n,options:o},{max:t});if(s.dropped>0){const n=Pt(e.status,"collector.preRun","queue",s.dropped);xt(e.preRunQueue,e.logger,"collector.preRunQueue overflow; oldest events dropped",{buffer:"queue",cap:t,droppedCount:n})}else e.preRunQueue.length<t&&Tt(e.preRunQueue);return e.logger.debug("event held until run",{name:n.name,dropped:s.dropped}),Cn({ok:!0})}const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:d,include:u,exclude:l}=o;let p=a,f=n;const g=u||l?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,u,l):void 0;let m=i??Ze(r||"unknown");if(c){const t=await rt(f,c,e);if(t.ignore)return Cn({ok:!0});if(c.consent&&!nt(c.consent,e.consent,t.event.consent))return Cn({ok:!0});f=t.event}if(void 0!==d){const n=r?`source.${r}.next`:void 0,o=await Jt(e,e.transformers||{},d,f,m,p,n);if(0===o.copies.length)return e.logger.debug("Event dropped by transformer chain"+(o.droppedBy?` (${o.droppedBy})`:"")),bt(e,f,m,o.droppedBy,n??"collector.push.preChain"),Cn({ok:!0,dropped:!0});if(o.stopped)return o.respond&&(p=o.respond),Cn({ok:!0});if(o.respond&&(p=o.respond),o.copies.length>1){const n=await Promise.all(o.copies.map(async n=>{const o=_n(e,t(n.event),n.ingest);return qn(e,o,{id:r,ingest:n.ingest,respond:p},g)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=o.copies.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return n[0]??Cn({ok:!0})}f=o.copies[0].event,m=o.copies[0].ingest}const h=function(e,t,n){return _n(e,$n(e,t),n)}(e,f,m),v=await qn(e,h,{id:r,ingest:m,respond:p},g);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return v},t=>{if(t instanceof tt)throw t;if(t instanceof st){const n=o.id;if(n){e.status.sources[n]||(e.status.sources[n]={count:0,duration:0});const t=e.status.sources[n];t.rejected=(t.rejected??0)+1}return e.logger.warn("invalid event rejected",{error:t.message}),Cn({ok:!1,invalid:!0,error:t.message})}return e.status.failed++,e.logger.error("push failed",{...At(t),event:n.name}),Cn({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id&&""!==t.id?t:{...t,id:ot()},r="string"==typeof s.id?s.id:"",{traceId:i,sourceId:a,parentEventId:c}=wt(s,o?.ingest,e),d=Date.now(),u=yt(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:r,now:d,traceId:i,sourceId:a,parentEventId:c});u.inEvent=s,et(e,u);try{const t=await n(s,o),u=Date.now(),l=yt(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:r,now:u,traceId:i,sourceId:a,parentEventId:c});return l.durationMs=u-d,l.outEvent=t,et(e,l),t}catch(t){const n=Date.now(),o=yt(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:r,now:n,traceId:i,sourceId:a,parentEventId:c});throw o.durationMs=n-d,o.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},et(e,o),t}}}function Gn(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function Nn(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=yt(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},gt(a,n)},d={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?ft(e.match):()=>!0,ttl:e.ttl})),l=e=>`${s}:${e}`;function p(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return u.find(e=>e.match(n))}const f=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...d}},async get(t){const n=l(t),s=await o.get(n),r=mt(s);if(void 0!==r){if(!("expired"in r))return d.hits++,c(t,"hit"),r.value;try{await o.delete(n)}catch(e){g("delete",t,e)}}const i=f.get(n);if(i)return d.inflight_dedups++,c(t,"hit"),i;d.misses++,c(t,"miss");const a=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=p(t,s);if(r)try{const e=1e3*r.ttl;await o.set(n,ht(s,e),e),d.populates++}catch(e){g("set",t,e)}return s}finally{f.delete(n)}})();return f.set(n,a),a},async set(t,n,s){d.writes++,await e.set(t,n,s);const r=p(t,n);if(r)try{const e=1e3*r.ttl;await o.set(l(t),ht(n,e),e)}catch(e){g("set",t,e)}},async delete(t){d.deletes++,await e.delete(t);try{await o.delete(l(t))}catch(e){g("delete",t,e)}}};function g(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,At(n)):console.warn(o,n)}}function Qn(e,t,n){const o=`store.${n}`,s=pt(t.get,"StoreGet",e.hooks,e.logger),r=pt(t.set,"StoreSet",e.hooks,e.logger),i=pt(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=yt(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});r.meta={op:"get",key:t},lt(e,r);try{const r=await s(t),i=Date.now(),a=yt(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:i});return a.durationMs=i-n,a.meta={op:"get",key:t},lt(e,a),r}catch(s){const r=Date.now(),i=yt(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"get",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},lt(e,i),s}},t.set=async(t,n,s)=>{const i=Date.now(),a=yt(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:i});a.meta={op:"set",key:t},lt(e,a);try{await r(t,n,s);const a=Date.now(),c=yt(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:a});c.durationMs=a-i,c.meta={op:"set",key:t},lt(e,c)}catch(n){const s=Date.now(),r=yt(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:s});throw r.durationMs=s-i,r.meta={op:"set",key:t},r.error=n instanceof Error?{name:n.name,message:n.message}:{message:String(n)},lt(e,r),n}},t.delete=async t=>{const n=Date.now(),s=yt(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});s.meta={op:"delete",key:t},lt(e,s);try{await i(t);const s=Date.now(),r=yt(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:s});r.durationMs=s-n,r.meta={op:"delete",key:t},lt(e,r)}catch(s){const r=Date.now(),i=yt(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"delete",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},lt(e,i),s}}}async function Un(e){const t=Ye({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=Xe(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},observers:new Set,logger:o,on:{},queue:[],preRunQueue:[],round:0,count:0,stateVersion:0,cellVersion:{},delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{},connectionErrors:{},breakers:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},hasShutdown:!1,seenEvents:new Set,push:void 0,command:void 0,elb:void 0};var i,a;void 0!==e.name&&(r.name=e.name),void 0!==e.release&&(r.release=e.release),void 0!==e.next&&(t.next=e.next),r.push=zn(r,e=>$n(r,e)),r.command=(a=An,dt(async(e,t,n)=>await ut(async()=>await a(i,e,t,n),t=>{if(t instanceof ct)throw t;return i.status.failed++,i.logger.error("command failed",{...At(t),command:e}),Cn({ok:!1})})(),"Command",(i=r).hooks,i.logger)),r.elb=function(e){return async(t,n,o,s,r)=>{if("string"==typeof t&&t.startsWith("walker ")){const o=t.replace("walker ","");return e.command(o,n)}let i;if("string"==typeof t)i={name:t},n&&"object"==typeof n&&!Array.isArray(n)&&(i.data=n);else{if(!t||"object"!=typeof t||Array.isArray(t))return Cn({ok:!1});i={...t},n&&"object"==typeof n&&!Array.isArray(n)&&(i.data={...i.data||{},...n})}return o&&"object"==typeof o&&(i.context=o),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),e.push(i)}}(r);const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i,reportError:$t(e,"store",o,a)},d=await t(c);n[o]=d}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=Gn()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=Nn(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t),collector:e})}for(const[t,o]of Object.entries(n))"__cache"!==t&&Qn(e,o,t);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=Gn()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=jn(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=_e(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=Bt(s,"before"),{config:c}=Bt({...s,config:a},"next"),d=Object.keys(r).length>0?{...c,env:r}:c,{cache:u}=s,l=u?{...d,cache:u}:d,p=s.config?.state??s.state,f=void 0!==p&&void 0===l.state?{...l,state:p}:l,g=e.logger.scope("transformer").scope(o),m={collector:e,logger:g,id:o,ingest:Ie(o),config:f,env:r,reportError:$t(e,"transformer",o,g)},h=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await Re(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),v=await h(m);void 0!==s.before&&void 0===v.config?.before&&(v.config={...v.config??{},before:s.before}),void 0!==s.next&&void 0===v.config?.next&&(v.config={...v.config??{},next:s.next}),void 0!==p&&void 0===v.config?.state&&(v.config={...v.config??{},state:p}),n[o]=v}return n}(r,e.transformers||{}),r}var Ln=globalThis;function Fn(e){try{const t=Ln.window;if(!t)return;t.localStorage.getItem(Ke)===e&&t.localStorage.removeItem(Ke)}catch{}}function Kn(e,t){return void 0===t?e:n=>e({...n,release:t})}async function Wn(e){e=e||{};const t=await Un(e);(function(e,t){if(t.observers)for(const n of t.observers)e.observers.add(n);const n=t.observe;if(!n)return;const o=e.name??"default";if("binding"in n){const t=function(){const e=Ln.window,t=Ln.URLSearchParams;if(!e||!t)return null;try{const n=new t(e.location.search.replace(/^\?/,"")).getAll(Ke);return n.length>0?n[n.length-1]??null:null}catch{return null}}(),s=t??function(){try{return Ln.window?.localStorage.getItem(Ke)??null}catch{return null}}();if(!s)return;const r=Ve(s);if(!r)return void(null===t?(e.logger.warn("observe: malformed stored credential cleared"),Fn(s)):e.logger.warn("observe: malformed credential ignored"));if(r.pb!==n.binding)return void e.logger.warn("observe: credential binding mismatch, credential ignored");let i;!function(e){try{Ln.window?.localStorage.setItem(Ke,e)}catch{}}(s),null!==t&&function(){const e=Ln.window,t=Ln.URLSearchParams;if(e&&t)try{const n=e.location.href,o=n.indexOf("#"),s=o>=0?n.slice(o):"",r=o>=0?n.slice(0,o):n,i=r.indexOf("?"),a=i>=0?r.slice(0,i):r,c=new t(i>=0?r.slice(i+1):"");c.delete(Ke);const d=c.toString();e.history.replaceState({},"",`${a}${d?`?${d}`:""}${s}`)}catch{}}();const a=We({url:`${n.url}/ingest/${r.ses}`,token:r.secret,headers:{"X-Walkeros-Binding":n.binding},onStatus:t=>{401===t&&(Fn(s),i&&e.observers.delete(i))}});i=Je(function(e,t){return void 0===t?e:n=>e({...n,flowId:t})}(Kn(a,e.release),n.flowId),{flowId:n.flowId??o,...void 0!==n.level?{level:n.level}:{},...void 0!==n.sample?{sample:n.sample}:{}}),e.observers.add(i);const c=n.level;return void(void 0!==c&&(e.observeLevel=()=>c))}if("off"===n.level)return;const s=n.level;void 0!==s&&(e.observeLevel=()=>s),e.observers.add(Je(Kn(We({url:`${n.url}/ingest/${n.sessionId}`,token:n.token}),e.release),{flowId:o,level:n.level,sample:n.sample}))})(t,e),await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await Zt(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await pe(n.init.bind(n),n=>{if(n instanceof ae)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,...At(n)})})(),o||(n.config.init=!0,Xt(n)&&await Yt(e,n,t))}return await en(e),n}(t,e.sources||{});const{consent:n,user:o,globals:s,custom:r}=e;n&&await t.command("consent",n),o&&await t.command("user",o),s&&await t.command("globals",s),r&&await t.command("custom",r),t.config.run&&await t.command("run");let i=t.elb;const a=Object.values(t.sources),c=a.find(e=>e.config.primary);return c?i=c.push:a.length>0&&(i=a[0].push),{collector:t,elb:i}}var Jn=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Wn(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function Vn(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var Yn={};t(Yn,{createTrigger:()=>fo,env:()=>Xn,step:()=>io});var Xn={};t(Xn,{moduleMockEnv:()=>so,push:()=>oo,simulation:()=>ro});var Zn=()=>{},eo={error:Zn,warn:Zn,info:Zn,debug:Zn,throw:e=>{throw"string"==typeof e?new Error(e):e},json:Zn,scope:()=>eo},to=()=>()=>Promise.resolve({ok:!0});function no(){return{get push(){return to()},get command(){return to()},get elb(){return to()},logger:eo}}var oo=Object.assign(no(),{AWS:{SQSClient:class{constructor(e){this.config=e}config;async send(e){return function(e){if(!("input"in e))return!1;const{input:t}=e;return"object"==typeof t&&null!==t&&"WaitTimeSeconds"in t}(e)&&await new Promise(e=>setTimeout(e,100)),{$metadata:{},QueueUrl:"https://sqs.eu-central-1.amazonaws.com/000000000000/walkeros-events",Attributes:{QueueArn:"arn:aws:sqs:eu-central-1:000000000000:walkeros-events"},Messages:[]}}destroy(){}}}}),so=no(),ro=["call:AWS.SQSClient.send"],io={};t(io,{decoderText:()=>uo,malformedJson:()=>lo,orderComplete:()=>co,pageView:()=>ao});var ao={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},co={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},uo={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},lo={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function po(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var fo=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Wn(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(po(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}},go={sourceLambda:y,sourceSqs:Yn};export{y as examples,go as exportExamples,n as schemas,Yn as sqsExamples};//# sourceMappingURL=dev.mjs.map
|
|
1
|
+
var e=Object.defineProperty,t=(t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})},n={};t(n,{createTrigger:()=>uo,env:()=>o,step:()=>c,trigger:()=>lo});var o={};t(o,{push:()=>a});var s=()=>()=>Promise.resolve({ok:!0}),r=()=>{},i={error:r,warn:r,info:r,debug:r,throw:e=>{throw"string"==typeof e?new Error(e):e},json:r,scope:()=>i},a={get push(){return s()},get command(){return s()},get elb(){return s()},logger:i},c={};t(c,{apiGatewayV1Post:()=>u,lambdaGet:()=>l,lambdaPost:()=>d,lambdaPostForwardsSource:()=>p});var d={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({name:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},u={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({name:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},l={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"}'}]]},p={title:"Lambda POST with provenance",description:"A POST body carrying a source map is forwarded in full, so release and trace provenance survive the crossing.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-321"},body:JSON.stringify({name:"page view",data:{title:"Home"},source:{release:{web:"r1"}}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"},source:{release:{web:"r1"}}}]]};import{assign as f}from"@walkeros/core";import{createIngest as g}from"@walkeros/core";import{assign as h,createMappingRoot as m,clone as v,compileCache as w,checkCache as y,storeCache as b,createIngest as k,debounce as I,emitStep as S,getId as q,getGrantedConsent as E,isDefined as O,isFunction as x,isObject as j,OBSERVE_ENV_KEY as T,processEventMapping as C,stepId as P,tryCatchAsync as M,useHooks as D,compileState as A,applyState as $}from"@walkeros/core";import{emitStep as _}from"@walkeros/core";import{observeEnv as R}from"@walkeros/core";import{isArray as B,FatalError as z}from"@walkeros/core";import{tryCatch as W,tryCatchAsync as H}from"@walkeros/core";import{stepId as G}from"@walkeros/core";import{createIngest as N,FatalError as Q,getMappingValue as L,getSpanId as U,parseTraceparent as F,isScope as K,tryCatchAsync as J,compileCache as V,checkCache as Y,storeCache as X,applyUpdate as Z,createMappingRoot as ee,compileState as te,applyState as ne}from"@walkeros/core";import{advanceChain as oe,clone as se,createIngest as re,deriveSpanId as ie,emitStep as ae,FatalError as ce,isChainContinuation as de,isObject as ue,startChain as le,stepId as pe,tryCatchAsync as fe,useHooks as ge,compileCache as he,checkCache as me,storeCache as ve,createMappingRoot as we,validateStepEntry as ye,processEventMapping as be,compileState as ke,applyState as Ie}from"@walkeros/core";import{assign as Se,getSpanId as qe,getTraceId as Ee,InvalidEventError as Oe,isFunction as xe,isString as je}from"@walkeros/core";import{isObject as Te}from"@walkeros/core";import{OBSERVE_STORAGE_KEY as Ce,createBatchedPoster as Pe,createTelemetryObserver as Me,parseObserveCredential as De}from"@walkeros/core";import{assign as Ae,createLogger as $e}from"@walkeros/core";import{createIngest as _e,emitStep as Re,FatalError as Be,getGrantedConsent as ze,getSpanId as We,InvalidEventError as He,processEventMapping as Ge,tryCatchAsync as Ne,useHooks as Qe}from"@walkeros/core";import{FatalError as Le,useHooks as Ue,tryCatchAsync as Fe}from"@walkeros/core";import{emitStep as Ke,useHooks as Je}from"@walkeros/core";import{compileMatcher as Ve,emitStep as Ye,readCacheEnvelope as Xe,wrapCacheEnvelope as Ze}from"@walkeros/core";var et={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",Scoped:"_",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function tt(e,t,n){return{traceId:e.source?.trace??t?._meta.trace??n.trace,sourceId:t?._meta.path[0],parentEventId:t?._meta.parentEventId}}function nt(e,t){const n=e.status.startedAt,o={flowId:e.name??"default",stepId:t.stepId,stepType:t.stepType,phase:t.phase,eventId:t.eventId,timestamp:new Date(t.now).toISOString(),elapsedMs:t.now-n};return t.traceId&&(o.traceId=t.traceId),t.sourceId&&(o.sourceId=t.sourceId),t.parentEventId&&(o.parentEventId=t.parentEventId),o}function ot(e,t,n,o,s){e.status.in++;const r=nt(e,{stepId:"collector.push",stepType:"collector",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now(),...tt(t,n,e)});r.skipReason="dropped",r.meta={by:o??"route",at:s},_(e,r)}function st(e,t,n){if(null===e||"object"!=typeof e)return e;if(n>=8||!function(e){if(Array.isArray(e))return!0;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(e))return e;const o=t.get(e);if(void 0!==o)return o;if(Array.isArray(e)){const o=[];t.set(e,o);for(const s of e)o.push(st(s,t,n+1));return o}const s={};t.set(e,s);for(const[o,r]of Object.entries(e))s[o]="function"==typeof r?r:st(r,t,n+1);return s}function rt(e,t){try{return e[t]}catch{return"[unreadable]"}}function it(e){const t=new WeakSet,n=(e,o)=>{if(null===e)return null;if("function"==typeof e)return"[function]";if("string"==typeof e||"boolean"==typeof e)return e;if("number"==typeof e)return Number.isFinite(e)?e:null;if("bigint"==typeof e)return String(e);if("object"!=typeof e)return;const s=e;if(t.has(s))return"[circular]";if(o>=6)return"[truncated]";let r;t.add(s);try{if(Array.isArray(s))r=s.map(e=>n(e,o+1));else if(function(e){const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(s)){const e={};for(const t of Object.keys(s))e[t]=n(rt(s,t),o+1);r=e}else r=function(e){try{return String(e)}catch{return"[object]"}}(s)}catch{r="[unreadable]"}return t.delete(s),r};return e.map(e=>n(e,0))}function at(e){return e.map(e=>({fn:e.fn,args:it(e.args),ts:e.ts}))}function ct(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var dt=new WeakMap;function ut(e,t,n,o){dt.get(e)||(dt.set(e,!0),t.warn(n,o))}function lt(e){dt.delete(e)}var pt=()=>Date.now();function ft(e){if(void 0!==e)return"number"==typeof e?{threshold:e,cooldown:3e4}:{threshold:e.threshold??5,cooldown:e.cooldown??3e4}}function gt(e,t,n,o,s){if("partial"===n)return;const r=((i=e)[a=t]||(i[a]={state:"closed",consecutiveFailures:0}),i[a]);var i,a;return"success"===n?(r.consecutiveFailures=0,r.state="closed",r.probing=!1,void(r.openUntil=void 0)):(r.consecutiveFailures+=1,"half-open"===r.state?(r.state="open",r.probing=!1,void(r.openUntil=pt()+s)):void(r.consecutiveFailures>=o&&(r.state="open",r.probing=!1,r.openUntil=pt()+s)))}function ht(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function mt(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function vt(e){const t={error:e instanceof Error?e.message:String(e)};if(e instanceof Error&&e.name&&"Error"!==e.name&&(t.name=e.name),"object"==typeof e&&null!==e&&"code"in e){const n=e;"number"!=typeof n.code&&"string"!=typeof n.code||(t.code=n.code)}return t}function wt(e,t,n,o,s){const r=G(t,n);return(t,i)=>{try{if(i)return s?function(e,t,n,o,s,r){const i=t.dlq=t.dlq||[],a={max:t.config.dlqMax??100},c=ct(i,[o,s],a);if(c.dropped>0){const t=mt(e.status,G("destination",n),"dlq",c.dropped);ut(i,r,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:n,cap:a.max,droppedCount:t})}else i.length<a.max&<(i);const d=ht(e,n);d.failed++,d.dlqSize=i.length,e.status.failed++;const u=ft(t.config.breaker);if(u){const o=t.config.id||n;gt(e.status.breakers,G("destination",o),"transport-failure",u.threshold,u.cooldown)}}(e,s,n,i,t,o):e.status.failed++,void o.error("report error",{...vt(t),event:i.name});e.status.connectionErrors[r]=(e.status.connectionErrors[r]??0)+1,o.error("connection error",vt(t))}catch{}}}function yt(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function bt(e,t){return e?t.stores[e]:t.stores.__cache}function kt(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}async function It(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:re(n),config:t.config,env:Dt(t.config.env),reportError:wt(e,"transformer",n,s)};s.debug("init");const i=await ge(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function St(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Dt(t.config.env),...r?{respond:r}:{}},reportError:wt(e,"transformer",n,a)};a.debug("push",{event:o.name});const d="string"==typeof o.id?o.id:"",{traceId:u,sourceId:l,parentEventId:p}=tt(o,s,e),f=Date.now(),g=nt(e,{stepId:pe("transformer",n),stepType:"transformer",phase:"in",eventId:d,now:f,traceId:u,sourceId:l,parentEventId:p});g.inEvent=o,ae(e,g);try{const s=await ge(t.push,"TransformerPush",e.hooks,e.logger)(o,c),r=Date.now(),i=nt(e,{stepId:pe("transformer",n),stepType:"transformer",phase:"out",eventId:d,now:r,traceId:u,sourceId:l,parentEventId:p});return i.durationMs=r-f,i.outEvent=s,ae(e,i),a.debug("push done"),s}catch(t){const o=Date.now(),s=nt(e,{stepId:pe("transformer",n),stepType:"transformer",phase:"error",eventId:d,now:o,traceId:u,sourceId:l,parentEventId:p});throw s.durationMs=o-f,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},ae(e,s),t}}function qt(e){return"string"==typeof e.id?e.id:""}function Et(e,t){const n=qt(e);return""!==n&&""===qt(t)?{...t,id:n}:t}function Ot(e,t,n,o){const s=(a=n,{...a,_meta:{...a._meta,path:[...a._meta.path]}}),r=se(t),i=qt(e);var a;if(""===i)return{event:r,ingest:s};s._meta.parentEventId=i;const c=qt(r);return""!==c&&c!==i||(r.id=ie(i,o)),{event:r,ingest:s}}function xt(e,t){return{copies:e,respond:t}}function jt(e,t){if(void 0===t)return e.rest;const n=e.ownNext?e.rest.slice(1):e.rest;return[{route:t,ancestry:e.ancestry},...n]}async function Tt(e,t,n){const o=await Promise.all(t.map((t,n)=>fe(Ct,t=>(e.collector.logger.scope("transformer:fork").error(`fork ${n} failed`,vt(t)),{copies:[]}))(e,t))),s=[];let r,i=n,a=o.length>0;return o.forEach((e,n)=>{void 0!==t[n].respond&&e.respond&&(i=e.respond),e.stopped||(a=!1),e.stopped||0===e.copies.length?void 0===r&&(r=e.droppedBy):s.push(...e.copies)}),0===s.length?{copies:s,respond:i,...a?{stopped:!0}:{},...void 0!==r?{droppedBy:r}:{}}:xt(s,i)}async function Ct(e,t){const{ingest:n}=t;let{stack:o,event:s,respond:r}=t,i=t.resume;for(;;){let t,a;if(i)t=i.member,a=i,i=void 0;else{const i=oe(o,we(n,s),e.transformers);if("done"===i.kind)return xt([{event:s,ingest:n}],r);if("stop"===i.kind)return{copies:[],respond:r,stopped:!0,...void 0!==i.owner?{droppedBy:i.owner}:{}};if("fork"===i.kind){const t=s;return Tt(e,i.branches.map((e,o)=>({stack:e,...Ot(t,t,n,o),respond:void 0})),r)}const a=e.transformers[i.id];t={id:i.id,ancestry:i.ancestry,rest:i.rest,ownNext:!!a&&void 0!==a.config.next}}const c=await Pt(e,t,s,n,r,a);if("halt"===c.kind)return c.result;if("fork"===c.kind)return Tt(e,c.copies,r);s=c.event,r=c.respond,o=c.stack}}async function Pt(e,t,n,o,s,r){const{collector:i,transformers:a,chainContext:c}=e,d=t.id,u=a[d];let l=n,p=s;const f=(e=t.rest)=>({kind:"continue",event:Et(n,l),respond:p,stack:e}),g=e=>({kind:"halt",result:e});if(!u)return i.logger.warn(`Transformer not found: ${d}`),f();const h=u.config?.cache,m=h?he(h):void 0,v=m?yt(m,i):void 0;let w=r?.cacheMiss;if(!r){if(o._meta.path.length>256)return i.logger.error(`Max path length exceeded at ${d}`),g({copies:[],respond:p});if(o._meta.hops++,o._meta.path.push(d),!await fe(It,e=>{if(e instanceof ce)throw e;return i.status.failed++,i.logger.scope(`transformer:${u.type||"unknown"}`).error("transformer init failed",{transformer:d,...vt(e)}),!1})(i,u,d))return g({copies:[],respond:p});if(c&&void 0!==u.config?.chainMocks?.[c]){const e=u.config.chainMocks[c];return i.logger.scope(`transformer:${u.type||"unknown"}`).debug("chainMock",{chain:c}),l=e,f()}if(void 0!==u.config?.mock)return i.logger.scope(`transformer:${u.type||"unknown"}`).debug("mock"),l=u.config.mock,f();if(u.config?.disabled)return f();if(m&&v){const e=await me(m,v,we(o,l));if("HIT"===e?.status&&e.value)return l=e.value,m.stop?g({copies:[{event:Et(n,l),ingest:o}],respond:p,stopped:!0}):f();"MISS"===e?.status&&(w={key:e.key,ttl:e.rule.ttl})}if(void 0!==u.config.before){const e=await async function(e,t,n,o,s,r,i){const a=t[n],c=a?a.config.before:void 0,d=await Mt(e,t,c,o,s,r,i);return d.stopped&&0===d.copies.length&&!d.droppedBy?{...d,droppedBy:n}:d}(i,a,d,l,o,p,c),n=e.respond??p;if(0===e.copies.length||e.stopped)return g({...e,respond:n});p=n;const[s]=e.copies;if(e.copies.length>1||s.ingest!==o){const n={member:t,cacheMiss:w};return{kind:"fork",copies:e.copies.map(e=>({stack:t.rest,event:e.event,ingest:e.ingest,respond:void 0,resume:n}))}}l=s.event}}const y=u.config?.state?ke(u.config.state):void 0,b=y?.filter(e=>"get"===e.mode),k=y?.filter(e=>"set"===e.mode),I=async e=>k&&0!==k.length?Ie(k,e=>bt(e,i),e,i,o):e;b&&b.length>0&&(l=await Ie(b,e=>bt(e,i),l,i,o));const S=await fe(St,e=>(i.status.failed++,i.logger.scope(`transformer:${u.type||"unknown"}`).error("Push failed",vt(e)),!1))(i,u,d,l,o,p);if(!1===S)return g({copies:[],respond:p,droppedBy:d});if(Array.isArray(S)&&1!==S.length){if(0===S.length)return g({copies:[],respond:p});const e=l,n=[];for(let s=0;s<S.length;s++){const r=S[s],i=await I(r.event||e);n.push({stack:jt(t,r.next),...Ot(e,i,o,s),respond:p})}return{kind:"fork",copies:n}}const q=Array.isArray(S)?S[0]:S;let E;return q&&"object"==typeof q&&(q.respond&&(p=q.respond),q.event&&(l=q.event),E=q.next),l=await I(l),w&&v&&ve(v,w.key,l,w.ttl),f(jt(t,E))}async function Mt(e,t,n,o,s,r,i){const a=s??re("string"==typeof n?n:"chain");return void 0===n?xt([{event:o,ingest:a}],r):(i&&(a._meta.chainPath=i),Ct({collector:e,transformers:t,chainContext:i},{stack:de(n)?n:le(n),event:o,ingest:a,respond:r}))}function Dt(e){return e&&ue(e)?e:{}}var At=1e4;function $t(e){return"number"==typeof e&&e>0?e:At}var _t=class extends Error{constructor(e){super(e),this.name="DestinationTimeoutError"}};function Rt(e,t,n){let o;const s=new Promise((e,s)=>{o=setTimeout(()=>s(new _t(n)),t)});return Promise.race([e,s]).finally(()=>{o&&clearTimeout(o)})}async function Bt(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o){if(Ft(n)&&!Xt(e,t,n))continue;const o=t.on;let i=!1;await J(()=>Rt(Promise.resolve(o(n,r)),At,`Source "${s}" on(${n}) did not settle within 10000ms`),t=>{if(t instanceof Q)throw t;t instanceof _t?i=!0:e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,...vt(t)})})(),Ft(n)&&!i&&Yt(e,t,n)}}function zt(e){return Boolean(e.config.init)&&!e.config.require?.length}async function Wt(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:d,terminus:u}=n,l=s.state??n.state,p=l?te(l):void 0,f=d,g=f?V({...f,stop:f.stop??!0}):void 0,h=u??e.push,m=Boolean(u),v=async(n,o,r)=>{if(m)return h(n);let i;const d="string"==typeof n.id&&""!==n.id?n:{...n,id:U()};let u=[{event:d,ingest:r.ingest}];if(void 0!==c){const n=`source.${t}.before`,o=await Mt(e,e.transformers||{},c,d,r.ingest,r.respond,n);if(0===o.copies.length)return ot(e,d,r.ingest,o.droppedBy,n),Nn({ok:!0,dropped:!0});if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),u=o.copies}if(g){const t=yt(g,e);if(t){const n=ee(r.ingest),o=await Y(g,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&g.stop){let t=o.value;return o.rule.update&&(t=await Z(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&g.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},d=o.key,u=o.rule.ttl,l=n=>{X(t,d,n,u),a?i=(async()=>{const t=await Z(n,a,c,e);s(t)})():s(n)};r.respond=l}"MISS"!==o.status||g.stop||X(t,o.key,!0,o.rule.ttl)}}}p&&p.length>0&&(u=await Promise.all(u.map(async t=>({event:await ne(p,t=>bt(t,e),t.event,e,t.ingest),ingest:t.ingest}))));let l={ok:!0};for(const e of u)l=await h(e.event,{...o,id:t,ingest:e.ingest,respond:r.respond,mapping:s,preChain:a});return i&&await i,l},w=async n=>{const o=N(t),r=F(K(n)?n?.headers?.traceparent:void 0);if(r&&(o._meta.trace=r.trace,o._meta.parentEventId=r.parentSpan),!s.ingest||void 0===n)return o;const i=await L(n,s.ingest,{collector:e});return{...o,...i,_meta:o._meta}},y=e.logger.scope("source").scope(t),b={...r,push:async(e,n={})=>{const o={ingest:N(t),respond:void 0};return v(e,n,o)},command:e.command,sources:e.sources,elb:e.elb,logger:y},k={collector:e,logger:y,id:t,config:s,env:b,withScope:async(e,t,n)=>{const o={ingest:await w(e),respond:t};return n({...b,push:(e,t={})=>v(e,t,o),ingest:o.ingest,respond:o.respond})},reportError:wt(e,"source",t,y)},I=await J(o,n=>{if(n instanceof Q)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,...vt(n)})})(k);if(!I)return;const S=I.type||"unknown",q=e.logger.scope(S).scope(t);return b.logger=q,i&&(I.config={...I.config,primary:i}),I}async function Ht(e){for(const[t,n]of Object.entries(e.sources)){if(zt(n))continue;const o=n.config.require;if(!o?.length)continue;const s=o.filter(t=>!Jt(e,t));s.length!==o.length&&(n.config.require=s,zt(n)&&await Bt(e,n,t))}for(const[t,n]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[t]||e.destinations[t])continue;const o=n.config?.require;if(!o)continue;const s=o.filter(t=>!Jt(e,t));if(n.config&&(n.config.require=s),s.length>0)continue;delete e.pending.destinations[t];const r=Qn(n);!1!==r.config.queue&&(r.queuePush=[...e.queue]),e.destinations[t]=r,await xn(e,r,t)}}function Gt(e){if("object"!=typeof e||null===e)return!1;if(!("logger"in e))return!1;const t=e.logger;return"object"==typeof t&&null!==t&&"scope"in t&&"function"==typeof t.scope}var Nt=!1;function Qt(){Nt||(Nt=!0,"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn("walkerOS: ignored an on-dispatch call with a non-collector argument"))}function Lt(e,t,n,o){if(n instanceof z)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,...vt(n)})}var Ut=[et.Consent,et.User,et.Globals,et.Custom];function Ft(e){return Ut.includes(e)}function Kt(e,t){switch(t){case et.Consent:return Object.keys(e.consent).length>0;case et.User:return Object.keys(e.user).length>0;case et.Globals:return Object.keys(e.globals).length>0;case et.Custom:return Object.keys(e.custom).length>0;default:return!1}}function Jt(e,t){switch(t){case et.Consent:case et.User:case et.Globals:case et.Custom:return Kt(e,t);case et.Run:case et.Ready:return!0===e.allowed;default:return e.seenEvents.has(String(t))}}function Vt(e,t){return e.cellVersion?.[String(t)]??0}function Yt(e,t,n){let o=e.delivery.get(t);o||(o={},e.delivery.set(t,o)),o[String(n)]=Vt(e,n)}function Xt(e,t,n){return e.allowed&&Vt(e,n)>function(e,t,n){const o=e.delivery.get(t),s=o?.[String(n)];return void 0===s?-1:s}(e,t,n)}var Zt=8;function en(e){const t=e.cascade;if(t&&!tn.has(t))return()=>{};const n=t||{counts:new WeakMap};e.cascade=n,tn.set(n,(tn.get(n)||0)+1);let o=!1;return()=>{if(o)return;o=!0;const t=(tn.get(n)||1)-1;t>0?tn.set(n,t):(tn.delete(n),e.cascade===n&&(e.cascade=void 0))}}var tn=new WeakMap;function nn(e,t,n){const o=e.cascade;if(!o)return!0;let s=o.counts.get(t);s||(s={},o.counts.set(t,s));const r=String(n),i=(s[r]||0)+1;return s[r]=i,i<=Zt||(i===Zt+1&&e.logger.error("state delivery did not converge",{type:r}),!1)}function on(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}async function sn(e,t,n,o,s){const r=t.on;if(!r)return!0;const i=Ft(o);if(i&&(rn.get(t)||an.has(t)))return mn(e,t,o),rn.get(t)||cn.add(t),!1;const a=i?Vt(e,o):0,c=i&&function(e,t,n,o){if(gn.get(t)?.has(String(n)))return!0;const s=e.delivery?.get(t)?.[String(n)];return void 0===s||s<o-1}(e,t,o,a)?kn(e,o):s,d=t.type||"unknown",u=e.logger.scope(d).scope("on").scope(o),l={collector:e,logger:u,id:n,config:t.config,data:c,env:Ln(t.env,t.config.env),reportError:wt(e,"destination",n,u,t)};i&&(vn(t,o),function(e,t,n){let o=pn.get(e);o||(o={},pn.set(e,o));const s=String(t),r=o[s];(void 0===r||r<n)&&(o[s]=n)}(t,o,a),an.add(t));const p=$t(t.config.timeout);let f=Promise.resolve(),g=!0,h=!1,m=!0;try{await H(()=>(f=Promise.resolve(r(o,l)),Rt(f,p,`Destination "${n}" on(${o}) did not settle within ${p}ms`)),t=>{g=!1,t instanceof _t&&(h=!0),Lt(e,"destination",t,{destId:n,type:o})})(),m=!1}finally{if(i){an.delete(t),m&&cn.delete(t);const s=gn.get(t);g?(yn(e,t,o,a),s?.delete(String(o))):mn(e,t,o),h?function(e,t,n,o,s,r,i){rn.set(t,(rn.get(t)||0)+1);const a=()=>{const r=(rn.get(t)||0)-1;r>0?rn.set(t,r):rn.delete(t);const a=gn.get(t);var c,d,u,l;a?a.add(String(o)):gn.set(t,new Set([String(o)])),fn(t,o,s),wn(e,t),i.debug("late settle after timeout"),cn.delete(t),e.allowed&&e.destinations[n]===t&&(c=e,d=t,u=n,l=i,H(async()=>{await xn(c,d,u),!un(d)&&d.queuePush?.length&&await Bn(c,void 0,{},{[u]:d})},e=>{l.error("state recovery failed",vt(e))})())};r.then(a,a)}(e,t,n,o,a,f,u):(fn(t,o,a),wn(e,t))}}return i&&!h&&cn.delete(t)&&await xn(e,t,n),g}var rn=new WeakMap,an=new WeakSet,cn=new WeakSet,dn=new WeakMap;function un(e){return dn.get(e)}var ln=new WeakMap,pn=new WeakMap;function fn(e,t,n){const o=pn.get(e);o&&o[String(t)]===n&&delete o[String(t)]}var gn=new WeakMap,hn=new WeakMap;function mn(e,t,n){!function(e,t,n){const o=e.delivery?.get(t);o&&delete o[String(n)]}(e,t,n);const o=gn.get(t);o?o.add(String(n)):gn.set(t,new Set([String(n)])),dn.set(t,{type:n,since:Date.now()})}function vn(e,t){ln.set(e,(ln.get(e)||0)+1),dn.set(e,{type:t,since:Date.now()})}function wn(e,t){const n=(ln.get(t)||0)-1;n>0?ln.set(t,n):ln.delete(t),function(e,t){if(!dn.has(t))return;if(ln.get(t))return;if(gn.get(t)?.size)return;Ut.some(n=>Kt(e,n)&&Xt(e,t,n))||dn.delete(t)}(e,t)}function yn(e,t,n,o){let s=e.delivery.get(t);s||(s={},e.delivery.set(t,s));const r=String(n),i=s[r];(void 0===i||i<o)&&(s[r]=o)}function bn(e,t,n,o){if(!Gt(e))return void Qt();const s=kn(e,t,o);if(n.length)switch(t){case et.Consent:!function(e,t,n){const o=n||e.consent,s=on(e,et.Consent);t.forEach(t=>{Xt(e,t,et.Consent)&&nn(e,t,et.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{W(t[n],t=>Lt(e,"consent",t,{key:n}))(o,s)}),Yt(e,t,et.Consent))})}(e,n,o);break;case et.Ready:!function(e,t){if(!e.allowed)return;const n=on(e,et.Ready);t.forEach(t=>{W(t,t=>Lt(e,"ready",t))(void 0,n)})}(e,n);break;case et.Run:!function(e,t){if(!e.allowed)return;const n=on(e,et.Run);t.forEach(t=>{W(t,t=>Lt(e,"run",t))(void 0,n)})}(e,n);break;case et.Session:!function(e,t){if(!e.session)return;const n=on(e,et.Session);t.forEach(t=>{W(t,t=>Lt(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=on(e,t),r=Ft(t);n.forEach(n=>{"function"==typeof n&&(r&&!Xt(e,n,t)||r&&!nn(e,n,t)||(W(n,n=>Lt(e,"generic",n,{type:t}))(s,o),r&&Yt(e,n,t)))});break}}}function kn(e,t,n){switch(t){case et.Consent:return n||e.consent;case et.Session:return e.session;case et.User:return n||e.user;case et.Custom:return n||e.custom;case et.Globals:return n||e.globals;case et.Config:return n||e.config;default:return}}async function In(e,t,n,o,s){if(!t.on)return!1;if(Ft(o)&&!Xt(e,t,o))return!1;if(Ft(o)&&!nn(e,t,o))return!1;const r=Ft(o);if(r&&Sn.has(t))return qn.add(t),!1;const i=r?Vt(e,o):0;r&&Sn.add(t);const a=t.on;let c,d=Promise.resolve(),u=!1;try{c=await H(()=>(d=Promise.resolve(a(o,s)),Rt(d,At,`Source "${n}" on(${o}) did not settle within 10000ms`)),t=>{t instanceof _t&&(u=!0),Lt(e,"source",t,{sourceId:n,type:o})})()}finally{r&&!u&&Sn.delete(t)}if(r)if(u){const o=()=>{Sn.delete(t),qn.delete(t),e.allowed&&e.sources[n]===t&&H(()=>En(e,t,n),t=>{e.logger.scope("on").error("state recovery failed",vt(t))})()};d.then(o,o)}else yn(e,t,o,i),qn.delete(t)&&await En(e,t,n);return!1===c}var Sn=new WeakSet,qn=new WeakSet;async function En(e,t,n){const o=en(e);try{for(const o of Ut)await In(e,t,n,o,kn(e,o))}finally{o()}}async function On(e,t,n,o,s){if(!t.on)return;const r=Ft(o);if(r&&!Xt(e,t,o))return;const i=pn.get(t)?.[String(o)];if(r&&void 0!==i&&i>=Vt(e,o))return;if(r&&!nn(e,t,o)){if(t.config.init)return void mn(e,t,o);const n=t.queueOn=t.queueOn||[],s={type:o,data:kn(e,o)},r=n[n.length-1];return r&&r.type===o?n[n.length-1]=s:n.push(s),Yt(e,t,o),void gn.get(t)?.delete(String(o))}const a=hn.get(t);if(!t.config.init||a)return t.queueOn=t.queueOn||[],t.queueOn.push({type:o,data:s}),void(r&&(Yt(e,t,o),a&&!a.held&&(vn(t,o),a.held=!0)));await sn(e,t,n,o,s)}async function xn(e,t,n){if(!t.on)return;const o=en(e);try{for(const o of Ut)(Kt(e,o)||gn.get(t)?.has(String(o)))&&await On(e,t,n,o,kn(e,o))}finally{o()}}function jn(e){return(ln.get(e)||0)>0}function Tn(e,t,n){return n.catch(()=>{}),{id:e,destination:t,done:n}}var Cn=1e3,Pn=1e3,Mn=3e4,Dn=Object.freeze({batched:!0});function An(e){return e===Dn}var $n=" batch-all";function _n(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function Rn(e){for(const t of e)un(t.destination)&&(t.drain=!0)}async function Bn(e,t,n={},o){if(!e.allowed)return Nn({ok:!1});if(!t)return zn(e,void 0,n,o);const s=await async function(e,t,n={}){const o=n.ingest??g(n.id||"unknown"),s=e.config.next;if(void 0===s)return{copies:[{event:t,ingest:o}],respond:n.respond};const r=await Mt(e,e.transformers||{},s,t,o,n.respond,Zn),i=r.respond??n.respond;return 0===r.copies.length?(e.logger.debug("Event dropped by collector.next"+(r.droppedBy?` (${r.droppedBy})`:"")),ot(e,t,o,r.droppedBy,Zn),{copies:[],respond:i,dropped:!0}):r.stopped?{copies:[],respond:i}:{copies:r.copies.map(t=>({event:Yn(e,t.event,t.ingest),ingest:t.ingest})),respond:i}}(e,t,n);if(0===s.copies.length)return Nn({ok:!0,...s.dropped?{dropped:!0}:{}});const r=[];for(const t of s.copies)r.push(await zn(e,t.event,{id:n.id,ingest:t.ingest,respond:s.respond},o));return r[0]}async function zn(e,t,n,o){const{user:s}=e;if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=ct(e.queue,t,{max:n});if(o.dropped>0){const t=mt(e.status,P("collector"),"queue",o.dropped);ut(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&<(e.queue);e.status.in++}o||(o=e.destinations);const r=e.transformers||{},i=await Promise.all(Object.entries(o||{}).map(async([o,i])=>{if(i.config.disabled)return{id:o,destination:i,skipped:!0};const a=i.config.id||o,c=P("destination",a),d=ft(i.config.breaker);if(d&&function(e,t,n){const o=e[t];if(!o||"closed"===o.state)return!1;if("half-open"===o.state)return!0===o.probing;const s=pt();return void 0!==o.openUntil&&s<o.openUntil||(o.state="half-open",o.probing=!0,o.openUntil=s+n,!1)}(e.status.breakers,c,d.cooldown))return{id:o,destination:i,skipped:!0};const u=t=>{d&>(e.status.breakers,c,t,d.threshold,d.cooldown)},l=()=>{d&&function(e,t){const n=e[t];n&&"half-open"===n.state&&!0===n.probing&&(n.state="open",n.probing=!1)}(e.status.breakers,c)},p=t=>{if(!t.length)return;i.queuePush||(i.queuePush=[]);const n=i.queuePush,s=i.config.id||o,r={max:i.config.queueMax??Cn};let a=0;for(const e of t)a+=ct(n,e,r).dropped;if(a>0){ht(e,s);const t=mt(e.status,P("destination",s),"queue",a);ut(n,e.logger.scope(i.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:s,cap:r.max,droppedCount:t})}else n.length<r.max&<(n)};var f,g;i.on&&i.config.init&&!un(i)&&!jn(i)&&(f=e,g=i,gn.get(g)?.size||Ut.some(e=>Kt(f,e)&&Xt(f,g,e)))&&await xn(e,i,o);const I=un(i);if(I&&!jn(i)&&Date.now()-I.since>=$t(i.config.timeout)&&await xn(e,i,o),un(i)){if(l(),!t)return{id:o,destination:i,skipped:!0};const e=[v(t)];return p(e),{id:o,destination:i,queue:e}}let q=(i.queuePush||[]).map(t=>({...t,consent:e.consent}));i.queuePush=[],t&&q.push(v(t));const O=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:k("unknown");if(!q.length&&!i.queueOn?.length)return l(),{id:o,destination:i,skipped:!0};if(!q.length&&i.queueOn?.length){if(!E(i.config.consent,e.consent))return l(),{id:o,destination:i,skipped:!0};let t=!1;try{t=await Hn(e,i,o,!0)}catch(t){e.status.failed++;const n=i.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)}),u("transport-failure")}if(un(i))return l(),{id:o,destination:i,skipped:!0};if(!t||!i.queuePush?.length)return l(),{id:o,destination:i,skipped:!t};q=i.queuePush.map(t=>({...t,consent:e.consent})),i.queuePush=[]}const x=t=>{const n=e.consent,s=[],r=t.filter(t=>{const r=E(i.config.consent,n,t.consent);if(r)return t.consent=r,s.push(t),!1;const a=nt(e,{stepId:P("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now(),...tt(t,O,e)});return a.skipReason="consent",n&&(a.consent={...n}),i.config.consent&&(a.meta={required:{...i.config.consent}}),S(e,a),!0});return{allowed:s,skipped:r}},j=e.consent,{allowed:T,skipped:C}=x(q);if(p(C),!T.length)return l(),{id:o,destination:i,queue:q};const D=new Set(i.queuePush);let _=!1;try{_=await Hn(e,i,o,!0)}catch(g){e.status.failed++;const t=i.type||"unknown";e.logger.scope(t).error("destination init failed",{error:g instanceof Error?g.message:String(g)}),u("transport-failure")}if(!_)return l(),{id:o,destination:i,queue:q};if(un(i))return l(),p(T),{id:o,destination:i,queue:T};const R=[];if(e.consent!==j){const t=x(T.map(t=>({...t,consent:e.consent})));T.splice(0,T.length,...t.allowed),R.push(...t.skipped)}const B=i.queuePush||[],z=B.filter(e=>!D.has(e));if(z.length){i.queuePush=B.filter(e=>D.has(e));const t=x(z.map(t=>({...t,consent:e.consent})));T.push(...t.allowed),R.push(...t.skipped)}if(p(R),!T.length)return l(),R.length?{id:o,destination:i,queue:R}:{id:o,destination:i,skipped:!0};let W,H;i.dlq||(i.dlq=[]);const G=i.config.before,N=i.config.next,Q=i.config?.cache,L=Q?w(Q):void 0,U=L?yt(L,e):void 0,F=i.config?.state?A(i.config.state):void 0,K=F?.filter(e=>"get"===e.mode),J=F?.filter(e=>"set"===e.mode);let V=0,Y=0,X=0;return await Promise.all(T.map(async t=>{let a,c;if(t.user=h(s,t.user),L?.stop&&U){const e=m(O,t),n=await y(L,U,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(a={key:n.key,ttl:n.rule.ttl})}let d=[{event:t,ingest:O}],u=n.respond;if(void 0!==G){const s=`destination.${o}.before`,i=await Mt(e,r,G,t,O,n.respond,s);if(0===i.copies.length){const n=nt(e,{stepId:P("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now(),...tt(t,O,e)});return n.skipReason="dropped",n.meta={by:i.droppedBy??"route",at:s},S(e,n),t}i.respond&&(u=i.respond),d=i.copies.map(e=>({event:e.event,ingest:e.ingest}))}const l=async(t,n,s)=>{let a=s,d=!1;if(L&&!L.stop&&U){const e=m(n,t??void 0),o=await y(L,U,e);if("HIT"===o?.status)return!1;"MISS"===o?.status&&(a={key:o.key,ttl:o.rule.ttl},d=!0)}K&&K.length>0&&t&&(t=await $(K,t=>bt(t,e),t,e,n));const l=Date.now();let p=!1;const f=await M(Gn,n=>{const s=i.type||"unknown";e.logger.scope(s).error("Push failed",{...vt(n),event:t.name}),W=n,p=!0;const r=i.dlq,a=i.config.id||o,c={max:i.config.dlqMax??100},d=ct(r,[t,n],c);if(d.dropped>0){ht(e,a);const t=mt(e.status,P("destination",a),"dlq",d.dropped);ut(r,e.logger.scope(i.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:a,cap:c.max,droppedCount:t})}else r.length<c.max&<(r)})(e,i,o,t,n,u);if(V+=Date.now()-l,a&&U&&void 0===i.config.mock&&(d?b(U,a.key,f??!0,a.ttl):void 0===c&&(c=f??!0)),!p&&!An(f)&&J&&J.length>0&&t&&(t=await $(J,t=>bt(t,e),t,e,n)),void 0===f||An(f)||(H=f),An(f)&&Y++,!p&&N){void 0!==f&&(n._response=f);const s=await Mt(e,r,N,t,n,u,`destination.${o}.next`);s.respond&&(u=s.respond)}return!0};for(const e of d)await l(e.event,e.ingest,a)&&X++;return a&&U&&void 0!==c&&void 0===i.config.mock&&b(U,a.key,c,a.ttl),t})),{id:o,destination:i,error:W,response:H,totalDuration:V,batchedCount:Y,allowedCount:T.length,pushedCount:X,canonicalId:a,breakerConfig:d}})),a={},c={},d={};for(const t of i){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};ht(e,t.id);const s=e.status.destinations[t.id],r=Date.now();s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0;const i=t.breakerConfig,u=t.canonicalId?P("destination",t.canonicalId):void 0,l=t=>{i&&u&>(e.status.breakers,u,t,i.threshold,i.cooldown)};if(t.error)o.error=t.error,d[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++,l("transport-failure");else if(t.queue&&t.queue.length)c[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0,c=t.pushedCount??i;(Math.max(0,c-n)>0||0===i)&&(a[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++,l("success"))}}return Nn({event:t,...Object.keys(a).length&&{done:a},...Object.keys(c).length&&{queued:c},...Object.keys(d).length&&{failed:d}})}var Wn=new WeakMap;async function Hn(e,t,n,o=!1){if(t.init&&!t.config.init){if(!o&&function(e){const t=e.config.consent;return!!t&&Object.keys(t).length>0}(t))return e.logger.scope(t.type||"unknown").debug("init blocked: consent gate not cleared"),!1;const s=Wn.get(t);if(s)return s;const r=async function(e,t,n,o){const s=await async function(e,t,n,o){const s=t.type||"unknown",r=e.logger.scope(s),i={collector:e,logger:r,id:o,config:t.config,env:Ln(t.env,t.config.env),reportError:wt(e,"destination",o,r,t)};r.debug("init");const a=Date.now();let c;S(e,nt(e,{stepId:P("destination",o),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await D(n,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const n=Date.now(),s=nt(e,{stepId:P("destination",o),stepType:"destination",phase:"error",eventId:"",now:n});throw s.durationMs=n-a,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},S(e,s),t}return!1!==c&&{...c||t.config,init:!0}}(e,t,n,o);if(!1===s)return!1;if(t.config=s,t.queueOn?.length){const n=en(e);!function(e){const t=e.queueOn?.find(({type:e})=>Ft(e));t&&vn(e,t.type),hn.set(e,{held:!!t})}(t);try{for(let n=t.queueOn?.shift();n;n=t.queueOn?.shift())await sn(e,t,o,n.type,n.data)}catch(n){for(const{type:n}of t.queueOn||[])Ft(n)&&mn(e,t,n);throw t.queueOn=[],n}finally{!function(e,t){const n=hn.get(t);hn.delete(t),n?.held&&wn(e,t)}(e,t),n()}}return e.logger.scope(t.type||"unknown").debug("init done"),!0}(e,t,t.init,n);Wn.set(t,r);try{return await r}finally{Wn.delete(t)}}return!0}async function Gn(e,t,n,o,s,r){const{config:i}=t,a=await C(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",d=e.logger.scope(c),u={collector:e,logger:d,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...Ln(t.env,i.env),...r?{respond:r}:{}},reportError:wt(e,"destination",n,d,t)};if(void 0!==i.mock)return d.debug("mock",{event:a.event.name}),i.mock;const l=a.mapping,p=void 0!==l?.batch,f=p?a.mappingKey||"* *":$n;if((p||void 0!==i.batch)&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=_n(l?.batch),r=_n(i.batch),a=s.wait??r.wait??Mn,c=s.size??r.size??Pn,u=s.age??r.age??Mn,g=Ln(t.env,i.env),h=I(async()=>{const o=t.batches[f],s=o.batched;if(0===s.entries.length)return;const r={key:s.key,entries:s.entries,events:s.events,data:s.data};s.entries=[],s.events=[],s.data=[];const a=r.entries[0],c={collector:e,logger:d,id:n,config:i,data:void 0,rule:o.isDefault?void 0:a.rule,ingest:a.ingest,env:{...g,...a.respond?{respond:a.respond}:{}},reportError:wt(e,"destination",n,d,t)};d.debug("push batch",{events:r.entries.length});const u=t.config.id||n,l=ht(e,u),p=ft(t.config.breaker),h=P("destination",u),m=t=>{p&>(e.status.breakers,h,t,p.threshold,p.cooldown)},v=Date.now(),w=new Map;let y,b=!1;const k=n=>{const o=t.dlq=t.dlq||[],s={max:t.config.dlqMax??100};let r=0;for(const e of n)r+=ct(o,e,s).dropped;if(r>0){const t=mt(e.status,P("destination",u),"dlq",r);ut(o,d,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:u,cap:s.max,droppedCount:t})}else o.length<s.max&<(o);l.failed+=n.length,l.dlqSize=o.length,e.status.failed+=n.length};let I=r.entries.length;const q=$t(i.timeout),E=await M((o,s)=>Rt(Promise.resolve(D(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger)(o,s)),q,`Destination "${n}" batch delivery timed out after ${q}ms`),e=>{I=0,b=!0,y=e,k(r.entries.map(t=>[t.event,e])),m("transport-failure"),d.error("Push batch failed",{error:e instanceof Error?e.message:String(e),entries:r.entries.length})})(r,c);if(j(O=E)&&Array.isArray(O.failed)&&E.failed.length>0){const e=[];for(const t of E.failed){const n=r.entries[t.index];if(!n||w.has(t.index))continue;const o=t.error??new Error(`Push batch entry ${t.index} failed (no per-row error provided)`);w.set(t.index,o),e.push([n.event,o])}if(e.length>0){k(e),I=Math.max(0,r.entries.length-e.length);const t=new Map;for(const[,n]of e){const e=n instanceof Error&&"code"in n&&"string"==typeof n.code?n.code:n instanceof Error?n.name:"Error",o=t.get(e);o?o.count++:t.set(e,{code:e,count:1,message:n instanceof Error?n.message:String(n)})}d.error("Push batch partial failure",{failed:e.length,delivered:I,entries:r.entries.length,causes:[...t.values()]})}}var O;const x=Date.now();r.entries.forEach((t,o)=>{const s=b||w.has(o),i=tt(t.event,t.ingest,e),a=nt(e,{stepId:P("destination",n),stepType:"destination",phase:s?"error":"flush",eventId:"string"==typeof t.event.id?t.event.id:"",now:x,traceId:i.traceId,sourceId:i.sourceId,parentEventId:i.parentEventId});if(a.batch={size:r.entries.length,index:o},a.durationMs=x-v,s){const e=b?y:w.get(o);a.error=e instanceof Error?{name:e.name,message:e.message}:{message:String(e)}}S(e,a)}),d.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-r.entries.length),I>0&&(l.count+=I,l.lastAt=Date.now(),e.status.out+=I,m("success"))},{wait:a,size:c,age:u});t.batches[f]={batched:o,isDefault:!p,batchFn:()=>{h()},flush:async()=>{await h.flush()}}}const c=t.batches[f];c.batched.entries.push({event:a.event,ingest:s,respond:r,rule:l,data:a.data}),c.batched.events.push(a.event),O(a.data)&&c.batched.data.push(a.data);const u="string"==typeof a.event.id?a.event.id:"",g=tt(o,s,e),h=Date.now(),m=nt(e,{stepId:P("destination",n),stepType:"destination",phase:"in",eventId:u,now:h,traceId:g.traceId,sourceId:g.sourceId,parentEventId:g.parentEventId});a.mappingKey&&(m.mappingKey=a.mappingKey),a.event.consent&&(m.consent={...a.event.consent}),m.inEvent=a.event,S(e,m);const v=nt(e,{stepId:P("destination",n),stepType:"destination",phase:"out",eventId:u,now:h,traceId:g.traceId,sourceId:g.sourceId,parentEventId:g.parentEventId});a.mappingKey&&(v.mappingKey=a.mappingKey),v.outEvent=a.event,v.batch={size:c.batched.entries.length,index:c.batched.entries.length-1},S(e,v);const w=t.config.id||n,y=ht(e,w);return y.inFlightBatch=(y.inFlightBatch??0)+1,c.batchFn(),Dn}{let r;if(d.debug("push",{event:a.event.name}),"trace"===e.observeLevel?.()&&Array.isArray(t.calls)&&t.calls.length>0){const e=function(e){const{simulation:t,...n}=e,o={},s=new WeakMap;for(const[e,t]of Object.entries(n))o[e]="function"==typeof t?t:st(t,s,1);const r=R(o,t);return{wrappedEnv:r.env,calls:r.calls,unresolved:r.unresolved}}({...u.env,simulation:t.calls});u.env=e.wrappedEnv,r=e.calls,e.unresolved.length>0&&(e.wrappedEnv[T]={paths:e.unresolved,record:(t,n)=>e.calls.push({fn:t,args:n,ts:Date.now()})})}const c="string"==typeof a.event.id?a.event.id:"",{traceId:l,sourceId:p,parentEventId:f}=tt(o,s,e),g=Date.now(),h=nt(e,{stepId:P("destination",n),stepType:"destination",phase:"in",eventId:c,now:g,traceId:l,sourceId:p,parentEventId:f});a.mappingKey&&(h.mappingKey=a.mappingKey),a.event.consent&&(h.consent={...a.event.consent}),h.inEvent=a.event,S(e,h);try{const o=$t(i.timeout),s=await Rt(Promise.resolve(D(t.push,"DestinationPush",e.hooks,e.logger)(a.event,u)),o,`Destination "${n}" delivery timed out after ${o}ms`),h=Date.now(),m=nt(e,{stepId:P("destination",n),stepType:"destination",phase:"out",eventId:c,now:h,traceId:l,sourceId:p,parentEventId:f});return m.durationMs=h-g,m.outEvent=a.event,r&&r.length>0&&(m.calls=at(r)),O(s)&&(m.meta={...m.meta,response:s}),a.mappingKey&&(m.mappingKey=a.mappingKey),S(e,m),d.debug("push done"),s}catch(t){const o=Date.now(),s=nt(e,{stepId:P("destination",n),stepType:"destination",phase:"error",eventId:c,now:o,traceId:l,sourceId:p,parentEventId:f});throw s.durationMs=o-g,s.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},r&&r.length>0&&(s.calls=at(r)),a.mappingKey&&(s.mappingKey=a.mappingKey),S(e,s),t}}}function Nn(e){return{ok:!e?.failed,...e}}function Qn(e){const{code:t,config:n={},env:o={},cache:s,state:r}=e,{config:i}=kt(e,"before"),{config:a}=kt({...e,config:i},"next"),c={...t.config,...n,...a};s&&(c.cache=s),void 0!==r&&void 0===c.state&&(c.state=r);const d=Ln(t.env,o);return{...t,config:c,env:d}}function Ln(e,t){return e||t?t?e&&j(e)&&j(t)?{...e,...t}:t:e:{}}async function Un(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};let c;try{await Promise.race([s(a),new Promise((n,o)=>{c=setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3)})])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}finally{c&&clearTimeout(c)}});await Promise.allSettled(o)}function Fn(e,t){e.stateVersion++,e.cellVersion[t]=e.stateVersion}async function Kn(e,t,n){let o,s,r=!1;const i=[],a=en(e);try{return await async function(){switch(t){case et.Config:Te(n)&&(Se(e.config,n,{shallow:!1,merge:!1}),s=n,r=!0);break;case et.Consent:if(Te(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=f(e.consent,n),{update:n}}(e,n);Fn(e,et.Consent),s=t,r=!0}break;case et.Custom:Te(n)&&(e.custom=Se(e.custom,n),Fn(e,et.Custom),s=n,r=!0);break;case et.Destination:Te(n)&&"code"in n&&Te(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a,state:c}=t;if(!x(n.push))return Nn({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const d={...n.config,...o||{init:!1}};let u=r?{...d,before:r}:{...d};i&&(u={...u,next:i}),a&&(u={...u,cache:a}),void 0!==c&&void 0===u.state&&(u={...u,state:c});let l=u.id;if(!l)do{l=q(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[l]||e.pending.destinations[l]);if(u.require?.length){e.pending.destinations[l]=t,await Ht(e);const n=e.destinations[l];return n?Bn(e,void 0,{},{[l]:n}):Nn({ok:!0})}const p={...n,config:u,env:Ln(n.env,s)};return e.destinations[l]=p,!1!==p.config.queue&&(p.queuePush=[...e.queue]),await xn(e,p,l),Bn(e,void 0,{},{[l]:p})}(e,n));break;case et.Globals:Te(n)&&(e.globals=Se(e.globals,n),Fn(e,et.Globals),s=n,r=!0);break;case et.Hook:if(Te(n)&&je(n.name)&&xe(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case et.On:if(Te(n)&&je(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){if(!Gt(e))return void Qt();const o=e.on,s=o[t]||[],r=B(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,bn(e,t,r)}(e,t,o)}break;case et.Ready:r=!0;break;case et.Run:o=await async function(e,t,n){e.allowed=!0,e.timing=Date.now(),e.trace=Ee(),e.count=0,t&&(t.consent&&(e.consent=Se(e.consent,t.consent),Fn(e,et.Consent)),t.user&&(e.user=Se(e.user,t.user),Fn(e,et.User)),t.globals&&(e.globals=Se(e.config.globalsStatic||{},t.globals),Fn(e,et.Globals)),t.custom&&(e.custom=Se(e.custom,t.custom),Fn(e,et.Custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await Ht(e);const o=await async function(e){if(!Gt(e))return Qt(),[];const t=[];for(const[n,o]of Object.entries(e.destinations)){if(!o.on)continue;const s=async()=>{for(const t of Ut)Kt(e,t)&&await On(e,o,n,t,kn(e,t))};t.push(Tn(n,o,s()))}for(const t of Ut){if(!Kt(e,t))continue;const n=kn(e,t);bn(e,t,e.on[t]||[]),await Promise.all(Object.entries(e.sources).filter(([,e])=>zt(e)).map(([o,s])=>In(e,s,o,t,n)))}return t}(e);let s=!0;const r={};if(e.preRunQueue.length){const t=e.preRunQueue.splice(0);e.logger.debug("replaying pre-run events",{count:t.length});for(const{event:n,options:o}of t){const t=await e.push(n,o);!1===t.ok&&(s=!1),t.failed&&Object.assign(r,t.failed)}}Rn(o);const i=await Bn(e);if(n.push(...o),s)return i;const a={...i.failed??{},...r};return{...i,ok:!1,...Object.keys(a).length>0?{failed:a}:{}}}(e,n,i),r=!0;break;case et.Session:r=!0;break;case et.Shutdown:e.hasShutdown||(e.hasShutdown=!0,await async function(e){const t=e.logger;await Un(e.sources,"source",t),await async function(e,t){const n=Object.entries(e).flatMap(([e,n])=>{const o=n.batches;if(!o)return[];const s=t.scope(n.type||"destination");return Object.values(o).map(async t=>{let n;try{await Promise.race([t.flush(),new Promise((t,o)=>{n=setTimeout(()=>o(new Error(`destination '${e}' batch flush timed out`)),5e3)})])}catch(t){s.error(`destination '${e}' batch flush failed: ${t}`)}finally{n&&clearTimeout(n)}})});await Promise.allSettled(n)}(e.destinations,t),await Un(e.destinations,"destination",t),await Un(e.transformers,"transformer",t),await Un(e.stores,"store",t)}(e));break;case et.User:Te(n)&&(Se(e.user,n,{shallow:!1}),Fn(e,et.User),s=n,r=!0);break;default:return e.logger.warn("unknown command",{command:t}),Nn({ok:!1})}if(r){const n=await async function(e,t,n,o){if(!Gt(e))return Qt(),{ok:!0,deliveries:[]};e.seenEvents.add(String(t));let s=n||[];n||(s=e.on[t]||[]);const r=kn(e,t,o),i=[];for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(zt(o)?i.push(In(e,o,n,t,r)):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:r})))}const a=[];for(const[n,o]of Object.entries(e.destinations))o.on&&a.push(Tn(n,o,On(e,o,n,t,r)));let c=!1;i.length&&(c=(await Promise.all(i)).some(Boolean));for(const[t,n]of Object.entries(e.sources))zt(n)&&n.queueOn?.length&&await Bt(e,n,t);const d=Object.values(e.sources).some(e=>!zt(e)&&e.config.require?.length);return(Object.keys(e.pending.destinations).length>0||d)&&await Ht(e),bn(e,t,s,o),{ok:!c,deliveries:a}}(e,t,void 0,s);i.push(...n.deliveries),Rn(n.deliveries);const r=function(e,t){if(!t.length)return e;const n={...e.done??{}},o={...e.queued??{}},s={...e.failed??{}};for(const e of t){for(const[t,s]of Object.entries(e.done??{}))n[t]=s,delete o[t];for(const[t,n]of Object.entries(e.failed??{}))s[t]=n,delete o[t];Object.assign(o,e.queued??{})}const r={...e,ok:e.ok&&t.every(e=>e.ok)};return delete r.done,delete r.queued,delete r.failed,Object.keys(n).length&&(r.done=n),Object.keys(o).length&&(r.queued=o),Object.keys(s).length&&(r.failed=s),r}(await Bn(e),await async function(e,t){return(await Promise.all(t.map(async({id:t,destination:n,done:o,drain:s})=>{if(await o,s&&e.allowed&&!un(n)&&n.queuePush?.length&&e.destinations[t]===n)return Bn(e,void 0,{},{[t]:n})}))).filter(O)}(e,i));if(o&&!1===o.ok){const e={...r.failed??{},...o.failed??{}};o={...r,ok:!1,...Object.keys(e).length>0?{failed:e}:{}}}else o=r}return o||Nn({ok:!0})}()}finally{a()}}function Jn(e,t){return{timing:Math.round((Date.now()-e.timing)/10)/100,source:{type:"collector",schema:"4"},...t}}function Vn(e,t,n){return Xn(e,t,n,{globals:e.globals,user:e.user,consent:e.consent})}function Yn(e,t,n){return Xn(e,Jn(e,t),n,{globals:{},user:{},consent:{}})}function Xn(e,t,n,o){const s=t.name;if("string"!=typeof s)throw new Oe(void 0===s?"Event name is required":"Event name is invalid");if(!s)throw new Oe("Event name is required");const[r,i]=s.split(" ");if(!r||!i)throw new Oe("Event name is invalid");const{timestamp:a=Date.now(),name:c=`${r} ${i}`,data:d={},context:u={},globals:l={},custom:p={},user:f=o.user,nested:g=[],consent:h=o.consent,id:m=qe(),trigger:v="",entity:w=r,action:y=i,timing:b=0,source:k={type:"collector",schema:"4"}}=t,I=k??{type:"collector",schema:"4"},S=I.count??(e.count+=1),q=I.trace??n?._meta.trace??e.trace,E={...I,count:S};void 0!==q&&(E.trace=q);const O=e.name??I.platform??"default",x=e.release??"4.7.0";return E.release={...I.release,[O]:x},{name:c,data:d,context:u,globals:Se(o.globals,l),custom:p,user:f,nested:g,consent:h,id:m,trigger:v,entity:w,action:y,timestamp:a,timing:b,source:E}}var Zn="collector.next";function eo(e,t){const n=Qe(async(n,o={})=>await Ne(async()=>{if(!e.allowed){const t=e.config.queueMax;if(void 0===t)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const s=ct(e.preRunQueue,{event:n,options:o},{max:t});if(s.dropped>0){const n=mt(e.status,"collector.preRun","queue",s.dropped);ut(e.preRunQueue,e.logger,"collector.preRunQueue overflow; oldest events dropped",{buffer:"queue",cap:t,droppedCount:n})}else e.preRunQueue.length<t&<(e.preRunQueue);return e.logger.debug("event held until run",{name:n.name,dropped:s.dropped}),Nn({ok:!0})}const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:d,include:u,exclude:l}=o;let p=a,f=n;const g=u||l?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,u,l):void 0;let h=i??_e(r||"unknown");if(c){const t=await Ge(f,c,e);if(t.ignore)return Nn({ok:!0});if(c.consent&&!ze(c.consent,e.consent,t.event.consent))return Nn({ok:!0});f=t.event}if(void 0!==d){const n=r?`source.${r}.next`:void 0,o=await Mt(e,e.transformers||{},d,f,h,p,n);if(0===o.copies.length)return e.logger.debug("Event dropped by transformer chain"+(o.droppedBy?` (${o.droppedBy})`:"")),ot(e,f,h,o.droppedBy,n??"collector.push.preChain"),Nn({ok:!0,dropped:!0});if(o.stopped)return o.respond&&(p=o.respond),Nn({ok:!0});if(o.respond&&(p=o.respond),o.copies.length>1){const n=await Promise.all(o.copies.map(async n=>{const o=Vn(e,t(n.event),n.ingest);return Bn(e,o,{id:r,ingest:n.ingest,respond:p},g)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=o.copies.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return n[0]??Nn({ok:!0})}f=o.copies[0].event,h=o.copies[0].ingest}const m=function(e,t,n){return Vn(e,Jn(e,t),n)}(e,f,h),v=await Bn(e,m,{id:r,ingest:h,respond:p},g);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return v},t=>{if(t instanceof Be)throw t;if(t instanceof He){const n=o.id;if(n){e.status.sources[n]||(e.status.sources[n]={count:0,duration:0});const t=e.status.sources[n];t.rejected=(t.rejected??0)+1}return e.logger.warn("invalid event rejected",{error:t.message}),Nn({ok:!1,invalid:!0,error:t.message})}return e.status.failed++,e.logger.error("push failed",{...vt(t),event:n.name}),Nn({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const s="string"==typeof t.id&&""!==t.id?t:{...t,id:We()},r="string"==typeof s.id?s.id:"",{traceId:i,sourceId:a,parentEventId:c}=tt(s,o?.ingest,e),d=Date.now(),u=nt(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:r,now:d,traceId:i,sourceId:a,parentEventId:c});u.inEvent=s,Re(e,u);try{const t=await n(s,o),u=Date.now(),l=nt(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:r,now:u,traceId:i,sourceId:a,parentEventId:c});return l.durationMs=u-d,l.outEvent=t,Re(e,l),t}catch(t){const n=Date.now(),o=nt(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:r,now:n,traceId:i,sourceId:a,parentEventId:c});throw o.durationMs=n-d,o.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},Re(e,o),t}}}function to(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function no(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=nt(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},Ye(a,n)},d={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?Ve(e.match):()=>!0,ttl:e.ttl})),l=e=>`${s}:${e}`;function p(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return u.find(e=>e.match(n))}const f=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...d}},async get(t){const n=l(t),s=await o.get(n),r=Xe(s);if(void 0!==r){if(!("expired"in r))return d.hits++,c(t,"hit"),r.value;try{await o.delete(n)}catch(e){g("delete",t,e)}}const i=f.get(n);if(i)return d.inflight_dedups++,c(t,"hit"),i;d.misses++,c(t,"miss");const a=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=p(t,s);if(r)try{const e=1e3*r.ttl;await o.set(n,Ze(s,e),e),d.populates++}catch(e){g("set",t,e)}return s}finally{f.delete(n)}})();return f.set(n,a),a},async set(t,n,s){d.writes++,await e.set(t,n,s);const r=p(t,n);if(r)try{const e=1e3*r.ttl;await o.set(l(t),Ze(n,e),e)}catch(e){g("set",t,e)}},async delete(t){d.deletes++,await e.delete(t);try{await o.delete(l(t))}catch(e){g("delete",t,e)}}};function g(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,vt(n)):console.warn(o,n)}}function oo(e,t,n){const o=`store.${n}`,s=Je(t.get,"StoreGet",e.hooks,e.logger),r=Je(t.set,"StoreSet",e.hooks,e.logger),i=Je(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),r=nt(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});r.meta={op:"get",key:t},Ke(e,r);try{const r=await s(t),i=Date.now(),a=nt(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:i});return a.durationMs=i-n,a.meta={op:"get",key:t},Ke(e,a),r}catch(s){const r=Date.now(),i=nt(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"get",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},Ke(e,i),s}},t.set=async(t,n,s)=>{const i=Date.now(),a=nt(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:i});a.meta={op:"set",key:t},Ke(e,a);try{await r(t,n,s);const a=Date.now(),c=nt(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:a});c.durationMs=a-i,c.meta={op:"set",key:t},Ke(e,c)}catch(n){const s=Date.now(),r=nt(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:s});throw r.durationMs=s-i,r.meta={op:"set",key:t},r.error=n instanceof Error?{name:n.name,message:n.message}:{message:String(n)},Ke(e,r),n}},t.delete=async t=>{const n=Date.now(),s=nt(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});s.meta={op:"delete",key:t},Ke(e,s);try{await i(t);const s=Date.now(),r=nt(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:s});r.durationMs=s-n,r.meta={op:"delete",key:t},Ke(e,r)}catch(s){const r=Date.now(),i=nt(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw i.durationMs=r-n,i.meta={op:"delete",key:t},i.error=s instanceof Error?{name:s.name,message:s.message}:{message:String(s)},Ke(e,i),s}}}async function so(e){const t=Ae({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=$e(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},observers:new Set,logger:o,on:{},queue:[],preRunQueue:[],round:0,count:0,stateVersion:0,cellVersion:{},delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{},connectionErrors:{},breakers:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},hasShutdown:!1,seenEvents:new Set,push:void 0,command:void 0,elb:void 0};var i,a;void 0!==e.name&&(r.name=e.name),void 0!==e.release&&(r.release=e.release),void 0!==e.next&&(t.next=e.next),r.push=eo(r,e=>Jn(r,e)),r.command=(a=Kn,Ue(async(e,t,n)=>await Fe(async()=>await a(i,e,t,n),t=>{if(t instanceof Le)throw t;return i.status.failed++,i.logger.error("command failed",{...vt(t),command:e}),Nn({ok:!1})})(),"Command",(i=r).hooks,i.logger)),r.elb=function(e){return async(t,n,o,s,r)=>{if("string"==typeof t&&t.startsWith("walker ")){const o=t.replace("walker ","");return e.command(o,n)}let i;if("string"==typeof t)i={name:t},n&&"object"==typeof n&&!Array.isArray(n)&&(i.data=n);else{if(!t||"object"!=typeof t||Array.isArray(t))return Nn({ok:!1});i={...t},n&&"object"==typeof n&&!Array.isArray(n)&&(i.data={...i.data||{},...n})}return o&&"object"==typeof o&&(i.context=o),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),e.push(i)}}(r);const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i,reportError:wt(e,"store",o,a)},d=await t(c);n[o]=d}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=to()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=no(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t),collector:e})}for(const[t,o]of Object.entries(n))"__cache"!==t&&oo(e,o,t);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=to()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=Qn(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=ye(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=kt(s,"before"),{config:c}=kt({...s,config:a},"next"),d=Object.keys(r).length>0?{...c,env:r}:c,{cache:u}=s,l=u?{...d,cache:u}:d,p=s.config?.state??s.state,f=void 0!==p&&void 0===l.state?{...l,state:p}:l,g=e.logger.scope("transformer").scope(o),h={collector:e,logger:g,id:o,ingest:re(o),config:f,env:r,reportError:wt(e,"transformer",o,g)},m=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await be(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),v=await m(h);void 0!==s.before&&void 0===v.config?.before&&(v.config={...v.config??{},before:s.before}),void 0!==s.next&&void 0===v.config?.next&&(v.config={...v.config??{},next:s.next}),void 0!==p&&void 0===v.config?.state&&(v.config={...v.config??{},state:p}),n[o]=v}return n}(r,e.transformers||{}),r}var ro=globalThis;function io(e){try{const t=ro.window;if(!t)return;t.localStorage.getItem(Ce)===e&&t.localStorage.removeItem(Ce)}catch{}}function ao(e,t){return void 0===t?e:n=>e({...n,release:t})}async function co(e){e=e||{};const t=await so(e);(function(e,t){if(t.observers)for(const n of t.observers)e.observers.add(n);const n=t.observe;if(!n)return;const o=e.name??"default";if("binding"in n){const t=function(){const e=ro.window,t=ro.URLSearchParams;if(!e||!t)return null;try{const n=new t(e.location.search.replace(/^\?/,"")).getAll(Ce);return n.length>0?n[n.length-1]??null:null}catch{return null}}(),s=t??function(){try{return ro.window?.localStorage.getItem(Ce)??null}catch{return null}}();if(!s)return;const r=De(s);if(!r)return void(null===t?(e.logger.warn("observe: malformed stored credential cleared"),io(s)):e.logger.warn("observe: malformed credential ignored"));if(r.pb!==n.binding)return void e.logger.warn("observe: credential binding mismatch, credential ignored");let i;!function(e){try{ro.window?.localStorage.setItem(Ce,e)}catch{}}(s),null!==t&&function(){const e=ro.window,t=ro.URLSearchParams;if(e&&t)try{const n=e.location.href,o=n.indexOf("#"),s=o>=0?n.slice(o):"",r=o>=0?n.slice(0,o):n,i=r.indexOf("?"),a=i>=0?r.slice(0,i):r,c=new t(i>=0?r.slice(i+1):"");c.delete(Ce);const d=c.toString();e.history.replaceState({},"",`${a}${d?`?${d}`:""}${s}`)}catch{}}();const a=Pe({url:`${n.url}/ingest/${r.ses}`,token:r.secret,headers:{"X-Walkeros-Binding":n.binding},onStatus:t=>{401===t&&(io(s),i&&e.observers.delete(i))}});i=Me(function(e,t){return void 0===t?e:n=>e({...n,flowId:t})}(ao(a,e.release),n.flowId),{flowId:n.flowId??o,...void 0!==n.level?{level:n.level}:{},...void 0!==n.sample?{sample:n.sample}:{}}),e.observers.add(i);const c=n.level;return void(void 0!==c&&(e.observeLevel=()=>c))}if("off"===n.level)return;const s=n.level;void 0!==s&&(e.observeLevel=()=>s),e.observers.add(Me(ao(Pe({url:`${n.url}/ingest/${n.sessionId}`,token:n.token}),e.release),{flowId:o,level:n.level,sample:n.sample}))})(t,e),await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await Wt(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await J(n.init.bind(n),n=>{if(n instanceof Q)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,...vt(n)})})(),o||(n.config.init=!0,zt(n)&&await Bt(e,n,t))}return await Ht(e),n}(t,e.sources||{});const{consent:n,user:o,globals:s,custom:r}=e;n&&await t.command("consent",n),o&&await t.command("user",o),s&&await t.command("globals",s),r&&await t.command("custom",r),t.config.run&&await t.command("run");let i=t.elb;const a=Object.values(t.sources),c=a.find(e=>e.config.primary);return c?i=c.push:a.length>0&&(i=a[0].push),{collector:t,elb:i}}var uo=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await co(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function lo(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var po={};t(po,{createTrigger:()=>xo,env:()=>fo,step:()=>ko});var fo={};t(fo,{moduleMockEnv:()=>yo,push:()=>wo,simulation:()=>bo});var go=()=>{},ho={error:go,warn:go,info:go,debug:go,throw:e=>{throw"string"==typeof e?new Error(e):e},json:go,scope:()=>ho},mo=()=>()=>Promise.resolve({ok:!0});function vo(){return{get push(){return mo()},get command(){return mo()},get elb(){return mo()},logger:ho}}var wo=Object.assign(vo(),{AWS:{SQSClient:class{constructor(e){this.config=e}config;async send(e){return function(e){if(!("input"in e))return!1;const{input:t}=e;return"object"==typeof t&&null!==t&&"WaitTimeSeconds"in t}(e)&&await new Promise(e=>setTimeout(e,100)),{$metadata:{},QueueUrl:"https://sqs.eu-central-1.amazonaws.com/000000000000/walkeros-events",Attributes:{QueueArn:"arn:aws:sqs:eu-central-1:000000000000:walkeros-events"},Messages:[]}}destroy(){}}}}),yo=vo(),bo=["call:AWS.SQSClient.send"],ko={};t(ko,{decoderText:()=>qo,malformedJson:()=>Eo,orderComplete:()=>So,pageView:()=>Io});var Io={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},So={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},qo={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},Eo={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function Oo(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var xo=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await co(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Oo(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};import{zodToSchema as jo}from"@walkeros/core/dev";import{z as To}from"@walkeros/core/dev";import{z as Co}from"@walkeros/core/dev";var Po=Co.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),Mo=Co.union([Co.string(),Co.array(Co.string()),Co.literal("*")]),Do=Co.object({origin:Mo.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:Co.array(Po).describe("Allowed HTTP methods").optional(),headers:Co.array(Co.string()).describe("Allowed request headers").optional(),credentials:Co.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:Co.number().int().positive().describe("Preflight cache duration in seconds").optional()}),Ao=To.object({cors:To.union([To.boolean(),Do]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:To.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:To.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),maxBatchSize:To.number().int().min(1).describe("Maximum number of events accepted in a single batch request").default(100),healthPath:To.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),$o=jo(Ao);import{zodToSchema as _o}from"@walkeros/core/dev";import{z as Ro}from"@walkeros/core/dev";var Bo=Ro.object({queueName:Ro.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:Ro.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:Ro.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:Ro.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:Ro.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:Ro.enum(["json","text","raw"]).describe("Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.").optional(),maxMessages:Ro.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:Ro.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:Ro.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:Ro.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:Ro.enum(["nack","ack"]).describe("Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.").optional()});import{z as zo}from"@walkeros/core/dev";var Wo=zo.record(zo.string(),zo.string()),Ho=zo.object({region:zo.string().min(1).describe("AWS region.").optional(),fifoQueue:zo.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:zo.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:zo.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:zo.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:zo.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:zo.object({arn:zo.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:zo.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:zo.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:Wo.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:zo.object({topicArn:zo.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:zo.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:zo.record(zo.string(),zo.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),Go=_o(Bo),No=_o(Ho),Qo={};t(Qo,{CorsOptionsSchema:()=>Do,CorsOrigin:()=>Mo,HttpMethod:()=>Po,SettingsSchema:()=>Ao,settings:()=>$o,sqsSettings:()=>Go,sqsSetup:()=>No});var Lo={sourceLambda:n,sourceSqs:po},Uo={sourceLambda:{settings:$o},sourceSqs:{settings:Go,setup:No}};export{n as examples,Lo as exportExamples,Uo as exportSchemas,Qo as schemas,po as sqsExamples};//# sourceMappingURL=dev.mjs.map
|