summaryrefslogtreecommitdiff
path: root/flash.lisp
blob: 27a6c3189f979bf44b89a7de654c41d73f0a2d07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
;;;; flash.lisp -- communicating between page loads

(in-package :dnd)

(defvar *flashes*
  (make-hash-table :test #'equal :synchronized t))

(defparameter +flash-cookie-name+ "DNDFLASHKEY")
(defparameter +flash-value-lifetime+ 10
  "Number of seconds a flashed value lives.")


(defun flash (value)
  "A flash is a one-time inter-request value. Once stored, it can only
be retrieved once. And if not retrieved in a short period of time, it
expires."
  (let ((key (nuid))
        (now (get-universal-time)))
    (setf (gethash key *flashes*) (cons value now))
    (lzb:set-response-cookie
     +flash-cookie-name+ key
     ;; TODO: generalize domain
     :path "/" :domain "localhost" 
     :expires (+ +flash-value-lifetime+ now))  
    key))

(defun flashed-value-alive-p (val)
  (<= (+ (cdr val) +flash-value-lifetime+)
      (get-universal-time)))

(defun flashed-value ()
  "Retrieves the value flashed in this request, if it exists, and
returns it.  

Removes the flashed value from the hash table if it was found."
  (a:when-let* ((key (lzb:request-cookie +flash-cookie-name+))
                (val (gethash key *flashes*)))
    (remhash key *flashes*)
    (when (flashed-value-alive-p val)
      (car val))))