@magic-xpa/engine 4.1200.0-dev4120.70 → 4.1200.0-dev4120.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/magic-xpa-engine.mjs +98 -26
- package/fesm2022/magic-xpa-engine.mjs.map +1 -1
- package/package.json +4 -4
- package/src/ClientManager.d.ts +1 -0
- package/src/CommandsProcessorBase.d.ts +1 -1
- package/src/CommandsProcessorManager.d.ts +1 -1
- package/src/ConstInterface.d.ts +1 -0
- package/src/bridge/MagicBridge.d.ts +1 -0
- package/src/http/HttpManager.d.ts +2 -1
- package/src/http/client/HttpClientAsync.d.ts +2 -2
- package/src/http/client/HttpClientBase.d.ts +2 -2
- package/src/http/client/HttpClientSync.d.ts +1 -1
- package/src/remote/RemoteCommandsProcessor.d.ts +3 -1
@@ -515,6 +515,7 @@ class ConstInterface {
|
|
515
515
|
static RC_TOKEN_CTX_GROUP = "CTXGROUP=";
|
516
516
|
static RC_TOKEN_SESSION_COUNT = "SESSION=";
|
517
517
|
static RC_TOKEN_DATA = "DATA=";
|
518
|
+
static RC_TOKEN_TARGET_FILE = "TARGETFILE=";
|
518
519
|
static WEBCLIENT_REINITIALIZE_REQUEST = "WCREINITIALIZEREQUEST=Y";
|
519
520
|
static MAIN_PROG_VIEW = "MainProgramsDataView";
|
520
521
|
static GLOBAL_PARAM_LIST = "GlobalParamList";
|
@@ -5560,20 +5561,26 @@ class HttpClientBase {
|
|
5560
5561
|
/// </summary>
|
5561
5562
|
/// <param name="requestURL"></param>
|
5562
5563
|
/// <returns></returns>
|
5563
|
-
DecideOnRequestMethod(requestContent, requestURL) {
|
5564
|
+
DecideOnRequestMethod(requestContent, requestContentType, requestURL) {
|
5564
5565
|
let method = RequestMethod.Get;
|
5565
|
-
|
5566
|
-
|
5567
|
-
|
5568
|
-
|
5566
|
+
// the method optimizes the request method (favoring GET over POST whenever possible) for performance reasons (one roundtrip to the web server).
|
5567
|
+
if (requestContentType != null)
|
5568
|
+
// the requestContentType should be sent only for non-textual content, which can't be added to the URL of a GET request
|
5569
|
+
method = RequestMethod.Post;
|
5569
5570
|
else {
|
5570
|
-
if (
|
5571
|
-
//
|
5572
|
-
requestURL.value = requestURL.value + "?" + requestContent;
|
5571
|
+
if (requestContent === null) {
|
5572
|
+
// requestContent (== content to be sent to server) is allowed only in POST requests. In case no content is required, opt for GET (for the aforementioned performance reason).
|
5573
5573
|
method = RequestMethod.Get;
|
5574
5574
|
}
|
5575
5575
|
else {
|
5576
|
-
|
5576
|
+
if (requestURL.value.length + 1 + requestContent.length <= this._HTTPMaxURLLength) {
|
5577
|
+
// append the request content to the URL, and switch to using a GET request.
|
5578
|
+
requestURL.value = requestURL.value + "?" + requestContent;
|
5579
|
+
method = RequestMethod.Get;
|
5580
|
+
}
|
5581
|
+
else {
|
5582
|
+
method = RequestMethod.Post;
|
5583
|
+
}
|
5577
5584
|
}
|
5578
5585
|
}
|
5579
5586
|
return method;
|
@@ -5584,14 +5591,14 @@ class HttpClientBase {
|
|
5584
5591
|
/// <param name="requestURL">URL to be accessed.</param>
|
5585
5592
|
/// <param name="requestContent">content to be sent to server (relevant only for POST method - is null for other methods).</param>
|
5586
5593
|
/// <returns>response (from the server).</returns>
|
5587
|
-
async GetContent(requestURL, requestContent, useCache) {
|
5594
|
+
async GetContent(requestURL, requestContent, requestContentType, useCache) {
|
5588
5595
|
let contentFromServer = new RefParam(null);
|
5589
5596
|
let requestUrlRef = new RefParam(requestURL);
|
5590
|
-
let httpMethod = this.DecideOnRequestMethod(requestContent, requestUrlRef);
|
5597
|
+
let httpMethod = this.DecideOnRequestMethod(requestContent, requestContentType, requestUrlRef);
|
5591
5598
|
requestURL = requestUrlRef.value;
|
5592
5599
|
try {
|
5593
5600
|
// Execute the http request
|
5594
|
-
let response = await this.ExecuteHttpRequest(requestURL, requestContent, useCache, httpMethod, contentFromServer);
|
5601
|
+
let response = await this.ExecuteHttpRequest(requestURL, requestContent, requestContentType, useCache, httpMethod, contentFromServer);
|
5595
5602
|
if (response != null) {
|
5596
5603
|
Logger.Instance.WriteServerToLog("Incoming Headers : " + HttpClientBase.HeadersToString(response.headers, true));
|
5597
5604
|
// set the next session counter (which will be expected by the server in the next request).
|
@@ -5616,7 +5623,7 @@ class HttpClientBase {
|
|
5616
5623
|
/// <param name="httpMethod">enum RequestMethod to specify the method that will be used to execute the request.</param>
|
5617
5624
|
/// <param name="contentFromServer">content received from the response. [OUT]</param>
|
5618
5625
|
/// <returns></returns>
|
5619
|
-
async ExecuteHttpRequest(urlString, requestContent, useCache, httpMethod, contentFromServer) {
|
5626
|
+
async ExecuteHttpRequest(urlString, requestContent, requestContentType, useCache, httpMethod, contentFromServer) {
|
5620
5627
|
let httpResponse = null;
|
5621
5628
|
this.prepareRequest();
|
5622
5629
|
let httpCommunicationTimeoutMS = HttpClientEvents.GetHttpCommunicationTimeout();
|
@@ -5653,12 +5660,14 @@ class HttpClientBase {
|
|
5653
5660
|
}
|
5654
5661
|
let timeBeforeRequest = Misc.getSystemMilliseconds();
|
5655
5662
|
Logger.Instance.WriteServerToLog(NString.Format("Accessing (method: '{0}'): '{1}'", httpMethod, urlString));
|
5656
|
-
Logger.Instance.WriteServerToLog("Outgoing Headers : " + HttpClientBase.HeadersToString(httpHeaders, false));
|
5657
5663
|
if (httpMethod === RequestMethod.Post) {
|
5664
|
+
if (requestContentType != null)
|
5665
|
+
httpHeaders = httpHeaders.append('Content-Type', "application/octet-stream");
|
5658
5666
|
// TODO: Handle Expect100Continue.
|
5659
5667
|
// httpWebRequest.ServicePoint.Expect100Continue = this.GetHTTPExpect100Continue();
|
5660
5668
|
// this.WriteContentToRequest(requestContent, httpWebRequest);
|
5661
5669
|
}
|
5670
|
+
Logger.Instance.WriteServerToLog("Outgoing Headers : " + HttpClientBase.HeadersToString(httpHeaders, false));
|
5662
5671
|
// =============================================================================================================
|
5663
5672
|
// send the request & get the response:
|
5664
5673
|
// =============================================================================================================
|
@@ -5779,7 +5788,13 @@ class HttpClientAsync extends HttpClientBase {
|
|
5779
5788
|
return httpHeaders;
|
5780
5789
|
}
|
5781
5790
|
async sendRequestToServer(httpMethod, urlString, httpHeaders, requestContent, contentFromServer) {
|
5782
|
-
let
|
5791
|
+
let contents = requestContent;
|
5792
|
+
let responseType = "text";
|
5793
|
+
if (requestContent instanceof Uint8Array) {
|
5794
|
+
contents = requestContent.buffer;
|
5795
|
+
responseType = "arraybuffer";
|
5796
|
+
}
|
5797
|
+
let httpResponse = await this.httpClient.request(RequestMethod[httpMethod], urlString, { headers: httpHeaders, responseType: responseType, observe: "response", body: contents }).toPromise();
|
5783
5798
|
contentFromServer.value = httpResponse.body;
|
5784
5799
|
return httpResponse;
|
5785
5800
|
}
|
@@ -5868,7 +5883,7 @@ class HttpManager {
|
|
5868
5883
|
SetCommunicationsFailureHandler(handler) {
|
5869
5884
|
this.getHttpClient().CommunicationsFailureHandler = handler;
|
5870
5885
|
}
|
5871
|
-
async GetContent(requestedURL, requestContent, useCache, isError) {
|
5886
|
+
async GetContent(requestedURL, requestContent, requestContentType, useCache, isError) {
|
5872
5887
|
let response;
|
5873
5888
|
Debug.Assert(this.getHttpClient() != null);
|
5874
5889
|
// let startTime: number = Misc.getSystemMilliseconds();
|
@@ -5876,8 +5891,9 @@ class HttpManager {
|
|
5876
5891
|
Logger.Instance.WriteServerToLog("*************************************************************************************************");
|
5877
5892
|
isError.value = false;
|
5878
5893
|
Logger.Instance.WriteServerToLog(requestedURL);
|
5894
|
+
requestContent = requestContent instanceof ArrayBuffer ? this.arrayBufferToString(requestContent) : requestContent;
|
5879
5895
|
HttpManager.LogAccessToServer("", requestContent);
|
5880
|
-
response = await this.getHttpClient().GetContent(requestedURL, requestContent, useCache);
|
5896
|
+
response = await this.getHttpClient().GetContent(requestedURL, requestContent, requestContentType, useCache);
|
5881
5897
|
Debug.Assert(response !== null);
|
5882
5898
|
let errorResponse = HttpManager.CheckAndGetErrorResponse(response);
|
5883
5899
|
if (errorResponse !== null) {
|
@@ -5914,12 +5930,20 @@ class HttpManager {
|
|
5914
5930
|
// );
|
5915
5931
|
}
|
5916
5932
|
}
|
5933
|
+
// <summary>
|
5934
|
+
// Converts an ArrayBuffer to a UTF-8 encoded string.
|
5935
|
+
// </summary>
|
5936
|
+
arrayBufferToString(arrayBuffer) {
|
5937
|
+
const decoder = new TextDecoder('utf-8');
|
5938
|
+
return decoder.decode(arrayBuffer);
|
5939
|
+
}
|
5917
5940
|
/// <summary>Check if an HTTP response is an error response.
|
5918
5941
|
/// <param name="httpResponse">response returned to an HTTP request.</param>
|
5919
5942
|
/// <returns>if the response contains the error indicator - the error indicator is truncated and the remaining is returned.
|
5920
5943
|
/// otherwise - null (indicating that the 'http Response' didn't contain an error).</returns>
|
5921
5944
|
static CheckAndGetErrorResponse(httpResponse) {
|
5922
5945
|
let errorResponse = null;
|
5946
|
+
httpResponse = httpResponse instanceof ArrayBuffer ? new TextDecoder('utf-8').decode(httpResponse) : httpResponse;
|
5923
5947
|
if (httpResponse.startsWith(ConstInterface.V24_RIA_ERROR_PREFIX))
|
5924
5948
|
errorResponse = httpResponse.substr(ConstInterface.V24_RIA_ERROR_PREFIX.length);
|
5925
5949
|
return errorResponse;
|
@@ -7280,6 +7304,8 @@ class RemoteCommandsProcessor extends CommandsProcessorBase {
|
|
7280
7304
|
/// an xml/html error</summary>
|
7281
7305
|
/// <param name="response"></param>
|
7282
7306
|
HandleErrorResponse(response) {
|
7307
|
+
if (response instanceof ArrayBuffer)
|
7308
|
+
response = this.ArrayBufferToString(response);
|
7283
7309
|
try {
|
7284
7310
|
// error responses are always scrambled by the web server.
|
7285
7311
|
Logger.Instance.WriteServerMessagesToLog("MESSAGE FROM SERVER: " + response);
|
@@ -7296,17 +7322,27 @@ class RemoteCommandsProcessor extends CommandsProcessorBase {
|
|
7296
7322
|
throw new ServerError(response);
|
7297
7323
|
}
|
7298
7324
|
}
|
7325
|
+
// <summary>
|
7326
|
+
// Converts an ArrayBuffer to a UTF-8 encoded string.
|
7327
|
+
// </summary>
|
7328
|
+
ArrayBufferToString(arrayBuffer) {
|
7329
|
+
const decoder = new TextDecoder('utf-8');
|
7330
|
+
return decoder.decode(arrayBuffer);
|
7331
|
+
}
|
7299
7332
|
/// <summary>send 'encodedBody' to 'url' and receive a response.
|
7300
7333
|
/// </summary>
|
7301
7334
|
/// <param name="url">URL to be accessed.</param>
|
7302
7335
|
/// <param name="encodedBody">In case of POST, content to be sent to server. For other methods, null.</param>
|
7303
7336
|
/// <returns>the response from the server</returns>
|
7304
7337
|
async ExecuteRequest(url, encodedBody) {
|
7305
|
-
|
7338
|
+
let response = await this.GetContent(url, false, encodedBody);
|
7339
|
+
return response instanceof ArrayBuffer ? this.ArrayBufferToString(response) : response;
|
7306
7340
|
}
|
7307
|
-
async GetContent(requestedURL, useCache, requestContent) {
|
7341
|
+
async GetContent(requestedURL, useCache, requestContent, requestContentType) {
|
7308
7342
|
if (isUndefined(requestContent))
|
7309
7343
|
requestContent = null;
|
7344
|
+
if (isUndefined(requestContentType))
|
7345
|
+
requestContentType = null;
|
7310
7346
|
let responseStr;
|
7311
7347
|
try {
|
7312
7348
|
// if relative, prefix with the 'protocol://server/' from which the rich-client was activated
|
@@ -7317,7 +7353,7 @@ class RemoteCommandsProcessor extends CommandsProcessorBase {
|
|
7317
7353
|
AccessHelper.eventsManager.CheckAndShowSpinner(true);
|
7318
7354
|
});
|
7319
7355
|
let isError = new RefParam(false);
|
7320
|
-
responseStr = await HttpManager.GetInstance().GetContent(requestedURL, requestContent, useCache, isError);
|
7356
|
+
responseStr = await HttpManager.GetInstance().GetContent(requestedURL, requestContent, requestContentType, useCache, isError);
|
7321
7357
|
spinnerTimerSubscription.unsubscribe();
|
7322
7358
|
spinnerTimerSubscription = null;
|
7323
7359
|
if (isError.value) {
|
@@ -7341,6 +7377,26 @@ class RemoteCommandsProcessor extends CommandsProcessorBase {
|
|
7341
7377
|
}
|
7342
7378
|
return responseStr;
|
7343
7379
|
}
|
7380
|
+
// <summary> Upload contents to a file on server </summary>
|
7381
|
+
// <param name="serverFileName">filename to be saved on the server.</param>
|
7382
|
+
// <param name="fileContent">file content to be sent to server.</param>
|
7383
|
+
// <returns> Return status number 0(Success) , 2(Destination cannot be created) or 3(Problem uploading) </returns>
|
7384
|
+
async UploadFileToServer(fileContent, serverFileName) {
|
7385
|
+
const contentType = "application/octet-stream";
|
7386
|
+
const encodedName = HttpUtility.UrlEncode(serverFileName, Encoding.UTF8);
|
7387
|
+
const sessionID = this.SessionId;
|
7388
|
+
let queryStr = `${ConstInterface.REQ_ARG_START}${ConstInterface.RC_INDICATION}${ConstInterface.RC_TOKEN_CTX_ID}${ClientManager.Instance.GetRuntimeCtxID()}`;
|
7389
|
+
if (!isNullOrUndefined(sessionID))
|
7390
|
+
queryStr += `${ConstInterface.REQ_ARG_SEPARATOR}${ConstInterface.RC_TOKEN_SESSION_ID}${sessionID}`;
|
7391
|
+
queryStr += `${ConstInterface.REQ_ARG_SEPARATOR}${ConstInterface.RC_TOKEN_SESSION_COUNT}${this.GetSessionCounter()}${ConstInterface.REQ_ARG_SEPARATOR}${ConstInterface.RC_TOKEN_TARGET_FILE}${encodedName}`;
|
7392
|
+
const url = ServerConfig.Instance.getServerURL() + queryStr;
|
7393
|
+
let response = await this.GetContent(url, false, fileContent, contentType);
|
7394
|
+
if (response instanceof ArrayBuffer) {
|
7395
|
+
let uInt8Array = new Uint8Array(response);
|
7396
|
+
return uInt8Array[0];
|
7397
|
+
}
|
7398
|
+
return response;
|
7399
|
+
}
|
7344
7400
|
ClientActivated() {
|
7345
7401
|
// log the values as client is active again
|
7346
7402
|
// TODO - formatting
|
@@ -8150,6 +8206,7 @@ class LanguageData {
|
|
8150
8206
|
msgsInCommentString = this._constMessagesContent;
|
8151
8207
|
}
|
8152
8208
|
if (msgsInCommentString != null) {
|
8209
|
+
msgsInCommentString = msgsInCommentString instanceof ArrayBuffer ? new TextDecoder('utf-8').decode(msgsInCommentString) : msgsInCommentString;
|
8153
8210
|
// ignore the comment wrapper
|
8154
8211
|
let startData = msgsInCommentString.indexOf(START_TAG);
|
8155
8212
|
let endData = msgsInCommentString.indexOf(END_TAG) + END_TAG.length;
|
@@ -8239,8 +8296,8 @@ class LanguageData {
|
|
8239
8296
|
else if (this._mlsFileUrl != null) {
|
8240
8297
|
if (this._mlsFileUrl.startsWith("./"))
|
8241
8298
|
this._mlsFileUrl = NString.Replace(this._mlsFileUrl, './', ClientManager.GetAssetsURL() + '/cache/');
|
8242
|
-
let
|
8243
|
-
|
8299
|
+
let buffer = await CommandsProcessorManager.GetContent(this._mlsFileUrl, true);
|
8300
|
+
buffer = buffer instanceof ArrayBuffer ? new TextDecoder('utf-8').decode(buffer) : buffer;
|
8244
8301
|
if (buffer != null && buffer.length > 0) {
|
8245
8302
|
let contentLen = buffer.length;
|
8246
8303
|
this._mlsStrings = new Hashtable();
|
@@ -11263,6 +11320,7 @@ class Environment {
|
|
11263
11320
|
case ConstInterface.MG_TAG_KBDMAP_URL:
|
11264
11321
|
break;
|
11265
11322
|
case ConstInterface.MG_TAG_ENV_PARAM_URL:
|
11323
|
+
Content = Content instanceof ArrayBuffer ? new TextDecoder('utf-8').decode(Content) : Content;
|
11266
11324
|
let innerXmlParser = new XmlParser(Content);
|
11267
11325
|
while (AccessHelper.envParamsTable.mirrorFromXML(innerXmlParser.getNextTag(), innerXmlParser)) {
|
11268
11326
|
}
|
@@ -27154,6 +27212,7 @@ class TableCacheManager {
|
|
27154
27212
|
try {
|
27155
27213
|
let residentTableContentStr = await server.GetContent(tableUId, true);
|
27156
27214
|
try {
|
27215
|
+
residentTableContentStr = residentTableContentStr instanceof ArrayBuffer ? new TextDecoder('utf-8').decode(residentTableContentStr) : residentTableContentStr;
|
27157
27216
|
RuntimeContextBase.Instance.Parser.loadTableCacheData(residentTableContentStr);
|
27158
27217
|
}
|
27159
27218
|
catch (innerException) {
|
@@ -32789,6 +32848,7 @@ class Task extends TaskBase {
|
|
32789
32848
|
if (taskCacheURL.startsWith("./"))
|
32790
32849
|
taskCacheURL = NString.Replace(taskCacheURL, './', ClientManager.GetAssetsURL() + '/cache/');
|
32791
32850
|
taskContentOriginal = await Task.CommandsProcessor.GetContent(taskCacheURL, true);
|
32851
|
+
taskContentOriginal = taskContentOriginal instanceof ArrayBuffer ? new TextDecoder('utf-8').decode(taskContentOriginal) : taskContentOriginal;
|
32792
32852
|
}
|
32793
32853
|
// prefix the original data till the start of the current <taskURL>
|
32794
32854
|
let taskContentFinal = new StringBuilder(xmlData.substr(0, RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1)), taskContentOriginal.length);
|
@@ -39284,7 +39344,7 @@ class CommandsTable {
|
|
39284
39344
|
}
|
39285
39345
|
}
|
39286
39346
|
|
39287
|
-
let CurrentClientVersion = '4.1200.0-dev4120.
|
39347
|
+
let CurrentClientVersion = '4.1200.0-dev4120.72';
|
39288
39348
|
|
39289
39349
|
// @dynamic
|
39290
39350
|
class ClientManager {
|
@@ -39632,13 +39692,19 @@ class ClientManager {
|
|
39632
39692
|
/// </summary>
|
39633
39693
|
async LoadExecutionProps() {
|
39634
39694
|
// return true, if successfully loaded.
|
39635
|
-
let response =
|
39695
|
+
let response = null;
|
39636
39696
|
let succeeded = true;
|
39637
39697
|
try {
|
39638
39698
|
// isError cannot be true here, because it is returned by runtime engine and to read execution properties, we do not reach the engine.
|
39639
39699
|
let isError = new RefParam(false);
|
39640
|
-
response = await HttpManager.GetInstance().GetContent(ClientManager._executionPropertiesFileName, null, false, isError);
|
39641
|
-
|
39700
|
+
response = await HttpManager.GetInstance().GetContent(ClientManager._executionPropertiesFileName, null, null, false, isError);
|
39701
|
+
if (response instanceof ArrayBuffer) {
|
39702
|
+
const decoder = new TextDecoder('utf-8');
|
39703
|
+
ServerConfig.Instance.Init(JSON.parse(decoder.decode(response)));
|
39704
|
+
}
|
39705
|
+
else {
|
39706
|
+
ServerConfig.Instance.Init(JSON.parse(response));
|
39707
|
+
}
|
39642
39708
|
let assetsURL = ServerConfig.Instance.getAssetsURL();
|
39643
39709
|
if (assetsURL !== null) {
|
39644
39710
|
ClientManager.assetsURL = assetsURL;
|
@@ -39672,6 +39738,9 @@ class ClientManager {
|
|
39672
39738
|
}
|
39673
39739
|
return pic;
|
39674
39740
|
}
|
39741
|
+
static UploadFileToServer(fileContent, serverFileName) {
|
39742
|
+
return RemoteCommandsProcessor.GetInstance().UploadFileToServer(fileContent, serverFileName);
|
39743
|
+
}
|
39675
39744
|
/// <summary>
|
39676
39745
|
/// Get formatted value
|
39677
39746
|
/// </summary>
|
@@ -39819,6 +39888,9 @@ class MagicBridge {
|
|
39819
39888
|
static GetControlPictureMask(taskId, controlName) {
|
39820
39889
|
return ClientManager.GetControlPictureMask(taskId, controlName);
|
39821
39890
|
}
|
39891
|
+
static UploadFileToServer(fileContent, serverFileName) {
|
39892
|
+
return ClientManager.UploadFileToServer(fileContent, serverFileName);
|
39893
|
+
}
|
39822
39894
|
static GetFormattedValue(taskId, controlName, value, rowId) {
|
39823
39895
|
return ClientManager.GetFormattedValue(taskId, controlName, value, rowId);
|
39824
39896
|
}
|