mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-09-13 21:09:28 +02:00
* TWorkerApplication object
This commit is contained in:
parent
202aac25ee
commit
f6d89a5cb6
155
packages/fcl-base/src/workerapp.pas
Normal file
155
packages/fcl-base/src/workerapp.pas
Normal file
@ -0,0 +1,155 @@
|
||||
unit workerapp;
|
||||
|
||||
{$mode ObjFPC}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, CustApp, WebOrWorker, WebWorker, Rtl.WorkerCommands;
|
||||
|
||||
Type
|
||||
|
||||
{ TWorkerApplication }
|
||||
|
||||
TWorkerApplication = class(TCustomApplication)
|
||||
Private
|
||||
FSendOutputToBrowser: Boolean;
|
||||
FConsoleChannel: TJSBroadcastChannel;
|
||||
FSendOutputToConsole: Boolean;
|
||||
protected
|
||||
procedure DoLog(EventType: TEventType; const Msg: String); override;
|
||||
Public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
procedure ShowException(aError: Exception); override;
|
||||
function GetConsoleApplication: boolean; override;
|
||||
function GetLocation: String; override;
|
||||
// Send output to browser window process?
|
||||
Property SendOutputToBrowser : Boolean Read FSendOutputToBrowser Write FSendOutputToBrowser;
|
||||
// Send output to console ?
|
||||
Property SendOutputToConsole : Boolean Read FSendOutputToConsole Write FSendOutputToConsole;
|
||||
// Default console input
|
||||
// Send a command to the process that started the worker.
|
||||
procedure SendCommand(aCommand: TCustomWorkerCommand);
|
||||
// Get the list of environment variables.
|
||||
procedure GetEnvironmentList(List: TStrings; NamesOnly: Boolean); override;
|
||||
// Console channel
|
||||
property ConsoleChannel : TJSBroadCastChannel Read FConsoleChannel;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses typinfo, js, types;
|
||||
|
||||
var
|
||||
EnvNames: TJSObject;
|
||||
|
||||
procedure ReloadEnvironmentStrings;
|
||||
|
||||
var
|
||||
I : Integer;
|
||||
S,N : String;
|
||||
A,P : TStringDynArray;
|
||||
|
||||
begin
|
||||
if Assigned(EnvNames) then
|
||||
FreeAndNil(EnvNames);
|
||||
EnvNames:=TJSObject.new;
|
||||
S:=self_.Location.search;
|
||||
S:=Copy(S,2,Length(S)-1);
|
||||
A:=TJSString(S).split('&');
|
||||
for I:=0 to Length(A)-1 do
|
||||
begin
|
||||
P:=TJSString(A[i]).split('=');
|
||||
N:=LowerCase(decodeURIComponent(P[0]));
|
||||
if Length(P)=2 then
|
||||
EnvNames[N]:=decodeURIComponent(P[1])
|
||||
else if Length(P)=1 then
|
||||
EnvNames[N]:=''
|
||||
end;
|
||||
end;
|
||||
|
||||
function MyGetEnvironmentVariable(Const EnvVar: String): String;
|
||||
|
||||
Var
|
||||
aName : String;
|
||||
|
||||
begin
|
||||
aName:=Lowercase(EnvVar);
|
||||
if EnvNames.hasOwnProperty(aName) then
|
||||
Result:=String(EnvNames[aName])
|
||||
else
|
||||
Result:='';
|
||||
end;
|
||||
|
||||
function MyGetEnvironmentVariableCount: Integer;
|
||||
begin
|
||||
Result:=length(TJSOBject.getOwnPropertyNames(envNames));
|
||||
end;
|
||||
|
||||
function MyGetEnvironmentString(Index: Integer): String;
|
||||
begin
|
||||
Result:=String(EnvNames[TJSOBject.getOwnPropertyNames(envNames)[Index]]);
|
||||
end;
|
||||
|
||||
|
||||
constructor TWorkerApplication.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FConsoleChannel:=TJSBroadcastChannel.new(channelConsole);
|
||||
FSendOutputToConsole:=true;
|
||||
end;
|
||||
|
||||
procedure TWorkerApplication.ShowException(aError: Exception);
|
||||
Var
|
||||
Ex : TWorkerExceptionCommand;
|
||||
|
||||
begin
|
||||
Ex:=TWorkerExceptionCommand.Create(aError.ClassName,aError.Message);
|
||||
SendCommand(Ex);
|
||||
end;
|
||||
|
||||
function TWorkerApplication.GetConsoleApplication: boolean;
|
||||
begin
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
function TWorkerApplication.GetLocation: String;
|
||||
begin
|
||||
Result:={$IFDEF FPC_DOTTEDUNITS}BrowserApi.Worker.{$ELSE}WebWorker.{$ENDIF}Location.pathname;
|
||||
end;
|
||||
|
||||
procedure TWorkerApplication.SendCommand(aCommand: TCustomWorkerCommand);
|
||||
begin
|
||||
TCommandDispatcher.Instance.SendCommand(aCommand);
|
||||
end;
|
||||
|
||||
procedure TWorkerApplication.GetEnvironmentList(List: TStrings; NamesOnly: Boolean);
|
||||
var
|
||||
Names: TStringDynArray;
|
||||
i: Integer;
|
||||
begin
|
||||
Names:=TJSObject.getOwnPropertyNames(EnvNames);
|
||||
for i:=0 to length(Names)-1 do
|
||||
begin
|
||||
if NamesOnly then
|
||||
List.Add(Names[i])
|
||||
else
|
||||
List.Add(Names[i]+'='+String(EnvNames[Names[i]]));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TWorkerApplication.DoLog(EventType: TEventType; const Msg: String);
|
||||
var
|
||||
S : String;
|
||||
begin
|
||||
S:=GetEnumName(TypeInfo(TEventType),Ord(EventType));
|
||||
ConsoleChannel.PostMessage(TConsoleOutputCommand.Create(Format('[%s] %s',[S,Msg])));
|
||||
end;
|
||||
|
||||
initialization
|
||||
ReloadEnvironmentStrings;
|
||||
OnGetEnvironmentVariable:=@MyGetEnvironmentVariable;
|
||||
OnGetEnvironmentVariableCount:=@MyGetEnvironmentVariableCount;
|
||||
OnGetEnvironmentString:=@MyGetEnvironmentString;
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user