From 2b1841e17533543d1cb15220ca86a2a37c853daf Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sat, 15 Aug 2026 10:51:11 +0200 Subject: Die Web-App rechnet im Browser statt auf dem Server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bisher lief die Weboberfläche auf einem JDK-HttpServer: Uploads landeten als temporäre Dateien auf dem Server, die Synopse entstand dort. Das kostete Betrieb (systemd, Reverse Proxy, Rate-Limiting, Timeouts) und verlangte ein Datenschutzversprechen, das nur zusicherbar, nicht nachprüfbar war — gerade Entwurfstexte verließen den Rechner der Nutzer:innen. Neu übersetzt `./mvnw -Pwasm package` dieselbe Pipeline mit GraalVM Web Image (`native-image --tool:svm-wasm`) nach WebAssembly, PDFBox eingeschlossen. Ausgeliefert werden nur noch statische Dateien; gerechnet wird im Browser. Die erzeugte Synopse ist byteweise identisch mit der der Befehlszeile (SHA-256 verglichen für IfSG 48/27/21 und BayJG 151/3/54). Die Befehlszeile bleibt unberührt: `./mvnw package` erzeugt unverändert das JAR, alle Optionen und Meldungstexte sind gleich, das Wasm-Profil ist rein additiv und verlangt Oracle GraalVM 25.1+ (die CE hat kein Web Image). Portabilitätsschnitt (nützt beiden Fassungen): * `Quelle` (Name + Bytes) ersetzt `Path` in der Pipeline; nur die Befehlszeile kennt noch ein Dateisystem. Der Name trägt genau den bisherigen `getFileName()`-Text, damit Warnungen und Quellenzeile wortgleich bleiben. * `DateiTyp` erkennt PDF/XML/Klartext an den Signaturbytes. Tika entfällt — eine schwergewichtige Abhängigkeit samt ServiceLoader- und XML-Konfiguration weniger, was der Wasm-Übersetzung unmittelbar zugutekommt. Vier Eigenheiten von Web Image, die der Quelltext jeweils an Ort und Stelle vermerkt: * `java.util.zip.Inflater` ist nicht angebunden (GR-65205), ohne Inflate ist kein PDF lesbar. `InflaterErsatz` substituiert ihn durch jzlib. * Typisierte JS-Felder lassen sich nicht nach `byte[]` umsetzen („byteArrayHub is not defined“); der Dateiinhalt wandert als Base64. * JULs Standardformatter ruft `StackWalker`, den es dort nicht gibt. * Im Worker fehlt `document.currentScript`, worauf die Laufzeit das Wasm-Modul neben `worker.js` sucht; die VM wird deshalb mit ausdrücklichem Pfad ein zweites Mal gestartet. Die Reachability-Metadaten stammen aus einem Lauf des Tracing-Agents über die Pipeline; die PDFBox- und FontBox-Ressourcen sind als Globs ergänzt, sonst scheitern PDFs an „Could not find referenced cmap stream Identity-H“. Entfallen: WebMain, UploadHandler, StaticHandler, Multipart und die systemd-Unit. Die nginx-Vorlage liefert jetzt statische Dateien aus, und die Datenschutzseite sagt, was nun stimmt: Die Dateien verlassen den Rechner nicht. Co-Authored-By: Claude Opus 5 Change-Id: I38faf2ac0f764d601f080d4276babe4747773683 --- pom.xml | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 142 insertions(+), 8 deletions(-) (limited to 'pom.xml') diff --git a/pom.xml b/pom.xml index 02478cb..601b9e9 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,7 @@ 3.9.0 + 3.6.0 3.15.0 3.11.0 3.6.3 @@ -33,12 +34,12 @@ 3.27.7 4.17 3.6.3.Final + 1.1.5 1.0.0 5.13.4 3.0.8 4.7.7 2.0.18 - 3.3.1 @@ -86,13 +87,6 @@ ${slf4j.version} - - - org.apache.tika - tika-core - ${tika.version} - - org.apache.pdfbox @@ -267,4 +261,144 @@ + + + + + wasm + + + ${java.home}/bin/native-image + ${project.build.directory}/web + + + 21 + 21 + + + + + + org.jruby + jzlib + ${jzlib.version} + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${build-helper-plugin.version} + + + wasm-quellen + generate-sources + + add-source + + + + src/wasm/java + + + + + + + + maven-compiler-plugin + + + -Aproject=${project.groupId}/${project.artifactId} + --add-modules + org.graalvm.webimage.api + + + + info.picocli + picocli-codegen + ${picocli.version} + + + + + + + maven-resources-plugin + + + statische-seiten + package + + copy-resources + + + ${wasm.output.directory} + + + src/main/resources/eu/mulk/aendggner/web + + + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + web-image + package + + exec + + + ${native-image.executable} + + --tool:svm-wasm + + -H:WasmComments=NONE + -classpath + + -o + ${wasm.output.directory}/aendggner + eu.mulk.aendggner.wasm.BrowserMain + + + + + + + + + + + + -- cgit v1.2.1