mirror of
https://github.com/danieleteti/delphimvcframework.git
synced 2024-11-16 08:15:53 +01:00
65 lines
1.6 KiB
ObjectPascal
65 lines
1.6 KiB
ObjectPascal
unit SSEControllerU;
|
|
|
|
|
|
interface
|
|
|
|
uses
|
|
MVCFramework, MVCFramework.Commons;
|
|
|
|
type
|
|
|
|
[MVCPath('/')]
|
|
TSSEController = class(TMVCController)
|
|
public
|
|
[MVCPath('/stocks')]
|
|
[MVCHTTPMethod([httpGET])]
|
|
[MVCProduces('text/event-stream')]
|
|
procedure Index;
|
|
|
|
protected
|
|
procedure OnBeforeAction(Context: TWebContext; const AActionName: string;
|
|
var Handled: Boolean); override;
|
|
procedure OnAfterAction(Context: TWebContext;
|
|
const AActionName: string); override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
MVCFramework.Logger, System.SysUtils, StorageU;
|
|
|
|
procedure TSSEController.Index;
|
|
var
|
|
lLastEventID: Integer;
|
|
lCurrentEventID: Integer;
|
|
lMessage: string;
|
|
begin
|
|
// wait a little bit
|
|
Sleep(1000 + Random(2000));
|
|
|
|
// retrieve the last id received by the client reading the request header.
|
|
lLastEventID := StrToIntDef(Context.Request.Headers[TMVCConstants.SSE_LAST_EVENT_ID], 0);
|
|
|
|
// get the next message to send based on the last id already received by the client
|
|
lMessage := GetNextDataToSend(lLastEventID, lCurrentEventID);
|
|
|
|
RenderSSE(lCurrentEventID.ToString, lMessage, 'stockupdate');
|
|
end;
|
|
|
|
procedure TSSEController.OnAfterAction(Context: TWebContext;
|
|
const AActionName: string);
|
|
begin
|
|
{ Executed after each action }
|
|
inherited;
|
|
end;
|
|
|
|
procedure TSSEController.OnBeforeAction(Context: TWebContext;
|
|
const AActionName: string; var Handled: Boolean);
|
|
begin
|
|
{ Executed before each action
|
|
if handled is true (or an exception is raised) the actual
|
|
action will not be called }
|
|
inherited;
|
|
end;
|
|
|
|
end.
|
|
|