diff --git a/packages/rtl/weborworker.pas b/packages/rtl/weborworker.pas index 0450ca6..a86f018 100644 --- a/packages/rtl/weborworker.pas +++ b/packages/rtl/weborworker.pas @@ -990,6 +990,12 @@ var Console : TJSConsole; external name 'console'; Crypto: TJSCrypto; external name 'crypto'; + function fetch(resource: String; init: TJSObject): TJSPromise; overload; external name 'fetch'; + //function fetch(resource: String): TJSPromise; overload; external name 'fetch'; + function fetch(resource: String): TJSResponse; {$IFNDEF SkipAsync}async;{$ENDIF} overload; external name 'fetch'; + function fetch(resource: TJSObject; init: TJSObject): TJSPromise; overload; external name 'fetch'; + function fetch(resource: TJSObject): TJSPromise; overload; external name 'fetch'; + implementation end. diff --git a/packages/wasi/wasienv.pas b/packages/wasi/wasienv.pas index a403005..1a2d8a0 100644 --- a/packages/wasi/wasienv.pas +++ b/packages/wasi/wasienv.pas @@ -427,10 +427,219 @@ type Property Env : TPas2JSWASIEnvironment Read FEnv; end; + TWebAssemblyStartDescriptor = record + Memory : TJSWebAssemblyMemory; + Table : TJSWebAssemblyTable; + Exported : TWASIExports; + Instance : TJSWebAssemblyInstance; + end; + + + TBeforeStartCallBack = Reference to Function (Sender : TObject; aDescriptor : TWebAssemblyStartDescriptor) : Boolean; + TAfterStartCallBack = Reference to Procedure (Sender : TObject; aDescriptor : TWebAssemblyStartDescriptor); + + TBeforeStartEvent = Procedure (Sender : TObject; aDescriptor : TWebAssemblyStartDescriptor; var aAllowRun : Boolean) of object; + TAfterStartEvent = Procedure (Sender : TObject; aDescriptor : TWebAssemblyStartDescriptor) of object; + + TConsoleReadEvent = Procedure(Sender : TObject; Var AInput : String) of object; + TConsoleWriteEvent = Procedure (Sender : TObject; aOutput : string) of object; + + { TWASIHost } + + TWASIHost = Class(TComponent) + Private + FAfterStart: TAfterStartEvent; + FBeforeStart: TBeforeStartEvent; + FEnv: TPas2JSWASIEnvironment; + FExported: TWASIExports; + FMemoryDescriptor : TJSWebAssemblyMemoryDescriptor; + FOnConsoleRead: TConsoleReadEvent; + FOnConsoleWrite: TConsoleWriteEvent; + FPredefinedConsoleInput: TStrings; + FReadLineCount : Integer; + FRunEntryFunction: String; + FTableDescriptor : TJSWebAssemblyTableDescriptor; + procedure SetPredefinedConsoleInput(AValue: TStrings); + protected + procedure DoStdRead(Sender: TObject; var AInput: string); virtual; + procedure DoStdWrite(Sender: TObject; const aOutput: String); virtual; + function CreateWebAssembly(aPath: string; aImportObject: TJSObject): TJSPromise; virtual; + Function CreateWasiEnvironment : TPas2JSWASIEnvironment; virtual; + function GetTable: TJSWebAssemblyTable; virtual; + function GetMemory: TJSWebAssemblyMemory; virtual; + public + Constructor Create(aOwner : TComponent); override; + Destructor Destroy; override; + // Load and start webassembly. If DoRun is true, then Webassembly entry point is called. + // If aBeforeStart is specified, then it is called prior to calling run, and can disable running. + // If aAfterStart is specified, then it is called after calling run. It is not called is running was disabled. + Procedure StartWebAssembly(aPath: string; DoRun : Boolean = True; aBeforeStart : TBeforeStartCallback = Nil; aAfterStart : TAfterStartCallback = Nil); + // Initial memory descriptor + Property MemoryDescriptor : TJSWebAssemblyMemoryDescriptor Read FMemoryDescriptor Write FMemoryDescriptor; + // Import/export table descriptor + Property TableDescriptor : TJSWebAssemblyTableDescriptor Read FTableDescriptor Write FTableDescriptor; + // Environment to be used + Property WasiEnvironment : TPas2JSWASIEnvironment Read FEnv; + // Exported functions. Also available in start descriptor. + Property Exported : TWASIExports Read FExported; + // Default console input + Property PredefinedConsoleInput : TStrings Read FPredefinedConsoleInput Write SetPredefinedConsoleInput; + // Name of function to run. If empty, the FPC default _start is used. + Property RunEntryFunction : String Read FRunEntryFunction Write FRunEntryFunction; + // Called after webassembly start was run. Not called if webassembly was not run. + Property AfterStart : TAfterStartEvent Read FAfterStart Write FAfterStart; + // Called before running webassembly. If aAllowRun is false, running is disabled + Property BeforeStart : TBeforeStartEvent Read FBeforeStart Write FBeforeStart; + // Called when reading from console (stdin). If not set, PredefinedConsoleinput is used. + property OnConsoleRead : TConsoleReadEvent Read FOnConsoleRead Write FOnConsoleRead; + // Called when writing to console (stdout). If not set, console.log is used. + property OnConsoleWrite : TConsoleWriteEvent Read FOnConsoleWrite Write FOnConsoleWrite; + end; + implementation uses weborworker; +{ TWASIHost } + +procedure TWASIHost.DoStdRead(Sender: TObject; var AInput: string); + +Var + S : String; +begin + S:=''; + if Assigned(FOnConsoleRead) then + FOnConsoleRead(Self,S) + else + begin + if (FReadLineCount