frontend: ?etherpad= — Echtzeit-Zusammenarbeit über ein geliehenes Pad
Werkbaum hat kein Backend, und das eigentlich Schwere an gemeinsamem Bearbeiten ist das Zusammenführen gleichzeitiger Änderungen — im Plan als `[!] Merging simultaneous edits` markiert. Etherpad hat das gelöst. Also geliehen statt nachgebaut: das Pad ist die Schreibfläche, Werkbaum die Ansicht. Nachgemessen an pad.hostsharing.net, bevor irgendwas gebaut wurde: - der Klartext-Export sendet `Access-Control-Allow-Origin: *`, - das kanonische Beispiel (SPEC §10) kommt byte-identisch zurück, - der HTML-Export zeigt kein Listen-Markup — Etherpad deutet `-` nicht zur Aufzählung um und behält die führenden Leerzeichen. Das war das Risiko, das die Idee hätte erledigen können. Nicht geprüft ist das Tippen im Etherpad-Editor selbst (Tab-Einrückung, mögliches Auto-Bullet); dafür braucht es einen echten Browser. Eigener Parameter statt `?sourceUrl=`: Die URL, die ein Mensch in der Hand hat, ist die Pad-URL — `/export/txt` hängt Werkbaum selbst an. Vor allem aber lizenziert der eigene Parameter das andere Verhalten, sodass D23 unangetastet bleibt: `sourceUrl` heißt weiter „statische Datei, einmal pro Laden geholt", bestehende Links bekommen kein Polling. Name und id sind die vollständige Pad-URL (Pad-Namen sind nur pro Instanz eindeutig). Textfeld schreibgeschützt, Knopf öffnet das Pad: ohne das verschwände getippter Text beim nächsten Abruf. Schrift bleibt Tinte statt grau — hier wird gelesen, der Plantext ist der Hauptinhalt. Drei Riegel im Takt, jeder aus einem echten Fehler: - `padBusy` — im Netzwerk-Mitschnitt stapelten sich die Abrufe, weil die Gegenseite langsamer war als der Takt; eine spät eintreffende alte Antwort hätte neueren Text überschrieben, - Abbruch nach 10 s — sonst bliebe der Riegel bei hängender Gegenseite für immer zu, - `visibilityState` + `visibilitychange` — nicht im Hintergrund abrufen, aber bei Rückkehr sofort. Der Stabilitätstakt übernimmt erst beim zweiten gleichen Abruf, sonst sieht man die anderen mitten im Tippen. Die Normalisierung der Pad-Adresse liegt headless in `remote.js`, damit sie testbar ist (23 neue Tests, 60 -> 83). Im Vorschau-Browser meldet `visibilityState` „hidden" und HMR lädt bei jeder Quelländerung neu — ein Reload sieht wie eine geglückte Übernahme aus; nachgewiesen wurde die Übernahme deshalb mit einem Marker auf `window`, der einen Reload nicht überlebt. SPEC §9 zuerst, dann D31, dann Code. Der Plan bekommt den Knoten nach D30 mit `[x]`, nicht `[^]`.
This commit is contained in:
@@ -86,6 +86,32 @@ http(s) regardless of extension or content type.
|
||||
do; an arbitrary web server often does not. If loading fails the previous
|
||||
content stays and a warning explains why. Only `http`/`https` are allowed.
|
||||
|
||||
### Working on one plan together (Etherpad)
|
||||
|
||||
For real-time collaboration Werkbaum needs no backend of its own — it borrows an
|
||||
**Etherpad**. Pass the pad address as it appears in your browser (no export path,
|
||||
Werkbaum appends that itself):
|
||||
|
||||
```
|
||||
https://werkbaum.javagil.de/?etherpad=https://pad.hostsharing.net/p/my-plan
|
||||
```
|
||||
|
||||
Everyone edits the notation text **in the pad**, and every viewer watches the
|
||||
diagram grow (fetched every 2.5 s; not while the tab is in the background).
|
||||
Merging simultaneous edits is Etherpad's job — that is the whole point.
|
||||
|
||||
Because the pad is the writing surface, the text area here is **read-only**; a
|
||||
button in the editor title bar opens the pad in a new tab. Without that
|
||||
protection, anything you typed would vanish on the next fetch.
|
||||
|
||||
Verified against Etherpad: the plain-text export sends
|
||||
`Access-Control-Allow-Origin: *`, and the notation comes back **byte-identical** —
|
||||
leading spaces, `-`/`+`/`|`, status boxes and `%%` survive Etherpad's storage
|
||||
model, and `-` is not turned into a bullet list.
|
||||
|
||||
**Be aware:** your plan text then lives on third-party infrastructure, and a pad
|
||||
is readable by anyone who knows its address. See `docs/DECISIONS.md` D31.
|
||||
|
||||
### Running it locally
|
||||
|
||||
The editor source now lives as ES modules under `frontend/src/`, bundled by
|
||||
|
||||
Reference in New Issue
Block a user