websocketworker.lpr 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. {
  2. Sample websocket worker process.
  3. This must be used in conjunction with the use of the TWorkerWebSocketAPI class from the
  4. wasm.pas2js.websocket.worker unit in the thread worker.
  5. }
  6. program websocketworker;
  7. {$mode objfpc}
  8. {$modeswitch externalclass}
  9. uses
  10. Classes
  11. , JS
  12. , weborworker
  13. , SysUtils
  14. , wasienv
  15. , WasiWorkerThreadHost
  16. , Rtl.WebThreads
  17. , wasm.websocket.shared
  18. , wasm.pas2js.websocketapi
  19. , wasm.pas2js.websocket.handler
  20. ;
  21. Type
  22. { TWebSocketHandlerApplication }
  23. TWebSocketHandlerApplication = class(TWorkerThreadRunnerApplication)
  24. private
  25. FWebsocketAPI : TWasmWebSocketAPIHandler;
  26. procedure SetSharedMem(aData: TWorkerCommand);
  27. public
  28. constructor Create(aOwner: TComponent); override;
  29. function HandleCustomCommand(aData: TWorkerCommand): Boolean; override;
  30. procedure HandleError(Sender: TObject; Error: Exception; Args: TJSFunctionArguments; var ReRaise: Boolean);
  31. procedure HandleJSError(Sender: TObject; Error: TJSError; Args: TJSFunctionArguments; var ReRaise: Boolean);
  32. procedure dorun; override;
  33. procedure SetLogging(aEnable: boolean);
  34. end;
  35. procedure TWebSocketHandlerApplication.SetLogging(aEnable : boolean);
  36. begin
  37. FWebsocketAPI.LogAPICalls:=aEnable;
  38. end;
  39. constructor TWebSocketHandlerApplication.Create(aOwner : TComponent);
  40. begin
  41. inherited Create(aOwner);
  42. FWebsocketAPI:=TWasmWebSocketAPIHandler.Create(WasiEnvironment);
  43. SetLogging(False);
  44. end;
  45. procedure TWebSocketHandlerApplication.SetSharedMem(aData : TWorkerCommand);
  46. var
  47. lSetSharedMemCommand : TSetSharedMemWorkerCommand absolute aData;
  48. begin
  49. FWebsocketAPI.SharedMem:=lSetSharedMemCommand.Buffer;
  50. end;
  51. function TWebSocketHandlerApplication.HandleCustomCommand(aData: TWorkerCommand): Boolean;
  52. begin
  53. Case aData.Command of
  54. cmdRun : Result:=True; // Pretend it was run
  55. cmdCancel : Result:=True; // Pretend it was canceled
  56. cmdWebsocketSharedMem :
  57. SetSharedMem(aData);
  58. cmdEnableLog,
  59. cmdDisableLog:
  60. begin
  61. SetLogging(aData.Command=cmdEnableLog);
  62. Result:=true;
  63. end
  64. else
  65. Result:=False;
  66. end
  67. end;
  68. procedure TWebSocketHandlerApplication.HandleError(Sender: TObject; Error: Exception; Args: TJSFunctionArguments; var ReRaise: Boolean);
  69. begin
  70. Log(etError,'Host: Error %s calling callback with %d arguments: %s',[Error.ClassName,Args.Length,Error.Message]);
  71. ReRaise:=True;
  72. end;
  73. procedure TWebSocketHandlerApplication.HandleJSError(Sender: TObject; Error: TJSError; Args: TJSFunctionArguments; var ReRaise: Boolean
  74. );
  75. var
  76. CN : String;
  77. begin
  78. CN:=GetJSClassName(Error);
  79. Log(etError,'Host: Error %s calling callback with %d arguments: %s',[CN,Args.Length,Error.Message]);
  80. if Reraise then
  81. Raise Error;
  82. end;
  83. procedure TWebSocketHandlerApplication.dorun;
  84. begin
  85. inherited dorun;
  86. end;
  87. { TApplication }
  88. var
  89. App: TWebSocketHandlerApplication;
  90. begin
  91. App:=TWebSocketHandlerApplication.Create(nil);
  92. App.Run;
  93. end.