better-ship 0.40.0 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{application-xXTCe8o0.js → application-BwevrnLI.js} +75 -10
- package/dist/application-BwevrnLI.js.map +1 -0
- package/dist/application.d.ts +3 -3
- package/dist/application.js +2 -2
- package/dist/{auth-secondary-storage-CcNkkEk0.d.ts → auth-secondary-storage-DlzjamBm.d.ts} +2 -2
- package/dist/{auth-secondary-storage-CcNkkEk0.d.ts.map → auth-secondary-storage-DlzjamBm.d.ts.map} +1 -1
- package/dist/better-auth/apple-client-secret.d.ts +1 -1
- package/dist/better-auth/apple-client-secret.js +1 -1
- package/dist/better-auth/auth-client.js +1 -1
- package/dist/better-auth/rate-limit.d.ts +1 -1
- package/dist/better-auth/rate-limit.js +1 -1
- package/dist/better-auth/secondary-storage.d.ts +1 -1
- package/dist/better-auth.js +1 -1
- package/dist/billing/client.d.ts +1 -1
- package/dist/billing/client.js +1 -1
- package/dist/browser-support/floor.d.ts +1 -1
- package/dist/browser-support/floor.js +1 -1
- package/dist/browser-support/oxlint.js +1 -1
- package/dist/client-BZgpmuSp.js +27 -0
- package/dist/client-BZgpmuSp.js.map +1 -0
- package/dist/cloudflare/auth-secondary-storage.d.ts +1 -1
- package/dist/cloudflare/auth-secondary-storage.js +1 -1
- package/dist/cloudflare/durable-object-client.js +2 -2
- package/dist/cloudflare/durable-object-errors.d.ts +1 -1
- package/dist/cloudflare/durable-object-errors.js +1 -1
- package/dist/cloudflare/kv-client.js +2 -2
- package/dist/cloudflare/kv-errors.d.ts +1 -1
- package/dist/cloudflare/kv-errors.js +1 -1
- package/dist/cloudflare/queue.d.ts +3 -21
- package/dist/cloudflare/queue.d.ts.map +1 -1
- package/dist/cloudflare/queue.js +11 -52
- package/dist/cloudflare/queue.js.map +1 -1
- package/dist/cloudflare/r2-client.js +2 -2
- package/dist/cloudflare/r2-errors.d.ts +1 -1
- package/dist/cloudflare/r2-errors.js +1 -1
- package/dist/cloudflare/rate-limiter.d.ts +1 -1
- package/dist/cloudflare/rate-limiter.js +1 -1
- package/dist/cloudflare/scheduled.d.ts +1 -1
- package/dist/cloudflare/scheduled.js +1 -1
- package/dist/cloudflare/turnstile.d.ts +1 -1
- package/dist/cloudflare/turnstile.js +1 -1
- package/dist/cloudflare.d.ts +3 -3
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +6 -5
- package/dist/cloudflare.js.map +1 -1
- package/dist/{core-DOBZeYSX.js → core-CV8SQv01.js} +65 -4
- package/dist/core-CV8SQv01.js.map +1 -0
- package/dist/core.d.ts +2 -2
- package/dist/core.js +2 -2
- package/dist/{durable-object-errors-CcfTu0PQ.js → durable-object-errors-C7e7essH.js} +2 -2
- package/dist/{durable-object-errors-CcfTu0PQ.js.map → durable-object-errors-C7e7essH.js.map} +1 -1
- package/dist/{floor-BTBtPI9_.js → floor-BdRTO_LO.js} +2 -2
- package/dist/{floor-BTBtPI9_.js.map → floor-BdRTO_LO.js.map} +1 -1
- package/dist/http.d.ts +2 -2
- package/dist/http.js +2 -2
- package/dist/{index-Db2GV9ZP.d.ts → index-DIHLfC-p.d.ts} +44 -4
- package/dist/index-DIHLfC-p.d.ts.map +1 -0
- package/dist/{index-CtIdbnEZ.d.ts → index-tJzJUgTh.d.ts} +30 -4
- package/dist/index-tJzJUgTh.d.ts.map +1 -0
- package/dist/{kv-errors-B2k_2lyY.js → kv-errors-DXbnO7cB.js} +2 -2
- package/dist/{kv-errors-B2k_2lyY.js.map → kv-errors-DXbnO7cB.js.map} +1 -1
- package/dist/{metrics-DRCoGBNF.d.ts → metrics-CdpccKGI.d.ts} +2 -2
- package/dist/{metrics-DRCoGBNF.d.ts.map → metrics-CdpccKGI.d.ts.map} +1 -1
- package/dist/{outbox-repository-options-Dd-s5SxA.js → outbox-repository-options-BKapMX7X.js} +2 -2
- package/dist/{outbox-repository-options-Dd-s5SxA.js.map → outbox-repository-options-BKapMX7X.js.map} +1 -1
- package/dist/{outbox-repository-options-Cmf0vbBQ.d.ts → outbox-repository-options-BtAq0nAG.d.ts} +3 -3
- package/dist/{outbox-repository-options-Cmf0vbBQ.d.ts.map → outbox-repository-options-BtAq0nAG.d.ts.map} +1 -1
- package/dist/{payment-service.error-BR10zqxk.js → payment-service.error-oW2bKAfU.js} +2 -2
- package/dist/{payment-service.error-BR10zqxk.js.map → payment-service.error-oW2bKAfU.js.map} +1 -1
- package/dist/postgres.d.ts +3 -3
- package/dist/postgres.d.ts.map +1 -1
- package/dist/postgres.js +6 -5
- package/dist/postgres.js.map +1 -1
- package/dist/posthog/metrics.d.ts +1 -1
- package/dist/posthog/server.d.ts +3 -3
- package/dist/posthog/server.js +1 -1
- package/dist/{r2-errors-BF49eqU_.js → r2-errors-DzpOvciV.js} +2 -2
- package/dist/{r2-errors-BF49eqU_.js.map → r2-errors-DzpOvciV.js.map} +1 -1
- package/dist/{request-BYQodKDU.js → request-C5k8ME_7.js} +2 -2
- package/dist/{request-BYQodKDU.js.map → request-C5k8ME_7.js.map} +1 -1
- package/dist/resend.d.ts +3 -3
- package/dist/resend.js +2 -2
- package/dist/sentry/client.d.ts +1 -1
- package/dist/sentry/client.js +1 -1
- package/dist/sentry/server.d.ts +2 -2
- package/dist/sentry/tanstack.d.ts +1 -1
- package/dist/stripe/client.d.ts +7 -2
- package/dist/stripe/client.d.ts.map +1 -1
- package/dist/stripe/client.js +1 -1
- package/dist/stripe/payment-service.error.d.ts +1 -1
- package/dist/stripe/payment-service.error.js +1 -1
- package/dist/stripe/payment-service.js +1 -1
- package/dist/stripe/payment-webhook.d.ts +1 -1
- package/dist/stripe/payment-webhook.js +1 -1
- package/dist/stripe/request.js +1 -1
- package/dist/{stripe-fixture-yFUknTJO.js → stripe-fixture-11EmnD6F.js} +2 -2
- package/dist/{stripe-fixture-yFUknTJO.js.map → stripe-fixture-11EmnD6F.js.map} +1 -1
- package/dist/tanstack.d.ts +1 -1
- package/dist/tanstack.js +1 -1
- package/dist/testing/outbox-repository.d.ts +2 -2
- package/dist/testing/payment-service.js +2 -2
- package/dist/testing/stripe.js +1 -1
- package/dist/{webhook-verification-C4R6OO7f.js → webhook-verification-B8v3-LQ2.js} +2 -2
- package/dist/{webhook-verification-C4R6OO7f.js.map → webhook-verification-B8v3-LQ2.js.map} +1 -1
- package/dist/{webhook-verification-DL4L3zbu.d.ts → webhook-verification-Cy4Z5djk.d.ts} +2 -2
- package/dist/{webhook-verification-DL4L3zbu.d.ts.map → webhook-verification-Cy4Z5djk.d.ts.map} +1 -1
- package/package.json +1 -1
- package/src/application/index.ts +6 -0
- package/src/application/outbox-relay.ts +35 -13
- package/src/application/outbox-repository.ts +2 -0
- package/src/application/queue-or-rpc-publisher.ts +70 -0
- package/src/core/classify-failure.ts +12 -2
- package/src/core/index.ts +6 -0
- package/src/core/redelivery-policy.ts +66 -0
- package/src/infrastructure/cloudflare/d1-outbox-repository.ts +4 -1
- package/src/infrastructure/cloudflare/queue/index.ts +0 -1
- package/src/infrastructure/cloudflare/queue/queue-consumer.ts +11 -4
- package/src/infrastructure/postgres/postgres-outbox-repository.ts +4 -1
- package/src/infrastructure/stripe/client.ts +7 -3
- package/dist/application-xXTCe8o0.js.map +0 -1
- package/dist/client-Dv1Ch7yY.js +0 -20
- package/dist/client-Dv1Ch7yY.js.map +0 -1
- package/dist/core-DOBZeYSX.js.map +0 -1
- package/dist/index-CtIdbnEZ.d.ts.map +0 -1
- package/dist/index-Db2GV9ZP.d.ts.map +0 -1
- package/src/infrastructure/cloudflare/queue/redelivery-policy.ts +0 -64
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-CV8SQv01.js","names":["uuidv7","uuidv7"],"sources":["../src/core/app-error.ts","../src/core/missing-configuration.error.ts","../src/core/email-address.ts","../src/core/email-idempotency-key.ts","../src/core/email-service.error.ts","../src/core/email-deliverability.ts","../src/core/record-email-event.ts","../src/core/authentication.error.ts","../src/core/rate-limit.error.ts","../src/core/stale-session.error.ts","../src/core/not-authorized.error.ts","../src/core/internal.errors.ts","../src/core/request.errors.ts","../src/core/problem-details.ts","../src/core/error-table.ts","../src/core/database.error.ts","../src/core/defects.ts","../src/core/identity.ts","../src/core/define-messages.ts","../src/core/entity.ts","../src/core/failure-classification.ts","../src/core/transport-classification.ts","../src/core/cloudflare-classification.ts","../src/core/classify-failure.ts","../src/core/backoff.ts","../src/core/redelivery-policy.ts","../src/core/console-log-sink.ts","../src/core/logger.ts"],"sourcesContent":["import type { FailureClassification } from './failure-classification.ts'\n\n/**\n * The base of every expected failure. A subclass declares its tag and its classification,\n * so no boundary has to guess what kind of failure it holds. A boundary tells our errors from\n * raw throws with `instanceof AppError`; a value that fails it was never judged.\n *\n * A `readonly` field with a literal initializer keeps the literal type, so\n * `readonly _tag = 'StoreUnavailable'` is enough for `Result` unions and `matchError`.\n */\nexport abstract class AppError extends Error {\n abstract readonly _tag: string\n abstract readonly classification: FailureClassification\n\n override get name(): string {\n return this._tag\n }\n}\n","import { AppError } from './app-error.ts'\n\n/** Required configuration is absent. Ported from Porte's configuration.errors.ts. */\nexport class MissingConfigurationError extends AppError {\n readonly _tag = 'MissingConfigurationError'\n readonly classification = 'terminal'\n\n /** Name the missing setting without including its value. */\n constructor(readonly key: string) {\n super(`${key} is required`)\n }\n}\n","import { z } from 'zod'\n\n/** A parsed email address for message payloads and webhook recipients. Ported from Typist's `EmailSchema`. */\nexport const EmailAddressSchema = z.email().brand<'EmailAddress'>()\n\n/** An address the schema accepted. */\nexport type EmailAddress = z.infer<typeof EmailAddressSchema>\n","import type { z } from 'zod'\n\nimport { AppError } from './app-error.ts'\n\n/** A key only `emailIdempotencyKey` mints, so every send carries one built by its rules. */\nexport type EmailIdempotencyKey = string & z.core.$brand<'EmailIdempotencyKey'>\n\n// Resend accepts 1 to 256 characters. Source: https://resend.com/docs/dashboard/emails/idempotency-keys\nconst MAX_KEY_LENGTH = 256\n\n/** A key outside 1 to 256 characters. Keys come from stable ids, so this is a defect, not a retry. */\nexport class InvalidEmailIdempotencyKeyError extends AppError {\n readonly _tag = 'InvalidEmailIdempotencyKeyError'\n readonly classification = 'terminal'\n\n constructor(readonly length: number) {\n super(`Email idempotency key must have 1 to ${MAX_KEY_LENGTH} characters`)\n }\n}\n\n/**\n * `<scope>/<id>` for one logical send. Resend deduplicates it for 24 hours.\n * Derive `id` from a stable identity: a message id, a job id, a user id with a template name.\n * The same key must map to an identical payload; a changed body is rejected as terminal.\n * A random `id` means every request is a deliberate new send, as a sign-in code resend is.\n * Source: https://resend.com/docs/dashboard/emails/idempotency-keys\n */\nexport function emailIdempotencyKey(scope: string, id: string): EmailIdempotencyKey {\n const key = `${scope}/${id}`\n if (scope.length === 0 || id.length === 0 || key.length > MAX_KEY_LENGTH)\n throw new InvalidEmailIdempotencyKeyError(key.length)\n // SAFETY: the brand is a compile-time mark; the checks above are the whole rule.\n return key as EmailIdempotencyKey\n}\n","import { AppError } from './app-error.ts'\nimport type { FailureClassification } from './failure-classification.ts'\n\n/** Why the provider rejected a send. The reason owns the classification, so the two never disagree. */\nexport type EmailSendFailureReason =\n | 'rate_limited'\n | 'idempotency_conflict'\n | 'provider_error'\n | 'quota_exceeded'\n | 'invalid_request'\n | 'configuration'\n\nconst CLASSIFICATION_BY_REASON = {\n rate_limited: 'transient',\n idempotency_conflict: 'transient',\n provider_error: 'transient',\n quota_exceeded: 'terminal',\n invalid_request: 'terminal',\n configuration: 'terminal',\n} satisfies Record<EmailSendFailureReason, FailureClassification>\n\n/**\n * The provider rejected a send. The boundary that awaited the send logs once; the adapter never does.\n * `retryAfter` is the server's delay in seconds when it sent one, so `retryAfterSecondsOf` reads it.\n */\nexport class EmailServiceError extends AppError {\n readonly _tag = 'EmailServiceError'\n readonly classification: FailureClassification\n readonly reason: EmailSendFailureReason\n readonly provider: string\n readonly providerCode: string\n readonly statusCode: number | null\n readonly retryAfter: number | null\n\n constructor(args: {\n readonly reason: EmailSendFailureReason\n readonly provider: string\n readonly providerCode: string\n readonly statusCode: number | null\n readonly retryAfter: number | null\n readonly cause: unknown\n }) {\n super(`Email request failed: ${args.provider} ${args.providerCode}`, { cause: args.cause })\n this.reason = args.reason\n this.classification = CLASSIFICATION_BY_REASON[args.reason]\n this.provider = args.provider\n this.providerCode = args.providerCode\n this.statusCode = args.statusCode\n this.retryAfter = args.retryAfter\n }\n}\n","import { z } from 'zod'\n\n/** The bounce classes Resend reports, ported from Typist's comm-eligibility.ts. */\nexport const BounceTypeSchema = z.enum(['Permanent', 'Transient', 'Undetermined'])\n\n/** One bounce class. */\nexport type BounceType = z.infer<typeof BounceTypeSchema>\n\n/** Parse a provider's bounce type. An unknown value is `Undetermined`, which suppresses. */\nexport function parseBounceType(value: string | undefined): BounceType {\n const parsed = BounceTypeSchema.safeParse(value)\n return parsed.success ? parsed.data : 'Undetermined'\n}\n\nconst BOUNCE_SEVERITY = {\n Transient: 1,\n Undetermined: 2,\n Permanent: 3,\n} satisfies Record<BounceType, number>\n\n/** Keep the higher severity. Equal severity permits replacement; callers own timestamp ordering. */\nexport function shouldUpdateBounce(incoming: BounceType, current: BounceType | null): boolean {\n if (current === null) return true\n return BOUNCE_SEVERITY[incoming] >= BOUNCE_SEVERITY[current]\n}\n\n/** Typist's send policy: no complaint, and either no bounce or a transient one. Delivery is not guaranteed. */\nexport function isEmailDeliverable(bounceType: BounceType | null, complained: boolean): boolean {\n if (complained) return false\n return bounceType === null || bounceType === 'Transient'\n}\n","import { z } from 'zod'\n\nimport { EmailAddressSchema } from './email-address.ts'\nimport { BounceTypeSchema } from './email-deliverability.ts'\n\n/**\n * The payload of the command an application registers to record a bounce or a complaint.\n * Register it under a name of the application's choice in `defineMessages`; `recordEmailEvent` handles it.\n */\nexport const RecordEmailEventPayloadSchema = z.object({\n recipients: z.array(EmailAddressSchema).min(1),\n event: z.discriminatedUnion('type', [\n z.object({\n type: z.literal('bounced'),\n bounceType: BounceTypeSchema,\n bounceSubType: z.string().nullable(),\n }),\n z.object({ type: z.literal('complained') }),\n ]),\n})\n\n/** A parsed payload. */\nexport type RecordEmailEventPayload = z.infer<typeof RecordEmailEventPayloadSchema>\n","import { AppError } from './app-error.ts'\n\n/** A protected operation requires a session that the caller did not provide. */\nexport class AuthenticationError extends AppError {\n readonly _tag = 'AuthenticationError'\n readonly classification = 'terminal'\n\n constructor() {\n super('Authentication required')\n }\n}\n","import { AppError } from './app-error.ts'\n\n/** HTTP 429 with a retry delay in seconds. A null delay means the response supplies no valid duration. */\nexport class RateLimitError extends AppError {\n readonly _tag = 'RateLimitError'\n readonly classification = 'transient'\n readonly status = 429\n\n constructor(readonly retryAfter: number | null) {\n super('Too many requests')\n }\n}\n","import { AppError } from './app-error.ts'\n\n/** A presented session cookie no longer resolves; the application owns cleanup and redirect policy. */\nexport class StaleSessionError extends AppError {\n readonly _tag = 'StaleSessionError'\n readonly classification = 'terminal'\n\n constructor() {\n super('Session is no longer valid. Sign in again.')\n }\n}\n","import { AppError } from './app-error.ts'\n\n/** The authenticated caller cannot perform this operation. Ported from Porte's auth.errors.ts. */\nexport class NotAuthorizedError extends AppError {\n readonly _tag = 'NotAuthorizedError'\n readonly classification = 'terminal'\n\n constructor() {\n super('Not allowed')\n }\n}\n","import { AppError } from './app-error.ts'\n\n/** Safe public replacement for an unknown failure, ported from Porte's internal.errors.ts. */\nexport class InternalServerError extends AppError {\n readonly _tag = 'InternalServerError'\n readonly classification = 'unknown'\n\n constructor() {\n super('Something went wrong')\n }\n}\n\n/** Safe public replacement for a classified transient failure. */\nexport class ServiceUnavailableError extends AppError {\n readonly _tag = 'ServiceUnavailableError'\n readonly classification = 'transient'\n\n constructor() {\n super('Try again shortly')\n }\n}\n","import { z } from 'zod'\n\nimport { AppError } from './app-error.ts'\nimport type { ValidationProblemError } from './problem-details.ts'\n\n/** One invalid value as a validator reports it: a message and a path of keys. */\nexport type ValidationIssue = {\n readonly message: string\n readonly path: readonly PropertyKey[]\n}\n\n/** Invalid user input, one entry per invalid value in the RFC 9457 shape. Technical failures use another error. */\nexport class ValidationError extends AppError {\n readonly _tag = 'ValidationError'\n readonly classification = 'terminal'\n\n constructor(\n readonly errors: readonly ValidationProblemError[],\n message = 'The request was not valid',\n ) {\n super(message)\n }\n\n /** Convert a Zod error. Each issue path becomes a JSON Pointer. */\n static fromZod(error: z.ZodError, message?: string): ValidationError {\n return ValidationError.fromIssues(error.issues, message)\n }\n\n /** Convert issues from any validator, such as issues TanStack serialized into an error message. */\n static fromIssues(issues: readonly ValidationIssue[], message?: string): ValidationError {\n return new ValidationError(\n issues.map((issue) => ({ detail: issue.message, pointer: jsonPointer(issue.path) })),\n message,\n )\n }\n}\n\n/** The server cannot parse the request syntax. */\nexport class MalformedRequestError extends AppError {\n readonly _tag = 'MalformedRequestError'\n readonly classification = 'terminal'\n\n constructor(args: { cause: unknown }) {\n super('The request was malformed', args)\n }\n}\n\n/** No resource matches the requested HTTP path. */\nexport class ResourceNotFoundError extends AppError {\n readonly _tag = 'ResourceNotFoundError'\n readonly classification = 'terminal'\n\n constructor() {\n super('Resource not found')\n }\n}\n\n/** A WebSocket route received a request without an upgrade. */\nexport class UpgradeRequiredError extends AppError {\n readonly _tag = 'UpgradeRequiredError'\n readonly classification = 'terminal'\n\n constructor() {\n super('WebSocket upgrade required')\n }\n}\n\n/** The requested operation did not answer before its deadline. */\nexport class RequestTimeoutError extends AppError {\n readonly _tag = 'RequestTimeoutError'\n readonly classification = 'transient'\n\n constructor() {\n super('The request timed out')\n }\n}\n\nconst readablePathSchema = z.array(z.union([z.string(), z.number()]))\n\n// A symbol step cannot be shown, so the pointer keeps only the steps a person can read.\nfunction jsonPointer(path: readonly PropertyKey[]): string {\n const parsed = readablePathSchema.safeParse(path)\n const steps = parsed.success ? parsed.data : []\n if (steps.length === 0) return '#'\n return `#/${steps.map((step) => String(step).replaceAll('~', '~0').replaceAll('/', '~1')).join('/')}`\n}\n","import { z } from 'zod'\n\n/**\n * The standard RFC 9457 body for a failed HTTP response.\n * The HTTP response status remains authoritative; extensions may add problem-specific data.\n * @see https://http.dev/problem-details\n */\nexport const ProblemDetailsSchema = z.looseObject({\n /**\n * Stable URI for the problem type; use `about:blank` when the HTTP status is sufficient.\n * @example \"about:blank\"\n */\n type: z.string(),\n /**\n * Stable human-readable name for the problem type.\n * @example \"Service Unavailable\"\n */\n title: z.string(),\n /**\n * Safe human-readable explanation for this occurrence; clients must not parse it.\n * @example \"The service is unavailable.\"\n */\n detail: z.string().optional(),\n /**\n * URI reference for this occurrence; omit it when no correlation resource exists.\n * @example \"/problems/occurrences/01K5F6Y7\"\n */\n instance: z.string().optional(),\n})\n\n/** An RFC 9457 problem body for a failed HTTP response. */\nexport type ProblemDetails = z.infer<typeof ProblemDetailsSchema>\n\n/** One invalid value in a `422` validation problem. */\nexport const ValidationProblemErrorSchema = z.object({\n /**\n * Safe explanation of why this value is invalid.\n * @example \"Must be a positive integer.\"\n */\n detail: z.string(),\n /**\n * RFC 6901 JSON Pointer fragment for the invalid value.\n * @example \"#/age\"\n */\n pointer: z.string().regex(/^#(?:\\/(?:[^~]|~[01])*)*$/u),\n})\n\n/** One invalid value in a `422` validation problem. */\nexport type ValidationProblemError = z.infer<typeof ValidationProblemErrorSchema>\n\n/** An RFC 9457 validation problem with one or more invalid content values. */\nexport const ValidationProblemDetailsSchema = ProblemDetailsSchema.extend({\n errors: z.array(ValidationProblemErrorSchema).min(1),\n})\n\n/** An RFC 9457 validation problem with one or more invalid content values. */\nexport type ValidationProblemDetails = z.infer<typeof ValidationProblemDetailsSchema>\n","import { panic } from 'better-result'\nimport { z } from 'zod'\n\nimport { AppError } from './app-error.ts'\nimport { AuthenticationError } from './authentication.error.ts'\nimport { InternalServerError, ServiceUnavailableError } from './internal.errors.ts'\nimport { NotAuthorizedError } from './not-authorized.error.ts'\nimport { ValidationProblemErrorSchema } from './problem-details.ts'\nimport { RateLimitError } from './rate-limit.error.ts'\nimport {\n MalformedRequestError,\n RequestTimeoutError,\n ResourceNotFoundError,\n UpgradeRequiredError,\n ValidationError,\n} from './request.errors.ts'\nimport { StaleSessionError } from './stale-session.error.ts'\n\ntype PublicFields = z.ZodObject\n\n/**\n * One public error: its class, its HTTP status, and the extra properties a client may read.\n * `fields` strips the thrown error on the server and parses the payload in the browser.\n */\nexport type ErrorEntry<Tag extends string, Fields extends PublicFields = PublicFields> = {\n readonly error: abstract new (...args: never[]) => AppError & { readonly _tag: Tag }\n readonly status: number\n readonly fields?: Fields\n}\n\ntype AnyErrorEntry = ErrorEntry<string>\n\n/** Entries keyed by tag. The compiler rejects a key that differs from the class's `_tag`. */\nexport type ErrorEntries<Entries> = {\n readonly [Tag in keyof Entries & string]: ErrorEntry<Tag>\n}\n\ntype EntryPayload<Tag extends string, Entry> = Entry extends {\n readonly fields: infer Fields extends z.ZodType\n}\n ? { readonly _tag: Tag; readonly message: string } & z.output<Fields>\n : { readonly _tag: Tag; readonly message: string }\n\ntype PayloadOfEntries<Entries> = {\n [Tag in keyof Entries & string]: EntryPayload<Tag, Entries[Tag]>\n}[keyof Entries & string]\n\n/** The HTTP status and public payload for one resolved failure. */\nexport type ResolvedError<Payload> = {\n readonly status: number\n readonly payload: Payload\n}\n\n/**\n * One application's public errors, shared by every transport boundary and the browser.\n * `resolve` and `fallback` serve boundaries. `parse` and `generic` serve screens.\n */\nexport type ErrorTable<Entries> = {\n readonly entries: Entries\n /** The discriminated union of every entry's `_tag`, `message`, and fields. */\n readonly payloadSchema: z.ZodType<PayloadOfEntries<Entries>>\n /** The `InternalServerError` payload, for screens that must show something. */\n readonly generic: PayloadOfEntries<Entries>\n /** Read a rejection value. Null means no known tag, so the request never reached the Worker. */\n parse(cause: unknown): PayloadOfEntries<Entries> | null\n /** Narrow a rejection value to one tag's payload, for a caller that acts on that one error. */\n is<Tag extends keyof Entries & string>(\n cause: unknown,\n tag: Tag,\n ): cause is Extract<PayloadOfEntries<Entries>, { readonly _tag: Tag }>\n /** Match a local instance or a remote error by tag. Null means the failure is not public. */\n resolve(cause: unknown): ResolvedError<PayloadOfEntries<Entries>> | null\n /** The replacement for an unmapped failure: 503 when it declared itself transient, else 500. */\n fallback(cause: unknown): ResolvedError<PayloadOfEntries<Entries>>\n}\n\n/** The union of payloads a table can produce. */\nexport type ErrorPayloadOf<Table> =\n Table extends ErrorTable<infer Entries> ? PayloadOfEntries<Entries> : never\n\n/** The union of tags a table contains. */\nexport type ErrorTagOf<Table> =\n Table extends ErrorTable<infer Entries> ? keyof Entries & string : never\n\nfunction entriesOf<const Entries extends ErrorEntries<Entries>>(entries: Entries): Entries {\n return entries\n}\n\nconst ValidationFields = z.object({ errors: z.array(ValidationProblemErrorSchema) })\nconst RateLimitFields = z.object({ retryAfter: z.number().nullable() })\n\n/** The errors every application can throw, with their statuses. `defineErrors` includes them. */\nexport const sharedErrors = entriesOf({\n MalformedRequestError: { error: MalformedRequestError, status: 400 },\n AuthenticationError: { error: AuthenticationError, status: 401 },\n StaleSessionError: { error: StaleSessionError, status: 401 },\n NotAuthorizedError: { error: NotAuthorizedError, status: 403 },\n ResourceNotFoundError: { error: ResourceNotFoundError, status: 404 },\n ValidationError: { error: ValidationError, status: 422, fields: ValidationFields },\n UpgradeRequiredError: { error: UpgradeRequiredError, status: 426 },\n RateLimitError: { error: RateLimitError, status: 429, fields: RateLimitFields },\n InternalServerError: { error: InternalServerError, status: 500 },\n ServiceUnavailableError: { error: ServiceUnavailableError, status: 503 },\n RequestTimeoutError: { error: RequestTimeoutError, status: 504 },\n})\n\ntype MergedEntries<Entries> = Omit<typeof sharedErrors, keyof Entries> & Entries\n\n// Workers RPC drops the prototype but keeps own properties and marks the error as remote.\nconst RemoteErrorSchema = z.object({\n _tag: z.string(),\n message: z.string(),\n remote: z.literal(true),\n})\n\ntype Match = { readonly tag: string; readonly entry: AnyErrorEntry; readonly error: Error }\n\nfunction match(byTag: ReadonlyMap<string, AnyErrorEntry>, cause: unknown): Match | null {\n if (cause instanceof AppError) {\n const entry = byTag.get(cause._tag)\n if (entry === undefined || !(cause instanceof entry.error)) return null\n return { tag: cause._tag, entry, error: cause }\n }\n if (!(cause instanceof Error)) return null\n const remote = RemoteErrorSchema.safeParse(cause)\n if (!remote.success) return null\n const entry = byTag.get(remote.data._tag)\n return entry === undefined ? null : { tag: remote.data._tag, entry, error: cause }\n}\n\n/**\n * Build the application's error table. The shared entries are always included;\n * an entry with the same key replaces the shared one.\n */\nexport function defineErrors<const Entries extends ErrorEntries<Entries>>(\n entries: Entries,\n): ErrorTable<MergedEntries<Entries>> {\n type Payload = PayloadOfEntries<MergedEntries<Entries>>\n const merged = { ...sharedErrors, ...entries }\n const byTag: ReadonlyMap<string, AnyErrorEntry> = new Map(Object.entries<AnyErrorEntry>(merged))\n\n const resolve = (cause: unknown): ResolvedError<Payload> | null => {\n const found = match(byTag, cause)\n if (found === null) return null\n const fields = found.entry.fields?.safeParse(found.error)\n if (fields !== undefined && !fields.success) return null\n // SAFETY: The entry's own `fields` schema produced these properties, so the payload has the shape declared for this tag.\n const payload = { _tag: found.tag, message: found.error.message, ...fields?.data } as Payload\n return { status: found.entry.status, payload }\n }\n\n const resolveShared = (error: AppError): ResolvedError<Payload> =>\n resolve(error) ?? panic(`Error table cannot resolve shared error ${error._tag}`)\n const generic = resolveShared(new InternalServerError())\n const unavailable = resolveShared(new ServiceUnavailableError())\n\n const variants = [...byTag].map(([tag, entry]) =>\n // oxlint-disable-next-line anti-slop/no-shape-in-symbol-names -- Zod names an object schema's property map `shape`.\n z.strictObject({ _tag: z.literal(tag), message: z.string(), ...entry.fields?.shape }),\n )\n const [first, ...rest] = variants\n if (first === undefined) return panic('Error table has no entries')\n // Each variant is one entry's `_tag`, `message`, and fields, which is the union `PayloadOfEntries` describes.\n const payloadSchema = z.discriminatedUnion('_tag', [first, ...rest]).pipe(z.custom<Payload>())\n\n // No return annotation: TypeScript resolves the deferred payload union differently in that position.\n const parse = (cause: unknown) => {\n const parsed = payloadSchema.safeParse(cause)\n return parsed.success ? parsed.data : null\n }\n\n return {\n entries: merged,\n payloadSchema,\n generic: generic.payload,\n parse,\n is<Tag extends keyof MergedEntries<Entries> & string>(\n cause: unknown,\n tag: Tag,\n ): cause is Extract<Payload, { readonly _tag: Tag }> {\n const parsed = parse(cause)\n return parsed !== null && parsed._tag === tag\n },\n resolve,\n fallback: (cause) =>\n cause instanceof AppError && cause.classification === 'transient' ? unavailable : generic,\n }\n}\n","import { AppError } from './app-error.ts'\nimport type { FailureClassification } from './failure-classification.ts'\n\n/** SQLite reports these constraint categories through D1. */\nexport type D1ConstraintKind = 'unique' | 'not_null' | 'foreign_key' | 'check'\n\n/** Database evidence for callers that interpret a specific code or constraint. */\nexport type DatabaseFailure =\n | {\n readonly database: 'd1'\n readonly code: string | undefined\n readonly kind: D1ConstraintKind | undefined\n readonly table: string | undefined\n readonly column: string | undefined\n readonly constraintName: string | undefined\n }\n | {\n readonly database: 'postgres'\n readonly code: string | undefined\n readonly table_name: string | undefined\n readonly column_name: string | undefined\n readonly constraint_name: string | undefined\n }\n\n/** Classification describes the failure; callers must separately establish whether repetition is safe. */\nexport class DatabaseError extends AppError {\n readonly _tag = 'DatabaseError'\n\n constructor(\n readonly operation: string,\n readonly classification: FailureClassification,\n readonly details: DatabaseFailure,\n options: { readonly cause: unknown },\n ) {\n super(`Database operation failed: ${operation}`, options)\n }\n}\n","import { panic } from 'better-result'\n\n/**\n * Mark a line the types say cannot run. A union member without a branch stops compilation here.\n *\n * @throws Panic when a value outside the union arrives at runtime.\n */\nexport function unreachable(value: never): never {\n return panic(`Unreachable: ${String(value)}`)\n}\n\n/**\n * Mark a body that is not written yet. A defect, not an expected failure.\n *\n * @param what - The behavior the body will provide, such as `invoice export`.\n * @throws Panic always.\n */\nexport function notImplemented(what: string): never {\n return panic(`Not implemented: ${what}`)\n}\n","import { v7 as uuidv7 } from 'uuid'\nimport { z } from 'zod'\n\n/** A string only `create()` or `schema.parse()` of the same kind can produce. */\nexport type Id<Brand extends string> = string & z.core.$brand<Brand>\n\n/** One id kind the application mints. `schema` parses untrusted input; `create` mints a uuid v7. */\nexport type IdDefinition<Brand extends string> = {\n readonly schema: z.core.$ZodBranded<z.ZodUUID, Brand>\n /** Mint a new time-ordered id. No parse: we produced it, so it is valid by construction. */\n create(): Id<Brand>\n}\n\n/** The id type of a definition: `type CallId = IdOf<typeof CallId>`. */\nexport type IdOf<Definition extends IdDefinition<string>> = z.output<Definition['schema']>\n\n/**\n * Define an id kind the application mints: `export const CallId = defineId('CallId')`.\n * An id another system mints, such as a provider's call id, stays a plain branded schema.\n */\nexport function defineId<const Brand extends string>(brand: Brand): IdDefinition<Brand> {\n const schema = z.uuidv7({ error: `Invalid ${brand}` })\n return {\n // SAFETY: `brand()` is type-only and returns a conditional TypeScript cannot reduce for a generic brand; for every literal it is this branded schema.\n schema: schema.brand<Brand>() as z.core.$ZodBranded<z.ZodUUID, Brand>,\n // SAFETY: uuidv7() always yields a valid v7 uuid, and the brand is a compile-time mark only.\n create: () => uuidv7() as Id<Brand>,\n }\n}\n","import { panic } from 'better-result'\nimport { v7 as uuidv7 } from 'uuid'\nimport { z } from 'zod'\n\nimport { AppError } from './app-error.ts'\nimport type { MessageId } from './messages.ts'\n\n/** Payload schemas keyed by message name. Payloads cannot declare `type`, `name`, or `id`. */\nexport type PayloadSchemas = Readonly<Record<string, z.ZodType<object>>>\n\n/** Optional payload schema maps for one message collection. */\nexport type MessageDefinition = {\n readonly commands?: PayloadSchemas\n readonly events?: PayloadSchemas\n readonly queries?: PayloadSchemas\n}\n\nconst completed = Symbol('MessageCollection')\nconst MessageIdSchema = z.string().min(1)\nconst envelopes = {\n command: z.object({ type: z.literal('command'), id: MessageIdSchema }),\n event: z.object({ type: z.literal('event'), id: MessageIdSchema }),\n query: z.object({ type: z.literal('query') }),\n}\n\ntype MessageKind = keyof typeof envelopes\ntype RoutingField = 'type' | 'name' | 'id'\ntype SchemaMap = Readonly<Record<string, z.ZodType<object>>>\ntype EmptySchemas = Record<never, never>\ntype SchemaMaps = {\n readonly commandSchemas: SchemaMap\n readonly eventSchemas: SchemaMap\n readonly querySchemas: SchemaMap\n}\ntype CompletedMessages = SchemaMaps & { readonly [completed]: true }\ntype SchemaOf<Schemas extends SchemaMap> = Schemas[keyof Schemas & string]\ntype Payload<Message> = Message extends object ? Omit<Message, RoutingField> : never\n\n/** Complete schemas, union schemas, and factories for one message collection. */\nexport type MessageCollection<Maps extends SchemaMaps> = Maps & {\n readonly [completed]: true\n readonly commandSchema: z.ZodUnion<SchemaOf<Maps['commandSchemas']>[]>\n readonly eventSchema: z.ZodUnion<SchemaOf<Maps['eventSchemas']>[]>\n readonly querySchema: z.ZodUnion<SchemaOf<Maps['querySchemas']>[]>\n /** Commands and events can cross a queue. Queries cannot. */\n readonly queueSchema: z.ZodUnion<\n (SchemaOf<Maps['commandSchemas']> | SchemaOf<Maps['eventSchemas']>)[]\n >\n /** Add the command envelope without parsing. The default ID is UUID v7; supplied IDs stay unchanged. */\n createCommand<Name extends keyof Maps['commandSchemas'] & string>(\n this: void,\n name: Name,\n payload: Payload<z.output<Maps['commandSchemas'][NoInfer<Name>]>>,\n id?: MessageId,\n ): z.output<Maps['commandSchemas'][Name]>\n /** Add the event envelope without parsing. The default ID is UUID v7; supplied IDs stay unchanged. */\n createEvent<Name extends keyof Maps['eventSchemas'] & string>(\n this: void,\n name: Name,\n payload: Payload<z.output<Maps['eventSchemas'][NoInfer<Name>]>>,\n id?: MessageId,\n ): z.output<Maps['eventSchemas'][Name]>\n /** Add the query envelope without parsing. Queries have no ID. */\n createQuery<Name extends keyof Maps['querySchemas'] & string>(\n this: void,\n name: Name,\n payload: Payload<z.output<Maps['querySchemas'][NoInfer<Name>]>>,\n ): z.output<Maps['querySchemas'][Name]>\n}\n\n/** The command union inferred from a collection's complete schemas. */\nexport type CommandOf<Messages extends CompletedMessages> = z.output<\n SchemaOf<Messages['commandSchemas']>\n>\n\n/** The event union inferred from a collection's complete schemas. */\nexport type EventOf<Messages extends CompletedMessages> = z.output<\n SchemaOf<Messages['eventSchemas']>\n>\n\n/** The query union inferred from a collection's complete schemas. */\nexport type QueryOf<Messages extends CompletedMessages> = z.output<\n SchemaOf<Messages['querySchemas']>\n>\n\n/** Every message inferred from a collection's complete schemas. */\nexport type MessageOf<Messages extends CompletedMessages> =\n | CommandOf<Messages>\n | EventOf<Messages>\n | QueryOf<Messages>\n\ntype KeysOfUnion<Value> = Value extends Value ? keyof Value : never\ntype WithoutRoutingFields<Schemas extends PayloadSchemas> = {\n readonly [Name in keyof Schemas]: KeysOfUnion<z.output<Schemas[Name]>> &\n RoutingField extends never\n ? Schemas[Name]\n : never\n}\n\nfunction messageSchema<\n Kind extends MessageKind,\n Name extends string,\n Schema extends z.ZodType<object>,\n>(kind: Kind, name: Name, payload: Schema) {\n return z.intersection(envelopes[kind], z.object({ name: z.literal(name) })).and(payload)\n}\n\ntype CompleteSchemas<Kind extends MessageKind, Schemas extends PayloadSchemas> = {\n readonly [Name in keyof Schemas & string]: ReturnType<\n typeof messageSchema<Kind, Name, Schemas[Name]>\n >\n}\n\nfunction completeSchemas<Kind extends MessageKind, Schemas extends PayloadSchemas>(\n kind: Kind,\n schemas: Schemas | undefined,\n): CompleteSchemas<Kind, Schemas> {\n const entries = Object.entries<z.ZodType<object>>(schemas ?? {}).map(([name, payload]) => [\n name,\n messageSchema(kind, name, payload),\n ])\n // SAFETY: Each entry preserves its name and wraps its payload schema with the selected envelope.\n return Object.freeze(Object.fromEntries(entries)) as CompleteSchemas<Kind, Schemas>\n}\n\nfunction unionOf<Schemas extends SchemaMap>(schemas: Schemas): z.ZodUnion<SchemaOf<Schemas>[]> {\n // SAFETY: Object.values contains exactly the complete schemas indexed by this map's keys.\n return z.union(Object.values(schemas)) as z.ZodUnion<SchemaOf<Schemas>[]>\n}\n\nfunction collection<Maps extends SchemaMaps>(maps: Maps): MessageCollection<Maps> {\n return Object.freeze<MessageCollection<Maps>>({\n ...maps,\n [completed]: true,\n commandSchema: unionOf<Maps['commandSchemas']>(maps.commandSchemas),\n eventSchema: unionOf<Maps['eventSchemas']>(maps.eventSchemas),\n querySchema: unionOf<Maps['querySchemas']>(maps.querySchemas),\n // SAFETY: The queue union contains the command and event schemas from these maps, without rebuilding them.\n queueSchema: z.union([\n ...Object.values(maps.commandSchemas),\n ...Object.values(maps.eventSchemas),\n ]) as MessageCollection<Maps>['queueSchema'],\n createCommand: (name, payload, id = uuidv7()) => {\n // SAFETY: The typed payload supplies all non-envelope fields for this name; the factory supplies its envelope.\n return { ...payload, type: 'command', name, id } as z.output<\n Maps['commandSchemas'][typeof name]\n >\n },\n createEvent: (name, payload, id = uuidv7()) => {\n // SAFETY: The typed payload supplies all non-envelope fields for this name; the factory supplies its envelope.\n return { ...payload, type: 'event', name, id } as z.output<Maps['eventSchemas'][typeof name]>\n },\n createQuery: (name, payload) => {\n // SAFETY: The typed payload supplies all non-envelope fields for this name; a query has no ID.\n return { ...payload, type: 'query', name } as z.output<Maps['querySchemas'][typeof name]>\n },\n })\n}\n\n/** Build each complete schema once. Omitted kinds have empty maps and schemas that reject every input. */\nexport function defineMessages<\n const Commands extends PayloadSchemas = EmptySchemas,\n const Events extends PayloadSchemas = EmptySchemas,\n const Queries extends PayloadSchemas = EmptySchemas,\n>(definition: {\n readonly commands?: Commands & WithoutRoutingFields<Commands>\n readonly events?: Events & WithoutRoutingFields<Events>\n readonly queries?: Queries & WithoutRoutingFields<Queries>\n}) {\n return collection({\n commandSchemas: completeSchemas<'command', Commands>('command', definition.commands),\n eventSchemas: completeSchemas<'event', Events>('event', definition.events),\n querySchemas: completeSchemas<'query', Queries>('query', definition.queries),\n })\n}\n\n/** Two collections declare the same name within one message kind. */\nexport class DuplicateMessageNameError extends AppError {\n readonly _tag = 'DuplicateMessageNameError'\n readonly classification = 'terminal'\n\n /** Identify the duplicate kind and name so the application can correct its definitions. */\n constructor(\n readonly kind: MessageKind,\n readonly messageName: string,\n ) {\n super(`Duplicate ${kind} name: ${messageName}`)\n }\n}\n\ntype SchemaAtName<Maps, Name extends PropertyKey> =\n Maps extends Record<Name, infer Schema extends z.ZodType<object>> ? Schema : never\ntype MergedMaps<Collections extends readonly CompletedMessages[]> = {\n readonly [Key in keyof SchemaMaps]: {\n readonly [Name in KeysOfUnion<Collections[number][Key]> & string]: SchemaAtName<\n Collections[number][Key],\n Name\n >\n }\n}\ntype DuplicateNames<Collections extends readonly CompletedMessages[]> =\n Collections extends readonly [\n infer First extends CompletedMessages,\n ...infer Rest extends readonly CompletedMessages[],\n ]\n ?\n | {\n [Key in keyof SchemaMaps]: keyof First[Key] & KeysOfUnion<Rest[number][Key]>\n }[keyof SchemaMaps]\n | DuplicateNames<Rest>\n : never\n\nfunction mergeSchemas<\n Collections extends readonly CompletedMessages[],\n Key extends keyof SchemaMaps,\n>(collections: Collections, key: Key, kind: MessageKind): MergedMaps<Collections>[Key] {\n const merged = new Map<string, z.ZodType<object>>()\n for (const messages of collections) {\n if (!messages?.[completed])\n return panic('combineMessages requires completed message collections')\n for (const [name, schema] of Object.entries(messages[key])) {\n if (merged.has(name)) throw new DuplicateMessageNameError(kind, name)\n merged.set(name, schema)\n }\n }\n // SAFETY: Every schema comes from the selected complete map, and duplicate names are rejected before insertion.\n return Object.freeze(Object.fromEntries(merged)) as MergedMaps<Collections>[Key]\n}\n\n/**\n * Merge completed collections without rebuilding complete schemas.\n * @throws DuplicateMessageNameError when two collections declare the same name within one kind.\n */\nexport function combineMessages<const Collections extends readonly CompletedMessages[]>(\n ...collections: Collections & (DuplicateNames<Collections> extends never ? unknown : never)\n) {\n return collection({\n commandSchemas: mergeSchemas(collections, 'commandSchemas', 'command'),\n eventSchemas: mergeSchemas(collections, 'eventSchemas', 'event'),\n querySchemas: mergeSchemas(collections, 'querySchemas', 'query'),\n })\n}\n","import type { DomainEvent } from './messages.ts'\n\n/** What an aggregate's plain data must have: an identity. A branded id keeps its brand. */\nexport type EntityData = { readonly id: string }\n\n/**\n * The base of an aggregate: its identity, the events it raised, and the plain data a repository\n * stores. The subclass keeps its constructor private and declares `static restore(data: Data)`,\n * the one door a repository rebuilds it through. A repository drains the events after `save`.\n */\nexport abstract class Entity<Data extends EntityData, TEvent extends DomainEvent = DomainEvent> {\n private events: TEvent[] = []\n\n abstract readonly id: Data['id']\n\n /** Record one event with the state change that caused it. The unit of work commits both. */\n protected addEvent(event: TEvent): void {\n this.events.push(event)\n }\n\n /** A copy of the events raised since the last `clearEvents`. */\n collectEvents(): ReadonlyArray<TEvent> {\n return [...this.events]\n }\n\n /** Forget the raised events once the boundary has taken them. */\n clearEvents(): void {\n this.events = []\n }\n\n /** Plain data for the repository. The subclass's `restore(data)` accepts exactly this. */\n abstract toPlainObject(): Data\n}\n","/**\n * What one failure is, before any policy decides what to do about it.\n *\n * `transient`: the world may differ on the next attempt. `terminal`: repeating gives the\n * same answer. `unknown`: nobody judged this error, so it came from outside unwrapped.\n */\nexport type FailureClassification = 'transient' | 'terminal' | 'unknown'\n\n/**\n * Who is asking to repeat the work.\n *\n * An immediate owner holds a caller and a socket open. A durable owner already stored the\n * work, so it can afford to try again on a failure nobody classified.\n */\nexport type RetryOwner = 'immediate' | 'durable'\n\n/** Decide whether one retry owner may repeat a failed operation. */\nexport function shouldRetryFailure(args: {\n readonly classification: FailureClassification\n readonly repeatSafe: boolean\n readonly owner: RetryOwner\n}): boolean {\n if (!args.repeatSafe) return false\n if (args.classification === 'transient') return true\n if (args.classification === 'terminal') return false\n return args.owner === 'durable'\n}\n","/**\n * Exact `TypeError` messages that `fetch` rejects with when the network fails.\n *\n * Ported from is-network-error 1.3.2. The Safari stack check is dropped, so a failed `import()` in Safari also matches.\n * Source: https://github.com/sindresorhus/is-network-error/blob/57de24d4095c39ff19b75f35be846d4e47f1b687/index.js\n */\nconst FETCH_NETWORK_ERROR_MESSAGES = new Set([\n 'Failed to fetch', // Chrome\n 'Load failed', // Safari\n 'network error', // Chrome\n 'NetworkError when attempting to fetch resource.', // Firefox\n 'The Internet connection appears to be offline.', // Safari 16\n 'Network request failed', // cross-fetch\n 'fetch failed', // undici (Node.js)\n 'terminated', // undici (Node.js)\n ' A network error occurred.', // Bun\n 'Network connection lost', // Cloudflare Workers\n])\n\n/** Messages that Chrome and Safari may end with the request hostname, such as `Failed to fetch (example.com)`. */\nconst FETCH_NETWORK_ERROR_HOSTNAME_PREFIXES = ['Failed to fetch (', 'Load failed (']\n\n/** Deno starts its network error message with this text. */\nconst DENO_NETWORK_ERROR_PREFIX = 'error sending request for url'\n\n/**\n * Messages that the platform-neutral transports raise for a failure that may pass.\n *\n * A boundary that knows its own runtime adds its own patterns before these.\n */\nconst TRANSIENT_TRANSPORT_PATTERNS = [\n /network/,\n /fetch failed/,\n /timeout/,\n /timed?\\s*out/,\n /connection.*(lost|reset|refused|closed|aborted)/,\n /econnreset/,\n /econnrefused/,\n /etimedout/,\n /eai_again/,\n]\n\n/** Cancellation is a decision, not a failure to repeat. */\nexport function isAbortError(cause: unknown): boolean {\n return cause instanceof Error && cause.name === 'AbortError'\n}\n\n/** Match the `TypeError` that browser and server `fetch` raise when the network fails. */\nfunction isFetchNetworkError(cause: Error): boolean {\n if (cause.name !== 'TypeError') return false\n const { message } = cause\n if (FETCH_NETWORK_ERROR_MESSAGES.has(message)) return true\n if (message.startsWith(DENO_NETWORK_ERROR_PREFIX)) return true\n return (\n message.endsWith(')') &&\n FETCH_NETWORK_ERROR_HOSTNAME_PREFIXES.some((prefix) => message.startsWith(prefix))\n )\n}\n\n/** Match known transient transport messages while excluding explicit cancellation. */\nexport function isTransientTransportError(cause: unknown): boolean {\n if (!(cause instanceof Error) || isAbortError(cause)) return false\n if (isFetchNetworkError(cause)) return true\n const message = cause.message.toLowerCase()\n return TRANSIENT_TRANSPORT_PATTERNS.some((pattern) => pattern.test(message))\n}\n","import { z } from 'zod'\n\n/** Stable Cloudflare messages that mean the runtime failed, not our code, and a repeat may pass. */\nexport const CLOUDFLARE_TRANSIENT_ERROR_PATTERNS = {\n networkConnectionLost: /network connection lost/,\n objectReset: /caused object to be reset/,\n codeUpdateReset: /reset because its code was updated/,\n objectMoved: /object has moved to a different machine/,\n internalWorkflows: /internal workflows error/,\n} as const\n\nconst TRANSIENT_PLATFORM_PATTERNS = [\n CLOUDFLARE_TRANSIENT_ERROR_PATTERNS.objectReset,\n CLOUDFLARE_TRANSIENT_ERROR_PATTERNS.codeUpdateReset,\n CLOUDFLARE_TRANSIENT_ERROR_PATTERNS.objectMoved,\n CLOUDFLARE_TRANSIENT_ERROR_PATTERNS.internalWorkflows,\n]\n\n// workerd stamps these flags as own properties on the error it throws across a binding.\nconst RetryableFlagSchema = z.object({ retryable: z.literal(true) })\nconst OverloadedFlagSchema = z.object({ overloaded: z.literal(true) })\nconst ObjectResetFlagSchema = z.object({ durableObjectReset: z.literal(true) })\n\n/** workerd stamps `retryable` on a failure it judged safe to repeat. */\nexport function isCloudflareRetryableError(cause: unknown): boolean {\n return RetryableFlagSchema.validate(cause)\n}\n\n/** workerd stamps `overloaded` when the target could not take the call. */\nexport function isCloudflareOverloadedError(cause: unknown): boolean {\n return OverloadedFlagSchema.validate(cause)\n}\n\n/** workerd stamps `durableObjectReset` when the object restarted during the call. */\nexport function isCloudflareObjectResetError(cause: unknown): boolean {\n return ObjectResetFlagSchema.validate(cause)\n}\n\n/** Match transient Cloudflare runtime evidence without the general transport patterns. */\nexport function isTransientCloudflareRuntimeError(cause: unknown): boolean {\n if (isCloudflareObjectResetError(cause)) return true\n if (!(cause instanceof Error)) return false\n const message = cause.message.toLowerCase()\n return TRANSIENT_PLATFORM_PATTERNS.some((pattern) => pattern.test(message))\n}\n","import { z } from 'zod'\n\nimport { AppError } from './app-error.ts'\nimport {\n isCloudflareOverloadedError,\n isCloudflareRetryableError,\n isTransientCloudflareRuntimeError,\n} from './cloudflare-classification.ts'\nimport type { FailureClassification } from './failure-classification.ts'\nimport { isAbortError, isTransientTransportError } from './transport-classification.ts'\n\n/** A boundary's own rule for its raw errors. `undefined` means the boundary has no opinion. */\nexport type BoundaryErrorClassifier = (cause: unknown) => FailureClassification | undefined\n\n/**\n * Classify one raw external error: the boundary's own rule first, then Cloudflare's signals,\n * then the transport patterns. Cancellation is terminal even when Cloudflare marks it retryable.\n */\nexport function classifyBoundaryError(args: {\n readonly cause: unknown\n readonly classifyBoundary: BoundaryErrorClassifier\n readonly includeCloudflare: boolean\n}): FailureClassification {\n const boundary = args.classifyBoundary(args.cause)\n if (boundary !== undefined) return boundary\n\n if (isAbortError(args.cause)) return 'terminal'\n\n if (\n args.includeCloudflare &&\n (isCloudflareOverloadedError(args.cause) ||\n isCloudflareRetryableError(args.cause) ||\n isTransientCloudflareRuntimeError(args.cause))\n ) {\n return 'transient'\n }\n\n if (isTransientTransportError(args.cause)) return 'transient'\n\n return 'unknown'\n}\n\n/** An `AppError` that crossed Workers RPC: its class is lost, but its fields and `remote` remain. */\nconst RemoteAppErrorSchema = z.object({\n _tag: z.string(),\n classification: z.enum(['transient', 'terminal', 'unknown']),\n remote: z.literal(true),\n})\n\n/**\n * Judge a final failure for its durable retry owner. An `AppError` carries its own answer, also\n * after Workers RPC. A raw throw nobody judged is unknown, so an immediate owner stops and a\n * durable one may repeat.\n */\nexport function classifyFailure(cause: unknown): FailureClassification {\n if (cause instanceof AppError) return cause.classification\n const remote = RemoteAppErrorSchema.safeParse(cause)\n if (cause instanceof Error && remote.success) return remote.data.classification\n if (isAbortError(cause)) return 'terminal'\n if (isTransientCloudflareRuntimeError(cause)) return 'transient'\n return 'unknown'\n}\n\nconst RetryAfterSchema = z.object({ retryAfter: z.number().positive() })\n\n/** Read a positive server-advertised retry delay in seconds, such as `RateLimitError.retryAfter`. */\nexport function retryAfterSecondsOf(cause: unknown): number | null {\n const result = RetryAfterSchema.safeParse(cause)\n return result.success ? result.data.retryAfter : null\n}\n","import { panic } from 'better-result'\n\n/** Uniform jitter within one fixed window. */\nexport function spreadJitterMs(spreadMs: number): number {\n if (!Number.isFinite(spreadMs) || spreadMs < 0) {\n return panic('spreadMs must be a non-negative number')\n }\n return Math.floor(Math.random() * spreadMs)\n}\n\n/**\n * Half the capped exponential delay, plus jitter over the other half. Decorrelates concurrent\n * repeats like full jitter, but keeps a floor: use it when few attempts remain before work is dropped.\n */\nexport function exponentialEqualJitterMs(\n baseDelayMs: number,\n maxDelayMs: number,\n attempt: number,\n): number {\n const halfCapMs = exponentialDelayCapMs(baseDelayMs, maxDelayMs, attempt) / 2\n return Math.floor(halfCapMs) + spreadJitterMs(halfCapMs)\n}\n\n/** Capped exponential delay for a durable retry recorded in storage. */\nexport function exponentialDelayCapMs(\n baseDelayMs: number,\n maxDelayMs: number,\n attempt: number,\n): number {\n if (!Number.isSafeInteger(attempt) || attempt < 1) {\n return panic('attempt must be a positive integer')\n }\n return Math.min(baseDelayMs * 2 ** (attempt - 1), maxDelayMs)\n}\n","import { exponentialEqualJitterMs, spreadJitterMs } from './backoff.ts'\nimport { classifyFailure, retryAfterSecondsOf } from './classify-failure.ts'\nimport { shouldRetryFailure, type FailureClassification } from './failure-classification.ts'\n\nconst RETRY_AFTER_SPREAD_MS = 5_000\n\n/** The exponential backoff for a durable retry: the first wait, and the longest wait. */\nexport type RedeliveryDelays = {\n readonly baseDelayMs: number\n readonly maxDelayMs: number\n}\n\n/** The queue consumer's backoff: 5 s, doubling, up to 120 s. */\nexport const DEFAULT_REDELIVERY_DELAYS: RedeliveryDelays = {\n baseDelayMs: 5_000,\n maxDelayMs: 120_000,\n}\n\n/** How to settle one failed message: stop for good, or deliver it again after a delay. */\nexport type RedeliveryDecision =\n | { readonly action: 'ack'; readonly classification: 'terminal' }\n | {\n readonly action: 'retry'\n readonly classification: Exclude<FailureClassification, 'terminal'>\n readonly delayMs: number\n }\n\n/**\n * Decide whether a failed message stops or is delivered again. A terminal failure stops. Transient\n * and unknown failures retry: after the advertised wait plus a spread when the error carries one,\n * else with exponential equal-jitter backoff. An `AggregateError` from event delivery retries when\n * any member does, after the longest wait. The queue consumer and the outbox relay both use it.\n */\nexport function decideRedelivery(\n cause: unknown,\n attempt: number,\n delays: RedeliveryDelays = DEFAULT_REDELIVERY_DELAYS,\n): RedeliveryDecision {\n if (cause instanceof AggregateError && cause.errors.length > 0) {\n const decisions = cause.errors.map((member) => decideRedelivery(member, attempt, delays))\n const retries = decisions.filter((decision) => decision.action === 'retry')\n if (retries.length === 0) return { action: 'ack', classification: 'terminal' }\n\n // Redelivery must respect every failed subscriber's required wait.\n return {\n action: 'retry',\n classification: retries.some((decision) => decision.classification === 'unknown')\n ? 'unknown'\n : 'transient',\n delayMs: Math.max(...retries.map((decision) => decision.delayMs)),\n }\n }\n\n const classification = classifyFailure(cause)\n if (classification === 'terminal') return { action: 'ack', classification }\n\n const canRetry = shouldRetryFailure({ classification, repeatSafe: true, owner: 'durable' })\n if (!canRetry) return { action: 'ack', classification: 'terminal' }\n\n const retryAfterSeconds = retryAfterSecondsOf(cause)\n const delayMs =\n retryAfterSeconds === null\n ? exponentialEqualJitterMs(delays.baseDelayMs, delays.maxDelayMs, attempt)\n : retryAfterSeconds * 1_000 + spreadJitterMs(RETRY_AFTER_SPREAD_MS)\n return { action: 'retry', classification, delayMs }\n}\n","import type { LogEntry, LogFields, LogFormat, LogLevel, LogSink } from './logger.ts'\n\nconst METHOD = {\n DEBUG: 'debug',\n INFO: 'info',\n WARN: 'warn',\n ERROR: 'error',\n} as const satisfies Record<LogLevel, 'debug' | 'info' | 'warn' | 'error'>\n\nconst ESC = String.fromCharCode(27)\nconst RESET = `${ESC}[0m`\nconst LEVEL_COLOR = {\n DEBUG: `${ESC}[2;36m`,\n INFO: `${ESC}[34m`,\n WARN: `${ESC}[33m`,\n ERROR: `${ESC}[1;31m`,\n} satisfies Record<LogLevel, string>\n\nlet format: LogFormat = 'json'\n\nexport function setConsoleLogFormat(value: LogFormat): void {\n format = value\n}\n\nfunction contextOf(entry: LogEntry): LogFields | undefined {\n const context = { ...entry.attributes }\n if (entry.userId !== undefined) context.userId = entry.userId\n return Object.keys(context).length === 0 ? undefined : context\n}\n\nfunction jsonEntry(entry: LogEntry): LogEntry {\n if (!(entry.error instanceof Error)) return entry\n const error = { name: entry.error.name, message: entry.error.message, stack: entry.error.stack }\n return { ...entry, error }\n}\n\n/** Write one structured record or one readable development entry to `console`. */\nexport const consoleSink: LogSink = (entry) => {\n const write = console[METHOD[entry.level]]\n if (format === 'json') {\n write(jsonEntry(entry))\n return\n }\n\n const context = contextOf(entry)\n const values = context === undefined ? [] : [context]\n const errors = entry.error === undefined ? [] : [entry.error]\n if (format === 'pretty-browser') {\n write(\n `${entry.timestamp} [${entry.level}] [${entry.module}] ${entry.event}`,\n ...values,\n ...errors,\n )\n return\n }\n write(\n `${ESC}[90m${entry.timestamp}${RESET} ${LEVEL_COLOR[entry.level]}[${entry.level}]${RESET} ${ESC}[34m[${entry.module}]${RESET} ${entry.event}`,\n ...values,\n ...errors,\n )\n}\n","import { consoleSink, setConsoleLogFormat } from './console-log-sink.ts'\n\n/** One JSON-compatible value in a normal log field. */\nexport type LogValue =\n | string\n | number\n | boolean\n | null\n | readonly LogValue[]\n | { readonly [key: string]: LogValue }\n\n/** Flat fields for one log call. Only `error` can contain an arbitrary value. */\n// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- A logger accepts caller-owned fields at its public boundary.\nexport type LogFields = Readonly<Record<string, unknown>>\n\n/** Supported log levels in ascending order. */\nexport const LogLevel = {\n DEBUG: 'DEBUG',\n INFO: 'INFO',\n WARN: 'WARN',\n ERROR: 'ERROR',\n} as const\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]\n\n/** The minimum emitted level, or `OFF` for no console output. */\nexport type LogThreshold = LogLevel | 'OFF'\n\n/** Explicit output formats for production, browser development, and terminal development. */\nexport type LogFormat = 'json' | 'pretty-browser' | 'pretty-terminal'\n\n/** Process-wide logger settings supplied at startup. */\nexport interface LoggerSettings {\n readonly level?: LogThreshold\n readonly format?: LogFormat\n}\n\n/** One structured record sent to a log sink. */\nexport type LogEntry = {\n readonly timestamp: string\n readonly level: LogLevel\n readonly module: string\n readonly event: string\n // oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- The entry keeps caller-owned fields for its sink.\n readonly attributes: LogFields\n readonly userId?: string\n readonly error?: unknown\n}\n\n/** The original error and fields sent to an error service. */\nexport interface ErrorCaptureEntry {\n readonly error: unknown\n readonly userId: string | undefined\n // oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- Sentry accepts the caller-owned fields as extra context.\n readonly attributes: LogFields\n}\n\n/** A function that forwards one error to an error service. */\nexport type LoggerErrorHook = (entry: ErrorCaptureEntry) => void\n\n/** A destination for structured log records. */\nexport type LogSink = (entry: LogEntry) => void\n\n/** The common flat logger API for all levels. */\nexport interface Logger {\n debug(event: string, fields?: LogFields): void\n info(event: string, fields?: LogFields): void\n warn(event: string, fields?: LogFields): void\n error(event: string, fields?: LogFields): void\n}\n\nconst LEVELS = Object.values(LogLevel)\nlet threshold: LogThreshold = LogLevel.INFO\nlet logSink: LogSink = consoleSink\nlet errorHook: LoggerErrorHook | null = null\n\n/** Set the process-wide level and output format. Omitted fields restore production defaults. */\nexport function configureLogger(settings: LoggerSettings): void {\n threshold = settings.level ?? LogLevel.INFO\n setConsoleLogFormat(settings.format ?? 'json')\n}\n\n/** Set the process-wide log destination. */\nexport function setLogSink(sink: LogSink): void {\n logSink = sink\n}\n\n/** Set or clear the process-wide error service hook. */\nexport function setLoggerErrorHook(hook: LoggerErrorHook | null): void {\n errorHook = hook\n}\n\n/* oxlint-disable anti-slop/no-runtime-typeof -- The logger validates its reserved userId field. */\nfunction splitFields(fields: LogFields): ErrorCaptureEntry {\n const { error, userId, ...attributes } = fields\n return { error, userId: typeof userId === 'string' ? userId : undefined, attributes }\n}\n/* oxlint-enable anti-slop/no-runtime-typeof */\n\nfunction writeLog(module: string, level: LogLevel, event: string, fields: LogFields): void {\n if (threshold === 'OFF' || LEVELS.indexOf(level) < LEVELS.indexOf(threshold)) return\n\n const { error, userId, attributes } = splitFields(fields)\n let entry: LogEntry = { timestamp: new Date().toISOString(), level, module, event, attributes }\n if (userId !== undefined) entry = { ...entry, userId }\n if (error !== undefined) entry = { ...entry, error }\n try {\n logSink(entry)\n } catch {\n // A diagnostic failure must not change application control flow.\n }\n}\n\n/** Create a logger for one module. */\nexport function createLogger(module: string): Logger {\n return {\n debug: (event, fields = {}) => writeLog(module, LogLevel.DEBUG, event, fields),\n info: (event, fields = {}) => writeLog(module, LogLevel.INFO, event, fields),\n warn: (event, fields = {}) => writeLog(module, LogLevel.WARN, event, fields),\n error: (event, fields = {}) => {\n writeLog(module, LogLevel.ERROR, event, fields)\n const capture = splitFields(fields)\n if (errorHook === null || capture.error === undefined) return\n try {\n errorHook(capture)\n } catch {\n // An error service failure must not change application control flow.\n }\n },\n }\n}\n\nexport { consoleSink }\n"],"mappings":"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"}
|
package/dist/core.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as
|
|
2
|
-
export { type AnalyticsEventInput, type AnalyticsProperties, type AnalyticsProperty, type AnalyticsTarget, AppError, AuthenticationError, type BounceType, BounceTypeSchema, type BoundaryErrorClassifier, CLOUDFLARE_TRANSIENT_ERROR_PATTERNS, type CommandOf, type D1ConstraintKind, DatabaseError, type DatabaseFailure, type DomainCommand, type DomainEvent, type DomainMessage, type DomainQuery, DuplicateMessageNameError, type EmailAddress, EmailAddressSchema, type EmailIdempotencyKey, type EmailSendFailureReason, EmailServiceError, Entity, type EntityData, type ErrorCaptureEntry, type ErrorEntries, type ErrorEntry, type ErrorPayloadOf, type ErrorTable, type ErrorTagOf, type EventOf, type FailureClassification, type Id, type IdDefinition, type IdOf, InternalServerError, InvalidEmailIdempotencyKeyError, type LogEntry, type LogFields, type LogFormat, LogLevel, type LogSink, type LogThreshold, type LogValue, type Logger, type LoggerErrorHook, type LoggerSettings, MalformedRequestError, type MessageCollection, type MessageDefinition, type MessageId, type MessageOf, MissingConfigurationError, NotAuthorizedError, type PayloadSchemas, type ProblemDetails, ProblemDetailsSchema, type QueryOf, RateLimitError, type RecordEmailEventPayload, RecordEmailEventPayloadSchema, RequestTimeoutError, type ResolvedError, ResourceNotFoundError, type RetryOwner, ServiceUnavailableError, StaleSessionError, UpgradeRequiredError, ValidationError, type ValidationIssue, type ValidationProblemDetails, ValidationProblemDetailsSchema, type ValidationProblemError, ValidationProblemErrorSchema, classifyBoundaryError, classifyFailure, combineMessages, configureLogger, consoleSink, createLogger, defineErrors, defineId, defineMessages, emailIdempotencyKey, exponentialDelayCapMs, exponentialEqualJitterMs, isAbortError, isCloudflareObjectResetError, isCloudflareOverloadedError, isCloudflareRetryableError, isEmailDeliverable, isTransientCloudflareRuntimeError, isTransientTransportError, notImplemented, parseBounceType, retryAfterSecondsOf, setLogSink, setLoggerErrorHook, sharedErrors, shouldRetryFailure, shouldUpdateBounce, spreadJitterMs, unreachable };
|
|
1
|
+
import { $ as IdDefinition, $t as FailureClassification, A as isCloudflareOverloadedError, At as StaleSessionError, B as MessageCollection, Bt as EmailSendFailureReason, C as spreadJitterMs, Ct as ValidationProblemDetails, D as retryAfterSecondsOf, Dt as InternalServerError, E as classifyFailure, Et as ValidationProblemErrorSchema, F as Entity, Ft as BounceType, G as combineMessages, Gt as EmailAddress, H as MessageOf, Ht as EmailIdempotencyKey, I as EntityData, It as BounceTypeSchema, J as DomainEvent, Jt as AnalyticsProperties, K as defineMessages, Kt as EmailAddressSchema, L as CommandOf, Lt as isEmailDeliverable, M as isTransientCloudflareRuntimeError, Mt as AuthenticationError, N as isAbortError, Nt as RecordEmailEventPayload, O as CLOUDFLARE_TRANSIENT_ERROR_PATTERNS, Ot as ServiceUnavailableError, P as isTransientTransportError, Pt as RecordEmailEventPayloadSchema, Q as Id, Qt as AppError, R as DuplicateMessageNameError, Rt as parseBounceType, S as exponentialEqualJitterMs, St as ProblemDetailsSchema, T as classifyBoundaryError, Tt as ValidationProblemError, U as PayloadSchemas, Ut as InvalidEmailIdempotencyKeyError, V as MessageDefinition, Vt as EmailServiceError, W as QueryOf, Wt as emailIdempotencyKey, X as DomainQuery, Xt as AnalyticsTarget, Y as DomainMessage, Yt as AnalyticsProperty, Z as MessageId, Zt as MissingConfigurationError, _ as DEFAULT_REDELIVERY_DELAYS, _t as ResourceNotFoundError, a as LogLevel, at as DatabaseError, b as decideRedelivery, bt as ValidationIssue, c as LogValue, ct as ErrorEntry, d as LoggerSettings, dt as ErrorTagOf, en as RetryOwner, et as IdOf, f as configureLogger, ft as ResolvedError, g as consoleSink, gt as RequestTimeoutError, h as setLoggerErrorHook, ht as MalformedRequestError, i as LogFormat, it as D1ConstraintKind, j as isCloudflareRetryableError, jt as RateLimitError, k as isCloudflareObjectResetError, kt as NotAuthorizedError, l as Logger, lt as ErrorPayloadOf, m as setLogSink, mt as sharedErrors, n as LogEntry, nt as notImplemented, o as LogSink, ot as DatabaseFailure, p as createLogger, pt as defineErrors, q as DomainCommand, qt as AnalyticsEventInput, r as LogFields, rt as unreachable, s as LogThreshold, st as ErrorEntries, t as ErrorCaptureEntry, tn as shouldRetryFailure, tt as defineId, u as LoggerErrorHook, ut as ErrorTable, v as RedeliveryDecision, vt as UpgradeRequiredError, w as BoundaryErrorClassifier, wt as ValidationProblemDetailsSchema, x as exponentialDelayCapMs, xt as ProblemDetails, y as RedeliveryDelays, yt as ValidationError, z as EventOf, zt as shouldUpdateBounce } from "./index-tJzJUgTh.js";
|
|
2
|
+
export { type AnalyticsEventInput, type AnalyticsProperties, type AnalyticsProperty, type AnalyticsTarget, AppError, AuthenticationError, type BounceType, BounceTypeSchema, type BoundaryErrorClassifier, CLOUDFLARE_TRANSIENT_ERROR_PATTERNS, type CommandOf, type D1ConstraintKind, DEFAULT_REDELIVERY_DELAYS, DatabaseError, type DatabaseFailure, type DomainCommand, type DomainEvent, type DomainMessage, type DomainQuery, DuplicateMessageNameError, type EmailAddress, EmailAddressSchema, type EmailIdempotencyKey, type EmailSendFailureReason, EmailServiceError, Entity, type EntityData, type ErrorCaptureEntry, type ErrorEntries, type ErrorEntry, type ErrorPayloadOf, type ErrorTable, type ErrorTagOf, type EventOf, type FailureClassification, type Id, type IdDefinition, type IdOf, InternalServerError, InvalidEmailIdempotencyKeyError, type LogEntry, type LogFields, type LogFormat, LogLevel, type LogSink, type LogThreshold, type LogValue, type Logger, type LoggerErrorHook, type LoggerSettings, MalformedRequestError, type MessageCollection, type MessageDefinition, type MessageId, type MessageOf, MissingConfigurationError, NotAuthorizedError, type PayloadSchemas, type ProblemDetails, ProblemDetailsSchema, type QueryOf, RateLimitError, type RecordEmailEventPayload, RecordEmailEventPayloadSchema, type RedeliveryDecision, type RedeliveryDelays, RequestTimeoutError, type ResolvedError, ResourceNotFoundError, type RetryOwner, ServiceUnavailableError, StaleSessionError, UpgradeRequiredError, ValidationError, type ValidationIssue, type ValidationProblemDetails, ValidationProblemDetailsSchema, type ValidationProblemError, ValidationProblemErrorSchema, classifyBoundaryError, classifyFailure, combineMessages, configureLogger, consoleSink, createLogger, decideRedelivery, defineErrors, defineId, defineMessages, emailIdempotencyKey, exponentialDelayCapMs, exponentialEqualJitterMs, isAbortError, isCloudflareObjectResetError, isCloudflareOverloadedError, isCloudflareRetryableError, isEmailDeliverable, isTransientCloudflareRuntimeError, isTransientTransportError, notImplemented, parseBounceType, retryAfterSecondsOf, setLogSink, setLoggerErrorHook, sharedErrors, shouldRetryFailure, shouldUpdateBounce, spreadJitterMs, unreachable };
|
package/dist/core.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as InvalidEmailIdempotencyKeyError, A as DatabaseError, B as ValidationError, C as Entity, D as defineId, E as defineMessages, F as ValidationProblemErrorSchema, G as RateLimitError, H as ServiceUnavailableError, I as MalformedRequestError, J as BounceTypeSchema, K as AuthenticationError, L as RequestTimeoutError, M as sharedErrors, N as ProblemDetailsSchema, O as notImplemented, P as ValidationProblemDetailsSchema, Q as EmailServiceError, R as ResourceNotFoundError, S as shouldRetryFailure, T as combineMessages, U as NotAuthorizedError, V as InternalServerError, W as StaleSessionError, X as parseBounceType, Y as isEmailDeliverable, Z as shouldUpdateBounce, _ as isCloudflareOverloadedError, a as setLoggerErrorHook, b as isAbortError, c as decideRedelivery, d as spreadJitterMs, et as emailIdempotencyKey, f as classifyBoundaryError, g as isCloudflareObjectResetError, h as CLOUDFLARE_TRANSIENT_ERROR_PATTERNS, i as setLogSink, j as defineErrors, k as unreachable, l as exponentialDelayCapMs, m as retryAfterSecondsOf, n as configureLogger, nt as MissingConfigurationError, o as consoleSink, p as classifyFailure, q as RecordEmailEventPayloadSchema, r as createLogger, rt as AppError, s as DEFAULT_REDELIVERY_DELAYS, t as LogLevel, tt as EmailAddressSchema, u as exponentialEqualJitterMs, v as isCloudflareRetryableError, w as DuplicateMessageNameError, x as isTransientTransportError, y as isTransientCloudflareRuntimeError, z as UpgradeRequiredError } from "./core-CV8SQv01.js";
|
|
2
2
|
|
|
3
|
-
export { AppError, AuthenticationError, BounceTypeSchema, CLOUDFLARE_TRANSIENT_ERROR_PATTERNS, DatabaseError, DuplicateMessageNameError, EmailAddressSchema, EmailServiceError, Entity, InternalServerError, InvalidEmailIdempotencyKeyError, LogLevel, MalformedRequestError, MissingConfigurationError, NotAuthorizedError, ProblemDetailsSchema, RateLimitError, RecordEmailEventPayloadSchema, RequestTimeoutError, ResourceNotFoundError, ServiceUnavailableError, StaleSessionError, UpgradeRequiredError, ValidationError, ValidationProblemDetailsSchema, ValidationProblemErrorSchema, classifyBoundaryError, classifyFailure, combineMessages, configureLogger, consoleSink, createLogger, defineErrors, defineId, defineMessages, emailIdempotencyKey, exponentialDelayCapMs, exponentialEqualJitterMs, isAbortError, isCloudflareObjectResetError, isCloudflareOverloadedError, isCloudflareRetryableError, isEmailDeliverable, isTransientCloudflareRuntimeError, isTransientTransportError, notImplemented, parseBounceType, retryAfterSecondsOf, setLogSink, setLoggerErrorHook, sharedErrors, shouldRetryFailure, shouldUpdateBounce, spreadJitterMs, unreachable };
|
|
3
|
+
export { AppError, AuthenticationError, BounceTypeSchema, CLOUDFLARE_TRANSIENT_ERROR_PATTERNS, DEFAULT_REDELIVERY_DELAYS, DatabaseError, DuplicateMessageNameError, EmailAddressSchema, EmailServiceError, Entity, InternalServerError, InvalidEmailIdempotencyKeyError, LogLevel, MalformedRequestError, MissingConfigurationError, NotAuthorizedError, ProblemDetailsSchema, RateLimitError, RecordEmailEventPayloadSchema, RequestTimeoutError, ResourceNotFoundError, ServiceUnavailableError, StaleSessionError, UpgradeRequiredError, ValidationError, ValidationProblemDetailsSchema, ValidationProblemErrorSchema, classifyBoundaryError, classifyFailure, combineMessages, configureLogger, consoleSink, createLogger, decideRedelivery, defineErrors, defineId, defineMessages, emailIdempotencyKey, exponentialDelayCapMs, exponentialEqualJitterMs, isAbortError, isCloudflareObjectResetError, isCloudflareOverloadedError, isCloudflareRetryableError, isEmailDeliverable, isTransientCloudflareRuntimeError, isTransientTransportError, notImplemented, parseBounceType, retryAfterSecondsOf, setLogSink, setLoggerErrorHook, sharedErrors, shouldRetryFailure, shouldUpdateBounce, spreadJitterMs, unreachable };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as
|
|
1
|
+
import { _ as isCloudflareOverloadedError, b as isAbortError, rt as AppError, v as isCloudflareRetryableError, x as isTransientTransportError, y as isTransientCloudflareRuntimeError } from "./core-CV8SQv01.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
|
|
4
4
|
//#region src/infrastructure/cloudflare/durable-object-errors.ts
|
|
@@ -45,4 +45,4 @@ var DurableObjectCallError = class extends AppError {
|
|
|
45
45
|
|
|
46
46
|
//#endregion
|
|
47
47
|
export { isDurableObjectCallError as a, isClassifiedDurableObjectError as i, DurableObjectCallError as n, classifyDurableObjectError as r, DURABLE_OBJECT_CALL_ERROR as t };
|
|
48
|
-
//# sourceMappingURL=durable-object-errors-
|
|
48
|
+
//# sourceMappingURL=durable-object-errors-C7e7essH.js.map
|
package/dist/{durable-object-errors-CcfTu0PQ.js.map → durable-object-errors-C7e7essH.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable-object-errors-
|
|
1
|
+
{"version":3,"file":"durable-object-errors-C7e7essH.js","names":[],"sources":["../src/infrastructure/cloudflare/durable-object-errors.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n AppError,\n isAbortError,\n isCloudflareOverloadedError,\n isCloudflareRetryableError,\n isTransientCloudflareRuntimeError,\n isTransientTransportError,\n type FailureClassification,\n} from '@/core'\n\n/** Stable tag for a failed Durable Object call. */\nexport const DURABLE_OBJECT_CALL_ERROR = 'DurableObjectCallError'\n\nconst RemoteClassifiedErrorSchema = z.object({\n _tag: z.string(),\n classification: z.enum(['transient', 'terminal', 'unknown']),\n remote: z.literal(true),\n})\n\nconst RemoteCallErrorSchema = RemoteClassifiedErrorSchema.extend({\n _tag: z.literal(DURABLE_OBJECT_CALL_ERROR),\n cause: z.unknown(),\n})\n\n/** Recognize a judged local or remote error without admitting its tag to the public error table. */\nexport function isClassifiedDurableObjectError(\n cause: unknown,\n): cause is AppError | (Error & z.output<typeof RemoteClassifiedErrorSchema>) {\n return (\n cause instanceof AppError ||\n (cause instanceof Error && RemoteClassifiedErrorSchema.safeParse(cause).success)\n )\n}\n\n/** Classify the error itself. Its cause remains diagnostic evidence, not a second retry decision. */\nexport function classifyDurableObjectError(cause: unknown): FailureClassification {\n if (isAbortError(cause)) return 'terminal'\n if (isClassifiedDurableObjectError(cause)) return cause.classification\n if (isCloudflareOverloadedError(cause)) return 'terminal'\n if (\n isCloudflareRetryableError(cause) ||\n isTransientCloudflareRuntimeError(cause) ||\n isTransientTransportError(cause)\n )\n return 'transient'\n return 'unknown'\n}\n\n/** Identify a local call error or its validated Workers RPC representation. */\nexport function isDurableObjectCallError(\n cause: unknown,\n): cause is DurableObjectCallError | (Error & z.output<typeof RemoteCallErrorSchema>) {\n return (\n cause instanceof DurableObjectCallError ||\n (cause instanceof Error && RemoteCallErrorSchema.safeParse(cause).success)\n )\n}\n\n/** A call failed after retries stopped. Classification does not establish repeat safety. */\nexport class DurableObjectCallError extends AppError {\n readonly _tag = DURABLE_OBJECT_CALL_ERROR\n readonly classification: FailureClassification\n\n constructor(args: { readonly cause: unknown }) {\n super('Durable Object call failed', { cause: args.cause })\n this.classification = classifyDurableObjectError(args.cause)\n }\n}\n"],"mappings":";;;;;AAaA,MAAa,4BAA4B;AAEzC,MAAM,8BAA8B,EAAE,OAAO;CAC3C,MAAM,EAAE,OAAO;CACf,gBAAgB,EAAE,KAAK;EAAC;EAAa;EAAY;CAAS,CAAC;CAC3D,QAAQ,EAAE,QAAQ,IAAI;AACxB,CAAC;AAED,MAAM,wBAAwB,4BAA4B,OAAO;CAC/D,MAAM,EAAE,QAAQ,yBAAyB;CACzC,OAAO,EAAE,QAAQ;AACnB,CAAC;;AAGD,SAAgB,+BACd,OAC4E;CAC5E,OACE,iBAAiB,YAChB,iBAAiB,SAAS,4BAA4B,UAAU,KAAK,CAAC,CAAC;AAE5E;;AAGA,SAAgB,2BAA2B,OAAuC;CAChF,IAAI,aAAa,KAAK,GAAG,OAAO;CAChC,IAAI,+BAA+B,KAAK,GAAG,OAAO,MAAM;CACxD,IAAI,4BAA4B,KAAK,GAAG,OAAO;CAC/C,IACE,2BAA2B,KAAK,KAChC,kCAAkC,KAAK,KACvC,0BAA0B,KAAK,GAE/B,OAAO;CACT,OAAO;AACT;;AAGA,SAAgB,yBACd,OACoF;CACpF,OACE,iBAAiB,0BAChB,iBAAiB,SAAS,sBAAsB,UAAU,KAAK,CAAC,CAAC;AAEtE;;AAGA,IAAa,yBAAb,cAA4C,SAAS;CACnD,AAAS,OAAO;CAChB,AAAS;CAET,YAAY,MAAmC;EAC7C,MAAM,8BAA8B,EAAE,OAAO,KAAK,MAAM,CAAC;EACzD,KAAK,iBAAiB,2BAA2B,KAAK,KAAK;CAC7D;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { rt as AppError } from "./core-CV8SQv01.js";
|
|
2
2
|
import browserslist from "browserslist";
|
|
3
3
|
|
|
4
4
|
//#region src/infrastructure/browser-support/browser-floor.error.ts
|
|
@@ -143,4 +143,4 @@ function browserLabel(browser) {
|
|
|
143
143
|
|
|
144
144
|
//#endregion
|
|
145
145
|
export { BrowserFloorError as i, buildTargets as n, updateScreenCopy as r, browserFloor as t };
|
|
146
|
-
//# sourceMappingURL=floor-
|
|
146
|
+
//# sourceMappingURL=floor-BdRTO_LO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floor-
|
|
1
|
+
{"version":3,"file":"floor-BdRTO_LO.js","names":[],"sources":["../src/infrastructure/browser-support/browser-floor.error.ts","../src/infrastructure/browser-support/floor.ts"],"sourcesContent":["import { AppError } from '@/core'\n\n/** The browserslist file is missing, empty, or not a query browserslist can resolve. */\nexport class BrowserFloorError extends AppError {\n readonly _tag = 'BrowserFloorError'\n readonly classification = 'terminal'\n\n /**\n * `path` is the file or directory passed to `browserFloor`.\n * `reason` is `missing` when no config is found, `empty` when the query matches no browsers,\n * and `invalid` when browserslist rejects the query. `cause` is that rejection.\n */\n constructor(\n readonly path: string,\n readonly reason: 'missing' | 'empty' | 'invalid',\n cause?: unknown,\n ) {\n super(floorMessage(reason, path), { cause })\n }\n}\n\nfunction floorMessage(reason: 'missing' | 'empty' | 'invalid', path: string): string {\n switch (reason) {\n case 'missing':\n return `No browserslist config at ${path}`\n case 'empty':\n return `The browserslist config at ${path} matches no browsers`\n case 'invalid':\n return `The browserslist config at ${path} is invalid`\n }\n}\n","import browserslist from 'browserslist'\n\nimport { BrowserFloorError } from './browser-floor.error.ts'\n\nexport { BrowserFloorError }\n\n/** Oldest and newest version of one browser that the floor still includes. */\nexport type BrowserFloorRelease = {\n readonly browser: string\n readonly minimum: string\n readonly maximum: string\n}\n\n/** Title and body for the update screen, taken from the floor versions. */\nexport type UpdateScreenCopy = {\n readonly title: string\n readonly body: string\n}\n\n/**\n * Resolve the minimum and maximum version of each browser in the browserslist config.\n * The path is a config file or any file inside the project that owns `.browserslistrc`.\n * Throws `BrowserFloorError` when the config is missing, empty, or invalid.\n */\nexport function browserFloor(path: string): readonly BrowserFloorRelease[] {\n const queries = loadQueries(path)\n if (queries === undefined) throw new BrowserFloorError(path, 'missing')\n if (queries.length === 0) throw new BrowserFloorError(path, 'empty')\n let resolved: readonly string[]\n try {\n resolved = browserslist(queries, { path })\n } catch (cause) {\n throw new BrowserFloorError(path, 'invalid', cause)\n }\n const releases = floorReleases(resolved)\n if (releases.length === 0) throw new BrowserFloorError(path, 'empty')\n return releases\n}\n\n/**\n * Vite `environments.client.build.target` values for the browserslist config at `path`.\n * Throws `BrowserFloorError` when the config is missing, empty, or invalid.\n */\nexport function buildTargets(path: string): readonly string[] {\n return browserFloor(path).map((release) => `${viteBrowser(release.browser)}${release.minimum}`)\n}\n\n/** Sentence that names the floor versions. Pass the result of `browserFloor`. */\nexport function updateScreenCopy(releases: readonly BrowserFloorRelease[]): UpdateScreenCopy {\n const versions = releases\n .map((release) => `${browserLabel(release.browser)} ${release.minimum}`)\n .join(', ')\n return {\n title: 'Update your browser',\n body: `This application needs ${versions}.`,\n }\n}\n\nfunction loadQueries(path: string): readonly string[] | undefined {\n try {\n return browserslist.loadConfig({ path })\n } catch (cause) {\n throw new BrowserFloorError(path, 'invalid', cause)\n }\n}\n\nfunction floorReleases(resolved: readonly string[]): BrowserFloorRelease[] {\n const ranges = new Map<string, { minimum: string; maximum: string }>()\n for (const entry of resolved) {\n const release = splitRelease(entry)\n if (release === undefined) continue\n const current = ranges.get(release.browser)\n if (current === undefined) {\n ranges.set(release.browser, { minimum: release.version, maximum: release.version })\n continue\n }\n if (compareVersionText(release.version, current.minimum) < 0) current.minimum = release.version\n if (compareVersionText(release.version, current.maximum) > 0) current.maximum = release.version\n }\n return [...ranges.entries()]\n .map(([browser, range]) => ({ browser, minimum: range.minimum, maximum: range.maximum }))\n .sort((left, right) => compareText(left.browser, right.browser))\n}\n\nfunction splitRelease(\n entry: string,\n): { readonly browser: string; readonly version: string } | undefined {\n const space = entry.indexOf(' ')\n if (space === -1) return undefined\n const browser = entry.slice(0, space)\n const version = entry.slice(space + 1)\n if (versionParts(version) === undefined) return undefined\n return { browser, version }\n}\n\nfunction compareVersionText(left: string, right: string): number {\n const leftParts = versionParts(left)\n const rightParts = versionParts(right)\n if (leftParts === undefined || rightParts === undefined) return 0\n return compareVersions(leftParts, rightParts)\n}\n\nfunction versionParts(version: string): readonly number[] | undefined {\n const normalized =\n version.startsWith('≤') || version.startsWith('<=') ? version.replace(/^≤|^<=/, '') : version\n if (!/^\\d+(?:\\.\\d+)*$/.test(normalized)) return undefined\n return normalized.split('.').map((part) => Number(part))\n}\n\nfunction compareVersions(left: readonly number[], right: readonly number[]): number {\n const length = Math.max(left.length, right.length)\n for (let index = 0; index < length; index += 1) {\n const difference = (left[index] ?? 0) - (right[index] ?? 0)\n if (difference !== 0) return difference\n }\n return 0\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1\n if (left > right) return 1\n return 0\n}\n\nfunction viteBrowser(browser: string): string {\n if (browser === 'ios_saf') return 'ios'\n return browser\n}\n\nfunction browserLabel(browser: string): string {\n switch (browser) {\n case 'chrome':\n return 'Chrome'\n case 'edge':\n return 'Edge'\n case 'firefox':\n return 'Firefox'\n case 'safari':\n return 'Safari'\n case 'ios_saf':\n return 'iOS'\n default:\n return browser\n }\n}\n"],"mappings":"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"}
|
package/dist/http.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { l as Logger } from "./index-
|
|
2
|
-
import { n as WebhookVerifier, t as WebhookVerificationError } from "./webhook-verification-
|
|
1
|
+
import { l as Logger } from "./index-tJzJUgTh.js";
|
|
2
|
+
import { n as WebhookVerifier, t as WebhookVerificationError } from "./webhook-verification-Cy4Z5djk.js";
|
|
3
3
|
//#region src/infrastructure/http/webhook-handler.d.ts
|
|
4
4
|
/** Application policy and diagnostics for one webhook body. */
|
|
5
5
|
type WebhookHandlerOptions = {
|
package/dist/http.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as createLogger } from "./core-
|
|
2
|
-
import { t as WebhookVerificationError } from "./webhook-verification-
|
|
1
|
+
import { r as createLogger } from "./core-CV8SQv01.js";
|
|
2
|
+
import { t as WebhookVerificationError } from "./webhook-verification-B8v3-LQ2.js";
|
|
3
3
|
import { StatusCodes } from "http-status-codes";
|
|
4
4
|
|
|
5
5
|
//#region src/infrastructure/http/webhook-handler.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Ft as BounceType, Gt as EmailAddress, Ht as EmailIdempotencyKey, J as DomainEvent, Jt as AnalyticsProperties, Nt as RecordEmailEventPayload, Qt as AppError, X as DomainQuery, Xt as AnalyticsTarget, Y as DomainMessage, Z as MessageId, q as DomainCommand, qt as AnalyticsEventInput } from "./index-tJzJUgTh.js";
|
|
2
2
|
//#region src/application/handlers.d.ts
|
|
3
3
|
/**
|
|
4
4
|
* Handles one command with the dependency container and returns the caller's value.
|
|
@@ -334,6 +334,8 @@ interface IOutboxPublisher {
|
|
|
334
334
|
type OutboxRow = {
|
|
335
335
|
readonly payload: DomainEvent;
|
|
336
336
|
readonly attempts: number;
|
|
337
|
+
/** When the unit of work committed the row. */
|
|
338
|
+
readonly createdAt: Date;
|
|
337
339
|
};
|
|
338
340
|
/** The rows one claim leased, and the lease token that every settlement of them must hold. */
|
|
339
341
|
type OutboxBatch = {
|
|
@@ -372,7 +374,7 @@ type OutboxRelayOptions = {
|
|
|
372
374
|
readonly batchSize?: number;
|
|
373
375
|
readonly maxBatches?: number;
|
|
374
376
|
readonly maxAttempts?: number;
|
|
375
|
-
/** The wait before the first retry; each later retry doubles it. */
|
|
377
|
+
/** The longest wait before the first retry; each later retry doubles it. Jitter picks between half and all of it. */
|
|
376
378
|
readonly retryBaseDelayMs?: number;
|
|
377
379
|
/** The longest wait before a retry. */
|
|
378
380
|
readonly retryMaxDelayMs?: number;
|
|
@@ -408,6 +410,7 @@ declare class OutboxRelay {
|
|
|
408
410
|
private failOrRetry;
|
|
409
411
|
/** Releases rows for another attempt. Each row waits longer the more attempts it has used. */
|
|
410
412
|
private releaseForRetry;
|
|
413
|
+
private get delays();
|
|
411
414
|
/** Splits claimed rows: rows whose last run crashed with no attempt left, and rows that may run now. */
|
|
412
415
|
private splitByAttemptsLeft;
|
|
413
416
|
/** Splits failed rows: rows that just used their last attempt, and rows that may retry. */
|
|
@@ -420,6 +423,43 @@ declare class OutboxRelay {
|
|
|
420
423
|
private markFailed;
|
|
421
424
|
}
|
|
422
425
|
//#endregion
|
|
426
|
+
//#region src/application/queue-or-rpc-publisher.d.ts
|
|
427
|
+
/** A client for a consumer that runs one event when called over RPC; it rejects when the event fails. */
|
|
428
|
+
interface IEventConsumerClient {
|
|
429
|
+
consume(event: DomainEvent): Promise<void>;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* What an RPC event consumer returns. It returns a failure instead of throwing it: the outbox owns
|
|
433
|
+
* the retries, and a throw from an RPC method is reported to Sentry on every attempt.
|
|
434
|
+
*/
|
|
435
|
+
type ConsumeResult = {
|
|
436
|
+
readonly ok: true;
|
|
437
|
+
} | {
|
|
438
|
+
readonly ok: false;
|
|
439
|
+
readonly error: unknown;
|
|
440
|
+
};
|
|
441
|
+
/** The two clients, the app's rule for choosing between them, and the RPC budget. */
|
|
442
|
+
type QueueOrRpcPublisherOptions = {
|
|
443
|
+
readonly queue: IOutboxPublisher;
|
|
444
|
+
readonly consumer: IEventConsumerClient;
|
|
445
|
+
/** The app's rule: which events go over RPC. */
|
|
446
|
+
readonly usesRpc: (event: DomainEvent) => boolean;
|
|
447
|
+
/** RPC calls in one request. Cloudflare allows 32 Worker invocations per request. */
|
|
448
|
+
readonly callsPerRequest?: number;
|
|
449
|
+
};
|
|
450
|
+
/**
|
|
451
|
+
* Publishes each event over RPC or to the queue. Events that the rule picks are consumed over RPC,
|
|
452
|
+
* in parallel, until the request's call budget is used; every other event goes to the queue.
|
|
453
|
+
* Build one per request, so the budget counts that request's calls. A failed call or queue send
|
|
454
|
+
* rejects only its own events.
|
|
455
|
+
*/
|
|
456
|
+
declare class QueueOrRpcPublisher implements IOutboxPublisher {
|
|
457
|
+
private readonly options;
|
|
458
|
+
private callsLeft;
|
|
459
|
+
constructor(options: QueueOrRpcPublisherOptions);
|
|
460
|
+
publish(events: ReadonlyArray<DomainEvent>): Promise<readonly RejectedMessage<DomainEvent>[]>;
|
|
461
|
+
}
|
|
462
|
+
//#endregion
|
|
423
463
|
//#region src/application/outbox-retention.d.ts
|
|
424
464
|
/** Typist's retention defaults; receipt retention must cover the application's supported replay period. */
|
|
425
465
|
type OutboxRetentionOptions = {
|
|
@@ -466,5 +506,5 @@ declare class UnitOfWorkAlreadyActiveError extends AppError {
|
|
|
466
506
|
constructor();
|
|
467
507
|
}
|
|
468
508
|
//#endregion
|
|
469
|
-
export {
|
|
470
|
-
//# sourceMappingURL=index-
|
|
509
|
+
export { ObservabilityService as $, RecordEmailEventCommand as A, IEventCollector as B, Handlers as C, RegistryMessage as D, QueryRegistry as E, UnitOfWork as F, OutboundEmail as G, EmailAttachment as H, UnitOfWorkDeps as I, ReceivedEmail as J, ReceivedAttachment as K, ITransaction as L, RecordEmailEventRepos as M, recordEmailEvent as N, EmailBounceRecord as O, IUnitOfWork as P, ObservabilityScope as Q, IOutboxWake as R, EventRegistry as S, MessageResult as T, IEmailService as U, EmailAccepted as V, MimeType as W, applyObservabilityUser as X, RecordingEmailService as Y, setObservabilityUserHook as Z, IOutboxPublisher as _, OutboxRetentionResult as a, NULL_METRICS_SERVICE as at, MessageBus as b, QueueOrRpcPublisher as c, NULL_ANALYTICS as ct, OutboxRelayOptions as d, QueryHandler as dt, ObservabilityUser as et, IOutboxRepository as f, OutboxRow as g, OutboxFailureReason as h, OutboxRetentionOptions as i, MetricsService as it, RecordEmailEventDeps as j, IEmailDeliverabilityStore as k, QueueOrRpcPublisherOptions as l, CommandHandler as lt, OutboxBatch as m, MessageAlreadyProcessedError as n, MetricAttributes as nt, ConsumeResult as o, AnalyticsPropertiesOf as ot, IOutboxRetentionRepository as p, ReceivedContent as q, OutboxRetention as r, MetricOptions as rt, IEventConsumerClient as s, AnalyticsService as st, UnitOfWorkAlreadyActiveError as t, MetricAttributeValue as tt, OutboxRelay as u, EventHandler as ut, RejectedMessage as v, MessageRegistry as w, CommandRegistry as x, IMessageBus as y, IMessageStore as z };
|
|
510
|
+
//# sourceMappingURL=index-DIHLfC-p.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DIHLfC-p.d.ts","names":[],"sources":["../src/application/handlers.ts","../src/application/analytics-service.ts","../src/application/metrics-service.ts","../src/application/observability-service.ts","../src/application/request-user.ts","../src/application/email-service.ts","../src/application/event-collector.ts","../src/application/message-store.ts","../src/application/outbox-wake.ts","../src/application/transaction.ts","../src/application/unit-of-work.ts","../src/application/record-email-event.ts","../src/application/registry.ts","../src/application/message-bus.ts","../src/application/outbox-publisher.ts","../src/application/outbox-repository.ts","../src/application/outbox-relay.ts","../src/application/queue-or-rpc-publisher.ts","../src/application/outbox-retention.ts","../src/application/message-already-processed.error.ts","../src/application/unit-of-work.errors.ts"],"mappings":"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"}
|
|
@@ -666,8 +666,9 @@ declare function classifyBoundaryError(args: {
|
|
|
666
666
|
readonly includeCloudflare: boolean;
|
|
667
667
|
}): FailureClassification;
|
|
668
668
|
/**
|
|
669
|
-
* Judge a final failure for its durable retry owner. An `AppError` carries its own answer
|
|
670
|
-
* A raw throw nobody judged is unknown, so an immediate owner stops and a
|
|
669
|
+
* Judge a final failure for its durable retry owner. An `AppError` carries its own answer, also
|
|
670
|
+
* after Workers RPC. A raw throw nobody judged is unknown, so an immediate owner stops and a
|
|
671
|
+
* durable one may repeat.
|
|
671
672
|
*/
|
|
672
673
|
declare function classifyFailure(cause: unknown): FailureClassification;
|
|
673
674
|
/** Read a positive server-advertised retry delay in seconds, such as `RateLimitError.retryAfter`. */
|
|
@@ -684,6 +685,31 @@ declare function exponentialEqualJitterMs(baseDelayMs: number, maxDelayMs: numbe
|
|
|
684
685
|
/** Capped exponential delay for a durable retry recorded in storage. */
|
|
685
686
|
declare function exponentialDelayCapMs(baseDelayMs: number, maxDelayMs: number, attempt: number): number;
|
|
686
687
|
//#endregion
|
|
688
|
+
//#region src/core/redelivery-policy.d.ts
|
|
689
|
+
/** The exponential backoff for a durable retry: the first wait, and the longest wait. */
|
|
690
|
+
type RedeliveryDelays = {
|
|
691
|
+
readonly baseDelayMs: number;
|
|
692
|
+
readonly maxDelayMs: number;
|
|
693
|
+
};
|
|
694
|
+
/** The queue consumer's backoff: 5 s, doubling, up to 120 s. */
|
|
695
|
+
declare const DEFAULT_REDELIVERY_DELAYS: RedeliveryDelays;
|
|
696
|
+
/** How to settle one failed message: stop for good, or deliver it again after a delay. */
|
|
697
|
+
type RedeliveryDecision = {
|
|
698
|
+
readonly action: 'ack';
|
|
699
|
+
readonly classification: 'terminal';
|
|
700
|
+
} | {
|
|
701
|
+
readonly action: 'retry';
|
|
702
|
+
readonly classification: Exclude<FailureClassification, 'terminal'>;
|
|
703
|
+
readonly delayMs: number;
|
|
704
|
+
};
|
|
705
|
+
/**
|
|
706
|
+
* Decide whether a failed message stops or is delivered again. A terminal failure stops. Transient
|
|
707
|
+
* and unknown failures retry: after the advertised wait plus a spread when the error carries one,
|
|
708
|
+
* else with exponential equal-jitter backoff. An `AggregateError` from event delivery retries when
|
|
709
|
+
* any member does, after the longest wait. The queue consumer and the outbox relay both use it.
|
|
710
|
+
*/
|
|
711
|
+
declare function decideRedelivery(cause: unknown, attempt: number, delays?: RedeliveryDelays): RedeliveryDecision;
|
|
712
|
+
//#endregion
|
|
687
713
|
//#region src/core/console-log-sink.d.ts
|
|
688
714
|
/** Write one structured record or one readable development entry to `console`. */
|
|
689
715
|
declare const consoleSink: LogSink;
|
|
@@ -748,5 +774,5 @@ declare function setLoggerErrorHook(hook: LoggerErrorHook | null): void;
|
|
|
748
774
|
/** Create a logger for one module. */
|
|
749
775
|
declare function createLogger(module: string): Logger;
|
|
750
776
|
//#endregion
|
|
751
|
-
export {
|
|
752
|
-
//# sourceMappingURL=index-
|
|
777
|
+
export { IdDefinition as $, FailureClassification as $t, isCloudflareOverloadedError as A, StaleSessionError as At, MessageCollection as B, EmailSendFailureReason as Bt, spreadJitterMs as C, ValidationProblemDetails as Ct, retryAfterSecondsOf as D, InternalServerError as Dt, classifyFailure as E, ValidationProblemErrorSchema as Et, Entity as F, BounceType as Ft, combineMessages as G, EmailAddress as Gt, MessageOf as H, EmailIdempotencyKey as Ht, EntityData as I, BounceTypeSchema as It, DomainEvent as J, AnalyticsProperties as Jt, defineMessages as K, EmailAddressSchema as Kt, CommandOf as L, isEmailDeliverable as Lt, isTransientCloudflareRuntimeError as M, AuthenticationError as Mt, isAbortError as N, RecordEmailEventPayload as Nt, CLOUDFLARE_TRANSIENT_ERROR_PATTERNS as O, ServiceUnavailableError as Ot, isTransientTransportError as P, RecordEmailEventPayloadSchema as Pt, Id as Q, AppError as Qt, DuplicateMessageNameError as R, parseBounceType as Rt, exponentialEqualJitterMs as S, ProblemDetailsSchema as St, classifyBoundaryError as T, ValidationProblemError as Tt, PayloadSchemas as U, InvalidEmailIdempotencyKeyError as Ut, MessageDefinition as V, EmailServiceError as Vt, QueryOf as W, emailIdempotencyKey as Wt, DomainQuery as X, AnalyticsTarget as Xt, DomainMessage as Y, AnalyticsProperty as Yt, MessageId as Z, MissingConfigurationError as Zt, DEFAULT_REDELIVERY_DELAYS as _, ResourceNotFoundError as _t, LogLevel as a, DatabaseError as at, decideRedelivery as b, ValidationIssue as bt, LogValue as c, ErrorEntry as ct, LoggerSettings as d, ErrorTagOf as dt, RetryOwner as en, IdOf as et, configureLogger as f, ResolvedError as ft, consoleSink as g, RequestTimeoutError as gt, setLoggerErrorHook as h, MalformedRequestError as ht, LogFormat as i, D1ConstraintKind as it, isCloudflareRetryableError as j, RateLimitError as jt, isCloudflareObjectResetError as k, NotAuthorizedError as kt, Logger as l, ErrorPayloadOf as lt, setLogSink as m, sharedErrors as mt, LogEntry as n, notImplemented as nt, LogSink as o, DatabaseFailure as ot, createLogger as p, defineErrors as pt, DomainCommand as q, AnalyticsEventInput as qt, LogFields as r, unreachable as rt, LogThreshold as s, ErrorEntries as st, ErrorCaptureEntry as t, shouldRetryFailure as tn, defineId as tt, LoggerErrorHook as u, ErrorTable as ut, RedeliveryDecision as v, UpgradeRequiredError as vt, BoundaryErrorClassifier as w, ValidationProblemDetailsSchema as wt, exponentialDelayCapMs as x, ProblemDetails as xt, RedeliveryDelays as y, ValidationError as yt, EventOf as z, shouldUpdateBounce as zt };
|
|
778
|
+
//# sourceMappingURL=index-tJzJUgTh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-tJzJUgTh.d.ts","names":[],"sources":["../src/core/failure-classification.ts","../src/core/app-error.ts","../src/core/missing-configuration.error.ts","../src/core/analytics-event.ts","../src/core/email-address.ts","../src/core/email-idempotency-key.ts","../src/core/email-service.error.ts","../src/core/email-deliverability.ts","../src/core/record-email-event.ts","../src/core/authentication.error.ts","../src/core/rate-limit.error.ts","../src/core/stale-session.error.ts","../src/core/not-authorized.error.ts","../src/core/internal.errors.ts","../src/core/problem-details.ts","../src/core/request.errors.ts","../src/core/error-table.ts","../src/core/database.error.ts","../src/core/defects.ts","../src/core/identity.ts","../src/core/messages.ts","../src/core/define-messages.ts","../src/core/entity.ts","../src/core/transport-classification.ts","../src/core/cloudflare-classification.ts","../src/core/classify-failure.ts","../src/core/backoff.ts","../src/core/redelivery-policy.ts","../src/core/console-log-sink.ts","../src/core/logger.ts"],"mappings":";;;;;;;;KAMY;;;;;;;KAQA;;iBAGI,mBAAmB;WACxB,gBAAgB;WAChB;WACA,OAAO;;;;;;;;;;;;uBCVI,iBAAiB;oBACnB;oBACA,gBAAgB;MAErB;;;;;cCXF,kCAAkC;WAKxB;WAJZ;WACA;;EAGT,YAAqB;;;;;UCPN,oBACf,+BACA;WAES,MAAM;WACN,YAAY;;;KAIX,4EAMC,sBACT;;UAGa;YACL,eAAe;;;;;;;KAQf;WAEG;WACA;WACA;;WAGA;WACA;;WAEA,YAAY;;;;;cCpCd,oBAAkB,EAAA,KAAA,YAAA,EAAA;;KAGnB,eAAe,EAAE,aAAa;;;;KCD9B,+BAA+B,EAAE,KAAK;;cAMrC,wCAAwC;WAI9B;WAHZ;WACA;EAET,YAAqB;;;;;;;;;iBAYP,oBAAoB,eAAe,aAAa;;;;KCvBpD;;;;;cAqBC,0BAA0B;WAC5B;WACA,gBAAgB;WAChB,QAAQ;WACR;WACA;WACA;WACA;EAET,YAAY;aACD,QAAQ;aACR;aACA;aACA;aACA;aACA;;;;;;cCrCA,kBAAgB,EAAA;;;;;;KAGjB,aAAa,EAAE,aAAa;;iBAGxB,gBAAgB,4BAA4B;;iBAY5C,mBAAmB,UAAU,YAAY,SAAS;;iBAMlD,mBAAmB,YAAY,mBAAmB;;;;;;;cClBrD,+BAA6B,EAAA;;;;;;;;;;;;;GAUxC,EAAA,KAAA;;KAGU,0BAA0B,EAAE,aAAa;;;;cCnBxC,4BAA4B;WAC9B;WACA;EAET;;;;;cCJW,uBAAuB;WAKb;WAJZ;WACA;WACA;EAET,YAAqB;;;;;cCLV,0BAA0B;WAC5B;WACA;EAET;;;;;cCJW,2BAA2B;WAC7B;WACA;EAET;;;;;cCJW,4BAA4B;WAC9B;WACA;EAET;;;cAMW,gCAAgC;WAClC;WACA;EAET;;;;;;;;;cCVW,sBAAoB,EAAA;;;;;GAqB/B,EAAA,KAAA;;KAGU,iBAAiB,EAAE,aAAa;;cAG/B,8BAA4B,EAAA;;;GAWvC,EAAA,KAAA;;KAGU,yBAAyB,EAAE,aAAa;;cAGvC,gCAA8B,EAAA;;;;;;;;;GAEzC,EAAA,KAAA;;KAGU,2BAA2B,EAAE,aAAa;;;;KClD1C;WACD;WACA,eAAe;;;cAIb,wBAAwB;WAKxB,iBAAiB;WAJnB;WACA;EAET,YACW,iBAAiB,0BAC1B;;SAMK,QAAQ,OAAO,EAAE,UAAU,mBAAmB;;SAK9C,WAAW,iBAAiB,mBAAmB,mBAAmB;;;cAS9D,8BAA8B;WAChC;WACA;EAET,YAAY;IAAQ;;;;cAMT,8BAA8B;WAChC;WACA;EAET;;;cAMW,6BAA6B;WAC/B;WACA;EAET;;;cAMW,4BAA4B;WAC9B;WACA;EAET;;;;KCtDG,eAAe,EAAE;;;;;KAMV,WAAW,oBAAoB,eAAe,eAAe;WAC9D,wBAAwB,kBAAkB;aAAsB,MAAM;;WACtE;WACA,SAAS;;;KAMR,aAAa,uBACb,aAAa,mBAAmB,WAAW;KAGlD,aAAa,oBAAoB,SAAS;WACpC,cAAc,eAAe,EAAE;;WAE3B,MAAM;WAAc;IAAoB,EAAE,OAAO;WACjD,MAAM;WAAc;;KAE9B,iBAAiB,cACnB,aAAa,mBAAmB,aAAa,KAAK,QAAQ,eACrD;;KAGI,cAAc;WACf;WACA,SAAS;;;;;;KAOR,WAAW;WACZ,SAAS;;WAET,eAAe,EAAE,QAAQ,iBAAiB;;WAE1C,SAAS,iBAAiB;;EAEnC,MAAM,iBAAiB,iBAAiB;;EAExC,GAAG,kBAAkB,kBACnB,gBACA,KAAK,MACJ,SAAS,QAAQ,iBAAiB;aAAqB,MAAM;;;EAEhE,QAAQ,iBAAiB,cAAc,iBAAiB;;EAExD,SAAS,iBAAiB,cAAc,iBAAiB;;;KAI/C,eAAe,SACzB,cAAc,iBAAiB,WAAW,iBAAiB;;KAGjD,WAAW,SACrB,cAAc,iBAAiB,iBAAiB;;cAUrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAcR,cAAc,WAAW,YAAY,oBAAoB,WAAW;;;;;iBA4BzD,mBAAmB,gBAAgB,aAAa,UAC9D,SAAS,UACR,WAAW,cAAc;;;;KCpIhB;;KAGA;WAEG;WACA;WACA,MAAM;WACN;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;;;cAIF,sBAAsB;WAItB;WACA,gBAAgB;WAChB,SAAS;WALX;EAET,YACW,mBACA,gBAAgB,uBAChB,SAAS,iBAClB;aAAoB;;;;;;;;;;iBCzBR,YAAY;;;;;;;iBAUZ,eAAe;;;;KCbnB,GAAG,iCAAiC,EAAE,KAAK,OAAO;;KAGlD,aAAa;WACd,QAAQ,EAAE,KAAK,YAAY,EAAE,SAAS;;EAE/C,UAAU,GAAG;;;KAIH,KAAK,mBAAmB,wBAAwB,EAAE,OAAO;;;;;iBAMrD,eAAe,sBAAsB,OAAO,QAAQ,aAAa;;;;;;;;;;KCbrE;;KAGA,cAAc;WACf;WACA,MAAM;WACN,IAAI;;;KAIH,YAAY;WACb;WACA,MAAM;;;KAIL,YAAY;WACb;WACA,MAAM;WACN,IAAI;;;KAIH,gBAAgB,gBAAgB,cAAc;;;;KCtB9C,iBAAiB,SAAS,eAAe,EAAE;;KAG3C;WACD,WAAW;WACX,SAAS;WACT,UAAU;;cAGf;cAEA;EACJ,SAAO,EAAA;;;;EACP,OAAK,EAAA;;;;EACL,OAAK,EAAA;;;;KAGF,2BAA2B;KAC3B;KACA,YAAY,SAAS,eAAe,EAAE;KACtC,eAAe;KACf;WACM,gBAAgB;WAChB,cAAc;WACd,cAAc;;KAEpB,oBAAoB;YAAyB;;KAC7C,SAAS,gBAAgB,aAAa,cAAc;KACpD,QAAQ,WAAW,yBAAyB,KAAK,SAAS;;KAGnD,kBAAkB,aAAa,cAAc;YAC7C;WACD,eAAe,EAAE,SAAS,SAAS;WACnC,aAAa,EAAE,SAAS,SAAS;WACjC,aAAa,EAAE,SAAS,SAAS;;WAEjC,aAAa,EAAE,UACrB,SAAS,0BAA0B,SAAS;;EAG/C,cAAc,mBAAmB,iCAC/B,YACA,MAAM,MACN,SAAS,QAAQ,EAAE,OAAO,uBAAuB,QAAQ,UACzD,KAAK,YACJ,EAAE,OAAO,uBAAuB;;EAEnC,YAAY,mBAAmB,+BAC7B,YACA,MAAM,MACN,SAAS,QAAQ,EAAE,OAAO,qBAAqB,QAAQ,UACvD,KAAK,YACJ,EAAE,OAAO,qBAAqB;;EAEjC,YAAY,mBAAmB,+BAC7B,YACA,MAAM,MACN,SAAS,QAAQ,EAAE,OAAO,qBAAqB,QAAQ,WACtD,EAAE,OAAO,qBAAqB;;;KAIvB,UAAU,iBAAiB,qBAAqB,EAAE,OAC5D,SAAS;;KAIC,QAAQ,iBAAiB,qBAAqB,EAAE,OAC1D,SAAS;;KAIC,QAAQ,iBAAiB,qBAAqB,EAAE,OAC1D,SAAS;;KAIC,UAAU,iBAAiB,qBACnC,UAAU,YACV,QAAQ,YACR,QAAQ;KAEP,YAAY,SAAS,cAAc,cAAc;KACjD,qBAAqB,gBAAgB,8BAC9B,cAAc,UAAU,YAAY,EAAE,OAAO,QAAQ,UAC7D,6BACE,QAAQ;iBAIL,cACP,aAAa,aACb,qBACA,eAAe,EAAE,iBACjB,MAAM,MAAM,MAAM,MAAM,SAAS,SAAM,EAAA,gBAAA,EAAA;;;;;;;;;;;;;;GAExC,EAAA,KAAA,UAAA;KAEI,gBAAgB,aAAa,aAAa,gBAAgB,8BACnD,cAAc,mBAAmB,kBAClC,cAAc,MAAM,MAAM,QAAQ;;iBAmD7B,qBACR,iBAAiB,iBAAiB,oBAClC,eAAe,iBAAiB,oBAChC,gBAAgB,iBAAiB,cACvC;WACS,WAAW,WAAW,qBAAqB;WAC3C,SAAS,SAAS,qBAAqB;WACvC,UAAU,UAAU,qBAAqB;IACnD;;;;;;cASY,kCAAkC;WAMlC,MAAM;WACN;WANF;WACA;;EAGT,YACW,MAAM,aACN;;KAMR,aAAa,MAAM,aAAa,eACnC,aAAa,OAAO,YAAY,eAAe,EAAE,mBAAmB;KASjE,eAAe,6BAA6B,uBAC/C,oCACQ,cAAc,4BACX,sBAAsB,0BAItB,aAAa,mBAAmB,MAAM,OAAO,YAAY,aAAa,eACjE,cACR,eAAe;;;;;iBAwBT,sBAAsB,6BAA6B,wBAC9D,aAAa,eAAe,eAAe,gDAA6C;EAxC/E,4BAAA,QAAI,aAAA,eAAA,eAAA,qFAAA,cAAA,eAAA,eAAA,0EAAA;EAAJ,0BAAA,QAAI,aAAA,eAAA,eAAA,mFAAA,cAAA,eAAA,eAAA,wEAAA;EAAJ,0BAAA,QAAI,aAAA,eAAA,eAAA,mFAAA,cAAA,eAAA,eAAA,wEAAA;;;;;KC/LN;WAAwB;;;;;;;uBAOd,OAAO,aAAa,YAAY,eAAe,cAAc;UACzE;oBAEU,IAAI;;YAGZ,SAAS,OAAO;;EAK1B,iBAAiB,cAAc;;EAK/B;;WAKS,iBAAiB;;;;;iBCYZ,aAAa;;iBAiBb,0BAA0B;;;;cCzD7B;WACX,uBAAqB;WACrB,aAAW;WACX,iBAAe;WACf,aAAW;WACX,mBAAiB;;;iBAgBH,2BAA2B;;iBAK3B,4BAA4B;;iBAK5B,6BAA6B;;iBAK7B,kCAAkC;;;;KC3BtC,2BAA2B,mBAAmB;;;;;iBAM1C,sBAAsB;WAC3B;WACA,kBAAkB;WAClB;IACP;;;;;;iBAgCY,gBAAgB,iBAAiB;;iBAYjC,oBAAoB;;;;iBC/DpB,eAAe;;;;;iBAWf,yBACd,qBACA,oBACA;;iBAOc,sBACd,qBACA,oBACA;;;;KCpBU;WACD;WACA;;;cAIE,2BAA2B;;KAM5B;WACG;WAAwB;;WAExB;WACA,gBAAgB,QAAQ;WACxB;;;;;;;;iBASC,iBACd,gBACA,iBACA,SAAQ,mBACP;;;;cCAU,aAAa;;;;KClCd,uDAKC;YACG,cAAc;;;KAIlB,YAAY,SAAS;;cAGpB;WACX;WACA;WACA;WACA;;KAEU,mBAAmB,uBAAuB;;KAG1C,eAAe;;KAGf;;UAGK;WACN,QAAQ;WACR,SAAS;;;KAIR;WACD;WACA,OAAO;WACP;WACA;WAEA,YAAY;WACZ;WACA;;;UAIM;WACN;WACA;WAEA,YAAY;;;KAIX,mBAAmB,OAAO;;KAG1B,WAAW,OAAO;;UAGb;EACf,MAAM,eAAe,SAAS;EAC9B,KAAK,eAAe,SAAS;EAC7B,KAAK,eAAe,SAAS;EAC7B,MAAM,eAAe,SAAS;;;iBAShB,gBAAgB,UAAU;;iBAM1B,WAAW,MAAM;;iBAKjB,mBAAmB,MAAM;;iBA0BzB,aAAa,iBAAiB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { _ as isCloudflareOverloadedError, rt as AppError, v as isCloudflareRetryableError, x as isTransientTransportError } from "./core-CV8SQv01.js";
|
|
2
2
|
|
|
3
3
|
//#region src/infrastructure/cloudflare/kv-errors.ts
|
|
4
4
|
/** Extract Typist's verified KV message formats, including nested causes. */
|
|
@@ -141,4 +141,4 @@ function getDeepErrorMessage(cause) {
|
|
|
141
141
|
|
|
142
142
|
//#endregion
|
|
143
143
|
export { isRetryableKVError as a, isKVPutRateLimitError as i, decideKVRetry as n, isTerminalKVError as o, extractKVMeta as r, isTransientKVError as s, KVError as t };
|
|
144
|
-
//# sourceMappingURL=kv-errors-
|
|
144
|
+
//# sourceMappingURL=kv-errors-DXbnO7cB.js.map
|