123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- library wasmwebsocketdemo;
- uses fpjson, jsonparser, basenenc, sysutils, wasm.logger.api, wasm.websocket.api, wasm.websocket.shared, wasm.websocket.objects;
- Type
- { TApplication }
- TApplication = class(TObject)
- Private
- FWS : TWasmWebsocket;
- procedure HandleError(Sender: TObject);
- procedure HandleMessage(Sender: TObject; const IsString: Boolean; aPayload: TBytes);
- procedure HandleOpen(Sender: TObject);
- procedure HandleClose(Sender: TObject; aCode : Integer; const aReason : String; aIsClean : Boolean);
- procedure HandleWebsocketLog(Level: TWasmWebSocketLogLevel; const Msg: string);
- Public
- Procedure Run;
- Property WS : TWasmWebSocket Read FWS;
- end;
- var
- Application : TApplication;
- procedure sendmessage(buf : PByte; Len : Longint);
- var
- Msg : UTF8String;
- begin
- SetLength(Msg,Len);
- Move(Buf^,Msg[1],Len);
- Application.FWS.SendMessage(Msg);
- end;
- exports sendmessage;
- procedure TApplication.HandleOpen(Sender: TObject);
- begin
- Writeln('Websocket is opened');
- end;
- procedure TApplication.HandleClose(Sender: TObject; aCode : Integer; const aReason : String; aIsClean : Boolean);
- const
- SClean : Array[Boolean] of string = ('not ','');
- begin
- Writeln('Websocket closed ',SClean[aIsClean],'cleanly with code ',aCode,', reason: "',aReason,'"');
- end;
- procedure TApplication.HandleWebsocketLog(Level: TWasmWebSocketLogLevel; const Msg: string);
- begin
- Writeln('(Websocket Log) [', Level,']: ',Msg);
- end;
- procedure TApplication.HandleError(Sender: TObject);
- begin
- Writeln('Error detected on websocket.');
- end;
- procedure TApplication.HandleMessage(Sender: TObject; const IsString: Boolean; aPayload: TBytes);
- var
- Msg,lfrom,lRecip : String;
- D : TJSONData;
- O : TJSONObject absolute D;
- begin
- if IsString then
- begin
- Msg:=TEncoding.UTF8.GetAnsiString(aPayLoad);
- D:=Nil;
- try
- D:=GetJSON(Msg,True);
- except
- on E : Exception do
- Writeln('Received non-JSON message: '+Msg);
- end;
- if D is TJSONObject then
- begin
- lFrom:=O.get('from','(unknown)');
- lRecip:=O.get('recip','');
- msg:=O.get('msg','');
- if lRecip<>'' then
- lFrom:=lFrom+' [PM]';
- Writeln(lFrom,' > ',Msg);
- end
- else
- Writeln('Received invalid JSON message: '+Msg);
- end
- else
- begin
- Msg:=Base64.Encode(aPayload);
- Writeln('Received binary message : ',Msg);
- end;
- end;
- Procedure TApplication.Run;
- begin
- FWS:=TWasmWebsocket.Create(Nil);
- OnWasmLog:=@HandleWebsocketLog;
- WS.OnOpen:=@HandleOpen;
- WS.OnError:=@HandleError;
- WS.OnClose:=@HandleClose;
- WS.OnMessage:=@HandleMessage;
- WS.Open('ws://localhost:6060/','');
- Writeln('Websocket opened, waiting for messages');
- end;
- begin
- Application:=TApplication.Create;
- Application.Run;
- end.
|