{"version":3,"sources":["../src/aws-ses-sdk.ts"],"sourcesContent":["import { z } from 'zod';\nimport { createRestSDK } from '@microfox/rest-sdk';\nimport crypto from 'crypto';\nimport { createDefaultMicrofoxUsageTracker } from '@microfox/usage-tracker';\n\n// AWS SES API response schemas\nconst SendEmailResultSchema = z\n  .object({\n    MessageId: z.string().describe('The unique identifier for the sent email'),\n  })\n  .describe('The result of the successful SendEmail operation');\n\nconst ResponseMetadataSchema = z\n  .object({\n    RequestId: z.string().describe('The unique request identifier'),\n  })\n  .describe('Metadata about the AWS SES API request');\n\nconst SendEmailResponsePartSchema = z\n  .object({\n    SendEmailResult: SendEmailResultSchema,\n    ResponseMetadata: ResponseMetadataSchema,\n  })\n  .describe('The actual response body from the SendEmail API');\n\nconst SendEmailResponseSchema = z\n  .object({\n    SendEmailResponse: SendEmailResponsePartSchema,\n  })\n  .passthrough()\n  .describe('Response from AWS SES SendEmail API');\n\n// AWS SES configuration schema\nexport const SESConfigSchema = z\n  .object({\n    accessKeyId: z\n      .string()\n      .min(1)\n      .describe('AWS access key ID for authentication'),\n    secretAccessKey: z\n      .string()\n      .min(1)\n      .describe('AWS secret access key for authentication'),\n    region: z\n      .string()\n      .min(1)\n      .describe('AWS region where SES is configured (e.g., us-east-1)'),\n  })\n  .describe('AWS SES SDK configuration');\n\n// Email parameters schema\nconst EmailParamsSchema = z\n  .object({\n    sender: z\n      .string()\n      .email()\n      .describe('Email address of the sender (must be verified in AWS SES)'),\n    recipient: z.string().email().describe('Email address of the recipient'),\n    displayName: z\n      .string()\n      .optional()\n      .describe(\n        'Display name for the sender (e.g., \"John Doe\" <john@example.com>)',\n      ),\n    subject: z.string().min(1).describe('Subject line of the email'),\n    bodyText: z\n      .string()\n      .optional()\n      .describe(\n        'Plain text version of the email body (recommended for email clients that cannot display HTML)',\n      ),\n    bodyHtml: z\n      .string()\n      .optional()\n      .describe('HTML version of the email body (for rich text formatting)'),\n  })\n  .describe(\n    'Parameters for sending a single email. Only one of bodyText or bodyHtml can be provided',\n  );\n\n// Bulk email parameters schema\nconst BulkEmailParamsSchema = z\n  .object({\n    sender: z\n      .string()\n      .email()\n      .describe('Email address of the sender (must be verified in AWS SES)'),\n    recipients: z\n      .array(z.string().email())\n      .min(1)\n      .describe('List of recipient email addresses'),\n    displayName: z\n      .string()\n      .optional()\n      .describe(\n        'Display name for the sender (e.g., \"John Doe\" <john@example.com>)',\n      ),\n    subject: z.string().min(1).describe('Subject line of the email'),\n    bodyText: z\n      .string()\n      .optional()\n      .describe(\n        'Plain text version of the email body (recommended for email clients that cannot display HTML)',\n      ),\n    bodyHtml: z\n      .string()\n      .optional()\n      .describe('HTML version of the email body (for rich text formatting)'),\n  })\n  .refine(data => !(data.bodyText && data.bodyHtml), {\n    message: 'Cannot provide both bodyText and bodyHtml at the same time',\n    path: ['bodyContent'],\n  })\n  .refine(data => data.recipients.length > 0, {\n    message: 'Recipients array must contain at least one email address',\n    path: ['recipients'],\n  })\n  .describe(\n    'Parameters for sending bulk emails. Only one of bodyText or bodyHtml can be provided',\n  );\n\n// AWS SES request parameter schemas\nconst SignatureInputSchema = z\n  .object({\n    key: z.string().describe('AWS secret key for signature generation'),\n    dateStamp: z.string().describe('AWS formatted date stamp (YYYYMMDD)'),\n    regionName: z.string().describe('AWS region name'),\n    serviceName: z.string().describe('AWS service name (ses)'),\n  })\n  .describe('Input parameters for AWS signature generation');\n\nconst CanonicalRequestInputSchema = z\n  .object({\n    method: z.string().describe('HTTP method (POST for SES)'),\n    uri: z.string().describe('Request URI'),\n    queryString: z.string().describe('URL query string'),\n    headers: z.string().describe('Canonical headers string'),\n    signedHeaders: z.string().describe('List of signed header names'),\n    payloadHash: z.string().describe('SHA256 hash of the request payload'),\n  })\n  .describe('Input parameters for creating a canonical request');\n\nconst StringToSignInputSchema = z\n  .object({\n    algorithm: z\n      .string()\n      .describe('AWS signature algorithm (AWS4-HMAC-SHA256)'),\n    requestDate: z.string().describe('AWS formatted request date'),\n    credentialScope: z.string().describe('AWS credential scope'),\n    canonicalRequest: z.string().describe('Canonical request string'),\n  })\n  .describe('Input parameters for creating string to sign');\n\nconst FormattedDateSchema = z\n  .object({\n    amzDate: z.string().describe('AWS formatted date (YYYYMMDDTHHMMSSZ)'),\n    dateStamp: z.string().describe('AWS formatted date stamp (YYYYMMDD)'),\n  })\n  .describe('AWS formatted date components');\n\n// Type inference from schemas\nexport type SESConfig = z.infer<typeof SESConfigSchema>;\nexport type EmailParams = z.infer<typeof EmailParamsSchema>;\nexport type BulkEmailParams = z.infer<typeof BulkEmailParamsSchema>;\nexport type SendEmailResponse = z.infer<typeof SendEmailResponseSchema>;\nexport type SendEmailResult = z.infer<typeof SendEmailResultSchema>;\nexport type ResponseMetadata = z.infer<typeof ResponseMetadataSchema>;\n\n// Helper functions for AWS SES authentication\nconst getSignatureKey = (\n  params: z.infer<typeof SignatureInputSchema>,\n): Buffer => {\n  const { key, dateStamp, regionName, serviceName } =\n    SignatureInputSchema.parse(params);\n  const kDate = crypto\n    .createHmac('sha256', `AWS4${key}`)\n    .update(dateStamp)\n    .digest();\n  const kRegion = crypto\n    .createHmac('sha256', kDate)\n    .update(regionName)\n    .digest();\n  const kService = crypto\n    .createHmac('sha256', kRegion)\n    .update(serviceName)\n    .digest();\n  const kSigning = crypto\n    .createHmac('sha256', kService)\n    .update('aws4_request')\n    .digest();\n  return kSigning;\n};\n\nconst getCanonicalRequest = (\n  params: z.infer<typeof CanonicalRequestInputSchema>,\n): string => {\n  const { method, uri, queryString, headers, signedHeaders, payloadHash } =\n    CanonicalRequestInputSchema.parse(params);\n  return `${method}\\n${uri}\\n${queryString}\\n${headers}\\n${signedHeaders}\\n${payloadHash}`;\n};\n\nconst getStringToSign = (\n  params: z.infer<typeof StringToSignInputSchema>,\n): string => {\n  const { algorithm, requestDate, credentialScope, canonicalRequest } =\n    StringToSignInputSchema.parse(params);\n  return `${algorithm}\\n${requestDate}\\n${credentialScope}\\n${crypto.createHash('sha256').update(canonicalRequest).digest('hex')}`;\n};\n\nconst getFormattedDate = (date: Date): z.infer<typeof FormattedDateSchema> => {\n  const year = date.getUTCFullYear();\n  const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n  const day = String(date.getUTCDate()).padStart(2, '0');\n  const hours = String(date.getUTCHours()).padStart(2, '0');\n  const minutes = String(date.getUTCMinutes()).padStart(2, '0');\n  const seconds = String(date.getUTCSeconds()).padStart(2, '0');\n  const amzDate = `${year}${month}${day}T${hours}${minutes}${seconds}Z`;\n  const dateStamp = amzDate.slice(0, 8);\n  return FormattedDateSchema.parse({ amzDate, dateStamp });\n};\n\nconst flattenParams = (\n  params: any,\n  prefix: string = '',\n): { [key: string]: string } => {\n  const flatParams: { [key: string]: string } = {};\n  for (const key in params) {\n    if (Object.prototype.hasOwnProperty.call(params, key)) {\n      const value = params[key];\n      const newKey = prefix ? `${prefix}.${key}` : key;\n      if (typeof value === 'object' && !Array.isArray(value)) {\n        Object.assign(flatParams, flattenParams(value, newKey));\n      } else if (Array.isArray(value)) {\n        value.forEach((item, index) => {\n          Object.assign(\n            flatParams,\n            flattenParams(item, `${newKey}.${index + 1}`),\n          );\n        });\n      } else {\n        flatParams[newKey] = String(value);\n      }\n    }\n  }\n  return flatParams;\n};\n\nconst formatEmailParams = (params: EmailParams) => {\n  const validatedParams = EmailParamsSchema.parse(params);\n\n  // Create the base parameters\n  const formattedParams: Record<string, string> = {\n    Action: 'SendEmail',\n    Version: '2010-12-01',\n    Source: validatedParams.displayName\n      ? `\"${validatedParams.displayName}\" <${validatedParams.sender}>`\n      : validatedParams.sender,\n    'Destination.ToAddresses.member.1': validatedParams.recipient,\n    'Message.Subject.Charset': 'UTF-8',\n    'Message.Subject.Data': validatedParams.subject,\n  };\n\n  // Only include HTML body if provided\n  if (validatedParams.bodyHtml) {\n    formattedParams['Message.Body.Html.Charset'] = 'UTF-8';\n    formattedParams['Message.Body.Html.Data'] = validatedParams.bodyHtml;\n  }\n\n  // Only include Text body if provided\n  if (!validatedParams.bodyHtml && validatedParams.bodyText) {\n    formattedParams['Message.Body.Text.Charset'] = 'UTF-8';\n    formattedParams['Message.Body.Text.Data'] = validatedParams.bodyText;\n  }\n\n  return flattenParams(formattedParams);\n};\n\nconst getRequestHeaders = (config: SESConfig, params: any) => {\n  const method = 'POST';\n  const serviceName = 'ses';\n  const host = `email.${config.region}.amazonaws.com`;\n  const { amzDate, dateStamp } = getFormattedDate(new Date());\n\n  const payload = new URLSearchParams(params).toString();\n  const payloadHash = crypto.createHash('sha256').update(payload).digest('hex');\n\n  const canonicalUri = '/';\n  const canonicalQuerystring = '';\n  const canonicalHeaders = `content-type:application/x-www-form-urlencoded\\nhost:${host}\\nx-amz-date:${amzDate}\\n`;\n  const signedHeaders = 'content-type;host;x-amz-date';\n\n  const canonicalRequest = getCanonicalRequest({\n    method,\n    uri: canonicalUri,\n    queryString: canonicalQuerystring,\n    headers: canonicalHeaders,\n    signedHeaders,\n    payloadHash,\n  });\n\n  const algorithm = 'AWS4-HMAC-SHA256';\n  const credentialScope = `${dateStamp}/${config.region}/${serviceName}/aws4_request`;\n  const stringToSign = getStringToSign({\n    algorithm,\n    requestDate: amzDate,\n    credentialScope,\n    canonicalRequest,\n  });\n\n  const signingKey = getSignatureKey({\n    key: config.secretAccessKey,\n    dateStamp,\n    regionName: config.region,\n    serviceName,\n  });\n  const signature = crypto\n    .createHmac('sha256', signingKey)\n    .update(stringToSign)\n    .digest('hex');\n  const authorizationHeader = `${algorithm} Credential=${config.accessKeyId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;\n\n  return {\n    'Content-Type': 'application/x-www-form-urlencoded',\n    'X-Amz-Date': amzDate,\n    Authorization: authorizationHeader,\n    Accept: 'application/json',\n    Host: host,\n  };\n};\n\n// SDK interface with method descriptions\nexport const SESSdkSchema = z\n  .object({\n    sendEmail: z.any().describe('Send a single email using AWS SES'),\n    sendBulkEmails: z\n      .any()\n      .describe('Send multiple emails in parallel using AWS SES'),\n  })\n  .describe('AWS SES SDK interface');\n\nexport type SESSDK = z.infer<typeof SESSdkSchema>;\n\n/**\n * Create an AWS SES SDK instance for sending emails.\n *\n * @example\n * ```typescript\n * const ses = createSESSdk({\n *   accessKeyId: 'YOUR_AWS_ACCESS_KEY_ID',\n *   secretAccessKey: 'YOUR_AWS_SECRET_ACCESS_KEY',\n *   region: 'us-east-1'\n * });\n *\n * // Send a plain text email\n * await ses.sendEmail({\n *   sender: 'sender@example.com',\n *   recipient: 'recipient@example.com',\n *   subject: 'Hello!',\n *   bodyText: 'This is a plain text email'\n * });\n *\n * // Send an HTML email\n * await ses.sendEmail({\n *   sender: 'sender@example.com',\n *   recipient: 'recipient@example.com',\n *   subject: 'Hello!',\n *   bodyHtml: '<p>This is an HTML email</p>'\n * });\n * ```\n */\nexport const createSESSdk = (config: SESConfig): SESSDK => {\n  const validatedConfig = SESConfigSchema.parse(config);\n\n  const sendEmail = async (params: EmailParams): Promise<SendEmailResponse> => {\n    const validatedParams = EmailParamsSchema.parse(params);\n    const formattedParams = formatEmailParams(validatedParams);\n    const headers = getRequestHeaders(validatedConfig, formattedParams);\n\n    const sdk = createRestSDK({\n      baseUrl: `https://email.${validatedConfig.region}.amazonaws.com`,\n      headers,\n    });\n\n    try {\n      const response = await sdk\n        .post<SendEmailResponse>('/', formattedParams, {\n          contentType: 'application/x-www-form-urlencoded',\n        })\n        .json();\n\n      const tracker = createDefaultMicrofoxUsageTracker();\n      tracker?.trackApi1Usage('aws-ses', 'outboundEmail', {\n        requestCount: 1,\n      });\n\n      return SendEmailResponseSchema.parse(response);\n    } catch (error) {\n      throw new Error(\n        `Failed to send email: ${error instanceof Error ? error.message : String(error)}`,\n      );\n    }\n  };\n\n  const sendBulkEmails = async (\n    params: BulkEmailParams,\n  ): Promise<SendEmailResponse[]> => {\n    const validatedParams = BulkEmailParamsSchema.parse(params);\n    const { recipients, ...rest } = validatedParams;\n\n    const emailPromises = recipients.map(recipient =>\n      sendEmail({\n        ...rest,\n        recipient,\n      }),\n    );\n\n    const responses = await Promise.all(emailPromises);\n    return z.array(SendEmailResponseSchema).parse(responses);\n  };\n\n  return SESSdkSchema.parse({\n    sendEmail,\n    sendBulkEmails,\n  });\n};\n\nexport default createSESSdk;\n"],"mappings":"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","names":[]}