feat(core): the e-mail server keeps /mailserver/konten.txt up to date at run time, measured against Java

The account file's writer moves from the export (packages/fls) into the
core, so that the export and the running server write the same. The
server writes the file at its start and whenever its accounts change.
EmailRun now records Java's file as it left it and as Java writes the
accounts it ended with; Java leaves the notice to a local sender out until
its next write.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 11:41:16 +00:00
co-authored by Claude Opus 5.5
parent a867c33d64
commit f622959ecc
13 changed files with 1863 additions and 1777 deletions
+12
View File
@@ -11,6 +11,9 @@ import { fileURLToPath } from 'node:url';
import { describe, expect, it } from 'vitest';
import {
addressEntry,
EMAIL_SERVER_ACCOUNTS_FILE,
serverAccountsFileText,
VirtualFileSystem,
deviceConfiguration,
NetworkRuntimeEngine,
topologySnapshot,
@@ -362,6 +365,15 @@ describe('the e-mail server in the engine', () => {
expect(talk(engine, 110, 'QUIT')).toEqual(['+OK POP3 server ready', '+OK']);
});
it('writes its account file from its accounts when it starts, over one that says otherwise', () => {
const files = new VirtualFileSystem();
files.createDirectory('/mailserver');
files.writeTextFile(EMAIL_SERVER_ACCOUNTS_FILE, 'alt;filius.de;alt;Alt;Alt;\n');
const engine = new NetworkRuntimeEngine(14);
engine.handle({ type: 'start', snapshot: topologySnapshot({ ...mailNetwork(), fileSystemsByNodeId: new Map([[SERVER, files]]) }), seed: 14, initialTimeMilliseconds: 0 });
expect(files.textFile(EMAIL_SERVER_ACCOUNTS_FILE)).toBe(serverAccountsFileText('filius.de', MAIL_ACCOUNTS));
});
it('keeps its mailboxes in the snapshot: a mail taken, a mail deleted; a new start begins from there', () => {
const engine = new NetworkRuntimeEngine(14);
engine.handle({ type: 'start', snapshot: topologySnapshot({ ...mailNetwork(), language: 'en' }), seed: 14, initialTimeMilliseconds: 0 });