123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- {
- This file is part of the Free Component Library
- Webassembly Websocket API demo.
- Copyright (c) 2024 by Michael Van Canneyt [email protected]
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- program wasmwebsocket;
- {$mode objfpc}
- {$modeswitch externalclass}
- uses
- BrowserConsole, BrowserApp, WASIHostApp, JS, Classes, SysUtils, WebOrWorker, Web, wasm.pas2js.websocketapi;
- type
- THostConfig = class external name 'Object' (TJSObject)
- wasmFilename : String;
- logWebsocketAPI : Boolean;
- logWasiAPI : Boolean;
- end;
- { TMyApplication }
- TMyApplication = class(TWASIHostApplication)
- private
- FWS: TWasmWebSocketAPI;
- cbLog,
- edtFrom,
- edtTo,
- edtMessage : TJSHTMLInputElement;
- btnSend : TJSHTMLButtonElement;
- procedure HandleLogClick(aEvent: TJSEvent);
- procedure HandleSendClick(aEvent: TJSEvent);
- protected
- procedure SendMessageToWasm(aMsg : string);
- procedure DoRun; override;
- public
- constructor Create(aOwner: TComponent); override;
- end;
- var
- HostConfig : THostConfig; external name 'hostConfig';
- procedure TMyApplication.DoRun;
- var
- wasm : String;
- begin
- Terminate;
- if Assigned(HostConfig) and isString(HostConfig.wasmFilename) then
- Wasm:=HostConfig.wasmFilename
- else
- begin
- Wasm:=ParamStr(1);
- if Wasm='' then
- Wasm:='wasmwebsocketdemo.wasm';
- end;
- StartWebAssembly(wasm);
- end;
- procedure TMyApplication.HandleLogClick(aEvent : TJSEvent);
- begin
- FWS.LogApiCalls:=cbLog.Checked;
- end;
- procedure TMyApplication.HandleSendClick(aEvent : TJSEvent);
- begin
- SendMessageToWasm(edtMessage.Value);
- edtMessage.Value:='';
- edtTo.Value:='';
- end;
- procedure TMyApplication.SendMessageToWasm(aMsg: string);
- type
- TSendProcedure = procedure (Buf : Longint; BufLen : Longint);
- var
- CB : JSValue;
- CallBack : TSendProcedure absolute CB;
- Bfr : TJSUint8Array;
- Enc : TJSTextEncoder;
- Loc,lLen : Longint;
- payload : string;
- begin
- CB:=WasiEnvironment.Instance.exports_['sendmessage'];
- if isFunction(CB) then
- begin
- PayLoad:=TJSJSON.StringIfy(New(['msg',aMsg,'from',edtFrom.value,'recip',edtTo.value]));
- Enc:=TJSTextEncoder.new;
- Bfr:=Enc.encode(PayLoad);
- lLen:=Bfr.byteLength;
- Loc:=FWS.InstanceExports.AllocMem(lLen);
- WasiEnvironment.SetUTF8StringInMem(Loc,lLen,Bfr);
- CallBack(Loc,llen);
- FWS.InstanceExports.freeMem(Loc);
- end;
- end;
- constructor TMyApplication.Create(aOwner: TComponent);
- begin
- inherited Create(aOwner);
- FWS:=TWasmWebSocketAPI.Create(WasiEnvironment);
- if isDefined(hostConfig) and Assigned(hostConfig) then
- begin
- WasiEnvironment.LogAPI:=HostConfig.logWasiAPi;
- FWS.LogAPICalls:=HostConfig.logWebsocketAPI;
- end;
- edtMessage:=TJSHTMLInputElement(GetHTMLElement('edtMessage'));
- edtFrom:=TJSHTMLInputElement(GetHTMLElement('edtFrom'));
- edtTo:=TJSHTMLInputElement(GetHTMLElement('edtTo'));
- cbLog:=TJSHTMLInputElement(GetHTMLElement('cbLog'));
- cbLog.addEventListener('click',@HandleLogClick);
- cbLog.Checked:=FWS.LogAPICalls;
- btnSend:=TJSHTMLButtonElement(GetHTMLElement('btnSend'));
- btnSend.addEventListener('click',@HandleSendClick);
- end;
- var
- Application : TMyApplication;
- begin
- Application:=TMyApplication.Create(nil);
- Application.Initialize;
- Application.Run;
- end.
|