feat(core): the e-mail server after Java, measured against Java

SMTP on port 25 stores mails for the domain's accounts as Java reads
them anew and tells a local sender of unknown recipients; POP3 on port
110 hands them out. The mailboxes are in the snapshot and go back into
the project. EmailRun plays four stories over the network; MailCases
feeds Java's workers without one (26 cases, de and en). 18 cases name
Java bugs that the core does not take.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-01 18:58:26 +00:00
co-authored by Claude Opus 5.5
parent 8438b42018
commit 015635926f
26 changed files with 45188 additions and 14 deletions
+16
View File
@@ -21,6 +21,7 @@ import type {
SimpleClientConfiguration,
SwitchConfiguration,
WebServerConfiguration,
EmailServerAccount,
} from './config.js';
import type { VirtualFileSystem } from '../model/virtualFileSystem.js';
import type { PageLanguage } from './apps/routerPages.js';
@@ -30,6 +31,17 @@ export interface WebServerSnapshot extends WebServerConfiguration {
readonly isActive: boolean;
}
/**
* An installed e-mail server (EmailServer): its domain, its accounts with
* their mailboxes, and whether it is switched on. Java's server keeps its
* accounts in /mailserver/konten.txt; the model's are what Java loads from it.
*/
export interface EmailServerSnapshot {
readonly domain: string;
readonly accounts: readonly EmailServerAccount[];
readonly isActive: boolean;
}
/** An installed echo server: its port, and whether it is switched on (Java: ServerBaustein.aktiv). */
export interface EchoServerSnapshot extends EchoServerConfiguration {
readonly isActive: boolean;
@@ -88,6 +100,8 @@ export interface TopologySnapshot {
readonly webServersByNodeId: ReadonlyMap<Id, WebServerSnapshot>;
/** The nodes with the web browser installed (WebBrowser). */
readonly webBrowserNodeIds: ReadonlySet<Id>;
/** The installed e-mail servers, by node; a run's deliveries change their mailboxes here. */
readonly emailServersByNodeId: ReadonlyMap<Id, EmailServerSnapshot>;
/** Each node's files, which its programs read (a web server its pages). */
readonly fileSystemsByNodeId: ReadonlyMap<Id, VirtualFileSystem>;
/** The language of the pages the devices write themselves (a router's), as Java's in the locale it runs in. */
@@ -112,6 +126,7 @@ export interface TopologySnapshotInput {
simpleClientsByNodeId?: ReadonlyMap<Id, SimpleClientConfiguration>;
webServersByNodeId?: ReadonlyMap<Id, WebServerSnapshot>;
webBrowserNodeIds?: ReadonlySet<Id>;
emailServersByNodeId?: ReadonlyMap<Id, EmailServerSnapshot>;
fileSystemsByNodeId?: ReadonlyMap<Id, VirtualFileSystem>;
language?: PageLanguage;
}
@@ -135,6 +150,7 @@ export function topologySnapshot(input: TopologySnapshotInput): TopologySnapshot
simpleClientsByNodeId: input.simpleClientsByNodeId ?? new Map(),
webServersByNodeId: input.webServersByNodeId ?? new Map(),
webBrowserNodeIds: input.webBrowserNodeIds ?? new Set(),
emailServersByNodeId: input.emailServersByNodeId ?? new Map(),
fileSystemsByNodeId: input.fileSystemsByNodeId ?? new Map(),
language: input.language ?? 'de',
};