@vercel/queue 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/transports.ts","../src/api-client.ts","../src/dev.ts","../src/types.ts","../src/consumer-group.ts","../src/topic.ts","../src/callback.ts","../src/oidc.ts","../src/client.ts","../src/default-client.ts"],"sourcesContent":["// Transport classes for customizable serialization\nexport { BufferTransport, JsonTransport, StreamTransport } from \"./transports\";\n\n// The main clients\nexport { PollingQueueClient, QueueClient } from \"./client\";\n\n// Top-level convenience functions (lazy default client, auto-detects region)\nexport { handleCallback, send } from \"./default-client\";\n\n// Callback parsing utilities (for custom framework integrations)\nexport {\n CLOUD_EVENT_TYPE_V1BETA,\n CLOUD_EVENT_TYPE_V2BETA,\n parseCallback,\n parseRawCallback,\n} from \"./callback\";\nexport type {\n ParsedCallbackRequest,\n ParsedCallbackV1,\n ParsedCallbackV2,\n} from \"./callback\";\n\n// Error classes\nexport {\n BadRequestError,\n ConsumerDiscoveryError,\n ConsumerRegistryNotConfiguredError,\n DuplicateMessageError,\n ForbiddenError,\n InternalServerError,\n InvalidLimitError,\n MessageAlreadyProcessedError,\n MessageCorruptedError,\n MessageLockedError,\n MessageNotAvailableError,\n MessageNotFoundError,\n QueueEmptyError,\n UnauthorizedError,\n} from \"./types\";\n\n// Shared types\nexport type {\n BaseUrlResolver,\n Message,\n MessageHandler,\n MessageMetadata,\n PollingQueueClientOptions,\n QueueClientOptions,\n ReceiveBatchOptions,\n ReceiveByIdOptions,\n ReceiveOptions,\n ReceiveResult,\n RetryDirective,\n RetryHandler,\n SendOptions,\n SendResult,\n Transport,\n VercelRegion,\n} from \"./types\";\n","/**\n * Serializer/Deserializer interface for message payloads.\n *\n * Built-in implementations:\n * - `JsonTransport` - JSON serialization (default, buffers entire payload)\n * - `BufferTransport` - Binary data (buffers entire payload)\n * - `StreamTransport` - Pass-through streaming (no buffering, ideal for large payloads)\n */\nexport interface Transport<T = unknown> {\n /**\n * Serialize a value to a buffer or stream for transmission.\n * The result is sent as the request body with the `contentType` header.\n */\n serialize(value: T): Buffer | ReadableStream<Uint8Array>;\n\n /**\n * Deserialize a readable stream back to the original value.\n * Called when receiving messages from the queue.\n */\n deserialize(stream: ReadableStream<Uint8Array>): Promise<T>;\n\n /**\n * Optional cleanup method for deserialized payloads that may contain resources.\n * Called automatically by ConsumerGroup on error; manual cleanup required for direct client usage.\n * @param payload The deserialized payload to clean up\n */\n finalize?(payload: T): Promise<void>;\n\n /**\n * MIME type for this serialization format.\n * Sent as the Content-Type header when publishing messages.\n */\n contentType: string;\n}\n\nasync function streamToBuffer(\n stream: ReadableStream<Uint8Array>,\n): Promise<Buffer> {\n let totalLength = 0;\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n } finally {\n reader.releaseLock();\n }\n\n // Combine chunks into a single buffer\n return Buffer.concat(chunks, totalLength);\n}\n\n/**\n * JSON serializer/deserializer (default transport).\n *\n * Ideal for structured data. Buffers the entire payload in memory for parsing.\n *\n * @example\n * ```typescript\n * // Default (JsonTransport is used automatically)\n * const queue = new QueueClient();\n * await queue.send(\"topic\", { data: \"example\" });\n *\n * // With custom serialization\n * const queue = new QueueClient({\n * transport: new JsonTransport({\n * replacer: (key, value) => key === \"password\" ? undefined : value,\n * reviver: (key, value) => key === \"date\" ? new Date(value) : value,\n * }),\n * });\n * await queue.send(\"topic\", { data: \"example\" });\n * ```\n */\nexport class JsonTransport<T = unknown> implements Transport<T> {\n readonly contentType = \"application/json\";\n readonly replacer?: Parameters<typeof JSON.stringify>[1];\n readonly reviver?: Parameters<typeof JSON.parse>[1];\n\n /**\n * Create a new JsonTransport.\n * @param options - Optional JSON serialization options\n * @param options.replacer - Custom replacer for JSON.stringify\n * @param options.reviver - Custom reviver for JSON.parse\n */\n constructor(\n options: {\n replacer?: Parameters<typeof JSON.stringify>[1];\n reviver?: Parameters<typeof JSON.parse>[1];\n } = {},\n ) {\n this.replacer = options.replacer;\n this.reviver = options.reviver;\n }\n\n serialize(value: T): Buffer {\n return Buffer.from(JSON.stringify(value, this.replacer), \"utf8\");\n }\n\n async deserialize(stream: ReadableStream<Uint8Array>): Promise<T> {\n const buffer = await streamToBuffer(stream);\n return JSON.parse(buffer.toString(\"utf8\"), this.reviver);\n }\n}\n\n/**\n * Binary data serializer/deserializer.\n *\n * Ideal for binary data that fits in memory. Buffers the entire payload.\n *\n * @example\n * ```typescript\n * const queue = new QueueClient({ transport: new BufferTransport() });\n * await queue.send(\"binary-topic\", myBuffer);\n * ```\n */\nexport class BufferTransport implements Transport<Buffer> {\n readonly contentType = \"application/octet-stream\";\n\n serialize(value: Buffer): Buffer {\n return value;\n }\n\n async deserialize(stream: ReadableStream<Uint8Array>): Promise<Buffer> {\n return await streamToBuffer(stream);\n }\n}\n\n/**\n * Pass-through stream serializer/deserializer.\n *\n * Ideal for large files and real-time streams. Does not buffer data in memory.\n *\n * **Important:** When using StreamTransport, you must call `finalize(payload)` when done\n * processing to prevent resource leaks. ConsumerGroup handles this automatically;\n * direct client usage requires manual cleanup.\n *\n * @example\n * ```typescript\n * // Sending a stream\n * const queue = new QueueClient({ transport: new StreamTransport() });\n * await queue.send(\"large-file\", myReadableStream);\n *\n * // Receiving - cleanup handled automatically\n * const poller = new PollingQueueClient({ region: \"iad1\", transport: new StreamTransport() });\n * await poller.receive(\"large-file\", \"processor\", async (stream, meta) => {\n * const reader = stream.getReader();\n * // Process chunks...\n * });\n * ```\n */\nexport class StreamTransport implements Transport<ReadableStream<Uint8Array>> {\n readonly contentType = \"application/octet-stream\";\n\n serialize(value: ReadableStream<Uint8Array>): ReadableStream<Uint8Array> {\n return value;\n }\n\n async deserialize(\n stream: ReadableStream<Uint8Array>,\n ): Promise<ReadableStream<Uint8Array>> {\n return stream;\n }\n\n /**\n * Consume any remaining stream data to prevent resource leaks.\n * Called automatically by ConsumerGroup; manual call required for direct client usage.\n */\n async finalize(payload: ReadableStream<Uint8Array>): Promise<void> {\n const reader = payload.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","declare const __PACKAGE_VERSION__: string;\n\nimport { parseMultipartStream } from \"mixpart\";\nimport { isDevMode } from \"./dev\";\nimport { getVercelOidcToken } from \"./oidc\";\nimport { JsonTransport } from \"./transports\";\nimport type { Transport } from \"./transports\";\nimport type {\n BaseUrlResolver,\n ChangeVisibilityOptions,\n ChangeVisibilityResponse,\n AcknowledgeMessageOptions,\n AcknowledgeMessageResponse,\n Message,\n QueueClientOptions,\n ReceiveMessageByIdOptions,\n ReceiveMessageByIdResponse,\n ReceiveMessagesOptions,\n SendMessageOptions,\n SendMessageResponse,\n VercelRegion,\n} from \"./types\";\nimport {\n BadRequestError,\n ConsumerDiscoveryError,\n ConsumerRegistryNotConfiguredError,\n DuplicateMessageError,\n ForbiddenError,\n InternalServerError,\n InvalidLimitError,\n MessageAlreadyProcessedError,\n MessageCorruptedError,\n MessageNotAvailableError,\n MessageNotFoundError,\n UnauthorizedError,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n return (\n process.env.VERCEL_QUEUE_DEBUG === \"1\" ||\n process.env.VERCEL_QUEUE_DEBUG === \"true\"\n );\n}\n\nasync function consumeStream(\n stream: ReadableStream<Uint8Array>,\n): Promise<void> {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction throwCommonHttpError(\n status: number,\n statusText: string,\n errorText: string,\n operation: string,\n badRequestDefault: string = \"Invalid parameters\",\n): never {\n if (status === 400) {\n throw new BadRequestError(errorText || badRequestDefault);\n }\n if (status === 401) {\n throw new UnauthorizedError(errorText || undefined);\n }\n if (status === 403) {\n throw new ForbiddenError(errorText || undefined);\n }\n if (status >= 500) {\n throw new InternalServerError(\n errorText || `Server error: ${status} ${statusText}`,\n );\n }\n throw new Error(`Failed to ${operation}: ${status} ${statusText}`);\n}\n\nfunction parseQueueHeaders(\n headers: Headers,\n): Omit<Message<unknown>, \"payload\"> | null {\n const messageId = headers.get(\"Vqs-Message-Id\");\n const deliveryCountStr = headers.get(\"Vqs-Delivery-Count\") || \"0\";\n const timestamp = headers.get(\"Vqs-Timestamp\");\n const contentType = headers.get(\"Content-Type\") || \"application/octet-stream\";\n const receiptHandle = headers.get(\"Vqs-Receipt-Handle\");\n const expiresAtStr = headers.get(\"Vqs-Expires-At\");\n\n if (!messageId || !timestamp || !receiptHandle) {\n return null;\n }\n\n const deliveryCount = parseInt(deliveryCountStr, 10);\n if (Number.isNaN(deliveryCount)) {\n return null;\n }\n\n return {\n messageId,\n deliveryCount,\n createdAt: new Date(timestamp),\n expiresAt: expiresAtStr ? new Date(expiresAtStr) : undefined,\n contentType,\n receiptHandle,\n };\n}\n\nconst DEFAULT_BASE_URL_RESOLVER: BaseUrlResolver = (region) =>\n new URL(`https://${region}.vercel-queue.com`);\n\nfunction resolveBaseUrl(\n region: string,\n resolver: BaseUrlResolver | undefined,\n): URL {\n return (resolver ?? DEFAULT_BASE_URL_RESOLVER)(region);\n}\n\nconst BASE_PATH = \"/api/v3/topic\";\n\nexport class ApiClient {\n private baseUrl: URL;\n private customHeaders: Record<string, string>;\n private providedToken?: string;\n private resolvedDeploymentId?: string;\n private pinSends: boolean;\n private explicitlyUnpinned: boolean;\n private transport: Transport;\n private region: string;\n private baseUrlResolver: BaseUrlResolver | undefined;\n private dispatcher: unknown | undefined;\n\n constructor(options: QueueClientOptions & { region: VercelRegion }) {\n this.region = options.region;\n this.baseUrlResolver = options.resolveBaseUrl;\n this.baseUrl = resolveBaseUrl(this.region, this.baseUrlResolver);\n this.customHeaders = options.headers || {};\n this.providedToken = options.token;\n this.transport = options.transport || new JsonTransport();\n this.dispatcher = options.dispatcher;\n\n if (options.deploymentId === null) {\n this.pinSends = false;\n this.explicitlyUnpinned = true;\n } else {\n this.resolvedDeploymentId =\n options.deploymentId || process.env.VERCEL_DEPLOYMENT_ID;\n this.pinSends = true;\n this.explicitlyUnpinned = false;\n }\n }\n\n /**\n * Return a new ApiClient targeting the given region, sharing all other\n * configuration (token, transport, headers, deployment ID, resolver).\n * Used internally by handleCallback to route follow-up API calls to the\n * region indicated by the incoming `ce-vqsregion` header.\n */\n withRegion(region: string): ApiClient {\n return new ApiClient({\n region,\n resolveBaseUrl: this.baseUrlResolver,\n token: this.providedToken,\n headers: { ...this.customHeaders },\n deploymentId: this.explicitlyUnpinned ? null : this.resolvedDeploymentId,\n transport: this.transport,\n dispatcher: this.dispatcher,\n });\n }\n\n getRegion(): string {\n return this.region;\n }\n\n getTransport(): Transport {\n return this.transport;\n }\n\n private requireDeploymentId(): void {\n if (isDevMode() || this.explicitlyUnpinned || this.resolvedDeploymentId) {\n return;\n }\n throw new Error(\n \"No deployment ID available. VERCEL_DEPLOYMENT_ID is not set.\\n\\n\" +\n \"This usually means the code is running outside a Vercel deployment \" +\n \"(e.g. during build or in a non-Vercel environment).\\n\\n\" +\n \"To fix this, create a client with an explicit deploymentId:\\n\" +\n ' new QueueClient({ deploymentId: \"dpl_xxx\" })\\n' +\n \"Or explicitly opt out of deployment pinning:\\n\" +\n \" new QueueClient({ deploymentId: null })\",\n );\n }\n\n private getSendDeploymentId(): string | undefined {\n if (isDevMode()) {\n return undefined;\n }\n this.requireDeploymentId();\n return this.pinSends ? this.resolvedDeploymentId : undefined;\n }\n\n private getConsumeDeploymentId(): string | undefined {\n if (isDevMode()) {\n return undefined;\n }\n this.requireDeploymentId();\n return this.resolvedDeploymentId;\n }\n\n private async getToken(): Promise<string> {\n if (this.providedToken) {\n return this.providedToken;\n }\n\n try {\n return await getVercelOidcToken();\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err);\n throw new Error(\n isDevMode()\n ? \"Failed to get OIDC token for local development.\\n\\n\" +\n \"To fix this, pull your environment variables with Vercel CLI:\\n\" +\n \" `vercel env pull`\\n\\n\" +\n `Cause: ${cause}`\n : \"Failed to get OIDC token. This usually means the function is running \" +\n \"outside of a Vercel Function environment.\\n\\n\" +\n \"To fix this, either:\\n\" +\n \" - Deploy to Vercel (OIDC tokens are provisioned automatically)\\n\" +\n \" - Provide a token explicitly: `new QueueClient({ token: '...' })`\\n\\n\" +\n `Cause: ${cause}`,\n );\n }\n }\n\n private buildUrl(queueName: string, ...pathSegments: string[]): string {\n const encodedQueue = encodeURIComponent(queueName);\n const segments = pathSegments.map((s) => encodeURIComponent(s));\n const path = segments.length > 0 ? \"/\" + segments.join(\"/\") : \"\";\n const basePath = this.baseUrl.pathname.replace(/\\/+$/, \"\");\n return `${this.baseUrl.origin}${basePath}${BASE_PATH}/${encodedQueue}${path}`;\n }\n\n private async fetch(\n url: string,\n init: RequestInit & { headers: Headers },\n ): Promise<Response> {\n const method = init.method || \"GET\";\n\n if (isDebugEnabled()) {\n const logData: Record<string, unknown> = {\n method,\n url,\n headers: init.headers,\n };\n\n const body = init.body;\n if (body !== undefined && body !== null) {\n if (body instanceof ArrayBuffer) {\n logData.bodySize = body.byteLength;\n } else if (body instanceof Uint8Array) {\n logData.bodySize = body.byteLength;\n } else if (typeof body === \"string\") {\n logData.bodySize = body.length;\n } else {\n logData.bodyType = typeof body;\n }\n }\n\n console.debug(\"[VQS Debug] Request:\", JSON.stringify(logData, null, 2));\n }\n\n init.headers.set(\"User-Agent\", `@vercel/queue/${__PACKAGE_VERSION__}`);\n init.headers.set(\"Vqs-Client-Ts\", new Date().toISOString());\n\n const fetchInit = this.dispatcher\n ? { ...init, dispatcher: this.dispatcher }\n : init;\n // @ts-expect-error dispatcher is not in @types/node RequestInit but supported at runtime\n const response = await fetch(url, fetchInit);\n\n if (isDebugEnabled()) {\n const logData: Record<string, unknown> = {\n method,\n url,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n\n console.debug(\"[VQS Debug] Response:\", JSON.stringify(logData, null, 2));\n }\n\n return response;\n }\n\n async sendMessage<T = unknown>(\n options: SendMessageOptions<T>,\n ): Promise<SendMessageResponse | { messageId: null }> {\n const transport = this.transport as Transport<T>;\n const {\n queueName,\n payload,\n idempotencyKey,\n retentionSeconds,\n delaySeconds,\n headers: optionHeaders,\n } = options;\n\n const headers = new Headers();\n\n if (this.customHeaders) {\n for (const [name, value] of Object.entries(this.customHeaders)) {\n headers.append(name, value);\n }\n }\n\n if (optionHeaders) {\n const protectedHeaderNames = new Set([\"authorization\", \"content-type\"]);\n const isProtectedHeader = (name: string): boolean => {\n const lower = name.toLowerCase();\n if (protectedHeaderNames.has(lower)) return true;\n return lower.startsWith(\"vqs-\");\n };\n\n for (const [name, value] of Object.entries(optionHeaders)) {\n if (!isProtectedHeader(name) && value !== undefined) {\n headers.append(name, value);\n }\n }\n }\n\n headers.set(\"Authorization\", `Bearer ${await this.getToken()}`);\n headers.set(\"Content-Type\", transport.contentType);\n\n const deploymentId = this.getSendDeploymentId();\n if (deploymentId) {\n headers.set(\"Vqs-Deployment-Id\", deploymentId);\n }\n\n if (idempotencyKey) {\n headers.set(\"Vqs-Idempotency-Key\", idempotencyKey);\n }\n\n if (retentionSeconds !== undefined) {\n headers.set(\"Vqs-Retention-Seconds\", retentionSeconds.toString());\n }\n\n if (delaySeconds !== undefined) {\n headers.set(\"Vqs-Delay-Seconds\", delaySeconds.toString());\n }\n\n const serialized = transport.serialize(payload);\n const body = Buffer.isBuffer(serialized)\n ? new Uint8Array(serialized)\n : serialized;\n\n const response = await this.fetch(this.buildUrl(queueName), {\n method: \"POST\",\n body,\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 409) {\n throw new DuplicateMessageError(\n errorText || \"Duplicate idempotency key detected\",\n idempotencyKey,\n );\n }\n if (response.status === 502) {\n throw new ConsumerDiscoveryError(\n errorText || \"Consumer discovery failed\",\n deploymentId,\n );\n }\n if (response.status === 503) {\n throw new ConsumerRegistryNotConfiguredError(\n errorText || \"Consumer registry not configured\",\n );\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"send message\",\n );\n }\n\n if (response.status === 202) {\n return { messageId: null };\n }\n\n const responseData = (await response.json()) as SendMessageResponse;\n\n return responseData;\n }\n\n async *receiveMessages<T = unknown>(\n options: ReceiveMessagesOptions<T>,\n ): AsyncGenerator<Message<T>, void, unknown> {\n const transport = this.transport as Transport<T>;\n const { queueName, consumerGroup, visibilityTimeoutSeconds, limit } =\n options;\n\n if (limit !== undefined && (limit < 1 || limit > 10)) {\n throw new InvalidLimitError(limit);\n }\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n Accept: \"multipart/mixed\",\n ...this.customHeaders,\n });\n\n if (visibilityTimeoutSeconds !== undefined) {\n headers.set(\n \"Vqs-Visibility-Timeout-Seconds\",\n visibilityTimeoutSeconds.toString(),\n );\n }\n\n if (limit !== undefined) {\n headers.set(\"Vqs-Max-Messages\", limit.toString());\n }\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(queueName, \"consumer\", consumerGroup),\n {\n method: \"POST\",\n headers,\n },\n );\n\n if (response.status === 204) {\n return;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"receive messages\",\n );\n }\n\n for await (const multipartMessage of parseMultipartStream(response)) {\n try {\n const parsedHeaders = parseQueueHeaders(multipartMessage.headers);\n\n if (!parsedHeaders) {\n console.warn(\"Missing required queue headers in multipart part\");\n await consumeStream(multipartMessage.payload);\n continue;\n }\n\n const deserializedPayload = await transport.deserialize(\n multipartMessage.payload,\n );\n\n const message: Message<T> = {\n ...parsedHeaders,\n payload: deserializedPayload,\n };\n\n yield message;\n } catch (error) {\n console.warn(\"Failed to process multipart message:\", error);\n await consumeStream(multipartMessage.payload);\n }\n }\n }\n\n async receiveMessageById<T = unknown>(\n options: ReceiveMessageByIdOptions<T>,\n ): Promise<ReceiveMessageByIdResponse<T>> {\n const transport = this.transport as Transport<T>;\n const { queueName, consumerGroup, messageId, visibilityTimeoutSeconds } =\n options;\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n Accept: \"multipart/mixed\",\n ...this.customHeaders,\n });\n\n if (visibilityTimeoutSeconds !== undefined) {\n headers.set(\n \"Vqs-Visibility-Timeout-Seconds\",\n visibilityTimeoutSeconds.toString(),\n );\n }\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(queueName, \"consumer\", consumerGroup, \"id\", messageId),\n {\n method: \"POST\",\n headers,\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 404) {\n throw new MessageNotFoundError(messageId);\n }\n if (response.status === 409) {\n let errorData: { error?: string; originalMessageId?: string } = {};\n try {\n errorData = JSON.parse(errorText);\n } catch {\n // ignore parse errors\n }\n\n if (errorData.originalMessageId) {\n throw new MessageNotAvailableError(\n messageId,\n `This message was a duplicate - use originalMessageId: ${errorData.originalMessageId}`,\n );\n }\n throw new MessageNotAvailableError(messageId);\n }\n if (response.status === 410) {\n throw new MessageAlreadyProcessedError(messageId);\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"receive message by ID\",\n );\n }\n\n for await (const multipartMessage of parseMultipartStream(response)) {\n const parsedHeaders = parseQueueHeaders(multipartMessage.headers);\n\n if (!parsedHeaders) {\n await consumeStream(multipartMessage.payload);\n throw new MessageCorruptedError(\n messageId,\n \"Missing required queue headers in response\",\n );\n }\n\n const deserializedPayload = await transport.deserialize(\n multipartMessage.payload,\n );\n\n const message: Message<T> = {\n ...parsedHeaders,\n payload: deserializedPayload,\n };\n\n return { message };\n }\n\n throw new MessageNotFoundError(messageId);\n }\n\n async acknowledgeMessage(\n options: AcknowledgeMessageOptions,\n ): Promise<AcknowledgeMessageResponse> {\n const { queueName, consumerGroup, receiptHandle } = options;\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n ...this.customHeaders,\n });\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(\n queueName,\n \"consumer\",\n consumerGroup,\n \"lease\",\n receiptHandle,\n ),\n {\n method: \"DELETE\",\n headers,\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 404) {\n throw new MessageNotFoundError(receiptHandle);\n }\n if (response.status === 409) {\n throw new MessageNotAvailableError(\n receiptHandle,\n errorText ||\n \"Invalid receipt handle, message not in correct state, or already processed\",\n );\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"acknowledge message\",\n \"Missing or invalid receipt handle\",\n );\n }\n\n return { acknowledged: true };\n }\n\n async changeVisibility(\n options: ChangeVisibilityOptions,\n ): Promise<ChangeVisibilityResponse> {\n const {\n queueName,\n consumerGroup,\n receiptHandle,\n visibilityTimeoutSeconds,\n } = options;\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n \"Content-Type\": \"application/json\",\n ...this.customHeaders,\n });\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(\n queueName,\n \"consumer\",\n consumerGroup,\n \"lease\",\n receiptHandle,\n ),\n {\n method: \"PATCH\",\n headers,\n body: JSON.stringify({ visibilityTimeoutSeconds }),\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 404) {\n throw new MessageNotFoundError(receiptHandle);\n }\n if (response.status === 409) {\n throw new MessageNotAvailableError(\n receiptHandle,\n errorText ||\n \"Invalid receipt handle, message not in correct state, or already processed\",\n );\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"change visibility\",\n \"Missing receipt handle or invalid visibility timeout\",\n );\n }\n\n return { success: true };\n }\n}\n","/**\n * Development mode utilities for local queue compatibility.\n *\n * Key behaviors:\n * - Discovers queue routes from vercel.json experimentalTriggers config\n * - Registers handlers via handleCallback/handleNodeCallback at module load time\n * - On send(), invokes registered handlers directly (no HTTP round-trip)\n * - First delivery uses the production coreHandleCallback code path\n * - Re-deliveries (retries) call the handler directly for fast local iteration\n */\nimport * as fs from \"node:fs\";\nimport * as net from \"node:net\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport pc from \"picocolors\";\nimport { matchesWildcardPattern } from \"./callback\";\nimport { handleCallback as coreHandleCallback } from \"./callback\";\nimport type { HandleCallbackOptions } from \"./callback\";\nimport { MessageNotFoundError } from \"./types\";\nimport type {\n MessageHandler,\n MessageMetadata,\n RetryDirective,\n RetryHandler,\n} from \"./types\";\nimport type { QueueClient } from \"./client\";\n\nconst PREFIX = pc.cyan(\"[queue]\");\nconst OK = pc.green(\"✓\");\nconst FAIL = pc.red(\"✗\");\nconst RETRY = pc.yellow(\"↻\");\n\n// ---------------------------------------------------------------------------\n// Dev mode check\n// ---------------------------------------------------------------------------\n\nexport function isDevMode(): boolean {\n return process.env.NODE_ENV === \"development\";\n}\n\n// ---------------------------------------------------------------------------\n// vercel.json route mappings\n// ---------------------------------------------------------------------------\n\nconst ROUTE_MAPPINGS_KEY = Symbol.for(\"@vercel/queue.devRouteMappings\");\n\ninterface DevRouteMapping {\n filePath: string;\n topic: string;\n consumer: string;\n retryAfterSeconds?: number;\n}\n\n/**\n * Convert a file path to a consumer group name using mnemonic escapes.\n * Matches the encoding from @vercel/build-utils sanitizeConsumerName:\n * _ → __, / → _S, . → _D, other invalid chars → _XX (hex code)\n */\nfunction filePathToConsumerGroup(filePath: string): string {\n let result = \"\";\n for (const char of filePath) {\n if (char === \"_\") {\n result += \"__\";\n } else if (char === \"/\") {\n result += \"_S\";\n } else if (char === \".\") {\n result += \"_D\";\n } else if (/[A-Za-z0-9-]/.test(char)) {\n result += char;\n } else {\n result +=\n \"_\" + char.charCodeAt(0).toString(16).toUpperCase().padStart(2, \"0\");\n }\n }\n return result;\n}\n\nfunction getDevRouteMappings(): DevRouteMapping[] | null {\n const g = globalThis as typeof globalThis & {\n [ROUTE_MAPPINGS_KEY]?: DevRouteMapping[] | null;\n };\n\n if (ROUTE_MAPPINGS_KEY in g) {\n return g[ROUTE_MAPPINGS_KEY] ?? null;\n }\n\n try {\n const vercelJsonPath = path.join(process.cwd(), \"vercel.json\");\n if (!fs.existsSync(vercelJsonPath)) {\n g[ROUTE_MAPPINGS_KEY] = null;\n return null;\n }\n\n const vercelJson = JSON.parse(fs.readFileSync(vercelJsonPath, \"utf-8\")) as {\n functions?: {\n [filePath: string]: {\n experimentalTriggers?: Array<{\n type: string;\n topic?: string;\n retryAfterSeconds?: number;\n }>;\n };\n };\n };\n\n if (!vercelJson.functions) {\n g[ROUTE_MAPPINGS_KEY] = null;\n return null;\n }\n\n const mappings: DevRouteMapping[] = [];\n\n for (const [filePath, config] of Object.entries(vercelJson.functions)) {\n if (!config.experimentalTriggers) continue;\n\n for (const trigger of config.experimentalTriggers) {\n if (!trigger.type?.startsWith(\"queue/\") || !trigger.topic) continue;\n\n if (trigger.type !== \"queue/v2beta\") {\n console.warn(\n `${PREFIX} Unsupported trigger type \"${trigger.type}\" for ` +\n `topic \"${trigger.topic}\" in ${filePath}. ` +\n `Use \"queue/v2beta\" instead.`,\n );\n continue;\n }\n\n mappings.push({\n filePath,\n topic: trigger.topic,\n consumer: filePathToConsumerGroup(filePath),\n retryAfterSeconds: trigger.retryAfterSeconds,\n });\n }\n }\n\n g[ROUTE_MAPPINGS_KEY] = mappings.length > 0 ? mappings : null;\n return g[ROUTE_MAPPINGS_KEY];\n } catch (error) {\n console.warn(`${PREFIX} Failed to read vercel.json:`, error);\n g[ROUTE_MAPPINGS_KEY] = null;\n return null;\n }\n}\n\nfunction findMatchingRoutes(topicName: string): DevRouteMapping[] {\n const mappings = getDevRouteMappings();\n if (!mappings) return [];\n\n return mappings.filter((mapping) => {\n if (mapping.topic.includes(\"*\")) {\n return matchesWildcardPattern(topicName, mapping.topic);\n }\n return mapping.topic === topicName;\n });\n}\n\nfunction findRetryAfterSeconds(\n topicName: string,\n consumerGroup: string,\n): number | undefined {\n const routes = findMatchingRoutes(topicName);\n const route = routes.find((r) => r.consumer === consumerGroup);\n return route?.retryAfterSeconds;\n}\n\n/**\n * Strip `src/` prefix from framework directories so that e.g.\n * `src/app/api/route.ts` can match a vercel.json key `app/api/route.ts`.\n */\nfunction stripSrcPrefix(filePath: string): string | null {\n if (/^src\\/(app|pages|server)\\//.test(filePath)) {\n return filePath.slice(4); // remove \"src/\"\n }\n return null;\n}\n\n/**\n * Test whether a source file path matches a vercel.json functions key.\n * Uses exact match + minimatch (glob), matching @vercel/build-utils behavior.\n */\nfunction matchesFunctionsPattern(sourceFile: string, pattern: string): boolean {\n return sourceFile === pattern || minimatch(sourceFile, pattern);\n}\n\n/**\n * Find vercel.json route mappings for a given file path.\n * Tries both the literal relative path and — when the file lives under\n * `src/` — the `src/`-stripped variant so that users can write either\n * `\"app/api/route.ts\"` or `\"src/app/api/route.ts\"` in vercel.json.\n *\n * Also supports glob patterns (e.g. `\"api/** /*.ts\"`) via minimatch,\n * matching @vercel/build-utils getLambdaOptionsFromFunction behavior.\n */\nfunction findMappingsForFile(absolutePath: string): DevRouteMapping[] {\n const mappings = getDevRouteMappings();\n if (!mappings) return [];\n\n const cwd = process.cwd();\n let relative: string;\n try {\n relative = path.relative(cwd, absolutePath);\n } catch {\n return [];\n }\n const normalized = relative.replace(/\\\\/g, \"/\");\n const stripped = stripSrcPrefix(normalized);\n\n return mappings.filter(\n (m) =>\n matchesFunctionsPattern(normalized, m.filePath) ||\n (stripped !== null && matchesFunctionsPattern(stripped, m.filePath)),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Caller file path extraction (dev-only, uses Error().stack)\n// ---------------------------------------------------------------------------\n\nfunction parseFrameFilePath(line: string): string | null {\n let match = line.match(/\\((.+?):\\d+:\\d+\\)/);\n if (!match) match = line.match(/at\\s+(.+?):\\d+:\\d+/);\n if (!match) return null;\n let filePath = match[1].trim();\n if (\n filePath === \"native\" ||\n filePath.startsWith(\"node:\") ||\n filePath.startsWith(\"internal\")\n ) {\n return null;\n }\n if (filePath.startsWith(\"file://\")) {\n try {\n filePath = new URL(filePath).pathname;\n } catch {\n return null;\n }\n }\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(filePath)) {\n return null;\n }\n if (filePath.startsWith(\"./\")) {\n filePath = filePath.slice(2);\n }\n return filePath;\n}\n\nlet _sdkPackageDir: string | undefined;\nfunction getSdkPackageDir(): string {\n if (_sdkPackageDir) return _sdkPackageDir;\n try {\n const thisDir =\n typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(new URL(import.meta.url).pathname);\n _sdkPackageDir = path.resolve(thisDir, \"..\");\n } catch {\n _sdkPackageDir = \"\";\n }\n return _sdkPackageDir;\n}\n\n/**\n * Find the file path of the first caller outside this SDK package.\n * Scans the stack frames (instead of using a fixed offset) so it works\n * regardless of how many frames the runtime inlines or collapses (e.g. Bun).\n * Handles V8 (Node.js/Deno) and JSC (Bun) stack frame formats.\n * Dev-only -- never runs in production.\n */\nfunction extractCallerFilePath(): string | null {\n const stack = new Error().stack;\n if (!stack) return null;\n const lines = stack.split(\"\\n\").slice(1);\n const pkgDir = getSdkPackageDir();\n\n for (const line of lines) {\n const fp = parseFrameFilePath(line);\n if (!fp) continue;\n const absolute = path.isAbsolute(fp) ? fp : path.resolve(process.cwd(), fp);\n let realFp: string;\n try {\n realFp = fs.realpathSync(absolute);\n } catch {\n realFp = absolute;\n }\n if (pkgDir && realFp.startsWith(pkgDir)) continue;\n return realFp;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Handler registry\n// ---------------------------------------------------------------------------\n\nconst HANDLER_REGISTRY_KEY = Symbol.for(\"@vercel/queue.devHandlerRegistry\");\n\ninterface RegisteredHandler {\n consumerGroup: string;\n handler: MessageHandler;\n client: QueueClient;\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler };\n}\n\ntype HandlerRegistry = Map<string, RegisteredHandler[]>;\n\nfunction getHandlerRegistry(): HandlerRegistry {\n const g = globalThis as typeof globalThis & {\n [HANDLER_REGISTRY_KEY]?: HandlerRegistry;\n };\n if (!g[HANDLER_REGISTRY_KEY]) {\n g[HANDLER_REGISTRY_KEY] = new Map();\n }\n return g[HANDLER_REGISTRY_KEY];\n}\n\nfunction registerHandlerForFile(\n filePath: string,\n handler: MessageHandler,\n client: QueueClient,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n): boolean {\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(process.cwd(), filePath);\n const fileMappings = findMappingsForFile(absolutePath);\n if (fileMappings.length === 0) return false;\n\n const registry = getHandlerRegistry();\n for (const mapping of fileMappings) {\n const key = mapping.topic;\n const existing = registry.get(key) ?? [];\n const nextEntry: RegisteredHandler = {\n consumerGroup: mapping.consumer,\n handler,\n client,\n options,\n };\n const existingIndex = existing.findIndex(\n (e) => e.consumerGroup === mapping.consumer,\n );\n if (existingIndex >= 0) {\n // HMR can recreate handlers for the same route; keep the latest callback.\n existing[existingIndex] = nextEntry;\n } else {\n existing.push(nextEntry);\n }\n registry.set(key, existing);\n }\n return true;\n}\n\n/**\n * Register a handler for dev mode direct invocation.\n * Called from handleCallback/handleNodeCallback at module load time.\n *\n * Uses stack trace detection to find the caller's file path, then\n * matches it against vercel.json entries (exact or suffix match for\n * bundled environments).\n *\n * @internal `_testCallerPath` bypasses stack detection for tests.\n */\nexport function registerDevHandler(\n handler: MessageHandler,\n client: QueueClient,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n _testCallerPath?: string,\n): void {\n const callerPath = _testCallerPath ?? extractCallerFilePath();\n if (!callerPath) {\n console.warn(\n `${PREFIX} Could not determine caller file path for handler registration.`,\n );\n return;\n }\n\n const registered = registerHandlerForFile(\n callerPath,\n handler,\n client,\n options,\n );\n\n if (!registered) {\n const allMappings = getDevRouteMappings();\n\n if (allMappings && allMappings.length > 0) {\n // Routes are configured but this file doesn't match any of them.\n // Don't warn here — invocation-time diagnostics in invokeDevHandlers\n // will report the real outcome after dynamic import and route priming\n // have been attempted.\n return;\n }\n\n const cwd = process.cwd();\n let relative: string;\n try {\n relative = path.relative(cwd, callerPath).replace(/\\\\/g, \"/\");\n } catch {\n relative = callerPath;\n }\n\n console.warn(\n `${PREFIX} handleCallback() in ${relative} has no matching ` +\n `experimentalTriggers in vercel.json. This handler won't receive messages.\\n\\n` +\n `Add a trigger to vercel.json:\\n` +\n ` \"${relative}\": {\\n` +\n ` \"experimentalTriggers\": [{ \"type\": \"queue/v2beta\", \"topic\": \"your-topic\" }]\\n` +\n ` }`,\n );\n }\n}\n\n/**\n * Look up registered handlers for a topic. Supports wildcard topic patterns\n * from vercel.json (e.g. \"user-*\" matches \"user-signup\").\n */\nfunction lookupHandlers(topicName: string): RegisteredHandler[] {\n const registry = getHandlerRegistry();\n const result: RegisteredHandler[] = [];\n\n for (const [pattern, handlers] of registry) {\n const matches = pattern.includes(\"*\")\n ? matchesWildcardPattern(topicName, pattern)\n : pattern === topicName;\n if (matches) {\n result.push(...handlers);\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Dev mode invocation (replaces HTTP round-trip)\n// ---------------------------------------------------------------------------\n\nconst DEV_RETRY_INITIAL_DELAY_MS = 50;\nconst DEV_RETRY_MAX_WAIT_MS = 5000;\nconst DEV_RETRY_BACKOFF = 2;\nconst PORT_CHECK_TIMEOUT_MS = 250;\nconst PRIME_PORT_ENV_KEYS = [\n \"PORT\",\n \"NEXT_PORT\",\n \"NEXTJS_PORT\",\n \"NUXT_PORT\",\n \"NITRO_PORT\",\n \"SVELTEKIT_PORT\",\n \"VITE_PORT\",\n \"DEV_PORT\",\n \"npm_config_port\",\n];\nconst PRIME_URL_ENV_KEYS = [\n \"__NEXT_PRIVATE_ORIGIN\",\n \"NUXT_PUBLIC_SITE_URL\",\n \"URL\",\n];\n\ninterface ImportFailure {\n filePath: string;\n reason: string;\n}\n\ninterface PrimeFailure {\n filePath: string;\n url: string;\n reason: string;\n}\n\ninterface HandlerLoadDiagnostics {\n triedPorts: number[];\n listeningPorts: number[];\n unavailablePorts: number[];\n importFailures: ImportFailure[];\n primeFailures: PrimeFailure[];\n}\n\ninterface EnsureHandlersLoadedOptions {\n refreshRegistered?: boolean;\n}\n\nfunction formatErrorReason(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isMessageNotFoundError(error: unknown): boolean {\n if (error instanceof MessageNotFoundError) {\n return true;\n }\n if (error instanceof Error && error.name === \"MessageNotFoundError\") {\n return true;\n }\n return false;\n}\n\nfunction parsePort(value: string | undefined): number | null {\n if (!value) return null;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 1 || parsed > 65535) return null;\n return parsed;\n}\n\nfunction parsePortFromUrl(value: string | undefined): number | null {\n if (!value) return null;\n try {\n const parsed = new URL(value).port;\n return parsePort(parsed);\n } catch {\n return null;\n }\n}\n\nfunction collectPrimePorts(): number[] {\n const result: number[] = [];\n const seen = new Set<number>();\n const add = (port: number | null) => {\n if (port && !seen.has(port)) {\n seen.add(port);\n result.push(port);\n }\n };\n\n for (const key of PRIME_PORT_ENV_KEYS) {\n add(parsePort(process.env[key]));\n }\n\n for (const key of PRIME_URL_ENV_KEYS) {\n add(parsePortFromUrl(process.env[key]));\n }\n\n return result;\n}\n\nfunction isPortListening(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host: \"localhost\", port });\n let settled = false;\n\n const finish = (listening: boolean) => {\n if (settled) return;\n settled = true;\n socket.destroy();\n resolve(listening);\n };\n\n socket.once(\"connect\", () => finish(true));\n socket.once(\"error\", () => finish(false));\n socket.setTimeout(PORT_CHECK_TIMEOUT_MS, () => finish(false));\n });\n}\n\n/**\n * Call coreHandleCallback with retries for eventual consistency.\n * The V1 callback path does a receiveMessageById which may throw\n * MessageNotFoundError if the message hasn't propagated yet.\n */\nasync function invokeWithRetry(\n handler: MessageHandler,\n request: {\n queueName: string;\n consumerGroup: string;\n messageId: string;\n region: string;\n },\n options: HandleCallbackOptions,\n): Promise<void> {\n let elapsed = 0;\n let delay = DEV_RETRY_INITIAL_DELAY_MS;\n\n while (true) {\n try {\n await coreHandleCallback(handler, request, options);\n return;\n } catch (error) {\n if (isMessageNotFoundError(error) && elapsed < DEV_RETRY_MAX_WAIT_MS) {\n await new Promise((r) => setTimeout(r, delay));\n elapsed += delay;\n delay = Math.min(\n delay * DEV_RETRY_BACKOFF,\n DEV_RETRY_MAX_WAIT_MS - elapsed,\n );\n continue;\n }\n throw error;\n }\n }\n}\n\n/**\n * Convert a file path from vercel.json to a URL path for HTTP priming.\n * e.g., \"app/api/queue/route.ts\" → \"/api/queue\"\n */\nfunction filePathToUrlPath(filePath: string): string {\n let urlPath = filePath\n .replace(/^src\\/app\\//, \"/\")\n .replace(/^src\\/pages\\//, \"/\")\n .replace(/^src\\/server\\//, \"/\")\n .replace(/^src\\/routes\\//, \"/\")\n .replace(/^app\\//, \"/\")\n .replace(/^pages\\//, \"/\")\n .replace(/^server\\//, \"/\")\n .replace(/\\/route\\.(ts|mts|js|mjs|tsx|jsx)$/, \"\")\n .replace(/\\/\\+server\\.(ts|mts|js|mjs|tsx|jsx)$/, \"\")\n .replace(/\\.(ts|mts|js|mjs|tsx|jsx)$/, \"\");\n\n if (!urlPath.startsWith(\"/\")) {\n urlPath = \"/\" + urlPath;\n }\n\n return urlPath;\n}\n\n/**\n * Attempt to load route handler modules that haven't been loaded yet.\n *\n * Strategy:\n * 1. Try dynamic import (works in tsx, plain Node, Bun, Deno)\n * 2. If still not registered, try HTTP POST to the route URL. This primes\n * frameworks with lazy module loading (Next.js) to evaluate the route\n * file, which triggers handleCallback() → registration.\n */\nasync function ensureHandlersLoaded(\n topicName: string,\n options: EnsureHandlersLoadedOptions = {},\n): Promise<HandlerLoadDiagnostics> {\n const diagnostics: HandlerLoadDiagnostics = {\n triedPorts: collectPrimePorts(),\n listeningPorts: [],\n unavailablePorts: [],\n importFailures: [],\n primeFailures: [],\n };\n\n const matchingRoutes = findMatchingRoutes(topicName);\n if (matchingRoutes.length === 0) return diagnostics;\n\n const shouldRefreshRegistered = options.refreshRegistered === true;\n\n for (const port of diagnostics.triedPorts) {\n if (await isPortListening(port)) {\n diagnostics.listeningPorts.push(port);\n } else {\n diagnostics.unavailablePorts.push(port);\n }\n }\n\n for (const route of matchingRoutes) {\n const alreadyRegistered = isHandlerRegistered(topicName, route.consumer);\n if (alreadyRegistered && !shouldRefreshRegistered) {\n continue;\n }\n\n if (!alreadyRegistered) {\n const absolutePath = path.resolve(process.cwd(), route.filePath);\n try {\n await import(absolutePath);\n } catch (error) {\n diagnostics.importFailures.push({\n filePath: route.filePath,\n reason: formatErrorReason(error),\n });\n }\n\n if (isHandlerRegistered(topicName, route.consumer)) continue;\n }\n\n for (const port of diagnostics.listeningPorts) {\n const url = `http://localhost:${port}${filePathToUrlPath(route.filePath)}`;\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"x-vercel-queue-prime\": \"1\",\n \"x-vercel-queue-prime-file\": route.filePath,\n },\n });\n try {\n await response.text();\n } catch {}\n\n if (isHandlerRegistered(topicName, route.consumer)) {\n break;\n }\n\n diagnostics.primeFailures.push({\n filePath: route.filePath,\n url,\n reason:\n `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : \"\"}`.trim(),\n });\n } catch (error) {\n diagnostics.primeFailures.push({\n filePath: route.filePath,\n url,\n reason: formatErrorReason(error),\n });\n }\n }\n }\n\n return diagnostics;\n}\n\nfunction buildNoHandlerWarning(\n topicName: string,\n routes: DevRouteMapping[],\n diagnostics: HandlerLoadDiagnostics,\n): string {\n const files = routes.map((r) => r.filePath);\n const suggestedPort =\n diagnostics.listeningPorts[0] ?? diagnostics.triedPorts[0];\n const suggestedUrls = suggestedPort\n ? routes.map(\n (r) =>\n `http://localhost:${suggestedPort}${filePathToUrlPath(r.filePath)}`,\n )\n : [];\n\n let portSummary: string;\n if (diagnostics.triedPorts.length === 0) {\n portSummary =\n \"No local dev port detected from env. Set PORT (or NEXT_PORT/NUXT_PORT/VITE_PORT).\";\n } else if (diagnostics.listeningPorts.length === 0) {\n portSummary = `Detected env ports: [${diagnostics.triedPorts.join(\", \")}], but none are listening.`;\n } else {\n const unavailable =\n diagnostics.unavailablePorts.length > 0\n ? ` Not listening: [${diagnostics.unavailablePorts.join(\", \")}].`\n : \"\";\n portSummary =\n `Detected env ports: [${diagnostics.triedPorts.join(\", \")}]. ` +\n `Listening: [${diagnostics.listeningPorts.join(\", \")}].` +\n unavailable;\n }\n\n const importSummary =\n diagnostics.importFailures.length > 0\n ? `\\nImport failures: ` +\n diagnostics.importFailures\n .slice(0, 2)\n .map((f) => `${f.filePath} (${f.reason})`)\n .join(\"; \")\n : \"\";\n\n const primeSummary =\n diagnostics.primeFailures.length > 0\n ? `\\nPrime failures: ` +\n diagnostics.primeFailures\n .slice(0, 3)\n .map((f) => `${f.url} (${f.reason})`)\n .join(\"; \")\n : \"\";\n\n return (\n `${PREFIX} No registered handler for topic \"${topicName}\". ` +\n `vercel.json maps this topic to [${files.join(\", \")}] but auto-loading failed.\\n` +\n `${portSummary}${importSummary}${primeSummary}\\n` +\n `Ensure your dev server is running, set PORT if needed, and confirm mapped ` +\n `route files call handleCallback()/handleNodeCallback() at module scope.\\n` +\n (suggestedUrls.length > 0\n ? `Try opening: ${suggestedUrls.join(\" or \")}`\n : \"Set PORT (or NEXT_PORT/NUXT_PORT/VITE_PORT) and try sending again.\")\n );\n}\n\nfunction isHandlerRegistered(\n topicName: string,\n consumerGroup: string,\n): boolean {\n return lookupHandlers(topicName).some(\n (h) => h.consumerGroup === consumerGroup,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dev mode re-delivery (issues #5 / #6)\n// ---------------------------------------------------------------------------\n\nconst DEV_REDELIVERY_MAX_DELAY_S = 10;\nconst DEV_REDELIVERY_DEFAULT_DELAY_S = 2;\nconst DEV_REDELIVERY_MAX_ATTEMPTS = 10;\nconst DEFAULT_RETENTION_S = 86_400; // 24 hours\n\ninterface DevRedeliveryContext {\n handler: MessageHandler;\n retry?: RetryHandler;\n payload: unknown;\n topicName: string;\n consumerGroup: string;\n messageId: string;\n region: string;\n createdAt: Date;\n retentionSeconds: number;\n deliveryCount: number;\n defaultRetryDelayS: number;\n}\n\nfunction scheduleDevRedelivery(\n ctx: DevRedeliveryContext,\n delayS: number,\n): void {\n const cappedDelay = Math.min(Math.max(delayS, 0), DEV_REDELIVERY_MAX_DELAY_S);\n\n console.log(\n `${PREFIX} ${RETRY} Scheduling re-delivery in ${cappedDelay}s: topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\"`,\n );\n\n setTimeout(async () => {\n const nextDeliveryCount = ctx.deliveryCount + 1;\n const expiresAt = new Date(\n ctx.createdAt.getTime() + ctx.retentionSeconds * 1000,\n );\n\n if (Date.now() >= expiresAt.getTime()) {\n console.log(\n `${PREFIX} Message expired, stopping retries: topic=\"${ctx.topicName}\" messageId=\"${ctx.messageId}\"`,\n );\n return;\n }\n\n if (nextDeliveryCount > DEV_REDELIVERY_MAX_ATTEMPTS) {\n console.log(\n `${PREFIX} Max re-deliveries (${DEV_REDELIVERY_MAX_ATTEMPTS}) reached: topic=\"${ctx.topicName}\" messageId=\"${ctx.messageId}\"`,\n );\n return;\n }\n\n const metadata: MessageMetadata = {\n messageId: ctx.messageId,\n deliveryCount: nextDeliveryCount,\n createdAt: ctx.createdAt,\n expiresAt,\n topicName: ctx.topicName,\n consumerGroup: ctx.consumerGroup,\n region: ctx.region,\n };\n\n console.log(\n `${PREFIX} Re-delivering: topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\" deliveryCount=${nextDeliveryCount}`,\n );\n\n let succeeded = true;\n let nextRetryAfterS: number | null = null;\n let nextAcknowledged = false;\n\n try {\n await ctx.handler(ctx.payload, metadata);\n } catch (error) {\n succeeded = false;\n\n if (ctx.retry) {\n let directive: RetryDirective | void | undefined;\n try {\n directive = ctx.retry(error, metadata);\n } catch (retryErr) {\n console.warn(`${PREFIX} retry handler threw:`, retryErr);\n }\n\n if (directive && \"afterSeconds\" in directive) {\n nextRetryAfterS = directive.afterSeconds;\n } else if (directive && \"acknowledge\" in directive) {\n nextAcknowledged = true;\n }\n }\n\n if (!nextAcknowledged) {\n console.error(\n `${PREFIX} ${FAIL} Handler error on re-delivery: topic=\"${ctx.topicName}\" messageId=\"${ctx.messageId}\"`,\n error,\n );\n }\n }\n\n if (succeeded) {\n console.log(\n `${PREFIX} ${OK} Message processed on re-delivery: topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\"`,\n );\n } else if (nextAcknowledged) {\n console.log(\n `${PREFIX} ${OK} Message acknowledged (will not retry): topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\"`,\n );\n } else {\n const nextDelay = nextRetryAfterS ?? ctx.defaultRetryDelayS;\n scheduleDevRedelivery(\n { ...ctx, deliveryCount: nextDeliveryCount },\n nextDelay,\n );\n }\n }, cappedDelay * 1000);\n}\n\n/**\n * Invoke registered handlers for a topic in dev mode.\n * Constructs a ParsedCallbackV1 and calls coreHandleCallback directly.\n *\n * If no handlers are registered yet (lazy-loaded framework), attempts to\n * dynamically import the route files from vercel.json first.\n */\nexport function invokeDevHandlers(\n topicName: string,\n messageId: string,\n region: string,\n delaySeconds?: number,\n retentionSeconds?: number,\n): void {\n if (delaySeconds && delaySeconds > 0) {\n console.log(\n `${PREFIX} Message sent with delay: topic=\"${topicName}\" messageId=\"${messageId}\" delay=${delaySeconds}s`,\n );\n setTimeout(() => {\n invokeDevHandlers(\n topicName,\n messageId,\n region,\n undefined,\n retentionSeconds,\n );\n }, delaySeconds * 1000);\n return;\n }\n\n console.log(\n `${PREFIX} Message sent: topic=\"${topicName}\" messageId=\"${messageId}\"`,\n );\n\n (async () => {\n let handlers = lookupHandlers(topicName);\n let diagnostics: HandlerLoadDiagnostics | null = null;\n\n if (handlers.length > 0) {\n // Refresh mapped routes to pick up HMR-updated callbacks before invocation.\n await ensureHandlersLoaded(topicName, { refreshRegistered: true });\n handlers = lookupHandlers(topicName);\n } else {\n diagnostics = await ensureHandlersLoaded(topicName);\n handlers = lookupHandlers(topicName);\n }\n\n if (handlers.length === 0) {\n const matchingRoutes = findMatchingRoutes(topicName);\n if (matchingRoutes.length > 0) {\n const safeDiagnostics = diagnostics ?? {\n triedPorts: collectPrimePorts(),\n listeningPorts: [],\n unavailablePorts: [],\n importFailures: [],\n primeFailures: [],\n };\n console.warn(\n buildNoHandlerWarning(topicName, matchingRoutes, safeDiagnostics),\n );\n } else {\n console.warn(\n `${PREFIX} No registered handler for topic \"${topicName}\".\\n` +\n `Ensure vercel.json has a matching experimentalTriggers entry and ` +\n `the route file calls handleCallback().`,\n );\n }\n return;\n }\n\n const consumerGroups = handlers.map((h) => h.consumerGroup);\n console.log(\n `${PREFIX} Invoking handlers for topic=\"${topicName}\" messageId=\"${messageId}\" → consumers: [${consumerGroups.join(\", \")}]`,\n );\n\n const effectiveRetention = retentionSeconds ?? DEFAULT_RETENTION_S;\n\n for (const entry of handlers) {\n let capturedPayload: unknown;\n let capturedCreatedAt: Date = new Date();\n let capturedDeliveryCount = 1;\n let handlerSucceeded = true;\n let retryAfterS: number | null = null;\n let retryAcknowledged = false;\n\n const wrappedHandler: MessageHandler = async (message, metadata) => {\n capturedPayload = message;\n capturedCreatedAt = metadata.createdAt;\n capturedDeliveryCount = metadata.deliveryCount;\n try {\n await entry.handler(message, metadata);\n } catch (error) {\n handlerSucceeded = false;\n throw error;\n }\n };\n\n // wrappedRetry observes the user's retry directive for local re-delivery\n // scheduling, then passes it through unchanged to processMessage. This\n // means processMessage will still call changeVisibility on the server,\n // creating dual scheduling (server + local setTimeout). This is safe:\n //\n // - The server-side reschedule makes the message visible after N seconds,\n // but no code path in dev mode polls for visible messages. There is no\n // polling loop, no webhook endpoint, no receive() call. The only thing\n // that re-invokes the handler is the local setTimeout.\n //\n // - Deployed consumers cannot claim it either: dev mode omits\n // deploymentId from all API calls (api-client.ts getSendDeploymentId /\n // getConsumeDeploymentId return undefined when isDevMode()), so the\n // receipt handle is not routable to any deployment.\n //\n // - We intentionally keep the server-side changeVisibility call rather\n // than suppressing it (e.g. by returning { acknowledge: true }) because\n // it keeps server-side observability truthful: the message shows as\n // \"pending retry\", not \"successfully processed\".\n //\n // Known limitation: two local dev processes sharing the same project\n // credentials could theoretically both claim the same message. This is\n // an unsupported configuration.\n const wrappedRetry: RetryHandler | undefined = entry.options?.retry\n ? (error, metadata) => {\n const directive = entry.options!.retry!(error, metadata);\n if (directive && \"afterSeconds\" in directive) {\n retryAfterS = directive.afterSeconds;\n } else if (directive && \"acknowledge\" in directive) {\n retryAcknowledged = true;\n }\n return directive;\n }\n : undefined;\n\n const request = {\n queueName: topicName,\n consumerGroup: entry.consumerGroup,\n messageId,\n region,\n };\n\n const callbackOptions: HandleCallbackOptions = {\n client: entry.client,\n visibilityTimeoutSeconds: entry.options?.visibilityTimeoutSeconds,\n retry: wrappedRetry,\n };\n\n const consumerDefaultDelay = Math.min(\n findRetryAfterSeconds(topicName, entry.consumerGroup) ??\n DEV_REDELIVERY_DEFAULT_DELAY_S,\n DEV_REDELIVERY_MAX_DELAY_S,\n );\n\n const buildRedeliveryCtx = (): DevRedeliveryContext => ({\n handler: entry.handler,\n retry: entry.options?.retry,\n payload: capturedPayload,\n topicName,\n consumerGroup: entry.consumerGroup,\n messageId,\n region,\n createdAt: capturedCreatedAt,\n retentionSeconds: effectiveRetention,\n deliveryCount: capturedDeliveryCount,\n defaultRetryDelayS: consumerDefaultDelay,\n });\n\n try {\n await invokeWithRetry(wrappedHandler, request, callbackOptions);\n\n if (handlerSucceeded) {\n console.log(\n `${PREFIX} ${OK} Message processed: topic=\"${topicName}\" consumer=\"${entry.consumerGroup}\" messageId=\"${messageId}\"`,\n );\n } else if (retryAcknowledged) {\n console.log(\n `${PREFIX} ${OK} Message acknowledged (will not retry): topic=\"${topicName}\" consumer=\"${entry.consumerGroup}\" messageId=\"${messageId}\"`,\n );\n } else if (retryAfterS !== null) {\n const devDelay = Math.min(retryAfterS, DEV_REDELIVERY_MAX_DELAY_S);\n scheduleDevRedelivery(buildRedeliveryCtx(), devDelay);\n }\n } catch (error) {\n console.error(\n `${PREFIX} ${FAIL} Handler failed: topic=\"${topicName}\" consumer=\"${entry.consumerGroup}\" messageId=\"${messageId}\"`,\n error,\n );\n if (!handlerSucceeded) {\n scheduleDevRedelivery(buildRedeliveryCtx(), consumerDefaultDelay);\n }\n }\n }\n })();\n}\n\n// ---------------------------------------------------------------------------\n// Test helpers\n// ---------------------------------------------------------------------------\n\nfunction clearDevState(): void {\n const g = globalThis as typeof globalThis & {\n [ROUTE_MAPPINGS_KEY]?: DevRouteMapping[] | null;\n [HANDLER_REGISTRY_KEY]?: HandlerRegistry;\n };\n delete g[ROUTE_MAPPINGS_KEY];\n delete g[HANDLER_REGISTRY_KEY];\n}\n\nif (process.env.NODE_ENV === \"test\" || process.env.VITEST) {\n (globalThis as Record<string, unknown>).__clearDevState = clearDevState;\n (globalThis as Record<string, unknown>).__filePathToConsumerGroup =\n filePathToConsumerGroup;\n (globalThis as Record<string, unknown>).__filePathToUrlPath =\n filePathToUrlPath;\n (globalThis as Record<string, unknown>).__matchesFunctionsPattern =\n matchesFunctionsPattern;\n (globalThis as Record<string, unknown>).__stripSrcPrefix = stripSrcPrefix;\n}\n","/**\n * Vercel Queue Service client types\n */\nimport type { Transport } from \"./transports\";\n\n// Re-export transport interface for convenience\nexport type { Transport };\n\n/**\n * Vercel region code. The 20 known codes match\n * {@link https://dcs.vercel-infra.com/ | dcs.vercel-infra.com}.\n * Arbitrary strings are also accepted for forward compatibility\n * with regions added after this SDK version.\n */\nexport type VercelRegion =\n | \"arn1\"\n | \"bom1\"\n | \"cdg1\"\n | \"cle1\"\n | \"cpt1\"\n | \"dub1\"\n | \"dxb1\"\n | \"fra1\"\n | \"gru1\"\n | \"hkg1\"\n | \"hnd1\"\n | \"iad1\"\n | \"icn1\"\n | \"kix1\"\n | \"lhr1\"\n | \"pdx1\"\n | \"sfo1\"\n | \"sin1\"\n | \"syd1\"\n | \"yul1\"\n | (string & {});\n\n/**\n * Resolves a region code to a base {@link URL} for the Vercel Queue Service API.\n *\n * The SDK appends its own API path (`/api/v3/…`) to the returned URL.\n * To add a prefix (e.g. when routing through a reverse proxy), include it\n * in the pathname of the returned URL:\n *\n * ```ts\n * // Default — domain only, no prefix:\n * (region) => new URL(`https://${region}.vercel-queue.com`)\n *\n * // Custom domain with a base path:\n * (region) => new URL(`https://my-proxy.example/custom-prefix`)\n * // → requests go to https://my-proxy.example/custom-prefix/api/v3/…\n * ```\n *\n * Default: `` (region) => new URL(`https://${region}.vercel-queue.com`) ``\n */\nexport type BaseUrlResolver = (region: string) => URL;\n\nexport interface QueueClientOptions {\n /**\n * Vercel region code for API routing.\n *\n * Requests are sent to the regional endpoint resolved by\n * {@link BaseUrlResolver} (default: `https://${region}.vercel-queue.com`).\n *\n * When omitted, the region is auto-detected from the `VERCEL_REGION`\n * environment variable (set automatically on Vercel). If not available,\n * defaults to `\"iad1\"` with a console warning.\n *\n * @example\n * ```ts\n * new QueueClient() // auto-detect, falls back to \"iad1\"\n * new QueueClient({ region: \"iad1\" }) // explicit\n * ```\n */\n region?: VercelRegion;\n\n /**\n * Custom resolver that maps a region code to a base {@link URL}.\n *\n * The SDK always appends its own API path (`/api/v3/…`) to the returned URL.\n * Include a pathname to add a prefix (e.g. for reverse-proxy routing):\n *\n * ```ts\n * resolveBaseUrl: (region) => new URL(`https://my-proxy.example/prefix`)\n * ```\n *\n * @default (region) => new URL(`https://${region}.vercel-queue.com`)\n */\n resolveBaseUrl?: BaseUrlResolver;\n\n /**\n * Authentication token for the Vercel Queue Service API.\n * If not provided, the client will attempt to get a token via OIDC\n * when running in a Vercel Function environment.\n */\n token?: string;\n\n /**\n * Custom headers to include in all requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Deployment ID for message routing and lease validation.\n *\n * - `undefined` (default): auto-detect from `VERCEL_DEPLOYMENT_ID` env var;\n * sent messages are pinned to this deployment.\n * - `null`: explicitly unpinned — no deployment ID is sent on any request.\n * - `\"dpl_xxx\"`: explicit value used for both send pinning and consume identification.\n *\n * Ignored in development mode (deployment ID is never sent locally).\n */\n deploymentId?: string | null;\n\n /**\n * Serializer/deserializer for message payloads.\n * Used for all send and receive operations.\n * @default JsonTransport\n */\n transport?: Transport;\n\n /**\n * Custom HTTP dispatcher passed to every `fetch()` call.\n *\n * Use this to plug in an undici `RetryAgent` or `Agent` for automatic\n * retries on transient network errors (ECONNRESET, 429, 5xx) and\n * connection pooling.\n *\n * @example\n * ```ts\n * import { Agent, RetryAgent } from 'undici';\n *\n * const dispatcher = new RetryAgent(new Agent({ connections: 8 }), {\n * retryAfter: true,\n * });\n *\n * new QueueClient({ dispatcher });\n * ```\n */\n dispatcher?: unknown;\n}\n\n/**\n * Options for creating a {@link PollingQueueClient}.\n *\n * Identical to {@link QueueClientOptions} except `region` is **required**\n * because messages can only be received from the region they were sent to.\n * Using a fixed region (e.g. `\"iad1\"`) ensures that `send` and `receive`\n * target the same endpoint.\n */\nexport interface PollingQueueClientOptions extends QueueClientOptions {\n /**\n * Vercel region code for API routing — **required** for polling.\n *\n * Messages can only be received from the region they were sent to.\n * Use a fixed region (e.g. `\"iad1\"`) for both sending and receiving.\n *\n * @example\n * ```ts\n * new PollingQueueClient({ region: \"iad1\" })\n * ```\n */\n region: VercelRegion;\n}\n\n/**\n * Options for sending messages.\n */\nexport interface SendOptions {\n /**\n * Unique key to prevent duplicate message submissions.\n * Deduplication window: `min(message retention, 24 hours)`.\n */\n idempotencyKey?: string;\n\n /**\n * Message retention time in seconds. After this period, the message expires.\n * @default 86400 (24 hours)\n * @minimum 60 (1 minute)\n * @maximum 604800 (7 days)\n */\n retentionSeconds?: number;\n\n /**\n * Delay delivery of the message by this many seconds.\n * The message will not be visible to consumers until the delay has passed.\n * @default 0\n * @minimum 0\n * @maximum 432000 (5 days, and cannot exceed retentionSeconds)\n */\n delaySeconds?: number;\n\n /**\n * Custom headers to include with this message.\n * These headers are passed through to the VQS server.\n */\n headers?: Record<string, string>;\n}\n\nexport interface SendMessageOptions<T = unknown> extends SendOptions {\n /**\n * The topic/queue name to send the message to.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n queueName: string;\n\n /**\n * The message payload. Will be serialized using the provided transport.\n */\n payload: T;\n}\n\nexport interface SendMessageResponse {\n /**\n * The generated message ID\n */\n messageId: string;\n}\n\n/**\n * Result returned by `send()`.\n *\n * `messageId` is `null` when the server accepted the message for deferred\n * processing (e.g. during a server-side outage) and no ID is available yet.\n */\nexport interface SendResult {\n messageId: string | null;\n}\n\nexport interface Message<T = unknown> {\n /**\n * Unique message identifier. Used for receive-by-ID operations.\n */\n messageId: string;\n\n /**\n * The deserialized message payload.\n * Note: If using StreamTransport, ensure proper cleanup by calling\n * `transport.finalize(payload)` when done processing, especially in error cases.\n */\n payload: T;\n\n /**\n * Number of times this message has been delivered.\n * Starts at 1 for the first delivery, increments on each retry.\n */\n deliveryCount: number;\n\n /**\n * Timestamp when the message was created/published.\n */\n createdAt: Date;\n\n /**\n * Timestamp when the message expires.\n * Present in v2beta binary callback (`ce-vqsexpiresat` header) and\n * V3 multipart/NDJSON responses (`Vqs-Expires-At` header / `expiresAt` field).\n */\n expiresAt?: Date;\n\n /**\n * MIME type of the message content.\n * Set by the transport's `contentType` property during publish.\n */\n contentType: string;\n\n /**\n * Receipt handle (lease token) for this message delivery.\n * Required for acknowledge and visibility extension operations.\n * Valid only until the visibility timeout expires.\n */\n receiptHandle: string;\n}\n\nexport interface ReceiveMessagesOptions<T = unknown> {\n /**\n * The topic/queue name to receive messages from.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n queueName: string;\n\n /**\n * Consumer group name. Each consumer group maintains independent message state.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n consumerGroup: string;\n\n /**\n * Time in seconds that messages will be invisible to other consumers after receipt.\n * Set to 0 for immediate re-visibility (useful for peeking).\n * @default 30\n * @minimum 0\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Maximum number of messages to retrieve in a single request.\n * @default 1\n * @minimum 1\n * @maximum 10\n */\n limit?: number;\n}\n\nexport interface AcknowledgeMessageOptions {\n /**\n * The topic/queue name the message belongs to.\n */\n queueName: string;\n\n /**\n * Consumer group name.\n */\n consumerGroup: string;\n\n /**\n * Receipt handle received when the message was consumed.\n */\n receiptHandle: string;\n}\n\nexport interface AcknowledgeMessageResponse {\n /**\n * Whether the message was successfully acknowledged\n */\n acknowledged: boolean;\n}\n\nexport interface ChangeVisibilityOptions {\n /**\n * The topic/queue name the message belongs to.\n */\n queueName: string;\n\n /**\n * Consumer group name.\n */\n consumerGroup: string;\n\n /**\n * Receipt handle received when the message was consumed.\n */\n receiptHandle: string;\n\n /**\n * New visibility timeout in seconds.\n * Cannot extend beyond the message's original expiration time.\n * @minimum 0\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds: number;\n}\n\nexport interface ChangeVisibilityResponse {\n /**\n * Whether the visibility was successfully updated\n */\n success: boolean;\n}\n\n/**\n * Message metadata provided to handlers\n */\nexport interface MessageMetadata {\n messageId: string;\n deliveryCount: number;\n createdAt: Date;\n expiresAt: Date;\n topicName: string;\n consumerGroup: string;\n /** Vercel region the client is targeting. */\n region: string;\n}\n\n/**\n * Instruction returned by a {@link RetryHandler} to control what happens\n * to a message when the handler throws.\n *\n * - `{ afterSeconds: N }` — reschedule the message for redelivery after N seconds\n * - `{ acknowledge: true }` — acknowledge the message so it is never retried\n */\nexport type RetryDirective = { afterSeconds: number } | { acknowledge: true };\n\n/**\n * Called when the message handler throws an error.\n * Return a {@link RetryDirective} to reschedule or acknowledge the message,\n * or return `undefined` to let the error propagate normally.\n */\nexport type RetryHandler = (\n error: unknown,\n metadata: MessageMetadata,\n) => RetryDirective | void | undefined;\n\n/**\n * Message handler function type.\n *\n * Called once per message with the deserialized payload and metadata.\n * Not called when the queue is empty — check the return value of `receive()` instead.\n */\nexport type MessageHandler<T = unknown> = (\n message: T,\n metadata: MessageMetadata,\n) => Promise<void> | void;\n\n/**\n * Result returned by `receive()`. Use `ok` to check if messages were processed.\n *\n * @example\n * ```typescript\n * const result = await receive(\"topic\", \"group\", handler);\n * if (result.ok) {\n * // Messages were processed successfully\n * } else if (result.reason === \"empty\") {\n * // Queue had no messages available\n * }\n * ```\n */\nexport type ReceiveResult =\n | { ok: true }\n | { ok: false; reason: \"empty\" }\n | { ok: false; reason: \"not_found\"; messageId: string }\n | { ok: false; reason: \"not_available\"; messageId: string }\n | { ok: false; reason: \"already_processed\"; messageId: string };\n\n/**\n * Options for receiving a specific message by ID.\n */\nexport interface ReceiveByIdOptions {\n /** The specific message ID to consume */\n messageId: string;\n\n /**\n * Message lock duration in seconds.\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for receiving messages from the queue with an optional batch limit.\n */\nexport interface ReceiveBatchOptions {\n /**\n * Maximum number of messages to retrieve in a single request.\n * @default 1\n * @minimum 1\n * @maximum 10\n */\n limit?: number;\n\n /**\n * Message lock duration in seconds.\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for the receive method. Either receive by message ID or receive\n * from the queue with an optional limit. These options are mutually exclusive.\n */\nexport type ReceiveOptions = ReceiveByIdOptions | ReceiveBatchOptions;\n\n/**\n * Options for creating a ConsumerGroup instance.\n */\nexport interface ConsumerGroupOptions<T = unknown> {\n /**\n * Time in seconds that messages will be invisible to other consumers after receipt.\n * The ConsumerGroup will automatically extend this timeout during processing.\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n}\n\nexport interface ReceiveMessageByIdOptions<T = unknown> {\n /**\n * The topic/queue name to receive the message from.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n queueName: string;\n\n /**\n * Consumer group name.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n consumerGroup: string;\n\n /**\n * The specific message ID to retrieve.\n */\n messageId: string;\n\n /**\n * Time in seconds that the message will be invisible to other consumers after receipt.\n * @default 30\n * @minimum 0\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n}\n\nexport interface ReceiveMessageByIdResponse<T = unknown> {\n message: Message<T>;\n}\n\n/**\n * Error thrown when a message does not exist or has expired.\n */\nexport class MessageNotFoundError extends Error {\n constructor(messageId: string) {\n super(`Message ${messageId} not found`);\n this.name = \"MessageNotFoundError\";\n }\n}\n\n/**\n * Error thrown when a message exists but cannot be processed.\n * This can happen when the message is in the wrong state or already claimed by another consumer.\n */\nexport class MessageNotAvailableError extends Error {\n constructor(messageId: string, reason?: string) {\n super(\n `Message ${messageId} not available for processing${reason ? `: ${reason}` : \"\"}`,\n );\n this.name = \"MessageNotAvailableError\";\n }\n}\n\n/**\n * Error thrown when message data is corrupted or can't be parsed\n */\nexport class MessageCorruptedError extends Error {\n constructor(messageId: string, reason: string) {\n super(`Message ${messageId} is corrupted: ${reason}`);\n this.name = \"MessageCorruptedError\";\n }\n}\n\n/**\n * Error thrown when there are no messages available in the queue.\n */\nexport class QueueEmptyError extends Error {\n constructor(queueName: string, consumerGroup: string) {\n super(\n `No messages available in queue \"${queueName}\" for consumer group \"${consumerGroup}\"`,\n );\n this.name = \"QueueEmptyError\";\n }\n}\n\n/**\n * Error thrown when a message is temporarily locked by another consumer.\n * The message is currently being processed and cannot be claimed.\n */\nexport class MessageLockedError extends Error {\n /** Suggested retry delay in seconds, if provided by the server. */\n public readonly retryAfter?: number;\n\n constructor(messageId: string, retryAfter?: number) {\n const retryMessage = retryAfter\n ? ` Retry after ${retryAfter} seconds.`\n : \" Try again later.\";\n super(`Message ${messageId} is temporarily locked.${retryMessage}`);\n this.name = \"MessageLockedError\";\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error thrown when authentication fails.\n * This typically means the token is missing, invalid, or expired.\n */\nexport class UnauthorizedError extends Error {\n constructor(message: string = \"Missing or invalid authentication token\") {\n super(message);\n this.name = \"UnauthorizedError\";\n }\n}\n\n/**\n * Error thrown when access is forbidden.\n * This typically means the queue belongs to a different environment or project.\n */\nexport class ForbiddenError extends Error {\n constructor(\n message: string = \"Queue environment doesn't match token environment\",\n ) {\n super(message);\n this.name = \"ForbiddenError\";\n }\n}\n\n/**\n * Error thrown when request parameters are invalid.\n */\nexport class BadRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BadRequestError\";\n }\n}\n\n/**\n * Error thrown when the server encounters an unexpected error.\n */\nexport class InternalServerError extends Error {\n constructor(message: string = \"Unexpected server error\") {\n super(message);\n this.name = \"InternalServerError\";\n }\n}\n\n/**\n * Error thrown when the batch limit parameter is outside the valid range.\n * The limit must be between 1 and 10 (inclusive).\n */\nexport class InvalidLimitError extends Error {\n constructor(limit: number, min: number = 1, max: number = 10) {\n super(`Invalid limit: ${limit}. Limit must be between ${min} and ${max}.`);\n this.name = \"InvalidLimitError\";\n }\n}\n\n/**\n * Error thrown when attempting to process a message that has already been successfully processed.\n */\nexport class MessageAlreadyProcessedError extends Error {\n constructor(messageId: string) {\n super(`Message ${messageId} has already been processed`);\n this.name = \"MessageAlreadyProcessedError\";\n }\n}\n\n/**\n * Error thrown when a duplicate idempotency key is detected.\n * The message was already sent within the deduplication window.\n */\nexport class DuplicateMessageError extends Error {\n public readonly idempotencyKey?: string;\n\n constructor(message: string, idempotencyKey?: string) {\n super(message);\n this.name = \"DuplicateMessageError\";\n this.idempotencyKey = idempotencyKey;\n }\n}\n\n/**\n * Error thrown when consumer discovery fails.\n * This typically means the deployment could not be reached or is not configured correctly.\n */\nexport class ConsumerDiscoveryError extends Error {\n public readonly deploymentId?: string;\n\n constructor(message: string, deploymentId?: string) {\n super(message);\n this.name = \"ConsumerDiscoveryError\";\n this.deploymentId = deploymentId;\n }\n}\n\n/**\n * Error thrown when the consumer registry is not configured for the project.\n */\nexport class ConsumerRegistryNotConfiguredError extends Error {\n constructor(message: string = \"Consumer registry not configured\") {\n super(message);\n this.name = \"ConsumerRegistryNotConfiguredError\";\n }\n}\n","import { ApiClient } from \"./api-client\";\nimport type {\n ConsumerGroupOptions,\n Message,\n MessageHandler,\n MessageMetadata,\n RetryDirective,\n RetryHandler,\n} from \"./types\";\nimport {\n BadRequestError,\n ForbiddenError,\n MessageNotAvailableError,\n MessageNotFoundError,\n UnauthorizedError,\n} from \"./types\";\n\n/**\n * Default visibility timeout in seconds (5 minutes).\n * This is the initial lock duration requested when receiving messages.\n */\nconst DEFAULT_VISIBILITY_TIMEOUT_SECONDS = 300;\n\n/**\n * Minimum visibility timeout in seconds.\n * Ensures auto-extension has enough time to renew before the lease expires.\n */\nconst MIN_VISIBILITY_TIMEOUT_SECONDS = 30;\n\n/**\n * Maximum renewal interval in seconds.\n * Even for very long visibility timeouts, we renew at least this often.\n */\nconst MAX_RENEWAL_INTERVAL_SECONDS = 60;\n\n/**\n * Minimum renewal interval in seconds.\n * Even for very short visibility timeouts, we don't renew more frequently than this.\n */\nconst MIN_RENEWAL_INTERVAL_SECONDS = 10;\n\n/**\n * Interval in milliseconds between retry attempts when extension fails.\n * On transient failures, retry every 3 seconds.\n */\nconst RETRY_INTERVAL_MS = 3000;\n\n/**\n * Calculate the renewal interval based on visibility timeout.\n * Formula: min(60, max(10, visibilityTimeout / 5))\n *\n * Examples:\n * - 300s visibility → 60s interval (300/5 = 60, capped at 60)\n * - 200s visibility → 40s interval (200/5 = 40)\n * - 100s visibility → 20s interval (100/5 = 20)\n * - 30s visibility → 10s interval (30/5 = 6, floored at 10)\n */\nfunction calculateRenewalInterval(visibilityTimeoutSeconds: number): number {\n return Math.min(\n MAX_RENEWAL_INTERVAL_SECONDS,\n Math.max(MIN_RENEWAL_INTERVAL_SECONDS, visibilityTimeoutSeconds / 5),\n );\n}\n\n/**\n * Options for consuming a specific message by ID.\n */\nexport interface ConsumeByIdOptions {\n /** The specific message ID to consume */\n messageId: string;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for consuming messages from the queue.\n */\nexport interface ConsumeBatchOptions {\n /**\n * Maximum number of messages to retrieve in a single request.\n * @default 1\n * @minimum 1\n * @maximum 10\n */\n limit?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for the consume method. Either consume by message ID or consume\n * from the queue with an optional limit. These options are mutually exclusive.\n */\nexport type ConsumeOptions = ConsumeByIdOptions | ConsumeBatchOptions;\n\n/**\n * A ConsumerGroup processes messages from a topic with automatic lifecycle management.\n *\n * Features:\n * - Independent message state per group (each group receives a copy of every message)\n * - Automatic visibility timeout extension during processing\n * - Automatic message deletion on successful handler completion\n */\nexport class ConsumerGroup<T = unknown> {\n private client: ApiClient;\n private topicName: string;\n private consumerGroupName: string;\n private visibilityTimeout: number;\n\n /**\n * Create a new ConsumerGroup instance.\n *\n * @param client - ApiClient instance to use for API calls (transport is configured on the client)\n * @param topicName - Name of the topic to consume from (pattern: `[A-Za-z0-9_-]+`)\n * @param consumerGroupName - Name of the consumer group (pattern: `[A-Za-z0-9_-]+`)\n * @param options - Optional configuration\n * @param options.visibilityTimeoutSeconds - Message lock duration (default: 300, max: 3600)\n */\n constructor(\n client: ApiClient,\n topicName: string,\n consumerGroupName: string,\n options: ConsumerGroupOptions<T> = {},\n ) {\n this.client = client;\n this.topicName = topicName;\n this.consumerGroupName = consumerGroupName;\n this.visibilityTimeout = Math.max(\n MIN_VISIBILITY_TIMEOUT_SECONDS,\n options.visibilityTimeoutSeconds ?? DEFAULT_VISIBILITY_TIMEOUT_SECONDS,\n );\n }\n\n /**\n * Check if an error is a 4xx client error that should stop retries.\n * 4xx errors indicate the request is fundamentally invalid and retrying won't help.\n * - 409: Ticket mismatch (lost ownership to another consumer)\n * - 404: Message/receipt handle not found\n * - 400, 401, 403: Other client errors\n */\n private isClientError(error: unknown): boolean {\n return (\n error instanceof MessageNotAvailableError || // 409 - ticket mismatch, lost ownership\n error instanceof MessageNotFoundError || // 404 - receipt handle not found\n error instanceof BadRequestError || // 400 - invalid parameters\n error instanceof UnauthorizedError || // 401 - auth failed\n error instanceof ForbiddenError // 403 - access denied\n );\n }\n\n /**\n * Starts a background loop that periodically extends the visibility timeout for a message.\n *\n * Timing strategy:\n * - Renewal interval: min(60s, max(10s, visibilityTimeout/5))\n * - Extensions request the same duration as the initial visibility timeout\n * - When `visibilityDeadline` is provided (binary mode small body), the first\n * extension delay is calculated from the time remaining until the deadline\n * using the same renewal formula, ensuring the first extension fires before\n * the server-assigned lease expires. Subsequent renewals use the standard interval.\n *\n * Retry strategy:\n * - On transient failures (5xx, network errors): retry every 3 seconds\n * - On 4xx client errors: stop retrying (the lease is lost or invalid)\n *\n * @param receiptHandle - The receipt handle to extend visibility for\n * @param options - Optional configuration\n * @param options.visibilityDeadline - Absolute deadline (from server's `ce-vqsvisibilitydeadline`)\n * when the current visibility timeout expires. Used to calculate the first extension delay.\n */\n private startVisibilityExtension(\n receiptHandle: string,\n options?: { visibilityDeadline?: Date },\n ): (waitForCompletion?: boolean) => Promise<void> {\n let isRunning = true;\n let isResolved = false;\n let resolveLifecycle: () => void;\n let timeoutId: NodeJS.Timeout | null = null;\n\n const renewalIntervalMs =\n calculateRenewalInterval(this.visibilityTimeout) * 1000;\n\n let firstDelayMs = renewalIntervalMs;\n if (options?.visibilityDeadline) {\n const timeRemainingMs = options.visibilityDeadline.getTime() - Date.now();\n if (timeRemainingMs > 0) {\n const timeRemainingSeconds = timeRemainingMs / 1000;\n firstDelayMs = calculateRenewalInterval(timeRemainingSeconds) * 1000;\n } else {\n firstDelayMs = 0;\n }\n }\n\n // Promise that tracks the actual termination of the extension loop\n const lifecyclePromise = new Promise<void>((resolve) => {\n resolveLifecycle = resolve;\n });\n\n const safeResolve = () => {\n if (!isResolved) {\n isResolved = true;\n resolveLifecycle();\n }\n };\n\n const extend = async (): Promise<void> => {\n // Check if we should stop before attempting extension\n if (!isRunning) {\n safeResolve();\n return;\n }\n\n try {\n await this.client.changeVisibility({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle,\n visibilityTimeoutSeconds: this.visibilityTimeout,\n });\n\n // Successfully extended - schedule next extension\n if (isRunning) {\n timeoutId = setTimeout(() => extend(), renewalIntervalMs);\n } else {\n safeResolve();\n }\n } catch (error) {\n // Check if this is a 4xx client error - stop retrying\n if (this.isClientError(error)) {\n console.error(\n `Visibility extension failed with client error for receipt handle ${receiptHandle} (stopping retries):`,\n error,\n );\n safeResolve();\n return;\n }\n\n // Transient error - log and schedule retry\n console.error(\n `Failed to extend visibility for receipt handle ${receiptHandle} (will retry in ${RETRY_INTERVAL_MS / 1000}s):`,\n error,\n );\n\n // Retry after RETRY_INTERVAL_MS if still running\n if (isRunning) {\n timeoutId = setTimeout(() => extend(), RETRY_INTERVAL_MS);\n } else {\n safeResolve();\n }\n }\n };\n\n timeoutId = setTimeout(() => extend(), firstDelayMs);\n\n // Return a function to stop the extension loop\n return async (waitForCompletion: boolean = false) => {\n // Signal the loop to stop\n isRunning = false;\n\n // Cancel any pending timeout to avoid unnecessary waiting\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n // Only wait for in-flight operations if explicitly requested\n if (waitForCompletion) {\n // Wait for the loop to actually terminate\n // This ensures any in-progress extension completes or fails\n await lifecyclePromise;\n } else {\n safeResolve();\n }\n };\n }\n\n /**\n * Clean up the message payload if the transport supports it and payload exists.\n */\n private async finalizePayload<TPayload>(payload: TPayload): Promise<void> {\n const transport = this.client.getTransport();\n if (transport.finalize && payload !== undefined && payload !== null) {\n try {\n await transport.finalize(payload);\n } catch (finalizeError) {\n console.warn(\"Failed to finalize message payload:\", finalizeError);\n }\n }\n }\n\n private async processMessage<TPayload>(\n message: Message<TPayload>,\n handler: MessageHandler<TPayload>,\n options?: { visibilityDeadline?: Date; retry?: RetryHandler },\n ): Promise<void> {\n const stopExtension = this.startVisibilityExtension(\n message.receiptHandle,\n options,\n );\n\n const DEFAULT_RETENTION_MS = 86_400_000; // 24 hours\n const metadata: MessageMetadata = {\n messageId: message.messageId,\n deliveryCount: message.deliveryCount,\n createdAt: message.createdAt,\n expiresAt:\n message.expiresAt ??\n new Date(message.createdAt.getTime() + DEFAULT_RETENTION_MS),\n topicName: this.topicName,\n consumerGroup: this.consumerGroupName,\n region: this.client.getRegion(),\n };\n\n try {\n await handler(message.payload, metadata);\n // Stop extensions immediately - we don't need to wait for in-flight extensions\n // since we're about to acknowledge the message anyway\n await stopExtension();\n\n await this.client.acknowledgeMessage({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle: message.receiptHandle,\n });\n } catch (error) {\n // Stop extensions immediately on error - fail fast without waiting\n // for any in-flight extension attempts\n await stopExtension();\n\n // If a retry handler is configured, give it a chance to reschedule or acknowledge\n if (options?.retry) {\n let directive: RetryDirective | void | undefined;\n try {\n directive = options.retry(error, metadata);\n } catch (retryError) {\n console.warn(\"retry handler threw:\", retryError);\n }\n\n if (directive) {\n if (\"acknowledge\" in directive && directive.acknowledge) {\n // Acknowledge the message so it is never retried\n try {\n await this.client.acknowledgeMessage({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle: message.receiptHandle,\n });\n } catch (ackError) {\n console.warn(\"Failed to acknowledge message:\", ackError);\n }\n\n await this.finalizePayload(message.payload);\n return;\n }\n\n if (\n \"afterSeconds\" in directive &&\n typeof directive.afterSeconds === \"number\"\n ) {\n try {\n await this.client.changeVisibility({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle: message.receiptHandle,\n visibilityTimeoutSeconds: directive.afterSeconds,\n });\n } catch (changeError) {\n console.warn(\n \"Failed to reschedule message for retry:\",\n changeError,\n );\n }\n\n await this.finalizePayload(message.payload);\n return;\n }\n }\n }\n\n await this.finalizePayload(message.payload);\n throw error;\n }\n }\n\n /**\n * Process a pre-fetched message directly, without calling `receiveMessageById`.\n *\n * Used by the binary mode (v2beta) small body fast path, where the server\n * pushes the full message payload in the callback request. The message is\n * processed with the same lifecycle guarantees as `consume()`:\n * - Visibility timeout is extended periodically during processing\n * - Message is acknowledged on successful handler completion\n * - Payload is finalized on error if the transport supports it\n *\n * @param handler - Function to process the message payload and metadata\n * @param message - The complete message including payload and receipt handle\n * @param options - Optional configuration\n * @param options.visibilityDeadline - Absolute deadline when the server-assigned\n * visibility timeout expires (from `ce-vqsvisibilitydeadline`). Used to\n * schedule the first visibility extension before the lease expires.\n */\n async consumeMessage(\n handler: MessageHandler<T>,\n message: Message<T>,\n options?: { visibilityDeadline?: Date; retry?: RetryHandler },\n ): Promise<void> {\n await this.processMessage(message, handler, options);\n }\n\n /**\n * Consume the next available message from the queue.\n *\n * The message is automatically:\n * - Locked with the configured visibility timeout\n * - Kept alive via periodic visibility extensions during processing\n * - Acknowledged upon successful handler completion\n * - Released for retry if the handler throws an error\n *\n * @param handler - Function to process the message payload and metadata.\n * Not called when the queue is empty.\n * @returns Number of messages processed (0 if queue was empty)\n * @throws Handler errors are re-thrown after cleanup\n */\n async consume(handler: MessageHandler<T>): Promise<number>;\n\n /**\n * Consume a specific message by its ID.\n *\n * Used for targeted message processing, typically from webhook callbacks.\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Options containing the messageId to consume\n * @param options.messageId - Specific message ID to consume\n * @returns Number of messages processed (always 1 on success)\n * @throws {MessageNotFoundError} When message doesn't exist\n * @throws {MessageNotAvailableError} When message in wrong state\n * @throws {MessageAlreadyProcessedError} When already processed\n * @throws Handler errors are re-thrown after cleanup\n */\n async consume(\n handler: MessageHandler<T>,\n options: ConsumeByIdOptions,\n ): Promise<number>;\n\n /**\n * Consume messages from the queue with an optional batch limit.\n *\n * Fetches up to `limit` messages in a single request and processes them\n * sequentially with the provided handler.\n *\n * @param handler - Function to process each message payload and metadata.\n * Not called when the queue is empty.\n * @param options - Options containing the limit\n * @param options.limit - Maximum messages to retrieve (default: 1, min: 1, max: 10)\n * @returns Number of messages processed (0 if queue was empty)\n * @throws Handler errors are re-thrown after cleanup\n */\n async consume(\n handler: MessageHandler<T>,\n options: ConsumeBatchOptions,\n ): Promise<number>;\n\n async consume(\n handler: MessageHandler<T>,\n options?: ConsumeOptions,\n ): Promise<number> {\n const retry = options?.retry;\n\n if (options && \"messageId\" in options) {\n const response = await this.client.receiveMessageById<T>({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n messageId: options.messageId,\n visibilityTimeoutSeconds: this.visibilityTimeout,\n });\n await this.processMessage<T>(response.message, handler, { retry });\n return 1;\n } else {\n const limit = options && \"limit\" in options ? options.limit : 1;\n let messagesProcessed = 0;\n\n for await (const message of this.client.receiveMessages<T>({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n visibilityTimeoutSeconds: this.visibilityTimeout,\n limit,\n })) {\n messagesProcessed++;\n await this.processMessage<T>(message, handler, { retry });\n }\n\n return messagesProcessed;\n }\n }\n\n /**\n * Get the consumer group name\n */\n get name(): string {\n return this.consumerGroupName;\n }\n\n /**\n * Get the topic name this consumer group is subscribed to\n */\n get topic(): string {\n return this.topicName;\n }\n}\n","import { ApiClient } from \"./api-client\";\nimport { ConsumerGroup } from \"./consumer-group\";\nimport type { ConsumerGroupOptions, SendOptions, SendResult } from \"./types\";\nimport { isDevMode, invokeDevHandlers } from \"./dev\";\n\n/**\n * A Topic represents a named channel for publishing messages in a pub/sub pattern\n */\nexport class Topic<T = unknown> {\n private client: ApiClient;\n private topicName: string;\n\n /**\n * @param client ApiClient instance to use for API calls\n * @param topicName Name of the topic to work with\n */\n constructor(client: ApiClient, topicName: string) {\n this.client = client;\n this.topicName = topicName;\n }\n\n /**\n * Publish a message to the topic\n * @param payload The data to publish\n * @param options Optional publish options\n * @returns `{ messageId }` — `messageId` is `null` when deferred\n * @throws {BadRequestError} When request parameters are invalid\n * @throws {UnauthorizedError} When authentication fails\n * @throws {ForbiddenError} When access is denied (environment mismatch)\n * @throws {InternalServerError} When server encounters an error\n */\n async publish(payload: T, options?: SendOptions): Promise<SendResult> {\n const result = await this.client.sendMessage<T>({\n queueName: this.topicName,\n payload,\n idempotencyKey: options?.idempotencyKey,\n retentionSeconds: options?.retentionSeconds,\n delaySeconds: options?.delaySeconds,\n headers: options?.headers,\n });\n\n // In development mode, automatically trigger registered callbacks after 1s\n if (result.messageId && isDevMode()) {\n invokeDevHandlers(\n this.topicName,\n result.messageId,\n this.client.getRegion(),\n options?.delaySeconds,\n options?.retentionSeconds,\n );\n }\n\n return { messageId: result.messageId };\n }\n\n /**\n * Create a consumer group for this topic\n * @param consumerGroupName Name of the consumer group\n * @param options Optional configuration for the consumer group\n * @returns A ConsumerGroup instance\n */\n consumerGroup<U = T>(\n consumerGroupName: string,\n options?: ConsumerGroupOptions<U>,\n ): ConsumerGroup<U> {\n return new ConsumerGroup<U>(\n this.client,\n this.topicName,\n consumerGroupName,\n options,\n );\n }\n\n /**\n * Get the topic name\n */\n get name(): string {\n return this.topicName;\n }\n}\n","/**\n * Core queue callback utilities for handling incoming webhook payloads\n * from Vercel triggers using the CloudEvent specification.\n *\n * This module provides the framework-agnostic core. For framework-specific\n * wrappers, see `@vercel/queue/web` and `@vercel/queue/nextjs/pages`.\n */\nimport { getApiClient, type QueueClient } from \"./client\";\nimport { Topic } from \"./topic\";\nimport type { Message, MessageHandler, RetryHandler } from \"./types\";\nimport type { Transport } from \"./transports\";\n\n/**\n * CloudEvent specification for queue callbacks.\n *\n * Incoming webhook payloads from Vercel follow the CloudEvents v1.0 spec\n * with queue-specific data fields.\n *\n * @see https://cloudevents.io/\n */\nexport interface CloudEvent<T = unknown> {\n /** Event type identifier, e.g. `\"com.vercel.queue.v1beta\"` (structured) or `\"com.vercel.queue.v2beta\"` (binary) */\n type: string;\n /** Event source URI, e.g. `\"/topic/my-topic/consumer/my-group\"` */\n source: string;\n /** Unique event identifier */\n id: string;\n /** MIME type of the `data` field */\n datacontenttype: string;\n /** Event payload containing queue message metadata */\n data: T;\n /** ISO 8601 timestamp of when the event was produced */\n time?: string;\n /** CloudEvents specification version */\n specversion?: string;\n}\n\n/**\n * Options for configuring `handleCallback` behavior.\n */\nexport interface HandleCallbackOptions {\n /**\n * QueueClient instance to use for processing messages.\n * If not provided, a default client is created with OIDC authentication\n * and JsonTransport.\n */\n client?: QueueClient;\n\n /**\n * Time in seconds that messages will be invisible to other consumers\n * during processing. The handler will automatically extend this timeout\n * while processing.\n *\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\nexport const CLOUD_EVENT_TYPE_V1BETA = \"com.vercel.queue.v1beta\";\nexport const CLOUD_EVENT_TYPE_V2BETA = \"com.vercel.queue.v2beta\";\n\n/**\n * Routing-only callback: the SDK must fetch the message by ID.\n * Produced by v1beta structured mode and v2beta large-body mode.\n */\nexport type ParsedCallbackV1 = {\n queueName: string;\n consumerGroup: string;\n messageId: string;\n region?: string;\n};\n\n/**\n * Full-message callback: payload and receipt handle are inlined,\n * so the SDK can process directly without an extra fetch.\n * Produced by v2beta small-body mode.\n */\nexport type ParsedCallbackV2 = {\n queueName: string;\n consumerGroup: string;\n messageId: string;\n region?: string;\n receiptHandle: string;\n deliveryCount?: number;\n createdAt?: string;\n expiresAt?: string;\n contentType?: string;\n visibilityDeadline?: string;\n rawBody?: ReadableStream<Uint8Array>;\n parsedPayload?: unknown;\n};\n\nexport type ParsedCallbackRequest = ParsedCallbackV1 | ParsedCallbackV2;\n\n/**\n * Check if a topic name matches a wildcard pattern.\n * Used by dev mode for route discovery from vercel.json.\n *\n * @param topicName - The topic name to test\n * @param pattern - A wildcard pattern ending with `*`\n * @returns `true` if topicName starts with the pattern prefix\n */\nexport function matchesWildcardPattern(\n topicName: string,\n pattern: string,\n): boolean {\n // Remove the trailing *\n const prefix = pattern.slice(0, -1);\n return topicName.startsWith(prefix);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * Parse and validate a v1beta structured CloudEvent body.\n *\n * @internal\n */\nfunction parseV1StructuredBody(\n body: unknown,\n contentType: string | null,\n): ParsedCallbackRequest {\n if (!contentType || !contentType.includes(\"application/cloudevents+json\")) {\n throw new Error(\n \"Invalid content type: expected 'application/cloudevents+json'\",\n );\n }\n\n if (\n !isRecord(body) ||\n !body.type ||\n !body.source ||\n !body.id ||\n !isRecord(body.data)\n ) {\n throw new Error(\"Invalid CloudEvent: missing required fields\");\n }\n\n if (body.type !== CLOUD_EVENT_TYPE_V1BETA) {\n throw new Error(\n `Invalid CloudEvent type: expected '${CLOUD_EVENT_TYPE_V1BETA}', got '${String(body.type)}'`,\n );\n }\n\n const { data } = body;\n const missingFields: string[] = [];\n if (!(\"queueName\" in data)) missingFields.push(\"queueName\");\n if (!(\"consumerGroup\" in data)) missingFields.push(\"consumerGroup\");\n if (!(\"messageId\" in data)) missingFields.push(\"messageId\");\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required CloudEvent data fields: ${missingFields.join(\", \")}`,\n );\n }\n\n return {\n queueName: String(data.queueName),\n consumerGroup: String(data.consumerGroup),\n messageId: String(data.messageId),\n };\n}\n\ntype HeaderSource = Headers | Record<string, string | string[] | undefined>;\n\nfunction getHeader(headers: HeaderSource, name: string): string | null {\n if (headers instanceof Headers) {\n return headers.get(name);\n }\n const value = headers[name];\n if (Array.isArray(value)) return value[0] ?? null;\n return (value as string) ?? null;\n}\n\nfunction parseBinaryHeaders(headers: HeaderSource): ParsedCallbackRequest {\n const ceType = getHeader(headers, \"ce-type\");\n if (ceType !== CLOUD_EVENT_TYPE_V2BETA) {\n throw new Error(\n `Invalid CloudEvent type: expected '${CLOUD_EVENT_TYPE_V2BETA}', got '${ceType}'`,\n );\n }\n\n const queueName = getHeader(headers, \"ce-vqsqueuename\");\n const consumerGroup = getHeader(headers, \"ce-vqsconsumergroup\");\n const messageId = getHeader(headers, \"ce-vqsmessageid\");\n\n const missingFields: string[] = [];\n if (!queueName) missingFields.push(\"ce-vqsqueuename\");\n if (!consumerGroup) missingFields.push(\"ce-vqsconsumergroup\");\n if (!messageId) missingFields.push(\"ce-vqsmessageid\");\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required CloudEvent headers: ${missingFields.join(\", \")}`,\n );\n }\n\n const region = getHeader(headers, \"ce-vqsregion\") ?? undefined;\n\n const base = {\n queueName: queueName!,\n consumerGroup: consumerGroup!,\n messageId: messageId!,\n region,\n };\n\n const receiptHandle = getHeader(headers, \"ce-vqsreceipthandle\");\n if (!receiptHandle) {\n return base;\n }\n\n const result: ParsedCallbackV2 = { ...base, receiptHandle };\n\n const deliveryCount = getHeader(headers, \"ce-vqsdeliverycount\");\n if (deliveryCount) {\n result.deliveryCount = parseInt(deliveryCount, 10);\n }\n\n const createdAt = getHeader(headers, \"ce-vqscreatedat\");\n if (createdAt) {\n result.createdAt = createdAt;\n }\n\n const expiresAt = getHeader(headers, \"ce-vqsexpiresat\");\n if (expiresAt) {\n result.expiresAt = expiresAt;\n }\n\n const contentType = getHeader(headers, \"content-type\");\n if (contentType) {\n result.contentType = contentType;\n }\n\n const visibilityDeadline = getHeader(headers, \"ce-vqsvisibilitydeadline\");\n if (visibilityDeadline) {\n result.visibilityDeadline = visibilityDeadline;\n }\n\n return result;\n}\n\n/**\n * Parse a callback from a pre-parsed body and headers.\n *\n * For frameworks like Next.js Pages Router where the body has already been\n * parsed, use this instead of {@link parseCallback}.\n *\n * Detects the CloudEvent version from the `ce-type` header:\n * - `com.vercel.queue.v2beta`: binary content mode (metadata in headers,\n * payload in body). For small messages, the body is attached as `parsedPayload`.\n * - Otherwise: structured content mode (v1beta, entire CloudEvent in JSON body)\n *\n * @param body - The framework-parsed request body. Type depends on Content-Type\n * and framework configuration:\n * - v1beta: parsed CloudEvent JSON object\n * - v2beta: the message payload as parsed by the framework (object, Buffer, or string)\n * @param headers - HTTP headers\n * @returns Parsed callback request with routing metadata and optional payload\n */\nexport function parseRawCallback(\n body: unknown,\n headers: Record<string, string | string[] | undefined>,\n): ParsedCallbackRequest {\n const ceType = getHeader(headers, \"ce-type\");\n\n if (ceType === CLOUD_EVENT_TYPE_V2BETA) {\n const result = parseBinaryHeaders(headers);\n if (\"receiptHandle\" in result) {\n result.parsedPayload = body;\n }\n return result;\n }\n\n return parseV1StructuredBody(body, getHeader(headers, \"content-type\"));\n}\n\n/**\n * Parse and validate a CloudEvent callback from a Web API `Request` object.\n *\n * Detects the CloudEvent version from the `ce-type` header:\n * - `com.vercel.queue.v2beta`: binary content mode (metadata in headers,\n * payload in body). For v2beta, the body is attached as `rawBody` (a\n * ReadableStream) rather than being parsed.\n * - Otherwise: structured content mode (v1beta, entire CloudEvent in JSON body)\n *\n * For frameworks that pre-parse the body (e.g. Next.js Pages Router),\n * use {@link parseRawCallback} instead.\n */\nexport async function parseCallback(\n request: Request,\n): Promise<ParsedCallbackRequest> {\n const ceType = request.headers.get(\"ce-type\");\n\n if (ceType === CLOUD_EVENT_TYPE_V2BETA) {\n const result = parseBinaryHeaders(request.headers);\n if (\"receiptHandle\" in result && request.body) {\n result.rawBody = request.body;\n }\n return result;\n }\n\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n throw new Error(\"Failed to parse CloudEvent from request body\");\n }\n\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return parseRawCallback(body, headers);\n}\n\n/**\n * Core queue callback handler. Processes the message using the provided handler.\n *\n * This is the framework-agnostic core — it takes already-parsed request data\n * and throws on errors. Framework-specific wrappers (in `@vercel/queue/web`\n * and `@vercel/queue/nextjs/pages`) compose around this function to handle\n * request parsing and response formatting.\n *\n * @param handler - Function to process the message payload and metadata\n * @param request - A {@link ParsedCallbackV1} (routing metadata only, message\n * fetched by ID) or {@link ParsedCallbackV2} (full message inlined, no fetch).\n * @param options - Optional configuration (client, visibilityTimeoutSeconds)\n * @throws {Error} If binary mode request has a receipt handle but no payload\n * @throws {Error} If message processing fails\n *\n * @example\n * ```typescript\n * import { handleCallback, parseRawCallback } from \"@vercel/queue\";\n *\n * const parsed = parseRawCallback(body, headers);\n * await handleCallback(async (message, metadata) => {\n * console.log(\"Processing:\", message);\n * }, parsed);\n * ```\n */\nexport async function handleCallback<T = unknown>(\n handler: MessageHandler<T>,\n request: ParsedCallbackRequest,\n options?: HandleCallbackOptions,\n): Promise<void> {\n const { queueName, consumerGroup, messageId } = request;\n\n if (!options?.client) {\n throw new Error(\"HandleCallbackOptions.client is required\");\n }\n let api = getApiClient(options.client);\n if (request.region) {\n api = api.withRegion(request.region);\n }\n const topic = new Topic<T>(api, queueName);\n const cg = topic.consumerGroup(\n consumerGroup,\n options?.visibilityTimeoutSeconds !== undefined\n ? { visibilityTimeoutSeconds: options.visibilityTimeoutSeconds }\n : undefined,\n );\n\n if (\"receiptHandle\" in request) {\n const transport = api.getTransport() as Transport<T>;\n\n let payload: T;\n if (request.rawBody) {\n payload = await transport.deserialize(request.rawBody);\n } else if (request.parsedPayload !== undefined) {\n payload = request.parsedPayload as T;\n } else {\n throw new Error(\n \"Binary mode callback with receipt handle is missing payload\",\n );\n }\n\n const message: Message<T> = {\n messageId,\n payload,\n deliveryCount: request.deliveryCount ?? 1,\n createdAt: request.createdAt ? new Date(request.createdAt) : new Date(),\n expiresAt: request.expiresAt ? new Date(request.expiresAt) : undefined,\n contentType: request.contentType ?? transport.contentType,\n receiptHandle: request.receiptHandle,\n };\n\n const visibilityDeadline = request.visibilityDeadline\n ? new Date(request.visibilityDeadline)\n : undefined;\n\n await cg.consumeMessage(handler, message, {\n visibilityDeadline,\n retry: options?.retry,\n });\n } else {\n await cg.consume(handler, { messageId, retry: options?.retry });\n }\n}\n","export { getVercelOidcToken } from \"@vercel/oidc\";\n","import { ApiClient } from \"./api-client\";\nimport {\n handleCallback as coreHandleCallback,\n parseCallback,\n parseRawCallback,\n} from \"./callback\";\nimport { isDevMode, invokeDevHandlers, registerDevHandler } from \"./dev\";\nimport { Topic } from \"./topic\";\nimport type {\n MessageHandler,\n PollingQueueClientOptions,\n QueueClientOptions,\n ReceiveBatchOptions,\n ReceiveOptions,\n ReceiveResult,\n RetryHandler,\n SendOptions,\n SendResult,\n VercelRegion,\n} from \"./types\";\nimport {\n MessageAlreadyProcessedError,\n MessageNotAvailableError,\n MessageNotFoundError,\n} from \"./types\";\n\nconst apiClients = new WeakMap<object, ApiClient>();\nconst API_CLIENT_KEY = Symbol.for(\"@vercel/queue.apiClient\");\ntype CallbackRequestInput = Request | { request: Request };\n\nfunction setApi(client: object, api: ApiClient): void {\n apiClients.set(client, api);\n Object.defineProperty(client, API_CLIENT_KEY, {\n value: api,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n}\n\nfunction getApi(client: object): ApiClient {\n const api = apiClients.get(client);\n if (api) {\n return api;\n }\n\n const apiFromSymbol = (client as Record<symbol, unknown>)[API_CLIENT_KEY];\n if (typeof apiFromSymbol === \"object\" && apiFromSymbol !== null) {\n const resolvedApi = apiFromSymbol as ApiClient;\n apiClients.set(client, resolvedApi);\n return resolvedApi;\n }\n\n throw new Error(\n \"QueueClient not initialized. This may happen when multiple bundled copies \" +\n \"of @vercel/queue are loaded in local dev.\",\n );\n}\n\nfunction resolveCallbackRequest(input: CallbackRequestInput): Request {\n if (\"request\" in input) {\n return input.request;\n }\n return input;\n}\n\n/**\n * Resolve the internal ApiClient for a QueueClient instance.\n * Used by internal modules (callback.ts) that need API access from a user-provided QueueClient.\n * Not exported from the package entrypoint.\n */\nexport function getApiClient(client: QueueClient): ApiClient {\n return getApi(client);\n}\n\nconst DEFAULT_REGION: VercelRegion = \"iad1\";\n\nfunction resolveRegion(region?: VercelRegion): VercelRegion {\n if (region) return region;\n\n const fromEnv = process.env.VERCEL_REGION;\n if (fromEnv) return fromEnv;\n\n if (!isDevMode()) {\n console.warn(\n `[QueueClient] Region not detected — defaulting to \"${DEFAULT_REGION}\". ` +\n \"On Vercel this is set automatically via VERCEL_REGION. \" +\n \"To silence this warning, pass region explicitly: \" +\n 'new QueueClient({ region: \"iad1\" })',\n );\n }\n return DEFAULT_REGION;\n}\n\n/**\n * Queue client for push-based (callback) workflows.\n *\n * Use this client when Vercel delivers messages to your route handlers.\n * Provides {@link send}, {@link handleCallback}, and {@link handleNodeCallback}.\n *\n * Region is resolved automatically:\n * 1. Explicit `region` option (highest priority)\n * 2. `VERCEL_REGION` environment variable (set automatically on Vercel)\n * 3. Falls back to `\"iad1\"` with a console warning\n *\n * The constructor never throws — `new QueueClient()` always works.\n *\n * For manual polling workflows, use {@link PollingQueueClient} instead.\n *\n * @example\n * ```typescript\n * import { QueueClient } from \"@vercel/queue\";\n *\n * const queue = new QueueClient();\n * export const { send, handleCallback, handleNodeCallback } = queue;\n * ```\n */\nexport class QueueClient {\n constructor(options: QueueClientOptions = {}) {\n const region = resolveRegion(options.region);\n setApi(this, new ApiClient({ ...options, region }));\n }\n\n /**\n * Send a message to a topic.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { send } = new QueueClient();\n * await send(\"my-topic\", payload);\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param payload - The data to send (serialized via the configured transport)\n * @param options - Optional send options (idempotencyKey, retentionSeconds, delaySeconds, headers)\n * @returns `{ messageId }` — `messageId` is `null` when the server accepted\n * the message for deferred processing (no ID available yet)\n */\n send = async <T = unknown>(\n topicName: string,\n payload: T,\n options?: SendOptions,\n ): Promise<SendResult> => {\n const api = getApi(this);\n const result = await api.sendMessage<T>({\n queueName: topicName,\n payload,\n idempotencyKey: options?.idempotencyKey,\n retentionSeconds: options?.retentionSeconds,\n delaySeconds: options?.delaySeconds,\n headers: options?.headers,\n });\n\n if (result.messageId && isDevMode()) {\n invokeDevHandlers(\n topicName,\n result.messageId,\n api.getRegion(),\n options?.delaySeconds,\n options?.retentionSeconds,\n );\n }\n\n return { messageId: result.messageId };\n };\n\n /**\n * Create a Web API route handler for processing queue callback messages.\n *\n * Parses incoming `Request` as a CloudEvent and invokes the handler.\n * For use on Vercel — Vercel invokes this route when messages are available.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { handleCallback } = new QueueClient();\n * export const POST = handleCallback(handler);\n * ```\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Optional configuration\n * @param options.visibilityTimeoutSeconds - Message lock duration (default: 300, max: 3600)\n * @param options.retry - Called when the handler throws. Return `{ afterSeconds: N }` to\n * reschedule the message for redelivery after N seconds.\n * @returns A route handler that accepts either `Request` or `{ request: Request }`\n */\n handleCallback = <T = unknown>(\n handler: MessageHandler<T>,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n ): ((requestOrEvent: CallbackRequestInput) => Promise<Response>) => {\n if (isDevMode()) {\n registerDevHandler(handler as MessageHandler, this, options);\n }\n return async (requestOrEvent: CallbackRequestInput): Promise<Response> => {\n const request = resolveCallbackRequest(requestOrEvent);\n if (isDevMode() && request.headers.get(\"x-vercel-queue-prime\") === \"1\") {\n const primeFile = request.headers.get(\"x-vercel-queue-prime-file\");\n if (primeFile) {\n registerDevHandler(\n handler as MessageHandler,\n this,\n options,\n primeFile,\n );\n }\n return Response.json({ status: \"primed\" });\n }\n\n try {\n const parsed = await parseCallback(request);\n await coreHandleCallback(handler, parsed, {\n client: this,\n visibilityTimeoutSeconds: options?.visibilityTimeoutSeconds,\n retry: options?.retry,\n });\n return Response.json({ status: \"success\" });\n } catch (error) {\n console.error(\"Queue callback error:\", error);\n\n if (\n error instanceof Error &&\n (error.message.includes(\"Invalid content type\") ||\n error.message.includes(\"Invalid CloudEvent\") ||\n error.message.includes(\"Missing required CloudEvent\") ||\n error.message.includes(\"Failed to parse CloudEvent\") ||\n error.message.includes(\"Binary mode callback\"))\n ) {\n return Response.json({ error: error.message }, { status: 400 });\n }\n\n return Response.json(\n { error: \"Failed to process queue message\" },\n { status: 500 },\n );\n }\n };\n };\n\n /**\n * Create a Connect-style route handler for processing queue callback messages.\n * For use on Vercel — Vercel invokes this route when messages are available.\n *\n * For frameworks using the `(req, res)` middleware pattern where `req.body`\n * is pre-parsed (Next.js Pages Router, etc.).\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { handleNodeCallback } = new QueueClient();\n * app.post(\"/api/queue\", handleNodeCallback(handler));\n * ```\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Optional configuration\n * @param options.visibilityTimeoutSeconds - Message lock duration (default: 300, max: 3600)\n * @param options.retry - Called when the handler throws. Return `{ afterSeconds: N }` to\n * reschedule the message for redelivery after N seconds.\n * @returns A `(req, res) => Promise<void>` route handler\n */\n handleNodeCallback = <T = unknown>(\n handler: MessageHandler<T>,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n ): ((\n req: {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n },\n res: {\n status(code: number): { json(data: unknown): void; end(): void };\n end(): void;\n },\n ) => Promise<void>) => {\n if (isDevMode()) {\n registerDevHandler(handler as MessageHandler, this, options);\n }\n return async (req, res) => {\n if (req.method !== \"POST\") {\n res.status(200).end();\n return;\n }\n\n const primeHeader = req.headers[\"x-vercel-queue-prime\"];\n if (isDevMode() && primeHeader === \"1\") {\n const primeFileHeader = req.headers[\"x-vercel-queue-prime-file\"];\n const primeFile = Array.isArray(primeFileHeader)\n ? primeFileHeader[0]\n : primeFileHeader;\n if (primeFile) {\n registerDevHandler(\n handler as MessageHandler,\n this,\n options,\n primeFile,\n );\n }\n res.status(200).json({ status: \"primed\" });\n return;\n }\n\n try {\n const parsed = parseRawCallback(req.body, req.headers);\n await coreHandleCallback(handler, parsed, {\n client: this,\n visibilityTimeoutSeconds: options?.visibilityTimeoutSeconds,\n retry: options?.retry,\n });\n res.status(200).json({ status: \"success\" });\n } catch (error) {\n console.error(\"Queue callback error:\", error);\n\n if (\n error instanceof Error &&\n (error.message.includes(\"Invalid content type\") ||\n error.message.includes(\"Invalid CloudEvent\") ||\n error.message.includes(\"Missing required CloudEvent\") ||\n error.message.includes(\"Failed to parse CloudEvent\") ||\n error.message.includes(\"Binary mode callback\"))\n ) {\n res.status(400).json({ error: error.message });\n return;\n }\n\n res.status(500).json({ error: \"Failed to process queue message\" });\n }\n };\n };\n}\n\n/**\n * Queue client for poll-based (manual receive) workflows.\n *\n * Use this client when you manually poll for messages with {@link receive}.\n * Also provides {@link send} for publishing messages.\n *\n * Region is **required** because messages can only be received from the\n * region they were sent to. Use a fixed region (e.g. `\"iad1\"`) for both\n * sending and receiving.\n *\n * For push-based (callback) workflows on Vercel, use {@link QueueClient} instead.\n *\n * @example\n * ```typescript\n * import { PollingQueueClient } from \"@vercel/queue\";\n *\n * const queue = new PollingQueueClient({ region: \"iad1\" });\n * export const { send, receive } = queue;\n * ```\n */\nexport class PollingQueueClient {\n constructor(options: PollingQueueClientOptions) {\n setApi(this, new ApiClient(options));\n }\n\n /**\n * Send a message to a topic.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { send } = new PollingQueueClient({ region: \"iad1\" });\n * await send(\"my-topic\", payload);\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param payload - The data to send (serialized via the configured transport)\n * @param options - Optional send options (idempotencyKey, retentionSeconds, delaySeconds, headers)\n * @returns `{ messageId }` — `messageId` is `null` when the server accepted\n * the message for deferred processing (no ID available yet)\n */\n send = async <T = unknown>(\n topicName: string,\n payload: T,\n options?: SendOptions,\n ): Promise<SendResult> => {\n const api = getApi(this);\n const result = await api.sendMessage<T>({\n queueName: topicName,\n payload,\n idempotencyKey: options?.idempotencyKey,\n retentionSeconds: options?.retentionSeconds,\n delaySeconds: options?.delaySeconds,\n headers: options?.headers,\n });\n\n return { messageId: result.messageId };\n };\n\n /**\n * Receive and process messages from a topic.\n *\n * Each message is automatically locked, kept alive via periodic visibility\n * extensions during processing, and acknowledged upon successful handler completion.\n * The handler is not called when the queue is empty — check `result.ok` instead.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { receive } = new PollingQueueClient({ region: \"iad1\" });\n * const result = await receive(\"my-topic\", \"my-group\", handler);\n * if (!result.ok) console.log(result.reason);\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param consumerGroup - Name of the consumer group (pattern: `[A-Za-z0-9_-]+`)\n * @param handler - Function to process each message payload and metadata.\n * Not called when the queue is empty.\n * @param options - Optional receive options (visibilityTimeoutSeconds, limit, or messageId)\n * @returns Discriminated result: `{ ok: true }` on success, `{ ok: false, reason }` otherwise\n */\n receive = async <T = unknown>(\n topicName: string,\n consumerGroup: string,\n handler: MessageHandler<T>,\n options?: ReceiveOptions,\n ): Promise<ReceiveResult> => {\n const api = getApi(this);\n const topic = new Topic<T>(api, topicName);\n const visibilityTimeoutSeconds =\n options && \"visibilityTimeoutSeconds\" in options\n ? options.visibilityTimeoutSeconds\n : undefined;\n const consumer = topic.consumerGroup(\n consumerGroup,\n visibilityTimeoutSeconds !== undefined\n ? { visibilityTimeoutSeconds }\n : {},\n );\n\n try {\n let count: number;\n const retry = options?.retry;\n if (options && \"messageId\" in options) {\n count = await consumer.consume(handler, {\n messageId: options.messageId,\n retry,\n });\n } else {\n const limit =\n options && \"limit\" in options\n ? (options as ReceiveBatchOptions).limit\n : undefined;\n count = await consumer.consume(handler, {\n ...(limit !== undefined ? { limit } : {}),\n retry,\n });\n }\n\n if (count === 0) {\n return { ok: false, reason: \"empty\" };\n }\n return { ok: true };\n } catch (error) {\n if (\n options &&\n \"messageId\" in options &&\n error instanceof MessageNotFoundError\n ) {\n return { ok: false, reason: \"not_found\", messageId: options.messageId };\n }\n if (\n options &&\n \"messageId\" in options &&\n error instanceof MessageNotAvailableError\n ) {\n return {\n ok: false,\n reason: \"not_available\",\n messageId: options.messageId,\n };\n }\n if (\n options &&\n \"messageId\" in options &&\n error instanceof MessageAlreadyProcessedError\n ) {\n return {\n ok: false,\n reason: \"already_processed\",\n messageId: options.messageId,\n };\n }\n throw error;\n }\n };\n}\n","import { QueueClient } from \"./client\";\nimport type {\n MessageHandler,\n RetryHandler,\n SendOptions,\n SendResult,\n VercelRegion,\n} from \"./types\";\n\ntype CallbackRequestInput = Request | { request: Request };\n\nlet _defaultClient: QueueClient | undefined;\n\nfunction getDefaultClient(): QueueClient {\n if (!_defaultClient) {\n _defaultClient = new QueueClient();\n }\n return _defaultClient;\n}\n\nfunction resolveClient(region?: VercelRegion): QueueClient {\n if (!region) return getDefaultClient();\n return new QueueClient({ region });\n}\n\n/**\n * Send a message to a topic using the default auto-configured client.\n *\n * The default client auto-detects the region from `VERCEL_REGION`,\n * falling back to `\"iad1\"` with a console warning on first use.\n *\n * This is an arrow function–free alternative to destructuring from a\n * {@link QueueClient} instance — import and use directly:\n * ```typescript\n * import { send } from \"@vercel/queue\";\n * await send(\"my-topic\", { hello: \"world\" });\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param payload - The data to send (serialized via JsonTransport)\n * @param options - Optional send options. Pass `region` to route to a specific region.\n * @returns `{ messageId }` — `messageId` is `null` when the server accepted\n * the message for deferred processing\n */\nexport async function send<T = unknown>(\n topicName: string,\n payload: T,\n options?: SendOptions & { region?: VercelRegion },\n): Promise<SendResult> {\n return resolveClient(options?.region).send(topicName, payload, options);\n}\n\n/**\n * Create a Web API route handler for processing queue callback messages\n * using the default auto-configured client.\n *\n * The default client auto-detects the region from `VERCEL_REGION`,\n * falling back to `\"iad1\"` with a console warning on first use.\n * The callback region is determined automatically from the incoming\n * `ce-vqsregion` header in the v2beta event — no manual configuration needed.\n *\n * This is an arrow function–free alternative to destructuring from a\n * {@link QueueClient} instance — import and use directly:\n * ```typescript\n * import { handleCallback } from \"@vercel/queue\";\n * export const POST = handleCallback(async (message, metadata) => {\n * console.log(\"Processing:\", message);\n * });\n * ```\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Optional configuration (visibilityTimeoutSeconds, retry)\n * @returns A route handler that accepts either `Request` or `{ request: Request }`\n */\nexport function handleCallback<T = unknown>(\n handler: MessageHandler<T>,\n options?: {\n visibilityTimeoutSeconds?: number;\n retry?: RetryHandler;\n },\n): (requestOrEvent: CallbackRequestInput) => Promise<Response> {\n return getDefaultClient().handleCallback(handler, options);\n}\n\n/** @internal Reset singleton state — for testing only. */\nexport function _resetDefaultClient(): void {\n _defaultClient = undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;;;ACmCA,eAAe,eACb,QACiB;AACjB,MAAI,cAAc;AAClB,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,SAAuB,CAAC;AAE9B,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,aAAO,KAAK,KAAK;AACjB,qBAAe,MAAM;AAAA,IACvB;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AAGA,SAAO,OAAO,OAAO,QAAQ,WAAW;AAC1C;AAuBO,IAAM,gBAAN,MAAyD;AAAA,EACrD,cAAc;AAAA,EACd;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQT,YACE,UAGI,CAAC,GACL;AACA,SAAK,WAAW,QAAQ;AACxB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,UAAU,OAAkB;AAC1B,WAAO,OAAO,KAAK,KAAK,UAAU,OAAO,KAAK,QAAQ,GAAG,MAAM;AAAA,EACjE;AAAA,EAEA,MAAM,YAAY,QAAgD;AAChE,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,WAAO,KAAK,MAAM,OAAO,SAAS,MAAM,GAAG,KAAK,OAAO;AAAA,EACzD;AACF;AAaO,IAAM,kBAAN,MAAmD;AAAA,EAC/C,cAAc;AAAA,EAEvB,UAAU,OAAuB;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,QAAqD;AACrE,WAAO,MAAM,eAAe,MAAM;AAAA,EACpC;AACF;AAyBO,IAAM,kBAAN,MAAuE;AAAA,EACnE,cAAc;AAAA,EAEvB,UAAU,OAA+D;AACvE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YACJ,QACqC;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,SAAoD;AACjE,UAAM,SAAS,QAAQ,UAAU;AACjC,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK;AACnC,YAAI,KAAM;AAAA,MACZ;AAAA,IACF,UAAE;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AACF;;;ACrLA,qBAAqC;;;ACQrC,SAAoB;AACpB,UAAqB;AACrB,WAAsB;AACtB,uBAA0B;AAC1B,wBAAe;;;ACogBR,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C,YAAY,WAAmB;AAC7B,UAAM,WAAW,SAAS,YAAY;AACtC,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YAAY,WAAmB,QAAiB;AAC9C;AAAA,MACE,WAAW,SAAS,gCAAgC,SAAS,KAAK,MAAM,KAAK,EAAE;AAAA,IACjF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAY,WAAmB,QAAgB;AAC7C,UAAM,WAAW,SAAS,kBAAkB,MAAM,EAAE;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAY,WAAmB,eAAuB;AACpD;AAAA,MACE,mCAAmC,SAAS,yBAAyB,aAAa;AAAA,IACpF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,qBAAN,cAAiC,MAAM;AAAA;AAAA,EAE5B;AAAA,EAEhB,YAAY,WAAmB,YAAqB;AAClD,UAAM,eAAe,aACjB,gBAAgB,UAAU,cAC1B;AACJ,UAAM,WAAW,SAAS,0BAA0B,YAAY,EAAE;AAClE,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAMO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,UAAkB,2CAA2C;AACvE,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,UAAkB,qDAClB;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,UAAkB,2BAA2B;AACvD,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,OAAe,MAAc,GAAG,MAAc,IAAI;AAC5D,UAAM,kBAAkB,KAAK,2BAA2B,GAAG,QAAQ,GAAG,GAAG;AACzE,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,+BAAN,cAA2C,MAAM;AAAA,EACtD,YAAY,WAAmB;AAC7B,UAAM,WAAW,SAAS,6BAA6B;AACvD,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/B;AAAA,EAEhB,YAAY,SAAiB,gBAAyB;AACpD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,iBAAiB;AAAA,EACxB;AACF;AAMO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAChC;AAAA,EAEhB,YAAY,SAAiB,cAAuB;AAClD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,eAAe;AAAA,EACtB;AACF;AAKO,IAAM,qCAAN,cAAiD,MAAM;AAAA,EAC5D,YAAY,UAAkB,oCAAoC;AAChE,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;AC9pBA,IAAM,qCAAqC;AAM3C,IAAM,iCAAiC;AAMvC,IAAM,+BAA+B;AAMrC,IAAM,+BAA+B;AAMrC,IAAM,oBAAoB;AAY1B,SAAS,yBAAyB,0BAA0C;AAC1E,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,8BAA8B,2BAA2B,CAAC;AAAA,EACrE;AACF;AAmDO,IAAM,gBAAN,MAAiC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,YACE,QACA,WACA,mBACA,UAAmC,CAAC,GACpC;AACA,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,oBAAoB;AACzB,SAAK,oBAAoB,KAAK;AAAA,MAC5B;AAAA,MACA,QAAQ,4BAA4B;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,cAAc,OAAyB;AAC7C,WACE,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EAErB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBQ,yBACN,eACA,SACgD;AAChD,QAAI,YAAY;AAChB,QAAI,aAAa;AACjB,QAAI;AACJ,QAAI,YAAmC;AAEvC,UAAM,oBACJ,yBAAyB,KAAK,iBAAiB,IAAI;AAErD,QAAI,eAAe;AACnB,QAAI,SAAS,oBAAoB;AAC/B,YAAM,kBAAkB,QAAQ,mBAAmB,QAAQ,IAAI,KAAK,IAAI;AACxE,UAAI,kBAAkB,GAAG;AACvB,cAAM,uBAAuB,kBAAkB;AAC/C,uBAAe,yBAAyB,oBAAoB,IAAI;AAAA,MAClE,OAAO;AACL,uBAAe;AAAA,MACjB;AAAA,IACF;AAGA,UAAM,mBAAmB,IAAI,QAAc,CAACC,aAAY;AACtD,yBAAmBA;AAAA,IACrB,CAAC;AAED,UAAM,cAAc,MAAM;AACxB,UAAI,CAAC,YAAY;AACf,qBAAa;AACb,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,SAAS,YAA2B;AAExC,UAAI,CAAC,WAAW;AACd,oBAAY;AACZ;AAAA,MACF;AAEA,UAAI;AACF,cAAM,KAAK,OAAO,iBAAiB;AAAA,UACjC,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB;AAAA,UACA,0BAA0B,KAAK;AAAA,QACjC,CAAC;AAGD,YAAI,WAAW;AACb,sBAAY,WAAW,MAAM,OAAO,GAAG,iBAAiB;AAAA,QAC1D,OAAO;AACL,sBAAY;AAAA,QACd;AAAA,MACF,SAAS,OAAO;AAEd,YAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,kBAAQ;AAAA,YACN,oEAAoE,aAAa;AAAA,YACjF;AAAA,UACF;AACA,sBAAY;AACZ;AAAA,QACF;AAGA,gBAAQ;AAAA,UACN,kDAAkD,aAAa,mBAAmB,oBAAoB,GAAI;AAAA,UAC1G;AAAA,QACF;AAGA,YAAI,WAAW;AACb,sBAAY,WAAW,MAAM,OAAO,GAAG,iBAAiB;AAAA,QAC1D,OAAO;AACL,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,gBAAY,WAAW,MAAM,OAAO,GAAG,YAAY;AAGnD,WAAO,OAAO,oBAA6B,UAAU;AAEnD,kBAAY;AAGZ,UAAI,WAAW;AACb,qBAAa,SAAS;AACtB,oBAAY;AAAA,MACd;AAGA,UAAI,mBAAmB;AAGrB,cAAM;AAAA,MACR,OAAO;AACL,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAA0B,SAAkC;AACxE,UAAM,YAAY,KAAK,OAAO,aAAa;AAC3C,QAAI,UAAU,YAAY,YAAY,UAAa,YAAY,MAAM;AACnE,UAAI;AACF,cAAM,UAAU,SAAS,OAAO;AAAA,MAClC,SAAS,eAAe;AACtB,gBAAQ,KAAK,uCAAuC,aAAa;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,eACZ,SACA,SACA,SACe;AACf,UAAM,gBAAgB,KAAK;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,UAAM,uBAAuB;AAC7B,UAAM,WAA4B;AAAA,MAChC,WAAW,QAAQ;AAAA,MACnB,eAAe,QAAQ;AAAA,MACvB,WAAW,QAAQ;AAAA,MACnB,WACE,QAAQ,aACR,IAAI,KAAK,QAAQ,UAAU,QAAQ,IAAI,oBAAoB;AAAA,MAC7D,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,QAAQ,KAAK,OAAO,UAAU;AAAA,IAChC;AAEA,QAAI;AACF,YAAM,QAAQ,QAAQ,SAAS,QAAQ;AAGvC,YAAM,cAAc;AAEpB,YAAM,KAAK,OAAO,mBAAmB;AAAA,QACnC,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,eAAe,QAAQ;AAAA,MACzB,CAAC;AAAA,IACH,SAAS,OAAO;AAGd,YAAM,cAAc;AAGpB,UAAI,SAAS,OAAO;AAClB,YAAI;AACJ,YAAI;AACF,sBAAY,QAAQ,MAAM,OAAO,QAAQ;AAAA,QAC3C,SAAS,YAAY;AACnB,kBAAQ,KAAK,wBAAwB,UAAU;AAAA,QACjD;AAEA,YAAI,WAAW;AACb,cAAI,iBAAiB,aAAa,UAAU,aAAa;AAEvD,gBAAI;AACF,oBAAM,KAAK,OAAO,mBAAmB;AAAA,gBACnC,WAAW,KAAK;AAAA,gBAChB,eAAe,KAAK;AAAA,gBACpB,eAAe,QAAQ;AAAA,cACzB,CAAC;AAAA,YACH,SAAS,UAAU;AACjB,sBAAQ,KAAK,kCAAkC,QAAQ;AAAA,YACzD;AAEA,kBAAM,KAAK,gBAAgB,QAAQ,OAAO;AAC1C;AAAA,UACF;AAEA,cACE,kBAAkB,aAClB,OAAO,UAAU,iBAAiB,UAClC;AACA,gBAAI;AACF,oBAAM,KAAK,OAAO,iBAAiB;AAAA,gBACjC,WAAW,KAAK;AAAA,gBAChB,eAAe,KAAK;AAAA,gBACpB,eAAe,QAAQ;AAAA,gBACvB,0BAA0B,UAAU;AAAA,cACtC,CAAC;AAAA,YACH,SAAS,aAAa;AACpB,sBAAQ;AAAA,gBACN;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,KAAK,gBAAgB,QAAQ,OAAO;AAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,KAAK,gBAAgB,QAAQ,OAAO;AAC1C,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,eACJ,SACA,SACA,SACe;AACf,UAAM,KAAK,eAAe,SAAS,SAAS,OAAO;AAAA,EACrD;AAAA,EAuDA,MAAM,QACJ,SACA,SACiB;AACjB,UAAM,QAAQ,SAAS;AAEvB,QAAI,WAAW,eAAe,SAAS;AACrC,YAAM,WAAW,MAAM,KAAK,OAAO,mBAAsB;AAAA,QACvD,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,0BAA0B,KAAK;AAAA,MACjC,CAAC;AACD,YAAM,KAAK,eAAkB,SAAS,SAAS,SAAS,EAAE,MAAM,CAAC;AACjE,aAAO;AAAA,IACT,OAAO;AACL,YAAM,QAAQ,WAAW,WAAW,UAAU,QAAQ,QAAQ;AAC9D,UAAI,oBAAoB;AAExB,uBAAiB,WAAW,KAAK,OAAO,gBAAmB;AAAA,QACzD,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,0BAA0B,KAAK;AAAA,QAC/B;AAAA,MACF,CAAC,GAAG;AACF;AACA,cAAM,KAAK,eAAkB,SAAS,SAAS,EAAE,MAAM,CAAC;AAAA,MAC1D;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AACF;;;AC9fO,IAAM,QAAN,MAAyB;AAAA,EACtB;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,QAAmB,WAAmB;AAChD,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,QAAQ,SAAY,SAA4C;AACpE,UAAM,SAAS,MAAM,KAAK,OAAO,YAAe;AAAA,MAC9C,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,gBAAgB,SAAS;AAAA,MACzB,kBAAkB,SAAS;AAAA,MAC3B,cAAc,SAAS;AAAA,MACvB,SAAS,SAAS;AAAA,IACpB,CAAC;AAGD,QAAI,OAAO,aAAa,UAAU,GAAG;AACnC;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,KAAK,OAAO,UAAU;AAAA,QACtB,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,OAAO,UAAU;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cACE,mBACA,SACkB;AAClB,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AACF;;;ACZO,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AA2ChC,SAAS,uBACd,WACA,SACS;AAET,QAAM,SAAS,QAAQ,MAAM,GAAG,EAAE;AAClC,SAAO,UAAU,WAAW,MAAM;AACpC;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAOA,SAAS,sBACP,MACA,aACuB;AACvB,MAAI,CAAC,eAAe,CAAC,YAAY,SAAS,8BAA8B,GAAG;AACzE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,CAAC,SAAS,IAAI,KACd,CAAC,KAAK,QACN,CAAC,KAAK,UACN,CAAC,KAAK,MACN,CAAC,SAAS,KAAK,IAAI,GACnB;AACA,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,MAAI,KAAK,SAAS,yBAAyB;AACzC,UAAM,IAAI;AAAA,MACR,sCAAsC,uBAAuB,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,gBAA0B,CAAC;AACjC,MAAI,EAAE,eAAe,MAAO,eAAc,KAAK,WAAW;AAC1D,MAAI,EAAE,mBAAmB,MAAO,eAAc,KAAK,eAAe;AAClE,MAAI,EAAE,eAAe,MAAO,eAAc,KAAK,WAAW;AAC1D,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR,4CAA4C,cAAc,KAAK,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,OAAO,KAAK,SAAS;AAAA,IAChC,eAAe,OAAO,KAAK,aAAa;AAAA,IACxC,WAAW,OAAO,KAAK,SAAS;AAAA,EAClC;AACF;AAIA,SAAS,UAAU,SAAuB,MAA6B;AACrE,MAAI,mBAAmB,SAAS;AAC9B,WAAO,QAAQ,IAAI,IAAI;AAAA,EACzB;AACA,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,CAAC,KAAK;AAC7C,SAAQ,SAAoB;AAC9B;AAEA,SAAS,mBAAmB,SAA8C;AACxE,QAAM,SAAS,UAAU,SAAS,SAAS;AAC3C,MAAI,WAAW,yBAAyB;AACtC,UAAM,IAAI;AAAA,MACR,sCAAsC,uBAAuB,WAAW,MAAM;AAAA,IAChF;AAAA,EACF;AAEA,QAAM,YAAY,UAAU,SAAS,iBAAiB;AACtD,QAAM,gBAAgB,UAAU,SAAS,qBAAqB;AAC9D,QAAM,YAAY,UAAU,SAAS,iBAAiB;AAEtD,QAAM,gBAA0B,CAAC;AACjC,MAAI,CAAC,UAAW,eAAc,KAAK,iBAAiB;AACpD,MAAI,CAAC,cAAe,eAAc,KAAK,qBAAqB;AAC5D,MAAI,CAAC,UAAW,eAAc,KAAK,iBAAiB;AACpD,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR,wCAAwC,cAAc,KAAK,IAAI,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,SAAS,cAAc,KAAK;AAErD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU,SAAS,qBAAqB;AAC9D,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,SAA2B,EAAE,GAAG,MAAM,cAAc;AAE1D,QAAM,gBAAgB,UAAU,SAAS,qBAAqB;AAC9D,MAAI,eAAe;AACjB,WAAO,gBAAgB,SAAS,eAAe,EAAE;AAAA,EACnD;AAEA,QAAM,YAAY,UAAU,SAAS,iBAAiB;AACtD,MAAI,WAAW;AACb,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,YAAY,UAAU,SAAS,iBAAiB;AACtD,MAAI,WAAW;AACb,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,cAAc,UAAU,SAAS,cAAc;AACrD,MAAI,aAAa;AACf,WAAO,cAAc;AAAA,EACvB;AAEA,QAAM,qBAAqB,UAAU,SAAS,0BAA0B;AACxE,MAAI,oBAAoB;AACtB,WAAO,qBAAqB;AAAA,EAC9B;AAEA,SAAO;AACT;AAoBO,SAAS,iBACd,MACA,SACuB;AACvB,QAAM,SAAS,UAAU,SAAS,SAAS;AAE3C,MAAI,WAAW,yBAAyB;AACtC,UAAM,SAAS,mBAAmB,OAAO;AACzC,QAAI,mBAAmB,QAAQ;AAC7B,aAAO,gBAAgB;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,MAAM,UAAU,SAAS,cAAc,CAAC;AACvE;AAcA,eAAsB,cACpB,SACgC;AAChC,QAAM,SAAS,QAAQ,QAAQ,IAAI,SAAS;AAE5C,MAAI,WAAW,yBAAyB;AACtC,UAAM,SAAS,mBAAmB,QAAQ,OAAO;AACjD,QAAI,mBAAmB,UAAU,QAAQ,MAAM;AAC7C,aAAO,UAAU,QAAQ;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B,QAAQ;AACN,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,UAAkC,CAAC;AACzC,UAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACtC,YAAQ,GAAG,IAAI;AAAA,EACjB,CAAC;AAED,SAAO,iBAAiB,MAAM,OAAO;AACvC;AA2BA,eAAsB,eACpB,SACA,SACA,SACe;AACf,QAAM,EAAE,WAAW,eAAe,UAAU,IAAI;AAEhD,MAAI,CAAC,SAAS,QAAQ;AACpB,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,MAAI,MAAM,aAAa,QAAQ,MAAM;AACrC,MAAI,QAAQ,QAAQ;AAClB,UAAM,IAAI,WAAW,QAAQ,MAAM;AAAA,EACrC;AACA,QAAM,QAAQ,IAAI,MAAS,KAAK,SAAS;AACzC,QAAM,KAAK,MAAM;AAAA,IACf;AAAA,IACA,SAAS,6BAA6B,SAClC,EAAE,0BAA0B,QAAQ,yBAAyB,IAC7D;AAAA,EACN;AAEA,MAAI,mBAAmB,SAAS;AAC9B,UAAM,YAAY,IAAI,aAAa;AAEnC,QAAI;AACJ,QAAI,QAAQ,SAAS;AACnB,gBAAU,MAAM,UAAU,YAAY,QAAQ,OAAO;AAAA,IACvD,WAAW,QAAQ,kBAAkB,QAAW;AAC9C,gBAAU,QAAQ;AAAA,IACpB,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAsB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,eAAe,QAAQ,iBAAiB;AAAA,MACxC,WAAW,QAAQ,YAAY,IAAI,KAAK,QAAQ,SAAS,IAAI,oBAAI,KAAK;AAAA,MACtE,WAAW,QAAQ,YAAY,IAAI,KAAK,QAAQ,SAAS,IAAI;AAAA,MAC7D,aAAa,QAAQ,eAAe,UAAU;AAAA,MAC9C,eAAe,QAAQ;AAAA,IACzB;AAEA,UAAM,qBAAqB,QAAQ,qBAC/B,IAAI,KAAK,QAAQ,kBAAkB,IACnC;AAEJ,UAAM,GAAG,eAAe,SAAS,SAAS;AAAA,MACxC;AAAA,MACA,OAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH,OAAO;AACL,UAAM,GAAG,QAAQ,SAAS,EAAE,WAAW,OAAO,SAAS,MAAM,CAAC;AAAA,EAChE;AACF;;;AJvZA;AA2BA,IAAM,SAAS,kBAAAC,QAAG,KAAK,SAAS;AAChC,IAAM,KAAK,kBAAAA,QAAG,MAAM,QAAG;AACvB,IAAM,OAAO,kBAAAA,QAAG,IAAI,QAAG;AACvB,IAAM,QAAQ,kBAAAA,QAAG,OAAO,QAAG;AAMpB,SAAS,YAAqB;AACnC,SAAO,QAAQ,IAAI,aAAa;AAClC;AAMA,IAAM,qBAAqB,OAAO,IAAI,gCAAgC;AActE,SAAS,wBAAwB,UAA0B;AACzD,MAAI,SAAS;AACb,aAAW,QAAQ,UAAU;AAC3B,QAAI,SAAS,KAAK;AAChB,gBAAU;AAAA,IACZ,WAAW,SAAS,KAAK;AACvB,gBAAU;AAAA,IACZ,WAAW,SAAS,KAAK;AACvB,gBAAU;AAAA,IACZ,WAAW,eAAe,KAAK,IAAI,GAAG;AACpC,gBAAU;AAAA,IACZ,OAAO;AACL,gBACE,MAAM,KAAK,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAgD;AACvD,QAAM,IAAI;AAIV,MAAI,sBAAsB,GAAG;AAC3B,WAAO,EAAE,kBAAkB,KAAK;AAAA,EAClC;AAEA,MAAI;AACF,UAAM,iBAAsB,UAAK,QAAQ,IAAI,GAAG,aAAa;AAC7D,QAAI,CAAI,cAAW,cAAc,GAAG;AAClC,QAAE,kBAAkB,IAAI;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,MAAS,gBAAa,gBAAgB,OAAO,CAAC;AAYtE,QAAI,CAAC,WAAW,WAAW;AACzB,QAAE,kBAAkB,IAAI;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,WAA8B,CAAC;AAErC,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,WAAW,SAAS,GAAG;AACrE,UAAI,CAAC,OAAO,qBAAsB;AAElC,iBAAW,WAAW,OAAO,sBAAsB;AACjD,YAAI,CAAC,QAAQ,MAAM,WAAW,QAAQ,KAAK,CAAC,QAAQ,MAAO;AAE3D,YAAI,QAAQ,SAAS,gBAAgB;AACnC,kBAAQ;AAAA,YACN,GAAG,MAAM,8BAA8B,QAAQ,IAAI,gBACvC,QAAQ,KAAK,QAAQ,QAAQ;AAAA,UAE3C;AACA;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,OAAO,QAAQ;AAAA,UACf,UAAU,wBAAwB,QAAQ;AAAA,UAC1C,mBAAmB,QAAQ;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,MAAE,kBAAkB,IAAI,SAAS,SAAS,IAAI,WAAW;AACzD,WAAO,EAAE,kBAAkB;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,KAAK,GAAG,MAAM,gCAAgC,KAAK;AAC3D,MAAE,kBAAkB,IAAI;AACxB,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,WAAsC;AAChE,QAAM,WAAW,oBAAoB;AACrC,MAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,SAAO,SAAS,OAAO,CAAC,YAAY;AAClC,QAAI,QAAQ,MAAM,SAAS,GAAG,GAAG;AAC/B,aAAO,uBAAuB,WAAW,QAAQ,KAAK;AAAA,IACxD;AACA,WAAO,QAAQ,UAAU;AAAA,EAC3B,CAAC;AACH;AAEA,SAAS,sBACP,WACA,eACoB;AACpB,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,aAAa,aAAa;AAC7D,SAAO,OAAO;AAChB;AAMA,SAAS,eAAe,UAAiC;AACvD,MAAI,6BAA6B,KAAK,QAAQ,GAAG;AAC/C,WAAO,SAAS,MAAM,CAAC;AAAA,EACzB;AACA,SAAO;AACT;AAMA,SAAS,wBAAwB,YAAoB,SAA0B;AAC7E,SAAO,eAAe,eAAW,4BAAU,YAAY,OAAO;AAChE;AAWA,SAAS,oBAAoB,cAAyC;AACpE,QAAM,WAAW,oBAAoB;AACrC,MAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAIC;AACJ,MAAI;AACF,IAAAA,YAAgB,cAAS,KAAK,YAAY;AAAA,EAC5C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,QAAM,aAAaA,UAAS,QAAQ,OAAO,GAAG;AAC9C,QAAM,WAAW,eAAe,UAAU;AAE1C,SAAO,SAAS;AAAA,IACd,CAAC,MACC,wBAAwB,YAAY,EAAE,QAAQ,KAC7C,aAAa,QAAQ,wBAAwB,UAAU,EAAE,QAAQ;AAAA,EACtE;AACF;AAMA,SAAS,mBAAmB,MAA6B;AACvD,MAAI,QAAQ,KAAK,MAAM,mBAAmB;AAC1C,MAAI,CAAC,MAAO,SAAQ,KAAK,MAAM,oBAAoB;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,WAAW,MAAM,CAAC,EAAE,KAAK;AAC7B,MACE,aAAa,YACb,SAAS,WAAW,OAAO,KAC3B,SAAS,WAAW,UAAU,GAC9B;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW,SAAS,GAAG;AAClC,QAAI;AACF,iBAAW,IAAI,IAAI,QAAQ,EAAE;AAAA,IAC/B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,gCAAgC,KAAK,QAAQ,GAAG;AAClD,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW,IAAI,GAAG;AAC7B,eAAW,SAAS,MAAM,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,IAAI;AACJ,SAAS,mBAA2B;AAClC,MAAI,eAAgB,QAAO;AAC3B,MAAI;AACF,UAAM,UACJ,OAAO,cAAc,cACjB,YACK,aAAQ,IAAI,IAAI,YAAY,GAAG,EAAE,QAAQ;AACpD,qBAAsB,aAAQ,SAAS,IAAI;AAAA,EAC7C,QAAQ;AACN,qBAAiB;AAAA,EACnB;AACA,SAAO;AACT;AASA,SAAS,wBAAuC;AAC9C,QAAM,QAAQ,IAAI,MAAM,EAAE;AAC1B,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,MAAM,CAAC;AACvC,QAAM,SAAS,iBAAiB;AAEhC,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,mBAAmB,IAAI;AAClC,QAAI,CAAC,GAAI;AACT,UAAM,WAAgB,gBAAW,EAAE,IAAI,KAAU,aAAQ,QAAQ,IAAI,GAAG,EAAE;AAC1E,QAAI;AACJ,QAAI;AACF,eAAY,gBAAa,QAAQ;AAAA,IACnC,QAAQ;AACN,eAAS;AAAA,IACX;AACA,QAAI,UAAU,OAAO,WAAW,MAAM,EAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMA,IAAM,uBAAuB,OAAO,IAAI,kCAAkC;AAW1E,SAAS,qBAAsC;AAC7C,QAAM,IAAI;AAGV,MAAI,CAAC,EAAE,oBAAoB,GAAG;AAC5B,MAAE,oBAAoB,IAAI,oBAAI,IAAI;AAAA,EACpC;AACA,SAAO,EAAE,oBAAoB;AAC/B;AAEA,SAAS,uBACP,UACA,SACA,QACA,SACS;AACT,QAAM,eAAoB,gBAAW,QAAQ,IACzC,WACK,aAAQ,QAAQ,IAAI,GAAG,QAAQ;AACxC,QAAM,eAAe,oBAAoB,YAAY;AACrD,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,QAAM,WAAW,mBAAmB;AACpC,aAAW,WAAW,cAAc;AAClC,UAAM,MAAM,QAAQ;AACpB,UAAM,WAAW,SAAS,IAAI,GAAG,KAAK,CAAC;AACvC,UAAM,YAA+B;AAAA,MACnC,eAAe,QAAQ;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,gBAAgB,SAAS;AAAA,MAC7B,CAAC,MAAM,EAAE,kBAAkB,QAAQ;AAAA,IACrC;AACA,QAAI,iBAAiB,GAAG;AAEtB,eAAS,aAAa,IAAI;AAAA,IAC5B,OAAO;AACL,eAAS,KAAK,SAAS;AAAA,IACzB;AACA,aAAS,IAAI,KAAK,QAAQ;AAAA,EAC5B;AACA,SAAO;AACT;AAYO,SAAS,mBACd,SACA,QACA,SACA,iBACM;AACN,QAAM,aAAa,mBAAmB,sBAAsB;AAC5D,MAAI,CAAC,YAAY;AACf,YAAQ;AAAA,MACN,GAAG,MAAM;AAAA,IACX;AACA;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,UAAM,cAAc,oBAAoB;AAExC,QAAI,eAAe,YAAY,SAAS,GAAG;AAKzC;AAAA,IACF;AAEA,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAIA;AACJ,QAAI;AACF,MAAAA,YAAgB,cAAS,KAAK,UAAU,EAAE,QAAQ,OAAO,GAAG;AAAA,IAC9D,QAAQ;AACN,MAAAA,YAAW;AAAA,IACb;AAEA,YAAQ;AAAA,MACN,GAAG,MAAM,wBAAwBA,SAAQ;AAAA;AAAA;AAAA,KAGjCA,SAAQ;AAAA;AAAA;AAAA,IAGlB;AAAA,EACF;AACF;AAMA,SAAS,eAAe,WAAwC;AAC9D,QAAM,WAAW,mBAAmB;AACpC,QAAM,SAA8B,CAAC;AAErC,aAAW,CAAC,SAAS,QAAQ,KAAK,UAAU;AAC1C,UAAM,UAAU,QAAQ,SAAS,GAAG,IAChC,uBAAuB,WAAW,OAAO,IACzC,YAAY;AAChB,QAAI,SAAS;AACX,aAAO,KAAK,GAAG,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAMA,IAAM,6BAA6B;AACnC,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF;AAyBA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,uBAAuB,OAAyB;AACvD,MAAI,iBAAiB,sBAAsB;AACzC,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,SAAS,MAAM,SAAS,wBAAwB;AACnE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAA0C;AAC3D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,KAAK,SAAS,MAAO,QAAO;AACrE,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA0C;AAClE,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,KAAK,EAAE;AAC9B,WAAO,UAAU,MAAM;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAA8B;AACrC,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAM,CAAC,SAAwB;AACnC,QAAI,QAAQ,CAAC,KAAK,IAAI,IAAI,GAAG;AAC3B,WAAK,IAAI,IAAI;AACb,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,aAAW,OAAO,qBAAqB;AACrC,QAAI,UAAU,QAAQ,IAAI,GAAG,CAAC,CAAC;AAAA,EACjC;AAEA,aAAW,OAAO,oBAAoB;AACpC,QAAI,iBAAiB,QAAQ,IAAI,GAAG,CAAC,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAgC;AACvD,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,SAAa,YAAQ,EAAE,MAAM,aAAa,KAAK,CAAC;AACtD,QAAI,UAAU;AAEd,UAAM,SAAS,CAAC,cAAuB;AACrC,UAAI,QAAS;AACb,gBAAU;AACV,aAAO,QAAQ;AACf,MAAAA,SAAQ,SAAS;AAAA,IACnB;AAEA,WAAO,KAAK,WAAW,MAAM,OAAO,IAAI,CAAC;AACzC,WAAO,KAAK,SAAS,MAAM,OAAO,KAAK,CAAC;AACxC,WAAO,WAAW,uBAAuB,MAAM,OAAO,KAAK,CAAC;AAAA,EAC9D,CAAC;AACH;AAOA,eAAe,gBACb,SACA,SAMA,SACe;AACf,MAAI,UAAU;AACd,MAAI,QAAQ;AAEZ,SAAO,MAAM;AACX,QAAI;AACF,YAAM,eAAmB,SAAS,SAAS,OAAO;AAClD;AAAA,IACF,SAAS,OAAO;AACd,UAAI,uBAAuB,KAAK,KAAK,UAAU,uBAAuB;AACpE,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAC7C,mBAAW;AACX,gBAAQ,KAAK;AAAA,UACX,QAAQ;AAAA,UACR,wBAAwB;AAAA,QAC1B;AACA;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAMA,SAAS,kBAAkB,UAA0B;AACnD,MAAI,UAAU,SACX,QAAQ,eAAe,GAAG,EAC1B,QAAQ,iBAAiB,GAAG,EAC5B,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,UAAU,GAAG,EACrB,QAAQ,YAAY,GAAG,EACvB,QAAQ,aAAa,GAAG,EACxB,QAAQ,qCAAqC,EAAE,EAC/C,QAAQ,wCAAwC,EAAE,EAClD,QAAQ,8BAA8B,EAAE;AAE3C,MAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,cAAU,MAAM;AAAA,EAClB;AAEA,SAAO;AACT;AAWA,eAAe,qBACb,WACA,UAAuC,CAAC,GACP;AACjC,QAAM,cAAsC;AAAA,IAC1C,YAAY,kBAAkB;AAAA,IAC9B,gBAAgB,CAAC;AAAA,IACjB,kBAAkB,CAAC;AAAA,IACnB,gBAAgB,CAAC;AAAA,IACjB,eAAe,CAAC;AAAA,EAClB;AAEA,QAAM,iBAAiB,mBAAmB,SAAS;AACnD,MAAI,eAAe,WAAW,EAAG,QAAO;AAExC,QAAM,0BAA0B,QAAQ,sBAAsB;AAE9D,aAAW,QAAQ,YAAY,YAAY;AACzC,QAAI,MAAM,gBAAgB,IAAI,GAAG;AAC/B,kBAAY,eAAe,KAAK,IAAI;AAAA,IACtC,OAAO;AACL,kBAAY,iBAAiB,KAAK,IAAI;AAAA,IACxC;AAAA,EACF;AAEA,aAAW,SAAS,gBAAgB;AAClC,UAAM,oBAAoB,oBAAoB,WAAW,MAAM,QAAQ;AACvE,QAAI,qBAAqB,CAAC,yBAAyB;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,mBAAmB;AACtB,YAAM,eAAoB,aAAQ,QAAQ,IAAI,GAAG,MAAM,QAAQ;AAC/D,UAAI;AACF,cAAM,OAAO;AAAA,MACf,SAAS,OAAO;AACd,oBAAY,eAAe,KAAK;AAAA,UAC9B,UAAU,MAAM;AAAA,UAChB,QAAQ,kBAAkB,KAAK;AAAA,QACjC,CAAC;AAAA,MACH;AAEA,UAAI,oBAAoB,WAAW,MAAM,QAAQ,EAAG;AAAA,IACtD;AAEA,eAAW,QAAQ,YAAY,gBAAgB;AAC7C,YAAM,MAAM,oBAAoB,IAAI,GAAG,kBAAkB,MAAM,QAAQ,CAAC;AACxE,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,wBAAwB;AAAA,YACxB,6BAA6B,MAAM;AAAA,UACrC;AAAA,QACF,CAAC;AACD,YAAI;AACF,gBAAM,SAAS,KAAK;AAAA,QACtB,QAAQ;AAAA,QAAC;AAET,YAAI,oBAAoB,WAAW,MAAM,QAAQ,GAAG;AAClD;AAAA,QACF;AAEA,oBAAY,cAAc,KAAK;AAAA,UAC7B,UAAU,MAAM;AAAA,UAChB;AAAA,UACA,QACE,QAAQ,SAAS,MAAM,GAAG,SAAS,aAAa,IAAI,SAAS,UAAU,KAAK,EAAE,GAAG,KAAK;AAAA,QAC1F,CAAC;AAAA,MACH,SAAS,OAAO;AACd,oBAAY,cAAc,KAAK;AAAA,UAC7B,UAAU,MAAM;AAAA,UAChB;AAAA,UACA,QAAQ,kBAAkB,KAAK;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBACP,WACA,QACA,aACQ;AACR,QAAM,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ;AAC1C,QAAM,gBACJ,YAAY,eAAe,CAAC,KAAK,YAAY,WAAW,CAAC;AAC3D,QAAM,gBAAgB,gBAClB,OAAO;AAAA,IACL,CAAC,MACC,oBAAoB,aAAa,GAAG,kBAAkB,EAAE,QAAQ,CAAC;AAAA,EACrE,IACA,CAAC;AAEL,MAAI;AACJ,MAAI,YAAY,WAAW,WAAW,GAAG;AACvC,kBACE;AAAA,EACJ,WAAW,YAAY,eAAe,WAAW,GAAG;AAClD,kBAAc,wBAAwB,YAAY,WAAW,KAAK,IAAI,CAAC;AAAA,EACzE,OAAO;AACL,UAAM,cACJ,YAAY,iBAAiB,SAAS,IAClC,oBAAoB,YAAY,iBAAiB,KAAK,IAAI,CAAC,OAC3D;AACN,kBACE,wBAAwB,YAAY,WAAW,KAAK,IAAI,CAAC,kBAC1C,YAAY,eAAe,KAAK,IAAI,CAAC,OACpD;AAAA,EACJ;AAEA,QAAM,gBACJ,YAAY,eAAe,SAAS,IAChC;AAAA,qBACA,YAAY,eACT,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,KAAK,EAAE,MAAM,GAAG,EACxC,KAAK,IAAI,IACZ;AAEN,QAAM,eACJ,YAAY,cAAc,SAAS,IAC/B;AAAA,oBACA,YAAY,cACT,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,GAAG,EACnC,KAAK,IAAI,IACZ;AAEN,SACE,GAAG,MAAM,qCAAqC,SAAS,sCACpB,MAAM,KAAK,IAAI,CAAC;AAAA,EAChD,WAAW,GAAG,aAAa,GAAG,YAAY;AAAA;AAAA,KAG5C,cAAc,SAAS,IACpB,gBAAgB,cAAc,KAAK,MAAM,CAAC,KAC1C;AAER;AAEA,SAAS,oBACP,WACA,eACS;AACT,SAAO,eAAe,SAAS,EAAE;AAAA,IAC/B,CAAC,MAAM,EAAE,kBAAkB;AAAA,EAC7B;AACF;AAMA,IAAM,6BAA6B;AACnC,IAAM,iCAAiC;AACvC,IAAM,8BAA8B;AACpC,IAAM,sBAAsB;AAgB5B,SAAS,sBACP,KACA,QACM;AACN,QAAM,cAAc,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,0BAA0B;AAE5E,UAAQ;AAAA,IACN,GAAG,MAAM,IAAI,KAAK,8BAA8B,WAAW,aAAa,IAAI,SAAS,eAAe,IAAI,aAAa,gBAAgB,IAAI,SAAS;AAAA,EACpJ;AAEA,aAAW,YAAY;AACrB,UAAM,oBAAoB,IAAI,gBAAgB;AAC9C,UAAM,YAAY,IAAI;AAAA,MACpB,IAAI,UAAU,QAAQ,IAAI,IAAI,mBAAmB;AAAA,IACnD;AAEA,QAAI,KAAK,IAAI,KAAK,UAAU,QAAQ,GAAG;AACrC,cAAQ;AAAA,QACN,GAAG,MAAM,8CAA8C,IAAI,SAAS,gBAAgB,IAAI,SAAS;AAAA,MACnG;AACA;AAAA,IACF;AAEA,QAAI,oBAAoB,6BAA6B;AACnD,cAAQ;AAAA,QACN,GAAG,MAAM,uBAAuB,2BAA2B,qBAAqB,IAAI,SAAS,gBAAgB,IAAI,SAAS;AAAA,MAC5H;AACA;AAAA,IACF;AAEA,UAAM,WAA4B;AAAA,MAChC,WAAW,IAAI;AAAA,MACf,eAAe;AAAA,MACf,WAAW,IAAI;AAAA,MACf;AAAA,MACA,WAAW,IAAI;AAAA,MACf,eAAe,IAAI;AAAA,MACnB,QAAQ,IAAI;AAAA,IACd;AAEA,YAAQ;AAAA,MACN,GAAG,MAAM,0BAA0B,IAAI,SAAS,eAAe,IAAI,aAAa,gBAAgB,IAAI,SAAS,mBAAmB,iBAAiB;AAAA,IACnJ;AAEA,QAAI,YAAY;AAChB,QAAI,kBAAiC;AACrC,QAAI,mBAAmB;AAEvB,QAAI;AACF,YAAM,IAAI,QAAQ,IAAI,SAAS,QAAQ;AAAA,IACzC,SAAS,OAAO;AACd,kBAAY;AAEZ,UAAI,IAAI,OAAO;AACb,YAAI;AACJ,YAAI;AACF,sBAAY,IAAI,MAAM,OAAO,QAAQ;AAAA,QACvC,SAAS,UAAU;AACjB,kBAAQ,KAAK,GAAG,MAAM,yBAAyB,QAAQ;AAAA,QACzD;AAEA,YAAI,aAAa,kBAAkB,WAAW;AAC5C,4BAAkB,UAAU;AAAA,QAC9B,WAAW,aAAa,iBAAiB,WAAW;AAClD,6BAAmB;AAAA,QACrB;AAAA,MACF;AAEA,UAAI,CAAC,kBAAkB;AACrB,gBAAQ;AAAA,UACN,GAAG,MAAM,IAAI,IAAI,yCAAyC,IAAI,SAAS,gBAAgB,IAAI,SAAS;AAAA,UACpG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW;AACb,cAAQ;AAAA,QACN,GAAG,MAAM,IAAI,EAAE,6CAA6C,IAAI,SAAS,eAAe,IAAI,aAAa,gBAAgB,IAAI,SAAS;AAAA,MACxI;AAAA,IACF,WAAW,kBAAkB;AAC3B,cAAQ;AAAA,QACN,GAAG,MAAM,IAAI,EAAE,kDAAkD,IAAI,SAAS,eAAe,IAAI,aAAa,gBAAgB,IAAI,SAAS;AAAA,MAC7I;AAAA,IACF,OAAO;AACL,YAAM,YAAY,mBAAmB,IAAI;AACzC;AAAA,QACE,EAAE,GAAG,KAAK,eAAe,kBAAkB;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,cAAc,GAAI;AACvB;AASO,SAAS,kBACd,WACA,WACA,QACA,cACA,kBACM;AACN,MAAI,gBAAgB,eAAe,GAAG;AACpC,YAAQ;AAAA,MACN,GAAG,MAAM,oCAAoC,SAAS,gBAAgB,SAAS,WAAW,YAAY;AAAA,IACxG;AACA,eAAW,MAAM;AACf;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,GAAG,eAAe,GAAI;AACtB;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,GAAG,MAAM,yBAAyB,SAAS,gBAAgB,SAAS;AAAA,EACtE;AAEA,GAAC,YAAY;AACX,QAAI,WAAW,eAAe,SAAS;AACvC,QAAI,cAA6C;AAEjD,QAAI,SAAS,SAAS,GAAG;AAEvB,YAAM,qBAAqB,WAAW,EAAE,mBAAmB,KAAK,CAAC;AACjE,iBAAW,eAAe,SAAS;AAAA,IACrC,OAAO;AACL,oBAAc,MAAM,qBAAqB,SAAS;AAClD,iBAAW,eAAe,SAAS;AAAA,IACrC;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,iBAAiB,mBAAmB,SAAS;AACnD,UAAI,eAAe,SAAS,GAAG;AAC7B,cAAM,kBAAkB,eAAe;AAAA,UACrC,YAAY,kBAAkB;AAAA,UAC9B,gBAAgB,CAAC;AAAA,UACjB,kBAAkB,CAAC;AAAA,UACnB,gBAAgB,CAAC;AAAA,UACjB,eAAe,CAAC;AAAA,QAClB;AACA,gBAAQ;AAAA,UACN,sBAAsB,WAAW,gBAAgB,eAAe;AAAA,QAClE;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,UACN,GAAG,MAAM,qCAAqC,SAAS;AAAA;AAAA,QAGzD;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,iBAAiB,SAAS,IAAI,CAAC,MAAM,EAAE,aAAa;AAC1D,YAAQ;AAAA,MACN,GAAG,MAAM,iCAAiC,SAAS,gBAAgB,SAAS,wBAAmB,eAAe,KAAK,IAAI,CAAC;AAAA,IAC1H;AAEA,UAAM,qBAAqB,oBAAoB;AAE/C,eAAW,SAAS,UAAU;AAC5B,UAAI;AACJ,UAAI,oBAA0B,oBAAI,KAAK;AACvC,UAAI,wBAAwB;AAC5B,UAAI,mBAAmB;AACvB,UAAI,cAA6B;AACjC,UAAI,oBAAoB;AAExB,YAAM,iBAAiC,OAAO,SAAS,aAAa;AAClE,0BAAkB;AAClB,4BAAoB,SAAS;AAC7B,gCAAwB,SAAS;AACjC,YAAI;AACF,gBAAM,MAAM,QAAQ,SAAS,QAAQ;AAAA,QACvC,SAAS,OAAO;AACd,6BAAmB;AACnB,gBAAM;AAAA,QACR;AAAA,MACF;AAyBA,YAAM,eAAyC,MAAM,SAAS,QAC1D,CAAC,OAAO,aAAa;AACnB,cAAM,YAAY,MAAM,QAAS,MAAO,OAAO,QAAQ;AACvD,YAAI,aAAa,kBAAkB,WAAW;AAC5C,wBAAc,UAAU;AAAA,QAC1B,WAAW,aAAa,iBAAiB,WAAW;AAClD,8BAAoB;AAAA,QACtB;AACA,eAAO;AAAA,MACT,IACA;AAEJ,YAAM,UAAU;AAAA,QACd,WAAW;AAAA,QACX,eAAe,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,kBAAyC;AAAA,QAC7C,QAAQ,MAAM;AAAA,QACd,0BAA0B,MAAM,SAAS;AAAA,QACzC,OAAO;AAAA,MACT;AAEA,YAAM,uBAAuB,KAAK;AAAA,QAChC,sBAAsB,WAAW,MAAM,aAAa,KAClD;AAAA,QACF;AAAA,MACF;AAEA,YAAM,qBAAqB,OAA6B;AAAA,QACtD,SAAS,MAAM;AAAA,QACf,OAAO,MAAM,SAAS;AAAA,QACtB,SAAS;AAAA,QACT;AAAA,QACA,eAAe,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,oBAAoB;AAAA,MACtB;AAEA,UAAI;AACF,cAAM,gBAAgB,gBAAgB,SAAS,eAAe;AAE9D,YAAI,kBAAkB;AACpB,kBAAQ;AAAA,YACN,GAAG,MAAM,IAAI,EAAE,8BAA8B,SAAS,eAAe,MAAM,aAAa,gBAAgB,SAAS;AAAA,UACnH;AAAA,QACF,WAAW,mBAAmB;AAC5B,kBAAQ;AAAA,YACN,GAAG,MAAM,IAAI,EAAE,kDAAkD,SAAS,eAAe,MAAM,aAAa,gBAAgB,SAAS;AAAA,UACvI;AAAA,QACF,WAAW,gBAAgB,MAAM;AAC/B,gBAAM,WAAW,KAAK,IAAI,aAAa,0BAA0B;AACjE,gCAAsB,mBAAmB,GAAG,QAAQ;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,GAAG,MAAM,IAAI,IAAI,2BAA2B,SAAS,eAAe,MAAM,aAAa,gBAAgB,SAAS;AAAA,UAChH;AAAA,QACF;AACA,YAAI,CAAC,kBAAkB;AACrB,gCAAsB,mBAAmB,GAAG,oBAAoB;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AACL;AAMA,SAAS,gBAAsB;AAC7B,QAAM,IAAI;AAIV,SAAO,EAAE,kBAAkB;AAC3B,SAAO,EAAE,oBAAoB;AAC/B;AAEA,IAAI,QAAQ,IAAI,aAAa,UAAU,QAAQ,IAAI,QAAQ;AACzD,EAAC,WAAuC,kBAAkB;AAC1D,EAAC,WAAuC,4BACtC;AACF,EAAC,WAAuC,sBACtC;AACF,EAAC,WAAuC,4BACtC;AACF,EAAC,WAAuC,mBAAmB;AAC7D;;;AKrlCA,kBAAmC;;;ANqCnC,SAAS,iBAA0B;AACjC,SACE,QAAQ,IAAI,uBAAuB,OACnC,QAAQ,IAAI,uBAAuB;AAEvC;AAEA,eAAe,cACb,QACe;AACf,QAAM,SAAS,OAAO,UAAU;AAChC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK;AACnC,UAAI,KAAM;AAAA,IACZ;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAEA,SAAS,qBACP,QACA,YACA,WACA,WACA,oBAA4B,sBACrB;AACP,MAAI,WAAW,KAAK;AAClB,UAAM,IAAI,gBAAgB,aAAa,iBAAiB;AAAA,EAC1D;AACA,MAAI,WAAW,KAAK;AAClB,UAAM,IAAI,kBAAkB,aAAa,MAAS;AAAA,EACpD;AACA,MAAI,WAAW,KAAK;AAClB,UAAM,IAAI,eAAe,aAAa,MAAS;AAAA,EACjD;AACA,MAAI,UAAU,KAAK;AACjB,UAAM,IAAI;AAAA,MACR,aAAa,iBAAiB,MAAM,IAAI,UAAU;AAAA,IACpD;AAAA,EACF;AACA,QAAM,IAAI,MAAM,aAAa,SAAS,KAAK,MAAM,IAAI,UAAU,EAAE;AACnE;AAEA,SAAS,kBACP,SAC0C;AAC1C,QAAM,YAAY,QAAQ,IAAI,gBAAgB;AAC9C,QAAM,mBAAmB,QAAQ,IAAI,oBAAoB,KAAK;AAC9D,QAAM,YAAY,QAAQ,IAAI,eAAe;AAC7C,QAAM,cAAc,QAAQ,IAAI,cAAc,KAAK;AACnD,QAAM,gBAAgB,QAAQ,IAAI,oBAAoB;AACtD,QAAM,eAAe,QAAQ,IAAI,gBAAgB;AAEjD,MAAI,CAAC,aAAa,CAAC,aAAa,CAAC,eAAe;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,kBAAkB,EAAE;AACnD,MAAI,OAAO,MAAM,aAAa,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,IAAI,KAAK,SAAS;AAAA,IAC7B,WAAW,eAAe,IAAI,KAAK,YAAY,IAAI;AAAA,IACnD;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,4BAA6C,CAAC,WAClD,IAAI,IAAI,WAAW,MAAM,mBAAmB;AAE9C,SAAS,eACP,QACA,UACK;AACL,UAAQ,YAAY,2BAA2B,MAAM;AACvD;AAEA,IAAM,YAAY;AAEX,IAAM,YAAN,MAAM,WAAU;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAwD;AAClE,SAAK,SAAS,QAAQ;AACtB,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,UAAU,eAAe,KAAK,QAAQ,KAAK,eAAe;AAC/D,SAAK,gBAAgB,QAAQ,WAAW,CAAC;AACzC,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,YAAY,QAAQ,aAAa,IAAI,cAAc;AACxD,SAAK,aAAa,QAAQ;AAE1B,QAAI,QAAQ,iBAAiB,MAAM;AACjC,WAAK,WAAW;AAChB,WAAK,qBAAqB;AAAA,IAC5B,OAAO;AACL,WAAK,uBACH,QAAQ,gBAAgB,QAAQ,IAAI;AACtC,WAAK,WAAW;AAChB,WAAK,qBAAqB;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,QAA2B;AACpC,WAAO,IAAI,WAAU;AAAA,MACnB;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB,OAAO,KAAK;AAAA,MACZ,SAAS,EAAE,GAAG,KAAK,cAAc;AAAA,MACjC,cAAc,KAAK,qBAAqB,OAAO,KAAK;AAAA,MACpD,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,sBAA4B;AAClC,QAAI,UAAU,KAAK,KAAK,sBAAsB,KAAK,sBAAsB;AACvE;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IAOF;AAAA,EACF;AAAA,EAEQ,sBAA0C;AAChD,QAAI,UAAU,GAAG;AACf,aAAO;AAAA,IACT;AACA,SAAK,oBAAoB;AACzB,WAAO,KAAK,WAAW,KAAK,uBAAuB;AAAA,EACrD;AAAA,EAEQ,yBAA6C;AACnD,QAAI,UAAU,GAAG;AACf,aAAO;AAAA,IACT;AACA,SAAK,oBAAoB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,WAA4B;AACxC,QAAI,KAAK,eAAe;AACtB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI;AACF,aAAO,UAAM,gCAAmB;AAAA,IAClC,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC7D,YAAM,IAAI;AAAA,QACR,UAAU,IACN;AAAA;AAAA;AAAA;AAAA;AAAA,SAGU,KAAK,KACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAKU,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAS,cAAsB,cAAgC;AACrE,UAAM,eAAe,mBAAmB,SAAS;AACjD,UAAM,WAAW,aAAa,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC;AAC9D,UAAMC,QAAO,SAAS,SAAS,IAAI,MAAM,SAAS,KAAK,GAAG,IAAI;AAC9D,UAAM,WAAW,KAAK,QAAQ,SAAS,QAAQ,QAAQ,EAAE;AACzD,WAAO,GAAG,KAAK,QAAQ,MAAM,GAAG,QAAQ,GAAG,SAAS,IAAI,YAAY,GAAGA,KAAI;AAAA,EAC7E;AAAA,EAEA,MAAc,MACZ,KACA,MACmB;AACnB,UAAM,SAAS,KAAK,UAAU;AAE9B,QAAI,eAAe,GAAG;AACpB,YAAM,UAAmC;AAAA,QACvC;AAAA,QACA;AAAA,QACA,SAAS,KAAK;AAAA,MAChB;AAEA,YAAM,OAAO,KAAK;AAClB,UAAI,SAAS,UAAa,SAAS,MAAM;AACvC,YAAI,gBAAgB,aAAa;AAC/B,kBAAQ,WAAW,KAAK;AAAA,QAC1B,WAAW,gBAAgB,YAAY;AACrC,kBAAQ,WAAW,KAAK;AAAA,QAC1B,WAAW,OAAO,SAAS,UAAU;AACnC,kBAAQ,WAAW,KAAK;AAAA,QAC1B,OAAO;AACL,kBAAQ,WAAW,OAAO;AAAA,QAC5B;AAAA,MACF;AAEA,cAAQ,MAAM,wBAAwB,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,IACxE;AAEA,SAAK,QAAQ,IAAI,cAAc,iBAAiB,OAAmB,EAAE;AACrE,SAAK,QAAQ,IAAI,kBAAiB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAE1D,UAAM,YAAY,KAAK,aACnB,EAAE,GAAG,MAAM,YAAY,KAAK,WAAW,IACvC;AAEJ,UAAM,WAAW,MAAM,MAAM,KAAK,SAAS;AAE3C,QAAI,eAAe,GAAG;AACpB,YAAM,UAAmC;AAAA,QACvC;AAAA,QACA;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,SAAS,SAAS;AAAA,MACpB;AAEA,cAAQ,MAAM,yBAAyB,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,IACzE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YACJ,SACoD;AACpD,UAAM,YAAY,KAAK;AACvB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX,IAAI;AAEJ,UAAM,UAAU,IAAI,QAAQ;AAE5B,QAAI,KAAK,eAAe;AACtB,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,aAAa,GAAG;AAC9D,gBAAQ,OAAO,MAAM,KAAK;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,eAAe;AACjB,YAAM,uBAAuB,oBAAI,IAAI,CAAC,iBAAiB,cAAc,CAAC;AACtE,YAAM,oBAAoB,CAAC,SAA0B;AACnD,cAAM,QAAQ,KAAK,YAAY;AAC/B,YAAI,qBAAqB,IAAI,KAAK,EAAG,QAAO;AAC5C,eAAO,MAAM,WAAW,MAAM;AAAA,MAChC;AAEA,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,aAAa,GAAG;AACzD,YAAI,CAAC,kBAAkB,IAAI,KAAK,UAAU,QAAW;AACnD,kBAAQ,OAAO,MAAM,KAAK;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,iBAAiB,UAAU,MAAM,KAAK,SAAS,CAAC,EAAE;AAC9D,YAAQ,IAAI,gBAAgB,UAAU,WAAW;AAEjD,UAAM,eAAe,KAAK,oBAAoB;AAC9C,QAAI,cAAc;AAChB,cAAQ,IAAI,qBAAqB,YAAY;AAAA,IAC/C;AAEA,QAAI,gBAAgB;AAClB,cAAQ,IAAI,uBAAuB,cAAc;AAAA,IACnD;AAEA,QAAI,qBAAqB,QAAW;AAClC,cAAQ,IAAI,yBAAyB,iBAAiB,SAAS,CAAC;AAAA,IAClE;AAEA,QAAI,iBAAiB,QAAW;AAC9B,cAAQ,IAAI,qBAAqB,aAAa,SAAS,CAAC;AAAA,IAC1D;AAEA,UAAM,aAAa,UAAU,UAAU,OAAO;AAC9C,UAAM,OAAO,OAAO,SAAS,UAAU,IACnC,IAAI,WAAW,UAAU,IACzB;AAEJ,UAAM,WAAW,MAAM,KAAK,MAAM,KAAK,SAAS,SAAS,GAAG;AAAA,MAC1D,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI;AAAA,UACR,aAAa;AAAA,UACb;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI;AAAA,UACR,aAAa;AAAA,UACb;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI;AAAA,UACR,aAAa;AAAA,QACf;AAAA,MACF;AACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO,EAAE,WAAW,KAAK;AAAA,IAC3B;AAEA,UAAM,eAAgB,MAAM,SAAS,KAAK;AAE1C,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,gBACL,SAC2C;AAC3C,UAAM,YAAY,KAAK;AACvB,UAAM,EAAE,WAAW,eAAe,0BAA0B,MAAM,IAChE;AAEF,QAAI,UAAU,WAAc,QAAQ,KAAK,QAAQ,KAAK;AACpD,YAAM,IAAI,kBAAkB,KAAK;AAAA,IACnC;AAEA,UAAM,UAAU,IAAI,QAAQ;AAAA,MAC1B,eAAe,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,MAC9C,QAAQ;AAAA,MACR,GAAG,KAAK;AAAA,IACV,CAAC;AAED,QAAI,6BAA6B,QAAW;AAC1C,cAAQ;AAAA,QACN;AAAA,QACA,yBAAyB,SAAS;AAAA,MACpC;AAAA,IACF;AAEA,QAAI,UAAU,QAAW;AACvB,cAAQ,IAAI,oBAAoB,MAAM,SAAS,CAAC;AAAA,IAClD;AAEA,UAAM,wBAAwB,KAAK,uBAAuB;AAC1D,QAAI,uBAAuB;AACzB,cAAQ,IAAI,qBAAqB,qBAAqB;AAAA,IACxD;AAEA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,KAAK,SAAS,WAAW,YAAY,aAAa;AAAA,MAClD;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,qBAAiB,wBAAoB,qCAAqB,QAAQ,GAAG;AACnE,UAAI;AACF,cAAM,gBAAgB,kBAAkB,iBAAiB,OAAO;AAEhE,YAAI,CAAC,eAAe;AAClB,kBAAQ,KAAK,kDAAkD;AAC/D,gBAAM,cAAc,iBAAiB,OAAO;AAC5C;AAAA,QACF;AAEA,cAAM,sBAAsB,MAAM,UAAU;AAAA,UAC1C,iBAAiB;AAAA,QACnB;AAEA,cAAM,UAAsB;AAAA,UAC1B,GAAG;AAAA,UACH,SAAS;AAAA,QACX;AAEA,cAAM;AAAA,MACR,SAAS,OAAO;AACd,gBAAQ,KAAK,wCAAwC,KAAK;AAC1D,cAAM,cAAc,iBAAiB,OAAO;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,SACwC;AACxC,UAAM,YAAY,KAAK;AACvB,UAAM,EAAE,WAAW,eAAe,WAAW,yBAAyB,IACpE;AAEF,UAAM,UAAU,IAAI,QAAQ;AAAA,MAC1B,eAAe,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,MAC9C,QAAQ;AAAA,MACR,GAAG,KAAK;AAAA,IACV,CAAC;AAED,QAAI,6BAA6B,QAAW;AAC1C,cAAQ;AAAA,QACN;AAAA,QACA,yBAAyB,SAAS;AAAA,MACpC;AAAA,IACF;AAEA,UAAM,wBAAwB,KAAK,uBAAuB;AAC1D,QAAI,uBAAuB;AACzB,cAAQ,IAAI,qBAAqB,qBAAqB;AAAA,IACxD;AAEA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,KAAK,SAAS,WAAW,YAAY,eAAe,MAAM,SAAS;AAAA,MACnE;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,qBAAqB,SAAS;AAAA,MAC1C;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,YAAI,YAA4D,CAAC;AACjE,YAAI;AACF,sBAAY,KAAK,MAAM,SAAS;AAAA,QAClC,QAAQ;AAAA,QAER;AAEA,YAAI,UAAU,mBAAmB;AAC/B,gBAAM,IAAI;AAAA,YACR;AAAA,YACA,yDAAyD,UAAU,iBAAiB;AAAA,UACtF;AAAA,QACF;AACA,cAAM,IAAI,yBAAyB,SAAS;AAAA,MAC9C;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,6BAA6B,SAAS;AAAA,MAClD;AACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,qBAAiB,wBAAoB,qCAAqB,QAAQ,GAAG;AACnE,YAAM,gBAAgB,kBAAkB,iBAAiB,OAAO;AAEhE,UAAI,CAAC,eAAe;AAClB,cAAM,cAAc,iBAAiB,OAAO;AAC5C,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,sBAAsB,MAAM,UAAU;AAAA,QAC1C,iBAAiB;AAAA,MACnB;AAEA,YAAM,UAAsB;AAAA,QAC1B,GAAG;AAAA,QACH,SAAS;AAAA,MACX;AAEA,aAAO,EAAE,QAAQ;AAAA,IACnB;AAEA,UAAM,IAAI,qBAAqB,SAAS;AAAA,EAC1C;AAAA,EAEA,MAAM,mBACJ,SACqC;AACrC,UAAM,EAAE,WAAW,eAAe,cAAc,IAAI;AAEpD,UAAM,UAAU,IAAI,QAAQ;AAAA,MAC1B,eAAe,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,MAC9C,GAAG,KAAK;AAAA,IACV,CAAC;AAED,UAAM,wBAAwB,KAAK,uBAAuB;AAC1D,QAAI,uBAAuB;AACzB,cAAQ,IAAI,qBAAqB,qBAAqB;AAAA,IACxD;AAEA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,qBAAqB,aAAa;AAAA,MAC9C;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA,aACE;AAAA,QACJ;AAAA,MACF;AACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,cAAc,KAAK;AAAA,EAC9B;AAAA,EAEA,MAAM,iBACJ,SACmC;AACnC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,UAAM,UAAU,IAAI,QAAQ;AAAA,MAC1B,eAAe,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,MAC9C,gBAAgB;AAAA,MAChB,GAAG,KAAK;AAAA,IACV,CAAC;AAED,UAAM,wBAAwB,KAAK,uBAAuB;AAC1D,QAAI,uBAAuB;AACzB,cAAQ,IAAI,qBAAqB,qBAAqB;AAAA,IACxD;AAEA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,yBAAyB,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,qBAAqB,aAAa;AAAA,MAC9C;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA,aACE;AAAA,QACJ;AAAA,MACF;AACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AACF;;;AOppBA,IAAM,aAAa,oBAAI,QAA2B;AAClD,IAAM,iBAAiB,OAAO,IAAI,yBAAyB;AAG3D,SAAS,OAAO,QAAgB,KAAsB;AACpD,aAAW,IAAI,QAAQ,GAAG;AAC1B,SAAO,eAAe,QAAQ,gBAAgB;AAAA,IAC5C,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,OAAO,QAA2B;AACzC,QAAM,MAAM,WAAW,IAAI,MAAM;AACjC,MAAI,KAAK;AACP,WAAO;AAAA,EACT;AAEA,QAAM,gBAAiB,OAAmC,cAAc;AACxE,MAAI,OAAO,kBAAkB,YAAY,kBAAkB,MAAM;AAC/D,UAAM,cAAc;AACpB,eAAW,IAAI,QAAQ,WAAW;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAEF;AACF;AAEA,SAAS,uBAAuB,OAAsC;AACpE,MAAI,aAAa,OAAO;AACtB,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAOO,SAAS,aAAa,QAAgC;AAC3D,SAAO,OAAO,MAAM;AACtB;AAEA,IAAM,iBAA+B;AAErC,SAAS,cAAc,QAAqC;AAC1D,MAAI,OAAQ,QAAO;AAEnB,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,QAAS,QAAO;AAEpB,MAAI,CAAC,UAAU,GAAG;AAChB,YAAQ;AAAA,MACN,2DAAsD,cAAc;AAAA,IAItE;AAAA,EACF;AACA,SAAO;AACT;AAyBO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAY,UAA8B,CAAC,GAAG;AAC5C,UAAM,SAAS,cAAc,QAAQ,MAAM;AAC3C,WAAO,MAAM,IAAI,UAAU,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,OACL,WACA,SACA,YACwB;AACxB,UAAM,MAAM,OAAO,IAAI;AACvB,UAAM,SAAS,MAAM,IAAI,YAAe;AAAA,MACtC,WAAW;AAAA,MACX;AAAA,MACA,gBAAgB,SAAS;AAAA,MACzB,kBAAkB,SAAS;AAAA,MAC3B,cAAc,SAAS;AAAA,MACvB,SAAS,SAAS;AAAA,IACpB,CAAC;AAED,QAAI,OAAO,aAAa,UAAU,GAAG;AACnC;AAAA,QACE;AAAA,QACA,OAAO;AAAA,QACP,IAAI,UAAU;AAAA,QACd,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,OAAO,UAAU;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,iBAAiB,CACf,SACA,YACkE;AAClE,QAAI,UAAU,GAAG;AACf,yBAAmB,SAA2B,MAAM,OAAO;AAAA,IAC7D;AACA,WAAO,OAAO,mBAA4D;AACxE,YAAM,UAAU,uBAAuB,cAAc;AACrD,UAAI,UAAU,KAAK,QAAQ,QAAQ,IAAI,sBAAsB,MAAM,KAAK;AACtE,cAAM,YAAY,QAAQ,QAAQ,IAAI,2BAA2B;AACjE,YAAI,WAAW;AACb;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,eAAO,SAAS,KAAK,EAAE,QAAQ,SAAS,CAAC;AAAA,MAC3C;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,cAAc,OAAO;AAC1C,cAAM,eAAmB,SAAS,QAAQ;AAAA,UACxC,QAAQ;AAAA,UACR,0BAA0B,SAAS;AAAA,UACnC,OAAO,SAAS;AAAA,QAClB,CAAC;AACD,eAAO,SAAS,KAAK,EAAE,QAAQ,UAAU,CAAC;AAAA,MAC5C,SAAS,OAAO;AACd,gBAAQ,MAAM,yBAAyB,KAAK;AAE5C,YACE,iBAAiB,UAChB,MAAM,QAAQ,SAAS,sBAAsB,KAC5C,MAAM,QAAQ,SAAS,oBAAoB,KAC3C,MAAM,QAAQ,SAAS,6BAA6B,KACpD,MAAM,QAAQ,SAAS,4BAA4B,KACnD,MAAM,QAAQ,SAAS,sBAAsB,IAC/C;AACA,iBAAO,SAAS,KAAK,EAAE,OAAO,MAAM,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,QAChE;AAEA,eAAO,SAAS;AAAA,UACd,EAAE,OAAO,kCAAkC;AAAA,UAC3C,EAAE,QAAQ,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,qBAAqB,CACnB,SACA,YAWqB;AACrB,QAAI,UAAU,GAAG;AACf,yBAAmB,SAA2B,MAAM,OAAO;AAAA,IAC7D;AACA,WAAO,OAAO,KAAK,QAAQ;AACzB,UAAI,IAAI,WAAW,QAAQ;AACzB,YAAI,OAAO,GAAG,EAAE,IAAI;AACpB;AAAA,MACF;AAEA,YAAM,cAAc,IAAI,QAAQ,sBAAsB;AACtD,UAAI,UAAU,KAAK,gBAAgB,KAAK;AACtC,cAAM,kBAAkB,IAAI,QAAQ,2BAA2B;AAC/D,cAAM,YAAY,MAAM,QAAQ,eAAe,IAC3C,gBAAgB,CAAC,IACjB;AACJ,YAAI,WAAW;AACb;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,SAAS,CAAC;AACzC;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,iBAAiB,IAAI,MAAM,IAAI,OAAO;AACrD,cAAM,eAAmB,SAAS,QAAQ;AAAA,UACxC,QAAQ;AAAA,UACR,0BAA0B,SAAS;AAAA,UACnC,OAAO,SAAS;AAAA,QAClB,CAAC;AACD,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,UAAU,CAAC;AAAA,MAC5C,SAAS,OAAO;AACd,gBAAQ,MAAM,yBAAyB,KAAK;AAE5C,YACE,iBAAiB,UAChB,MAAM,QAAQ,SAAS,sBAAsB,KAC5C,MAAM,QAAQ,SAAS,oBAAoB,KAC3C,MAAM,QAAQ,SAAS,6BAA6B,KACpD,MAAM,QAAQ,SAAS,4BAA4B,KACnD,MAAM,QAAQ,SAAS,sBAAsB,IAC/C;AACA,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAC7C;AAAA,QACF;AAEA,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kCAAkC,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF;AAsBO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAAY,SAAoC;AAC9C,WAAO,MAAM,IAAI,UAAU,OAAO,CAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,OACL,WACA,SACA,YACwB;AACxB,UAAM,MAAM,OAAO,IAAI;AACvB,UAAM,SAAS,MAAM,IAAI,YAAe;AAAA,MACtC,WAAW;AAAA,MACX;AAAA,MACA,gBAAgB,SAAS;AAAA,MACzB,kBAAkB,SAAS;AAAA,MAC3B,cAAc,SAAS;AAAA,MACvB,SAAS,SAAS;AAAA,IACpB,CAAC;AAED,WAAO,EAAE,WAAW,OAAO,UAAU;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,UAAU,OACR,WACA,eACA,SACA,YAC2B;AAC3B,UAAM,MAAM,OAAO,IAAI;AACvB,UAAM,QAAQ,IAAI,MAAS,KAAK,SAAS;AACzC,UAAM,2BACJ,WAAW,8BAA8B,UACrC,QAAQ,2BACR;AACN,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,6BAA6B,SACzB,EAAE,yBAAyB,IAC3B,CAAC;AAAA,IACP;AAEA,QAAI;AACF,UAAI;AACJ,YAAM,QAAQ,SAAS;AACvB,UAAI,WAAW,eAAe,SAAS;AACrC,gBAAQ,MAAM,SAAS,QAAQ,SAAS;AAAA,UACtC,WAAW,QAAQ;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,QACJ,WAAW,WAAW,UACjB,QAAgC,QACjC;AACN,gBAAQ,MAAM,SAAS,QAAQ,SAAS;AAAA,UACtC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,UACvC;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,GAAG;AACf,eAAO,EAAE,IAAI,OAAO,QAAQ,QAAQ;AAAA,MACtC;AACA,aAAO,EAAE,IAAI,KAAK;AAAA,IACpB,SAAS,OAAO;AACd,UACE,WACA,eAAe,WACf,iBAAiB,sBACjB;AACA,eAAO,EAAE,IAAI,OAAO,QAAQ,aAAa,WAAW,QAAQ,UAAU;AAAA,MACxE;AACA,UACE,WACA,eAAe,WACf,iBAAiB,0BACjB;AACA,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AACA,UACE,WACA,eAAe,WACf,iBAAiB,8BACjB;AACA,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;ACtdA,IAAI;AAEJ,SAAS,mBAAgC;AACvC,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,YAAY;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,QAAoC;AACzD,MAAI,CAAC,OAAQ,QAAO,iBAAiB;AACrC,SAAO,IAAI,YAAY,EAAE,OAAO,CAAC;AACnC;AAqBA,eAAsB,KACpB,WACA,SACA,SACqB;AACrB,SAAO,cAAc,SAAS,MAAM,EAAE,KAAK,WAAW,SAAS,OAAO;AACxE;AAwBO,SAASC,gBACd,SACA,SAI6D;AAC7D,SAAO,iBAAiB,EAAE,eAAe,SAAS,OAAO;AAC3D;","names":["handleCallback","resolve","pc","relative","resolve","path","handleCallback"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/transports.ts","../src/api-client.ts","../src/dev.ts","../src/types.ts","../src/consumer-group.ts","../src/topic.ts","../src/callback.ts","../src/oidc.ts","../src/client.ts","../src/default-client.ts"],"sourcesContent":["// Transport classes for customizable serialization\nexport { BufferTransport, JsonTransport, StreamTransport } from \"./transports\";\n\n// The main clients\nexport { PollingQueueClient, QueueClient } from \"./client\";\n\n// Top-level convenience functions (lazy default client, auto-detects region)\nexport { handleCallback, send } from \"./default-client\";\n\n// Callback parsing utilities (for custom framework integrations)\nexport {\n CLOUD_EVENT_TYPE_V1BETA,\n CLOUD_EVENT_TYPE_V2BETA,\n parseCallback,\n parseRawCallback,\n} from \"./callback\";\nexport type {\n ParsedCallbackRequest,\n ParsedCallbackV1,\n ParsedCallbackV2,\n} from \"./callback\";\n\n// Error classes\nexport {\n BadRequestError,\n ConsumerDiscoveryError,\n ConsumerRegistryNotConfiguredError,\n DuplicateMessageError,\n ForbiddenError,\n InternalServerError,\n InvalidLimitError,\n MessageAlreadyProcessedError,\n MessageCorruptedError,\n MessageLockedError,\n MessageNotAvailableError,\n MessageNotFoundError,\n QueueEmptyError,\n UnauthorizedError,\n} from \"./types\";\n\n// Shared types\nexport type {\n BaseUrlResolver,\n Message,\n MessageHandler,\n MessageMetadata,\n PollingQueueClientOptions,\n QueueClientOptions,\n ReceiveBatchOptions,\n ReceiveByIdOptions,\n ReceiveOptions,\n ReceiveResult,\n RetryDirective,\n RetryHandler,\n SendOptions,\n SendResult,\n Transport,\n VercelRegion,\n} from \"./types\";\n","/**\n * Serializer/Deserializer interface for message payloads.\n *\n * Built-in implementations:\n * - `JsonTransport` - JSON serialization (default, buffers entire payload)\n * - `BufferTransport` - Binary data (buffers entire payload)\n * - `StreamTransport` - Pass-through streaming (no buffering, ideal for large payloads)\n */\nexport interface Transport<T = unknown> {\n /**\n * Serialize a value to a buffer or stream for transmission.\n * The result is sent as the request body with the `contentType` header.\n */\n serialize(value: T): Buffer | ReadableStream<Uint8Array>;\n\n /**\n * Deserialize a readable stream back to the original value.\n * Called when receiving messages from the queue.\n */\n deserialize(stream: ReadableStream<Uint8Array>): Promise<T>;\n\n /**\n * Optional cleanup method for deserialized payloads that may contain resources.\n * Called automatically by ConsumerGroup on error; manual cleanup required for direct client usage.\n * @param payload The deserialized payload to clean up\n */\n finalize?(payload: T): Promise<void>;\n\n /**\n * MIME type for this serialization format.\n * Sent as the Content-Type header when publishing messages.\n */\n contentType: string;\n}\n\nasync function streamToBuffer(\n stream: ReadableStream<Uint8Array>,\n): Promise<Buffer> {\n let totalLength = 0;\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n } finally {\n reader.releaseLock();\n }\n\n // Combine chunks into a single buffer\n return Buffer.concat(chunks, totalLength);\n}\n\n/**\n * JSON serializer/deserializer (default transport).\n *\n * Ideal for structured data. Buffers the entire payload in memory for parsing.\n *\n * @example\n * ```typescript\n * // Default (JsonTransport is used automatically)\n * const queue = new QueueClient();\n * await queue.send(\"topic\", { data: \"example\" });\n *\n * // With custom serialization\n * const queue = new QueueClient({\n * transport: new JsonTransport({\n * replacer: (key, value) => key === \"password\" ? undefined : value,\n * reviver: (key, value) => key === \"date\" ? new Date(value) : value,\n * }),\n * });\n * await queue.send(\"topic\", { data: \"example\" });\n * ```\n */\nexport class JsonTransport<T = unknown> implements Transport<T> {\n readonly contentType = \"application/json\";\n readonly replacer?: Parameters<typeof JSON.stringify>[1];\n readonly reviver?: Parameters<typeof JSON.parse>[1];\n\n /**\n * Create a new JsonTransport.\n * @param options - Optional JSON serialization options\n * @param options.replacer - Custom replacer for JSON.stringify\n * @param options.reviver - Custom reviver for JSON.parse\n */\n constructor(\n options: {\n replacer?: Parameters<typeof JSON.stringify>[1];\n reviver?: Parameters<typeof JSON.parse>[1];\n } = {},\n ) {\n this.replacer = options.replacer;\n this.reviver = options.reviver;\n }\n\n serialize(value: T): Buffer {\n return Buffer.from(JSON.stringify(value, this.replacer), \"utf8\");\n }\n\n async deserialize(stream: ReadableStream<Uint8Array>): Promise<T> {\n const buffer = await streamToBuffer(stream);\n return JSON.parse(buffer.toString(\"utf8\"), this.reviver);\n }\n}\n\n/**\n * Binary data serializer/deserializer.\n *\n * Ideal for binary data that fits in memory. Buffers the entire payload.\n *\n * @example\n * ```typescript\n * const queue = new QueueClient({ transport: new BufferTransport() });\n * await queue.send(\"binary-topic\", myBuffer);\n * ```\n */\nexport class BufferTransport implements Transport<Buffer> {\n readonly contentType = \"application/octet-stream\";\n\n serialize(value: Buffer): Buffer {\n return value;\n }\n\n async deserialize(stream: ReadableStream<Uint8Array>): Promise<Buffer> {\n return await streamToBuffer(stream);\n }\n}\n\n/**\n * Pass-through stream serializer/deserializer.\n *\n * Ideal for large files and real-time streams. Does not buffer data in memory.\n *\n * **Important:** When using StreamTransport, you must call `finalize(payload)` when done\n * processing to prevent resource leaks. ConsumerGroup handles this automatically;\n * direct client usage requires manual cleanup.\n *\n * @example\n * ```typescript\n * // Sending a stream\n * const queue = new QueueClient({ transport: new StreamTransport() });\n * await queue.send(\"large-file\", myReadableStream);\n *\n * // Receiving - cleanup handled automatically\n * const poller = new PollingQueueClient({ region: \"iad1\", transport: new StreamTransport() });\n * await poller.receive(\"large-file\", \"processor\", async (stream, meta) => {\n * const reader = stream.getReader();\n * // Process chunks...\n * });\n * ```\n */\nexport class StreamTransport implements Transport<ReadableStream<Uint8Array>> {\n readonly contentType = \"application/octet-stream\";\n\n serialize(value: ReadableStream<Uint8Array>): ReadableStream<Uint8Array> {\n return value;\n }\n\n async deserialize(\n stream: ReadableStream<Uint8Array>,\n ): Promise<ReadableStream<Uint8Array>> {\n return stream;\n }\n\n /**\n * Consume any remaining stream data to prevent resource leaks.\n * Called automatically by ConsumerGroup; manual call required for direct client usage.\n */\n async finalize(payload: ReadableStream<Uint8Array>): Promise<void> {\n const reader = payload.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","declare const __PACKAGE_VERSION__: string;\n\nimport { parseMultipartStream } from \"mixpart\";\nimport { isDevMode } from \"./dev\";\nimport { getVercelOidcToken } from \"./oidc\";\nimport { JsonTransport } from \"./transports\";\nimport type { Transport } from \"./transports\";\nimport type {\n BaseUrlResolver,\n ChangeVisibilityOptions,\n ChangeVisibilityResponse,\n AcknowledgeMessageOptions,\n AcknowledgeMessageResponse,\n Message,\n QueueClientOptions,\n ReceiveMessageByIdOptions,\n ReceiveMessageByIdResponse,\n ReceiveMessagesOptions,\n SendMessageOptions,\n SendMessageResponse,\n VercelRegion,\n} from \"./types\";\nimport {\n BadRequestError,\n ConsumerDiscoveryError,\n ConsumerRegistryNotConfiguredError,\n DuplicateMessageError,\n ForbiddenError,\n InternalServerError,\n InvalidLimitError,\n MessageAlreadyProcessedError,\n MessageCorruptedError,\n MessageNotAvailableError,\n MessageNotFoundError,\n UnauthorizedError,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n return (\n process.env.VERCEL_QUEUE_DEBUG === \"1\" ||\n process.env.VERCEL_QUEUE_DEBUG === \"true\"\n );\n}\n\nasync function consumeStream(\n stream: ReadableStream<Uint8Array>,\n): Promise<void> {\n const reader = stream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction throwCommonHttpError(\n status: number,\n statusText: string,\n errorText: string,\n operation: string,\n badRequestDefault: string = \"Invalid parameters\",\n): never {\n if (status === 400) {\n throw new BadRequestError(errorText || badRequestDefault);\n }\n if (status === 401) {\n throw new UnauthorizedError(errorText || undefined);\n }\n if (status === 403) {\n throw new ForbiddenError(errorText || undefined);\n }\n if (status >= 500) {\n throw new InternalServerError(\n errorText || `Server error: ${status} ${statusText}`,\n );\n }\n throw new Error(`Failed to ${operation}: ${status} ${statusText}`);\n}\n\nfunction parseQueueHeaders(\n headers: Headers,\n): Omit<Message<unknown>, \"payload\"> | null {\n const messageId = headers.get(\"Vqs-Message-Id\");\n const deliveryCountStr = headers.get(\"Vqs-Delivery-Count\") || \"0\";\n const timestamp = headers.get(\"Vqs-Timestamp\");\n const contentType = headers.get(\"Content-Type\") || \"application/octet-stream\";\n const receiptHandle = headers.get(\"Vqs-Receipt-Handle\");\n const expiresAtStr = headers.get(\"Vqs-Expires-At\");\n\n if (!messageId || !timestamp || !receiptHandle) {\n return null;\n }\n\n const deliveryCount = parseInt(deliveryCountStr, 10);\n if (Number.isNaN(deliveryCount)) {\n return null;\n }\n\n return {\n messageId,\n deliveryCount,\n createdAt: new Date(timestamp),\n expiresAt: expiresAtStr ? new Date(expiresAtStr) : undefined,\n contentType,\n receiptHandle,\n };\n}\n\nconst DEFAULT_BASE_URL_RESOLVER: BaseUrlResolver = (region) =>\n new URL(`https://${region}.vercel-queue.com`);\n\nfunction resolveBaseUrl(\n region: string,\n resolver: BaseUrlResolver | undefined,\n): URL {\n return (resolver ?? DEFAULT_BASE_URL_RESOLVER)(region);\n}\n\nconst BASE_PATH = \"/api/v3/topic\";\n\nexport class ApiClient {\n private baseUrl: URL;\n private customHeaders: Record<string, string>;\n private providedToken?: string;\n private resolvedDeploymentId?: string;\n private pinSends: boolean;\n private explicitlyUnpinned: boolean;\n private transport: Transport;\n private region: string;\n private baseUrlResolver: BaseUrlResolver | undefined;\n private dispatcher: unknown | undefined;\n\n constructor(options: QueueClientOptions & { region: VercelRegion }) {\n this.region = options.region;\n this.baseUrlResolver = options.resolveBaseUrl;\n this.baseUrl = resolveBaseUrl(this.region, this.baseUrlResolver);\n this.customHeaders = options.headers || {};\n this.providedToken = options.token;\n this.transport = options.transport || new JsonTransport();\n this.dispatcher = options.dispatcher;\n\n if (options.deploymentId === null) {\n this.pinSends = false;\n this.explicitlyUnpinned = true;\n } else {\n this.resolvedDeploymentId =\n options.deploymentId || process.env.VERCEL_DEPLOYMENT_ID;\n this.pinSends = true;\n this.explicitlyUnpinned = false;\n }\n }\n\n /**\n * Return a new ApiClient targeting the given region, sharing all other\n * configuration (token, transport, headers, deployment ID, resolver).\n * Used internally by handleCallback to route follow-up API calls to the\n * region indicated by the incoming `ce-vqsregion` header.\n */\n withRegion(region: string): ApiClient {\n return new ApiClient({\n region,\n resolveBaseUrl: this.baseUrlResolver,\n token: this.providedToken,\n headers: { ...this.customHeaders },\n deploymentId: this.explicitlyUnpinned ? null : this.resolvedDeploymentId,\n transport: this.transport,\n dispatcher: this.dispatcher,\n });\n }\n\n getRegion(): string {\n return this.region;\n }\n\n getTransport(): Transport {\n return this.transport;\n }\n\n private requireDeploymentId(): void {\n if (isDevMode() || this.explicitlyUnpinned || this.resolvedDeploymentId) {\n return;\n }\n throw new Error(\n \"No deployment ID available. VERCEL_DEPLOYMENT_ID is not set.\\n\\n\" +\n \"This usually means the code is running outside a Vercel deployment \" +\n \"(e.g. during build or in a non-Vercel environment).\\n\\n\" +\n \"To fix this, create a client with an explicit deploymentId:\\n\" +\n ' new QueueClient({ deploymentId: \"dpl_xxx\" })\\n' +\n \"Or explicitly opt out of deployment pinning:\\n\" +\n \" new QueueClient({ deploymentId: null })\",\n );\n }\n\n private getSendDeploymentId(): string | undefined {\n if (isDevMode()) {\n return undefined;\n }\n this.requireDeploymentId();\n return this.pinSends ? this.resolvedDeploymentId : undefined;\n }\n\n private getConsumeDeploymentId(): string | undefined {\n if (isDevMode()) {\n return undefined;\n }\n this.requireDeploymentId();\n return this.resolvedDeploymentId;\n }\n\n private async getToken(): Promise<string> {\n if (this.providedToken) {\n return this.providedToken;\n }\n\n try {\n return await getVercelOidcToken();\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err);\n throw new Error(\n isDevMode()\n ? \"Failed to get OIDC token for local development.\\n\\n\" +\n \"To fix this, pull your environment variables with Vercel CLI:\\n\" +\n \" `vercel env pull`\\n\\n\" +\n `Cause: ${cause}`\n : \"Failed to get OIDC token. This usually means the function is running \" +\n \"outside of a Vercel Function environment.\\n\\n\" +\n \"To fix this, either:\\n\" +\n \" - Deploy to Vercel (OIDC tokens are provisioned automatically)\\n\" +\n \" - Provide a token explicitly: `new QueueClient({ token: '...' })`\\n\\n\" +\n `Cause: ${cause}`,\n );\n }\n }\n\n private buildUrl(queueName: string, ...pathSegments: string[]): string {\n const encodedQueue = encodeURIComponent(queueName);\n const segments = pathSegments.map((s) => encodeURIComponent(s));\n const path = segments.length > 0 ? \"/\" + segments.join(\"/\") : \"\";\n const basePath = this.baseUrl.pathname.replace(/\\/+$/, \"\");\n return `${this.baseUrl.origin}${basePath}${BASE_PATH}/${encodedQueue}${path}`;\n }\n\n private async fetch(\n url: string,\n init: RequestInit & { headers: Headers },\n ): Promise<Response> {\n const method = init.method || \"GET\";\n\n if (isDebugEnabled()) {\n const logData: Record<string, unknown> = {\n method,\n url,\n headers: init.headers,\n };\n\n const body = init.body;\n if (body !== undefined && body !== null) {\n if (body instanceof ArrayBuffer) {\n logData.bodySize = body.byteLength;\n } else if (body instanceof Uint8Array) {\n logData.bodySize = body.byteLength;\n } else if (typeof body === \"string\") {\n logData.bodySize = body.length;\n } else {\n logData.bodyType = typeof body;\n }\n }\n\n console.debug(\"[VQS Debug] Request:\", JSON.stringify(logData, null, 2));\n }\n\n init.headers.set(\"User-Agent\", `@vercel/queue/${__PACKAGE_VERSION__}`);\n init.headers.set(\"Vqs-Client-Ts\", new Date().toISOString());\n\n const fetchInit = this.dispatcher\n ? { ...init, dispatcher: this.dispatcher }\n : init;\n // @ts-expect-error dispatcher is not in @types/node RequestInit but supported at runtime\n const response = await fetch(url, fetchInit);\n\n if (isDebugEnabled()) {\n const logData: Record<string, unknown> = {\n method,\n url,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n\n console.debug(\"[VQS Debug] Response:\", JSON.stringify(logData, null, 2));\n }\n\n return response;\n }\n\n async sendMessage<T = unknown>(\n options: SendMessageOptions<T>,\n ): Promise<SendMessageResponse | { messageId: null }> {\n const transport = this.transport as Transport<T>;\n const {\n queueName,\n payload,\n idempotencyKey,\n retentionSeconds,\n delaySeconds,\n headers: optionHeaders,\n } = options;\n\n const headers = new Headers();\n\n if (this.customHeaders) {\n for (const [name, value] of Object.entries(this.customHeaders)) {\n headers.append(name, value);\n }\n }\n\n if (optionHeaders) {\n const protectedHeaderNames = new Set([\"authorization\", \"content-type\"]);\n const isProtectedHeader = (name: string): boolean => {\n const lower = name.toLowerCase();\n if (protectedHeaderNames.has(lower)) return true;\n return lower.startsWith(\"vqs-\");\n };\n\n for (const [name, value] of Object.entries(optionHeaders)) {\n if (!isProtectedHeader(name) && value !== undefined) {\n headers.append(name, value);\n }\n }\n }\n\n headers.set(\"Authorization\", `Bearer ${await this.getToken()}`);\n headers.set(\"Content-Type\", transport.contentType);\n\n const deploymentId = this.getSendDeploymentId();\n if (deploymentId) {\n headers.set(\"Vqs-Deployment-Id\", deploymentId);\n }\n\n if (idempotencyKey) {\n headers.set(\"Vqs-Idempotency-Key\", idempotencyKey);\n }\n\n if (retentionSeconds !== undefined) {\n headers.set(\"Vqs-Retention-Seconds\", retentionSeconds.toString());\n }\n\n if (delaySeconds !== undefined) {\n headers.set(\"Vqs-Delay-Seconds\", delaySeconds.toString());\n }\n\n const serialized = transport.serialize(payload);\n const body = Buffer.isBuffer(serialized)\n ? new Uint8Array(serialized)\n : serialized;\n\n const response = await this.fetch(this.buildUrl(queueName), {\n method: \"POST\",\n body,\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 409) {\n throw new DuplicateMessageError(\n errorText || \"Duplicate idempotency key detected\",\n idempotencyKey,\n );\n }\n if (response.status === 502) {\n throw new ConsumerDiscoveryError(\n errorText || \"Consumer discovery failed\",\n deploymentId,\n );\n }\n if (response.status === 503) {\n throw new ConsumerRegistryNotConfiguredError(\n errorText || \"Consumer registry not configured\",\n );\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"send message\",\n );\n }\n\n if (response.status === 202) {\n return { messageId: null };\n }\n\n const responseData = (await response.json()) as SendMessageResponse;\n\n return responseData;\n }\n\n async *receiveMessages<T = unknown>(\n options: ReceiveMessagesOptions<T>,\n ): AsyncGenerator<Message<T>, void, unknown> {\n const transport = this.transport as Transport<T>;\n const { queueName, consumerGroup, visibilityTimeoutSeconds, limit } =\n options;\n\n if (limit !== undefined && (limit < 1 || limit > 10)) {\n throw new InvalidLimitError(limit);\n }\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n Accept: \"multipart/mixed\",\n ...this.customHeaders,\n });\n\n if (visibilityTimeoutSeconds !== undefined) {\n headers.set(\n \"Vqs-Visibility-Timeout-Seconds\",\n visibilityTimeoutSeconds.toString(),\n );\n }\n\n if (limit !== undefined) {\n headers.set(\"Vqs-Max-Messages\", limit.toString());\n }\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(queueName, \"consumer\", consumerGroup),\n {\n method: \"POST\",\n headers,\n },\n );\n\n if (response.status === 204) {\n return;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"receive messages\",\n );\n }\n\n for await (const multipartMessage of parseMultipartStream(response)) {\n try {\n const parsedHeaders = parseQueueHeaders(multipartMessage.headers);\n\n if (!parsedHeaders) {\n console.warn(\"Missing required queue headers in multipart part\");\n await consumeStream(multipartMessage.payload);\n continue;\n }\n\n const deserializedPayload = await transport.deserialize(\n multipartMessage.payload,\n );\n\n const message: Message<T> = {\n ...parsedHeaders,\n payload: deserializedPayload,\n };\n\n yield message;\n } catch (error) {\n console.warn(\"Failed to process multipart message:\", error);\n await consumeStream(multipartMessage.payload);\n }\n }\n }\n\n async receiveMessageById<T = unknown>(\n options: ReceiveMessageByIdOptions<T>,\n ): Promise<ReceiveMessageByIdResponse<T>> {\n const transport = this.transport as Transport<T>;\n const { queueName, consumerGroup, messageId, visibilityTimeoutSeconds } =\n options;\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n Accept: \"multipart/mixed\",\n ...this.customHeaders,\n });\n\n if (visibilityTimeoutSeconds !== undefined) {\n headers.set(\n \"Vqs-Visibility-Timeout-Seconds\",\n visibilityTimeoutSeconds.toString(),\n );\n }\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(queueName, \"consumer\", consumerGroup, \"id\", messageId),\n {\n method: \"POST\",\n headers,\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 404) {\n throw new MessageNotFoundError(messageId);\n }\n if (response.status === 409) {\n let errorData: { error?: string; originalMessageId?: string } = {};\n try {\n errorData = JSON.parse(errorText);\n } catch {\n // ignore parse errors\n }\n\n if (errorData.originalMessageId) {\n throw new MessageNotAvailableError(\n messageId,\n `This message was a duplicate - use originalMessageId: ${errorData.originalMessageId}`,\n );\n }\n throw new MessageNotAvailableError(messageId);\n }\n if (response.status === 410) {\n throw new MessageAlreadyProcessedError(messageId);\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"receive message by ID\",\n );\n }\n\n for await (const multipartMessage of parseMultipartStream(response)) {\n const parsedHeaders = parseQueueHeaders(multipartMessage.headers);\n\n if (!parsedHeaders) {\n await consumeStream(multipartMessage.payload);\n throw new MessageCorruptedError(\n messageId,\n \"Missing required queue headers in response\",\n );\n }\n\n const deserializedPayload = await transport.deserialize(\n multipartMessage.payload,\n );\n\n const message: Message<T> = {\n ...parsedHeaders,\n payload: deserializedPayload,\n };\n\n return { message };\n }\n\n throw new MessageNotFoundError(messageId);\n }\n\n async acknowledgeMessage(\n options: AcknowledgeMessageOptions,\n ): Promise<AcknowledgeMessageResponse> {\n const { queueName, consumerGroup, receiptHandle } = options;\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n ...this.customHeaders,\n });\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(\n queueName,\n \"consumer\",\n consumerGroup,\n \"lease\",\n receiptHandle,\n ),\n {\n method: \"DELETE\",\n headers,\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 404) {\n throw new MessageNotFoundError(receiptHandle);\n }\n if (response.status === 409) {\n throw new MessageNotAvailableError(\n receiptHandle,\n errorText ||\n \"Invalid receipt handle, message not in correct state, or already processed\",\n );\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"acknowledge message\",\n \"Missing or invalid receipt handle\",\n );\n }\n\n return { acknowledged: true };\n }\n\n async changeVisibility(\n options: ChangeVisibilityOptions,\n ): Promise<ChangeVisibilityResponse> {\n const {\n queueName,\n consumerGroup,\n receiptHandle,\n visibilityTimeoutSeconds,\n } = options;\n\n const headers = new Headers({\n Authorization: `Bearer ${await this.getToken()}`,\n \"Content-Type\": \"application/json\",\n ...this.customHeaders,\n });\n\n const effectiveDeploymentId = this.getConsumeDeploymentId();\n if (effectiveDeploymentId) {\n headers.set(\"Vqs-Deployment-Id\", effectiveDeploymentId);\n }\n\n const response = await this.fetch(\n this.buildUrl(\n queueName,\n \"consumer\",\n consumerGroup,\n \"lease\",\n receiptHandle,\n ),\n {\n method: \"PATCH\",\n headers,\n body: JSON.stringify({ visibilityTimeoutSeconds }),\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 404) {\n throw new MessageNotFoundError(receiptHandle);\n }\n if (response.status === 409) {\n throw new MessageNotAvailableError(\n receiptHandle,\n errorText ||\n \"Invalid receipt handle, message not in correct state, or already processed\",\n );\n }\n throwCommonHttpError(\n response.status,\n response.statusText,\n errorText,\n \"change visibility\",\n \"Missing receipt handle or invalid visibility timeout\",\n );\n }\n\n return { success: true };\n }\n}\n","/**\n * Development mode utilities for local queue compatibility.\n *\n * Key behaviors:\n * - Discovers queue routes from vercel.json experimentalTriggers config\n * - Registers handlers via handleCallback/handleNodeCallback at module load time\n * - On send(), invokes registered handlers directly (no HTTP round-trip)\n * - First delivery uses the production coreHandleCallback code path\n * - Re-deliveries (retries) call the handler directly for fast local iteration\n */\nimport * as fs from \"node:fs\";\nimport * as net from \"node:net\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport pc from \"picocolors\";\nimport { matchesWildcardPattern } from \"./callback\";\nimport { handleCallback as coreHandleCallback } from \"./callback\";\nimport type { HandleCallbackOptions } from \"./callback\";\nimport { MessageNotFoundError } from \"./types\";\nimport type {\n MessageHandler,\n MessageMetadata,\n RetryDirective,\n RetryHandler,\n} from \"./types\";\nimport type { QueueClient } from \"./client\";\n\nconst PREFIX = pc.cyan(\"[queue]\");\nconst OK = pc.green(\"✓\");\nconst FAIL = pc.red(\"✗\");\nconst RETRY = pc.yellow(\"↻\");\n\n// ---------------------------------------------------------------------------\n// Dev mode check\n// ---------------------------------------------------------------------------\n\nexport function isDevMode(): boolean {\n return process.env.NODE_ENV === \"development\";\n}\n\n// ---------------------------------------------------------------------------\n// vercel.json route mappings\n// ---------------------------------------------------------------------------\n\nconst ROUTE_MAPPINGS_KEY = Symbol.for(\"@vercel/queue.devRouteMappings\");\n\ninterface DevRouteMapping {\n filePath: string;\n topic: string;\n consumer: string;\n retryAfterSeconds?: number;\n}\n\n/**\n * Convert a file path to a consumer group name using mnemonic escapes.\n * Matches the encoding from @vercel/build-utils sanitizeConsumerName:\n * _ → __, / → _S, . → _D, other invalid chars → _XX (hex code)\n */\nfunction filePathToConsumerGroup(filePath: string): string {\n let result = \"\";\n for (const char of filePath) {\n if (char === \"_\") {\n result += \"__\";\n } else if (char === \"/\") {\n result += \"_S\";\n } else if (char === \".\") {\n result += \"_D\";\n } else if (/[A-Za-z0-9-]/.test(char)) {\n result += char;\n } else {\n result +=\n \"_\" + char.charCodeAt(0).toString(16).toUpperCase().padStart(2, \"0\");\n }\n }\n return result;\n}\n\nfunction getDevRouteMappings(): DevRouteMapping[] | null {\n const g = globalThis as typeof globalThis & {\n [ROUTE_MAPPINGS_KEY]?: DevRouteMapping[] | null;\n };\n\n if (ROUTE_MAPPINGS_KEY in g) {\n return g[ROUTE_MAPPINGS_KEY] ?? null;\n }\n\n try {\n const vercelJsonPath = path.join(process.cwd(), \"vercel.json\");\n if (!fs.existsSync(vercelJsonPath)) {\n g[ROUTE_MAPPINGS_KEY] = null;\n return null;\n }\n\n const vercelJson = JSON.parse(fs.readFileSync(vercelJsonPath, \"utf-8\")) as {\n functions?: {\n [filePath: string]: {\n experimentalTriggers?: Array<{\n type: string;\n topic?: string;\n retryAfterSeconds?: number;\n }>;\n };\n };\n };\n\n if (!vercelJson.functions) {\n g[ROUTE_MAPPINGS_KEY] = null;\n return null;\n }\n\n const mappings: DevRouteMapping[] = [];\n\n for (const [filePath, config] of Object.entries(vercelJson.functions)) {\n if (!config.experimentalTriggers) continue;\n\n for (const trigger of config.experimentalTriggers) {\n if (!trigger.type?.startsWith(\"queue/\") || !trigger.topic) continue;\n\n if (trigger.type !== \"queue/v2beta\") {\n console.warn(\n `${PREFIX} Unsupported trigger type \"${trigger.type}\" for ` +\n `topic \"${trigger.topic}\" in ${filePath}. ` +\n `Use \"queue/v2beta\" instead.`,\n );\n continue;\n }\n\n mappings.push({\n filePath,\n topic: trigger.topic,\n consumer: filePathToConsumerGroup(filePath),\n retryAfterSeconds: trigger.retryAfterSeconds,\n });\n }\n }\n\n g[ROUTE_MAPPINGS_KEY] = mappings.length > 0 ? mappings : null;\n return g[ROUTE_MAPPINGS_KEY];\n } catch (error) {\n console.warn(`${PREFIX} Failed to read vercel.json:`, error);\n g[ROUTE_MAPPINGS_KEY] = null;\n return null;\n }\n}\n\nfunction findMatchingRoutes(topicName: string): DevRouteMapping[] {\n const mappings = getDevRouteMappings();\n if (!mappings) return [];\n\n return mappings.filter((mapping) => {\n if (mapping.topic.includes(\"*\")) {\n return matchesWildcardPattern(topicName, mapping.topic);\n }\n return mapping.topic === topicName;\n });\n}\n\nfunction findRetryAfterSeconds(\n topicName: string,\n consumerGroup: string,\n): number | undefined {\n const routes = findMatchingRoutes(topicName);\n const route = routes.find((r) => r.consumer === consumerGroup);\n return route?.retryAfterSeconds;\n}\n\n/**\n * Strip `src/` prefix from framework directories so that e.g.\n * `src/app/api/route.ts` can match a vercel.json key `app/api/route.ts`.\n */\nfunction stripSrcPrefix(filePath: string): string | null {\n if (/^src\\/(app|pages|server)\\//.test(filePath)) {\n return filePath.slice(4); // remove \"src/\"\n }\n return null;\n}\n\n/**\n * Test whether a source file path matches a vercel.json functions key.\n * Uses exact match + minimatch (glob), matching @vercel/build-utils behavior.\n */\nfunction matchesFunctionsPattern(sourceFile: string, pattern: string): boolean {\n return sourceFile === pattern || minimatch(sourceFile, pattern);\n}\n\n/**\n * Find vercel.json route mappings for a given file path.\n * Tries both the literal relative path and — when the file lives under\n * `src/` — the `src/`-stripped variant so that users can write either\n * `\"app/api/route.ts\"` or `\"src/app/api/route.ts\"` in vercel.json.\n *\n * Also supports glob patterns (e.g. `\"api/** /*.ts\"`) via minimatch,\n * matching @vercel/build-utils getLambdaOptionsFromFunction behavior.\n */\nfunction findMappingsForFile(absolutePath: string): DevRouteMapping[] {\n const mappings = getDevRouteMappings();\n if (!mappings) return [];\n\n const cwd = process.cwd();\n let relative: string;\n try {\n relative = path.relative(cwd, absolutePath);\n } catch {\n return [];\n }\n const normalized = relative.replace(/\\\\/g, \"/\");\n const stripped = stripSrcPrefix(normalized);\n\n return mappings.filter(\n (m) =>\n matchesFunctionsPattern(normalized, m.filePath) ||\n (stripped !== null && matchesFunctionsPattern(stripped, m.filePath)),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Caller file path extraction (dev-only, uses Error().stack)\n// ---------------------------------------------------------------------------\n\nfunction parseFrameFilePath(line: string): string | null {\n let match = line.match(/\\((.+?):\\d+:\\d+\\)/);\n if (!match) match = line.match(/at\\s+(.+?):\\d+:\\d+/);\n if (!match) return null;\n let filePath = match[1].trim();\n if (\n filePath === \"native\" ||\n filePath.startsWith(\"node:\") ||\n filePath.startsWith(\"internal\")\n ) {\n return null;\n }\n if (filePath.startsWith(\"file://\")) {\n try {\n filePath = new URL(filePath).pathname;\n } catch {\n return null;\n }\n }\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(filePath)) {\n return null;\n }\n if (filePath.startsWith(\"./\")) {\n filePath = filePath.slice(2);\n }\n return filePath;\n}\n\nlet _sdkPackageDir: string | undefined;\nfunction getSdkPackageDir(): string {\n if (_sdkPackageDir) return _sdkPackageDir;\n try {\n const thisDir =\n typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(new URL(import.meta.url).pathname);\n _sdkPackageDir = path.resolve(thisDir, \"..\");\n } catch {\n _sdkPackageDir = \"\";\n }\n return _sdkPackageDir;\n}\n\n/**\n * Find the file path of the first caller outside this SDK package.\n * Scans the stack frames (instead of using a fixed offset) so it works\n * regardless of how many frames the runtime inlines or collapses (e.g. Bun).\n * Handles V8 (Node.js/Deno) and JSC (Bun) stack frame formats.\n * Dev-only -- never runs in production.\n */\nfunction extractCallerFilePath(): string | null {\n const stack = new Error().stack;\n if (!stack) return null;\n const lines = stack.split(\"\\n\").slice(1);\n const pkgDir = getSdkPackageDir();\n\n for (const line of lines) {\n const fp = parseFrameFilePath(line);\n if (!fp) continue;\n const absolute = path.isAbsolute(fp) ? fp : path.resolve(process.cwd(), fp);\n let realFp: string;\n try {\n realFp = fs.realpathSync(absolute);\n } catch {\n realFp = absolute;\n }\n if (pkgDir && realFp.startsWith(pkgDir)) continue;\n return realFp;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Handler registry\n// ---------------------------------------------------------------------------\n\nconst HANDLER_REGISTRY_KEY = Symbol.for(\"@vercel/queue.devHandlerRegistry\");\n\ninterface RegisteredHandler {\n consumerGroup: string;\n handler: MessageHandler;\n client: QueueClient;\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler };\n}\n\ntype HandlerRegistry = Map<string, RegisteredHandler[]>;\n\nfunction getHandlerRegistry(): HandlerRegistry {\n const g = globalThis as typeof globalThis & {\n [HANDLER_REGISTRY_KEY]?: HandlerRegistry;\n };\n if (!g[HANDLER_REGISTRY_KEY]) {\n g[HANDLER_REGISTRY_KEY] = new Map();\n }\n return g[HANDLER_REGISTRY_KEY];\n}\n\nfunction registerHandlerForFile(\n filePath: string,\n handler: MessageHandler,\n client: QueueClient,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n): boolean {\n const absolutePath = path.isAbsolute(filePath)\n ? filePath\n : path.resolve(process.cwd(), filePath);\n const fileMappings = findMappingsForFile(absolutePath);\n if (fileMappings.length === 0) return false;\n\n const registry = getHandlerRegistry();\n for (const mapping of fileMappings) {\n const key = mapping.topic;\n const existing = registry.get(key) ?? [];\n const nextEntry: RegisteredHandler = {\n consumerGroup: mapping.consumer,\n handler,\n client,\n options,\n };\n const existingIndex = existing.findIndex(\n (e) => e.consumerGroup === mapping.consumer,\n );\n if (existingIndex >= 0) {\n // HMR can recreate handlers for the same route; keep the latest callback.\n existing[existingIndex] = nextEntry;\n } else {\n existing.push(nextEntry);\n }\n registry.set(key, existing);\n }\n return true;\n}\n\n/**\n * Register a handler for dev mode direct invocation.\n * Called from handleCallback/handleNodeCallback at module load time.\n *\n * Uses stack trace detection to find the caller's file path, then\n * matches it against vercel.json entries (exact or suffix match for\n * bundled environments).\n *\n * @internal `_testCallerPath` bypasses stack detection for tests.\n */\nexport function registerDevHandler(\n handler: MessageHandler,\n client: QueueClient,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n _testCallerPath?: string,\n): void {\n const callerPath = _testCallerPath ?? extractCallerFilePath();\n if (!callerPath) {\n console.warn(\n `${PREFIX} Could not determine caller file path for handler registration.`,\n );\n return;\n }\n\n const registered = registerHandlerForFile(\n callerPath,\n handler,\n client,\n options,\n );\n\n if (!registered) {\n const allMappings = getDevRouteMappings();\n\n if (allMappings && allMappings.length > 0) {\n // Routes are configured but this file doesn't match any of them.\n // Don't warn here — invocation-time diagnostics in invokeDevHandlers\n // will report the real outcome after dynamic import and route priming\n // have been attempted.\n return;\n }\n\n const cwd = process.cwd();\n let relative: string;\n try {\n relative = path.relative(cwd, callerPath).replace(/\\\\/g, \"/\");\n } catch {\n relative = callerPath;\n }\n\n console.warn(\n `${PREFIX} handleCallback() in ${relative} has no matching ` +\n `experimentalTriggers in vercel.json. This handler won't receive messages.\\n\\n` +\n `Add a trigger to vercel.json:\\n` +\n ` \"${relative}\": {\\n` +\n ` \"experimentalTriggers\": [{ \"type\": \"queue/v2beta\", \"topic\": \"your-topic\" }]\\n` +\n ` }`,\n );\n }\n}\n\n/**\n * Look up registered handlers for a topic. Supports wildcard topic patterns\n * from vercel.json (e.g. \"user-*\" matches \"user-signup\").\n */\nfunction lookupHandlers(topicName: string): RegisteredHandler[] {\n const registry = getHandlerRegistry();\n const result: RegisteredHandler[] = [];\n\n for (const [pattern, handlers] of registry) {\n const matches = pattern.includes(\"*\")\n ? matchesWildcardPattern(topicName, pattern)\n : pattern === topicName;\n if (matches) {\n result.push(...handlers);\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Dev mode invocation (replaces HTTP round-trip)\n// ---------------------------------------------------------------------------\n\nconst DEV_RETRY_INITIAL_DELAY_MS = 50;\nconst DEV_RETRY_MAX_WAIT_MS = 5000;\nconst DEV_RETRY_BACKOFF = 2;\nconst PORT_CHECK_TIMEOUT_MS = 250;\nconst PRIME_PORT_ENV_KEYS = [\n \"PORT\",\n \"NEXT_PORT\",\n \"NEXTJS_PORT\",\n \"NUXT_PORT\",\n \"NITRO_PORT\",\n \"SVELTEKIT_PORT\",\n \"VITE_PORT\",\n \"DEV_PORT\",\n \"npm_config_port\",\n];\nconst PRIME_URL_ENV_KEYS = [\n \"__NEXT_PRIVATE_ORIGIN\",\n \"NUXT_PUBLIC_SITE_URL\",\n \"URL\",\n];\n\ninterface ImportFailure {\n filePath: string;\n reason: string;\n}\n\ninterface PrimeFailure {\n filePath: string;\n url: string;\n reason: string;\n}\n\ninterface HandlerLoadDiagnostics {\n triedPorts: number[];\n listeningPorts: number[];\n unavailablePorts: number[];\n importFailures: ImportFailure[];\n primeFailures: PrimeFailure[];\n}\n\ninterface EnsureHandlersLoadedOptions {\n refreshRegistered?: boolean;\n}\n\nfunction formatErrorReason(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isMessageNotFoundError(error: unknown): boolean {\n if (error instanceof MessageNotFoundError) {\n return true;\n }\n if (error instanceof Error && error.name === \"MessageNotFoundError\") {\n return true;\n }\n return false;\n}\n\nfunction parsePort(value: string | undefined): number | null {\n if (!value) return null;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 1 || parsed > 65535) return null;\n return parsed;\n}\n\nfunction parsePortFromUrl(value: string | undefined): number | null {\n if (!value) return null;\n try {\n const parsed = new URL(value).port;\n return parsePort(parsed);\n } catch {\n return null;\n }\n}\n\nfunction collectPrimePorts(): number[] {\n const result: number[] = [];\n const seen = new Set<number>();\n const add = (port: number | null) => {\n if (port && !seen.has(port)) {\n seen.add(port);\n result.push(port);\n }\n };\n\n for (const key of PRIME_PORT_ENV_KEYS) {\n add(parsePort(process.env[key]));\n }\n\n for (const key of PRIME_URL_ENV_KEYS) {\n add(parsePortFromUrl(process.env[key]));\n }\n\n return result;\n}\n\nfunction isPortListening(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host: \"localhost\", port });\n let settled = false;\n\n const finish = (listening: boolean) => {\n if (settled) return;\n settled = true;\n socket.destroy();\n resolve(listening);\n };\n\n socket.once(\"connect\", () => finish(true));\n socket.once(\"error\", () => finish(false));\n socket.setTimeout(PORT_CHECK_TIMEOUT_MS, () => finish(false));\n });\n}\n\n/**\n * Call coreHandleCallback with retries for eventual consistency.\n * The V1 callback path does a receiveMessageById which may throw\n * MessageNotFoundError if the message hasn't propagated yet.\n */\nasync function invokeWithRetry(\n handler: MessageHandler,\n request: {\n queueName: string;\n consumerGroup: string;\n messageId: string;\n region: string;\n },\n options: HandleCallbackOptions,\n): Promise<void> {\n let elapsed = 0;\n let delay = DEV_RETRY_INITIAL_DELAY_MS;\n\n while (true) {\n try {\n await coreHandleCallback(handler, request, options);\n return;\n } catch (error) {\n if (isMessageNotFoundError(error) && elapsed < DEV_RETRY_MAX_WAIT_MS) {\n await new Promise((r) => setTimeout(r, delay));\n elapsed += delay;\n delay = Math.min(\n delay * DEV_RETRY_BACKOFF,\n DEV_RETRY_MAX_WAIT_MS - elapsed,\n );\n continue;\n }\n throw error;\n }\n }\n}\n\n/**\n * Convert a file path from vercel.json to a URL path for HTTP priming.\n * e.g., \"app/api/queue/route.ts\" → \"/api/queue\"\n */\nfunction filePathToUrlPath(filePath: string): string {\n let urlPath = filePath\n .replace(/^src\\/app\\//, \"/\")\n .replace(/^src\\/pages\\//, \"/\")\n .replace(/^src\\/server\\//, \"/\")\n .replace(/^src\\/routes\\//, \"/\")\n .replace(/^app\\//, \"/\")\n .replace(/^pages\\//, \"/\")\n .replace(/^server\\//, \"/\")\n .replace(/\\/route\\.(ts|mts|js|mjs|tsx|jsx)$/, \"\")\n .replace(/\\/\\+server\\.(ts|mts|js|mjs|tsx|jsx)$/, \"\")\n .replace(/\\.(ts|mts|js|mjs|tsx|jsx)$/, \"\");\n\n if (!urlPath.startsWith(\"/\")) {\n urlPath = \"/\" + urlPath;\n }\n\n return urlPath;\n}\n\n/**\n * Attempt to load route handler modules that haven't been loaded yet.\n *\n * Strategy:\n * 1. Try dynamic import (works in tsx, plain Node, Bun, Deno)\n * 2. If still not registered, try HTTP POST to the route URL. This primes\n * frameworks with lazy module loading (Next.js) to evaluate the route\n * file, which triggers handleCallback() → registration.\n */\nasync function ensureHandlersLoaded(\n topicName: string,\n options: EnsureHandlersLoadedOptions = {},\n): Promise<HandlerLoadDiagnostics> {\n const diagnostics: HandlerLoadDiagnostics = {\n triedPorts: collectPrimePorts(),\n listeningPorts: [],\n unavailablePorts: [],\n importFailures: [],\n primeFailures: [],\n };\n\n const matchingRoutes = findMatchingRoutes(topicName);\n if (matchingRoutes.length === 0) return diagnostics;\n\n const shouldRefreshRegistered = options.refreshRegistered === true;\n\n for (const port of diagnostics.triedPorts) {\n if (await isPortListening(port)) {\n diagnostics.listeningPorts.push(port);\n } else {\n diagnostics.unavailablePorts.push(port);\n }\n }\n\n for (const route of matchingRoutes) {\n const alreadyRegistered = isHandlerRegistered(topicName, route.consumer);\n if (alreadyRegistered && !shouldRefreshRegistered) {\n continue;\n }\n\n if (!alreadyRegistered) {\n const absolutePath = path.resolve(process.cwd(), route.filePath);\n try {\n await import(absolutePath);\n } catch (error) {\n diagnostics.importFailures.push({\n filePath: route.filePath,\n reason: formatErrorReason(error),\n });\n }\n\n if (isHandlerRegistered(topicName, route.consumer)) continue;\n }\n\n for (const port of diagnostics.listeningPorts) {\n const url = `http://localhost:${port}${filePathToUrlPath(route.filePath)}`;\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"x-vercel-queue-prime\": \"1\",\n \"x-vercel-queue-prime-file\": route.filePath,\n },\n });\n try {\n await response.text();\n } catch {}\n\n if (isHandlerRegistered(topicName, route.consumer)) {\n break;\n }\n\n diagnostics.primeFailures.push({\n filePath: route.filePath,\n url,\n reason:\n `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : \"\"}`.trim(),\n });\n } catch (error) {\n diagnostics.primeFailures.push({\n filePath: route.filePath,\n url,\n reason: formatErrorReason(error),\n });\n }\n }\n }\n\n return diagnostics;\n}\n\nfunction buildNoHandlerWarning(\n topicName: string,\n routes: DevRouteMapping[],\n diagnostics: HandlerLoadDiagnostics,\n): string {\n const files = routes.map((r) => r.filePath);\n const suggestedPort =\n diagnostics.listeningPorts[0] ?? diagnostics.triedPorts[0];\n const suggestedUrls = suggestedPort\n ? routes.map(\n (r) =>\n `http://localhost:${suggestedPort}${filePathToUrlPath(r.filePath)}`,\n )\n : [];\n\n let portSummary: string;\n if (diagnostics.triedPorts.length === 0) {\n portSummary =\n \"No local dev port detected from env. Set PORT (or NEXT_PORT/NUXT_PORT/VITE_PORT).\";\n } else if (diagnostics.listeningPorts.length === 0) {\n portSummary = `Detected env ports: [${diagnostics.triedPorts.join(\", \")}], but none are listening.`;\n } else {\n const unavailable =\n diagnostics.unavailablePorts.length > 0\n ? ` Not listening: [${diagnostics.unavailablePorts.join(\", \")}].`\n : \"\";\n portSummary =\n `Detected env ports: [${diagnostics.triedPorts.join(\", \")}]. ` +\n `Listening: [${diagnostics.listeningPorts.join(\", \")}].` +\n unavailable;\n }\n\n const importSummary =\n diagnostics.importFailures.length > 0\n ? `\\nImport failures: ` +\n diagnostics.importFailures\n .slice(0, 2)\n .map((f) => `${f.filePath} (${f.reason})`)\n .join(\"; \")\n : \"\";\n\n const primeSummary =\n diagnostics.primeFailures.length > 0\n ? `\\nPrime failures: ` +\n diagnostics.primeFailures\n .slice(0, 3)\n .map((f) => `${f.url} (${f.reason})`)\n .join(\"; \")\n : \"\";\n\n return (\n `${PREFIX} No registered handler for topic \"${topicName}\". ` +\n `vercel.json maps this topic to [${files.join(\", \")}] but auto-loading failed.\\n` +\n `${portSummary}${importSummary}${primeSummary}\\n` +\n `Ensure your dev server is running, set PORT if needed, and confirm mapped ` +\n `route files call handleCallback()/handleNodeCallback() at module scope.\\n` +\n (suggestedUrls.length > 0\n ? `Try opening: ${suggestedUrls.join(\" or \")}`\n : \"Set PORT (or NEXT_PORT/NUXT_PORT/VITE_PORT) and try sending again.\")\n );\n}\n\nfunction isHandlerRegistered(\n topicName: string,\n consumerGroup: string,\n): boolean {\n return lookupHandlers(topicName).some(\n (h) => h.consumerGroup === consumerGroup,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Dev mode re-delivery (issues #5 / #6)\n// ---------------------------------------------------------------------------\n\nconst DEV_REDELIVERY_MAX_DELAY_S = 10;\nconst DEV_REDELIVERY_DEFAULT_DELAY_S = 2;\nconst DEV_REDELIVERY_MAX_ATTEMPTS = 10;\nconst DEFAULT_RETENTION_S = 86_400; // 24 hours\n\ninterface DevRedeliveryContext {\n handler: MessageHandler;\n retry?: RetryHandler;\n payload: unknown;\n topicName: string;\n consumerGroup: string;\n messageId: string;\n region: string;\n createdAt: Date;\n retentionSeconds: number;\n deliveryCount: number;\n defaultRetryDelayS: number;\n}\n\nfunction scheduleDevRedelivery(\n ctx: DevRedeliveryContext,\n delayS: number,\n): void {\n const cappedDelay = Math.min(Math.max(delayS, 0), DEV_REDELIVERY_MAX_DELAY_S);\n\n console.log(\n `${PREFIX} ${RETRY} Scheduling re-delivery in ${cappedDelay}s: topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\"`,\n );\n\n setTimeout(async () => {\n const nextDeliveryCount = ctx.deliveryCount + 1;\n const expiresAt = new Date(\n ctx.createdAt.getTime() + ctx.retentionSeconds * 1000,\n );\n\n if (Date.now() >= expiresAt.getTime()) {\n console.log(\n `${PREFIX} Message expired, stopping retries: topic=\"${ctx.topicName}\" messageId=\"${ctx.messageId}\"`,\n );\n return;\n }\n\n if (nextDeliveryCount > DEV_REDELIVERY_MAX_ATTEMPTS) {\n console.log(\n `${PREFIX} Max re-deliveries (${DEV_REDELIVERY_MAX_ATTEMPTS}) reached: topic=\"${ctx.topicName}\" messageId=\"${ctx.messageId}\"`,\n );\n return;\n }\n\n const metadata: MessageMetadata = {\n messageId: ctx.messageId,\n deliveryCount: nextDeliveryCount,\n createdAt: ctx.createdAt,\n expiresAt,\n topicName: ctx.topicName,\n consumerGroup: ctx.consumerGroup,\n region: ctx.region,\n };\n\n console.log(\n `${PREFIX} Re-delivering: topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\" deliveryCount=${nextDeliveryCount}`,\n );\n\n let succeeded = true;\n let nextRetryAfterS: number | null = null;\n let nextAcknowledged = false;\n\n try {\n await ctx.handler(ctx.payload, metadata);\n } catch (error) {\n succeeded = false;\n\n if (ctx.retry) {\n let directive: RetryDirective | void | undefined;\n try {\n directive = ctx.retry(error, metadata);\n } catch (retryErr) {\n console.warn(`${PREFIX} retry handler threw:`, retryErr);\n }\n\n if (directive && \"afterSeconds\" in directive) {\n nextRetryAfterS = directive.afterSeconds;\n } else if (directive && \"acknowledge\" in directive) {\n nextAcknowledged = true;\n }\n }\n\n if (!nextAcknowledged) {\n console.error(\n `${PREFIX} ${FAIL} Handler error on re-delivery: topic=\"${ctx.topicName}\" messageId=\"${ctx.messageId}\"`,\n error,\n );\n }\n }\n\n if (succeeded) {\n console.log(\n `${PREFIX} ${OK} Message processed on re-delivery: topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\"`,\n );\n } else if (nextAcknowledged) {\n console.log(\n `${PREFIX} ${OK} Message acknowledged (will not retry): topic=\"${ctx.topicName}\" consumer=\"${ctx.consumerGroup}\" messageId=\"${ctx.messageId}\"`,\n );\n } else {\n const nextDelay = nextRetryAfterS ?? ctx.defaultRetryDelayS;\n scheduleDevRedelivery(\n { ...ctx, deliveryCount: nextDeliveryCount },\n nextDelay,\n );\n }\n }, cappedDelay * 1000);\n}\n\n/**\n * Invoke registered handlers for a topic in dev mode.\n * Constructs a ParsedCallbackV1 and calls coreHandleCallback directly.\n *\n * If no handlers are registered yet (lazy-loaded framework), attempts to\n * dynamically import the route files from vercel.json first.\n */\nexport function invokeDevHandlers(\n topicName: string,\n messageId: string,\n region: string,\n delaySeconds?: number,\n retentionSeconds?: number,\n): void {\n if (delaySeconds && delaySeconds > 0) {\n console.log(\n `${PREFIX} Message sent with delay: topic=\"${topicName}\" messageId=\"${messageId}\" delay=${delaySeconds}s`,\n );\n setTimeout(() => {\n invokeDevHandlers(\n topicName,\n messageId,\n region,\n undefined,\n retentionSeconds,\n );\n }, delaySeconds * 1000);\n return;\n }\n\n console.log(\n `${PREFIX} Message sent: topic=\"${topicName}\" messageId=\"${messageId}\"`,\n );\n\n (async () => {\n let handlers = lookupHandlers(topicName);\n let diagnostics: HandlerLoadDiagnostics | null = null;\n\n if (handlers.length > 0) {\n // Refresh mapped routes to pick up HMR-updated callbacks before invocation.\n await ensureHandlersLoaded(topicName, { refreshRegistered: true });\n handlers = lookupHandlers(topicName);\n } else {\n diagnostics = await ensureHandlersLoaded(topicName);\n handlers = lookupHandlers(topicName);\n }\n\n if (handlers.length === 0) {\n const matchingRoutes = findMatchingRoutes(topicName);\n if (matchingRoutes.length > 0) {\n const safeDiagnostics = diagnostics ?? {\n triedPorts: collectPrimePorts(),\n listeningPorts: [],\n unavailablePorts: [],\n importFailures: [],\n primeFailures: [],\n };\n console.warn(\n buildNoHandlerWarning(topicName, matchingRoutes, safeDiagnostics),\n );\n } else {\n console.warn(\n `${PREFIX} No registered handler for topic \"${topicName}\".\\n` +\n `Ensure vercel.json has a matching experimentalTriggers entry and ` +\n `the route file calls handleCallback().`,\n );\n }\n return;\n }\n\n const consumerGroups = handlers.map((h) => h.consumerGroup);\n console.log(\n `${PREFIX} Invoking handlers for topic=\"${topicName}\" messageId=\"${messageId}\" → consumers: [${consumerGroups.join(\", \")}]`,\n );\n\n const effectiveRetention = retentionSeconds ?? DEFAULT_RETENTION_S;\n\n for (const entry of handlers) {\n let capturedPayload: unknown;\n let capturedCreatedAt: Date = new Date();\n let capturedDeliveryCount = 1;\n let handlerSucceeded = true;\n let retryAfterS: number | null = null;\n let retryAcknowledged = false;\n\n const wrappedHandler: MessageHandler = async (message, metadata) => {\n capturedPayload = message;\n capturedCreatedAt = metadata.createdAt;\n capturedDeliveryCount = metadata.deliveryCount;\n try {\n await entry.handler(message, metadata);\n } catch (error) {\n handlerSucceeded = false;\n throw error;\n }\n };\n\n // wrappedRetry observes the user's retry directive for local re-delivery\n // scheduling, then passes it through unchanged to processMessage. This\n // means processMessage will still call changeVisibility on the server,\n // creating dual scheduling (server + local setTimeout). This is safe:\n //\n // - The server-side reschedule makes the message visible after N seconds,\n // but no code path in dev mode polls for visible messages. There is no\n // polling loop, no webhook endpoint, no receive() call. The only thing\n // that re-invokes the handler is the local setTimeout.\n //\n // - Deployed consumers cannot claim it either: dev mode omits\n // deploymentId from all API calls (api-client.ts getSendDeploymentId /\n // getConsumeDeploymentId return undefined when isDevMode()), so the\n // receipt handle is not routable to any deployment.\n //\n // - We intentionally keep the server-side changeVisibility call rather\n // than suppressing it (e.g. by returning { acknowledge: true }) because\n // it keeps server-side observability truthful: the message shows as\n // \"pending retry\", not \"successfully processed\".\n //\n // Known limitation: two local dev processes sharing the same project\n // credentials could theoretically both claim the same message. This is\n // an unsupported configuration.\n const wrappedRetry: RetryHandler | undefined = entry.options?.retry\n ? (error, metadata) => {\n const directive = entry.options!.retry!(error, metadata);\n if (directive && \"afterSeconds\" in directive) {\n retryAfterS = directive.afterSeconds;\n } else if (directive && \"acknowledge\" in directive) {\n retryAcknowledged = true;\n }\n return directive;\n }\n : undefined;\n\n const request = {\n queueName: topicName,\n consumerGroup: entry.consumerGroup,\n messageId,\n region,\n };\n\n const callbackOptions: HandleCallbackOptions = {\n client: entry.client,\n visibilityTimeoutSeconds: entry.options?.visibilityTimeoutSeconds,\n retry: wrappedRetry,\n };\n\n const consumerDefaultDelay = Math.min(\n findRetryAfterSeconds(topicName, entry.consumerGroup) ??\n DEV_REDELIVERY_DEFAULT_DELAY_S,\n DEV_REDELIVERY_MAX_DELAY_S,\n );\n\n const buildRedeliveryCtx = (): DevRedeliveryContext => ({\n handler: entry.handler,\n retry: entry.options?.retry,\n payload: capturedPayload,\n topicName,\n consumerGroup: entry.consumerGroup,\n messageId,\n region,\n createdAt: capturedCreatedAt,\n retentionSeconds: effectiveRetention,\n deliveryCount: capturedDeliveryCount,\n defaultRetryDelayS: consumerDefaultDelay,\n });\n\n try {\n await invokeWithRetry(wrappedHandler, request, callbackOptions);\n\n if (handlerSucceeded) {\n console.log(\n `${PREFIX} ${OK} Message processed: topic=\"${topicName}\" consumer=\"${entry.consumerGroup}\" messageId=\"${messageId}\"`,\n );\n } else if (retryAcknowledged) {\n console.log(\n `${PREFIX} ${OK} Message acknowledged (will not retry): topic=\"${topicName}\" consumer=\"${entry.consumerGroup}\" messageId=\"${messageId}\"`,\n );\n } else if (retryAfterS !== null) {\n const devDelay = Math.min(retryAfterS, DEV_REDELIVERY_MAX_DELAY_S);\n scheduleDevRedelivery(buildRedeliveryCtx(), devDelay);\n }\n } catch (error) {\n console.error(\n `${PREFIX} ${FAIL} Handler failed: topic=\"${topicName}\" consumer=\"${entry.consumerGroup}\" messageId=\"${messageId}\"`,\n error,\n );\n if (!handlerSucceeded) {\n scheduleDevRedelivery(buildRedeliveryCtx(), consumerDefaultDelay);\n }\n }\n }\n })();\n}\n\n// ---------------------------------------------------------------------------\n// Test helpers\n// ---------------------------------------------------------------------------\n\nfunction clearDevState(): void {\n const g = globalThis as typeof globalThis & {\n [ROUTE_MAPPINGS_KEY]?: DevRouteMapping[] | null;\n [HANDLER_REGISTRY_KEY]?: HandlerRegistry;\n };\n delete g[ROUTE_MAPPINGS_KEY];\n delete g[HANDLER_REGISTRY_KEY];\n}\n\nif (process.env.NODE_ENV === \"test\" || process.env.VITEST) {\n (globalThis as Record<string, unknown>).__clearDevState = clearDevState;\n (globalThis as Record<string, unknown>).__filePathToConsumerGroup =\n filePathToConsumerGroup;\n (globalThis as Record<string, unknown>).__filePathToUrlPath =\n filePathToUrlPath;\n (globalThis as Record<string, unknown>).__matchesFunctionsPattern =\n matchesFunctionsPattern;\n (globalThis as Record<string, unknown>).__stripSrcPrefix = stripSrcPrefix;\n}\n","/**\n * Vercel Queue Service client types\n */\nimport type { Transport } from \"./transports\";\n\n// Re-export transport interface for convenience\nexport type { Transport };\n\n/**\n * Vercel region code. The 20 known codes match\n * {@link https://dcs.vercel-infra.com/ | dcs.vercel-infra.com}.\n * Arbitrary strings are also accepted for forward compatibility\n * with regions added after this SDK version.\n */\nexport type VercelRegion =\n | \"arn1\"\n | \"bom1\"\n | \"cdg1\"\n | \"cle1\"\n | \"cpt1\"\n | \"dub1\"\n | \"dxb1\"\n | \"fra1\"\n | \"gru1\"\n | \"hkg1\"\n | \"hnd1\"\n | \"iad1\"\n | \"icn1\"\n | \"kix1\"\n | \"lhr1\"\n | \"pdx1\"\n | \"sfo1\"\n | \"sin1\"\n | \"syd1\"\n | \"yul1\"\n | (string & {});\n\n/**\n * Resolves a region code to a base {@link URL} for the Vercel Queue Service API.\n *\n * The SDK appends its own API path (`/api/v3/…`) to the returned URL.\n * To add a prefix (e.g. when routing through a reverse proxy), include it\n * in the pathname of the returned URL:\n *\n * ```ts\n * // Default — domain only, no prefix:\n * (region) => new URL(`https://${region}.vercel-queue.com`)\n *\n * // Custom domain with a base path:\n * (region) => new URL(`https://my-proxy.example/custom-prefix`)\n * // → requests go to https://my-proxy.example/custom-prefix/api/v3/…\n * ```\n *\n * Default: `` (region) => new URL(`https://${region}.vercel-queue.com`) ``\n */\nexport type BaseUrlResolver = (region: string) => URL;\n\nexport interface QueueClientOptions {\n /**\n * Vercel region code for API routing.\n *\n * Requests are sent to the regional endpoint resolved by\n * {@link BaseUrlResolver} (default: `https://${region}.vercel-queue.com`).\n *\n * When omitted, the region is auto-detected from the `VERCEL_REGION`\n * environment variable (set automatically on Vercel). If not available,\n * defaults to `\"iad1\"` with a console warning.\n *\n * @example\n * ```ts\n * new QueueClient() // auto-detect, falls back to \"iad1\"\n * new QueueClient({ region: \"iad1\" }) // explicit\n * ```\n */\n region?: VercelRegion;\n\n /**\n * Custom resolver that maps a region code to a base {@link URL}.\n *\n * The SDK always appends its own API path (`/api/v3/…`) to the returned URL.\n * Include a pathname to add a prefix (e.g. for reverse-proxy routing):\n *\n * ```ts\n * resolveBaseUrl: (region) => new URL(`https://my-proxy.example/prefix`)\n * ```\n *\n * @default (region) => new URL(`https://${region}.vercel-queue.com`)\n */\n resolveBaseUrl?: BaseUrlResolver;\n\n /**\n * Authentication token for the Vercel Queue Service API.\n * If not provided, the client will attempt to get a token via OIDC\n * when running in a Vercel Function environment.\n */\n token?: string;\n\n /**\n * Custom headers to include in all requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Deployment ID for message routing and lease validation.\n *\n * - `undefined` (default): auto-detect from `VERCEL_DEPLOYMENT_ID` env var;\n * sent messages are pinned to this deployment.\n * - `null`: explicitly unpinned — no deployment ID is sent on any request.\n * - `\"dpl_xxx\"`: explicit value used for both send pinning and consume identification.\n *\n * Ignored in development mode (deployment ID is never sent locally).\n */\n deploymentId?: string | null;\n\n /**\n * Serializer/deserializer for message payloads.\n * Used for all send and receive operations.\n * @default JsonTransport\n */\n transport?: Transport;\n\n /**\n * Custom HTTP dispatcher passed to every `fetch()` call.\n *\n * Use this to plug in an undici `RetryAgent` or `Agent` for automatic\n * retries on transient network errors (ECONNRESET, 429, 5xx) and\n * connection pooling.\n *\n * @example\n * ```ts\n * import { Agent, RetryAgent } from 'undici';\n *\n * const dispatcher = new RetryAgent(new Agent({ connections: 8 }), {\n * retryAfter: true,\n * });\n *\n * new QueueClient({ dispatcher });\n * ```\n */\n dispatcher?: unknown;\n}\n\n/**\n * Options for creating a {@link PollingQueueClient}.\n *\n * Identical to {@link QueueClientOptions} except `region` is **required**\n * because messages can only be received from the region they were sent to.\n * Using a fixed region (e.g. `\"iad1\"`) ensures that `send` and `receive`\n * target the same endpoint.\n */\nexport interface PollingQueueClientOptions extends QueueClientOptions {\n /**\n * Vercel region code for API routing — **required** for polling.\n *\n * Messages can only be received from the region they were sent to.\n * Use a fixed region (e.g. `\"iad1\"`) for both sending and receiving.\n *\n * @example\n * ```ts\n * new PollingQueueClient({ region: \"iad1\" })\n * ```\n */\n region: VercelRegion;\n}\n\n/**\n * Options for sending messages.\n */\nexport interface SendOptions {\n /**\n * Unique key to prevent duplicate message submissions.\n * Deduplication window: `min(message retention, 24 hours)`.\n */\n idempotencyKey?: string;\n\n /**\n * Message retention time in seconds. After this period, the message expires.\n * @default 86400 (24 hours)\n * @minimum 60 (1 minute)\n * @maximum 604800 (7 days)\n */\n retentionSeconds?: number;\n\n /**\n * Delay delivery of the message by this many seconds.\n * The message will not be visible to consumers until the delay has passed.\n * @default 0\n * @minimum 0\n * @maximum 604800 (7 days, cannot exceed retentionSeconds)\n */\n delaySeconds?: number;\n\n /**\n * Custom headers to include with this message.\n * These headers are passed through to the VQS server.\n */\n headers?: Record<string, string>;\n}\n\nexport interface SendMessageOptions<T = unknown> extends SendOptions {\n /**\n * The topic/queue name to send the message to.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n queueName: string;\n\n /**\n * The message payload. Will be serialized using the provided transport.\n */\n payload: T;\n}\n\nexport interface SendMessageResponse {\n /**\n * The generated message ID\n */\n messageId: string;\n}\n\n/**\n * Result returned by `send()`.\n *\n * `messageId` is `null` when the server accepted the message for deferred\n * processing (e.g. during a server-side outage) and no ID is available yet.\n */\nexport interface SendResult {\n messageId: string | null;\n}\n\nexport interface Message<T = unknown> {\n /**\n * Unique message identifier. Used for receive-by-ID operations.\n */\n messageId: string;\n\n /**\n * The deserialized message payload.\n * Note: If using StreamTransport, ensure proper cleanup by calling\n * `transport.finalize(payload)` when done processing, especially in error cases.\n */\n payload: T;\n\n /**\n * Number of times this message has been delivered.\n * Starts at 1 for the first delivery, increments on each retry.\n */\n deliveryCount: number;\n\n /**\n * Timestamp when the message was created/published.\n */\n createdAt: Date;\n\n /**\n * Timestamp when the message expires.\n * Present in v2beta binary callback (`ce-vqsexpiresat` header) and\n * V3 multipart/NDJSON responses (`Vqs-Expires-At` header / `expiresAt` field).\n */\n expiresAt?: Date;\n\n /**\n * MIME type of the message content.\n * Set by the transport's `contentType` property during publish.\n */\n contentType: string;\n\n /**\n * Receipt handle (lease token) for this message delivery.\n * Required for acknowledge and visibility extension operations.\n * Valid only until the visibility timeout expires.\n */\n receiptHandle: string;\n}\n\nexport interface ReceiveMessagesOptions<T = unknown> {\n /**\n * The topic/queue name to receive messages from.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n queueName: string;\n\n /**\n * Consumer group name. Each consumer group maintains independent message state.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n consumerGroup: string;\n\n /**\n * Time in seconds that messages will be invisible to other consumers after receipt.\n * Set to 0 for immediate re-visibility (useful for peeking).\n * @default 30\n * @minimum 0\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Maximum number of messages to retrieve in a single request.\n * @default 1\n * @minimum 1\n * @maximum 10\n */\n limit?: number;\n}\n\nexport interface AcknowledgeMessageOptions {\n /**\n * The topic/queue name the message belongs to.\n */\n queueName: string;\n\n /**\n * Consumer group name.\n */\n consumerGroup: string;\n\n /**\n * Receipt handle received when the message was consumed.\n */\n receiptHandle: string;\n}\n\nexport interface AcknowledgeMessageResponse {\n /**\n * Whether the message was successfully acknowledged\n */\n acknowledged: boolean;\n}\n\nexport interface ChangeVisibilityOptions {\n /**\n * The topic/queue name the message belongs to.\n */\n queueName: string;\n\n /**\n * Consumer group name.\n */\n consumerGroup: string;\n\n /**\n * Receipt handle received when the message was consumed.\n */\n receiptHandle: string;\n\n /**\n * New visibility timeout in seconds.\n * Cannot extend beyond the message's original expiration time.\n * @minimum 0\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds: number;\n}\n\nexport interface ChangeVisibilityResponse {\n /**\n * Whether the visibility was successfully updated\n */\n success: boolean;\n}\n\n/**\n * Message metadata provided to handlers\n */\nexport interface MessageMetadata {\n messageId: string;\n deliveryCount: number;\n createdAt: Date;\n expiresAt: Date;\n topicName: string;\n consumerGroup: string;\n /** Vercel region the client is targeting. */\n region: string;\n}\n\n/**\n * Instruction returned by a {@link RetryHandler} to control what happens\n * to a message when the handler throws.\n *\n * - `{ afterSeconds: N }` — reschedule the message for redelivery after N seconds\n * - `{ acknowledge: true }` — acknowledge the message so it is never retried\n */\nexport type RetryDirective = { afterSeconds: number } | { acknowledge: true };\n\n/**\n * Called when the message handler throws an error.\n * Return a {@link RetryDirective} to reschedule or acknowledge the message,\n * or return `undefined` to let the error propagate normally.\n */\nexport type RetryHandler = (\n error: unknown,\n metadata: MessageMetadata,\n) => RetryDirective | void | undefined;\n\n/**\n * Message handler function type.\n *\n * Called once per message with the deserialized payload and metadata.\n * Not called when the queue is empty — check the return value of `receive()` instead.\n */\nexport type MessageHandler<T = unknown> = (\n message: T,\n metadata: MessageMetadata,\n) => Promise<void> | void;\n\n/**\n * Result returned by `receive()`. Use `ok` to check if messages were processed.\n *\n * @example\n * ```typescript\n * const result = await receive(\"topic\", \"group\", handler);\n * if (result.ok) {\n * // Messages were processed successfully\n * } else if (result.reason === \"empty\") {\n * // Queue had no messages available\n * }\n * ```\n */\nexport type ReceiveResult =\n | { ok: true }\n | { ok: false; reason: \"empty\" }\n | { ok: false; reason: \"not_found\"; messageId: string }\n | { ok: false; reason: \"not_available\"; messageId: string }\n | { ok: false; reason: \"already_processed\"; messageId: string };\n\n/**\n * Options for receiving a specific message by ID.\n */\nexport interface ReceiveByIdOptions {\n /** The specific message ID to consume */\n messageId: string;\n\n /**\n * Message lock duration in seconds.\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for receiving messages from the queue with an optional batch limit.\n */\nexport interface ReceiveBatchOptions {\n /**\n * Maximum number of messages to retrieve in a single request.\n * @default 1\n * @minimum 1\n * @maximum 10\n */\n limit?: number;\n\n /**\n * Message lock duration in seconds.\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for the receive method. Either receive by message ID or receive\n * from the queue with an optional limit. These options are mutually exclusive.\n */\nexport type ReceiveOptions = ReceiveByIdOptions | ReceiveBatchOptions;\n\n/**\n * Options for creating a ConsumerGroup instance.\n */\nexport interface ConsumerGroupOptions<T = unknown> {\n /**\n * Time in seconds that messages will be invisible to other consumers after receipt.\n * The ConsumerGroup will automatically extend this timeout during processing.\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n}\n\nexport interface ReceiveMessageByIdOptions<T = unknown> {\n /**\n * The topic/queue name to receive the message from.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n queueName: string;\n\n /**\n * Consumer group name.\n * Must match pattern: `[A-Za-z0-9_-]+`\n */\n consumerGroup: string;\n\n /**\n * The specific message ID to retrieve.\n */\n messageId: string;\n\n /**\n * Time in seconds that the message will be invisible to other consumers after receipt.\n * @default 30\n * @minimum 0\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n}\n\nexport interface ReceiveMessageByIdResponse<T = unknown> {\n message: Message<T>;\n}\n\n/**\n * Error thrown when a message does not exist or has expired.\n */\nexport class MessageNotFoundError extends Error {\n constructor(messageId: string) {\n super(`Message ${messageId} not found`);\n this.name = \"MessageNotFoundError\";\n }\n}\n\n/**\n * Error thrown when a message exists but cannot be processed.\n * This can happen when the message is in the wrong state or already claimed by another consumer.\n */\nexport class MessageNotAvailableError extends Error {\n constructor(messageId: string, reason?: string) {\n super(\n `Message ${messageId} not available for processing${reason ? `: ${reason}` : \"\"}`,\n );\n this.name = \"MessageNotAvailableError\";\n }\n}\n\n/**\n * Error thrown when message data is corrupted or can't be parsed\n */\nexport class MessageCorruptedError extends Error {\n constructor(messageId: string, reason: string) {\n super(`Message ${messageId} is corrupted: ${reason}`);\n this.name = \"MessageCorruptedError\";\n }\n}\n\n/**\n * Error thrown when there are no messages available in the queue.\n */\nexport class QueueEmptyError extends Error {\n constructor(queueName: string, consumerGroup: string) {\n super(\n `No messages available in queue \"${queueName}\" for consumer group \"${consumerGroup}\"`,\n );\n this.name = \"QueueEmptyError\";\n }\n}\n\n/**\n * Error thrown when a message is temporarily locked by another consumer.\n * The message is currently being processed and cannot be claimed.\n */\nexport class MessageLockedError extends Error {\n /** Suggested retry delay in seconds, if provided by the server. */\n public readonly retryAfter?: number;\n\n constructor(messageId: string, retryAfter?: number) {\n const retryMessage = retryAfter\n ? ` Retry after ${retryAfter} seconds.`\n : \" Try again later.\";\n super(`Message ${messageId} is temporarily locked.${retryMessage}`);\n this.name = \"MessageLockedError\";\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error thrown when authentication fails.\n * This typically means the token is missing, invalid, or expired.\n */\nexport class UnauthorizedError extends Error {\n constructor(message: string = \"Missing or invalid authentication token\") {\n super(message);\n this.name = \"UnauthorizedError\";\n }\n}\n\n/**\n * Error thrown when access is forbidden.\n * This typically means the queue belongs to a different environment or project.\n */\nexport class ForbiddenError extends Error {\n constructor(\n message: string = \"Queue environment doesn't match token environment\",\n ) {\n super(message);\n this.name = \"ForbiddenError\";\n }\n}\n\n/**\n * Error thrown when request parameters are invalid.\n */\nexport class BadRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BadRequestError\";\n }\n}\n\n/**\n * Error thrown when the server encounters an unexpected error.\n */\nexport class InternalServerError extends Error {\n constructor(message: string = \"Unexpected server error\") {\n super(message);\n this.name = \"InternalServerError\";\n }\n}\n\n/**\n * Error thrown when the batch limit parameter is outside the valid range.\n * The limit must be between 1 and 10 (inclusive).\n */\nexport class InvalidLimitError extends Error {\n constructor(limit: number, min: number = 1, max: number = 10) {\n super(`Invalid limit: ${limit}. Limit must be between ${min} and ${max}.`);\n this.name = \"InvalidLimitError\";\n }\n}\n\n/**\n * Error thrown when attempting to process a message that has already been successfully processed.\n */\nexport class MessageAlreadyProcessedError extends Error {\n constructor(messageId: string) {\n super(`Message ${messageId} has already been processed`);\n this.name = \"MessageAlreadyProcessedError\";\n }\n}\n\n/**\n * Error thrown when a duplicate idempotency key is detected.\n * The message was already sent within the deduplication window.\n */\nexport class DuplicateMessageError extends Error {\n public readonly idempotencyKey?: string;\n\n constructor(message: string, idempotencyKey?: string) {\n super(message);\n this.name = \"DuplicateMessageError\";\n this.idempotencyKey = idempotencyKey;\n }\n}\n\n/**\n * Error thrown when consumer discovery fails.\n * This typically means the deployment could not be reached or is not configured correctly.\n */\nexport class ConsumerDiscoveryError extends Error {\n public readonly deploymentId?: string;\n\n constructor(message: string, deploymentId?: string) {\n super(message);\n this.name = \"ConsumerDiscoveryError\";\n this.deploymentId = deploymentId;\n }\n}\n\n/**\n * Error thrown when the consumer registry is not configured for the project.\n */\nexport class ConsumerRegistryNotConfiguredError extends Error {\n constructor(message: string = \"Consumer registry not configured\") {\n super(message);\n this.name = \"ConsumerRegistryNotConfiguredError\";\n }\n}\n","import { ApiClient } from \"./api-client\";\nimport type {\n ConsumerGroupOptions,\n Message,\n MessageHandler,\n MessageMetadata,\n RetryDirective,\n RetryHandler,\n} from \"./types\";\nimport {\n BadRequestError,\n ForbiddenError,\n MessageNotAvailableError,\n MessageNotFoundError,\n UnauthorizedError,\n} from \"./types\";\n\n/**\n * Default visibility timeout in seconds (5 minutes).\n * This is the initial lock duration requested when receiving messages.\n */\nconst DEFAULT_VISIBILITY_TIMEOUT_SECONDS = 300;\n\n/**\n * Minimum visibility timeout in seconds.\n * Ensures auto-extension has enough time to renew before the lease expires.\n */\nconst MIN_VISIBILITY_TIMEOUT_SECONDS = 30;\n\n/**\n * Maximum renewal interval in seconds.\n * Even for very long visibility timeouts, we renew at least this often.\n */\nconst MAX_RENEWAL_INTERVAL_SECONDS = 60;\n\n/**\n * Minimum renewal interval in seconds.\n * Even for very short visibility timeouts, we don't renew more frequently than this.\n */\nconst MIN_RENEWAL_INTERVAL_SECONDS = 10;\n\n/**\n * Interval in milliseconds between retry attempts when extension fails.\n * On transient failures, retry every 3 seconds.\n */\nconst RETRY_INTERVAL_MS = 3000;\n\n/**\n * Calculate the renewal interval based on visibility timeout.\n * Formula: min(60, max(10, visibilityTimeout / 5))\n *\n * Examples:\n * - 300s visibility → 60s interval (300/5 = 60, capped at 60)\n * - 200s visibility → 40s interval (200/5 = 40)\n * - 100s visibility → 20s interval (100/5 = 20)\n * - 30s visibility → 10s interval (30/5 = 6, floored at 10)\n */\nfunction calculateRenewalInterval(visibilityTimeoutSeconds: number): number {\n return Math.min(\n MAX_RENEWAL_INTERVAL_SECONDS,\n Math.max(MIN_RENEWAL_INTERVAL_SECONDS, visibilityTimeoutSeconds / 5),\n );\n}\n\n/**\n * Options for consuming a specific message by ID.\n */\nexport interface ConsumeByIdOptions {\n /** The specific message ID to consume */\n messageId: string;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for consuming messages from the queue.\n */\nexport interface ConsumeBatchOptions {\n /**\n * Maximum number of messages to retrieve in a single request.\n * @default 1\n * @minimum 1\n * @maximum 10\n */\n limit?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\n/**\n * Options for the consume method. Either consume by message ID or consume\n * from the queue with an optional limit. These options are mutually exclusive.\n */\nexport type ConsumeOptions = ConsumeByIdOptions | ConsumeBatchOptions;\n\n/**\n * A ConsumerGroup processes messages from a topic with automatic lifecycle management.\n *\n * Features:\n * - Independent message state per group (each group receives a copy of every message)\n * - Automatic visibility timeout extension during processing\n * - Automatic message deletion on successful handler completion\n */\nexport class ConsumerGroup<T = unknown> {\n private client: ApiClient;\n private topicName: string;\n private consumerGroupName: string;\n private visibilityTimeout: number;\n\n /**\n * Create a new ConsumerGroup instance.\n *\n * @param client - ApiClient instance to use for API calls (transport is configured on the client)\n * @param topicName - Name of the topic to consume from (pattern: `[A-Za-z0-9_-]+`)\n * @param consumerGroupName - Name of the consumer group (pattern: `[A-Za-z0-9_-]+`)\n * @param options - Optional configuration\n * @param options.visibilityTimeoutSeconds - Message lock duration (default: 300, max: 3600)\n */\n constructor(\n client: ApiClient,\n topicName: string,\n consumerGroupName: string,\n options: ConsumerGroupOptions<T> = {},\n ) {\n this.client = client;\n this.topicName = topicName;\n this.consumerGroupName = consumerGroupName;\n this.visibilityTimeout = Math.max(\n MIN_VISIBILITY_TIMEOUT_SECONDS,\n options.visibilityTimeoutSeconds ?? DEFAULT_VISIBILITY_TIMEOUT_SECONDS,\n );\n }\n\n /**\n * Check if an error is a 4xx client error that should stop retries.\n * 4xx errors indicate the request is fundamentally invalid and retrying won't help.\n * - 409: Ticket mismatch (lost ownership to another consumer)\n * - 404: Message/receipt handle not found\n * - 400, 401, 403: Other client errors\n */\n private isClientError(error: unknown): boolean {\n return (\n error instanceof MessageNotAvailableError || // 409 - ticket mismatch, lost ownership\n error instanceof MessageNotFoundError || // 404 - receipt handle not found\n error instanceof BadRequestError || // 400 - invalid parameters\n error instanceof UnauthorizedError || // 401 - auth failed\n error instanceof ForbiddenError // 403 - access denied\n );\n }\n\n /**\n * Starts a background loop that periodically extends the visibility timeout for a message.\n *\n * Timing strategy:\n * - Renewal interval: min(60s, max(10s, visibilityTimeout/5))\n * - Extensions request the same duration as the initial visibility timeout\n * - When `visibilityDeadline` is provided (binary mode small body), the first\n * extension delay is calculated from the time remaining until the deadline\n * using the same renewal formula, ensuring the first extension fires before\n * the server-assigned lease expires. Subsequent renewals use the standard interval.\n *\n * Retry strategy:\n * - On transient failures (5xx, network errors): retry every 3 seconds\n * - On 4xx client errors: stop retrying (the lease is lost or invalid)\n *\n * @param receiptHandle - The receipt handle to extend visibility for\n * @param options - Optional configuration\n * @param options.visibilityDeadline - Absolute deadline (from server's `ce-vqsvisibilitydeadline`)\n * when the current visibility timeout expires. Used to calculate the first extension delay.\n */\n private startVisibilityExtension(\n receiptHandle: string,\n options?: { visibilityDeadline?: Date },\n ): (waitForCompletion?: boolean) => Promise<void> {\n let isRunning = true;\n let isResolved = false;\n let resolveLifecycle: () => void;\n let timeoutId: NodeJS.Timeout | null = null;\n\n const renewalIntervalMs =\n calculateRenewalInterval(this.visibilityTimeout) * 1000;\n\n let firstDelayMs = renewalIntervalMs;\n if (options?.visibilityDeadline) {\n const timeRemainingMs = options.visibilityDeadline.getTime() - Date.now();\n if (timeRemainingMs > 0) {\n const timeRemainingSeconds = timeRemainingMs / 1000;\n firstDelayMs = calculateRenewalInterval(timeRemainingSeconds) * 1000;\n } else {\n firstDelayMs = 0;\n }\n }\n\n // Promise that tracks the actual termination of the extension loop\n const lifecyclePromise = new Promise<void>((resolve) => {\n resolveLifecycle = resolve;\n });\n\n const safeResolve = () => {\n if (!isResolved) {\n isResolved = true;\n resolveLifecycle();\n }\n };\n\n const extend = async (): Promise<void> => {\n // Check if we should stop before attempting extension\n if (!isRunning) {\n safeResolve();\n return;\n }\n\n try {\n await this.client.changeVisibility({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle,\n visibilityTimeoutSeconds: this.visibilityTimeout,\n });\n\n // Successfully extended - schedule next extension\n if (isRunning) {\n timeoutId = setTimeout(() => extend(), renewalIntervalMs);\n } else {\n safeResolve();\n }\n } catch (error) {\n // Check if this is a 4xx client error - stop retrying\n if (this.isClientError(error)) {\n console.error(\n `Visibility extension failed with client error for receipt handle ${receiptHandle} (stopping retries):`,\n error,\n );\n safeResolve();\n return;\n }\n\n // Transient error - log and schedule retry\n console.error(\n `Failed to extend visibility for receipt handle ${receiptHandle} (will retry in ${RETRY_INTERVAL_MS / 1000}s):`,\n error,\n );\n\n // Retry after RETRY_INTERVAL_MS if still running\n if (isRunning) {\n timeoutId = setTimeout(() => extend(), RETRY_INTERVAL_MS);\n } else {\n safeResolve();\n }\n }\n };\n\n timeoutId = setTimeout(() => extend(), firstDelayMs);\n\n // Return a function to stop the extension loop\n return async (waitForCompletion: boolean = false) => {\n // Signal the loop to stop\n isRunning = false;\n\n // Cancel any pending timeout to avoid unnecessary waiting\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n // Only wait for in-flight operations if explicitly requested\n if (waitForCompletion) {\n // Wait for the loop to actually terminate\n // This ensures any in-progress extension completes or fails\n await lifecyclePromise;\n } else {\n safeResolve();\n }\n };\n }\n\n /**\n * Clean up the message payload if the transport supports it and payload exists.\n */\n private async finalizePayload<TPayload>(payload: TPayload): Promise<void> {\n const transport = this.client.getTransport();\n if (transport.finalize && payload !== undefined && payload !== null) {\n try {\n await transport.finalize(payload);\n } catch (finalizeError) {\n console.warn(\"Failed to finalize message payload:\", finalizeError);\n }\n }\n }\n\n private async processMessage<TPayload>(\n message: Message<TPayload>,\n handler: MessageHandler<TPayload>,\n options?: { visibilityDeadline?: Date; retry?: RetryHandler },\n ): Promise<void> {\n const stopExtension = this.startVisibilityExtension(\n message.receiptHandle,\n options,\n );\n\n const DEFAULT_RETENTION_MS = 86_400_000; // 24 hours\n const metadata: MessageMetadata = {\n messageId: message.messageId,\n deliveryCount: message.deliveryCount,\n createdAt: message.createdAt,\n expiresAt:\n message.expiresAt ??\n new Date(message.createdAt.getTime() + DEFAULT_RETENTION_MS),\n topicName: this.topicName,\n consumerGroup: this.consumerGroupName,\n region: this.client.getRegion(),\n };\n\n try {\n await handler(message.payload, metadata);\n // Stop extensions immediately - we don't need to wait for in-flight extensions\n // since we're about to acknowledge the message anyway\n await stopExtension();\n\n await this.client.acknowledgeMessage({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle: message.receiptHandle,\n });\n } catch (error) {\n // Stop extensions immediately on error - fail fast without waiting\n // for any in-flight extension attempts\n await stopExtension();\n\n // If a retry handler is configured, give it a chance to reschedule or acknowledge\n if (options?.retry) {\n let directive: RetryDirective | void | undefined;\n try {\n directive = options.retry(error, metadata);\n } catch (retryError) {\n console.warn(\"retry handler threw:\", retryError);\n }\n\n if (directive) {\n if (\"acknowledge\" in directive && directive.acknowledge) {\n // Acknowledge the message so it is never retried\n try {\n await this.client.acknowledgeMessage({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle: message.receiptHandle,\n });\n } catch (ackError) {\n console.warn(\"Failed to acknowledge message:\", ackError);\n }\n\n await this.finalizePayload(message.payload);\n return;\n }\n\n if (\n \"afterSeconds\" in directive &&\n typeof directive.afterSeconds === \"number\"\n ) {\n try {\n await this.client.changeVisibility({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n receiptHandle: message.receiptHandle,\n visibilityTimeoutSeconds: directive.afterSeconds,\n });\n } catch (changeError) {\n console.warn(\n \"Failed to reschedule message for retry:\",\n changeError,\n );\n }\n\n await this.finalizePayload(message.payload);\n return;\n }\n }\n }\n\n await this.finalizePayload(message.payload);\n throw error;\n }\n }\n\n /**\n * Process a pre-fetched message directly, without calling `receiveMessageById`.\n *\n * Used by the binary mode (v2beta) small body fast path, where the server\n * pushes the full message payload in the callback request. The message is\n * processed with the same lifecycle guarantees as `consume()`:\n * - Visibility timeout is extended periodically during processing\n * - Message is acknowledged on successful handler completion\n * - Payload is finalized on error if the transport supports it\n *\n * @param handler - Function to process the message payload and metadata\n * @param message - The complete message including payload and receipt handle\n * @param options - Optional configuration\n * @param options.visibilityDeadline - Absolute deadline when the server-assigned\n * visibility timeout expires (from `ce-vqsvisibilitydeadline`). Used to\n * schedule the first visibility extension before the lease expires.\n */\n async consumeMessage(\n handler: MessageHandler<T>,\n message: Message<T>,\n options?: { visibilityDeadline?: Date; retry?: RetryHandler },\n ): Promise<void> {\n await this.processMessage(message, handler, options);\n }\n\n /**\n * Consume the next available message from the queue.\n *\n * The message is automatically:\n * - Locked with the configured visibility timeout\n * - Kept alive via periodic visibility extensions during processing\n * - Acknowledged upon successful handler completion\n * - Released for retry if the handler throws an error\n *\n * @param handler - Function to process the message payload and metadata.\n * Not called when the queue is empty.\n * @returns Number of messages processed (0 if queue was empty)\n * @throws Handler errors are re-thrown after cleanup\n */\n async consume(handler: MessageHandler<T>): Promise<number>;\n\n /**\n * Consume a specific message by its ID.\n *\n * Used for targeted message processing, typically from webhook callbacks.\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Options containing the messageId to consume\n * @param options.messageId - Specific message ID to consume\n * @returns Number of messages processed (always 1 on success)\n * @throws {MessageNotFoundError} When message doesn't exist\n * @throws {MessageNotAvailableError} When message in wrong state\n * @throws {MessageAlreadyProcessedError} When already processed\n * @throws Handler errors are re-thrown after cleanup\n */\n async consume(\n handler: MessageHandler<T>,\n options: ConsumeByIdOptions,\n ): Promise<number>;\n\n /**\n * Consume messages from the queue with an optional batch limit.\n *\n * Fetches up to `limit` messages in a single request and processes them\n * sequentially with the provided handler.\n *\n * @param handler - Function to process each message payload and metadata.\n * Not called when the queue is empty.\n * @param options - Options containing the limit\n * @param options.limit - Maximum messages to retrieve (default: 1, min: 1, max: 10)\n * @returns Number of messages processed (0 if queue was empty)\n * @throws Handler errors are re-thrown after cleanup\n */\n async consume(\n handler: MessageHandler<T>,\n options: ConsumeBatchOptions,\n ): Promise<number>;\n\n async consume(\n handler: MessageHandler<T>,\n options?: ConsumeOptions,\n ): Promise<number> {\n const retry = options?.retry;\n\n if (options && \"messageId\" in options) {\n const response = await this.client.receiveMessageById<T>({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n messageId: options.messageId,\n visibilityTimeoutSeconds: this.visibilityTimeout,\n });\n await this.processMessage<T>(response.message, handler, { retry });\n return 1;\n } else {\n const limit = options && \"limit\" in options ? options.limit : 1;\n let messagesProcessed = 0;\n\n for await (const message of this.client.receiveMessages<T>({\n queueName: this.topicName,\n consumerGroup: this.consumerGroupName,\n visibilityTimeoutSeconds: this.visibilityTimeout,\n limit,\n })) {\n messagesProcessed++;\n await this.processMessage<T>(message, handler, { retry });\n }\n\n return messagesProcessed;\n }\n }\n\n /**\n * Get the consumer group name\n */\n get name(): string {\n return this.consumerGroupName;\n }\n\n /**\n * Get the topic name this consumer group is subscribed to\n */\n get topic(): string {\n return this.topicName;\n }\n}\n","import { ApiClient } from \"./api-client\";\nimport { ConsumerGroup } from \"./consumer-group\";\nimport type { ConsumerGroupOptions, SendOptions, SendResult } from \"./types\";\nimport { isDevMode, invokeDevHandlers } from \"./dev\";\n\n/**\n * A Topic represents a named channel for publishing messages in a pub/sub pattern\n */\nexport class Topic<T = unknown> {\n private client: ApiClient;\n private topicName: string;\n\n /**\n * @param client ApiClient instance to use for API calls\n * @param topicName Name of the topic to work with\n */\n constructor(client: ApiClient, topicName: string) {\n this.client = client;\n this.topicName = topicName;\n }\n\n /**\n * Publish a message to the topic\n * @param payload The data to publish\n * @param options Optional publish options\n * @returns `{ messageId }` — `messageId` is `null` when deferred\n * @throws {BadRequestError} When request parameters are invalid\n * @throws {UnauthorizedError} When authentication fails\n * @throws {ForbiddenError} When access is denied (environment mismatch)\n * @throws {InternalServerError} When server encounters an error\n */\n async publish(payload: T, options?: SendOptions): Promise<SendResult> {\n const result = await this.client.sendMessage<T>({\n queueName: this.topicName,\n payload,\n idempotencyKey: options?.idempotencyKey,\n retentionSeconds: options?.retentionSeconds,\n delaySeconds: options?.delaySeconds,\n headers: options?.headers,\n });\n\n // In development mode, automatically trigger registered callbacks after 1s\n if (result.messageId && isDevMode()) {\n invokeDevHandlers(\n this.topicName,\n result.messageId,\n this.client.getRegion(),\n options?.delaySeconds,\n options?.retentionSeconds,\n );\n }\n\n return { messageId: result.messageId };\n }\n\n /**\n * Create a consumer group for this topic\n * @param consumerGroupName Name of the consumer group\n * @param options Optional configuration for the consumer group\n * @returns A ConsumerGroup instance\n */\n consumerGroup<U = T>(\n consumerGroupName: string,\n options?: ConsumerGroupOptions<U>,\n ): ConsumerGroup<U> {\n return new ConsumerGroup<U>(\n this.client,\n this.topicName,\n consumerGroupName,\n options,\n );\n }\n\n /**\n * Get the topic name\n */\n get name(): string {\n return this.topicName;\n }\n}\n","/**\n * Core queue callback utilities for handling incoming webhook payloads\n * from Vercel triggers using the CloudEvent specification.\n *\n * This module provides the framework-agnostic core. For framework-specific\n * wrappers, see `@vercel/queue/web` and `@vercel/queue/nextjs/pages`.\n */\nimport { getApiClient, type QueueClient } from \"./client\";\nimport { Topic } from \"./topic\";\nimport type { Message, MessageHandler, RetryHandler } from \"./types\";\nimport type { Transport } from \"./transports\";\n\n/**\n * CloudEvent specification for queue callbacks.\n *\n * Incoming webhook payloads from Vercel follow the CloudEvents v1.0 spec\n * with queue-specific data fields.\n *\n * @see https://cloudevents.io/\n */\nexport interface CloudEvent<T = unknown> {\n /** Event type identifier, e.g. `\"com.vercel.queue.v1beta\"` (structured) or `\"com.vercel.queue.v2beta\"` (binary) */\n type: string;\n /** Event source URI, e.g. `\"/topic/my-topic/consumer/my-group\"` */\n source: string;\n /** Unique event identifier */\n id: string;\n /** MIME type of the `data` field */\n datacontenttype: string;\n /** Event payload containing queue message metadata */\n data: T;\n /** ISO 8601 timestamp of when the event was produced */\n time?: string;\n /** CloudEvents specification version */\n specversion?: string;\n}\n\n/**\n * Options for configuring `handleCallback` behavior.\n */\nexport interface HandleCallbackOptions {\n /**\n * QueueClient instance to use for processing messages.\n * If not provided, a default client is created with OIDC authentication\n * and JsonTransport.\n */\n client?: QueueClient;\n\n /**\n * Time in seconds that messages will be invisible to other consumers\n * during processing. The handler will automatically extend this timeout\n * while processing.\n *\n * @default 300 (5 minutes)\n * @minimum 30\n * @maximum 3600 (1 hour)\n */\n visibilityTimeoutSeconds?: number;\n\n /**\n * Called when the handler throws. Return `{ afterSeconds: N }` to reschedule\n * the message for redelivery after N seconds, or return `undefined`\n * to let the error propagate normally.\n */\n retry?: RetryHandler;\n}\n\nexport const CLOUD_EVENT_TYPE_V1BETA = \"com.vercel.queue.v1beta\";\nexport const CLOUD_EVENT_TYPE_V2BETA = \"com.vercel.queue.v2beta\";\n\n/**\n * Routing-only callback: the SDK must fetch the message by ID.\n * Produced by v1beta structured mode and v2beta large-body mode.\n */\nexport type ParsedCallbackV1 = {\n queueName: string;\n consumerGroup: string;\n messageId: string;\n region?: string;\n};\n\n/**\n * Full-message callback: payload and receipt handle are inlined,\n * so the SDK can process directly without an extra fetch.\n * Produced by v2beta small-body mode.\n */\nexport type ParsedCallbackV2 = {\n queueName: string;\n consumerGroup: string;\n messageId: string;\n region?: string;\n receiptHandle: string;\n deliveryCount?: number;\n createdAt?: string;\n expiresAt?: string;\n contentType?: string;\n visibilityDeadline?: string;\n rawBody?: ReadableStream<Uint8Array>;\n parsedPayload?: unknown;\n};\n\nexport type ParsedCallbackRequest = ParsedCallbackV1 | ParsedCallbackV2;\n\n/**\n * Check if a topic name matches a wildcard pattern.\n * Used by dev mode for route discovery from vercel.json.\n *\n * @param topicName - The topic name to test\n * @param pattern - A wildcard pattern ending with `*`\n * @returns `true` if topicName starts with the pattern prefix\n */\nexport function matchesWildcardPattern(\n topicName: string,\n pattern: string,\n): boolean {\n // Remove the trailing *\n const prefix = pattern.slice(0, -1);\n return topicName.startsWith(prefix);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * Parse and validate a v1beta structured CloudEvent body.\n *\n * @internal\n */\nfunction parseV1StructuredBody(\n body: unknown,\n contentType: string | null,\n): ParsedCallbackRequest {\n if (!contentType || !contentType.includes(\"application/cloudevents+json\")) {\n throw new Error(\n \"Invalid content type: expected 'application/cloudevents+json'\",\n );\n }\n\n if (\n !isRecord(body) ||\n !body.type ||\n !body.source ||\n !body.id ||\n !isRecord(body.data)\n ) {\n throw new Error(\"Invalid CloudEvent: missing required fields\");\n }\n\n if (body.type !== CLOUD_EVENT_TYPE_V1BETA) {\n throw new Error(\n `Invalid CloudEvent type: expected '${CLOUD_EVENT_TYPE_V1BETA}', got '${String(body.type)}'`,\n );\n }\n\n const { data } = body;\n const missingFields: string[] = [];\n if (!(\"queueName\" in data)) missingFields.push(\"queueName\");\n if (!(\"consumerGroup\" in data)) missingFields.push(\"consumerGroup\");\n if (!(\"messageId\" in data)) missingFields.push(\"messageId\");\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required CloudEvent data fields: ${missingFields.join(\", \")}`,\n );\n }\n\n return {\n queueName: String(data.queueName),\n consumerGroup: String(data.consumerGroup),\n messageId: String(data.messageId),\n };\n}\n\ntype HeaderSource = Headers | Record<string, string | string[] | undefined>;\n\nfunction getHeader(headers: HeaderSource, name: string): string | null {\n if (headers instanceof Headers) {\n return headers.get(name);\n }\n const value = headers[name];\n if (Array.isArray(value)) return value[0] ?? null;\n return (value as string) ?? null;\n}\n\nfunction parseBinaryHeaders(headers: HeaderSource): ParsedCallbackRequest {\n const ceType = getHeader(headers, \"ce-type\");\n if (ceType !== CLOUD_EVENT_TYPE_V2BETA) {\n throw new Error(\n `Invalid CloudEvent type: expected '${CLOUD_EVENT_TYPE_V2BETA}', got '${ceType}'`,\n );\n }\n\n const queueName = getHeader(headers, \"ce-vqsqueuename\");\n const consumerGroup = getHeader(headers, \"ce-vqsconsumergroup\");\n const messageId = getHeader(headers, \"ce-vqsmessageid\");\n\n const missingFields: string[] = [];\n if (!queueName) missingFields.push(\"ce-vqsqueuename\");\n if (!consumerGroup) missingFields.push(\"ce-vqsconsumergroup\");\n if (!messageId) missingFields.push(\"ce-vqsmessageid\");\n if (missingFields.length > 0) {\n throw new Error(\n `Missing required CloudEvent headers: ${missingFields.join(\", \")}`,\n );\n }\n\n const region = getHeader(headers, \"ce-vqsregion\") ?? undefined;\n\n const base = {\n queueName: queueName!,\n consumerGroup: consumerGroup!,\n messageId: messageId!,\n region,\n };\n\n const receiptHandle = getHeader(headers, \"ce-vqsreceipthandle\");\n if (!receiptHandle) {\n return base;\n }\n\n const result: ParsedCallbackV2 = { ...base, receiptHandle };\n\n const deliveryCount = getHeader(headers, \"ce-vqsdeliverycount\");\n if (deliveryCount) {\n result.deliveryCount = parseInt(deliveryCount, 10);\n }\n\n const createdAt = getHeader(headers, \"ce-vqscreatedat\");\n if (createdAt) {\n result.createdAt = createdAt;\n }\n\n const expiresAt = getHeader(headers, \"ce-vqsexpiresat\");\n if (expiresAt) {\n result.expiresAt = expiresAt;\n }\n\n const contentType = getHeader(headers, \"content-type\");\n if (contentType) {\n result.contentType = contentType;\n }\n\n const visibilityDeadline = getHeader(headers, \"ce-vqsvisibilitydeadline\");\n if (visibilityDeadline) {\n result.visibilityDeadline = visibilityDeadline;\n }\n\n return result;\n}\n\n/**\n * Parse a callback from a pre-parsed body and headers.\n *\n * For frameworks like Next.js Pages Router where the body has already been\n * parsed, use this instead of {@link parseCallback}.\n *\n * Detects the CloudEvent version from the `ce-type` header:\n * - `com.vercel.queue.v2beta`: binary content mode (metadata in headers,\n * payload in body). For small messages, the body is attached as `parsedPayload`.\n * - Otherwise: structured content mode (v1beta, entire CloudEvent in JSON body)\n *\n * @param body - The framework-parsed request body. Type depends on Content-Type\n * and framework configuration:\n * - v1beta: parsed CloudEvent JSON object\n * - v2beta: the message payload as parsed by the framework (object, Buffer, or string)\n * @param headers - HTTP headers\n * @returns Parsed callback request with routing metadata and optional payload\n */\nexport function parseRawCallback(\n body: unknown,\n headers: Record<string, string | string[] | undefined>,\n): ParsedCallbackRequest {\n const ceType = getHeader(headers, \"ce-type\");\n\n if (ceType === CLOUD_EVENT_TYPE_V2BETA) {\n const result = parseBinaryHeaders(headers);\n if (\"receiptHandle\" in result) {\n result.parsedPayload = body;\n }\n return result;\n }\n\n return parseV1StructuredBody(body, getHeader(headers, \"content-type\"));\n}\n\n/**\n * Parse and validate a CloudEvent callback from a Web API `Request` object.\n *\n * Detects the CloudEvent version from the `ce-type` header:\n * - `com.vercel.queue.v2beta`: binary content mode (metadata in headers,\n * payload in body). For v2beta, the body is attached as `rawBody` (a\n * ReadableStream) rather than being parsed.\n * - Otherwise: structured content mode (v1beta, entire CloudEvent in JSON body)\n *\n * For frameworks that pre-parse the body (e.g. Next.js Pages Router),\n * use {@link parseRawCallback} instead.\n */\nexport async function parseCallback(\n request: Request,\n): Promise<ParsedCallbackRequest> {\n const ceType = request.headers.get(\"ce-type\");\n\n if (ceType === CLOUD_EVENT_TYPE_V2BETA) {\n const result = parseBinaryHeaders(request.headers);\n if (\"receiptHandle\" in result && request.body) {\n result.rawBody = request.body;\n }\n return result;\n }\n\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n throw new Error(\"Failed to parse CloudEvent from request body\");\n }\n\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return parseRawCallback(body, headers);\n}\n\n/**\n * Core queue callback handler. Processes the message using the provided handler.\n *\n * This is the framework-agnostic core — it takes already-parsed request data\n * and throws on errors. Framework-specific wrappers (in `@vercel/queue/web`\n * and `@vercel/queue/nextjs/pages`) compose around this function to handle\n * request parsing and response formatting.\n *\n * @param handler - Function to process the message payload and metadata\n * @param request - A {@link ParsedCallbackV1} (routing metadata only, message\n * fetched by ID) or {@link ParsedCallbackV2} (full message inlined, no fetch).\n * @param options - Optional configuration (client, visibilityTimeoutSeconds)\n * @throws {Error} If binary mode request has a receipt handle but no payload\n * @throws {Error} If message processing fails\n *\n * @example\n * ```typescript\n * import { handleCallback, parseRawCallback } from \"@vercel/queue\";\n *\n * const parsed = parseRawCallback(body, headers);\n * await handleCallback(async (message, metadata) => {\n * console.log(\"Processing:\", message);\n * }, parsed);\n * ```\n */\nexport async function handleCallback<T = unknown>(\n handler: MessageHandler<T>,\n request: ParsedCallbackRequest,\n options?: HandleCallbackOptions,\n): Promise<void> {\n const { queueName, consumerGroup, messageId } = request;\n\n if (!options?.client) {\n throw new Error(\"HandleCallbackOptions.client is required\");\n }\n let api = getApiClient(options.client);\n if (request.region) {\n api = api.withRegion(request.region);\n }\n const topic = new Topic<T>(api, queueName);\n const cg = topic.consumerGroup(\n consumerGroup,\n options?.visibilityTimeoutSeconds !== undefined\n ? { visibilityTimeoutSeconds: options.visibilityTimeoutSeconds }\n : undefined,\n );\n\n if (\"receiptHandle\" in request) {\n const transport = api.getTransport() as Transport<T>;\n\n let payload: T;\n if (request.rawBody) {\n payload = await transport.deserialize(request.rawBody);\n } else if (request.parsedPayload !== undefined) {\n payload = request.parsedPayload as T;\n } else {\n throw new Error(\n \"Binary mode callback with receipt handle is missing payload\",\n );\n }\n\n const message: Message<T> = {\n messageId,\n payload,\n deliveryCount: request.deliveryCount ?? 1,\n createdAt: request.createdAt ? new Date(request.createdAt) : new Date(),\n expiresAt: request.expiresAt ? new Date(request.expiresAt) : undefined,\n contentType: request.contentType ?? transport.contentType,\n receiptHandle: request.receiptHandle,\n };\n\n const visibilityDeadline = request.visibilityDeadline\n ? new Date(request.visibilityDeadline)\n : undefined;\n\n await cg.consumeMessage(handler, message, {\n visibilityDeadline,\n retry: options?.retry,\n });\n } else {\n await cg.consume(handler, { messageId, retry: options?.retry });\n }\n}\n","export { getVercelOidcToken } from \"@vercel/oidc\";\n","import { ApiClient } from \"./api-client\";\nimport {\n handleCallback as coreHandleCallback,\n parseCallback,\n parseRawCallback,\n} from \"./callback\";\nimport { isDevMode, invokeDevHandlers, registerDevHandler } from \"./dev\";\nimport { Topic } from \"./topic\";\nimport type {\n MessageHandler,\n PollingQueueClientOptions,\n QueueClientOptions,\n ReceiveBatchOptions,\n ReceiveOptions,\n ReceiveResult,\n RetryHandler,\n SendOptions,\n SendResult,\n VercelRegion,\n} from \"./types\";\nimport {\n MessageAlreadyProcessedError,\n MessageNotAvailableError,\n MessageNotFoundError,\n} from \"./types\";\n\nconst apiClients = new WeakMap<object, ApiClient>();\nconst API_CLIENT_KEY = Symbol.for(\"@vercel/queue.apiClient\");\ntype CallbackRequestInput = Request | { request: Request };\n\nfunction setApi(client: object, api: ApiClient): void {\n apiClients.set(client, api);\n Object.defineProperty(client, API_CLIENT_KEY, {\n value: api,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n}\n\nfunction getApi(client: object): ApiClient {\n const api = apiClients.get(client);\n if (api) {\n return api;\n }\n\n const apiFromSymbol = (client as Record<symbol, unknown>)[API_CLIENT_KEY];\n if (typeof apiFromSymbol === \"object\" && apiFromSymbol !== null) {\n const resolvedApi = apiFromSymbol as ApiClient;\n apiClients.set(client, resolvedApi);\n return resolvedApi;\n }\n\n throw new Error(\n \"QueueClient not initialized. This may happen when multiple bundled copies \" +\n \"of @vercel/queue are loaded in local dev.\",\n );\n}\n\nfunction resolveCallbackRequest(input: CallbackRequestInput): Request {\n if (\"request\" in input) {\n return input.request;\n }\n return input;\n}\n\n/**\n * Resolve the internal ApiClient for a QueueClient instance.\n * Used by internal modules (callback.ts) that need API access from a user-provided QueueClient.\n * Not exported from the package entrypoint.\n */\nexport function getApiClient(client: QueueClient): ApiClient {\n return getApi(client);\n}\n\nconst DEFAULT_REGION: VercelRegion = \"iad1\";\n\nfunction resolveRegion(region?: VercelRegion): VercelRegion {\n if (region) return region;\n\n const fromEnv = process.env.VERCEL_REGION;\n if (fromEnv) return fromEnv;\n\n if (!isDevMode()) {\n console.warn(\n `[QueueClient] Region not detected — defaulting to \"${DEFAULT_REGION}\". ` +\n \"On Vercel this is set automatically via VERCEL_REGION. \" +\n \"To silence this warning, pass region explicitly: \" +\n 'new QueueClient({ region: \"iad1\" })',\n );\n }\n return DEFAULT_REGION;\n}\n\n/**\n * Queue client for push-based (callback) workflows.\n *\n * Use this client when Vercel delivers messages to your route handlers.\n * Provides {@link send}, {@link handleCallback}, and {@link handleNodeCallback}.\n *\n * Region is resolved automatically:\n * 1. Explicit `region` option (highest priority)\n * 2. `VERCEL_REGION` environment variable (set automatically on Vercel)\n * 3. Falls back to `\"iad1\"` with a console warning\n *\n * The constructor never throws — `new QueueClient()` always works.\n *\n * For manual polling workflows, use {@link PollingQueueClient} instead.\n *\n * @example\n * ```typescript\n * import { QueueClient } from \"@vercel/queue\";\n *\n * const queue = new QueueClient();\n * export const { send, handleCallback, handleNodeCallback } = queue;\n * ```\n */\nexport class QueueClient {\n constructor(options: QueueClientOptions = {}) {\n const region = resolveRegion(options.region);\n setApi(this, new ApiClient({ ...options, region }));\n }\n\n /**\n * Send a message to a topic.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { send } = new QueueClient();\n * await send(\"my-topic\", payload);\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param payload - The data to send (serialized via the configured transport)\n * @param options - Optional send options (idempotencyKey, retentionSeconds, delaySeconds, headers)\n * @returns `{ messageId }` — `messageId` is `null` when the server accepted\n * the message for deferred processing (no ID available yet)\n */\n send = async <T = unknown>(\n topicName: string,\n payload: T,\n options?: SendOptions,\n ): Promise<SendResult> => {\n const api = getApi(this);\n const result = await api.sendMessage<T>({\n queueName: topicName,\n payload,\n idempotencyKey: options?.idempotencyKey,\n retentionSeconds: options?.retentionSeconds,\n delaySeconds: options?.delaySeconds,\n headers: options?.headers,\n });\n\n if (result.messageId && isDevMode()) {\n invokeDevHandlers(\n topicName,\n result.messageId,\n api.getRegion(),\n options?.delaySeconds,\n options?.retentionSeconds,\n );\n }\n\n return { messageId: result.messageId };\n };\n\n /**\n * Create a Web API route handler for processing queue callback messages.\n *\n * Parses incoming `Request` as a CloudEvent and invokes the handler.\n * For use on Vercel — Vercel invokes this route when messages are available.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { handleCallback } = new QueueClient();\n * export const POST = handleCallback(handler);\n * ```\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Optional configuration\n * @param options.visibilityTimeoutSeconds - Message lock duration (default: 300, max: 3600)\n * @param options.retry - Called when the handler throws. Return `{ afterSeconds: N }` to\n * reschedule the message for redelivery after N seconds.\n * @returns A route handler that accepts either `Request` or `{ request: Request }`\n */\n handleCallback = <T = unknown>(\n handler: MessageHandler<T>,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n ): ((requestOrEvent: CallbackRequestInput) => Promise<Response>) => {\n if (isDevMode()) {\n registerDevHandler(handler as MessageHandler, this, options);\n }\n return async (requestOrEvent: CallbackRequestInput): Promise<Response> => {\n const request = resolveCallbackRequest(requestOrEvent);\n if (isDevMode() && request.headers.get(\"x-vercel-queue-prime\") === \"1\") {\n const primeFile = request.headers.get(\"x-vercel-queue-prime-file\");\n if (primeFile) {\n registerDevHandler(\n handler as MessageHandler,\n this,\n options,\n primeFile,\n );\n }\n return Response.json({ status: \"primed\" });\n }\n\n try {\n const parsed = await parseCallback(request);\n await coreHandleCallback(handler, parsed, {\n client: this,\n visibilityTimeoutSeconds: options?.visibilityTimeoutSeconds,\n retry: options?.retry,\n });\n return Response.json({ status: \"success\" });\n } catch (error) {\n console.error(\"Queue callback error:\", error);\n\n if (\n error instanceof Error &&\n (error.message.includes(\"Invalid content type\") ||\n error.message.includes(\"Invalid CloudEvent\") ||\n error.message.includes(\"Missing required CloudEvent\") ||\n error.message.includes(\"Failed to parse CloudEvent\") ||\n error.message.includes(\"Binary mode callback\"))\n ) {\n return Response.json({ error: error.message }, { status: 400 });\n }\n\n return Response.json(\n { error: \"Failed to process queue message\" },\n { status: 500 },\n );\n }\n };\n };\n\n /**\n * Create a Connect-style route handler for processing queue callback messages.\n * For use on Vercel — Vercel invokes this route when messages are available.\n *\n * For frameworks using the `(req, res)` middleware pattern where `req.body`\n * is pre-parsed (Next.js Pages Router, etc.).\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { handleNodeCallback } = new QueueClient();\n * app.post(\"/api/queue\", handleNodeCallback(handler));\n * ```\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Optional configuration\n * @param options.visibilityTimeoutSeconds - Message lock duration (default: 300, max: 3600)\n * @param options.retry - Called when the handler throws. Return `{ afterSeconds: N }` to\n * reschedule the message for redelivery after N seconds.\n * @returns A `(req, res) => Promise<void>` route handler\n */\n handleNodeCallback = <T = unknown>(\n handler: MessageHandler<T>,\n options?: { visibilityTimeoutSeconds?: number; retry?: RetryHandler },\n ): ((\n req: {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n },\n res: {\n status(code: number): { json(data: unknown): void; end(): void };\n end(): void;\n },\n ) => Promise<void>) => {\n if (isDevMode()) {\n registerDevHandler(handler as MessageHandler, this, options);\n }\n return async (req, res) => {\n if (req.method !== \"POST\") {\n res.status(200).end();\n return;\n }\n\n const primeHeader = req.headers[\"x-vercel-queue-prime\"];\n if (isDevMode() && primeHeader === \"1\") {\n const primeFileHeader = req.headers[\"x-vercel-queue-prime-file\"];\n const primeFile = Array.isArray(primeFileHeader)\n ? primeFileHeader[0]\n : primeFileHeader;\n if (primeFile) {\n registerDevHandler(\n handler as MessageHandler,\n this,\n options,\n primeFile,\n );\n }\n res.status(200).json({ status: \"primed\" });\n return;\n }\n\n try {\n const parsed = parseRawCallback(req.body, req.headers);\n await coreHandleCallback(handler, parsed, {\n client: this,\n visibilityTimeoutSeconds: options?.visibilityTimeoutSeconds,\n retry: options?.retry,\n });\n res.status(200).json({ status: \"success\" });\n } catch (error) {\n console.error(\"Queue callback error:\", error);\n\n if (\n error instanceof Error &&\n (error.message.includes(\"Invalid content type\") ||\n error.message.includes(\"Invalid CloudEvent\") ||\n error.message.includes(\"Missing required CloudEvent\") ||\n error.message.includes(\"Failed to parse CloudEvent\") ||\n error.message.includes(\"Binary mode callback\"))\n ) {\n res.status(400).json({ error: error.message });\n return;\n }\n\n res.status(500).json({ error: \"Failed to process queue message\" });\n }\n };\n };\n}\n\n/**\n * Queue client for poll-based (manual receive) workflows.\n *\n * Use this client when you manually poll for messages with {@link receive}.\n * Also provides {@link send} for publishing messages.\n *\n * Region is **required** because messages can only be received from the\n * region they were sent to. Use a fixed region (e.g. `\"iad1\"`) for both\n * sending and receiving.\n *\n * For push-based (callback) workflows on Vercel, use {@link QueueClient} instead.\n *\n * @example\n * ```typescript\n * import { PollingQueueClient } from \"@vercel/queue\";\n *\n * const queue = new PollingQueueClient({ region: \"iad1\" });\n * export const { send, receive } = queue;\n * ```\n */\nexport class PollingQueueClient {\n constructor(options: PollingQueueClientOptions) {\n setApi(this, new ApiClient(options));\n }\n\n /**\n * Send a message to a topic.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { send } = new PollingQueueClient({ region: \"iad1\" });\n * await send(\"my-topic\", payload);\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param payload - The data to send (serialized via the configured transport)\n * @param options - Optional send options (idempotencyKey, retentionSeconds, delaySeconds, headers)\n * @returns `{ messageId }` — `messageId` is `null` when the server accepted\n * the message for deferred processing (no ID available yet)\n */\n send = async <T = unknown>(\n topicName: string,\n payload: T,\n options?: SendOptions,\n ): Promise<SendResult> => {\n const api = getApi(this);\n const result = await api.sendMessage<T>({\n queueName: topicName,\n payload,\n idempotencyKey: options?.idempotencyKey,\n retentionSeconds: options?.retentionSeconds,\n delaySeconds: options?.delaySeconds,\n headers: options?.headers,\n });\n\n return { messageId: result.messageId };\n };\n\n /**\n * Receive and process messages from a topic.\n *\n * Each message is automatically locked, kept alive via periodic visibility\n * extensions during processing, and acknowledged upon successful handler completion.\n * The handler is not called when the queue is empty — check `result.ok` instead.\n *\n * This is an arrow function property so it can be destructured:\n * ```typescript\n * const { receive } = new PollingQueueClient({ region: \"iad1\" });\n * const result = await receive(\"my-topic\", \"my-group\", handler);\n * if (!result.ok) console.log(result.reason);\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param consumerGroup - Name of the consumer group (pattern: `[A-Za-z0-9_-]+`)\n * @param handler - Function to process each message payload and metadata.\n * Not called when the queue is empty.\n * @param options - Optional receive options (visibilityTimeoutSeconds, limit, or messageId)\n * @returns Discriminated result: `{ ok: true }` on success, `{ ok: false, reason }` otherwise\n */\n receive = async <T = unknown>(\n topicName: string,\n consumerGroup: string,\n handler: MessageHandler<T>,\n options?: ReceiveOptions,\n ): Promise<ReceiveResult> => {\n const api = getApi(this);\n const topic = new Topic<T>(api, topicName);\n const visibilityTimeoutSeconds =\n options && \"visibilityTimeoutSeconds\" in options\n ? options.visibilityTimeoutSeconds\n : undefined;\n const consumer = topic.consumerGroup(\n consumerGroup,\n visibilityTimeoutSeconds !== undefined\n ? { visibilityTimeoutSeconds }\n : {},\n );\n\n try {\n let count: number;\n const retry = options?.retry;\n if (options && \"messageId\" in options) {\n count = await consumer.consume(handler, {\n messageId: options.messageId,\n retry,\n });\n } else {\n const limit =\n options && \"limit\" in options\n ? (options as ReceiveBatchOptions).limit\n : undefined;\n count = await consumer.consume(handler, {\n ...(limit !== undefined ? { limit } : {}),\n retry,\n });\n }\n\n if (count === 0) {\n return { ok: false, reason: \"empty\" };\n }\n return { ok: true };\n } catch (error) {\n if (\n options &&\n \"messageId\" in options &&\n error instanceof MessageNotFoundError\n ) {\n return { ok: false, reason: \"not_found\", messageId: options.messageId };\n }\n if (\n options &&\n \"messageId\" in options &&\n error instanceof MessageNotAvailableError\n ) {\n return {\n ok: false,\n reason: \"not_available\",\n messageId: options.messageId,\n };\n }\n if (\n options &&\n \"messageId\" in options &&\n error instanceof MessageAlreadyProcessedError\n ) {\n return {\n ok: false,\n reason: \"already_processed\",\n messageId: options.messageId,\n };\n }\n throw error;\n }\n };\n}\n","import { QueueClient } from \"./client\";\nimport type {\n MessageHandler,\n RetryHandler,\n SendOptions,\n SendResult,\n VercelRegion,\n} from \"./types\";\n\ntype CallbackRequestInput = Request | { request: Request };\n\nlet _defaultClient: QueueClient | undefined;\n\nfunction getDefaultClient(): QueueClient {\n if (!_defaultClient) {\n _defaultClient = new QueueClient();\n }\n return _defaultClient;\n}\n\nfunction resolveClient(region?: VercelRegion): QueueClient {\n if (!region) return getDefaultClient();\n return new QueueClient({ region });\n}\n\n/**\n * Send a message to a topic using the default auto-configured client.\n *\n * The default client auto-detects the region from `VERCEL_REGION`,\n * falling back to `\"iad1\"` with a console warning on first use.\n *\n * This is an arrow function–free alternative to destructuring from a\n * {@link QueueClient} instance — import and use directly:\n * ```typescript\n * import { send } from \"@vercel/queue\";\n * await send(\"my-topic\", { hello: \"world\" });\n * ```\n *\n * @param topicName - Name of the topic (pattern: `[A-Za-z0-9_-]+`)\n * @param payload - The data to send (serialized via JsonTransport)\n * @param options - Optional send options. Pass `region` to route to a specific region.\n * @returns `{ messageId }` — `messageId` is `null` when the server accepted\n * the message for deferred processing\n */\nexport async function send<T = unknown>(\n topicName: string,\n payload: T,\n options?: SendOptions & { region?: VercelRegion },\n): Promise<SendResult> {\n return resolveClient(options?.region).send(topicName, payload, options);\n}\n\n/**\n * Create a Web API route handler for processing queue callback messages\n * using the default auto-configured client.\n *\n * The default client auto-detects the region from `VERCEL_REGION`,\n * falling back to `\"iad1\"` with a console warning on first use.\n * The callback region is determined automatically from the incoming\n * `ce-vqsregion` header in the v2beta event — no manual configuration needed.\n *\n * This is an arrow function–free alternative to destructuring from a\n * {@link QueueClient} instance — import and use directly:\n * ```typescript\n * import { handleCallback } from \"@vercel/queue\";\n * export const POST = handleCallback(async (message, metadata) => {\n * console.log(\"Processing:\", message);\n * });\n * ```\n *\n * @param handler - Function to process the message payload and metadata\n * @param options - Optional configuration (visibilityTimeoutSeconds, retry)\n * @returns A route handler that accepts either `Request` or `{ request: Request }`\n */\nexport function handleCallback<T = unknown>(\n handler: MessageHandler<T>,\n options?: {\n visibilityTimeoutSeconds?: number;\n retry?: RetryHandler;\n },\n): (requestOrEvent: CallbackRequestInput) => Promise<Response> {\n return getDefaultClient().handleCallback(handler, options);\n}\n\n/** @internal Reset singleton state — for testing only. */\nexport function _resetDefaultClient(): void {\n _defaultClient = undefined;\n}\n"],"mappings":"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","names":["handleCallback","resolve","pc","relative","resolve","path","handleCallback"]}