Skip to content

Commit eb99fe8

Browse files
committed
Make session store lazy
1 parent f148fe5 commit eb99fe8

File tree

4 files changed

+27
-22
lines changed

4 files changed

+27
-22
lines changed

src/WebRow/Session.purs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Prelude
44

55
import Data.Argonaut (Json)
66
import Data.Either (hush)
7-
import Data.Lazy (force) as Lazy
7+
import Data.Lazy (force)
88
import Data.Map (Map)
99
import Data.Maybe (fromMaybe)
1010
import Data.Validation.Semigroup (toEither)
@@ -85,11 +85,11 @@ runInStore store action = do
8585
-- | * Handle custom cookie attributes (expiration etc.).
8686
-- | * Should we raise here internalServerError when `set` returns `false`?
8787
-- | * Should we run testing cycle of test cookie setup?
88-
void $ Cookies.set cookieName { value: store.key, attributes: Cookies.defaultAttributes }
88+
void $ Cookies.set cookieName { value: force store.key, attributes: Cookies.defaultAttributes }
8989
store.fetch >>= next >>> pure
9090

9191
handleSession (SaveF v next) = do
92-
void $ Cookies.set cookieName { value: store.key, attributes: Cookies.defaultAttributes }
92+
void $ Cookies.set cookieName { value: force store.key, attributes: Cookies.defaultAttributes }
9393
a ← store.save v
9494
pure (next a)
9595
Run.interpret (Run.on _session handleSession Run.send) action
@@ -104,7 +104,7 @@ runInMemoryStore ref defaultSession action = do
104104
-- | This laziness is a myth let's drop this all together
105105
lazySessionKey ← Cookies.lookup cookieName
106106
effSessionStore ← Run.liftEffect $
107-
SessionStore.InMemory.new ref defaultSession (Lazy.force lazySessionKey)
107+
SessionStore.InMemory.new ref defaultSession lazySessionKey
108108
runInStore (SessionStore.hoist Run.liftEffect $ effSessionStore) action
109109

110110
-- | The whole session is stored in a cookie value so visible in the browser.
@@ -119,7 +119,7 @@ runInCookieValue dual defaultSession =
119119
let
120120
fetchFromCookie = do
121121
default ← defaultSession
122-
map (decode default) <$> Cookies.lookupJson cookieName
122+
decode default <<< force <$> Cookies.lookupJson cookieName
123123
where
124124
decode default maybeRepr =
125125
fromMaybe default
@@ -131,7 +131,7 @@ runInCookieValue dual defaultSession =
131131
pure (next true)
132132

133133
handleSession (FetchF next) = do
134-
session ← Lazy.force <$> fetchFromCookie
134+
session ← fetchFromCookie
135135
let
136136
json = Pure.runSerializer dual session
137137
-- | TODO:
@@ -142,7 +142,6 @@ runInCookieValue dual defaultSession =
142142
pure $ next session
143143

144144
handleSession (SaveF v next) = do
145-
lazySession ← fetchFromCookie
146145
let
147146
json = Pure.runSerializer dual v
148147
void $ Cookies.setJson cookieName { json, attributes: Cookies.defaultAttributes }

src/WebRow/Session/SessionStore.purs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module WebRow.Session.SessionStore where
22

33
import Prelude
4+
5+
import Data.Lazy (Lazy, defer, force)
46
import Data.Maybe (fromMaybe)
57
import Prim.Row (class Union) as Row
68
import Run (Run)
@@ -10,7 +12,7 @@ import WebRow.KeyValueStore (KeyValueStore, Key)
1012
type SessionStore m session
1113
= { delete m Boolean
1214
, fetch m session
13-
, key Key
15+
, key Lazy Key
1416
, save session m Boolean
1517
}
1618

@@ -41,20 +43,20 @@ new default kv =
4143
pure
4244
{ delete: kv.delete k
4345
, fetch: kv.get k >>= fromMaybe default >>> pure
44-
, key: k
46+
, key: defer \_ → k
4547
, save: kv.put k
4648
}
4749

4850
forKey
4951
m session.
5052
Monad m
5153
session
52-
Key
54+
Lazy Key
5355
KeyValueStore m session
5456
SessionStore m session
5557
forKey default k kv =
56-
{ delete: kv.delete k
57-
, fetch: kv.get k >>= fromMaybe default >>> pure
58+
{ delete: kv.delete (force k)
59+
, fetch: kv.get (force k) >>= fromMaybe default >>> pure
5860
, key: k
59-
, save: kv.put k
61+
, save: kv.put (force k)
6062
}
Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
module WebRow.Session.SessionStore.InMemory where
22

33
import Prelude
4+
5+
import Data.Lazy (Lazy)
46
import Data.Map (Map)
5-
import Data.Maybe (Maybe(..))
7+
import Data.Maybe (Maybe, fromMaybe)
68
import Effect (Effect)
79
import Effect.Ref (Ref)
810
import WebRow.KeyValueStore (Key)
911
import WebRow.KeyValueStore.InMemory (forRef) as KeyValueStore.InMemory
1012
import WebRow.Session.SessionStore (SessionStore)
11-
import WebRow.Session.SessionStore (forKey, new) as SessionStore
13+
import WebRow.Session.SessionStore (forKey) as SessionStore
1214

13-
new session. Ref (Map String session) session Maybe Key Effect (SessionStore Effect session)
14-
new ref defaultSession =
15+
new session. Ref (Map String session) session Lazy (Maybe Key) Effect (SessionStore Effect session)
16+
new ref defaultSession maybeKey = do
1517
let
1618
kv = KeyValueStore.InMemory.forRef ref
17-
in
18-
case _ of
19-
Just key → pure $ SessionStore.forKey defaultSession key kv
20-
NothingSessionStore.new defaultSession kv
19+
newKey ← kv.new
20+
let
21+
key = fromMaybe newKey <$> maybeKey
22+
pure $ SessionStore.forKey defaultSession key kv
23+
2124

src/WebRow/Testing/Session.purs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module WebRow.Testing.Session where
33
import Prelude
44

55
import Data.Argonaut (Json)
6+
import Data.Lazy (defer)
67
import Data.Map (Map)
78
import Data.Maybe (Maybe)
89
import Effect (Effect)
@@ -49,7 +50,7 @@ runInMemory ∷
4950
Run (EffRow + eff) a
5051
runInMemory { default, key, ref } action = do
5152
let
52-
ss = SessionStore.InMemory.new ref default key
53+
ss = SessionStore.InMemory.new ref default (defer \_ → key)
5354

5455
ss' = map (SessionStore.hoist Run.liftEffect) $ ss
5556
run ss' action

0 commit comments

Comments
 (0)