aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-06-14 01:21:11 +0800
committerYuqian Yang <crupest@crupest.life>2025-06-14 02:50:24 +0800
commit0ddd1dc07f7d00723933d832562497af23dce225 (patch)
treeb481ba49c77b39c4e3c3369352a0fd4c34a77800
parent402ffc61bf2bd4e7de535e179a39325320e34d73 (diff)
downloadcrupest-0ddd1dc07f7d00723933d832562497af23dce225.tar.gz
crupest-0ddd1dc07f7d00723933d832562497af23dce225.tar.bz2
crupest-0ddd1dc07f7d00723933d832562497af23dce225.zip
deno(mail-server): rename Logger and revise service creation.
-rw-r--r--deno/base/log.ts23
-rw-r--r--deno/mail-relay/app.ts6
-rw-r--r--deno/mail-relay/aws/app.ts48
-rw-r--r--deno/mail-relay/dovecot.ts12
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);