@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.
@@ -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
- if (requestContent === null) {
5566
- // 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).
5567
- method = RequestMethod.Get;
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 (requestURL.value.length + 1 + requestContent.length <= this._HTTPMaxURLLength) {
5571
- // append the request content to the URL, and switch to using a GET request.
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
- method = RequestMethod.Post;
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 httpResponse = await this.httpClient.request(RequestMethod[httpMethod], urlString, { headers: httpHeaders, responseType: "text", observe: "response", body: requestContent }).toPromise();
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
- return await this.GetContent(url, false, encodedBody);
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 contentStr = await CommandsProcessorManager.GetContent(this._mlsFileUrl, true);
8243
- let buffer = contentStr;
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.70';
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
- ServerConfig.Instance.Init(JSON.parse(response));
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
  }