{"version":3,"sources":["../../src/email-node/memory-transport.ts","../../src/email/blocked-ip.ts","../../src/runtime/resolve.ts","../../src/email/errors.ts","../../src/email/capabilities.ts","../../src/email/provider.ts","../../src/email/providers/attachments.ts","../../src/email/runtime.ts","../../src/email-node/mime.ts","../../src/email-node/transport.ts","../../src/email-node/smtp.ts"],"names":["tlsConnect","netConnect","hextets","https","http","Readable","dnsLookup"],"mappings":"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","file":"node.cjs","sourcesContent":["import type {\n  AthenaSmtpConnectInput,\n  AthenaSmtpConnection,\n  AthenaSmtpReply,\n  AthenaSmtpTransport,\n} from \"./transport.ts\";\n\nexport interface MemorySmtpTransport extends AthenaSmtpTransport {\n  commands: string[];\n  payloads: string[];\n}\n\nexport const DEFAULT_STARTTLS_REPLIES: AthenaSmtpReply[] = [\n  { code: 220, lines: [\"smtp.example.com ESMTP\"] },\n  { code: 250, lines: [\"smtp.example.com\", \"STARTTLS\", \"AUTH PLAIN LOGIN\"] },\n  { code: 220, lines: [\"ready to start TLS\"] },\n  { code: 250, lines: [\"smtp.example.com\", \"AUTH PLAIN LOGIN\"] },\n  { code: 235, lines: [\"Authentication successful\"] },\n  { code: 250, lines: [\"OK\"] },\n  { code: 250, lines: [\"OK\"] },\n  { code: 354, lines: [\"Start mail input\"] },\n  { code: 250, lines: [\"queued as <smtp-test-id@smtp.example.com>\"] },\n  { code: 221, lines: [\"Bye\"] },\n];\n\nfunction scriptedReply(\n  commands: string[],\n  payloads: string[],\n  awaitingData: { value: boolean }\n): AthenaSmtpReply {\n  if (payloads.length > 0 && awaitingData.value) {\n    awaitingData.value = false;\n    return { code: 250, lines: [\"queued as <smtp-test-id@smtp.example.com>\"] };\n  }\n  const last = commands.at(-1) ?? \"\";\n  if (commands.length === 0) {\n    return { code: 220, lines: [\"smtp.example.com ESMTP\"] };\n  }\n  if (last.startsWith(\"EHLO \")) {\n    return {\n      code: 250,\n      lines: [\"smtp.example.com\", \"STARTTLS\", \"AUTH PLAIN LOGIN\"],\n    };\n  }\n  if (last === \"STARTTLS\") {\n    return { code: 220, lines: [\"ready to start TLS\"] };\n  }\n  if (last.startsWith(\"AUTH \")) {\n    return { code: 235, lines: [\"Authentication successful\"] };\n  }\n  if (last.startsWith(\"MAIL FROM:\")) {\n    return { code: 250, lines: [\"OK\"] };\n  }\n  if (last.startsWith(\"RCPT TO:\")) {\n    return { code: 250, lines: [\"OK\"] };\n  }\n  if (last === \"DATA\") {\n    awaitingData.value = true;\n    return { code: 354, lines: [\"Start mail input\"] };\n  }\n  if (last === \"QUIT\") {\n    return { code: 221, lines: [\"Bye\"] };\n  }\n  return { code: 250, lines: [\"OK\"] };\n}\n\nexport function createMemorySmtpTransport(\n  replies?: AthenaSmtpReply[]\n): MemorySmtpTransport {\n  const commands: string[] = [];\n  const payloads: string[] = [];\n  const remaining = replies ? [...replies] : null;\n  const awaitingData = { value: false };\n\n  const connect: MemorySmtpTransport = async (\n    _input: AthenaSmtpConnectInput\n  ) => {\n    const connection: AthenaSmtpConnection = {\n      async close() {},\n      async readReply() {\n        if (remaining) {\n          const next = remaining.shift();\n          if (!next) {\n            throw new Error(\"SMTP memory transport has no remaining replies\");\n          }\n          return next;\n        }\n        return scriptedReply(commands, payloads, awaitingData);\n      },\n      async startTls() {\n        commands.push(\"STARTTLS-UPGRADE\");\n      },\n      async writeData(data: string) {\n        payloads.push(data);\n      },\n      async writeLine(line: string) {\n        commands.push(line);\n      },\n    };\n    return connection;\n  };\n\n  connect.commands = commands;\n  connect.payloads = payloads;\n  return connect;\n}\n","/**\n * Attachment SSRF: block IPv4 addresses that IANA does not classify as\n * globally reachable (RFC 6890 Special-Purpose Address Registry).\n *\n * Allowlisting “private + loopback + multicast” is not enough: documentation\n * prefixes such as 203.0.113.0/24 (TEST-NET-3) are omitted by that subset and\n * are still routed in some environments.\n */\n\nexport function parseIpv4(\n  value: string\n): [number, number, number, number] | null {\n  const match = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(value);\n  if (!match) {\n    return null;\n  }\n  const octets = match.slice(1).map(Number) as [number, number, number, number];\n  if (octets.some((octet) => octet > 255)) {\n    return null;\n  }\n  return octets;\n}\n\nexport function isBlockedIpv4(\n  octets: [number, number, number, number]\n): boolean {\n  const [a, b, c, d] = octets;\n  if (a === 0 || a === 10 || a === 127) {\n    return true;\n  }\n  // 100.64.0.0/10 shared address space (CGNAT).\n  if (a === 100 && (b & 0xc0) === 64) {\n    return true;\n  }\n  if (a === 169 && b === 254) {\n    return true;\n  }\n  // 172.16.0.0/12 private.\n  if (a === 172 && (b & 0xf0) === 16) {\n    return true;\n  }\n  // 192.0.0.0/24 IETF Protocol Assignments. 192.0.0.9 / .10 are globally reachable anycast.\n  if (a === 192 && b === 0 && c === 0 && d !== 9 && d !== 10) {\n    return true;\n  }\n  // 192.0.2.0/24 TEST-NET-1.\n  if (a === 192 && b === 0 && c === 2) {\n    return true;\n  }\n  // 192.88.99.0/24 6to4 relay anycast (deprecated; not globally reachable).\n  if (a === 192 && b === 88 && c === 99) {\n    return true;\n  }\n  if (a === 192 && b === 168) {\n    return true;\n  }\n  // 198.18.0.0/15 benchmarking.\n  if (a === 198 && (b & 0xfe) === 18) {\n    return true;\n  }\n  // 198.51.100.0/24 TEST-NET-2.\n  if (a === 198 && b === 51 && c === 100) {\n    return true;\n  }\n  // 203.0.113.0/24 TEST-NET-3.\n  if (a === 203 && b === 0 && c === 113) {\n    return true;\n  }\n  // 224.0.0.0/4 multicast and 240.0.0.0/4 reserved.\n  if (a >= 224) {\n    return true;\n  }\n  return false;\n}\n","/**\n * Internal Athena runtime plan.\n *\n * One pipeline owns environment + bindings + explicit intent + defaults.\n * `createClient` materializes from this plan; the snapshot is not a public\n * config surface.\n */\n\nimport { athenaAuthConfig } from \"../auth/config.ts\";\nimport { resolveChatMode } from \"../chat/config.ts\";\nimport type { AthenaChatConfig } from \"../chat/types.ts\";\nimport { AthenaConfigurationError } from \"../config/errors.ts\";\n\nfunction normalizeOptional(\n  value: string | null | undefined\n): string | undefined {\n  return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\ninterface ResolveAuthInput {\n  mode?: string;\n  url?: string | null;\n}\n\nexport interface ResolveConfigInput {\n  auth?: false | ResolveAuthInput | null;\n  chat?: boolean | AthenaChatConfig;\n  databaseUrl?: string | null;\n  db?: { d1?: unknown; pgUri?: string | null; pool?: unknown };\n  env?: Record<string, string | undefined>;\n  mode?: string | null;\n  storage?: {\n    bucket?: string | null;\n    prefix?: string | null;\n    provider?: string | null;\n    r2?: unknown;\n    root?: string | null;\n    s3?: unknown;\n    url?: string | null;\n  };\n  url?: string | null;\n}\n\nexport type AthenaRuntimeEnvironment =\n  | \"node\"\n  | \"browser\"\n  | \"react-native\"\n  | \"cloudflare\";\n\nexport type AthenaDbTransport = \"postgres\" | \"gateway\" | \"d1\";\nexport type AthenaAuthRuntime = \"embedded\" | \"remote\" | \"disabled\";\nexport type AthenaStorageTransport = \"http\" | \"r2\" | \"local\" | \"s3\" | \"none\";\nexport type AthenaChatTransport = \"local\" | \"remote\" | \"none\";\n\nexport interface ResolvedAthenaRuntime {\n  auth: { runtime: AthenaAuthRuntime };\n  chat: { transport: AthenaChatTransport };\n  db: { transport: AthenaDbTransport };\n  runtime: { environment: AthenaRuntimeEnvironment };\n  storage: { transport: AthenaStorageTransport };\n}\n\n/** Redacted public snapshot. Not a config surface. */\nexport interface AthenaRuntimeDiagnostics {\n  auth: AthenaAuthRuntime;\n  chat: AthenaChatTransport;\n  database: \"postgres-direct\" | \"gateway\" | \"d1\";\n  runtime: AthenaRuntimeEnvironment;\n  storage: AthenaStorageTransport;\n}\n\nexport function toAthenaRuntimeDiagnostics(\n  plan: ResolvedAthenaRuntime\n): AthenaRuntimeDiagnostics {\n  return {\n    auth: plan.auth.runtime,\n    chat: plan.chat.transport,\n    database:\n      plan.db.transport === \"postgres\" ? \"postgres-direct\" : plan.db.transport,\n    runtime: plan.runtime.environment,\n    storage: plan.storage.transport,\n  };\n}\n\nexport interface ResolveAthenaRuntimeOptions {\n  environment?: AthenaRuntimeEnvironment;\n  trustedNode?: boolean;\n}\n\nfunction hasBinding(value: unknown): boolean {\n  return value !== undefined && value !== null;\n}\n\n/** Same URI inputs as folding: nested pgUri, then databaseUrl, then DATABASE_URL. */\nexport function resolveDatabaseUri(\n  config: ResolveConfigInput\n): string | undefined {\n  return (\n    normalizeOptional(config.db?.pgUri) ??\n    normalizeOptional(config.databaseUrl) ??\n    normalizeOptional(config.env?.DATABASE_URL)\n  );\n}\n\nfunction isExplicitGatewayMode(\n  mode: unknown,\n  env?: Record<string, string | undefined>\n): boolean {\n  const raw =\n    (typeof mode === \"string\" ? mode : undefined) ?? env?.ATHENA_EXECUTION_MODE;\n  const key = raw?.trim().toLowerCase();\n  return (\n    key === \"gateway\" || key === \"http\" || key === \"remote\" || key === \"server\"\n  );\n}\n\nexport function detectAthenaRuntimeEnvironment(): AthenaRuntimeEnvironment {\n  const nav = (\n    globalThis as { navigator?: { product?: string; userAgent?: string } }\n  ).navigator;\n  if (nav?.product === \"ReactNative\") {\n    return \"react-native\";\n  }\n  if (\n    typeof nav?.userAgent === \"string\" &&\n    /Cloudflare-Workers/i.test(nav.userAgent)\n  ) {\n    return \"cloudflare\";\n  }\n  if (typeof (globalThis as { window?: unknown }).window !== \"undefined\") {\n    return \"browser\";\n  }\n  return \"node\";\n}\n\n/**\n * Trusted Node/server only: omitted auth.mode + database URI (`db.pgUri`,\n * `databaseUrl`, or `env.DATABASE_URL`) + no auth.url means embedded Auth.\n * Explicit mode and auth.url always win. `auth: false` stays disabled.\n */\nexport function inferEmbeddedAuthMode<T extends ResolveConfigInput>(\n  config: T\n): T {\n  if (config.auth === false) {\n    return { ...config, auth: false };\n  }\n  const authObject = athenaAuthConfig(\n    config.auth as false | Record<string, unknown> | null | undefined\n  );\n  const explicit = authObject?.mode;\n  if (explicit === \"local\" || explicit === \"remote\") {\n    return config;\n  }\n  if (normalizeOptional(authObject?.url as string | null | undefined)) {\n    return config;\n  }\n  if (!resolveDatabaseUri(config)) {\n    return config;\n  }\n  return {\n    ...config,\n    auth: {\n      ...authObject,\n      mode: \"local\",\n    },\n  };\n}\n\nexport function resolveAthenaRuntime(\n  config: ResolveConfigInput,\n  options: ResolveAthenaRuntimeOptions = {}\n): ResolvedAthenaRuntime {\n  const environment = options.environment ?? detectAthenaRuntimeEnvironment();\n  const trustedNode = options.trustedNode ?? environment === \"node\";\n  const pgUri = resolveDatabaseUri(config);\n  const chatMode = resolveChatMode({\n    chat: config.chat,\n    clusterUrl: config.url,\n    databaseUrl: pgUri,\n  });\n  const hasD1 = hasBinding(config.db?.d1);\n  const hasR2 = hasBinding(config.storage?.r2);\n  const hasStorageUrl = Boolean(normalizeOptional(config.storage?.url));\n  const gatewayForced = isExplicitGatewayMode(config.mode, config.env);\n\n  let dbTransport: AthenaDbTransport = \"gateway\";\n  if (hasD1 && !gatewayForced) {\n    dbTransport = \"d1\";\n  } else if (pgUri && trustedNode && !gatewayForced) {\n    dbTransport = \"postgres\";\n  }\n\n  let authRuntime: AthenaAuthRuntime = \"remote\";\n  if (config.auth === false) {\n    authRuntime = \"disabled\";\n  } else {\n    const authObject = athenaAuthConfig(\n      config.auth as false | Record<string, unknown> | null | undefined\n    );\n    const explicit = authObject?.mode;\n    const authUrl =\n      typeof authObject?.url === \"string\" ? authObject.url : undefined;\n    if (explicit === \"local\") {\n      if (!trustedNode) {\n        throw new AthenaConfigurationError(\n          \"ATHENA_AUTH_LOCAL_NODE_REQUIRED\",\n          'auth.mode \"local\" requires a Node.js server runtime. Import createClient from @xylex-group/athena in a server module, or use auth.mode \"remote\".',\n          \"auth\"\n        );\n      }\n      authRuntime = \"embedded\";\n    } else if (explicit === \"remote\" || normalizeOptional(authUrl)) {\n      authRuntime = \"remote\";\n    } else if (pgUri && trustedNode) {\n      authRuntime = \"embedded\";\n    }\n  }\n\n  const wantsLocalStorage = config.storage?.provider === \"local\";\n  if (wantsLocalStorage && !trustedNode) {\n    throw new AthenaConfigurationError(\n      \"ATHENA_STORAGE_LOCAL_NODE_REQUIRED\",\n      'storage.provider \"local\" requires a Node.js server runtime. Import createClient from @xylex-group/athena in a server module.',\n      \"storage\"\n    );\n  }\n  const wantsS3Storage = config.storage?.provider === \"s3\";\n  if (wantsS3Storage && !trustedNode) {\n    throw new AthenaConfigurationError(\n      \"ATHENA_STORAGE_S3_NODE_REQUIRED\",\n      'storage.provider \"s3\" requires a Node.js server runtime. Import createClient from @xylex-group/athena in a server module.',\n      \"storage\"\n    );\n  }\n\n  let storageTransport: AthenaStorageTransport = \"none\";\n  if (wantsLocalStorage) {\n    storageTransport = \"local\";\n  } else if (hasR2) {\n    storageTransport = \"r2\";\n  } else if (wantsS3Storage) {\n    storageTransport = \"s3\";\n  } else if (hasStorageUrl) {\n    storageTransport = \"http\";\n  }\n\n  return {\n    auth: { runtime: authRuntime },\n    chat: {\n      transport: chatMode === \"disabled\" ? \"none\" : chatMode,\n    },\n    db: { transport: dbTransport },\n    runtime: { environment },\n    storage: { transport: storageTransport },\n  };\n}\n","export const ATHENA_EMAIL_PROVIDER_NOT_CONFIGURED =\n  \"ATHENA_EMAIL_PROVIDER_NOT_CONFIGURED\" as const;\nexport const ATHENA_EMAIL_MESSAGE_INVALID =\n  \"ATHENA_EMAIL_MESSAGE_INVALID\" as const;\nexport const ATHENA_EMAIL_DELIVERY_FAILED =\n  \"ATHENA_EMAIL_DELIVERY_FAILED\" as const;\nexport const ATHENA_EMAIL_PROVIDER_UNSUPPORTED_RUNTIME =\n  \"ATHENA_EMAIL_PROVIDER_UNSUPPORTED_RUNTIME\" as const;\nexport const ATHENA_EMAIL_PROVIDER_INVALID =\n  \"ATHENA_EMAIL_PROVIDER_INVALID\" as const;\n\nexport type AthenaEmailErrorCode =\n  | typeof ATHENA_EMAIL_PROVIDER_NOT_CONFIGURED\n  | typeof ATHENA_EMAIL_MESSAGE_INVALID\n  | typeof ATHENA_EMAIL_DELIVERY_FAILED\n  | typeof ATHENA_EMAIL_PROVIDER_UNSUPPORTED_RUNTIME\n  | typeof ATHENA_EMAIL_PROVIDER_INVALID;\n\nexport class AthenaEmailError extends Error {\n  readonly code: AthenaEmailErrorCode;\n\n  constructor(\n    code: AthenaEmailErrorCode,\n    message: string,\n    options?: { cause?: unknown }\n  ) {\n    super(message, options);\n    this.name = \"AthenaEmailError\";\n    this.code = code;\n  }\n}\n\nexport function isAthenaEmailError(value: unknown): value is AthenaEmailError {\n  return value instanceof AthenaEmailError;\n}\n","import { detectAthenaRuntimeEnvironment } from \"../runtime/resolve.ts\";\nimport {\n  ATHENA_EMAIL_PROVIDER_UNSUPPORTED_RUNTIME,\n  AthenaEmailError,\n} from \"./errors.ts\";\nimport type {\n  AthenaEmailProvider,\n  AthenaEmailProviderRuntime,\n} from \"./types.ts\";\n\nexport function resolveAthenaEmailRuntime(\n  environment = detectAthenaRuntimeEnvironment()\n): AthenaEmailProviderRuntime {\n  if (environment === \"node\") {\n    return \"node\";\n  }\n  if (environment === \"cloudflare\") {\n    return \"edge\";\n  }\n  return \"browser\";\n}\n\nexport function assertAthenaEmailProviderRuntime(\n  provider: AthenaEmailProvider,\n  environment = detectAthenaRuntimeEnvironment()\n): void {\n  const allowed = provider.capabilities?.runtimes;\n  if (!allowed || allowed.length === 0) {\n    return;\n  }\n  const runtime = resolveAthenaEmailRuntime(environment);\n  if (allowed.includes(runtime)) {\n    return;\n  }\n  throw new AthenaEmailError(\n    ATHENA_EMAIL_PROVIDER_UNSUPPORTED_RUNTIME,\n    `Athena email provider \"${provider.id}\" cannot run in the ${runtime} runtime (requires ${allowed.join(\", \")}).`\n  );\n}\n","import type { AthenaEmailProvider } from \"./types.ts\";\n\n/**\n * Type guard for root email adapters. SMTP and other transports implement\n * {@link AthenaEmailProvider} and enter the client only through `createClient({ email })`.\n */\nexport function isAthenaEmailProvider(\n  value: unknown\n): value is AthenaEmailProvider {\n  if (!value || typeof value !== \"object\") {\n    return false;\n  }\n  const candidate = value as Partial<AthenaEmailProvider>;\n  return (\n    typeof candidate.send === \"function\" &&\n    typeof candidate.id === \"string\" &&\n    candidate.id.trim().length > 0\n  );\n}\n\n/**\n * Extension seam for provider adapters. Returns a public-neutral provider:\n * `id` is trimmed and `send` is the only callable surface.\n *\n * Node-only transports (SMTP) must live in a separate adapter module that is\n * never imported from the browser `createClient()` path.\n */\nexport function defineAthenaEmailProvider(\n  provider: AthenaEmailProvider\n): AthenaEmailProvider {\n  if (!isAthenaEmailProvider(provider)) {\n    throw new TypeError(\n      \"Athena email provider adapters must expose a non-empty id and send().\"\n    );\n  }\n  const id = provider.id.trim();\n  return {\n    ...(provider.capabilities ? { capabilities: provider.capabilities } : {}),\n    id,\n    send: (message) => provider.send(message),\n  };\n}\n","import { ATHENA_EMAIL_MESSAGE_INVALID, AthenaEmailError } from \"../errors.ts\";\nimport type {\n  AthenaEmailAttachment,\n  AthenaResolvedEmailMessage,\n} from \"../types.ts\";\n\nexport function requireSendableBody(message: AthenaResolvedEmailMessage): void {\n  if (!(message.text || message.html)) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"Athena email messages require text or html content.\"\n    );\n  }\n}\n\nexport function selectAttachments(\n  message: AthenaResolvedEmailMessage\n): AthenaEmailAttachment[] {\n  const selected: AthenaEmailAttachment[] = [];\n  for (const attachment of message.attachments) {\n    const hasContent =\n      attachment.content !== undefined &&\n      (typeof attachment.content !== \"string\" ||\n        attachment.content.length > 0) &&\n      !(\n        attachment.content instanceof Uint8Array &&\n        attachment.content.byteLength === 0\n      );\n    const hasUrl =\n      typeof attachment.fileUrl === \"string\" &&\n      attachment.fileUrl.trim().length > 0;\n    if (hasContent || hasUrl) {\n      selected.push(attachment);\n      continue;\n    }\n    if (message.attachmentFailureMode === \"skip\") {\n      continue;\n    }\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"Athena email attachments require content or fileUrl.\"\n    );\n  }\n  return selected;\n}\n","import { assertAthenaEmailProviderRuntime } from \"./capabilities.ts\";\nimport {\n  ATHENA_EMAIL_DELIVERY_FAILED,\n  ATHENA_EMAIL_MESSAGE_INVALID,\n  ATHENA_EMAIL_PROVIDER_NOT_CONFIGURED,\n  AthenaEmailError,\n} from \"./errors.ts\";\nimport type { NormalizedAthenaEmailConfig } from \"./normalize-config.ts\";\nimport type {\n  AthenaEmailAttachment,\n  AthenaEmailDeliveryResult,\n  AthenaEmailMessage,\n  AthenaResolvedEmailMessage,\n} from \"./types.ts\";\n\nfunction asAddressList(value: string | string[] | undefined): string[] {\n  if (value == null) {\n    return [];\n  }\n  const items = Array.isArray(value) ? value : [value];\n  return items\n    .map((entry) => (typeof entry === \"string\" ? entry.trim() : \"\"))\n    .filter((entry) => entry.length > 0);\n}\n\nfunction cloneAttachments(\n  attachments: AthenaEmailAttachment[] | undefined\n): AthenaEmailAttachment[] {\n  if (!attachments?.length) {\n    return [];\n  }\n  return attachments.map((attachment) => ({\n    ...(attachment.content === undefined\n      ? {}\n      : { content: attachment.content }),\n    ...(attachment.contentType ? { contentType: attachment.contentType } : {}),\n    ...(attachment.filename ? { filename: attachment.filename } : {}),\n    ...(attachment.fileUrl ? { fileUrl: attachment.fileUrl } : {}),\n  }));\n}\n\nfunction cloneHeaders(\n  headers: Record<string, string> | undefined\n): Record<string, string> {\n  if (!headers) {\n    return {};\n  }\n  const next: Record<string, string> = {};\n  for (const [key, value] of Object.entries(headers)) {\n    if (typeof value === \"string\") {\n      next[key] = value;\n    }\n  }\n  return next;\n}\n\nfunction cloneMetadata(\n  metadata: Record<string, unknown> | undefined\n): Record<string, unknown> {\n  if (!metadata) {\n    return {};\n  }\n  return { ...metadata };\n}\n\nexport function resolveAthenaEmailMessage(\n  message: AthenaEmailMessage,\n  normalized: NormalizedAthenaEmailConfig\n): AthenaResolvedEmailMessage {\n  const to = asAddressList(message.to);\n  const subject =\n    typeof message.subject === \"string\" ? message.subject.trim() : \"\";\n  const from =\n    (typeof message.from === \"string\" ? message.from.trim() : \"\") ||\n    normalized.defaults.from ||\n    \"\";\n  if (to.length === 0) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"Athena email messages require at least one recipient.\"\n    );\n  }\n  if (!subject) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"Athena email messages require a subject.\"\n    );\n  }\n  if (!from) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"Athena email messages require from, either on the message or email.defaults.from.\"\n    );\n  }\n\n  const fromName =\n    (typeof message.fromName === \"string\" ? message.fromName.trim() : \"\") ||\n    normalized.defaults.fromName;\n  const replyTo =\n    (typeof message.replyTo === \"string\" ? message.replyTo.trim() : \"\") ||\n    normalized.defaults.replyTo;\n  const locale =\n    (typeof message.locale === \"string\" ? message.locale.trim() : \"\") ||\n    normalized.defaults.locale;\n\n  return {\n    attachmentFailureMode:\n      message.attachmentFailureMode === \"skip\" ||\n      message.attachmentFailureMode === \"fail\"\n        ? message.attachmentFailureMode\n        : normalized.attachmentFailureMode,\n    attachments: cloneAttachments(message.attachments),\n    bcc: asAddressList(message.bcc),\n    cc: asAddressList(message.cc),\n    from,\n    ...(fromName ? { fromName } : {}),\n    headers: cloneHeaders(message.headers),\n    ...(typeof message.html === \"string\" ? { html: message.html } : {}),\n    ...(locale ? { locale } : {}),\n    metadata: cloneMetadata(message.metadata),\n    ...(replyTo ? { replyTo } : {}),\n    subject,\n    ...(typeof message.text === \"string\" ? { text: message.text } : {}),\n    to,\n  };\n}\n\nfunction asStringArray(value: unknown): string[] {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n  return value.filter((entry): entry is string => typeof entry === \"string\");\n}\n\n/**\n * Strip unknown provider fields so public APIs never expose native SDK types.\n */\nexport function envelopeAcceptedRecipients(\n  message: Pick<AthenaResolvedEmailMessage, \"to\" | \"cc\" | \"bcc\">\n): string[] {\n  return [...message.to, ...message.cc, ...message.bcc];\n}\n\nexport function toPublicEmailDeliveryResult(\n  value: unknown,\n  providerId: string\n): AthenaEmailDeliveryResult {\n  const raw =\n    value && typeof value === \"object\"\n      ? (value as Partial<AthenaEmailDeliveryResult>)\n      : {};\n  const accepted = asStringArray(raw.accepted);\n  const rejected = asStringArray(raw.rejected);\n  const messageId =\n    typeof raw.messageId === \"string\" && raw.messageId.trim()\n      ? raw.messageId.trim()\n      : undefined;\n  return {\n    accepted,\n    ...(messageId ? { messageId } : {}),\n    provider:\n      typeof raw.provider === \"string\" && raw.provider.trim()\n        ? raw.provider.trim()\n        : providerId,\n    rejected,\n    success: raw.success === true,\n  };\n}\n\nexport async function deliverAthenaEmail(\n  message: AthenaEmailMessage,\n  normalized: NormalizedAthenaEmailConfig\n): Promise<AthenaEmailDeliveryResult> {\n  const provider = normalized.provider;\n  if (!provider) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_PROVIDER_NOT_CONFIGURED,\n      \"Athena email has no provider configured. Pass createClient({ email: { provider } }).\"\n    );\n  }\n  const resolved = resolveAthenaEmailMessage(message, normalized);\n  assertAthenaEmailProviderRuntime(provider);\n  try {\n    const result = await provider.send(resolved);\n    return {\n      ...toPublicEmailDeliveryResult(result, provider.id),\n      from: resolved.from,\n      ...(resolved.fromName ? { fromName: resolved.fromName } : {}),\n    };\n  } catch (cause) {\n    if (cause instanceof AthenaEmailError) {\n      throw cause;\n    }\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_DELIVERY_FAILED,\n      \"Athena email delivery failed.\",\n      { cause }\n    );\n  }\n}\n","import {\n  ATHENA_EMAIL_MESSAGE_INVALID,\n  AthenaEmailError,\n} from \"../email/errors.ts\";\nimport { selectAttachments } from \"../email/providers/attachments.ts\";\nimport type { AthenaResolvedEmailMessage } from \"../email/types.ts\";\n\nconst HEADER_NAME = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\nfunction needsEncodedWord(value: string): boolean {\n  return /[^\\t\\x20-\\x7e]/.test(value);\n}\n\nconst ENCODED_WORD_PREFIX = \"=?UTF-8?B?\";\nconst ENCODED_WORD_SUFFIX = \"?=\";\nconst ENCODED_WORD_MAX_CHARS = 75;\nconst ENCODED_WORD_B64_BUDGET =\n  ENCODED_WORD_MAX_CHARS -\n  ENCODED_WORD_PREFIX.length -\n  ENCODED_WORD_SUFFIX.length;\nconst ENCODED_WORD_MAX_BYTES = Math.floor(ENCODED_WORD_B64_BUDGET / 4) * 3;\n\nfunction encodeMimeWord(value: string): string {\n  const bytes = Buffer.from(value, \"utf8\");\n  const words: string[] = [];\n  let offset = 0;\n  while (offset < bytes.length) {\n    let end = Math.min(offset + ENCODED_WORD_MAX_BYTES, bytes.length);\n    while (end > offset && end < bytes.length && (bytes[end] & 0xc0) === 0x80) {\n      end -= 1;\n    }\n    if (end === offset) {\n      end = Math.min(offset + 1, bytes.length);\n      while (end < bytes.length && (bytes[end] & 0xc0) === 0x80) {\n        end += 1;\n      }\n    }\n    const chunk = bytes.subarray(offset, end);\n    words.push(\n      `${ENCODED_WORD_PREFIX}${chunk.toString(\"base64\")}${ENCODED_WORD_SUFFIX}`\n    );\n    offset = end;\n  }\n  return words.join(\"\\r\\n \");\n}\n\nfunction encodeHeaderValue(value: string): string {\n  if (/[\\r\\n]/.test(value)) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"SMTP header must not contain CR or LF.\"\n    );\n  }\n  return needsEncodedWord(value) ? encodeMimeWord(value) : value;\n}\n\nconst RFC_PHRASE_SPECIALS = /[()<>[\\]:;@\\\\,\"]/;\n\nfunction encodeDisplayName(value: string): string {\n  if (needsEncodedWord(value)) {\n    return encodeMimeWord(value);\n  }\n  if (!RFC_PHRASE_SPECIALS.test(value)) {\n    return value;\n  }\n  const escaped = value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n  return `\"${escaped}\"`;\n}\n\nfunction formatSmtpFrom(from: string, fromName?: string): string {\n  if (!fromName) {\n    return from;\n  }\n  const safeName = fromName.replaceAll(/[\\r\\n<>]/g, \"\");\n  return `${encodeDisplayName(safeName)} <${from}>`;\n}\n\nfunction assertHeaderField(name: string, value: string): void {\n  if (!HEADER_NAME.test(name) || /[\\r\\n]/.test(name)) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      `Invalid SMTP header name \"${name}\".`\n    );\n  }\n  if (\n    /[\\r\\n]/.test(value) &&\n    !/^(?:[^\\r\\n]*(?:\\r\\n[ \\t][^\\r\\n]*)*)$/.test(value)\n  ) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      `SMTP header \"${name}\" must not contain CR or LF.`\n    );\n  }\n}\n\nfunction foldBase64(value: string): string {\n  const lines: string[] = [];\n  for (let index = 0; index < value.length; index += 76) {\n    lines.push(value.slice(index, index + 76));\n  }\n  return lines.join(\"\\r\\n\");\n}\n\nfunction encodeUtf8Base64(value: string): string {\n  return foldBase64(Buffer.from(value, \"utf8\").toString(\"base64\"));\n}\n\nfunction encodeBytesBase64(bytes: Uint8Array): string {\n  return foldBase64(Buffer.from(bytes).toString(\"base64\"));\n}\n\nfunction headerBlock(headers: Array<[string, string]>): string {\n  return headers\n    .map(([name, value]) => {\n      assertHeaderField(name, value);\n      return `${name}: ${value}`;\n    })\n    .join(\"\\r\\n\");\n}\n\nfunction textPart(contentType: string, body: string): string {\n  return `${headerBlock([\n    [\"Content-Type\", `${contentType}; charset=utf-8`],\n    [\"Content-Transfer-Encoding\", \"base64\"],\n  ])}\\r\\n\\r\\n${encodeUtf8Base64(body)}`;\n}\n\nfunction attachmentPart(\n  filename: string,\n  contentType: string,\n  content: Uint8Array\n): string {\n  const safeName = filename\n    .replaceAll(/[\\r\\n\"]/g, \"_\")\n    .replaceAll(\"\\\\\", \"\\\\\\\\\");\n  return `${headerBlock([\n    [\"Content-Type\", `${contentType}; name=\"${safeName}\"`],\n    [\"Content-Disposition\", `attachment; filename=\"${safeName}\"`],\n    [\"Content-Transfer-Encoding\", \"base64\"],\n  ])}\\r\\n\\r\\n${encodeBytesBase64(content)}`;\n}\n\nfunction wrapMultipart(kind: string, parts: string[]): string {\n  const boundary = `athena_${crypto.randomUUID().replaceAll(\"-\", \"\")}`;\n  const inner = parts.map((part) => `--${boundary}\\r\\n${part}`).join(\"\\r\\n\");\n  return `${headerBlock([\n    [\"Content-Type\", `multipart/${kind}; boundary=${boundary}`],\n  ])}\\r\\n\\r\\n${inner}\\r\\n--${boundary}--`;\n}\n\nfunction bodyParts(message: AthenaResolvedEmailMessage): string[] {\n  const parts: string[] = [];\n  if (message.text) {\n    parts.push(textPart(\"text/plain\", message.text));\n  }\n  if (message.html) {\n    parts.push(textPart(\"text/html\", message.html));\n  }\n  return parts;\n}\n\nfunction attachmentBytes(content: string | Uint8Array): Uint8Array {\n  return typeof content === \"string\" ? Buffer.from(content, \"utf8\") : content;\n}\n\nexport function buildSmtpMime(message: AthenaResolvedEmailMessage): string {\n  const attachments = selectAttachments(message).flatMap((attachment) => {\n    if (attachment.content === undefined) {\n      return [];\n    }\n    return [\n      attachmentPart(\n        attachment.filename ?? \"attachment\",\n        attachment.contentType ?? \"application/octet-stream\",\n        attachmentBytes(attachment.content)\n      ),\n    ];\n  });\n\n  const bodies = bodyParts(message);\n  const alternative =\n    bodies.length === 1 ? bodies[0] : wrapMultipart(\"alternative\", bodies);\n  const payload =\n    attachments.length === 0\n      ? alternative\n      : wrapMultipart(\"mixed\", [alternative, ...attachments]);\n\n  const headers: Array<[string, string]> = [\n    [\"From\", formatSmtpFrom(message.from, message.fromName)],\n    [\"To\", message.to.join(\", \")],\n    [\"Subject\", encodeHeaderValue(message.subject)],\n    [\"MIME-Version\", \"1.0\"],\n  ];\n  if (message.cc.length > 0) {\n    headers.push([\"Cc\", message.cc.join(\", \")]);\n  }\n  if (message.replyTo) {\n    headers.push([\"Reply-To\", message.replyTo]);\n  }\n  for (const [name, value] of Object.entries(message.headers)) {\n    headers.push([name, value]);\n  }\n\n  return `${headerBlock(headers)}\\r\\n${payload}\\r\\n`;\n}\n\nexport function smtpDotStuff(payload: string): string {\n  return payload.replaceAll(\"\\r\\n.\", \"\\r\\n..\").replace(/^\\./, \"..\");\n}\n","import { connect as netConnect, type Socket } from \"node:net\";\nimport { type TLSSocket, connect as tlsConnect } from \"node:tls\";\n\nexport interface AthenaSmtpReply {\n  code: number;\n  lines: string[];\n}\n\nexport interface AthenaSmtpConnection {\n  close(): Promise<void>;\n  readReply(): Promise<AthenaSmtpReply>;\n  startTls(): Promise<void>;\n  writeData(data: string): Promise<void>;\n  writeLine(line: string): Promise<void>;\n}\n\nexport interface AthenaSmtpConnectInput {\n  host: string;\n  implicitTls: boolean;\n  port: number;\n  timeoutMs?: number;\n}\n\nexport type AthenaSmtpTransport = (\n  input: AthenaSmtpConnectInput\n) => Promise<AthenaSmtpConnection>;\n\n/** Idle/connect/read/write deadline for Node SMTP sockets. */\nexport const SMTP_IO_TIMEOUT_MS = 30_000;\n\nfunction smtpTimeoutError(action: string): Error {\n  return new Error(`SMTP ${action} timed out`);\n}\n\nfunction connectSocket(\n  input: AthenaSmtpConnectInput,\n  timeoutMs: number\n): Promise<Socket | TLSSocket> {\n  return new Promise((resolve, reject) => {\n    const connected = input.implicitTls\n      ? tlsConnect({ host: input.host, port: input.port })\n      : netConnect({ host: input.host, port: input.port });\n    const timer = setTimeout(() => {\n      connected.destroy();\n      reject(smtpTimeoutError(\"connect\"));\n    }, timeoutMs);\n    const succeed = () => {\n      clearTimeout(timer);\n      resolve(connected);\n    };\n    if (input.implicitTls) {\n      connected.once(\"secureConnect\", succeed);\n    } else {\n      connected.once(\"connect\", succeed);\n    }\n    connected.once(\"error\", (error) => {\n      clearTimeout(timer);\n      reject(error);\n    });\n  });\n}\n\nclass NodeSmtpConnection implements AthenaSmtpConnection {\n  private buffer = \"\";\n  private socket: Socket | TLSSocket;\n  private waiters: Array<(chunk: string) => void> = [];\n\n  constructor(\n    private readonly host: string,\n    socket: Socket | TLSSocket,\n    private readonly timeoutMs: number\n  ) {\n    this.socket = socket;\n    this.bindSocket(socket);\n  }\n\n  async readReply(): Promise<AthenaSmtpReply> {\n    const lines: string[] = [];\n    for (;;) {\n      const line = await this.readLine();\n      const code = Number(line.slice(0, 3));\n      const text = line.slice(4);\n      lines.push(text);\n      if (line.charAt(3) === \" \") {\n        return { code, lines };\n      }\n    }\n  }\n\n  async writeLine(line: string): Promise<void> {\n    await this.writeData(`${line}\\r\\n`);\n  }\n\n  writeData(data: string): Promise<void> {\n    return this.withTimeout(\n      \"write\",\n      new Promise((resolve, reject) => {\n        this.socket.write(data, (error) => {\n          if (error) {\n            reject(error);\n            return;\n          }\n          resolve();\n        });\n      })\n    );\n  }\n\n  async startTls(): Promise<void> {\n    const upgraded = await this.withTimeout(\n      \"STARTTLS\",\n      new Promise<TLSSocket>((resolve, reject) => {\n        const next = tlsConnect(\n          {\n            host: this.host,\n            socket: this.socket,\n          },\n          () => resolve(next)\n        );\n        next.once(\"error\", reject);\n      })\n    );\n    this.socket.removeAllListeners(\"data\");\n    this.socket.removeAllListeners(\"timeout\");\n    this.socket = upgraded;\n    this.bindSocket(upgraded);\n  }\n\n  close(): Promise<void> {\n    if (this.isSocketClosed()) {\n      return Promise.resolve();\n    }\n    return this.withTimeout(\n      \"close\",\n      new Promise<void>((resolve) => {\n        if (this.isSocketClosed()) {\n          resolve();\n          return;\n        }\n        this.socket.once(\"close\", () => resolve());\n        this.socket.end();\n      })\n    ).catch(() => {\n      this.socket.destroy();\n    });\n  }\n\n  private isSocketClosed(): boolean {\n    return this.socket.destroyed || this.socket.closed;\n  }\n\n  private bindSocket(socket: Socket | TLSSocket): void {\n    socket.setEncoding(\"utf8\");\n    socket.setTimeout(this.timeoutMs);\n    socket.on(\"data\", (chunk: string) => {\n      const waiter = this.waiters.shift();\n      if (waiter) {\n        waiter(chunk);\n      } else {\n        this.buffer += chunk;\n      }\n    });\n    socket.on(\"timeout\", () => {\n      socket.destroy(smtpTimeoutError(\"socket\"));\n    });\n  }\n\n  private withTimeout<T>(action: string, promise: Promise<T>): Promise<T> {\n    return new Promise((resolve, reject) => {\n      const timer = setTimeout(() => {\n        this.socket.destroy();\n        reject(smtpTimeoutError(action));\n      }, this.timeoutMs);\n      promise.then(\n        (value) => {\n          clearTimeout(timer);\n          resolve(value);\n        },\n        (error: unknown) => {\n          clearTimeout(timer);\n          reject(error);\n        }\n      );\n    });\n  }\n\n  private async readLine(): Promise<string> {\n    for (;;) {\n      const index = this.buffer.indexOf(\"\\n\");\n      if (index >= 0) {\n        const line = this.buffer.slice(0, index).replace(/\\r$/, \"\");\n        this.buffer = this.buffer.slice(index + 1);\n        return line;\n      }\n      this.buffer += await this.readChunk();\n    }\n  }\n\n  private readChunk(): Promise<string> {\n    return this.withTimeout(\n      \"read\",\n      new Promise((resolve, reject) => {\n        this.waiters.push(resolve);\n        this.socket.once(\"error\", reject);\n        this.socket.once(\"end\", () =>\n          reject(new Error(\"SMTP connection closed\"))\n        );\n      })\n    );\n  }\n}\n\nexport function createNodeSmtpTransport(): AthenaSmtpTransport {\n  return async (input) => {\n    const timeoutMs = input.timeoutMs ?? SMTP_IO_TIMEOUT_MS;\n    const socket = await connectSocket(input, timeoutMs);\n    return new NodeSmtpConnection(input.host, socket, timeoutMs);\n  };\n}\n","import { lookup as dnsLookup } from \"node:dns/promises\";\nimport http, {\n  type IncomingMessage,\n  type OutgoingHttpHeaders,\n} from \"node:http\";\nimport https from \"node:https\";\nimport { Readable } from \"node:stream\";\nimport { isBlockedIpv4, parseIpv4 } from \"../email/blocked-ip.ts\";\nimport { assertAthenaEmailProviderRuntime } from \"../email/capabilities.ts\";\nimport {\n  ATHENA_EMAIL_DELIVERY_FAILED,\n  ATHENA_EMAIL_MESSAGE_INVALID,\n  ATHENA_EMAIL_PROVIDER_INVALID,\n  AthenaEmailError,\n} from \"../email/errors.ts\";\nimport { defineAthenaEmailProvider } from \"../email/provider.ts\";\nimport {\n  requireSendableBody,\n  selectAttachments,\n} from \"../email/providers/attachments.ts\";\nimport {\n  envelopeAcceptedRecipients,\n  toPublicEmailDeliveryResult,\n} from \"../email/runtime.ts\";\nimport type {\n  AthenaEmailAttachment,\n  AthenaEmailProvider,\n  AthenaResolvedEmailMessage,\n} from \"../email/types.ts\";\nimport { buildSmtpMime, smtpDotStuff } from \"./mime.ts\";\nimport {\n  type AthenaSmtpConnection,\n  type AthenaSmtpReply,\n  type AthenaSmtpTransport,\n  createNodeSmtpTransport,\n} from \"./transport.ts\";\n\nexport type AthenaSmtpSecure = \"starttls\" | \"tls\" | false;\n\nconst SMTP_ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024;\nconst SMTP_ATTACHMENT_FETCH_TIMEOUT_MS = 15_000;\n\nexport interface AthenaSmtpAuth {\n  pass: string;\n  user: string;\n}\n\nexport interface AthenaSmtpLookupAddress {\n  address: string;\n  family: 4 | 6;\n}\n\nexport interface AthenaSmtpConfig {\n  /** Test seam. Production callers omit this (15s). */\n  attachmentFetchTimeoutMs?: number;\n  auth: AthenaSmtpAuth;\n  /** Test seam for attachment SSRF checks. */\n  fetchImpl?: typeof fetch;\n  host: string;\n  lookupImpl?: (hostname: string) => Promise<AthenaSmtpLookupAddress[]>;\n  port?: number;\n  secure?: AthenaSmtpSecure;\n  /**\n   * Connect, read, and write deadline in milliseconds. Defaults to 30s.\n   */\n  timeoutMs?: number;\n  /**\n   * Test seam. Production callers omit this and use Node `net`/`tls`.\n   */\n  transport?: AthenaSmtpTransport;\n}\n\nconst DEFAULT_SMTP_TIMEOUT_MS = 30_000;\nconst nativeFetch = globalThis.fetch;\n\nfunction smtpTimeoutMs(value: number | undefined): number {\n  if (value === undefined) {\n    return DEFAULT_SMTP_TIMEOUT_MS;\n  }\n  if (!Number.isFinite(value) || value <= 0) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_PROVIDER_INVALID,\n      \"SMTP timeoutMs must be a positive number.\"\n    );\n  }\n  return value;\n}\n\nasync function withSmtpDeadline<T>(\n  promise: Promise<T>,\n  timeoutMs: number,\n  action: string,\n  onTimeout: () => void\n): Promise<T> {\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  try {\n    return await Promise.race([\n      promise,\n      new Promise<never>((_, reject) => {\n        timer = setTimeout(() => {\n          onTimeout();\n          reject(\n            new AthenaEmailError(\n              ATHENA_EMAIL_DELIVERY_FAILED,\n              `SMTP ${action} timed out after ${timeoutMs}ms.`\n            )\n          );\n        }, timeoutMs);\n      }),\n    ]);\n  } finally {\n    if (timer !== undefined) {\n      clearTimeout(timer);\n    }\n  }\n}\n\nasync function expectReply(\n  connection: AthenaSmtpConnection,\n  ok: (code: number) => boolean,\n  action: string,\n  timeoutMs: number\n): Promise<AthenaSmtpReply> {\n  const reply = await withSmtpDeadline(\n    connection.readReply(),\n    timeoutMs,\n    action,\n    () => {\n      void connection.close().catch(() => undefined);\n    }\n  );\n  if (!ok(reply.code)) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_DELIVERY_FAILED,\n      `SMTP ${action} failed (${reply.code} ${reply.lines.join(\" \")}).`\n    );\n  }\n  return reply;\n}\n\nasync function command(\n  connection: AthenaSmtpConnection,\n  line: string,\n  ok: (code: number) => boolean,\n  action: string,\n  timeoutMs: number\n): Promise<AthenaSmtpReply> {\n  await withSmtpDeadline(\n    connection.writeLine(line),\n    timeoutMs,\n    `${action} write`,\n    () => {\n      void connection.close().catch(() => undefined);\n    }\n  );\n  return expectReply(connection, ok, action, timeoutMs);\n}\n\nfunction ehloOk(code: number): boolean {\n  return code === 250;\n}\n\nfunction assertSmtpEnvelopeAddress(value: string, label: string): void {\n  if (typeof value !== \"string\" || value.length === 0 || /[\\r\\n]/.test(value)) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      `SMTP ${label} must not contain CR or LF.`\n    );\n  }\n}\n\nfunction parseHextetGroup(value: string): number[] | null {\n  if (value.length === 0) {\n    return [];\n  }\n  const groups = value.split(\":\");\n  const hextets: number[] = [];\n  for (const group of groups) {\n    if (!/^[0-9a-f]{1,4}$/i.test(group)) {\n      return null;\n    }\n    hextets.push(Number.parseInt(group, 16));\n  }\n  return hextets;\n}\n\nfunction parseIpv6(address: string): number[] | null {\n  const raw = address.trim().toLowerCase();\n  if (!raw.includes(\":\")) {\n    return null;\n  }\n  let core = raw;\n  let ipv4Tail: [number, number, number, number] | null = null;\n  const lastColon = raw.lastIndexOf(\":\");\n  const maybeIpv4 = parseIpv4(raw.slice(lastColon + 1));\n  if (maybeIpv4) {\n    ipv4Tail = maybeIpv4;\n    core = raw.slice(0, lastColon);\n  }\n  if (core.includes(\":::\")) {\n    return null;\n  }\n  const parts = core.split(\"::\");\n  if (parts.length > 2) {\n    return null;\n  }\n  const left = parseHextetGroup(parts[0] ?? \"\");\n  const right = parts.length === 2 ? parseHextetGroup(parts[1] ?? \"\") : [];\n  if (!(left && right)) {\n    return null;\n  }\n  if (parts.length === 1) {\n    const hextets = ipv4Tail\n      ? [\n          ...left,\n          (ipv4Tail[0] << 8) | ipv4Tail[1],\n          (ipv4Tail[2] << 8) | ipv4Tail[3],\n        ]\n      : left;\n    return hextets.length === 8 ? hextets : null;\n  }\n  const missing = 8 - left.length - right.length - (ipv4Tail ? 2 : 0);\n  if (missing < 0) {\n    return null;\n  }\n  const hextets = [\n    ...left,\n    ...Array.from({ length: missing }, () => 0),\n    ...right,\n  ];\n  if (ipv4Tail) {\n    hextets.push(\n      (ipv4Tail[0] << 8) | ipv4Tail[1],\n      (ipv4Tail[2] << 8) | ipv4Tail[3]\n    );\n  }\n  return hextets.length === 8 ? hextets : null;\n}\n\nfunction ipv4MappedFromIpv6(\n  hextets: number[]\n): [number, number, number, number] | null {\n  if (\n    hextets[0] !== 0 ||\n    hextets[1] !== 0 ||\n    hextets[2] !== 0 ||\n    hextets[3] !== 0 ||\n    hextets[4] !== 0 ||\n    hextets[5] !== 0xff_ff\n  ) {\n    return null;\n  }\n  const hi = hextets[6] ?? 0;\n  const lo = hextets[7] ?? 0;\n  return [(hi >> 8) & 255, hi & 255, (lo >> 8) & 255, lo & 255];\n}\n\nfunction isBlockedIpv6(hextets: number[]): boolean {\n  const mapped = ipv4MappedFromIpv6(hextets);\n  if (mapped) {\n    return isBlockedIpv4(mapped);\n  }\n  const first = hextets[0] ?? 0;\n  const second = hextets[1] ?? 0;\n  const third = hextets[2] ?? 0;\n  // Global unicast is 2000::/3 (RFC 4291). Other prefixes are non-global\n  // (unspecified, loopback, link-local, ULA, site-local, multicast, …).\n  if ((first & 0xe0_00) !== 0x20_00) {\n    return true;\n  }\n  // IANA IPv6 Special-Purpose Address Registry allocations that sit inside\n  // 2000::/3. Treating the whole /3 as publicly routable misses prefixes\n  // such as 2001:2::/48 (benchmarking) that operators may still route.\n  // 2001::/23 IETF Protocol Assignments (TEREDO, benchmarking, ORCHID, AMT, …).\n  if (first === 0x20_01 && (second & 0xfe_00) === 0) {\n    return true;\n  }\n  // 2001:db8::/32 documentation.\n  if (first === 0x20_01 && second === 0x0d_b8) {\n    return true;\n  }\n  // 2002::/16 6to4.\n  if (first === 0x20_02) {\n    return true;\n  }\n  // 3fff::/20 documentation (RFC 9637).\n  if ((first & 0xff_f0) === 0x3f_f0) {\n    return true;\n  }\n  // 2620:4f:8000::/48 Direct Delegation AS112 Service.\n  if (first === 0x26_20 && second === 0x00_4f && third === 0x80_00) {\n    return true;\n  }\n  return false;\n}\n\nfunction isBlockedIpAddress(address: string): boolean {\n  const ipv4 = parseIpv4(address);\n  if (ipv4) {\n    return isBlockedIpv4(ipv4);\n  }\n  const hextets = parseIpv6(address);\n  if (!hextets) {\n    return address.includes(\":\");\n  }\n  return isBlockedIpv6(hextets);\n}\n\nfunction assertPublicHttpUrl(fileUrl: string): URL {\n  let parsed: URL;\n  try {\n    parsed = new URL(fileUrl);\n  } catch {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"SMTP attachment URL is invalid.\"\n    );\n  }\n  if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"SMTP attachment URL must use http or https.\"\n    );\n  }\n  const hostname = parsed.hostname.replace(/^\\[|\\]$/g, \"\").toLowerCase();\n  if (\n    hostname === \"localhost\" ||\n    hostname.endsWith(\".localhost\") ||\n    hostname.endsWith(\".local\")\n  ) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"SMTP attachment URL must not target a private host.\"\n    );\n  }\n  if (\n    (parseIpv4(hostname) || hostname.includes(\":\")) &&\n    isBlockedIpAddress(hostname)\n  ) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"SMTP attachment URL must not target a private address.\"\n    );\n  }\n  return parsed;\n}\n\nfunction pinnedDispatcher(record: AthenaSmtpLookupAddress): {\n  pin: AthenaSmtpLookupAddress;\n} {\n  return { pin: record };\n}\n\nfunction pinnedAddressFromInit(\n  init: RequestInit | undefined\n): AthenaSmtpLookupAddress | null {\n  if (!init || typeof init !== \"object\") {\n    return null;\n  }\n  const dispatcher = (\n    init as { dispatcher?: { pin?: AthenaSmtpLookupAddress } }\n  ).dispatcher;\n  const pin = dispatcher?.pin;\n  if (\n    !pin ||\n    typeof pin.address !== \"string\" ||\n    (pin.family !== 4 && pin.family !== 6)\n  ) {\n    return null;\n  }\n  return pin;\n}\n\nfunction fetchPinnedHttpUrl(\n  parsed: URL,\n  record: AthenaSmtpLookupAddress,\n  init: RequestInit | undefined,\n  timeoutMs: number\n): Promise<Response> {\n  return new Promise((resolve, reject) => {\n    const isHttps = parsed.protocol === \"https:\";\n    const lib = isHttps ? https : http;\n    const serverName = parsed.hostname.replace(/^\\[|\\]$/g, \"\");\n    const headers = new Headers(init?.headers);\n    if (!headers.has(\"host\")) {\n      headers.set(\"Host\", parsed.host);\n    }\n    const headerObject: OutgoingHttpHeaders = {};\n    headers.forEach((value, key) => {\n      headerObject[key] = value;\n    });\n    const port =\n      parsed.port === \"\" ? (isHttps ? 443 : 80) : Number(parsed.port);\n    const req = lib.request(\n      {\n        family: record.family,\n        headers: headerObject,\n        hostname: record.address,\n        method: typeof init?.method === \"string\" ? init.method : \"GET\",\n        path: `${parsed.pathname}${parsed.search}`,\n        port,\n        servername: isHttps ? serverName : undefined,\n        setHost: false,\n        timeout: timeoutMs,\n      },\n      (res: IncomingMessage) => {\n        const responseHeaders = new Headers();\n        for (const [key, value] of Object.entries(res.headers)) {\n          if (typeof value === \"string\") {\n            responseHeaders.append(key, value);\n          } else if (Array.isArray(value)) {\n            for (const item of value) {\n              responseHeaders.append(key, item);\n            }\n          }\n        }\n        resolve(\n          new Response(Readable.toWeb(res) as ReadableStream<Uint8Array>, {\n            headers: responseHeaders,\n            status: res.statusCode ?? 0,\n            statusText: res.statusMessage,\n          })\n        );\n      }\n    );\n    const abort = () => {\n      req.destroy();\n      reject(\n        new AthenaEmailError(\n          ATHENA_EMAIL_DELIVERY_FAILED,\n          \"SMTP attachment fetch timed out.\"\n        )\n      );\n    };\n    const signal = init?.signal;\n    if (signal) {\n      if (signal.aborted) {\n        abort();\n        return;\n      }\n      signal.addEventListener(\"abort\", abort, { once: true });\n    }\n    req.on(\"timeout\", abort);\n    req.on(\"error\", reject);\n    req.end();\n  });\n}\n\nasync function defaultPinnedFetch(\n  input: RequestInfo | URL,\n  init: RequestInit | undefined,\n  timeoutMs: number\n): Promise<Response> {\n  const pin = pinnedAddressFromInit(init);\n  if (pin && globalThis.fetch === nativeFetch) {\n    return fetchPinnedHttpUrl(new URL(String(input)), pin, init, timeoutMs);\n  }\n  return globalThis.fetch(input, init);\n}\n\nasync function resolvePublicDestination(\n  parsed: URL,\n  lookupImpl: (hostname: string) => Promise<AthenaSmtpLookupAddress[]>,\n  timeoutMs = SMTP_ATTACHMENT_FETCH_TIMEOUT_MS\n): Promise<AthenaSmtpLookupAddress | null> {\n  const hostname = parsed.hostname.replace(/^\\[|\\]$/g, \"\");\n  if (parseIpv4(hostname) || hostname.includes(\":\")) {\n    if (isBlockedIpAddress(hostname)) {\n      throw new AthenaEmailError(\n        ATHENA_EMAIL_MESSAGE_INVALID,\n        \"SMTP attachment URL must not target a private address.\"\n      );\n    }\n    return null;\n  }\n  const records = await withSmtpDeadline(\n    lookupImpl(hostname),\n    timeoutMs,\n    \"attachment DNS\",\n    () => undefined\n  );\n  if (\n    records.length === 0 ||\n    records.some((record) => isBlockedIpAddress(record.address))\n  ) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_MESSAGE_INVALID,\n      \"SMTP attachment URL resolved to a private address.\"\n    );\n  }\n  return records.find((record) => record.family === 4) ?? records[0] ?? null;\n}\n\nasync function fetchPublicHttpUrl(\n  fileUrl: string,\n  fetchImpl: typeof fetch,\n  lookupImpl: (hostname: string) => Promise<AthenaSmtpLookupAddress[]>,\n  timeoutMs: number,\n  hops = 0\n): Promise<Response> {\n  if (hops > 5) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_DELIVERY_FAILED,\n      \"SMTP attachment URL exceeded redirect limit.\"\n    );\n  }\n  const parsed = assertPublicHttpUrl(fileUrl);\n  const verified = await resolvePublicDestination(\n    parsed,\n    lookupImpl,\n    timeoutMs\n  );\n  const headers = new Headers();\n  const signal =\n    typeof AbortSignal !== \"undefined\" &&\n    typeof AbortSignal.timeout === \"function\"\n      ? AbortSignal.timeout(timeoutMs)\n      : undefined;\n  const init: RequestInit & { dispatcher?: { pin: AthenaSmtpLookupAddress } } =\n    {\n      headers,\n      redirect: \"manual\",\n      ...(signal ? { signal } : {}),\n    };\n  if (verified) {\n    init.dispatcher = pinnedDispatcher(verified);\n  }\n  const response = await fetchImpl(parsed.toString(), init);\n  if (response.status >= 300 && response.status < 400) {\n    const location = response.headers.get(\"location\");\n    if (!location) {\n      throw new Error(`HTTP ${response.status} missing Location`);\n    }\n    const next = new URL(location, parsed).toString();\n    return fetchPublicHttpUrl(next, fetchImpl, lookupImpl, timeoutMs, hops + 1);\n  }\n  if (!response.ok) {\n    throw new Error(`HTTP ${response.status}`);\n  }\n  return response;\n}\n\nasync function readLimitedAttachmentBody(\n  response: Response\n): Promise<Uint8Array> {\n  const lengthHeader = response.headers.get(\"content-length\");\n  if (lengthHeader) {\n    const declared = Number(lengthHeader);\n    if (Number.isFinite(declared) && declared > SMTP_ATTACHMENT_MAX_BYTES) {\n      throw new AthenaEmailError(\n        ATHENA_EMAIL_DELIVERY_FAILED,\n        \"SMTP attachment exceeds size limit.\"\n      );\n    }\n  }\n  const body = response.body;\n  if (!body || typeof body.getReader !== \"function\") {\n    const buffer = new Uint8Array(await response.arrayBuffer());\n    if (buffer.byteLength > SMTP_ATTACHMENT_MAX_BYTES) {\n      throw new AthenaEmailError(\n        ATHENA_EMAIL_DELIVERY_FAILED,\n        \"SMTP attachment exceeds size limit.\"\n      );\n    }\n    return buffer;\n  }\n  const reader = body.getReader();\n  const chunks: Uint8Array[] = [];\n  let total = 0;\n  for (;;) {\n    const { done, value } = await reader.read();\n    if (done) {\n      break;\n    }\n    if (!value) {\n      continue;\n    }\n    total += value.byteLength;\n    if (total > SMTP_ATTACHMENT_MAX_BYTES) {\n      await reader.cancel().catch(() => undefined);\n      throw new AthenaEmailError(\n        ATHENA_EMAIL_DELIVERY_FAILED,\n        \"SMTP attachment exceeds size limit.\"\n      );\n    }\n    chunks.push(value);\n  }\n  const out = new Uint8Array(total);\n  let offset = 0;\n  for (const chunk of chunks) {\n    out.set(chunk, offset);\n    offset += chunk.byteLength;\n  }\n  return out;\n}\n\nasync function resolveSmtpAttachments(\n  message: AthenaResolvedEmailMessage,\n  fetchImpl: typeof fetch,\n  lookupImpl: (hostname: string) => Promise<AthenaSmtpLookupAddress[]>,\n  timeoutMs: number\n): Promise<AthenaEmailAttachment[]> {\n  const resolved: AthenaEmailAttachment[] = [];\n  for (const attachment of selectAttachments(message)) {\n    if (attachment.content !== undefined) {\n      resolved.push(attachment);\n      continue;\n    }\n    const fileUrl = attachment.fileUrl?.trim();\n    if (!fileUrl) {\n      if (message.attachmentFailureMode === \"skip\") {\n        continue;\n      }\n      throw new AthenaEmailError(\n        ATHENA_EMAIL_DELIVERY_FAILED,\n        \"SMTP attachments require inline content; fileUrl is not fetched.\"\n      );\n    }\n    try {\n      const response = await fetchPublicHttpUrl(\n        fileUrl,\n        fetchImpl,\n        lookupImpl,\n        timeoutMs\n      );\n      resolved.push({\n        ...attachment,\n        content: await readLimitedAttachmentBody(response),\n      });\n    } catch (cause) {\n      if (message.attachmentFailureMode === \"skip\") {\n        continue;\n      }\n      if (cause instanceof AthenaEmailError) {\n        throw cause;\n      }\n      throw new AthenaEmailError(\n        ATHENA_EMAIL_DELIVERY_FAILED,\n        `SMTP could not fetch attachment ${fileUrl}.`,\n        { cause }\n      );\n    }\n  }\n  return resolved;\n}\n\nasync function authenticate(\n  connection: AthenaSmtpConnection,\n  auth: AthenaSmtpAuth,\n  capabilities: string,\n  timeoutMs: number\n): Promise<void> {\n  if (\n    /\\bAUTH\\b[^\\n]*\\bPLAIN\\b/i.test(capabilities) ||\n    !/\\bAUTH\\b/i.test(capabilities)\n  ) {\n    const token = Buffer.from(`\\0${auth.user}\\0${auth.pass}`, \"utf8\").toString(\n      \"base64\"\n    );\n    await command(\n      connection,\n      `AUTH PLAIN ${token}`,\n      (code) => code === 235,\n      \"AUTH PLAIN\",\n      timeoutMs\n    );\n    return;\n  }\n  await command(\n    connection,\n    \"AUTH LOGIN\",\n    (code) => code === 334,\n    \"AUTH LOGIN\",\n    timeoutMs\n  );\n  await command(\n    connection,\n    Buffer.from(auth.user, \"utf8\").toString(\"base64\"),\n    (code) => code === 334,\n    \"AUTH LOGIN user\",\n    timeoutMs\n  );\n  await command(\n    connection,\n    Buffer.from(auth.pass, \"utf8\").toString(\"base64\"),\n    (code) => code === 235,\n    \"AUTH LOGIN pass\",\n    timeoutMs\n  );\n}\n\n/**\n * Node-only SMTP adapter. STARTTLS on port 587 by default, matching\n * `SmtpEmailProvider` in Athena Auth (lettre). Sender identity belongs on\n * `createClient({ email: { defaults } })`, not here.\n */\nexport function smtp(config: AthenaSmtpConfig): AthenaEmailProvider {\n  const host = config.host?.trim();\n  if (!host) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_PROVIDER_INVALID,\n      \"SMTP provider requires host.\"\n    );\n  }\n  const user = config.auth?.user?.trim();\n  const pass = config.auth?.pass;\n  if (!user || typeof pass !== \"string\" || pass.length === 0) {\n    throw new AthenaEmailError(\n      ATHENA_EMAIL_PROVIDER_INVALID,\n      \"SMTP provider requires auth.user and auth.pass.\"\n    );\n  }\n  const secure: AthenaSmtpSecure = config.secure ?? \"starttls\";\n  const port = config.port ?? (secure === \"tls\" ? 465 : 587);\n  const timeoutMs = smtpTimeoutMs(config.timeoutMs);\n  const attachmentFetchTimeoutMs =\n    config.attachmentFetchTimeoutMs === undefined\n      ? SMTP_ATTACHMENT_FETCH_TIMEOUT_MS\n      : smtpTimeoutMs(config.attachmentFetchTimeoutMs);\n  const transport = config.transport ?? createNodeSmtpTransport();\n  const fetchImpl: typeof fetch =\n    config.fetchImpl ??\n    ((input, init) =>\n      defaultPinnedFetch(input, init, attachmentFetchTimeoutMs));\n  const lookupImpl =\n    config.lookupImpl ??\n    (async (hostname: string) => {\n      const records = await dnsLookup(hostname, { all: true });\n      return records.map((record) => ({\n        address: record.address,\n        family: record.family === 6 ? (6 as const) : (4 as const),\n      }));\n    });\n\n  const provider: AthenaEmailProvider = defineAthenaEmailProvider({\n    capabilities: {\n      delivery: \"smtp\",\n      runtimes: [\"node\"],\n    },\n    id: \"smtp\",\n    async send(message) {\n      assertAthenaEmailProviderRuntime(provider);\n      requireSendableBody(message);\n      assertSmtpEnvelopeAddress(message.from, \"MAIL FROM\");\n      for (const recipient of [...message.to, ...message.cc, ...message.bcc]) {\n        assertSmtpEnvelopeAddress(recipient, \"RCPT TO\");\n      }\n      const attachments = await resolveSmtpAttachments(\n        message,\n        fetchImpl,\n        lookupImpl,\n        attachmentFetchTimeoutMs\n      );\n\n      const connection = await withSmtpDeadline(\n        transport({\n          host,\n          implicitTls: secure === \"tls\",\n          port,\n          timeoutMs,\n        }),\n        timeoutMs,\n        \"connect\",\n        () => undefined\n      );\n      try {\n        await expectReply(\n          connection,\n          (code) => code === 220,\n          \"connect\",\n          timeoutMs\n        );\n        let ehlo = await command(\n          connection,\n          `EHLO ${host}`,\n          ehloOk,\n          \"EHLO\",\n          timeoutMs\n        );\n        if (secure === \"starttls\") {\n          await command(\n            connection,\n            \"STARTTLS\",\n            (code) => code === 220,\n            \"STARTTLS\",\n            timeoutMs\n          );\n          await withSmtpDeadline(\n            connection.startTls(),\n            timeoutMs,\n            \"STARTTLS upgrade\",\n            () => {\n              void connection.close().catch(() => undefined);\n            }\n          );\n          ehlo = await command(\n            connection,\n            `EHLO ${host}`,\n            ehloOk,\n            \"EHLO\",\n            timeoutMs\n          );\n        }\n        await authenticate(\n          connection,\n          { pass, user },\n          ehlo.lines.join(\"\\n\"),\n          timeoutMs\n        );\n        await command(\n          connection,\n          `MAIL FROM:<${message.from}>`,\n          (code) => code === 250,\n          \"MAIL FROM\",\n          timeoutMs\n        );\n        for (const recipient of [\n          ...message.to,\n          ...message.cc,\n          ...message.bcc,\n        ]) {\n          await command(\n            connection,\n            `RCPT TO:<${recipient}>`,\n            (code) => code === 250 || code === 251,\n            \"RCPT TO\",\n            timeoutMs\n          );\n        }\n        await command(\n          connection,\n          \"DATA\",\n          (code) => code === 354,\n          \"DATA\",\n          timeoutMs\n        );\n        const mime = smtpDotStuff(buildSmtpMime({ ...message, attachments }));\n        await withSmtpDeadline(\n          connection.writeData(`${mime}\\r\\n.\\r\\n`),\n          timeoutMs,\n          \"DATA body write\",\n          () => {\n            void connection.close().catch(() => undefined);\n          }\n        );\n        const done = await expectReply(\n          connection,\n          (code) => code === 250,\n          \"DATA body\",\n          timeoutMs\n        );\n        await command(\n          connection,\n          \"QUIT\",\n          (code) => code === 221 || code === 250,\n          \"QUIT\",\n          timeoutMs\n        );\n        const messageId = done.lines.join(\" \").match(/<([^>]+)>/)?.[1];\n        return toPublicEmailDeliveryResult(\n          {\n            accepted: envelopeAcceptedRecipients(message),\n            messageId,\n            provider: \"smtp\",\n            rejected: [],\n            success: true,\n          },\n          \"smtp\"\n        );\n      } catch (cause) {\n        if (cause instanceof AthenaEmailError) {\n          throw cause;\n        }\n        throw new AthenaEmailError(\n          ATHENA_EMAIL_DELIVERY_FAILED,\n          \"SMTP email delivery failed.\",\n          { cause }\n        );\n      } finally {\n        await connection.close().catch(() => undefined);\n      }\n    },\n  });\n  return provider;\n}\n\nexport { createMemorySmtpTransport } from \"./memory-transport.ts\";\nexport { createNodeSmtpTransport } from \"./transport.ts\";\n"]}