1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859openLwt.SyntaxmoduleSession=Sihl_sessionmoduleHttp=Sihl_httpletlog_src=Logs.Src.create~doc:"Session Middleware""sihl.middleware.session"moduleLogs=(valLogs.src_loglog_src:Logs.LOG)letkey:Session.tOpium_kernel.Hmap.key=Opium_kernel.Hmap.Key.create("session",Session.sexp_of_t);;letfindreq=Opium_kernel.Hmap.find_exnkey(Opium_kernel.Request.envreq)letfind_optreq=trySome(findreq)with|_->None;;letsetsessionreq=letenv=Opium_kernel.Request.envreqinletenv=Opium_kernel.Hmap.addkeysessionenvin{reqwithenv};;moduleMake(SessionService:Session.Sig.SERVICE)=structletm?(cookie_key="session_key")()=letfilterhandlerreq=matchHttp.Request.cookiecookie_keyreqwith|Somesession_key->(* A session cookie was found *)let*session=SessionService.find_opt~key:session_keyin(matchsessionwith|Somesession->let*session=ifSession.is_expired(Ptime_clock.now())sessionthen(Logs.debug(funm->m"SESSION: Session expired, creating new one");let*session=SessionService.create[]inLwt.returnsession)elseLwt.returnsessioninletreq=setsessionreqinhandlerreq|None->let*session=SessionService.create[]inletreq=setsessionreqinlet*res=handlerreqinHttp.Response.add_cookie(cookie_key,session.key)res|>Lwt.return)|None->(* No session cookie found *)let*session=SessionService.create[]inletreq=setsessionreqinlet*res=handlerreqinres|>Http.Response.add_cookie(cookie_key,session.key)|>Lwt.returninOpium_kernel.Rock.Middleware.create~name:"session"~filter;;end