Die Demo-Anwendung
Webglue wächst zusammen mit einer Begleitanwendung: einem kleinen Ticketsystem, das jede Bibliothek nutzt, sobald sie da ist.
Aufbau
| Teil | Inhalt |
|---|---|
libs/tickets | Die Domäne, ohne jedes HTTP |
apps/web | Routen, Handler, Middleware und der Supervision-Baum |
prx webglue watch | Ein in Praxis geschriebener WebSocket-Client, um Pushes ankommen zu sehen |
Die Domäne
Ein Ticket ist eine Map, und jeder Übergang liefert #(:ok ticket) oder #(:error reason). Ein Ticket wandert von offen zu zugewiesen, zwischen zugewiesen und pausiert hin und her und schließlich zu geschlossen.
(defn assign [ticket who] :spec [map any -> tuple]
(if (open? ticket)
#(:ok (map/merge ticket {:status :assigned :assignee who}))
#(:error :closed)))Die HTTP-Seite
Die Teile sind die aus den Kernkonzepten: die Routing-Tabelle, die Anwendungsfunktion, der Supervision-Baum, Validierung beim Anlegen eines Tickets, ein Socket mit Presence und ein Push bei jeder Änderung. Ein abgelehnter Übergang wird zu 409, eine fehlende Anmeldung zu 401, ein unbekanntes Ticket zu 404.
Eine Sitzung damit
$ prx run --no-halt webglue_demo # WEBGLUE_ADAPTER=wrangler for Wrangler $ curl -d 'subject=Printer is on fire' localhost:4000/tickets #1 [open] Printer is on fire $ curl -X POST localhost:4000/tickets/1/assign log in first # 401 $ curl -X POST -H 'X-Demo-User: jan' localhost:4000/tickets/1/assign #1 [assigned] Printer is on fire -> jan $ curl -X POST -H 'X-Demo-User: jan' localhost:4000/tickets/1/close $ curl -X POST -H 'X-Demo-User: jan' localhost:4000/tickets/1/assign refused: closed # 409 $ websocat ws://localhost:4000/socket/tickets # watch the pushes live $ prx routes webglue.demo.web # print the route table
X-Demo-User ist eine Abkürzung, die die Cookie-Session umgeht, damit curl keinen Cookie-Speicher braucht; die echte Anmeldung ist POST /session mit einem Feld user.
Was sie noch nicht tut
- Keine Datenbank — der Store liegt im Speicher, hinter der Nahtstelle zur Datenschicht, und bleibt austauschbar.
- Identität ist ein Name; Autorisierung gibt es nicht.
- Klartext- und Formular-Bodies; keine Content-Negotiation.
- Keine Browser-Oberfläche — Pushes beobachtet man mit einem WebSocket-Client.