docs: Recherche zur automatischen Aktualisierung — Alternativen in den Plan

Wunsch: Ansicht aktualisiert sich selbst, höchstens ~2 s Verzögerung, möglichst
über Etherpads Websockets. Recherchiert und gemessen, nicht geschätzt.

Kernbeobachtung, die alles erklärt: Der einzige Endpunkt, den wir fremdstämmig
lesen dürfen, ist genau der gedrosselte. `/export/txt` sendet
`Access-Control-Allow-Origin: *` und ist auf 10 Abrufe je 90 s und IP begrenzt
(Etherpad-Voreinstellung, in settings.json.template bestätigt); die Pad-Seite
`/p/<pad>` enthält den vollen Text in `clientVars`, sendet aber KEINEN
CORS-Header — der naheliegende Umweg ist also versperrt.

Der vorgeschlagene Websocket-Weg ebenfalls, und das ist gemessen: Ein
`wss://…/socket.io/?EIO=4&transport=websocket` scheitert mit Code 1006 ohne
`open`, während ein fremder Echo-Server aus derselben Seite sauber öffnet — die
Umgebung kann WebSockets, dieser Server nimmt uns nur nicht. Das eingebettete
Pad verbindet sich dagegen problemlos; der Unterschied ist der Origin. Damit
scheitert der Weg nicht an unserer Bereitschaft, eine Abhängigkeit aufzunehmen,
sondern an der Gegenseite — die Easysync-Frage stellt sich gar nicht mehr.

Fund der Suche: Etherpad-Plugins reden per postMessage mit der einbettenden
Seite. `ep_iframeinsert` schickt periodisch den ganzen Pad-Text ans
Elternfenster (und nimmt insert-Befehle an, könnte also sogar Schreiben
erlauben). Das ist der einzige Weg, der live ist, kein Polling braucht, das
Rate Limit nicht berührt und uns nur einen message-Zuhörer kostet — keine neue
Laufzeit-Abhängigkeit. Preis: Installation auf der Instanz.

Damit hängt alles an einer Frage: Kommt man an die Konfiguration der
Pad-Instanz? Alle wirksamen Wege sind Server-Änderungen. Ohne Zugriff bleibt
Polling im Budget — höchstens einmal je 9 s, geteilt über alle Betrachter
hinter derselben IP.

Im Plan steht das als any-of-Gruppe unter „Update by itself"; die beiden
gemessenen Sackgassen als [-] mit dem Messergebnis im Kommentar, damit niemand
sie erneut aufmacht. Der günstigste Pfad wählt dort von selbst die
Rate-Limit-Anhebung. Geprüft: 107 Knoten, keine Warnungen.
This commit is contained in:
mhoennig
2026-07-30 14:36:11 +02:00
parent c4f83a371b
commit f3d3cc3afb
2 changed files with 70 additions and 0 deletions
+60
View File
@@ -1329,3 +1329,63 @@ zwei Scheine nach außen gehen nicht, einer muss der Ring sein). Die Regel für
`fresh.focusmark` steht **nach** der für `focusmark.current`: gleiche Spezifität,
und wenn alles drei zutrifft, sollen Zuruf und Neuheit gewinnen, nicht die eigene
Cursor-Zeile.
**Nachtrag zu D31 — Recherche: Wie kann sich die Ansicht von selbst aktualisieren?**
Wunsch: automatisch, mit höchstens ~2 s Verzögerung, „dafür könnte man die
Websockets von Etherpad verwenden". Recherchiert und **gemessen** statt geschätzt;
die Zahlen stammen aus Etherpads `settings.json.template` und aus Versuchen gegen
`pad.hostsharing.net`:
| Befund | Messung |
|---|---|
| `importExportRateLimiting` | `{windowMs: 90000, max: 10}` — 10 Abrufe je 90 s **und IP** |
| `commitRateLimiting` | `{duration: 1, points: 10}` (betrifft Schreiben, nicht uns) |
| `cookie.sameSite` | Voreinstellung `"Lax"` — Ursache der Rahmen-Probleme |
| socket.io | Server v4; `/socket.io/?EIO=4` antwortet `0{"sid":…}`, `EIO=3` wird abgelehnt |
| Pad-**Seite** `/p/<pad>` | **kein** `Access-Control-Allow-Origin` |
| Pad-**Export** `/export/txt` | `Access-Control-Allow-Origin: *` |
Daraus folgt die Kernbeobachtung, die alles andere erklärt: **Der einzige
Endpunkt, den wir fremdstämmig lesen dürfen, ist genau der gedrosselte.**
**Zwei naheliegende Wege sind gemessen versperrt:**
- **Pad-HTML statt Export lesen.** Die Seite enthält den vollen Text in
`clientVars` und unterliegt dem Export-Limit nicht — aber sie sendet keinen
CORS-Header, der Browser blockt es. Sackgasse.
- **Eigener Socket zum Pad.** `wss://…/socket.io/?EIO=4&transport=websocket`
scheitert mit Code 1006 **ohne** `open`. Gegenprobe gegen einen fremden
Echo-Server aus derselben Seite: `OPEN`, saubere Schließung — die Umgebung kann
also WebSockets, dieser Server nimmt uns nur nicht. Zugleich verbindet sich das
**eingebettete** Pad problemlos (nachgewiesen: es übernahm eine von außen
eingespielte Änderung sofort) — der Unterschied ist der Origin. Warum genau,
sagt 1006 nicht (Origin-Prüfung, fehlendes Session-Cookie oder ein Proxy, der
nur gleichstämmig upgradet); alle drei liegen serverseitig, die Folgerung hält
also unabhängig davon. **Der vorgeschlagene Websocket-Weg scheitert damit nicht
an unserer Bereitschaft, eine Abhängigkeit aufzunehmen, sondern an der
Gegenseite** — und die Easysync-Frage (Changesets anwenden) stellt sich gar
nicht mehr.
**Der Fund, den die Suche gebracht hat:** Es gibt Etherpad-Plugins, die per
`postMessage` mit der einbettenden Seite reden — `ep_iframeinsert` schickt
periodisch `{func:"none", context:"ep_iframeinsert", data:<ganzer Pad-Text>}` ans
Elternfenster (und nimmt umgekehrt `insert`-Befehle an, könnte also sogar
Schreiben aus Werkbaum heraus erlauben); `ep_resize` belegt dasselbe Muster für
Größenänderungen. Das ist der einzige Weg, der **live** ist, **kein** Polling
braucht, das Rate Limit nicht berührt und auf unserer Seite nur einen
`message`-Zuhörer mit Origin-Prüfung kostet — also **keine** neue
Laufzeit-Abhängigkeit. Preis: Das Plugin muss auf der Instanz installiert sein.
**Damit hängt alles an einer einzigen Frage: Kommt man an die Konfiguration der
Pad-Instanz?** Jede der wirksamen Möglichkeiten ist eine Server-Änderung —
Rate Limit höher, Plugin installieren, `cookie.sameSite: "None"`, oder eine
socket.io-CORS-Freigabe. Ohne Zugriff bleibt nur, innerhalb des Budgets zu
pollen: höchstens **einmal je 9 s** (10 je 90 s), und das teilen sich alle
Betrachter hinter derselben IP. Das ist ehrlich machbar, aber es sind nicht die
gewünschten 2 s — und es ist schlechter als der Knopf, sobald mehrere zuschauen.
Die Alternativen stehen als any-of-Gruppe im mitgelieferten Plan
(`docs/examples/example-werkbaum.werkbaum`, unter „Update by itself"); die beiden
gemessenen Sackgassen als `[-]` mit dem Messergebnis im Kommentar, damit niemand
sie erneut aufmacht. Der günstigste Pfad wählt dort von selbst die
Rate-Limit-Anhebung — die billigste wirksame Änderung.