1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586moduleCore=Sihl_coremoduleSession=Sihl_sessionopenLwt.SyntaxmoduleEntry=Model.Entryletlog_src=Logs.Src.create~doc:"message""sihl.service.message"moduleLogs=(valLogs.src_loglog_src:Logs.LOG)letsession_key="message"moduleMake(SessionService:Session.Sig.SERVICE):Sig.SERVICE=structletfetch_entrysession=let*entry=SessionService.getsession~key:session_keyinmatchentrywith|None->Lwt.returnNone|Someentry->(matchentry|>Entry.of_stringwith|Okentry->Lwt.return(Someentry)|Errormsg->Logs.warn(funm->m"MESSAGE: Invalid flash message in session %s"msg);Lwt.returnNone);;letfind_currentsession=let*entry=fetch_entrysessioninmatchentrywith|None->Lwt.returnNone|Someentry->Lwt.return(Entry.currententry);;letset_nextsessionmessage=let*entry=fetch_entrysessioninmatchentrywith|None->(* No entry found, creating new one *)letentry=Entry.createmessage|>Entry.to_stringinSessionService.setsession~key:session_key~value:entry|Someentry->(* Overriding next message in existing entry *)letentry=Entry.set_nextmessageentry|>Entry.to_stringinSessionService.setsession~key:session_key~value:entry;;letrotatesession=let*entry=fetch_entrysessioninmatchentrywith|None->Lwt.returnNone|Someentry->letserialized_entry=entry|>Entry.rotate|>Entry.to_stringinlet*()=SessionService.setsession~key:session_key~value:serialized_entryinLwt.return@@Model.Entry.nextentry;;letcurrentsession=let*entry=find_currentsessioninmatchentrywith|None->Lwt.returnNone|Somemessage->Lwt.return(Somemessage);;letsetsession?(error=[])?(warning=[])?(success=[])?(info=[])()=letmessage=Model.Message.(empty|>set_errorerror|>set_warningwarning|>set_successsuccess|>set_infoinfo)inset_nextsessionmessage;;letstart()=Lwt.return()letstop_=Lwt.return()letlifecycle=Core.Container.Lifecycle.create"message"~dependencies:[SessionService.lifecycle]~start~stop;;letregister()=Core.Container.Service.createlifecycleend