wasmwebsocketdemo.pp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. library wasmwebsocketdemo;
  2. uses fpjson, jsonparser, basenenc, sysutils, wasm.logger.api, wasm.websocket.api, wasm.websocket.shared, wasm.websocket.objects;
  3. Type
  4. { TApplication }
  5. TApplication = class(TObject)
  6. Private
  7. FWS : TWasmWebsocket;
  8. procedure HandleError(Sender: TObject);
  9. procedure HandleMessage(Sender: TObject; const IsString: Boolean; aPayload: TBytes);
  10. procedure HandleOpen(Sender: TObject);
  11. procedure HandleClose(Sender: TObject; aCode : Integer; const aReason : String; aIsClean : Boolean);
  12. procedure HandleWebsocketLog(Level: TWasmWebSocketLogLevel; const Msg: string);
  13. Public
  14. Procedure Run;
  15. Property WS : TWasmWebSocket Read FWS;
  16. end;
  17. var
  18. Application : TApplication;
  19. procedure sendmessage(buf : PByte; Len : Longint);
  20. var
  21. Msg : UTF8String;
  22. begin
  23. SetLength(Msg,Len);
  24. Move(Buf^,Msg[1],Len);
  25. Application.FWS.SendMessage(Msg);
  26. end;
  27. exports sendmessage;
  28. procedure TApplication.HandleOpen(Sender: TObject);
  29. begin
  30. Writeln('Websocket is opened');
  31. end;
  32. procedure TApplication.HandleClose(Sender: TObject; aCode : Integer; const aReason : String; aIsClean : Boolean);
  33. const
  34. SClean : Array[Boolean] of string = ('not ','');
  35. begin
  36. Writeln('Websocket closed ',SClean[aIsClean],'cleanly with code ',aCode,', reason: "',aReason,'"');
  37. end;
  38. procedure TApplication.HandleWebsocketLog(Level: TWasmWebSocketLogLevel; const Msg: string);
  39. begin
  40. Writeln('(Websocket Log) [', Level,']: ',Msg);
  41. end;
  42. procedure TApplication.HandleError(Sender: TObject);
  43. begin
  44. Writeln('Error detected on websocket.');
  45. end;
  46. procedure TApplication.HandleMessage(Sender: TObject; const IsString: Boolean; aPayload: TBytes);
  47. var
  48. Msg,lfrom,lRecip : String;
  49. D : TJSONData;
  50. O : TJSONObject absolute D;
  51. begin
  52. if IsString then
  53. begin
  54. Msg:=TEncoding.UTF8.GetAnsiString(aPayLoad);
  55. D:=Nil;
  56. try
  57. D:=GetJSON(Msg,True);
  58. except
  59. on E : Exception do
  60. Writeln('Received non-JSON message: '+Msg);
  61. end;
  62. if D is TJSONObject then
  63. begin
  64. lFrom:=O.get('from','(unknown)');
  65. lRecip:=O.get('recip','');
  66. msg:=O.get('msg','');
  67. if lRecip<>'' then
  68. lFrom:=lFrom+' [PM]';
  69. Writeln(lFrom,' > ',Msg);
  70. end
  71. else
  72. Writeln('Received invalid JSON message: '+Msg);
  73. end
  74. else
  75. begin
  76. Msg:=Base64.Encode(aPayload);
  77. Writeln('Received binary message : ',Msg);
  78. end;
  79. end;
  80. Procedure TApplication.Run;
  81. begin
  82. FWS:=TWasmWebsocket.Create(Nil);
  83. OnWasmLog:=@HandleWebsocketLog;
  84. WS.OnOpen:=@HandleOpen;
  85. WS.OnError:=@HandleError;
  86. WS.OnClose:=@HandleClose;
  87. WS.OnMessage:=@HandleMessage;
  88. WS.Open('ws://localhost:6060/','');
  89. Writeln('Websocket opened, waiting for messages');
  90. end;
  91. begin
  92. Application:=TApplication.Create;
  93. Application.Run;
  94. end.