@magic-xpa/engine 4.1100.0-dev4110.26 → 4.1100.0-dev4110.260

Sign up to get free protection for your applications and to get access to all the features.
Files changed (491) hide show
  1. package/{esm2020 → esm2022}/index.mjs +188 -188
  2. package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
  3. package/esm2022/src/AccessHelper.mjs +15 -0
  4. package/esm2022/src/ClientManager.mjs +418 -0
  5. package/esm2022/src/CommandsProcessorBase.mjs +56 -0
  6. package/{esm2020 → esm2022}/src/CommandsProcessorManager.mjs +25 -25
  7. package/esm2022/src/CommandsTable.mjs +162 -0
  8. package/esm2022/src/ConstInterface.mjs +517 -0
  9. package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
  10. package/esm2022/src/FlowMonitorInterface.mjs +16 -0
  11. package/esm2022/src/GUIManager.mjs +62 -0
  12. package/esm2022/src/GlobalCommandsManager.mjs +34 -0
  13. package/esm2022/src/GuiEventsProcessor.mjs +156 -0
  14. package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
  15. package/esm2022/src/ServerConfig.mjs +122 -0
  16. package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
  17. package/esm2022/src/bridge/MagicBridge.mjs +41 -0
  18. package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
  19. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
  20. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
  21. package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
  22. package/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +26 -0
  23. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
  24. package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +59 -59
  25. package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +29 -0
  26. package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +261 -0
  27. package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
  28. package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +26 -0
  29. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +24 -21
  30. package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +23 -20
  31. package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
  32. package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
  33. package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
  34. package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +40 -0
  35. package/{esm2020 → esm2022}/src/commands/ClientToServer/EventCommand.mjs +43 -40
  36. package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +70 -0
  37. package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +25 -0
  38. package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
  39. package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
  40. package/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +24 -0
  41. package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +26 -0
  42. package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +26 -23
  43. package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
  44. package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +30 -0
  45. package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +30 -0
  46. package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +27 -0
  47. package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +43 -0
  48. package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +19 -0
  49. package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
  50. package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +24 -0
  51. package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +27 -0
  52. package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +34 -0
  53. package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +18 -15
  54. package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
  55. package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
  56. package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
  57. package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
  58. package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +2 -2
  59. package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
  60. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
  61. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddRangeCommand.mjs +62 -62
  62. package/{esm2020 → esm2022}/src/commands/ServerToClient/AddSortCommand.mjs +33 -33
  63. package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
  64. package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
  65. package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
  66. package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
  67. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
  68. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
  69. package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
  70. package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
  71. package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
  72. package/{esm2020 → esm2022}/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -132
  73. package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
  74. package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
  75. package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
  76. package/esm2022/src/data/DataView.mjs +1613 -0
  77. package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
  78. package/esm2022/src/data/DataviewManager.mjs +28 -0
  79. package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
  80. package/esm2022/src/data/DvCache.mjs +67 -0
  81. package/esm2022/src/data/Field.mjs +646 -0
  82. package/esm2022/src/data/FieldBase.mjs +15 -0
  83. package/esm2022/src/data/FieldsTable.mjs +103 -0
  84. package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
  85. package/{esm2020 → esm2022}/src/data/Key.mjs +88 -88
  86. package/esm2022/src/data/Record.mjs +880 -0
  87. package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
  88. package/esm2022/src/data/RecordsTable.mjs +267 -0
  89. package/{esm2020 → esm2022}/src/data/TaskTransactionManager.mjs +107 -103
  90. package/{esm2020 → esm2022}/src/data/XMLBasedDcValuesBuilder.mjs +74 -74
  91. package/{esm2020 → esm2022}/src/enums.mjs +23 -23
  92. package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
  93. package/esm2022/src/env/Environment.mjs +487 -0
  94. package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
  95. package/esm2022/src/env/LanguageData.mjs +227 -0
  96. package/{esm2020 → esm2022}/src/env/MirrorString.mjs +65 -65
  97. package/esm2022/src/event/ActionManager.mjs +91 -0
  98. package/esm2022/src/event/Event.mjs +1333 -0
  99. package/esm2022/src/event/EventHandler.mjs +766 -0
  100. package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
  101. package/esm2022/src/event/EventsManager.mjs +2988 -0
  102. package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
  103. package/esm2022/src/event/RunTimeEvent.mjs +399 -0
  104. package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
  105. package/esm2022/src/event/UserEventsTable.mjs +47 -0
  106. package/esm2022/src/exp/ExpTable.mjs +57 -0
  107. package/esm2022/src/exp/Expression.mjs +200 -0
  108. package/esm2022/src/exp/ExpressionDict.mjs +727 -0
  109. package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
  110. package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
  111. package/{esm2020 → esm2022}/src/exp/GlobalParamsTable.mjs +85 -85
  112. package/esm2022/src/exp/YesNoExp.mjs +36 -0
  113. package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
  114. package/esm2022/src/gui/FormsTable.mjs +66 -0
  115. package/esm2022/src/gui/MgControl.mjs +363 -0
  116. package/esm2022/src/gui/MgForm.mjs +1224 -0
  117. package/esm2022/src/http/HttpManager.mjs +97 -0
  118. package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
  119. package/{esm2020 → esm2022}/src/http/client/HttpClientBase.mjs +132 -132
  120. package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
  121. package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
  122. package/esm2022/src/http/client/HttpUtility.mjs +84 -0
  123. package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
  124. package/{esm2020 → esm2022}/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -18
  125. package/{esm2020 → esm2022}/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -18
  126. package/{esm2020 → esm2022}/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -18
  127. package/esm2022/src/remote/RemoteCommandsProcessor.mjs +883 -0
  128. package/{esm2020 → esm2022}/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -25
  129. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandBase.mjs +24 -24
  130. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandFactory.mjs +60 -60
  131. package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
  132. package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
  133. package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
  134. package/{esm2020 → esm2022}/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +16 -16
  135. package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
  136. package/{esm2020 → esm2022}/src/remote/ResetUserSortRemoteDataviewCommand.mjs +15 -15
  137. package/esm2022/src/remote/ServerError.mjs +40 -0
  138. package/{esm2020 → esm2022}/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +19 -19
  139. package/esm2022/src/rt/Argument.mjs +265 -0
  140. package/esm2022/src/rt/ArgumentsList.mjs +103 -0
  141. package/esm2022/src/rt/Boundary.mjs +152 -0
  142. package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
  143. package/esm2022/src/rt/DataviewHeaderBase.mjs +98 -0
  144. package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
  145. package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
  146. package/{esm2020 → esm2022}/src/rt/DataviewHeadersSaxHandler.mjs +38 -38
  147. package/{esm2020 → esm2022}/src/rt/ExecutionStack.mjs +94 -94
  148. package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
  149. package/{esm2020 → esm2022}/src/rt/HandlersTable.mjs +96 -96
  150. package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
  151. package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
  152. package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
  153. package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
  154. package/esm2022/src/rt/Operation.mjs +735 -0
  155. package/esm2022/src/rt/OperationTable.mjs +67 -0
  156. package/esm2022/src/rt/Recompute.mjs +355 -0
  157. package/{esm2020 → esm2022}/src/rt/RecomputeTable.mjs +62 -62
  158. package/{esm2020 → esm2022}/src/rt/RemoteDataviewHeader.mjs +108 -108
  159. package/esm2022/src/rt/ResultValue.mjs +10 -0
  160. package/esm2022/src/rt/TableCache.mjs +177 -0
  161. package/esm2022/src/rt/TableCacheManager.mjs +67 -0
  162. package/esm2022/src/rt/Transaction.mjs +53 -0
  163. package/esm2022/src/security/UserDetails.mjs +71 -0
  164. package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
  165. package/esm2022/src/tasks/MGData.mjs +552 -0
  166. package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
  167. package/esm2022/src/tasks/RCTimer.mjs +63 -0
  168. package/{esm2020 → esm2022}/src/tasks/RemoteTaskService.mjs +44 -44
  169. package/esm2022/src/tasks/Task.mjs +2499 -0
  170. package/esm2022/src/tasks/TaskBase.mjs +83 -0
  171. package/{esm2020 → esm2022}/src/tasks/TaskServiceBase.mjs +24 -24
  172. package/esm2022/src/tasks/TasksTable.mjs +80 -0
  173. package/esm2022/src/tasks/sort/Sort.mjs +5 -0
  174. package/{esm2020 → esm2022}/src/tasks/sort/SortCollection.mjs +67 -67
  175. package/{esm2020 → esm2022}/src/util/ConstUtils.mjs +13 -13
  176. package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
  177. package/{esm2020 → esm2022}/src/util/HeapSort.mjs +69 -69
  178. package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
  179. package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
  180. package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
  181. package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
  182. package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
  183. package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
  184. package/esm2022/src/util/PrmMap.mjs +152 -0
  185. package/esm2022/src/util/ReturnResult.mjs +46 -0
  186. package/esm2022/src/util/ReturnResultBase.mjs +18 -0
  187. package/esm2022/src/util/Scrambler.mjs +89 -0
  188. package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
  189. package/{esm2020 → esm2022}/src/util/cookie.service.mjs +91 -91
  190. package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29885 -29693
  191. package/fesm2022/magic-xpa-engine.mjs.map +1 -0
  192. package/index.d.ts +187 -187
  193. package/package.json +8 -14
  194. package/src/AccessHelper.d.ts +20 -20
  195. package/src/ClientManager.d.ts +35 -32
  196. package/src/CommandsProcessorBase.d.ts +23 -23
  197. package/src/CommandsProcessorManager.d.ts +6 -6
  198. package/src/CommandsTable.d.ts +22 -22
  199. package/src/ConstInterface.d.ts +516 -515
  200. package/src/CurrentClientVersion.d.ts +1 -1
  201. package/src/FlowMonitorInterface.d.ts +15 -15
  202. package/src/GUIManager.d.ts +17 -17
  203. package/src/GlobalCommandsManager.d.ts +17 -17
  204. package/src/GuiEventsProcessor.d.ts +24 -24
  205. package/src/ICommandsTable.d.ts +9 -9
  206. package/src/ServerConfig.d.ts +35 -34
  207. package/src/bridge/IGuiEvent.d.ts +19 -19
  208. package/src/bridge/MagicBridge.d.ts +16 -16
  209. package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
  210. package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
  211. package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
  212. package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
  213. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +9 -8
  214. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
  215. package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
  216. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +11 -10
  217. package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
  218. package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
  219. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +9 -8
  220. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +8 -7
  221. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +8 -7
  222. package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
  223. package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
  224. package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
  225. package/src/commands/ClientToServer/EvaluateCommand.d.ts +16 -15
  226. package/src/commands/ClientToServer/EventCommand.d.ts +16 -15
  227. package/src/commands/ClientToServer/ExecOperCommand.d.ts +24 -23
  228. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +9 -8
  229. package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
  230. package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
  231. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +9 -8
  232. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +11 -10
  233. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +9 -8
  234. package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
  235. package/src/commands/ClientToServer/RecomputeCommand.d.ts +12 -11
  236. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +13 -12
  237. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +11 -10
  238. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +15 -14
  239. package/src/commands/ClientToServer/SelectProgramCommand.d.ts +7 -6
  240. package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
  241. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +9 -8
  242. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +10 -9
  243. package/src/commands/ClientToServer/TransactionCommand.d.ts +14 -12
  244. package/src/commands/ClientToServer/UnloadCommand.d.ts +8 -7
  245. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
  246. package/src/commands/DataViewCommandBase.d.ts +6 -6
  247. package/src/commands/IClientCommand.d.ts +2 -2
  248. package/src/commands/IClientTargetedCommand.d.ts +12 -12
  249. package/src/commands/IClientToServerCommandInfo.d.ts +4 -3
  250. package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
  251. package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
  252. package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
  253. package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
  254. package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
  255. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
  256. package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
  257. package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
  258. package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
  259. package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
  260. package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
  261. package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
  262. package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
  263. package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
  264. package/src/communications/IConnectionStateManager.d.ts +4 -4
  265. package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
  266. package/src/data/DataSourceIdKey.d.ts +2 -2
  267. package/src/data/DataView.d.ts +162 -162
  268. package/src/data/DataViewBase.d.ts +12 -12
  269. package/src/data/DataviewManager.d.ts +14 -14
  270. package/src/data/DataviewManagerBase.d.ts +11 -11
  271. package/src/data/DvCache.d.ts +15 -15
  272. package/src/data/Field.d.ts +103 -103
  273. package/src/data/FieldBase.d.ts +23 -23
  274. package/src/data/FieldsTable.d.ts +27 -27
  275. package/src/data/IRecordsTable.d.ts +7 -7
  276. package/src/data/Key.d.ts +15 -15
  277. package/src/data/Record.d.ts +157 -156
  278. package/src/data/RecordOutOfDataViewException.d.ts +10 -10
  279. package/src/data/RecordsTable.d.ts +38 -38
  280. package/src/data/TaskTransactionManager.d.ts +17 -17
  281. package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
  282. package/src/enums.d.ts +21 -21
  283. package/src/env/EnvVariablesTable.d.ts +17 -17
  284. package/src/env/Environment.d.ts +118 -118
  285. package/src/env/ILanguageData.d.ts +3 -3
  286. package/src/env/LanguageData.d.ts +20 -20
  287. package/src/env/MirrorString.d.ts +15 -15
  288. package/src/event/ActionManager.d.ts +14 -14
  289. package/src/event/Event.d.ts +79 -79
  290. package/src/event/EventHandler.d.ts +66 -66
  291. package/src/event/EventHandlerPosition.d.ts +25 -25
  292. package/src/event/EventsManager.d.ts +205 -204
  293. package/src/event/IEventsManager.d.ts +77 -77
  294. package/src/event/RunTimeEvent.d.ts +126 -123
  295. package/src/event/RunTimeEventBase.d.ts +5 -5
  296. package/src/event/UserEventsTable.d.ts +11 -11
  297. package/src/exp/ExpTable.d.ts +11 -11
  298. package/src/exp/Expression.d.ts +37 -37
  299. package/src/exp/ExpressionDict.d.ts +12 -12
  300. package/src/exp/ExpressionEvaluator.d.ts +198 -198
  301. package/src/exp/ExpressionLocalJpn.d.ts +18 -18
  302. package/src/exp/GlobalParamsTable.d.ts +19 -19
  303. package/src/exp/YesNoExp.d.ts +9 -9
  304. package/src/gui/CreatedFormVector.d.ts +10 -10
  305. package/src/gui/FormsTable.d.ts +15 -15
  306. package/src/gui/MgControl.d.ts +60 -60
  307. package/src/gui/MgForm.d.ts +96 -93
  308. package/src/http/HttpManager.d.ts +25 -25
  309. package/src/http/client/HttpClientAsync.d.ts +16 -16
  310. package/src/http/client/HttpClientBase.d.ts +30 -30
  311. package/src/http/client/HttpClientEvents.d.ts +18 -18
  312. package/src/http/client/HttpClientSync.d.ts +17 -17
  313. package/src/http/client/HttpUtility.d.ts +10 -10
  314. package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
  315. package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
  316. package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
  317. package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
  318. package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
  319. package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
  320. package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
  321. package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
  322. package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
  323. package/src/remote/RemoteDataviewManager.d.ts +9 -9
  324. package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
  325. package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
  326. package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
  327. package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
  328. package/src/remote/ServerError.d.ts +16 -16
  329. package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
  330. package/src/rt/Argument.d.ts +36 -36
  331. package/src/rt/ArgumentsList.d.ts +24 -24
  332. package/src/rt/Boundary.d.ts +27 -27
  333. package/src/rt/CompMainPrgTable.d.ts +10 -10
  334. package/src/rt/DataviewHeaderBase.d.ts +34 -34
  335. package/src/rt/DataviewHeaderFactory.d.ts +5 -5
  336. package/src/rt/DataviewHeaders.d.ts +12 -12
  337. package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
  338. package/src/rt/ExecutionStack.d.ts +22 -22
  339. package/src/rt/ExecutionStackEntry.d.ts +7 -7
  340. package/src/rt/HandlersTable.d.ts +19 -19
  341. package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
  342. package/src/rt/IDataviewHeader.d.ts +10 -10
  343. package/src/rt/IResultValue.d.ts +4 -4
  344. package/src/rt/LastFocusedManager.d.ts +23 -23
  345. package/src/rt/Operation.d.ts +97 -97
  346. package/src/rt/OperationTable.d.ts +15 -15
  347. package/src/rt/Recompute.d.ts +41 -41
  348. package/src/rt/RecomputeTable.d.ts +9 -9
  349. package/src/rt/RemoteDataviewHeader.d.ts +14 -14
  350. package/src/rt/ResultValue.d.ts +7 -7
  351. package/src/rt/TableCache.d.ts +29 -29
  352. package/src/rt/TableCacheManager.d.ts +10 -10
  353. package/src/rt/Transaction.d.ts +23 -23
  354. package/src/security/UserDetails.d.ts +16 -16
  355. package/src/tasks/IMGDataCollection.d.ts +26 -26
  356. package/src/tasks/MGData.d.ts +63 -63
  357. package/src/tasks/MGDataCollection.d.ts +42 -42
  358. package/src/tasks/RCTimer.d.ts +13 -13
  359. package/src/tasks/RemoteTaskService.d.ts +16 -16
  360. package/src/tasks/Task.d.ts +312 -312
  361. package/src/tasks/TaskBase.d.ts +123 -123
  362. package/src/tasks/TaskServiceBase.d.ts +16 -16
  363. package/src/tasks/TasksTable.d.ts +21 -21
  364. package/src/tasks/sort/Sort.d.ts +4 -4
  365. package/src/tasks/sort/SortCollection.d.ts +11 -11
  366. package/src/util/ConstUtils.d.ts +3 -3
  367. package/src/util/FlowMonitorQueue.d.ts +70 -70
  368. package/src/util/HeapSort.d.ts +6 -6
  369. package/src/util/IMirrorXML.d.ts +6 -6
  370. package/src/util/IServerConfig.d.ts +11 -11
  371. package/src/util/MgBlockingQueue.d.ts +5 -5
  372. package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
  373. package/src/util/MgPriorityQueue.d.ts +13 -13
  374. package/src/util/ParamParseResult.d.ts +6 -6
  375. package/src/util/PrmMap.d.ts +28 -28
  376. package/src/util/ReturnResult.d.ts +18 -18
  377. package/src/util/ReturnResultBase.d.ts +11 -11
  378. package/src/util/Scrambler.d.ts +10 -10
  379. package/src/util/UniqueIDUtils.d.ts +4 -4
  380. package/src/util/cookie.service.d.ts +8 -8
  381. package/esm2020/src/AccessHelper.mjs +0 -9
  382. package/esm2020/src/ClientManager.mjs +0 -399
  383. package/esm2020/src/CommandsProcessorBase.mjs +0 -58
  384. package/esm2020/src/CommandsTable.mjs +0 -162
  385. package/esm2020/src/ConstInterface.mjs +0 -516
  386. package/esm2020/src/FlowMonitorInterface.mjs +0 -16
  387. package/esm2020/src/GUIManager.mjs +0 -62
  388. package/esm2020/src/GlobalCommandsManager.mjs +0 -34
  389. package/esm2020/src/GuiEventsProcessor.mjs +0 -154
  390. package/esm2020/src/ServerConfig.mjs +0 -117
  391. package/esm2020/src/bridge/MagicBridge.mjs +0 -41
  392. package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
  393. package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +0 -23
  394. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -26
  395. package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
  396. package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
  397. package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -23
  398. package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
  399. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
  400. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
  401. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
  402. package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -21
  403. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
  404. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
  405. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
  406. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
  407. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
  408. package/esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs +0 -15
  409. package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -21
  410. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
  411. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
  412. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
  413. package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
  414. package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
  415. package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
  416. package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
  417. package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
  418. package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
  419. package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
  420. package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
  421. package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
  422. package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
  423. package/esm2020/src/data/DataView.mjs +0 -1610
  424. package/esm2020/src/data/DataviewManager.mjs +0 -28
  425. package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
  426. package/esm2020/src/data/DvCache.mjs +0 -67
  427. package/esm2020/src/data/Field.mjs +0 -646
  428. package/esm2020/src/data/FieldBase.mjs +0 -18
  429. package/esm2020/src/data/FieldsTable.mjs +0 -103
  430. package/esm2020/src/data/Record.mjs +0 -846
  431. package/esm2020/src/data/RecordsTable.mjs +0 -267
  432. package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
  433. package/esm2020/src/env/Environment.mjs +0 -489
  434. package/esm2020/src/env/LanguageData.mjs +0 -226
  435. package/esm2020/src/event/ActionManager.mjs +0 -91
  436. package/esm2020/src/event/Event.mjs +0 -1333
  437. package/esm2020/src/event/EventHandler.mjs +0 -766
  438. package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
  439. package/esm2020/src/event/EventsManager.mjs +0 -2975
  440. package/esm2020/src/event/RunTimeEvent.mjs +0 -392
  441. package/esm2020/src/event/UserEventsTable.mjs +0 -47
  442. package/esm2020/src/exp/ExpTable.mjs +0 -59
  443. package/esm2020/src/exp/Expression.mjs +0 -200
  444. package/esm2020/src/exp/ExpressionDict.mjs +0 -727
  445. package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
  446. package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
  447. package/esm2020/src/exp/YesNoExp.mjs +0 -36
  448. package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
  449. package/esm2020/src/gui/FormsTable.mjs +0 -66
  450. package/esm2020/src/gui/MgControl.mjs +0 -353
  451. package/esm2020/src/gui/MgForm.mjs +0 -1181
  452. package/esm2020/src/http/HttpManager.mjs +0 -97
  453. package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
  454. package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
  455. package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
  456. package/esm2020/src/http/client/HttpUtility.mjs +0 -84
  457. package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
  458. package/esm2020/src/remote/ServerError.mjs +0 -40
  459. package/esm2020/src/rt/Argument.mjs +0 -265
  460. package/esm2020/src/rt/ArgumentsList.mjs +0 -103
  461. package/esm2020/src/rt/Boundary.mjs +0 -152
  462. package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
  463. package/esm2020/src/rt/DataviewHeaderBase.mjs +0 -96
  464. package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
  465. package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
  466. package/esm2020/src/rt/Operation.mjs +0 -735
  467. package/esm2020/src/rt/OperationTable.mjs +0 -67
  468. package/esm2020/src/rt/Recompute.mjs +0 -355
  469. package/esm2020/src/rt/ResultValue.mjs +0 -12
  470. package/esm2020/src/rt/TableCache.mjs +0 -177
  471. package/esm2020/src/rt/TableCacheManager.mjs +0 -67
  472. package/esm2020/src/rt/Transaction.mjs +0 -53
  473. package/esm2020/src/security/UserDetails.mjs +0 -71
  474. package/esm2020/src/tasks/MGData.mjs +0 -552
  475. package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
  476. package/esm2020/src/tasks/RCTimer.mjs +0 -63
  477. package/esm2020/src/tasks/Task.mjs +0 -2495
  478. package/esm2020/src/tasks/TaskBase.mjs +0 -87
  479. package/esm2020/src/tasks/TasksTable.mjs +0 -80
  480. package/esm2020/src/tasks/sort/Sort.mjs +0 -7
  481. package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
  482. package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
  483. package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
  484. package/esm2020/src/util/PrmMap.mjs +0 -151
  485. package/esm2020/src/util/ReturnResult.mjs +0 -46
  486. package/esm2020/src/util/ReturnResultBase.mjs +0 -18
  487. package/esm2020/src/util/Scrambler.mjs +0 -89
  488. package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
  489. package/fesm2015/magic-xpa-engine.mjs +0 -30835
  490. package/fesm2015/magic-xpa-engine.mjs.map +0 -1
  491. package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,97 @@
1
+ import { ApplicationException, Debug, NString } from "@magic-xpa/mscorelib";
2
+ import { Logger } from "@magic-xpa/utils";
3
+ import { ConstInterface } from "../ConstInterface";
4
+ import { HttpClientEvents } from "./client/HttpClientEvents";
5
+ import { HttpClientSync } from "./client/HttpClientSync";
6
+ import { HttpClientAsync } from "./client/HttpClientAsync";
7
+ export class HttpManager {
8
+ static _instance = null;
9
+ static DEFAULT_HTTP_COMMUNICATION_TIMEOUT = 5 * 1000;
10
+ static DEFAULT_OFFLINE_HTTP_COMMUNICATION_TIMEOUT = 2 * 1000;
11
+ _httpCommunicationTimeoutMS = HttpManager.DEFAULT_HTTP_COMMUNICATION_TIMEOUT;
12
+ _httpClientAsync = null;
13
+ getHttpClient() {
14
+ if (this.IsAbortingMagicEngine)
15
+ return new HttpClientSync();
16
+ return this._httpClientAsync;
17
+ }
18
+ set HttpCommunicationTimeoutMS(value) {
19
+ this._httpCommunicationTimeoutMS = value;
20
+ }
21
+ static _nativeHttpClient = null;
22
+ static setNativeHttpClient(httpClient) {
23
+ HttpManager._nativeHttpClient = httpClient;
24
+ }
25
+ static GetInstance() {
26
+ if (HttpManager._instance === null) {
27
+ HttpManager._instance = new HttpManager();
28
+ }
29
+ return HttpManager._instance;
30
+ }
31
+ _isAbortingMagicEngine = false;
32
+ get IsAbortingMagicEngine() { return this._isAbortingMagicEngine; }
33
+ set IsAbortingMagicEngine(isAbortingMagicEngine) { this._isAbortingMagicEngine = isAbortingMagicEngine; }
34
+ constructor() {
35
+ this._httpClientAsync = new HttpClientAsync(HttpManager._nativeHttpClient);
36
+ this.RegisterBasicDelegates();
37
+ }
38
+ RegisterBasicDelegates() {
39
+ HttpClientEvents.GetHttpCommunicationTimeout_Event = this.GetHttpCommunicationTimeoutMS.bind(this);
40
+ }
41
+ GetHttpCommunicationTimeoutMS() {
42
+ return this._httpCommunicationTimeoutMS;
43
+ }
44
+ SetCommunicationsFailureHandler(handler) {
45
+ this.getHttpClient().CommunicationsFailureHandler = handler;
46
+ }
47
+ async GetContent(requestedURL, requestContent, useCache, isError) {
48
+ let response;
49
+ Debug.Assert(this.getHttpClient() != null);
50
+ try {
51
+ Logger.Instance.WriteServerToLog("*************************************************************************************************");
52
+ isError.value = false;
53
+ Logger.Instance.WriteServerToLog(requestedURL);
54
+ HttpManager.LogAccessToServer("", requestContent);
55
+ response = await this.getHttpClient().GetContent(requestedURL, requestContent, useCache);
56
+ Debug.Assert(response !== null);
57
+ let errorResponse = HttpManager.CheckAndGetErrorResponse(response);
58
+ if (errorResponse !== null) {
59
+ response = errorResponse;
60
+ isError.value = true;
61
+ }
62
+ return response;
63
+ }
64
+ catch (ex) {
65
+ let url = new URL(requestedURL);
66
+ throw new ApplicationException(ex.Message + "\n" + url.origin + url.pathname, ex);
67
+ }
68
+ finally {
69
+ }
70
+ }
71
+ static CheckAndGetErrorResponse(httpResponse) {
72
+ let errorResponse = null;
73
+ if (httpResponse.startsWith(ConstInterface.V24_RIA_ERROR_PREFIX))
74
+ errorResponse = httpResponse.substr(ConstInterface.V24_RIA_ERROR_PREFIX.length);
75
+ return errorResponse;
76
+ }
77
+ static LogAccessToServer(msg, requestContent) {
78
+ if (Logger.Instance.ShouldLogServerRelatedMessages()) {
79
+ if (!NString.IsNullOrEmpty(msg)) {
80
+ msg = msg + "; accessing server ...";
81
+ }
82
+ if (requestContent === null) {
83
+ if (!NString.IsNullOrEmpty(msg)) {
84
+ Logger.Instance.WriteServerToLog(msg);
85
+ }
86
+ }
87
+ else {
88
+ if (!NString.IsNullOrEmpty(msg)) {
89
+ msg = msg + " ";
90
+ }
91
+ msg = msg + "uploading " + requestContent.length + " bytes";
92
+ Logger.Instance.WriteServerToLog(msg);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2h0dHAvSHR0cE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFekQsTUFBTSxPQUFPLFdBQVc7SUFDZCxNQUFNLENBQUMsU0FBUyxHQUFnQixJQUFJLENBQUM7SUFFN0MsTUFBTSxDQUFVLGtDQUFrQyxHQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEUsTUFBTSxDQUFVLDBDQUEwQyxHQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7SUFFdEUsMkJBQTJCLEdBQVcsV0FBVyxDQUFDLGtDQUFrQyxDQUFDO0lBQ3JGLGdCQUFnQixHQUFvQixJQUFJLENBQUM7SUFFekMsYUFBYTtRQUduQixJQUFHLElBQUksQ0FBQyxxQkFBcUI7WUFDM0IsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBRTlCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLDBCQUEwQixDQUFDLEtBQWE7UUFDMUMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQixHQUFlLElBQUksQ0FBQztJQUNwRCxNQUFNLENBQUMsbUJBQW1C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QUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEYsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsY0FBc0I7UUFDbEUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLDhCQUE4QixFQUFFLEVBQUU7WUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLEdBQUcsR0FBRyxHQUFHLEdBQUcsd0JBQXdCLENBQUM7YUFDdEM7WUFFRCxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMvQixNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN2QzthQUNGO2lCQUNJO2dCQUNILElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMvQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztpQkFDakI7Z0JBRUQsR0FBRyxHQUFHLEdBQUcsR0FBRyxZQUFZLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7Z0JBQzVELE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdkM7U0FDRjtJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBEZWJ1ZywgTlN0cmluZywgUmVmUGFyYW19IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge0xvZ2dlcn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSBcIi4uL0NvbnN0SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7SHR0cENsaWVudEJhc2V9IGZyb20gXCIuL2NsaWVudC9IdHRwQ2xpZW50QmFzZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnRFdmVudHN9IGZyb20gXCIuL2NsaWVudC9IdHRwQ2xpZW50RXZlbnRzXCI7XHJcbmltcG9ydCB7SUNvbW11bmljYXRpb25zRmFpbHVyZUhhbmRsZXJ9IGZyb20gXCIuL2NsaWVudC9JQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnRTeW5jfSBmcm9tIFwiLi9jbGllbnQvSHR0cENsaWVudFN5bmNcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50QXN5bmN9IGZyb20gXCIuL2NsaWVudC9IdHRwQ2xpZW50QXN5bmNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwTWFuYWdlciB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBIdHRwTWFuYWdlciA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0hUVFBfQ09NTVVOSUNBVElPTl9USU1FT1VUOiBudW1iZXIgPSA1ICogMTAwMDtcclxuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9PRkZMSU5FX0hUVFBfQ09NTVVOSUNBVElPTl9USU1FT1VUOiBudW1iZXIgPSAyICogMTAwMDtcclxuXHJcbiAgcHJpdmF0ZSBfaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVM6IG51bWJlciA9IEh0dHBNYW5hZ2VyLkRFRkFVTFRfSFRUUF9DT01NVU5JQ0FUSU9OX1RJTUVPVVQ7XHJcbiAgcHJpdmF0ZSBfaHR0cENsaWVudEFzeW5jOiBIdHRwQ2xpZW50QXN5bmMgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdldEh0dHBDbGllbnQoKTogSHR0cENsaWVudEJhc2VcclxuICB7XHJcbiAgICAvLyBDcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiBzeW5jIEh0dHBDbGllbnQgYmVjYXVzZSBpdCB3aWxsIGJlIGNyZWF0ZWQgb25seSBvbmNlIGR1cmluZyB0aGUgbGFzdCByZXF1ZXN0XHJcbiAgICBpZih0aGlzLklzQWJvcnRpbmdNYWdpY0VuZ2luZSlcclxuICAgICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50U3luYygpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50QXN5bmM7XHJcbiAgfVxyXG5cclxuICBzZXQgSHR0cENvbW11bmljYXRpb25UaW1lb3V0TVModmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5faHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9uYXRpdmVIdHRwQ2xpZW50OiBIdHRwQ2xpZW50ID0gbnVsbDtcclxuICBzdGF0aWMgc2V0TmF0aXZlSHR0cENsaWVudChodHRwQ2xpZW50OiBIdHRwQ2xpZW50KVxyXG4gIHtcclxuICAgIEh0dHBNYW5hZ2VyLl9uYXRpdmVIdHRwQ2xpZW50ID0gaHR0cENsaWVudDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBHZXRJbnN0YW5jZSgpOiBIdHRwTWFuYWdlciB7XHJcbiAgICBpZiAoSHR0cE1hbmFnZXIuX2luc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIEh0dHBNYW5hZ2VyLl9pbnN0YW5jZSA9IG5ldyBIdHRwTWFuYWdlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBIdHRwTWFuYWdlci5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0Fib3J0aW5nTWFnaWNFbmdpbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgSXNBYm9ydGluZ01hZ2ljRW5naW5lKCkgeyByZXR1cm4gdGhpcy5faXNBYm9ydGluZ01hZ2ljRW5naW5lOyB9XHJcbiAgc2V0IElzQWJvcnRpbmdNYWdpY0VuZ2luZShpc0Fib3J0aW5nTWFnaWNFbmdpbmU6IGJvb2xlYW4pIHsgdGhpcy5faXNBYm9ydGluZ01hZ2ljRW5naW5lID0gaXNBYm9ydGluZ01hZ2ljRW5naW5lOyB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9odHRwQ2xpZW50QXN5bmMgPSBuZXcgSHR0cENsaWVudEFzeW5jKEh0dHBNYW5hZ2VyLl9uYXRpdmVIdHRwQ2xpZW50KTtcclxuICAgIHRoaXMuUmVnaXN0ZXJCYXNpY0RlbGVnYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZWdpc3RlckJhc2ljRGVsZWdhdGVzKCk6IHZvaWQge1xyXG4gICAgSHR0cENsaWVudEV2ZW50cy5HZXRIdHRwQ29tbXVuaWNhdGlvblRpbWVvdXRfRXZlbnQgPSB0aGlzLkdldEh0dHBDb21tdW5pY2F0aW9uVGltZW91dE1TLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBHZXRIdHRwQ29tbXVuaWNhdGlvblRpbWVvdXRNUygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBDb21tdW5pY2F0aW9uVGltZW91dE1TO1xyXG4gIH1cclxuXHJcbiAgU2V0Q29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlcihoYW5kbGVyOiBJQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlcik6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRIdHRwQ2xpZW50KCkuQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlciA9IGhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBhc3luYyBHZXRDb250ZW50KHJlcXVlc3RlZFVSTDogc3RyaW5nLCByZXF1ZXN0Q29udGVudDogc3RyaW5nLCB1c2VDYWNoZTogYm9vbGVhbiwgaXNFcnJvcjogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHJlc3BvbnNlOiBzdHJpbmc7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5nZXRIdHRwQ2xpZW50KCkgIT0gbnVsbCk7XHJcbiAgICAvLyBsZXQgc3RhcnRUaW1lOiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKTtcclxuXHJcbiAgICAgIGlzRXJyb3IudmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKHJlcXVlc3RlZFVSTCk7XHJcblxyXG4gICAgICBIdHRwTWFuYWdlci5Mb2dBY2Nlc3NUb1NlcnZlcihcIlwiLCByZXF1ZXN0Q29udGVudCk7XHJcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRIdHRwQ2xpZW50KCkuR2V0Q29udGVudChyZXF1ZXN0ZWRVUkwsIHJlcXVlc3RDb250ZW50LCB1c2VDYWNoZSk7XHJcbiAgICAgIERlYnVnLkFzc2VydChyZXNwb25zZSAhPT0gbnVsbCk7XHJcbiAgICAgIGxldCBlcnJvclJlc3BvbnNlOiBzdHJpbmcgPSBIdHRwTWFuYWdlci5DaGVja0FuZEdldEVycm9yUmVzcG9uc2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgaWYgKGVycm9yUmVzcG9uc2UgIT09IG51bGwpIHtcclxuICAgICAgICByZXNwb25zZSA9IGVycm9yUmVzcG9uc2U7XHJcbiAgICAgICAgaXNFcnJvci52YWx1ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgIC8vIFRPRE86IHJlbGF0aXZlIHJlcXVlc3RlZFVSTCBkb2Vzbid0IHdvcmsgaGVyZS5cclxuICAgICAgbGV0IHVybDogVVJMID0gbmV3IFVSTChyZXF1ZXN0ZWRVUkwpO1xyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oZXguTWVzc2FnZSArIFwiXFxuXCIgKyB1cmwub3JpZ2luICsgdXJsLnBhdGhuYW1lLCBleCk7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IGluIFdlYkNsaWVudC5cclxuICAgICAgLy8gSG93IGRvIHdlIGtub3cgaWYgdGhlIGNvbnRlbnRzIHdlcmUgcmV0dXJuZWQgZm9ybSBicm93c2VyIGNhY2hlP1xyXG4gICAgICAvLyBsZXQgZWxhcHNlZFRpbWU6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBzdGFydFRpbWU7XHJcblxyXG4gICAgICAvLyBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJUb0xvZyhcclxuICAgICAgLy8gICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KFxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgIFwiQ29tcGxldGVkIHswfTogezE6TjB9IG1zLCBhY2N1bXVsYXRlZDogezI6TjB9IG1zIChzZXJ2ZXI6IHszOk4wfSksIHs0fXs1fXs2fSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIsXHJcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgKGNhY2hpbmdTdHJhdGVneS5Gb3VuZEluQ2FjaGVcclxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgPyBcIlwiXHJcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIDogTlN0cmluZy5Gb3JtYXQoXCIjezA6TjB9XCIsIFN0YXRpc3RpY3MuR2V0UmVxdWVzdHNDbnQoKSlcclxuICAgICAgLy8gICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lLFxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3MuR2V0QWNjdW11bGF0ZWRFeHRlcm5hbFRpbWUoKSwgU3RhdGlzdGljcy5HZXRBY2N1bXVsYXRlZFNlcnZlclRpbWUoKSxcclxuICAgICAgLy8gICAgICAgICAgICAgICAgICAoY2FjaGluZ1N0cmF0ZWd5LkZvdW5kSW5DYWNoZVxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICA/IFwiXCJcclxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgOiAocmVzcG9uc2UgIT0gbnVsbFxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE5TdHJpbmcuRm9ybWF0KFwiezA6TjB9IGJ5dGVzIGRvd25sb2FkZWRcIiwgcmVzcG9uc2UubGVuZ3RoKVxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiTnVsbCByZXNwb25zZSFcIilcclxuICAgICAgLy8gICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBPU0Vudmlyb25tZW50LlRhYlNlcSlcclxuICAgICAgLy8gICAgICAgICAgICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIGlmIGFuIEhUVFAgcmVzcG9uc2UgaXMgYW4gZXJyb3IgcmVzcG9uc2UuXHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaHR0cFJlc3BvbnNlXCI+cmVzcG9uc2UgcmV0dXJuZWQgdG8gYW4gSFRUUCByZXF1ZXN0LjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPmlmIHRoZSByZXNwb25zZSBjb250YWlucyB0aGUgZXJyb3IgaW5kaWNhdG9yIC0gdGhlIGVycm9yIGluZGljYXRvciBpcyB0cnVuY2F0ZWQgYW5kIHRoZSByZW1haW5pbmcgaXMgcmV0dXJuZWQuXHJcbiAgLy8vIG90aGVyd2lzZSAtIG51bGwgKGluZGljYXRpbmcgdGhhdCB0aGUgJ2h0dHAgUmVzcG9uc2UnIGRpZG4ndCBjb250YWluIGFuIGVycm9yKS48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgQ2hlY2tBbmRHZXRFcnJvclJlc3BvbnNlKGh0dHBSZXNwb25zZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBlcnJvclJlc3BvbnNlOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChodHRwUmVzcG9uc2Uuc3RhcnRzV2l0aChDb25zdEludGVyZmFjZS5WMjRfUklBX0VSUk9SX1BSRUZJWCkpXHJcbiAgICAgIGVycm9yUmVzcG9uc2UgPSBodHRwUmVzcG9uc2Uuc3Vic3RyKENvbnN0SW50ZXJmYWNlLlYyNF9SSUFfRVJST1JfUFJFRklYLmxlbmd0aCk7XHJcblxyXG4gICAgcmV0dXJuIGVycm9yUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBMb2dBY2Nlc3NUb1NlcnZlcihtc2c6IHN0cmluZywgcmVxdWVzdENvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKExvZ2dlci5JbnN0YW5jZS5TaG91bGRMb2dTZXJ2ZXJSZWxhdGVkTWVzc2FnZXMoKSkge1xyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShtc2cpKSB7XHJcbiAgICAgICAgbXNnID0gbXNnICsgXCI7IGFjY2Vzc2luZyBzZXJ2ZXIgLi4uXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXF1ZXN0Q29udGVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KG1zZykpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KG1zZykpIHtcclxuICAgICAgICAgIG1zZyA9IG1zZyArIFwiIFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbXNnID0gbXNnICsgXCJ1cGxvYWRpbmcgXCIgKyByZXF1ZXN0Q29udGVudC5sZW5ndGggKyBcIiBieXRlc1wiO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKG1zZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,68 @@
1
+ import { HttpErrorResponse } from "@angular/common/http";
2
+ import { NString, Thread, WebException } from "@magic-xpa/mscorelib";
3
+ import { HttpClientBase, RequestMethod } from "./HttpClientBase";
4
+ import { Logger, Logger_LogLevels, Logger_MessageDirection, Misc } from "@magic-xpa/utils";
5
+ import { HttpClientEvents } from "./HttpClientEvents";
6
+ export class HttpClientAsync extends HttpClientBase {
7
+ httpClient;
8
+ constructor(httpClient) {
9
+ super();
10
+ this.httpClient = httpClient;
11
+ }
12
+ prepareRequest() {
13
+ }
14
+ addHeaders(urlString, useCache, httpHeaders, clientID) {
15
+ if (!urlString.startsWith("/"))
16
+ httpHeaders = httpHeaders.append("MgxpaRIAglobalUniqueSessionID", clientID);
17
+ if (!useCache)
18
+ httpHeaders = httpHeaders.append("Cache-Control", 'no-cache');
19
+ return httpHeaders;
20
+ }
21
+ async sendRequestToServer(httpMethod, urlString, httpHeaders, requestContent, contentFromServer) {
22
+ let httpResponse = await this.httpClient.request(RequestMethod[httpMethod], urlString, { headers: httpHeaders, responseType: "text", observe: "response", body: requestContent }).toPromise();
23
+ contentFromServer.value = httpResponse.body;
24
+ return httpResponse;
25
+ }
26
+ logResponse(httpResponse, clientID, urlString, contentFromServer, timeBeforeRequest) {
27
+ let statusCode = httpResponse['status'];
28
+ let responseTime = Misc.getSystemMilliseconds() - timeBeforeRequest;
29
+ if (Logger.Instance.LogLevel === Logger_LogLevels.Basic)
30
+ Logger.Instance.WriteBasicToLog(Logger_MessageDirection.MessageEntering, HttpClientEvents.GetRuntimeCtxID(), HttpClientEvents.GetSessionCounter(), clientID, HttpClientEvents.ShouldDisplayGenericError() ? "-" : new URL(urlString).host, responseTime, statusCode.toString(), JSON.stringify(httpResponse.headers), contentFromServer.value.length);
31
+ }
32
+ handleHttpErrorException(ex, urlString) {
33
+ if (ex instanceof HttpErrorResponse) {
34
+ let statusCode = ex['status'];
35
+ if (statusCode === 404 || statusCode === 403)
36
+ throw new WebException(new Error("bad URL: " + urlString + " - StatusCode = " + statusCode));
37
+ }
38
+ }
39
+ async shouldRetry(httpCommunicationTimeoutMS, urlString, communicationsFailureHandler, ex, startTimeRef) {
40
+ let currentDelayMS = Math.floor(httpCommunicationTimeoutMS / 10);
41
+ let httpElapsedTimeMS = Misc.getSystemMilliseconds() - startTimeRef.value + currentDelayMS;
42
+ if (httpElapsedTimeMS <= httpCommunicationTimeoutMS) {
43
+ await Thread.Sleep(currentDelayMS);
44
+ Logger.Instance.WriteWarningToLogWithMsg(NString.Format("Retrying {0} : elapsed time {1:N0}ms out of {2:N0}ms", urlString, httpElapsedTimeMS, httpCommunicationTimeoutMS));
45
+ return true;
46
+ }
47
+ Logger.Instance.WriteWarningToLogWithMsg(NString.Format("{0} : http timeout {1:N0}ms expired", urlString, httpCommunicationTimeoutMS));
48
+ if (communicationsFailureHandler != null) {
49
+ communicationsFailureHandler.CommunicationFailed(urlString, ex);
50
+ if (communicationsFailureHandler.ShouldRetryLastRequest) {
51
+ Logger.Instance.WriteServerToLog(NString.Format("Retrying {0}, confirmed by user ...", urlString));
52
+ startTimeRef.value = Misc.getSystemMilliseconds();
53
+ return true;
54
+ }
55
+ }
56
+ return false;
57
+ }
58
+ logAndThrowException(ex) {
59
+ Logger.Instance.WriteWarningToLogWithMsg("Re-throwing ...");
60
+ Logger.Instance.WriteWarningToLog(ex);
61
+ throw new WebException(ex);
62
+ }
63
+ logExecutionAttempts(executionAttempts) {
64
+ if (executionAttempts > 1)
65
+ Logger.Instance.WriteServerToLog(NString.Format("Succeeded after {0} attempts ...", executionAttempts));
66
+ }
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cENsaWVudEFzeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9odHRwL2NsaWVudC9IdHRwQ2xpZW50QXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLGlCQUFpQixFQUE0QixNQUFNLHNCQUFzQixDQUFDO0FBQzlGLE9BQU8sRUFBQyxPQUFPLEVBQVksTUFBTSxFQUFFLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBQyxjQUFjLEVBQUUsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUlwRCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxjQUFjO0lBQzdCO0lBQXBCLFlBQW9CLFVBQXNCO1FBQ3hDLEtBQUssRUFBRSxDQUFDO1FBRFUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUUxQyxDQUFDO0lBRUQsY0FBYztJQUdkLENBQUM7SUFFRCxVQUFVLENBQUMsU0FBaUIsRUFBRSxRQUFpQixFQUFFLFdBQXdCLEVBQUUsUUFBZ0I7UUFFekYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQzVCLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLCtCQUErQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTlFLElBQUksQ0FBQyxRQUFRO1lBQ1gsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRWhFLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBeUIsRUFBRSxTQUFp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Q0FBQyxDQUFDO1lBQ2hFLElBQUksNEJBQTRCLENBQUMsc0JBQXNCLEVBQ3ZEO2dCQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNuRyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNsRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxFQUFFO1FBRXJCLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELG9CQUFvQixDQUFDLGlCQUF5QjtRQUU1QyxJQUFJLGlCQUFpQixHQUFHLENBQUM7WUFDdkIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM1RyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtOU3RyaW5nLCBSZWZQYXJhbSwgVGhyZWFkLCBXZWJFeGNlcHRpb259IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnRCYXNlLCBSZXF1ZXN0TWV0aG9kfSBmcm9tIFwiLi9IdHRwQ2xpZW50QmFzZVwiO1xyXG5pbXBvcnQge0xvZ2dlciwgTG9nZ2VyX0xvZ0xldmVscywgTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24sIE1pc2N9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7SHR0cENsaWVudEV2ZW50c30gZnJvbSBcIi4vSHR0cENsaWVudEV2ZW50c1wiO1xyXG5pbXBvcnQge0lDb21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyfSBmcm9tIFwiLi9JQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlclwiO1xyXG5cclxuLy8gQSBjbGFzcyB1c2luZyBIdHRwIEFzeW5jIExpYnJhcnlcclxuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnRBc3luYyBleHRlbmRzIEh0dHBDbGllbnRCYXNlIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlUmVxdWVzdCgpXHJcbiAge1xyXG4gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gbmVlZGVkXHJcbiAgfVxyXG5cclxuICBhZGRIZWFkZXJzKHVybFN0cmluZzogc3RyaW5nLCB1c2VDYWNoZTogYm9vbGVhbiwgaHR0cEhlYWRlcnM6IEh0dHBIZWFkZXJzLCBjbGllbnRJRDogc3RyaW5nKTogSHR0cEhlYWRlcnNcclxuICB7XHJcbiAgICBpZiAoIXVybFN0cmluZy5zdGFydHNXaXRoKFwiL1wiKSlcclxuICAgICAgaHR0cEhlYWRlcnMgPSBodHRwSGVhZGVycy5hcHBlbmQoXCJNZ3hwYVJJQWdsb2JhbFVuaXF1ZVNlc3Npb25JRFwiLCBjbGllbnRJRCk7XHJcblxyXG4gICAgaWYgKCF1c2VDYWNoZSlcclxuICAgICAgaHR0cEhlYWRlcnMgPSBodHRwSGVhZGVycy5hcHBlbmQoXCJDYWNoZS1Db250cm9sXCIsICduby1jYWNoZScpO1xyXG5cclxuICAgIHJldHVybiBodHRwSGVhZGVycztcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbmRSZXF1ZXN0VG9TZXJ2ZXIoaHR0cE1ldGhvZDogUmVxdWVzdE1ldGhvZCwgdXJsU3RyaW5nOiBzdHJpbmcsIGh0dHBIZWFkZXJzOiBIdHRwSGVhZGVycywgcmVxdWVzdENvbnRlbnQ6IHN0cmluZywgY29udGVudEZyb21TZXJ2ZXI6IFJlZlBhcmFtPHN0cmluZz4pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgbGV0IGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4gPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQucmVxdWVzdChSZXF1ZXN0TWV0aG9kW2h0dHBNZXRob2RdLCB1cmxTdHJpbmcsXHJcbiAgICAgIHtoZWFkZXJzOiBodHRwSGVhZGVycywgcmVzcG9uc2VUeXBlOiBcInRleHRcIiwgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLCBib2R5OiByZXF1ZXN0Q29udGVudH0pLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIGNvbnRlbnRGcm9tU2VydmVyLnZhbHVlID0gaHR0cFJlc3BvbnNlLmJvZHkgYXMgYW55O1xyXG5cclxuICAgIHJldHVybiBodHRwUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBsb2dSZXNwb25zZShodHRwUmVzcG9uc2U6IEh0dHBSZXNwb25zZTxzdHJpbmc+LCBjbGllbnRJRDogc3RyaW5nLCB1cmxTdHJpbmc6IHN0cmluZywgY29udGVudEZyb21TZXJ2ZXI6IFJlZlBhcmFtPGFueT4sIHRpbWVCZWZvcmVSZXF1ZXN0OiBudW1iZXIpXHJcbiAge1xyXG4gICAgbGV0IHN0YXR1c0NvZGUgPSBodHRwUmVzcG9uc2VbJ3N0YXR1cyddO1xyXG5cclxuICAgIGxldCByZXNwb25zZVRpbWU6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSB0aW1lQmVmb3JlUmVxdWVzdDtcclxuICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUJhc2ljVG9Mb2coTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24uTWVzc2FnZUVudGVyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuR2V0UnVudGltZUN0eElEKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cENsaWVudEV2ZW50cy5HZXRTZXNzaW9uQ291bnRlcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudElELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuU2hvdWxkRGlzcGxheUdlbmVyaWNFcnJvcigpID8gXCItXCIgOiBuZXcgVVJMKHVybFN0cmluZykuaG9zdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZS50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGh0dHBSZXNwb25zZS5oZWFkZXJzKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RnJvbVNlcnZlci52YWx1ZS5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlSHR0cEVycm9yRXhjZXB0aW9uKGV4OiBhbnksIHVybFN0cmluZzogc3RyaW5nKSB7XHJcbiAgICBpZiAoZXggaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSlcclxuICAgIHtcclxuICAgICAgbGV0IHN0YXR1c0NvZGUgPSBleFsnc3RhdHVzJ107XHJcbiAgICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDQgfHwgc3RhdHVzQ29kZSA9PT0gNDAzKVxyXG4gICAgICAgIHRocm93IG5ldyBXZWJFeGNlcHRpb24obmV3IEVycm9yKFwiYmFkIFVSTDogXCIgKyB1cmxTdHJpbmcgKyBcIiAtIFN0YXR1c0NvZGUgPSBcIiArIHN0YXR1c0NvZGUpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHNob3VsZFJldHJ5KGh0dHBDb21tdW5pY2F0aW9uVGltZW91dE1TOiBudW1iZXIsIHVybFN0cmluZzogc3RyaW5nLCBjb21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyOiBJQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlciwgZXg6IGFueSwgc3RhcnRUaW1lUmVmOiBSZWZQYXJhbTxudW1iZXI+KTogUHJvbWlzZTxib29sZWFuPlxyXG4gIHtcclxuICAgIC8vIGRlbGF5IHRoZSB0b3RhbCBodHRwIHRpbWVvdXQgLyAxMC5cclxuICAgIGxldCBjdXJyZW50RGVsYXlNUyA9IE1hdGguZmxvb3IoaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMgLyAxMCk7IC8vIG1zXHJcbiAgICBsZXQgaHR0cEVsYXBzZWRUaW1lTVM6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCkgLSBzdGFydFRpbWVSZWYudmFsdWUgKyBjdXJyZW50RGVsYXlNUztcclxuXHJcbiAgICBpZiAoaHR0cEVsYXBzZWRUaW1lTVMgPD0gaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMpXHJcbiAgICB7XHJcbiAgICAgIGF3YWl0IFRocmVhZC5TbGVlcChjdXJyZW50RGVsYXlNUyk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJSZXRyeWluZyB7MH0gOiBlbGFwc2VkIHRpbWUgezE6TjB9bXMgb3V0IG9mIHsyOk4wfW1zXCIsXHJcbiAgICAgICAgdXJsU3RyaW5nLCBodHRwRWxhcHNlZFRpbWVNUywgaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMpKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlV2FybmluZ1RvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcInswfSA6IGh0dHAgdGltZW91dCB7MTpOMH1tcyBleHBpcmVkXCIsIHVybFN0cmluZywgaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMpKTtcclxuICAgIGlmIChjb21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGNvbW11bmljYXRpb25zRmFpbHVyZUhhbmRsZXIuQ29tbXVuaWNhdGlvbkZhaWxlZCh1cmxTdHJpbmcsIGV4KTtcclxuICAgICAgaWYgKGNvbW11bmljYXRpb25zRmFpbHVyZUhhbmRsZXIuU2hvdWxkUmV0cnlMYXN0UmVxdWVzdClcclxuICAgICAge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiUmV0cnlpbmcgezB9LCBjb25maXJtZWQgYnkgdXNlciAuLi5cIiwgdXJsU3RyaW5nKSk7XHJcbiAgICAgICAgc3RhcnRUaW1lUmVmLnZhbHVlID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGxvZ0FuZFRocm93RXhjZXB0aW9uKGV4KVxyXG4gIHtcclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2coXCJSZS10aHJvd2luZyAuLi5cIik7XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVXYXJuaW5nVG9Mb2coZXgpO1xyXG4gICAgdGhyb3cgbmV3IFdlYkV4Y2VwdGlvbihleCk7XHJcbiAgfVxyXG5cclxuICBsb2dFeGVjdXRpb25BdHRlbXB0cyhleGVjdXRpb25BdHRlbXB0czogbnVtYmVyKVxyXG4gIHtcclxuICAgIGlmIChleGVjdXRpb25BdHRlbXB0cyA+IDEpXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU3VjY2VlZGVkIGFmdGVyIHswfSBhdHRlbXB0cyAuLi5cIiwgZXhlY3V0aW9uQXR0ZW1wdHMpKTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,132 +1,132 @@
1
- import { NString, RefParam, StringBuilder, isNullOrUndefined } from "@magic-xpa/mscorelib";
2
- import { Logger, Logger_LogLevels, Logger_MessageDirection, Misc } from "@magic-xpa/utils";
3
- import { HttpClientEvents } from "./HttpClientEvents";
4
- import { HttpHeaders } from "@angular/common/http";
5
- export var RequestMethod;
6
- (function (RequestMethod) {
7
- RequestMethod[RequestMethod["Get"] = 0] = "Get";
8
- RequestMethod[RequestMethod["Post"] = 1] = "Post";
9
- RequestMethod[RequestMethod["Put"] = 2] = "Put";
10
- RequestMethod[RequestMethod["Delete"] = 3] = "Delete";
11
- RequestMethod[RequestMethod["Options"] = 4] = "Options";
12
- RequestMethod[RequestMethod["Head"] = 5] = "Head";
13
- RequestMethod[RequestMethod["Patch"] = 6] = "Patch";
14
- })(RequestMethod || (RequestMethod = {}));
15
- export class HttpClientBase {
16
- constructor() {
17
- this._HTTPMaxURLLength = 2048;
18
- this.CommunicationsFailureHandler = null;
19
- this.CommunicationsFailureHandler = null;
20
- }
21
- DecideOnRequestMethod(requestContent, requestURL) {
22
- let method = RequestMethod.Get;
23
- if (requestContent === null) {
24
- method = RequestMethod.Get;
25
- }
26
- else {
27
- if (requestURL.value.length + 1 + requestContent.length <= this._HTTPMaxURLLength) {
28
- requestURL.value = requestURL.value + "?" + requestContent;
29
- method = RequestMethod.Get;
30
- }
31
- else {
32
- method = RequestMethod.Post;
33
- }
34
- }
35
- return method;
36
- }
37
- async GetContent(requestURL, requestContent, useCache) {
38
- let contentFromServer = new RefParam(null);
39
- let requestUrlRef = new RefParam(requestURL);
40
- let httpMethod = this.DecideOnRequestMethod(requestContent, requestUrlRef);
41
- requestURL = requestUrlRef.value;
42
- try {
43
- let response = await this.ExecuteHttpRequest(requestURL, requestContent, useCache, httpMethod, contentFromServer);
44
- if (response != null) {
45
- Logger.Instance.WriteServerToLog("Incoming Headers : " + HttpClientBase.HeadersToString(response.headers, true));
46
- let nextSessionCounterString = response.headers.get("MgxpaNextSessionCounter".toLowerCase());
47
- if (!isNullOrUndefined(nextSessionCounterString)) {
48
- HttpClientEvents.CheckAndSetSessionCounter(+nextSessionCounterString);
49
- }
50
- }
51
- }
52
- catch (ex) {
53
- Logger.Instance.WriteWarningToLog(ex);
54
- throw ex;
55
- }
56
- return contentFromServer.value;
57
- }
58
- async ExecuteHttpRequest(urlString, requestContent, useCache, httpMethod, contentFromServer) {
59
- let httpResponse = null;
60
- this.prepareRequest();
61
- let httpCommunicationTimeoutMS = HttpClientEvents.GetHttpCommunicationTimeout();
62
- let clientID = HttpClientEvents.GetGlobalUniqueSessionID();
63
- let executionAttempts = 0;
64
- let startTime = Misc.getSystemMilliseconds();
65
- while (true) {
66
- executionAttempts++;
67
- try {
68
- let httpHeaders = new HttpHeaders();
69
- httpHeaders = this.addHeaders(urlString, useCache, httpHeaders, clientID);
70
- Logger.Instance.WriteServerToLog(NString.Format("Request Timeout set to {0} ms", httpCommunicationTimeoutMS));
71
- if (Logger.Instance.LogLevel === Logger_LogLevels.Basic) {
72
- let contentLength = 0;
73
- if (httpMethod === RequestMethod.Get) {
74
- let parts = urlString.split('?');
75
- if (parts.length === 2)
76
- contentLength = parts[1].length;
77
- }
78
- else
79
- contentLength = requestContent.length;
80
- Logger.Instance.WriteBasicToLog(Logger_MessageDirection.MessageLeaving, HttpClientEvents.GetRuntimeCtxID(), HttpClientEvents.GetSessionCounter(), clientID, HttpClientEvents.ShouldDisplayGenericError() ? "-" : new URL(urlString).host, 0, '-', JSON.stringify(httpHeaders), contentLength);
81
- }
82
- let timeBeforeRequest = Misc.getSystemMilliseconds();
83
- Logger.Instance.WriteServerToLog(NString.Format("Accessing (method: '{0}'): '{1}'", httpMethod, urlString));
84
- Logger.Instance.WriteServerToLog("Outgoing Headers : " + HttpClientBase.HeadersToString(httpHeaders, false));
85
- if (httpMethod === RequestMethod.Post) {
86
- }
87
- let requestTime = Misc.getSystemMilliseconds();
88
- this.LogRequestInfo(!isNullOrUndefined(requestContent) ? requestContent.length : 0, requestTime, false);
89
- httpResponse = await this.sendRequestToServer(httpMethod, urlString, httpHeaders, requestContent, contentFromServer);
90
- this.logResponse(httpResponse, clientID, urlString, contentFromServer, timeBeforeRequest);
91
- this.LogRequestInfo(!isNullOrUndefined(requestContent) ? requestContent.length : 0, Misc.getSystemMilliseconds() - requestTime, true);
92
- break;
93
- }
94
- catch (ex) {
95
- if (Logger.Instance.LogLevel === Logger_LogLevels.Basic)
96
- Logger.Instance.WriteBasicErrorToLog();
97
- else
98
- Logger.Instance.WriteWarningToLog(ex);
99
- this.handleHttpErrorException(ex, urlString);
100
- let startTimeRef = new RefParam(startTime);
101
- if (this.shouldRetry(httpCommunicationTimeoutMS, urlString, this.CommunicationsFailureHandler, ex, startTimeRef)) {
102
- startTime = startTimeRef.value;
103
- continue;
104
- }
105
- this.logAndThrowException(ex);
106
- }
107
- }
108
- this.logExecutionAttempts(executionAttempts);
109
- return httpResponse;
110
- }
111
- LogRequestInfo(contentLength, roundTrip, isLoggingResponse) {
112
- if (Logger.Instance.LogLevel == Logger_LogLevels.RequestInfo) {
113
- HttpClientEvents.ComputeAndLogRequestInfo(contentLength, roundTrip, isLoggingResponse);
114
- }
115
- }
116
- static HeadersToString(headers, bFilter) {
117
- let headersStr = new StringBuilder();
118
- let headerKeys = headers.keys();
119
- for (let key in headerKeys) {
120
- if (!bFilter || headerKeys[key].startsWith("Mg"))
121
- headersStr.Append(NString.Format("{0}:{1} ", headerKeys[key], headers.get(headerKeys[key])));
122
- }
123
- return headersStr;
124
- }
125
- async sendRequestToServer(httpMethod, urlString, httpHeaders, requestContent, contentFromServer) {
126
- return Promise.resolve();
127
- }
128
- async shouldRetry(httpCommunicationTimeoutMS, urlString, communicationsFailureHandler, ex, startTimeRef) {
129
- return Promise.resolve(false);
130
- }
131
- }
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cENsaWVudEJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2h0dHAvY2xpZW50L0h0dHBDbGllbnRCYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLFdBQVcsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRy9ELE1BQU0sQ0FBTixJQUFZLGFBU1g7QUFURCxXQUFZLGFBQWE7SUFFdkIsK0NBQU8sQ0FBQTtJQUNQLGlEQUFRLENBQUE7SUFDUiwrQ0FBTyxDQUFBO0lBQ1AscURBQVUsQ0FBQTtJQUNWLHVEQUFXLENBQUE7SUFDWCxpREFBUSxDQUFBO0lBQ1IsbURBQVMsQ0FBQTtBQUNYLENBQUMsRUFUVyxhQUFhLEtBQWIsYUFBYSxRQVN4QjtBQVVELE1BQU0sT0FBZ0IsY0FBYztJQVVsQztRQVRRLHNCQUFpQixHQUFXLElBQUksQ0FBQztRQU96QyxpQ0FBNEIsR0FBa0MsSUFBSSxDQUFDO1FBR2pFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7SUFDM0MsQ0FBQztJQU9PLHFCQUFxQixDQUFDLGNBQXNCLEVBQUUsVUFBNEI7UUFDaEYsSUFBSSxNQUFNLEdBQWtCLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFFOUMsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBRTNCLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO1NBQzVCO2FBQ0k7WUFDSCxJQUFJLFVBQVUsQ0FBQyxL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M0IsQ0FBQztJQUdELEtBQUssQ0FBQyxXQUFXLENBQUMsMEJBQWtDLEVBQUUsU0FBaUIsRUFBRSw0QkFBMkQsRUFBRSxFQUFPLEVBQUUsWUFBOEI7UUFDM0ssT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtMb2dnZXIsIExvZ2dlcl9Mb2dMZXZlbHMsIExvZ2dlcl9NZXNzYWdlRGlyZWN0aW9uLCBNaXNjfSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge0lDb21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyfSBmcm9tIFwiLi9JQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnRFdmVudHN9IGZyb20gXCIuL0h0dHBDbGllbnRFdmVudHNcIjtcclxuaW1wb3J0IHtIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcblxyXG5leHBvcnQgZW51bSBSZXF1ZXN0TWV0aG9kXHJcbntcclxuICBHZXQgPSAwLFxyXG4gIFBvc3QgPSAxLFxyXG4gIFB1dCA9IDIsXHJcbiAgRGVsZXRlID0gMyxcclxuICBPcHRpb25zID0gNCxcclxuICBIZWFkID0gNSxcclxuICBQYXRjaCA9IDZcclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3I6XHJcbi8vLyAgICAoaSkgZGVjaWRpbmcgd2hpY2ggbWV0aG9kIHRvIHVzZSAoR0VUL1BPU1QpLlxyXG4vLy8gICAoaWkpIGhhbmRsaW5nIGNvbW11bmljYXRpb24gZmFpbHVyZXMuXHJcbi8vLyAgKGlpaSkgYWRkaW5nIEhUVFAgaGVhZGVycyB0byByZXF1ZXN0cy5cclxuLy8vICAoaVYpIHJldHJpZXZpbmcgSFRUUCBoZWFkZXJzIGZyb20gcmVzcG9uc2VzLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEh0dHBDbGllbnRCYXNlIHtcclxuICBwcml2YXRlIF9IVFRQTWF4VVJMTGVuZ3RoOiBudW1iZXIgPSAyMDQ4O1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgb3Igc2V0cyBhIGhhbmRsZXIgZm9yIGNvbW11bmljYXRpb25zIGZhaWx1cmUuIFRoaXMgcHJvcGVydHkgbWF5IGJlXHJcbiAgLy8vIHNldCB0byBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSBIdHRwQ2xpZW50QmFzZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbCBhZnRlclxyXG4gIC8vLyB0aGUgZmlyc3QgcmVjb25uZWN0aW9uIGF0dGVtcHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBDb21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyOiBJQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlciA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5Db21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgcmVxdWVzdCBtZXRob2QgKFBPU1Qgb3IgR0VUKSBiYXNlZCBvbiBpdHMgY29udGVudHMgYW5kIGxlbmd0aC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlcXVlc3RVUkxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBEZWNpZGVPblJlcXVlc3RNZXRob2QocmVxdWVzdENvbnRlbnQ6IHN0cmluZywgcmVxdWVzdFVSTDogUmVmUGFyYW08c3RyaW5nPik6IFJlcXVlc3RNZXRob2Qge1xyXG4gICAgbGV0IG1ldGhvZDogUmVxdWVzdE1ldGhvZCA9IFJlcXVlc3RNZXRob2QuR2V0O1xyXG5cclxuICAgIGlmIChyZXF1ZXN0Q29udGVudCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyByZXF1ZXN0Q29udGVudCAoPT0gY29udGVudCB0byBiZSBzZW50IHRvIHNlcnZlcikgaXMgYWxsb3dlZCBvbmx5IGluIFBPU1QgcmVxdWVzdHMuIEluIGNhc2Ugbm8gY29udGVudCBpcyByZXF1aXJlZCwgb3B0IGZvciBHRVQgKGZvciB0aGUgYWZvcmVtZW50aW9uZWQgcGVyZm9ybWFuY2UgcmVhc29uKS5cclxuICAgICAgbWV0aG9kID0gUmVxdWVzdE1ldGhvZC5HZXQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHJlcXVlc3RVUkwudmFsdWUubGVuZ3RoICsgMSArIHJlcXVlc3RDb250ZW50Lmxlbmd0aCA8PSB0aGlzLl9IVFRQTWF4VVJMTGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gYXBwZW5kIHRoZSByZXF1ZXN0IGNvbnRlbnQgdG8gdGhlIFVSTCwgYW5kIHN3aXRjaCB0byB1c2luZyBhIEdFVCByZXF1ZXN0LlxyXG4gICAgICAgIHJlcXVlc3RVUkwudmFsdWUgPSByZXF1ZXN0VVJMLnZhbHVlICsgXCI/XCIgKyByZXF1ZXN0Q29udGVudDtcclxuICAgICAgICBtZXRob2QgPSBSZXF1ZXN0TWV0aG9kLkdldDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBtZXRob2QgPSBSZXF1ZXN0TWV0aG9kLlBvc3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWV0aG9kO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkdldHMgY29udGVudHMgb2YgYSBVUkwsIHVzaW5nIGVpdGhlciBHRVQgb3IgUE9TVCBtZXRob2RzLlxyXG4gIC8vLyBUaGUgbWV0aG9kIGV4ZWN1dGVzIHRoZSBIVFRQIHJlcXVlc3QsIHJlYWRzIHRoZSByZXNwb25zZSBhbmQgcmV0dXJuIHRoZSBjb250ZW50LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVxdWVzdFVSTFwiPlVSTCB0byBiZSBhY2Nlc3NlZC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlcXVlc3RDb250ZW50XCI+Y29udGVudCB0byBiZSBzZW50IHRvIHNlcnZlciAocmVsZXZhbnQgb25seSBmb3IgUE9TVCBtZXRob2QgLSBpcyBudWxsIGZvciBvdGhlciBtZXRob2RzKS48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5yZXNwb25zZSAoZnJvbSB0aGUgc2VydmVyKS48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0Q29udGVudChyZXF1ZXN0VVJMOiBzdHJpbmcsIHJlcXVlc3RDb250ZW50OiBhbnksIHVzZUNhY2hlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBjb250ZW50RnJvbVNlcnZlcjogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuICAgIGxldCByZXF1ZXN0VXJsUmVmOiBSZWZQYXJhbTxzdHJpbmc+ID0gbmV3IFJlZlBhcmFtKHJlcXVlc3RVUkwpO1xyXG5cclxuICAgIGxldCBodHRwTWV0aG9kOiBSZXF1ZXN0TWV0aG9kID0gdGhpcy5EZWNpZGVPblJlcXVlc3RNZXRob2QocmVxdWVzdENvbnRlbnQsIHJlcXVlc3RVcmxSZWYpO1xyXG4gICAgcmVxdWVzdFVSTCA9IHJlcXVlc3RVcmxSZWYudmFsdWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gRXhlY3V0ZSB0aGUgaHR0cCByZXF1ZXN0XHJcbiAgICAgIGxldCByZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4gPSBhd2FpdCB0aGlzLkV4ZWN1dGVIdHRwUmVxdWVzdChyZXF1ZXN0VVJMLCByZXF1ZXN0Q29udGVudCwgdXNlQ2FjaGUsIGh0dHBNZXRob2QsIGNvbnRlbnRGcm9tU2VydmVyKTtcclxuXHJcbiAgICAgIGlmKHJlc3BvbnNlICE9IG51bGwpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJUb0xvZyhcIkluY29taW5nIEhlYWRlcnMgOiBcIiArIEh0dHBDbGllbnRCYXNlLkhlYWRlcnNUb1N0cmluZyhyZXNwb25zZS5oZWFkZXJzLCB0cnVlKSk7XHJcblxyXG4gICAgICAgIC8vIHNldCB0aGUgbmV4dCBzZXNzaW9uIGNvdW50ZXIgKHdoaWNoIHdpbGwgYmUgZXhwZWN0ZWQgYnkgdGhlIHNlcnZlciBpbiB0aGUgbmV4dCByZXF1ZXN0KS5cclxuICAgICAgICBsZXQgbmV4dFNlc3Npb25Db3VudGVyU3RyaW5nOiBzdHJpbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIk1neHBhTmV4dFNlc3Npb25Db3VudGVyXCIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChuZXh0U2Vzc2lvbkNvdW50ZXJTdHJpbmcpKSB7XHJcbiAgICAgICAgICBIdHRwQ2xpZW50RXZlbnRzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXIoK25leHRTZXNzaW9uQ291bnRlclN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlV2FybmluZ1RvTG9nKGV4KTtcclxuICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbnRlbnRGcm9tU2VydmVyLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIEhUVFAgcmVxdWVzdCBhbmQgbWFrZSB0aGUgcmVzcG9uc2Ugb2JqZWN0LiBJdCBjYW4gZXhlY3V0ZVxyXG4gIC8vLyAgIEdFVCBvciBQT1NUIHJlcXVlc3QuIEluIGNhc2Ugb2YgUE9TVCByZXF1ZXN0IHRoZSB2YXJpYWJsZXMgdG8gc2VydmVyIHdpbGwgY29udGFpbiB0aGVcclxuICAvLy8gICB2YXJpYWJsZXMgdG8gYmUgc2VuZCB0byB0aGUgc2VydmVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidXJsU3RyaW5nXCI+VVJMIHRvIGJlIGFjY2Vzc2VkLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVxdWVzdENvbnRlbnRcIj5jb250ZW50IHRvIGJlIHNlbnQgdG8gc2VydmVyIChyZWxldmFudCBvbmx5IGZvciBQT1NUIG1ldGhvZCAtIGlzIG51bGwgZm9yIG90aGVyIG1ldGhvZHMpLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaHR0cE1ldGhvZFwiPmVudW0gUmVxdWVzdE1ldGhvZCB0byBzcGVjaWZ5IHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRGcm9tU2VydmVyXCI+Y29udGVudCByZWNlaXZlZCBmcm9tIHRoZSByZXNwb25zZS4gW09VVF08L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBFeGVjdXRlSHR0cFJlcXVlc3QodXJsU3RyaW5nOiBzdHJpbmcsIHJlcXVlc3RDb250ZW50OiBzdHJpbmcsIHVzZUNhY2hlOiBib29sZWFuLCBodHRwTWV0aG9kOiBSZXF1ZXN0TWV0aG9kLCBjb250ZW50RnJvbVNlcnZlcjogUmVmUGFyYW08YW55Pik6IFByb21pc2U8SHR0cFJlc3BvbnNlPHN0cmluZz4+XHJcbiAge1xyXG4gICAgbGV0IGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4gPSBudWxsO1xyXG5cclxuICAgIHRoaXMucHJlcGFyZVJlcXVlc3QoKTtcclxuXHJcbiAgICBsZXQgaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVM6IG51bWJlciA9IEh0dHBDbGllbnRFdmVudHMuR2V0SHR0cENvbW11bmljYXRpb25UaW1lb3V0KCk7XHJcbiAgICBsZXQgY2xpZW50SUQ6IHN0cmluZyA9IEh0dHBDbGllbnRFdmVudHMuR2V0R2xvYmFsVW5pcXVlU2Vzc2lvbklEKCk7XHJcblxyXG4gICAgbGV0IGV4ZWN1dGlvbkF0dGVtcHRzOiBudW1iZXIgPSAwOyAgLy8gZm9yIGxvZ2dpbmcgcHVycG9zZSBvbmx5LlxyXG5cclxuICAgIGxldCBzdGFydFRpbWU6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgLy8gUmV0cnlpbmc6XHJcbiAgICAvLyAgICBJcyBjb250cm9sbGVkIGJ5OlxyXG4gICAgLy8gICAgICAgKEkpICBUaGUgbWV0aG9kIHZhcmlhYmxlICdodHRwQ29tbXVuaWNhdGlvblRpbWVvdXRNUycgKGFib3ZlKSxcclxuICAgIC8vICAgICAgIChJSSkgVGhlIGNsYXNzIG1lbWJlciAnQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlcicgKGFib3ZlKS5cclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgIGV4ZWN1dGlvbkF0dGVtcHRzKys7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBUTFMgcHJvdG9jb2wuXHJcbiAgICAgICAgLy8gbGV0IHVzZUhpZ2hlc3RTZWN1cml0eVByb3RvY29sOiBib29sZWFuID0gSHR0cENsaWVudEJhc2UuR2V0VXNlSGlnaGVzdFNlY3VyaXR5UHJvdG9jb2woKTtcclxuICAgICAgICAvLyBpZiAodXNlSGlnaGVzdFNlY3VyaXR5UHJvdG9jb2wpIHtcclxuICAgICAgICAvLyAgIFNlcnZpY2VQb2ludE1hbmFnZXIuU2VjdXJpdHlQcm90b2NvbCA9IFNlY3VyaXR5UHJvdG9jb2xUeXBlLlRsczEyO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gRG8gbm90IGFkZCBNZ3hwYVJJQWdsb2JhbFVuaXF1ZVNlc3Npb25JRCB3aGlsZSBnZXR0aW5nIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzXHJcbiAgICAgICAgLy8gVE9ETzogaGVhZGVycyBzaG91bGQgbm90IGJlIHNlbnQgZm9yIGNhY2hlZCBmaWxlIHJlcXVlc3RzXHJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJzOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG5cclxuICAgICAgICBodHRwSGVhZGVycyA9IHRoaXMuYWRkSGVhZGVycyh1cmxTdHJpbmcsIHVzZUNhY2hlLCBodHRwSGVhZGVycywgY2xpZW50SUQpO1xyXG5cclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlJlcXVlc3QgVGltZW91dCBzZXQgdG8gezB9IG1zXCIsIGh0dHBDb21tdW5pY2F0aW9uVGltZW91dE1TKSk7XHJcblxyXG4gICAgICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgICAgIGxldCBjb250ZW50TGVuZ3RoOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKGh0dHBNZXRob2QgPT09IFJlcXVlc3RNZXRob2QuR2V0KSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJ0czogc3RyaW5nW10gPSB1cmxTdHJpbmcuc3BsaXQoJz8nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpXHJcbiAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IHBhcnRzWzFdLmxlbmd0aDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgLy8gKGh0dHBSZXF1ZXN0Lm1ldGhvZCA9PT0gUmVxdWVzdE1ldGhvZC5Qb3N0KVxyXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gcmVxdWVzdENvbnRlbnQubGVuZ3RoO1xyXG5cclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUJhc2ljVG9Mb2coTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24uTWVzc2FnZUxlYXZpbmcsXHJcbiAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuR2V0UnVudGltZUN0eElEKCksXHJcbiAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuR2V0U2Vzc2lvbkNvdW50ZXIoKSxcclxuICAgICAgICAgICAgY2xpZW50SUQsXHJcbiAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuU2hvdWxkRGlzcGxheUdlbmVyaWNFcnJvcigpID8gXCItXCIgOiBuZXcgVVJMKHVybFN0cmluZykuaG9zdCxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgJy0nLFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShodHRwSGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVCZWZvcmVSZXF1ZXN0OiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiQWNjZXNzaW5nIChtZXRob2Q6ICd7MH0nKTogJ3sxfSdcIiwgaHR0cE1ldGhvZCwgdXJsU3RyaW5nKSk7XHJcblxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKFwiT3V0Z29pbmcgSGVhZGVycyA6IFwiICsgSHR0cENsaWVudEJhc2UuSGVhZGVyc1RvU3RyaW5nKGh0dHBIZWFkZXJzLCBmYWxzZSkpO1xyXG5cclxuICAgICAgICBpZiAoaHR0cE1ldGhvZCA9PT0gUmVxdWVzdE1ldGhvZC5Qb3N0KSB7XHJcbiAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgRXhwZWN0MTAwQ29udGludWUuXHJcbiAgICAgICAgICAvLyBodHRwV2ViUmVxdWVzdC5TZXJ2aWNlUG9pbnQuRXhwZWN0MTAwQ29udGludWUgPSB0aGlzLkdldEhUVFBFeHBlY3QxMDBDb250aW51ZSgpO1xyXG4gICAgICAgICAgLy8gdGhpcy5Xcml0ZUNvbnRlbnRUb1JlcXVlc3QocmVxdWVzdENvbnRlbnQsIGh0dHBXZWJSZXF1ZXN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAvLyBzZW5kIHRoZSByZXF1ZXN0ICYgZ2V0IHRoZSByZXNwb25zZTpcclxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgLy8gVE9ETyA6IEhhbmRsZSBlcnJvcnNcclxuICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGltZW91dFxyXG5cclxuICAgICAgICBsZXQgcmVxdWVzdFRpbWU6bnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5Mb2dSZXF1ZXN0SW5mbyghaXNOdWxsT3JVbmRlZmluZWQocmVxdWVzdENvbnRlbnQpID8gcmVxdWVzdENvbnRlbnQubGVuZ3RoIDogMCwgcmVxdWVzdFRpbWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgaHR0cFJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdFRvU2VydmVyKGh0dHBNZXRob2QsIHVybFN0cmluZywgaHR0cEhlYWRlcnMsIHJlcXVlc3RDb250ZW50LCBjb250ZW50RnJvbVNlcnZlcik7XHJcblxyXG4gICAgICAgIHRoaXMubG9nUmVzcG9uc2UoaHR0cFJlc3BvbnNlLCBjbGllbnRJRCwgdXJsU3RyaW5nLCBjb250ZW50RnJvbVNlcnZlciwgdGltZUJlZm9yZVJlcXVlc3QpO1xyXG5cclxuICAgICAgICB0aGlzLkxvZ1JlcXVlc3RJbmZvKCFpc051bGxPclVuZGVmaW5lZChyZXF1ZXN0Q29udGVudCkgPyByZXF1ZXN0Q29udGVudC5sZW5ndGggOiAwLCBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gcmVxdWVzdFRpbWUsIHRydWUpO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKVxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlQmFzaWNFcnJvclRvTG9nKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlV2FybmluZ1RvTG9nKGV4KTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVIdHRwRXJyb3JFeGNlcHRpb24oZXgsIHVybFN0cmluZyk7XHJcblxyXG4gICAgICAgIGxldCBzdGFydFRpbWVSZWY6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihzdGFydFRpbWUpO1xyXG4gICAgICAgIGlmKHRoaXMuc2hvdWxkUmV0cnkoaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMsIHVybFN0cmluZywgdGhpcy5Db21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyLCBleCwgc3RhcnRUaW1lUmVmKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBzdGFydFRpbWUgPSBzdGFydFRpbWVSZWYudmFsdWU7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9nQW5kVGhyb3dFeGNlcHRpb24oZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2dFeGVjdXRpb25BdHRlbXB0cyhleGVjdXRpb25BdHRlbXB0cyk7XHJcblxyXG4gICAgcmV0dXJuIGh0dHBSZXNwb25zZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTG9nIHRoZSByZXF1ZXN0IGluZm8gd2hpbGUgc2VuZGluZyByZXF1ZXN0L2FmdGVyIHJlY2VpdmluZyByZXNwb25zZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBMb2dSZXF1ZXN0SW5mbyhjb250ZW50TGVuZ3RoOiBudW1iZXIsIHJvdW5kVHJpcDogbnVtYmVyLCBpc0xvZ2dpbmdSZXNwb25zZTogYm9vbGVhbikge1xyXG4gICAgaWYgKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCA9PSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvKSB7XHJcbiAgICAgIEh0dHBDbGllbnRFdmVudHMuQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvKGNvbnRlbnRMZW5ndGgsIHJvdW5kVHJpcCwgaXNMb2dnaW5nUmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PldyaXRlIE1nKiBwcmVmaXhlZCBoZWFkZXJzIHRvIHN0cmluZyBpbiBmb3JtYXQgXCJIRUFERVIxOlZBTFVFMSBIRUFERVIyOlZBTFVFMiAuLi5cIjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoZWFkZXJzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJiRmlsdGVyXCI+aWYgdHJ1ZSwgbGlzdCBvbmx5IGhlYWRlcnMgcHJlZml4ZWQgd2l0aCBcIk1nXCI8L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIEhlYWRlcnNUb1N0cmluZyhoZWFkZXJzOiBIdHRwSGVhZGVycywgYkZpbHRlcjogYm9vbGVhbik6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IGhlYWRlcnNTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IGhlYWRlcktleXM6IHN0cmluZ1tdID0gaGVhZGVycy5rZXlzKCk7XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIGhlYWRlcktleXMpIHtcclxuICAgICAgLy8gZmlsdGVyIG9ubHkgaGVhZGVycyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIE1nKiAoc2VudCBmcm9tIHRoZSBNaWRkbGV3YXJlIGFuZCBTZXJ2ZXIpOlxyXG4gICAgICBpZiAoIWJGaWx0ZXIgfHwgaGVhZGVyS2V5c1trZXldLnN0YXJ0c1dpdGgoXCJNZ1wiKSlcclxuICAgICAgICBoZWFkZXJzU3RyLkFwcGVuZChOU3RyaW5nLkZvcm1hdChcInswfTp7MX0gXCIsIGhlYWRlcktleXNba2V5XSwgaGVhZGVycy5nZXQoaGVhZGVyS2V5c1trZXldKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXJzU3RyO1xyXG4gIH1cclxuXHJcbiAgLy8gQWJzdHJhY3QgbWV0aG9kc1xyXG4gIGFic3RyYWN0IHByZXBhcmVSZXF1ZXN0KCk7XHJcbiAgYWJzdHJhY3QgYWRkSGVhZGVycyh1cmxTdHJpbmc6IHN0cmluZywgdXNlQ2FjaGU6IGJvb2xlYW4sIGh0dHBIZWFkZXJzOiBIdHRwSGVhZGVycywgY2xpZW50SUQ6IHN0cmluZyk6IEh0dHBIZWFkZXJzO1xyXG4gIGFzeW5jIHNlbmRSZXF1ZXN0VG9TZXJ2ZXIoaHR0cE1ldGhvZDogUmVxdWVzdE1ldGhvZCwgdXJsU3RyaW5nOiBzdHJpbmcsIGh0dHBIZWFkZXJzOiBIdHRwSGVhZGVycywgcmVxdWVzdENvbnRlbnQ6IHN0cmluZywgY29udGVudEZyb21TZXJ2ZXI6IFJlZlBhcmFtPHN0cmluZz4pOiBQcm9taXNlPGFueT57XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG4gIGFic3RyYWN0IGxvZ1Jlc3BvbnNlKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4sIGNsaWVudElEOiBzdHJpbmcsIHVybFN0cmluZzogc3RyaW5nLCBjb250ZW50RnJvbVNlcnZlcjogUmVmUGFyYW08YW55PiwgdGltZUJlZm9yZVJlcXVlc3Q6IG51bWJlcik7XHJcbiAgYWJzdHJhY3QgaGFuZGxlSHR0cEVycm9yRXhjZXB0aW9uKGV4OiBhbnksIHVybFN0cmluZzogc3RyaW5nKTtcclxuICBhc3luYyBzaG91bGRSZXRyeShodHRwQ29tbXVuaWNhdGlvblRpbWVvdXRNUzogbnVtYmVyLCB1cmxTdHJpbmc6IHN0cmluZywgY29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlcjogSUNvbW11bmljYXRpb25zRmFpbHVyZUhhbmRsZXIsIGV4OiBhbnksIHN0YXJ0VGltZVJlZjogUmVmUGFyYW08bnVtYmVyPik6IFByb21pc2U8Ym9vbGVhbj57XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICB9XHJcbiAgYWJzdHJhY3QgbG9nQW5kVGhyb3dFeGNlcHRpb24oZXg6IGFueSk7XHJcbiAgYWJzdHJhY3QgbG9nRXhlY3V0aW9uQXR0ZW1wdHMoZXhlY3V0aW9uQXR0ZW1wdHM6IG51bWJlcik7XHJcbn1cclxuIl19
1
+ import { NString, RefParam, StringBuilder, isNullOrUndefined } from "@magic-xpa/mscorelib";
2
+ import { Logger, Logger_LogLevels, Logger_MessageDirection, Misc } from "@magic-xpa/utils";
3
+ import { HttpClientEvents } from "./HttpClientEvents";
4
+ import { HttpHeaders } from "@angular/common/http";
5
+ export var RequestMethod;
6
+ (function (RequestMethod) {
7
+ RequestMethod[RequestMethod["Get"] = 0] = "Get";
8
+ RequestMethod[RequestMethod["Post"] = 1] = "Post";
9
+ RequestMethod[RequestMethod["Put"] = 2] = "Put";
10
+ RequestMethod[RequestMethod["Delete"] = 3] = "Delete";
11
+ RequestMethod[RequestMethod["Options"] = 4] = "Options";
12
+ RequestMethod[RequestMethod["Head"] = 5] = "Head";
13
+ RequestMethod[RequestMethod["Patch"] = 6] = "Patch";
14
+ })(RequestMethod || (RequestMethod = {}));
15
+ export class HttpClientBase {
16
+ _HTTPMaxURLLength = 2048;
17
+ CommunicationsFailureHandler = null;
18
+ constructor() {
19
+ this.CommunicationsFailureHandler = null;
20
+ }
21
+ DecideOnRequestMethod(requestContent, requestURL) {
22
+ let method = RequestMethod.Get;
23
+ if (requestContent === null) {
24
+ method = RequestMethod.Get;
25
+ }
26
+ else {
27
+ if (requestURL.value.length + 1 + requestContent.length <= this._HTTPMaxURLLength) {
28
+ requestURL.value = requestURL.value + "?" + requestContent;
29
+ method = RequestMethod.Get;
30
+ }
31
+ else {
32
+ method = RequestMethod.Post;
33
+ }
34
+ }
35
+ return method;
36
+ }
37
+ async GetContent(requestURL, requestContent, useCache) {
38
+ let contentFromServer = new RefParam(null);
39
+ let requestUrlRef = new RefParam(requestURL);
40
+ let httpMethod = this.DecideOnRequestMethod(requestContent, requestUrlRef);
41
+ requestURL = requestUrlRef.value;
42
+ try {
43
+ let response = await this.ExecuteHttpRequest(requestURL, requestContent, useCache, httpMethod, contentFromServer);
44
+ if (response != null) {
45
+ Logger.Instance.WriteServerToLog("Incoming Headers : " + HttpClientBase.HeadersToString(response.headers, true));
46
+ let nextSessionCounterString = response.headers.get("MgxpaNextSessionCounter".toLowerCase());
47
+ if (!isNullOrUndefined(nextSessionCounterString)) {
48
+ HttpClientEvents.CheckAndSetSessionCounter(+nextSessionCounterString);
49
+ }
50
+ }
51
+ }
52
+ catch (ex) {
53
+ Logger.Instance.WriteWarningToLog(ex);
54
+ throw ex;
55
+ }
56
+ return contentFromServer.value;
57
+ }
58
+ async ExecuteHttpRequest(urlString, requestContent, useCache, httpMethod, contentFromServer) {
59
+ let httpResponse = null;
60
+ this.prepareRequest();
61
+ let httpCommunicationTimeoutMS = HttpClientEvents.GetHttpCommunicationTimeout();
62
+ let clientID = HttpClientEvents.GetGlobalUniqueSessionID();
63
+ let executionAttempts = 0;
64
+ let startTime = Misc.getSystemMilliseconds();
65
+ while (true) {
66
+ executionAttempts++;
67
+ try {
68
+ let httpHeaders = new HttpHeaders();
69
+ httpHeaders = this.addHeaders(urlString, useCache, httpHeaders, clientID);
70
+ Logger.Instance.WriteServerToLog(NString.Format("Request Timeout set to {0} ms", httpCommunicationTimeoutMS));
71
+ if (Logger.Instance.LogLevel === Logger_LogLevels.Basic) {
72
+ let contentLength = 0;
73
+ if (httpMethod === RequestMethod.Get) {
74
+ let parts = urlString.split('?');
75
+ if (parts.length === 2)
76
+ contentLength = parts[1].length;
77
+ }
78
+ else
79
+ contentLength = requestContent.length;
80
+ Logger.Instance.WriteBasicToLog(Logger_MessageDirection.MessageLeaving, HttpClientEvents.GetRuntimeCtxID(), HttpClientEvents.GetSessionCounter(), clientID, HttpClientEvents.ShouldDisplayGenericError() ? "-" : new URL(urlString).host, 0, '-', JSON.stringify(httpHeaders), contentLength);
81
+ }
82
+ let timeBeforeRequest = Misc.getSystemMilliseconds();
83
+ Logger.Instance.WriteServerToLog(NString.Format("Accessing (method: '{0}'): '{1}'", httpMethod, urlString));
84
+ Logger.Instance.WriteServerToLog("Outgoing Headers : " + HttpClientBase.HeadersToString(httpHeaders, false));
85
+ if (httpMethod === RequestMethod.Post) {
86
+ }
87
+ let requestTime = Misc.getSystemMilliseconds();
88
+ this.LogRequestInfo(!isNullOrUndefined(requestContent) ? requestContent.length : 0, requestTime, false);
89
+ httpResponse = await this.sendRequestToServer(httpMethod, urlString, httpHeaders, requestContent, contentFromServer);
90
+ this.logResponse(httpResponse, clientID, urlString, contentFromServer, timeBeforeRequest);
91
+ this.LogRequestInfo(!isNullOrUndefined(requestContent) ? requestContent.length : 0, Misc.getSystemMilliseconds() - requestTime, true);
92
+ break;
93
+ }
94
+ catch (ex) {
95
+ if (Logger.Instance.LogLevel === Logger_LogLevels.Basic)
96
+ Logger.Instance.WriteBasicErrorToLog();
97
+ else
98
+ Logger.Instance.WriteWarningToLog(ex);
99
+ this.handleHttpErrorException(ex, urlString);
100
+ let startTimeRef = new RefParam(startTime);
101
+ if (this.shouldRetry(httpCommunicationTimeoutMS, urlString, this.CommunicationsFailureHandler, ex, startTimeRef)) {
102
+ startTime = startTimeRef.value;
103
+ continue;
104
+ }
105
+ this.logAndThrowException(ex);
106
+ }
107
+ }
108
+ this.logExecutionAttempts(executionAttempts);
109
+ return httpResponse;
110
+ }
111
+ LogRequestInfo(contentLength, roundTrip, isLoggingResponse) {
112
+ if (Logger.Instance.LogLevel == Logger_LogLevels.RequestInfo) {
113
+ HttpClientEvents.ComputeAndLogRequestInfo(contentLength, roundTrip, isLoggingResponse);
114
+ }
115
+ }
116
+ static HeadersToString(headers, bFilter) {
117
+ let headersStr = new StringBuilder();
118
+ let headerKeys = headers.keys();
119
+ for (let key in headerKeys) {
120
+ if (!bFilter || headerKeys[key].startsWith("Mg"))
121
+ headersStr.Append(NString.Format("{0}:{1} ", headerKeys[key], headers.get(headerKeys[key])));
122
+ }
123
+ return headersStr;
124
+ }
125
+ async sendRequestToServer(httpMethod, urlString, httpHeaders, requestContent, contentFromServer) {
126
+ return Promise.resolve();
127
+ }
128
+ async shouldRetry(httpCommunicationTimeoutMS, urlString, communicationsFailureHandler, ex, startTimeRef) {
129
+ return Promise.resolve(false);
130
+ }
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cENsaWVudEJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2h0dHAvY2xpZW50L0h0dHBDbGllbnRCYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLFdBQVcsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRy9ELE1BQU0sQ0FBTixJQUFZLGFBU1g7QUFURCxXQUFZLGFBQWE7SUFFdkIsK0NBQU8sQ0FBQTtJQUNQLGlEQUFRLENBQUE7SUFDUiwrQ0FBTyxDQUFBO0lBQ1AscURBQVUsQ0FBQTtJQUNWLHVEQUFXLENBQUE7SUFDWCxpREFBUSxDQUFBO0lBQ1IsbURBQVMsQ0FBQTtBQUNYLENBQUMsRUFUVyxhQUFhLEtBQWIsYUFBYSxRQVN4QjtBQVVELE1BQU0sT0FBZ0IsY0FBYztJQUMxQixpQkFBaUIsR0FBVyxJQUFJLENBQUM7SUFPekMsNEJBQTRCLEdBQWtDLElBQUksQ0FBQztJQUVuRTtRQUNFLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7SUFDM0MsQ0FBQztJQU9PLHFCQUFxQixDQUFDLGNBQXNCLEVBQUUsVUFBNEI7UUFDaEYsSUFBSSxNQUFNLEdBQWtCLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFFOUMsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBRTNCLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO1NBQzVCO2FBQ0k7WUFDSCxJQUFJLFVBQVUsQ0FBQyxL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M0IsQ0FBQztJQUdELEtBQUssQ0FBQyxXQUFXLENBQUMsMEJBQWtDLEVBQUUsU0FBaUIsRUFBRSw0QkFBMkQsRUFBRSxFQUFPLEVBQUUsWUFBOEI7UUFDM0ssT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtMb2dnZXIsIExvZ2dlcl9Mb2dMZXZlbHMsIExvZ2dlcl9NZXNzYWdlRGlyZWN0aW9uLCBNaXNjfSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge0lDb21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyfSBmcm9tIFwiLi9JQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlclwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnRFdmVudHN9IGZyb20gXCIuL0h0dHBDbGllbnRFdmVudHNcIjtcclxuaW1wb3J0IHtIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcblxyXG5leHBvcnQgZW51bSBSZXF1ZXN0TWV0aG9kXHJcbntcclxuICBHZXQgPSAwLFxyXG4gIFBvc3QgPSAxLFxyXG4gIFB1dCA9IDIsXHJcbiAgRGVsZXRlID0gMyxcclxuICBPcHRpb25zID0gNCxcclxuICBIZWFkID0gNSxcclxuICBQYXRjaCA9IDZcclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3I6XHJcbi8vLyAgICAoaSkgZGVjaWRpbmcgd2hpY2ggbWV0aG9kIHRvIHVzZSAoR0VUL1BPU1QpLlxyXG4vLy8gICAoaWkpIGhhbmRsaW5nIGNvbW11bmljYXRpb24gZmFpbHVyZXMuXHJcbi8vLyAgKGlpaSkgYWRkaW5nIEhUVFAgaGVhZGVycyB0byByZXF1ZXN0cy5cclxuLy8vICAoaVYpIHJldHJpZXZpbmcgSFRUUCBoZWFkZXJzIGZyb20gcmVzcG9uc2VzLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEh0dHBDbGllbnRCYXNlIHtcclxuICBwcml2YXRlIF9IVFRQTWF4VVJMTGVuZ3RoOiBudW1iZXIgPSAyMDQ4O1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgb3Igc2V0cyBhIGhhbmRsZXIgZm9yIGNvbW11bmljYXRpb25zIGZhaWx1cmUuIFRoaXMgcHJvcGVydHkgbWF5IGJlXHJcbiAgLy8vIHNldCB0byBudWxsLCBpbiB3aGljaCBjYXNlIHRoZSBIdHRwQ2xpZW50QmFzZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbCBhZnRlclxyXG4gIC8vLyB0aGUgZmlyc3QgcmVjb25uZWN0aW9uIGF0dGVtcHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBDb21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyOiBJQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlciA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5Db21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgcmVxdWVzdCBtZXRob2QgKFBPU1Qgb3IgR0VUKSBiYXNlZCBvbiBpdHMgY29udGVudHMgYW5kIGxlbmd0aC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlcXVlc3RVUkxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBEZWNpZGVPblJlcXVlc3RNZXRob2QocmVxdWVzdENvbnRlbnQ6IHN0cmluZywgcmVxdWVzdFVSTDogUmVmUGFyYW08c3RyaW5nPik6IFJlcXVlc3RNZXRob2Qge1xyXG4gICAgbGV0IG1ldGhvZDogUmVxdWVzdE1ldGhvZCA9IFJlcXVlc3RNZXRob2QuR2V0O1xyXG5cclxuICAgIGlmIChyZXF1ZXN0Q29udGVudCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyByZXF1ZXN0Q29udGVudCAoPT0gY29udGVudCB0byBiZSBzZW50IHRvIHNlcnZlcikgaXMgYWxsb3dlZCBvbmx5IGluIFBPU1QgcmVxdWVzdHMuIEluIGNhc2Ugbm8gY29udGVudCBpcyByZXF1aXJlZCwgb3B0IGZvciBHRVQgKGZvciB0aGUgYWZvcmVtZW50aW9uZWQgcGVyZm9ybWFuY2UgcmVhc29uKS5cclxuICAgICAgbWV0aG9kID0gUmVxdWVzdE1ldGhvZC5HZXQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHJlcXVlc3RVUkwudmFsdWUubGVuZ3RoICsgMSArIHJlcXVlc3RDb250ZW50Lmxlbmd0aCA8PSB0aGlzLl9IVFRQTWF4VVJMTGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gYXBwZW5kIHRoZSByZXF1ZXN0IGNvbnRlbnQgdG8gdGhlIFVSTCwgYW5kIHN3aXRjaCB0byB1c2luZyBhIEdFVCByZXF1ZXN0LlxyXG4gICAgICAgIHJlcXVlc3RVUkwudmFsdWUgPSByZXF1ZXN0VVJMLnZhbHVlICsgXCI/XCIgKyByZXF1ZXN0Q29udGVudDtcclxuICAgICAgICBtZXRob2QgPSBSZXF1ZXN0TWV0aG9kLkdldDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBtZXRob2QgPSBSZXF1ZXN0TWV0aG9kLlBvc3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWV0aG9kO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkdldHMgY29udGVudHMgb2YgYSBVUkwsIHVzaW5nIGVpdGhlciBHRVQgb3IgUE9TVCBtZXRob2RzLlxyXG4gIC8vLyBUaGUgbWV0aG9kIGV4ZWN1dGVzIHRoZSBIVFRQIHJlcXVlc3QsIHJlYWRzIHRoZSByZXNwb25zZSBhbmQgcmV0dXJuIHRoZSBjb250ZW50LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVxdWVzdFVSTFwiPlVSTCB0byBiZSBhY2Nlc3NlZC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlcXVlc3RDb250ZW50XCI+Y29udGVudCB0byBiZSBzZW50IHRvIHNlcnZlciAocmVsZXZhbnQgb25seSBmb3IgUE9TVCBtZXRob2QgLSBpcyBudWxsIGZvciBvdGhlciBtZXRob2RzKS48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5yZXNwb25zZSAoZnJvbSB0aGUgc2VydmVyKS48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0Q29udGVudChyZXF1ZXN0VVJMOiBzdHJpbmcsIHJlcXVlc3RDb250ZW50OiBhbnksIHVzZUNhY2hlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBjb250ZW50RnJvbVNlcnZlcjogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuICAgIGxldCByZXF1ZXN0VXJsUmVmOiBSZWZQYXJhbTxzdHJpbmc+ID0gbmV3IFJlZlBhcmFtKHJlcXVlc3RVUkwpO1xyXG5cclxuICAgIGxldCBodHRwTWV0aG9kOiBSZXF1ZXN0TWV0aG9kID0gdGhpcy5EZWNpZGVPblJlcXVlc3RNZXRob2QocmVxdWVzdENvbnRlbnQsIHJlcXVlc3RVcmxSZWYpO1xyXG4gICAgcmVxdWVzdFVSTCA9IHJlcXVlc3RVcmxSZWYudmFsdWU7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gRXhlY3V0ZSB0aGUgaHR0cCByZXF1ZXN0XHJcbiAgICAgIGxldCByZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4gPSBhd2FpdCB0aGlzLkV4ZWN1dGVIdHRwUmVxdWVzdChyZXF1ZXN0VVJMLCByZXF1ZXN0Q29udGVudCwgdXNlQ2FjaGUsIGh0dHBNZXRob2QsIGNvbnRlbnRGcm9tU2VydmVyKTtcclxuXHJcbiAgICAgIGlmKHJlc3BvbnNlICE9IG51bGwpIHtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJUb0xvZyhcIkluY29taW5nIEhlYWRlcnMgOiBcIiArIEh0dHBDbGllbnRCYXNlLkhlYWRlcnNUb1N0cmluZyhyZXNwb25zZS5oZWFkZXJzLCB0cnVlKSk7XHJcblxyXG4gICAgICAgIC8vIHNldCB0aGUgbmV4dCBzZXNzaW9uIGNvdW50ZXIgKHdoaWNoIHdpbGwgYmUgZXhwZWN0ZWQgYnkgdGhlIHNlcnZlciBpbiB0aGUgbmV4dCByZXF1ZXN0KS5cclxuICAgICAgICBsZXQgbmV4dFNlc3Npb25Db3VudGVyU3RyaW5nOiBzdHJpbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIk1neHBhTmV4dFNlc3Npb25Db3VudGVyXCIudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChuZXh0U2Vzc2lvbkNvdW50ZXJTdHJpbmcpKSB7XHJcbiAgICAgICAgICBIdHRwQ2xpZW50RXZlbnRzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXIoK25leHRTZXNzaW9uQ291bnRlclN0cmluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlV2FybmluZ1RvTG9nKGV4KTtcclxuICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbnRlbnRGcm9tU2VydmVyLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIEhUVFAgcmVxdWVzdCBhbmQgbWFrZSB0aGUgcmVzcG9uc2Ugb2JqZWN0LiBJdCBjYW4gZXhlY3V0ZVxyXG4gIC8vLyAgIEdFVCBvciBQT1NUIHJlcXVlc3QuIEluIGNhc2Ugb2YgUE9TVCByZXF1ZXN0IHRoZSB2YXJpYWJsZXMgdG8gc2VydmVyIHdpbGwgY29udGFpbiB0aGVcclxuICAvLy8gICB2YXJpYWJsZXMgdG8gYmUgc2VuZCB0byB0aGUgc2VydmVyLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidXJsU3RyaW5nXCI+VVJMIHRvIGJlIGFjY2Vzc2VkLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVxdWVzdENvbnRlbnRcIj5jb250ZW50IHRvIGJlIHNlbnQgdG8gc2VydmVyIChyZWxldmFudCBvbmx5IGZvciBQT1NUIG1ldGhvZCAtIGlzIG51bGwgZm9yIG90aGVyIG1ldGhvZHMpLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaHR0cE1ldGhvZFwiPmVudW0gUmVxdWVzdE1ldGhvZCB0byBzcGVjaWZ5IHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRGcm9tU2VydmVyXCI+Y29udGVudCByZWNlaXZlZCBmcm9tIHRoZSByZXNwb25zZS4gW09VVF08L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBFeGVjdXRlSHR0cFJlcXVlc3QodXJsU3RyaW5nOiBzdHJpbmcsIHJlcXVlc3RDb250ZW50OiBzdHJpbmcsIHVzZUNhY2hlOiBib29sZWFuLCBodHRwTWV0aG9kOiBSZXF1ZXN0TWV0aG9kLCBjb250ZW50RnJvbVNlcnZlcjogUmVmUGFyYW08YW55Pik6IFByb21pc2U8SHR0cFJlc3BvbnNlPHN0cmluZz4+XHJcbiAge1xyXG4gICAgbGV0IGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4gPSBudWxsO1xyXG5cclxuICAgIHRoaXMucHJlcGFyZVJlcXVlc3QoKTtcclxuXHJcbiAgICBsZXQgaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVM6IG51bWJlciA9IEh0dHBDbGllbnRFdmVudHMuR2V0SHR0cENvbW11bmljYXRpb25UaW1lb3V0KCk7XHJcbiAgICBsZXQgY2xpZW50SUQ6IHN0cmluZyA9IEh0dHBDbGllbnRFdmVudHMuR2V0R2xvYmFsVW5pcXVlU2Vzc2lvbklEKCk7XHJcblxyXG4gICAgbGV0IGV4ZWN1dGlvbkF0dGVtcHRzOiBudW1iZXIgPSAwOyAgLy8gZm9yIGxvZ2dpbmcgcHVycG9zZSBvbmx5LlxyXG5cclxuICAgIGxldCBzdGFydFRpbWU6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgLy8gUmV0cnlpbmc6XHJcbiAgICAvLyAgICBJcyBjb250cm9sbGVkIGJ5OlxyXG4gICAgLy8gICAgICAgKEkpICBUaGUgbWV0aG9kIHZhcmlhYmxlICdodHRwQ29tbXVuaWNhdGlvblRpbWVvdXRNUycgKGFib3ZlKSxcclxuICAgIC8vICAgICAgIChJSSkgVGhlIGNsYXNzIG1lbWJlciAnQ29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlcicgKGFib3ZlKS5cclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgIGV4ZWN1dGlvbkF0dGVtcHRzKys7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBUTFMgcHJvdG9jb2wuXHJcbiAgICAgICAgLy8gbGV0IHVzZUhpZ2hlc3RTZWN1cml0eVByb3RvY29sOiBib29sZWFuID0gSHR0cENsaWVudEJhc2UuR2V0VXNlSGlnaGVzdFNlY3VyaXR5UHJvdG9jb2woKTtcclxuICAgICAgICAvLyBpZiAodXNlSGlnaGVzdFNlY3VyaXR5UHJvdG9jb2wpIHtcclxuICAgICAgICAvLyAgIFNlcnZpY2VQb2ludE1hbmFnZXIuU2VjdXJpdHlQcm90b2NvbCA9IFNlY3VyaXR5UHJvdG9jb2xUeXBlLlRsczEyO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gRG8gbm90IGFkZCBNZ3hwYVJJQWdsb2JhbFVuaXF1ZVNlc3Npb25JRCB3aGlsZSBnZXR0aW5nIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzXHJcbiAgICAgICAgLy8gVE9ETzogaGVhZGVycyBzaG91bGQgbm90IGJlIHNlbnQgZm9yIGNhY2hlZCBmaWxlIHJlcXVlc3RzXHJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJzOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG5cclxuICAgICAgICBodHRwSGVhZGVycyA9IHRoaXMuYWRkSGVhZGVycyh1cmxTdHJpbmcsIHVzZUNhY2hlLCBodHRwSGVhZGVycywgY2xpZW50SUQpO1xyXG5cclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlJlcXVlc3QgVGltZW91dCBzZXQgdG8gezB9IG1zXCIsIGh0dHBDb21tdW5pY2F0aW9uVGltZW91dE1TKSk7XHJcblxyXG4gICAgICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgPT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpIHtcclxuICAgICAgICAgIGxldCBjb250ZW50TGVuZ3RoOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKGh0dHBNZXRob2QgPT09IFJlcXVlc3RNZXRob2QuR2V0KSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJ0czogc3RyaW5nW10gPSB1cmxTdHJpbmcuc3BsaXQoJz8nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpXHJcbiAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IHBhcnRzWzFdLmxlbmd0aDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgLy8gKGh0dHBSZXF1ZXN0Lm1ldGhvZCA9PT0gUmVxdWVzdE1ldGhvZC5Qb3N0KVxyXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gcmVxdWVzdENvbnRlbnQubGVuZ3RoO1xyXG5cclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUJhc2ljVG9Mb2coTG9nZ2VyX01lc3NhZ2VEaXJlY3Rpb24uTWVzc2FnZUxlYXZpbmcsXHJcbiAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuR2V0UnVudGltZUN0eElEKCksXHJcbiAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuR2V0U2Vzc2lvbkNvdW50ZXIoKSxcclxuICAgICAgICAgICAgY2xpZW50SUQsXHJcbiAgICAgICAgICAgIEh0dHBDbGllbnRFdmVudHMuU2hvdWxkRGlzcGxheUdlbmVyaWNFcnJvcigpID8gXCItXCIgOiBuZXcgVVJMKHVybFN0cmluZykuaG9zdCxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgJy0nLFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShodHRwSGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVCZWZvcmVSZXF1ZXN0OiBudW1iZXIgPSBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiQWNjZXNzaW5nIChtZXRob2Q6ICd7MH0nKTogJ3sxfSdcIiwgaHR0cE1ldGhvZCwgdXJsU3RyaW5nKSk7XHJcblxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlclRvTG9nKFwiT3V0Z29pbmcgSGVhZGVycyA6IFwiICsgSHR0cENsaWVudEJhc2UuSGVhZGVyc1RvU3RyaW5nKGh0dHBIZWFkZXJzLCBmYWxzZSkpO1xyXG5cclxuICAgICAgICBpZiAoaHR0cE1ldGhvZCA9PT0gUmVxdWVzdE1ldGhvZC5Qb3N0KSB7XHJcbiAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgRXhwZWN0MTAwQ29udGludWUuXHJcbiAgICAgICAgICAvLyBodHRwV2ViUmVxdWVzdC5TZXJ2aWNlUG9pbnQuRXhwZWN0MTAwQ29udGludWUgPSB0aGlzLkdldEhUVFBFeHBlY3QxMDBDb250aW51ZSgpO1xyXG4gICAgICAgICAgLy8gdGhpcy5Xcml0ZUNvbnRlbnRUb1JlcXVlc3QocmVxdWVzdENvbnRlbnQsIGh0dHBXZWJSZXF1ZXN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAvLyBzZW5kIHRoZSByZXF1ZXN0ICYgZ2V0IHRoZSByZXNwb25zZTpcclxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgLy8gVE9ETyA6IEhhbmRsZSBlcnJvcnNcclxuICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGltZW91dFxyXG5cclxuICAgICAgICBsZXQgcmVxdWVzdFRpbWU6bnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5Mb2dSZXF1ZXN0SW5mbyghaXNOdWxsT3JVbmRlZmluZWQocmVxdWVzdENvbnRlbnQpID8gcmVxdWVzdENvbnRlbnQubGVuZ3RoIDogMCwgcmVxdWVzdFRpbWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgaHR0cFJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdFRvU2VydmVyKGh0dHBNZXRob2QsIHVybFN0cmluZywgaHR0cEhlYWRlcnMsIHJlcXVlc3RDb250ZW50LCBjb250ZW50RnJvbVNlcnZlcik7XHJcblxyXG4gICAgICAgIHRoaXMubG9nUmVzcG9uc2UoaHR0cFJlc3BvbnNlLCBjbGllbnRJRCwgdXJsU3RyaW5nLCBjb250ZW50RnJvbVNlcnZlciwgdGltZUJlZm9yZVJlcXVlc3QpO1xyXG5cclxuICAgICAgICB0aGlzLkxvZ1JlcXVlc3RJbmZvKCFpc051bGxPclVuZGVmaW5lZChyZXF1ZXN0Q29udGVudCkgPyByZXF1ZXN0Q29udGVudC5sZW5ndGggOiAwLCBNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gcmVxdWVzdFRpbWUsIHRydWUpO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsID09PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKVxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlQmFzaWNFcnJvclRvTG9nKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlV2FybmluZ1RvTG9nKGV4KTtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVIdHRwRXJyb3JFeGNlcHRpb24oZXgsIHVybFN0cmluZyk7XHJcblxyXG4gICAgICAgIGxldCBzdGFydFRpbWVSZWY6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihzdGFydFRpbWUpO1xyXG4gICAgICAgIGlmKHRoaXMuc2hvdWxkUmV0cnkoaHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMsIHVybFN0cmluZywgdGhpcy5Db21tdW5pY2F0aW9uc0ZhaWx1cmVIYW5kbGVyLCBleCwgc3RhcnRUaW1lUmVmKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBzdGFydFRpbWUgPSBzdGFydFRpbWVSZWYudmFsdWU7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9nQW5kVGhyb3dFeGNlcHRpb24oZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2dFeGVjdXRpb25BdHRlbXB0cyhleGVjdXRpb25BdHRlbXB0cyk7XHJcblxyXG4gICAgcmV0dXJuIGh0dHBSZXNwb25zZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTG9nIHRoZSByZXF1ZXN0IGluZm8gd2hpbGUgc2VuZGluZyByZXF1ZXN0L2FmdGVyIHJlY2VpdmluZyByZXNwb25zZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBMb2dSZXF1ZXN0SW5mbyhjb250ZW50TGVuZ3RoOiBudW1iZXIsIHJvdW5kVHJpcDogbnVtYmVyLCBpc0xvZ2dpbmdSZXNwb25zZTogYm9vbGVhbikge1xyXG4gICAgaWYgKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCA9PSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvKSB7XHJcbiAgICAgIEh0dHBDbGllbnRFdmVudHMuQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvKGNvbnRlbnRMZW5ndGgsIHJvdW5kVHJpcCwgaXNMb2dnaW5nUmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PldyaXRlIE1nKiBwcmVmaXhlZCBoZWFkZXJzIHRvIHN0cmluZyBpbiBmb3JtYXQgXCJIRUFERVIxOlZBTFVFMSBIRUFERVIyOlZBTFVFMiAuLi5cIjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoZWFkZXJzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJiRmlsdGVyXCI+aWYgdHJ1ZSwgbGlzdCBvbmx5IGhlYWRlcnMgcHJlZml4ZWQgd2l0aCBcIk1nXCI8L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIEhlYWRlcnNUb1N0cmluZyhoZWFkZXJzOiBIdHRwSGVhZGVycywgYkZpbHRlcjogYm9vbGVhbik6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IGhlYWRlcnNTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IGhlYWRlcktleXM6IHN0cmluZ1tdID0gaGVhZGVycy5rZXlzKCk7XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIGhlYWRlcktleXMpIHtcclxuICAgICAgLy8gZmlsdGVyIG9ubHkgaGVhZGVycyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIE1nKiAoc2VudCBmcm9tIHRoZSBNaWRkbGV3YXJlIGFuZCBTZXJ2ZXIpOlxyXG4gICAgICBpZiAoIWJGaWx0ZXIgfHwgaGVhZGVyS2V5c1trZXldLnN0YXJ0c1dpdGgoXCJNZ1wiKSlcclxuICAgICAgICBoZWFkZXJzU3RyLkFwcGVuZChOU3RyaW5nLkZvcm1hdChcInswfTp7MX0gXCIsIGhlYWRlcktleXNba2V5XSwgaGVhZGVycy5nZXQoaGVhZGVyS2V5c1trZXldKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXJzU3RyO1xyXG4gIH1cclxuXHJcbiAgLy8gQWJzdHJhY3QgbWV0aG9kc1xyXG4gIGFic3RyYWN0IHByZXBhcmVSZXF1ZXN0KCk7XHJcbiAgYWJzdHJhY3QgYWRkSGVhZGVycyh1cmxTdHJpbmc6IHN0cmluZywgdXNlQ2FjaGU6IGJvb2xlYW4sIGh0dHBIZWFkZXJzOiBIdHRwSGVhZGVycywgY2xpZW50SUQ6IHN0cmluZyk6IEh0dHBIZWFkZXJzO1xyXG4gIGFzeW5jIHNlbmRSZXF1ZXN0VG9TZXJ2ZXIoaHR0cE1ldGhvZDogUmVxdWVzdE1ldGhvZCwgdXJsU3RyaW5nOiBzdHJpbmcsIGh0dHBIZWFkZXJzOiBIdHRwSGVhZGVycywgcmVxdWVzdENvbnRlbnQ6IHN0cmluZywgY29udGVudEZyb21TZXJ2ZXI6IFJlZlBhcmFtPHN0cmluZz4pOiBQcm9taXNlPGFueT57XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG4gIGFic3RyYWN0IGxvZ1Jlc3BvbnNlKGh0dHBSZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4sIGNsaWVudElEOiBzdHJpbmcsIHVybFN0cmluZzogc3RyaW5nLCBjb250ZW50RnJvbVNlcnZlcjogUmVmUGFyYW08YW55PiwgdGltZUJlZm9yZVJlcXVlc3Q6IG51bWJlcik7XHJcbiAgYWJzdHJhY3QgaGFuZGxlSHR0cEVycm9yRXhjZXB0aW9uKGV4OiBhbnksIHVybFN0cmluZzogc3RyaW5nKTtcclxuICBhc3luYyBzaG91bGRSZXRyeShodHRwQ29tbXVuaWNhdGlvblRpbWVvdXRNUzogbnVtYmVyLCB1cmxTdHJpbmc6IHN0cmluZywgY29tbXVuaWNhdGlvbnNGYWlsdXJlSGFuZGxlcjogSUNvbW11bmljYXRpb25zRmFpbHVyZUhhbmRsZXIsIGV4OiBhbnksIHN0YXJ0VGltZVJlZjogUmVmUGFyYW08bnVtYmVyPik6IFByb21pc2U8Ym9vbGVhbj57XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICB9XHJcbiAgYWJzdHJhY3QgbG9nQW5kVGhyb3dFeGNlcHRpb24oZXg6IGFueSk7XHJcbiAgYWJzdHJhY3QgbG9nRXhlY3V0aW9uQXR0ZW1wdHMoZXhlY3V0aW9uQXR0ZW1wdHM6IG51bWJlcik7XHJcbn1cclxuIl19