(= sessions* "sessions/") (def rand-id () (rand-string 10)) (def ok-id (x) (and (is (len x) 10) (all alphadig x))) (def check-id (x) (check x ok-id)) (def session-id () (only.check-id (alref req!cooks "session"))) (def read-session (id) (errsafe (readfile1 (string sessions* id)))) (dynvar session) (def save-session () (ensure-dir sessions*) (writefile session (string sessions* session!id))) (def gen-session () (let session-id (session-id) (if session-id (list (or (read-session session-id) (obj id session-id) nil)) (let id (rand-id) (list (obj id id) `("session" ,id)))))) (def establish-session () (let (session cook) (gen-session) (push cook req!cookies-to-set) session)) (mac with-session body `(dlet session (establish-session) (after (do ,@body) (save-session))))