diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-06-14 01:21:11 +0800 | 
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-06-14 02:50:24 +0800 | 
| commit | 6e2894f2c917dfe6c5a03e6453be292118f4ef00 (patch) | |
| tree | f2fa78e2669ba38fadc88f1b1f33dcbca52335b2 /deno | |
| parent | 8fe85fccf3881114202301ac986073564d5abd3f (diff) | |
| download | crupest-6e2894f2c917dfe6c5a03e6453be292118f4ef00.tar.gz crupest-6e2894f2c917dfe6c5a03e6453be292118f4ef00.tar.bz2 crupest-6e2894f2c917dfe6c5a03e6453be292118f4ef00.zip | |
deno(mail-server): rename Logger and revise service creation.
Diffstat (limited to 'deno')
| -rw-r--r-- | deno/base/log.ts | 23 | ||||
| -rw-r--r-- | deno/mail-relay/app.ts | 6 | ||||
| -rw-r--r-- | deno/mail-relay/aws/app.ts | 48 | ||||
| -rw-r--r-- | deno/mail-relay/dovecot.ts | 12 | 
4 files changed, 36 insertions, 53 deletions
| diff --git a/deno/base/log.ts b/deno/base/log.ts index 403b9ce..bfd5fae 100644 --- a/deno/base/log.ts +++ b/deno/base/log.ts @@ -6,20 +6,12 @@ export interface ExternalLogStream extends Disposable {    stream: WritableStream;  } -export class Logger { -  #externalLogDir?: string; +export class LogFileProvider { +  #directory: string; -  get externalLogDir() { -    return this.#externalLogDir; -  } - -  set externalLogDir(value: string | undefined) { -    this.#externalLogDir = value; -    if (value != null) { -      Deno.mkdirSync(value, { -        recursive: true, -      }); -    } +  constructor(directory: string) { +    this.#directory = directory; +    Deno.mkdirSync(directory, { recursive: true });    }    async createExternalLogStream( @@ -31,12 +23,9 @@ export class Logger {      if (name.includes("/")) {        throw new Error(`External log stream's name (${name}) contains '/'.`);      } -    if (this.#externalLogDir == null) { -      throw new Error("External log directory is not set."); -    }      const logPath = join( -      this.#externalLogDir, +      this.#directory,        options?.noTime === true          ? name          : `${name}-${toFileNameString(new Date())}`, diff --git a/deno/mail-relay/app.ts b/deno/mail-relay/app.ts index 0b9da07..eeffc12 100644 --- a/deno/mail-relay/app.ts +++ b/deno/mail-relay/app.ts @@ -1,7 +1,7 @@  import { Hono } from "hono";  import { logger as honoLogger } from "hono/logger"; -import { Logger } from "@crupest/base/log"; +import { LogFileProvider } from "@crupest/base/log";  import {    AliasRecipientMailHook, @@ -13,7 +13,7 @@ import { DovecotMailDeliverer } from "./dovecot.ts";  import { DumbSmtpServer } from "./dumb-smtp-server.ts";  export function createInbound( -  logger: Logger, +  logFileProvider: LogFileProvider,    {      fallback,      mailDomain, @@ -26,7 +26,7 @@ export function createInbound(      ldaPath: string;    },  ) { -  const deliverer = new DovecotMailDeliverer(logger, ldaPath); +  const deliverer = new DovecotMailDeliverer(logFileProvider, ldaPath);    deliverer.preHooks.push(      new RecipientFromHeadersHook(mailDomain),      new FallbackRecipientHook(new Set(fallback)), diff --git a/deno/mail-relay/aws/app.ts b/deno/mail-relay/aws/app.ts index b7d0154..13db351 100644 --- a/deno/mail-relay/aws/app.ts +++ b/deno/mail-relay/aws/app.ts @@ -6,7 +6,7 @@ import { FetchHttpHandler } from "@smithy/fetch-http-handler";  // @ts-types="npm:@types/yargs"  import yargs from "yargs"; -import { Logger } from "@crupest/base/log"; +import { LogFileProvider } from "@crupest/base/log";  import { ConfigDefinition, ConfigProvider } from "@crupest/base/config";  import { CronTask } from "@crupest/base/cron"; @@ -155,60 +155,56 @@ function createCron(fetcher: AwsMailFetcher, consumer: AwsS3MailConsumer) {  function createBaseServices() {    const config = new ConfigProvider(PREFIX, CONFIG_DEFINITIONS);    Deno.mkdirSync(config.get("dataPath"), { recursive: true }); -  const logger = new Logger(); -  logger.externalLogDir = join(config.get("dataPath"), "log"); -  return { config, logger }; +  const logFileProvider = new LogFileProvider( +    join(config.get("dataPath"), "log"), +  ); +  return { config, logFileProvider };  }  function createAwsFetchOnlyServices() { -  const { config, logger } = createBaseServices(); +  const services = createBaseServices(); +  const { config } = services; +    const awsOptions = createAwsOptions({      user: config.get("awsUser"),      password: config.get("awsPassword"),      region: config.get("awsRegion"),    });    const fetcher = new AwsMailFetcher(awsOptions, config.get("awsMailBucket")); -  return { config, logger, awsOptions, fetcher }; + +  return { ...services, awsOptions, fetcher };  }  function createAwsRecycleOnlyServices() { -  const { config, logger, awsOptions, fetcher } = createAwsFetchOnlyServices(); +  const services = createAwsFetchOnlyServices(); +  const { config, logFileProvider } = services; -  const inbound = createInbound(logger, { +  const inbound = createInbound(logFileProvider, {      fallback: config.getList("inboundFallback"),      ldaPath: config.get("ldaPath"),      aliasFile: join(config.get("dataPath"), "aliases.csv"),      mailDomain: config.get("mailDomain"),    }); -    const recycler = (rawMail: string, _: unknown): Promise<void> =>      inbound.deliver({ mail: new Mail(rawMail) }).then(); -  return { config, logger, awsOptions, fetcher, inbound, recycler }; +  return { ...services, inbound, recycler };  }  function createAwsServices() { -  const { config, logger, inbound, awsOptions, fetcher, recycler } = -    createAwsRecycleOnlyServices(); +  const services = createAwsRecycleOnlyServices(); +  const { config, awsOptions } = services; +    const dbService = new DbService(join(config.get("dataPath"), "db.sqlite"));    const outbound = createOutbound(awsOptions, dbService); -  return { -    config, -    logger, -    inbound, -    dbService, -    awsOptions, -    fetcher, -    recycler, -    outbound, -  }; +  return { ...services, dbService, outbound };  }  function createServerServices() {    const services = createAwsServices();    const { config, outbound, inbound, fetcher } = services; -  const smtp = createSmtp(outbound); +  const smtp = createSmtp(outbound);    const hono = createHono(outbound, inbound);    setupAwsHono(hono, {      path: config.get("awsInboundPath"), @@ -220,11 +216,7 @@ function createServerServices() {      },    }); -  return { -    ...services, -    smtp, -    hono, -  }; +  return { ...services, smtp, hono };  }  function serve(cron: boolean = false) { diff --git a/deno/mail-relay/dovecot.ts b/deno/mail-relay/dovecot.ts index 748d6fa..333b803 100644 --- a/deno/mail-relay/dovecot.ts +++ b/deno/mail-relay/dovecot.ts @@ -1,17 +1,17 @@  import { basename } from "@std/path"; -import { Logger } from "@crupest/base/log"; +import { LogFileProvider } from "@crupest/base/log";  import { Mail, MailDeliverContext, MailDeliverer } from "./mail.ts";  export class DovecotMailDeliverer extends MailDeliverer {    readonly name = "dovecot"; -  readonly #logger; +  readonly #logFileProvider;    readonly #ldaPath; -  constructor(logger: Logger, ldaPath: string) { +  constructor(logFileProvider: LogFileProvider, ldaPath: string) {      super(); -    this.#logger = logger; +    this.#logFileProvider = logFileProvider;      this.#ldaPath = ldaPath;    } @@ -47,7 +47,9 @@ export class DovecotMailDeliverer extends MailDeliverer {          const ldaProcess = ldaCommand.spawn();          using logFiles = -          await this.#logger.createExternalLogStreamsForProgram(ldaBinName); +          await this.#logFileProvider.createExternalLogStreamsForProgram( +            ldaBinName, +          );          ldaProcess.stdout.pipeTo(logFiles.stdout);          ldaProcess.stderr.pipeTo(logFiles.stderr); | 
