1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: namespaces assocs kernel sequences accessors
4 urls db.types db.tuples math.parser fry
5 http http.server http.server.filters http.server.redirection
6 furnace furnace.cache furnace.sessions furnace.redirection ;
9 TUPLE: flash-scope < server-state session namespace ;
11 : <flash-scope> ( id -- aside )
12 flash-scope new-server-state ;
14 flash-scope "FLASH_SCOPES" {
15 { "session" "SESSION" BIG-INTEGER +not-null+ }
16 { "namespace" "NAMESPACE" FACTOR-BLOB +not-null+ }
19 : flash-id-key "__f" ;
21 TUPLE: flash-scopes < server-state-manager ;
23 : <flash-scopes> ( responder -- responder' )
24 flash-scopes new-server-state-manager ;
28 : fget ( key -- value )
30 [ namespace>> at ] [ 2drop f ] if ;
32 : get-flash-scope ( id -- flash-scope )
33 dup [ flash-scope get-state ] when
34 dup [ dup session>> session get id>> = [ drop f ] unless ] when ;
36 : request-flash-scope ( request -- flash-scope )
37 flash-id-key swap request-params at string>number get-flash-scope ;
39 M: flash-scopes call-responder*
41 request get request-flash-scope flash-scope set
44 : make-flash-scope ( seq -- id )
46 session get id>> >>session
47 swap [ dup get ] H{ } map>assoc >>namespace
48 [ flash-scopes get touch-state ] [ insert-tuple ] [ id>> ] tri ;
50 : <flash-redirect> ( url seq -- response )
52 make-flash-scope flash-id-key set-query-param
55 : restore-flash ( seq -- )
58 [ '[ , key? ] filter ]
59 [ '[ [ , at ] keep set ] each ]