@theia/core 1.71.0-next.8 → 1.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +19 -19
  2. package/i18n/nls.cs.json +97 -51
  3. package/i18n/nls.de.json +97 -51
  4. package/i18n/nls.es.json +97 -51
  5. package/i18n/nls.fr.json +97 -51
  6. package/i18n/nls.hu.json +97 -51
  7. package/i18n/nls.it.json +97 -51
  8. package/i18n/nls.ja.json +97 -51
  9. package/i18n/nls.json +101 -55
  10. package/i18n/nls.ko.json +97 -51
  11. package/i18n/nls.pl.json +97 -51
  12. package/i18n/nls.pt-br.json +97 -51
  13. package/i18n/nls.ru.json +97 -51
  14. package/i18n/nls.tr.json +97 -51
  15. package/i18n/nls.zh-cn.json +97 -51
  16. package/i18n/nls.zh-tw.json +97 -51
  17. package/lib/browser/catalog.json +169 -10
  18. package/lib/browser/common-frontend-contribution.js +2 -2
  19. package/lib/browser/common-frontend-contribution.js.map +1 -1
  20. package/lib/browser/components/card.d.ts.map +1 -1
  21. package/lib/browser/components/card.js +11 -3
  22. package/lib/browser/components/card.js.map +1 -1
  23. package/lib/browser/connection-status-service.js +1 -1
  24. package/lib/browser/connection-status-service.js.map +1 -1
  25. package/lib/browser/frontend-application-contribution.d.ts +2 -2
  26. package/lib/browser/frontend-application-contribution.d.ts.map +1 -1
  27. package/lib/browser/frontend-application.d.ts +2 -0
  28. package/lib/browser/frontend-application.d.ts.map +1 -1
  29. package/lib/browser/frontend-application.js +15 -6
  30. package/lib/browser/frontend-application.js.map +1 -1
  31. package/lib/browser/keyboard/index.d.ts +1 -0
  32. package/lib/browser/keyboard/index.d.ts.map +1 -1
  33. package/lib/browser/keyboard/index.js +1 -0
  34. package/lib/browser/keyboard/index.js.map +1 -1
  35. package/lib/browser/keyboard/keyboard-utils.d.ts +17 -0
  36. package/lib/browser/keyboard/keyboard-utils.d.ts.map +1 -0
  37. package/lib/browser/keyboard/keyboard-utils.js +40 -0
  38. package/lib/browser/keyboard/keyboard-utils.js.map +1 -0
  39. package/lib/browser/menu/browser-menu-plugin.d.ts.map +1 -1
  40. package/lib/browser/menu/browser-menu-plugin.js +8 -1
  41. package/lib/browser/menu/browser-menu-plugin.js.map +1 -1
  42. package/lib/browser/messaging/connection-source.d.ts +2 -1
  43. package/lib/browser/messaging/connection-source.d.ts.map +1 -1
  44. package/lib/browser/messaging/connection-source.js.map +1 -1
  45. package/lib/browser/messaging/messaging-frontend-module.d.ts.map +1 -1
  46. package/lib/browser/messaging/messaging-frontend-module.js +3 -0
  47. package/lib/browser/messaging/messaging-frontend-module.js.map +1 -1
  48. package/lib/browser/messaging/service-connection-provider.d.ts +2 -2
  49. package/lib/browser/messaging/service-connection-provider.d.ts.map +1 -1
  50. package/lib/browser/messaging/service-connection-provider.js +2 -2
  51. package/lib/browser/messaging/service-connection-provider.js.map +1 -1
  52. package/lib/browser/messaging/ws-connection-provider.d.ts +1 -1
  53. package/lib/browser/messaging/ws-connection-provider.d.ts.map +1 -1
  54. package/lib/browser/messaging/ws-connection-provider.js +3 -3
  55. package/lib/browser/messaging/ws-connection-provider.js.map +1 -1
  56. package/lib/browser/messaging/ws-connection-source.d.ts +4 -2
  57. package/lib/browser/messaging/ws-connection-source.d.ts.map +1 -1
  58. package/lib/browser/messaging/ws-connection-source.js +15 -10
  59. package/lib/browser/messaging/ws-connection-source.js.map +1 -1
  60. package/lib/browser/performance/frontend-stopwatch.js +1 -1
  61. package/lib/browser/performance/frontend-stopwatch.js.map +1 -1
  62. package/lib/browser/preload/i18n-preload-contribution.d.ts +1 -1
  63. package/lib/browser/preload/i18n-preload-contribution.d.ts.map +1 -1
  64. package/lib/browser/preload/i18n-preload-contribution.js +2 -2
  65. package/lib/browser/preload/i18n-preload-contribution.js.map +1 -1
  66. package/lib/browser/preload/os-preload-contribution.d.ts +1 -1
  67. package/lib/browser/preload/os-preload-contribution.d.ts.map +1 -1
  68. package/lib/browser/preload/os-preload-contribution.js +6 -6
  69. package/lib/browser/preload/os-preload-contribution.js.map +1 -1
  70. package/lib/browser/saveable-service.d.ts +9 -2
  71. package/lib/browser/saveable-service.d.ts.map +1 -1
  72. package/lib/browser/saveable-service.js +34 -25
  73. package/lib/browser/saveable-service.js.map +1 -1
  74. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts +1 -0
  75. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts.map +1 -1
  76. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +10 -1
  77. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
  78. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.d.ts +2 -0
  79. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.d.ts.map +1 -1
  80. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.js +11 -2
  81. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.js.map +1 -1
  82. package/lib/browser/window/browser-window-module.d.ts.map +1 -1
  83. package/lib/browser/window/browser-window-module.js +2 -0
  84. package/lib/browser/window/browser-window-module.js.map +1 -1
  85. package/lib/browser/window/default-secondary-window-service.d.ts +2 -0
  86. package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
  87. package/lib/browser/window/default-secondary-window-service.js +7 -0
  88. package/lib/browser/window/default-secondary-window-service.js.map +1 -1
  89. package/lib/browser/window/window-focus-service.d.ts +71 -0
  90. package/lib/browser/window/window-focus-service.d.ts.map +1 -0
  91. package/lib/browser/window/window-focus-service.js +173 -0
  92. package/lib/browser/window/window-focus-service.js.map +1 -0
  93. package/lib/common/event.d.ts +16 -0
  94. package/lib/common/event.d.ts.map +1 -1
  95. package/lib/common/event.js +20 -2
  96. package/lib/common/event.js.map +1 -1
  97. package/lib/common/event.spec.js +63 -0
  98. package/lib/common/event.spec.js.map +1 -1
  99. package/lib/common/glob.d.ts +2 -0
  100. package/lib/common/glob.d.ts.map +1 -1
  101. package/lib/common/glob.js +8 -7
  102. package/lib/common/glob.js.map +1 -1
  103. package/lib/common/message-rpc/channel.d.ts +1 -1
  104. package/lib/common/message-rpc/channel.d.ts.map +1 -1
  105. package/lib/common/message-rpc/channel.js +20 -12
  106. package/lib/common/message-rpc/channel.js.map +1 -1
  107. package/lib/common/message-rpc/channel.spec.d.ts.map +1 -1
  108. package/lib/common/message-rpc/channel.spec.js +94 -0
  109. package/lib/common/message-rpc/channel.spec.js.map +1 -1
  110. package/lib/common/message-rpc/rpc-protocol.d.ts.map +1 -1
  111. package/lib/common/message-rpc/rpc-protocol.js +13 -3
  112. package/lib/common/message-rpc/rpc-protocol.js.map +1 -1
  113. package/lib/common/message-rpc/uint8-array-message-buffer.d.ts.map +1 -1
  114. package/lib/common/message-rpc/uint8-array-message-buffer.js +1 -1
  115. package/lib/common/message-rpc/uint8-array-message-buffer.js.map +1 -1
  116. package/lib/common/messaging/index.d.ts +1 -0
  117. package/lib/common/messaging/index.d.ts.map +1 -1
  118. package/lib/common/messaging/index.js +1 -0
  119. package/lib/common/messaging/index.js.map +1 -1
  120. package/lib/common/messaging/socket-write-buffer.d.ts +4 -3
  121. package/lib/common/messaging/socket-write-buffer.d.ts.map +1 -1
  122. package/lib/common/messaging/socket-write-buffer.js +14 -4
  123. package/lib/common/messaging/socket-write-buffer.js.map +1 -1
  124. package/lib/common/performance/index.d.ts +1 -0
  125. package/lib/common/performance/index.d.ts.map +1 -1
  126. package/lib/common/performance/index.js +1 -0
  127. package/lib/common/performance/index.js.map +1 -1
  128. package/lib/common/performance/simple-stopwatch.d.ts +18 -0
  129. package/lib/common/performance/simple-stopwatch.d.ts.map +1 -0
  130. package/lib/common/performance/simple-stopwatch.js +80 -0
  131. package/lib/common/performance/simple-stopwatch.js.map +1 -0
  132. package/lib/common/performance/stopwatch.d.ts +41 -0
  133. package/lib/common/performance/stopwatch.d.ts.map +1 -1
  134. package/lib/common/performance/stopwatch.js +89 -3
  135. package/lib/common/performance/stopwatch.js.map +1 -1
  136. package/lib/common/performance/stopwatch.spec.d.ts +2 -0
  137. package/lib/common/performance/stopwatch.spec.d.ts.map +1 -0
  138. package/lib/common/performance/stopwatch.spec.js +256 -0
  139. package/lib/common/performance/stopwatch.spec.js.map +1 -0
  140. package/lib/common/preferences/index.d.ts +1 -0
  141. package/lib/common/preferences/index.d.ts.map +1 -1
  142. package/lib/common/preferences/index.js +1 -0
  143. package/lib/common/preferences/index.js.map +1 -1
  144. package/lib/common/preferences/preference-utils.d.ts +6 -0
  145. package/lib/common/preferences/preference-utils.d.ts.map +1 -0
  146. package/lib/common/preferences/preference-utils.js +29 -0
  147. package/lib/common/preferences/preference-utils.js.map +1 -0
  148. package/lib/common/resource.d.ts +2 -0
  149. package/lib/common/resource.d.ts.map +1 -1
  150. package/lib/common/resource.js +7 -3
  151. package/lib/common/resource.js.map +1 -1
  152. package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
  153. package/lib/electron-browser/menu/electron-main-menu-factory.js +5 -1
  154. package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
  155. package/lib/electron-browser/messaging/electron-messaging-frontend-module.d.ts.map +1 -1
  156. package/lib/electron-browser/messaging/electron-messaging-frontend-module.js +3 -0
  157. package/lib/electron-browser/messaging/electron-messaging-frontend-module.js.map +1 -1
  158. package/lib/electron-browser/window/electron-window-module.d.ts.map +1 -1
  159. package/lib/electron-browser/window/electron-window-module.js +2 -0
  160. package/lib/electron-browser/window/electron-window-module.js.map +1 -1
  161. package/lib/electron-main/electron-api-main.d.ts.map +1 -1
  162. package/lib/electron-main/electron-api-main.js +4 -2
  163. package/lib/electron-main/electron-api-main.js.map +1 -1
  164. package/lib/electron-main/electron-main-application-module.d.ts.map +1 -1
  165. package/lib/electron-main/electron-main-application-module.js +3 -0
  166. package/lib/electron-main/electron-main-application-module.js.map +1 -1
  167. package/lib/electron-main/electron-main-application.d.ts +2 -0
  168. package/lib/electron-main/electron-main-application.d.ts.map +1 -1
  169. package/lib/electron-main/electron-main-application.js +14 -5
  170. package/lib/electron-main/electron-main-application.js.map +1 -1
  171. package/lib/electron-main/theia-electron-window.d.ts.map +1 -1
  172. package/lib/electron-main/theia-electron-window.js +3 -0
  173. package/lib/electron-main/theia-electron-window.js.map +1 -1
  174. package/lib/node/backend-application.d.ts +2 -0
  175. package/lib/node/backend-application.d.ts.map +1 -1
  176. package/lib/node/backend-application.js +17 -5
  177. package/lib/node/backend-application.js.map +1 -1
  178. package/lib/node/messaging/default-messaging-service.d.ts.map +1 -1
  179. package/lib/node/messaging/default-messaging-service.js +1 -0
  180. package/lib/node/messaging/default-messaging-service.js.map +1 -1
  181. package/lib/node/messaging/index.d.ts +1 -0
  182. package/lib/node/messaging/index.d.ts.map +1 -1
  183. package/lib/node/messaging/index.js +1 -0
  184. package/lib/node/messaging/index.js.map +1 -1
  185. package/lib/node/messaging/messaging-backend-module.d.ts.map +1 -1
  186. package/lib/node/messaging/messaging-backend-module.js +4 -0
  187. package/lib/node/messaging/messaging-backend-module.js.map +1 -1
  188. package/lib/node/messaging/test/default-messaging-service.spec.d.ts +2 -0
  189. package/lib/node/messaging/test/default-messaging-service.spec.d.ts.map +1 -0
  190. package/lib/node/messaging/test/default-messaging-service.spec.js +81 -0
  191. package/lib/node/messaging/test/default-messaging-service.spec.js.map +1 -0
  192. package/lib/node/messaging/websocket-frontend-connection-service.d.ts +9 -5
  193. package/lib/node/messaging/websocket-frontend-connection-service.d.ts.map +1 -1
  194. package/lib/node/messaging/websocket-frontend-connection-service.js +21 -5
  195. package/lib/node/messaging/websocket-frontend-connection-service.js.map +1 -1
  196. package/lib/node/performance/node-stopwatch.js +1 -1
  197. package/lib/node/performance/node-stopwatch.js.map +1 -1
  198. package/lib/node/process-utils.d.ts.map +1 -1
  199. package/lib/node/process-utils.js +9 -1
  200. package/lib/node/process-utils.js.map +1 -1
  201. package/package.json +34 -34
  202. package/src/browser/common-frontend-contribution.ts +2 -2
  203. package/src/browser/components/card.tsx +13 -2
  204. package/src/browser/connection-status-service.ts +1 -1
  205. package/src/browser/frontend-application-contribution.ts +2 -2
  206. package/src/browser/frontend-application.ts +26 -17
  207. package/src/browser/keyboard/index.ts +1 -0
  208. package/src/browser/keyboard/keyboard-utils.ts +37 -0
  209. package/src/browser/menu/browser-menu-plugin.ts +8 -1
  210. package/src/browser/messaging/connection-source.ts +2 -1
  211. package/src/browser/messaging/messaging-frontend-module.ts +3 -0
  212. package/src/browser/messaging/service-connection-provider.ts +2 -2
  213. package/src/browser/messaging/ws-connection-provider.ts +1 -1
  214. package/src/browser/messaging/ws-connection-source.ts +7 -4
  215. package/src/browser/performance/frontend-stopwatch.ts +1 -1
  216. package/src/browser/preload/i18n-preload-contribution.ts +1 -1
  217. package/src/browser/preload/os-preload-contribution.ts +1 -1
  218. package/src/browser/saveable-service.ts +34 -27
  219. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +14 -1
  220. package/src/browser/shell/tab-bar-toolbar/tab-toolbar-item.tsx +13 -2
  221. package/src/browser/style/card.css +4 -2
  222. package/src/browser/style/hover-service.css +7 -0
  223. package/src/browser/window/browser-window-module.ts +2 -0
  224. package/src/browser/window/default-secondary-window-service.ts +6 -0
  225. package/src/browser/window/window-focus-service.ts +187 -0
  226. package/src/common/event.spec.ts +80 -0
  227. package/src/common/event.ts +31 -2
  228. package/src/common/glob.ts +2 -2
  229. package/src/common/i18n/nls.metadata.json +4254 -1058
  230. package/src/common/message-rpc/channel.spec.ts +116 -0
  231. package/src/common/message-rpc/channel.ts +15 -11
  232. package/src/common/message-rpc/rpc-protocol.ts +12 -3
  233. package/src/common/message-rpc/uint8-array-message-buffer.ts +1 -1
  234. package/src/common/messaging/index.ts +1 -0
  235. package/src/common/messaging/socket-write-buffer.ts +10 -4
  236. package/src/common/performance/index.ts +1 -0
  237. package/src/common/performance/simple-stopwatch.ts +91 -0
  238. package/src/common/performance/stopwatch.spec.ts +321 -0
  239. package/src/common/performance/stopwatch.ts +103 -2
  240. package/src/common/preferences/index.ts +1 -0
  241. package/src/common/preferences/preference-utils.ts +28 -0
  242. package/src/common/resource.ts +8 -2
  243. package/src/electron-browser/menu/electron-main-menu-factory.ts +5 -1
  244. package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +3 -0
  245. package/src/electron-browser/window/electron-window-module.ts +2 -0
  246. package/src/electron-main/electron-api-main.ts +4 -2
  247. package/src/electron-main/electron-main-application-module.ts +3 -0
  248. package/src/electron-main/electron-main-application.ts +21 -5
  249. package/src/electron-main/theia-electron-window.ts +3 -0
  250. package/src/node/backend-application.ts +27 -10
  251. package/src/node/messaging/default-messaging-service.ts +1 -0
  252. package/src/node/messaging/index.ts +1 -0
  253. package/src/node/messaging/messaging-backend-module.ts +5 -1
  254. package/src/node/messaging/test/default-messaging-service.spec.ts +85 -0
  255. package/src/node/messaging/websocket-frontend-connection-service.ts +20 -7
  256. package/src/node/performance/node-stopwatch.ts +1 -1
  257. package/src/node/process-utils.ts +9 -1
@@ -14,13 +14,20 @@
14
14
  //
15
15
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
16
  // *****************************************************************************
17
+ var SocketWriteBuffer_1;
17
18
  Object.defineProperty(exports, "__esModule", { value: true });
18
19
  exports.SocketWriteBuffer = void 0;
19
- class SocketWriteBuffer {
20
+ const tslib_1 = require("tslib");
21
+ const inversify_1 = require("inversify");
22
+ let SocketWriteBuffer = class SocketWriteBuffer {
20
23
  constructor() {
21
24
  this.bufferWritePosition = 0;
22
25
  }
23
- static { this.DISCONNECTED_BUFFER_SIZE = 100 * 1024; }
26
+ static { SocketWriteBuffer_1 = this; }
27
+ static { this.DEFAULT_DISCONNECTED_BUFFER_SIZE = 100 * 1024; }
28
+ get maxBufferSize() {
29
+ return SocketWriteBuffer_1.DEFAULT_DISCONNECTED_BUFFER_SIZE;
30
+ }
24
31
  buffer(data) {
25
32
  this.ensureWriteBuffer(data.byteLength);
26
33
  this.disconnectedBuffer?.set(data, this.bufferWritePosition);
@@ -28,7 +35,7 @@ class SocketWriteBuffer {
28
35
  }
29
36
  ensureWriteBuffer(byteLength) {
30
37
  if (!this.disconnectedBuffer) {
31
- this.disconnectedBuffer = new Uint8Array(SocketWriteBuffer.DISCONNECTED_BUFFER_SIZE);
38
+ this.disconnectedBuffer = new Uint8Array(this.maxBufferSize);
32
39
  this.bufferWritePosition = 0;
33
40
  }
34
41
  if (this.bufferWritePosition + byteLength > this.disconnectedBuffer.byteLength) {
@@ -44,6 +51,9 @@ class SocketWriteBuffer {
44
51
  drain() {
45
52
  this.disconnectedBuffer = undefined;
46
53
  }
47
- }
54
+ };
48
55
  exports.SocketWriteBuffer = SocketWriteBuffer;
56
+ exports.SocketWriteBuffer = SocketWriteBuffer = SocketWriteBuffer_1 = tslib_1.__decorate([
57
+ (0, inversify_1.injectable)()
58
+ ], SocketWriteBuffer);
49
59
  //# sourceMappingURL=socket-write-buffer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"socket-write-buffer.js","sourceRoot":"","sources":["../../../src/common/messaging/socket-write-buffer.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAIhF,MAAa,iBAAiB;IAA9B;QAIY,wBAAmB,GAAG,CAAC,CAAC;IA6BpC,CAAC;aAhCkB,6BAAwB,GAAG,GAAG,GAAG,IAAI,AAAb,CAAc;IAKrD,MAAM,CAAC,IAAgB;QACnB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC7D,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC;IAChD,CAAC;IAES,iBAAiB,CAAC,UAAkB;QAC1C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,CAAC;YACrF,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,GAAG,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,mDAAmD,UAAU,QAAQ,CAAC,CAAC;QAC3F,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAiB;QACnB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACxC,CAAC;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACxC,CAAC;;AAhCL,8CAiCC"}
1
+ {"version":3,"file":"socket-write-buffer.js","sourceRoot":"","sources":["../../../src/common/messaging/socket-write-buffer.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;AAEhF,yCAAuC;AAIhC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAAvB;QAIO,wBAAmB,GAAG,CAAC,CAAC;IAiCtC,CAAC;;aApC2B,qCAAgC,GAAG,GAAG,GAAG,IAAI,AAAb,CAAc;IAKtE,IAAc,aAAa;QACvB,OAAO,mBAAiB,CAAC,gCAAgC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC7D,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC;IAChD,CAAC;IAES,iBAAiB,CAAC,UAAkB;QAC1C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,GAAG,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,mDAAmD,UAAU,QAAQ,CAAC,CAAC;QAC3F,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAiB;QACnB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACxC,CAAC;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACxC,CAAC;;AApCQ,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,sBAAU,GAAE;GACA,iBAAiB,CAqC7B"}
@@ -1,4 +1,5 @@
1
1
  export * from './measurement';
2
2
  export * from './stopwatch';
3
+ export * from './simple-stopwatch';
3
4
  export * from './measurement-protocol';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/performance/index.ts"],"names":[],"mappings":"AAgBA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/performance/index.ts"],"names":[],"mappings":"AAgBA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC"}
@@ -18,5 +18,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  const tslib_1 = require("tslib");
19
19
  tslib_1.__exportStar(require("./measurement"), exports);
20
20
  tslib_1.__exportStar(require("./stopwatch"), exports);
21
+ tslib_1.__exportStar(require("./simple-stopwatch"), exports);
21
22
  tslib_1.__exportStar(require("./measurement-protocol"), exports);
22
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/performance/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEhF,wDAA8B;AAC9B,sDAA4B;AAC5B,iEAAuC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/performance/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEhF,wDAA8B;AAC9B,sDAA4B;AAC5B,6DAAmC;AACnC,iEAAuC"}
@@ -0,0 +1,18 @@
1
+ import { Measurement, MeasurementOptions } from './measurement';
2
+ import { Stopwatch } from './stopwatch';
3
+ /**
4
+ * A simple {@link Stopwatch} that uses a caller-supplied time function and logs
5
+ * via `console`. Usable without Inversify DI: this class does not assign nor
6
+ * use the inherited `logger` field.
7
+ */
8
+ export declare class SimpleStopwatch extends Stopwatch {
9
+ constructor(owner: string, now: () => number);
10
+ start(name: string, options?: MeasurementOptions): Measurement;
11
+ protected log(measurement: Measurement, activity: string, options: {
12
+ now: () => number;
13
+ owner?: string;
14
+ context?: string;
15
+ arguments?: any[];
16
+ } & MeasurementOptions): void;
17
+ }
18
+ //# sourceMappingURL=simple-stopwatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-stopwatch.d.ts","sourceRoot":"","sources":["../../../src/common/performance/simple-stopwatch.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,SAAS;gBAE9B,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,MAAM;IAI5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW;cAU3C,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;QACxE,GAAG,EAAE,MAAM,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;KACrB,GAAG,kBAAkB,GAAG,IAAI;CA0ChC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 STMicroelectronics and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.SimpleStopwatch = void 0;
19
+ /* eslint-disable @typescript-eslint/no-explicit-any */
20
+ const logger_1 = require("../logger");
21
+ const stopwatch_1 = require("./stopwatch");
22
+ /**
23
+ * A simple {@link Stopwatch} that uses a caller-supplied time function and logs
24
+ * via `console`. Usable without Inversify DI: this class does not assign nor
25
+ * use the inherited `logger` field.
26
+ */
27
+ class SimpleStopwatch extends stopwatch_1.Stopwatch {
28
+ constructor(owner, now) {
29
+ super({ owner, now });
30
+ }
31
+ start(name, options) {
32
+ const now = this.defaultLogOptions.now;
33
+ const startTime = now();
34
+ return this.createMeasurement(name, () => ({
35
+ startTime,
36
+ duration: now() - startTime
37
+ }), options);
38
+ }
39
+ log(measurement, activity, options) {
40
+ const elapsed = measurement.stop();
41
+ const level = this.logLevel(elapsed, options);
42
+ if (Number.isNaN(elapsed)) {
43
+ switch (level) {
44
+ case logger_1.LogLevel.ERROR:
45
+ case logger_1.LogLevel.FATAL:
46
+ break;
47
+ default:
48
+ return;
49
+ }
50
+ }
51
+ const origin = options.owner ?? 'application';
52
+ const timeFromStart = `${(options.now() / 1000).toFixed(3)} s since ${origin} start`;
53
+ const whatWasMeasured = options.context ? `[${options.context}] ${activity}` : activity;
54
+ const message = `${whatWasMeasured}: ${elapsed.toFixed(1)} ms [${timeFromStart}]`;
55
+ const args = options.arguments ?? [];
56
+ switch (level) {
57
+ case logger_1.LogLevel.FATAL:
58
+ case logger_1.LogLevel.ERROR:
59
+ console.error(message, ...args);
60
+ break;
61
+ case logger_1.LogLevel.WARN:
62
+ console.warn(message, ...args);
63
+ break;
64
+ case logger_1.LogLevel.INFO:
65
+ console.info(message, ...args);
66
+ break;
67
+ case logger_1.LogLevel.DEBUG:
68
+ console.debug(message, ...args);
69
+ break;
70
+ case logger_1.LogLevel.TRACE:
71
+ console.trace(message, ...args);
72
+ break;
73
+ default:
74
+ console.log(message, ...args);
75
+ break;
76
+ }
77
+ }
78
+ }
79
+ exports.SimpleStopwatch = SimpleStopwatch;
80
+ //# sourceMappingURL=simple-stopwatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-stopwatch.js","sourceRoot":"","sources":["../../../src/common/performance/simple-stopwatch.ts"],"names":[],"mappings":"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"}
@@ -72,5 +72,46 @@ export declare abstract class Stopwatch {
72
72
  protected log(measurement: Measurement, activity: string, options: LogOptions): void;
73
73
  get storedMeasurements(): ReadonlyArray<MeasurementResult>;
74
74
  }
75
+ /**
76
+ * Tracks the settlement of async work initiated by contributions during application startup.
77
+ *
78
+ * A contribution "settles" when all promises it returned from lifecycle methods (initialize, configure, onStart, etc.)
79
+ * have resolved. Individual settlement is only logged when a contribution returned promises from more than one lifecycle
80
+ * method; otherwise the single lifecycle measurement already describes the work. An aggregate "all settled" message is
81
+ * logged once all tracked promises across all contributions have resolved.
82
+ *
83
+ * Typical usage:
84
+ * 1. Create the context at the start of the application lifecycle.
85
+ * 2. Before each lifecycle call, call {@link ensureEntry} to start the per-contribution clock.
86
+ * 3. After each lifecycle call, call {@link trackSettlement} with the return value.
87
+ * 4. After the startup sequence completes, call {@link armAllSettled} to enable the aggregate message.
88
+ */
89
+ export declare class MeasurementContext<T extends object = object> {
90
+ protected readonly stopwatch: Stopwatch;
91
+ protected readonly owner: string;
92
+ protected readonly thresholdMillis: number;
93
+ private readonly entries;
94
+ private readonly allSettledMeasurement;
95
+ private allSettledPending;
96
+ private allSettledArmed;
97
+ constructor(stopwatch: Stopwatch, owner: string, thresholdMillis: number);
98
+ /**
99
+ * Ensure that settlement tracking has been started for the given contribution.
100
+ * Starts the per-contribution measurement clock on the first call for each contribution.
101
+ */
102
+ ensureEntry(item: T): void;
103
+ /**
104
+ * Track a promise returned by a contribution's lifecycle method.
105
+ * Must be called after the corresponding {@link Stopwatch.startAsync} has completed so that
106
+ * the settlement log appears after the lifecycle measurement log.
107
+ */
108
+ trackSettlement(item: T, result: MaybePromise<unknown>): void;
109
+ /**
110
+ * Arm the aggregate "all settled" log message. Call this after the startup sequence has finished
111
+ * collecting all promises. If all promises have already settled, the message is logged immediately.
112
+ */
113
+ armAllSettled(): void;
114
+ private onPromiseSettled;
115
+ }
75
116
  export {};
76
117
  //# sourceMappingURL=stopwatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stopwatch.d.ts","sourceRoot":"","sources":["../../../src/common/performance/stopwatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;gFAcgF;AAKhF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAK1C;;GAEG;AACH,UAAU,UAAW,SAAQ,kBAAkB;IAC3C,gGAAgG;IAChG,GAAG,EAAE,MAAM,MAAM,CAAC;IAElB,gHAAgH;IAChH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qGAAqG;IACrG,aAAa,CAAC,EAAE,QAAQ,CAAC;IAEzB,gIAAgI;IAChI,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,8BACsB,SAAS;IAYF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,UAAU;IATzE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,SAAS,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,CAAM;IAExD,SAAS,CAAC,gCAAgC,6BAAoC;IAC9E,IAAI,yBAAyB,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAExD;gBAE2C,iBAAiB,EAAE,UAAU;IASzE;;;;;;OAMG;aACa,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW;IAE9E;;;;;;;;;;;;OAYG;IACU,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAa3I,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW;IAgC5I,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU;IAQvE,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,UAAU;IAIrG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ;IAQ5E,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAsBpF,IAAI,kBAAkB,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAEzD;CAEJ"}
1
+ {"version":3,"file":"stopwatch.d.ts","sourceRoot":"","sources":["../../../src/common/performance/stopwatch.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
16
  *******************************************************************************/
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.Stopwatch = void 0;
18
+ exports.MeasurementContext = exports.Stopwatch = void 0;
19
19
  const tslib_1 = require("tslib");
20
20
  /* eslint-disable @typescript-eslint/no-explicit-any */
21
21
  const inversify_1 = require("inversify");
@@ -125,8 +125,8 @@ let Stopwatch = class Stopwatch {
125
125
  return;
126
126
  }
127
127
  }
128
- const start = options.owner ? `${options.owner} start` : 'start';
129
- const timeFromStart = `Finished ${(options.now() / 1000).toFixed(3)} s after ${start}`;
128
+ const origin = options.owner ?? 'application';
129
+ const timeFromStart = `${(options.now() / 1000).toFixed(3)} s since ${origin} start`;
130
130
  const whatWasMeasured = options.context ? `[${options.context}] ${activity}` : activity;
131
131
  this.logger.log(level, `${whatWasMeasured}: ${elapsed.toFixed(1)} ms [${timeFromStart}]`, ...(options.arguments ?? []));
132
132
  }
@@ -144,4 +144,90 @@ exports.Stopwatch = Stopwatch = tslib_1.__decorate([
144
144
  tslib_1.__param(0, (0, inversify_1.unmanaged)()),
145
145
  tslib_1.__metadata("design:paramtypes", [Object])
146
146
  ], Stopwatch);
147
+ /**
148
+ * Tracks the settlement of async work initiated by contributions during application startup.
149
+ *
150
+ * A contribution "settles" when all promises it returned from lifecycle methods (initialize, configure, onStart, etc.)
151
+ * have resolved. Individual settlement is only logged when a contribution returned promises from more than one lifecycle
152
+ * method; otherwise the single lifecycle measurement already describes the work. An aggregate "all settled" message is
153
+ * logged once all tracked promises across all contributions have resolved.
154
+ *
155
+ * Typical usage:
156
+ * 1. Create the context at the start of the application lifecycle.
157
+ * 2. Before each lifecycle call, call {@link ensureEntry} to start the per-contribution clock.
158
+ * 3. After each lifecycle call, call {@link trackSettlement} with the return value.
159
+ * 4. After the startup sequence completes, call {@link armAllSettled} to enable the aggregate message.
160
+ */
161
+ class MeasurementContext {
162
+ constructor(stopwatch, owner, thresholdMillis) {
163
+ this.stopwatch = stopwatch;
164
+ this.owner = owner;
165
+ this.thresholdMillis = thresholdMillis;
166
+ this.entries = new Map();
167
+ this.allSettledPending = 0;
168
+ this.allSettledArmed = false;
169
+ this.allSettledMeasurement = this.stopwatch.start(`${owner.toLowerCase()}-all-settled`);
170
+ }
171
+ /**
172
+ * Ensure that settlement tracking has been started for the given contribution.
173
+ * Starts the per-contribution measurement clock on the first call for each contribution.
174
+ */
175
+ ensureEntry(item) {
176
+ if (!this.entries.has(item)) {
177
+ const name = item.constructor.name;
178
+ this.entries.set(item, {
179
+ name,
180
+ measurement: this.stopwatch.start(`${name}.settled`, { thresholdMillis: this.thresholdMillis }),
181
+ pending: 0,
182
+ total: 0
183
+ });
184
+ }
185
+ }
186
+ /**
187
+ * Track a promise returned by a contribution's lifecycle method.
188
+ * Must be called after the corresponding {@link Stopwatch.startAsync} has completed so that
189
+ * the settlement log appears after the lifecycle measurement log.
190
+ */
191
+ trackSettlement(item, result) {
192
+ if (result instanceof Promise) {
193
+ const entry = this.entries.get(item);
194
+ entry.pending++;
195
+ entry.total++;
196
+ this.allSettledPending++;
197
+ const onSettled = () => {
198
+ this.onPromiseSettled(item);
199
+ };
200
+ result.then(onSettled, onSettled);
201
+ }
202
+ }
203
+ /**
204
+ * Arm the aggregate "all settled" log message. Call this after the startup sequence has finished
205
+ * collecting all promises. If all promises have already settled, the message is logged immediately.
206
+ */
207
+ armAllSettled() {
208
+ this.allSettledArmed = true;
209
+ if (this.allSettledPending === 0) {
210
+ this.allSettledMeasurement.info(`All ${this.owner.toLowerCase()} contributions settled`);
211
+ }
212
+ }
213
+ onPromiseSettled(item) {
214
+ const entry = this.entries.get(item);
215
+ if (entry && --entry.pending === 0) {
216
+ const { name, measurement, total } = entry;
217
+ this.entries.delete(item);
218
+ if (total > 1) {
219
+ if (measurement.stop() > this.thresholdMillis) {
220
+ measurement.warn(`${this.owner} ${name} took longer than expected to settle`);
221
+ }
222
+ else {
223
+ measurement.debug(`${this.owner} ${name} settled`);
224
+ }
225
+ }
226
+ }
227
+ if (--this.allSettledPending === 0 && this.allSettledArmed) {
228
+ this.allSettledMeasurement.info(`All ${this.owner.toLowerCase()} contributions settled`);
229
+ }
230
+ }
231
+ }
232
+ exports.MeasurementContext = MeasurementContext;
147
233
  //# sourceMappingURL=stopwatch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../../src/common/performance/stopwatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../../src/common/performance/stopwatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stopwatch.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopwatch.spec.d.ts","sourceRoot":"","sources":["../../../src/common/performance/stopwatch.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 STMicroelectronics and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const chai_1 = require("chai");
19
+ const sinon = require("sinon");
20
+ const promise_util_1 = require("../promise-util");
21
+ const stopwatch_1 = require("./stopwatch");
22
+ const simple_stopwatch_1 = require("./simple-stopwatch");
23
+ /**
24
+ * A fake {@link Measurement} whose log methods are sinon spies, with a
25
+ * configurable duration returned by {@link stop}.
26
+ */
27
+ class FakeMeasurement {
28
+ constructor(name, duration = 0) {
29
+ this.log = sinon.spy();
30
+ this.info = sinon.spy();
31
+ this.debug = sinon.spy();
32
+ this.warn = sinon.spy();
33
+ this.error = sinon.spy();
34
+ this.stop = sinon.spy(() => {
35
+ if (this.elapsed === undefined) {
36
+ this.elapsed = this.duration;
37
+ }
38
+ return this.elapsed;
39
+ });
40
+ this.name = name;
41
+ this.duration = duration;
42
+ }
43
+ }
44
+ /**
45
+ * A fake {@link Stopwatch} that creates {@link FakeMeasurement}s with
46
+ * configurable durations and records all invocations of {@link start}.
47
+ */
48
+ class FakeStopwatch extends simple_stopwatch_1.SimpleStopwatch {
49
+ constructor() {
50
+ super('test', () => 0);
51
+ this.defaultDuration = 0;
52
+ this.durationByName = new Map();
53
+ this.created = [];
54
+ this.start = sinon.spy((name, _options) => {
55
+ const duration = this.durationByName.get(name) ?? this.defaultDuration;
56
+ const measurement = new FakeMeasurement(name, duration);
57
+ this.created.push(measurement);
58
+ return measurement;
59
+ });
60
+ }
61
+ /** Return the first measurement created with the given name, or `undefined`. */
62
+ measurementFor(name) {
63
+ return this.created.find(m => m.name === name);
64
+ }
65
+ }
66
+ class TestContribution {
67
+ }
68
+ class OtherTestContribution {
69
+ }
70
+ /**
71
+ * Allow any already-queued microtasks (such as `.then` callbacks attached to
72
+ * already-settled promises) to run before assertions.
73
+ */
74
+ async function flushPromises() {
75
+ for (let i = 0; i < 5; i++) {
76
+ await Promise.resolve();
77
+ }
78
+ }
79
+ describe('MeasurementContext', () => {
80
+ let stopwatch;
81
+ beforeEach(() => {
82
+ stopwatch = new FakeStopwatch();
83
+ });
84
+ describe('ensureEntry', () => {
85
+ it('starts a per-contribution measurement', () => {
86
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 250);
87
+ context.ensureEntry(new TestContribution());
88
+ sinon.assert.calledWith(stopwatch.start, 'TestContribution.settled', sinon.match({ thresholdMillis: 250 }));
89
+ });
90
+ it('starts a per-contribution measurement only once per item', () => {
91
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
92
+ const item = new TestContribution();
93
+ context.ensureEntry(item);
94
+ context.ensureEntry(item);
95
+ context.ensureEntry(item);
96
+ const started = stopwatch.start.getCalls().filter(c => c.args[0] === 'TestContribution.settled');
97
+ (0, chai_1.expect)(started).to.have.length(1);
98
+ });
99
+ it('starts independent measurements for distinct items', () => {
100
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
101
+ context.ensureEntry(new TestContribution());
102
+ context.ensureEntry(new TestContribution());
103
+ const started = stopwatch.start.getCalls().filter(c => c.args[0] === 'TestContribution.settled');
104
+ (0, chai_1.expect)(started).to.have.length(2);
105
+ });
106
+ });
107
+ describe('trackSettlement', () => {
108
+ it('is a no-op for a synchronous result', async () => {
109
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
110
+ const item = new TestContribution();
111
+ context.ensureEntry(item);
112
+ context.trackSettlement(item, undefined);
113
+ context.armAllSettled();
114
+ await flushPromises();
115
+ const perContribution = stopwatch.measurementFor('TestContribution.settled');
116
+ sinon.assert.notCalled(perContribution.debug);
117
+ sinon.assert.notCalled(perContribution.warn);
118
+ sinon.assert.notCalled(perContribution.info);
119
+ // Synchronous results do not increment allSettledPending, so arming fires the
120
+ // aggregate message immediately.
121
+ const allSettled = stopwatch.measurementFor('frontend-all-settled');
122
+ sinon.assert.calledOnce(allSettled.info);
123
+ });
124
+ it('does not log a per-contribution settlement when only one promise was tracked', async () => {
125
+ // The single lifecycle measurement already describes the duration of a solo tracked
126
+ // promise, so the per-contribution aggregate must stay silent.
127
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
128
+ const item = new TestContribution();
129
+ context.ensureEntry(item);
130
+ context.trackSettlement(item, Promise.resolve());
131
+ context.armAllSettled();
132
+ await flushPromises();
133
+ const perContribution = stopwatch.measurementFor('TestContribution.settled');
134
+ sinon.assert.notCalled(perContribution.debug);
135
+ sinon.assert.notCalled(perContribution.warn);
136
+ sinon.assert.notCalled(perContribution.info);
137
+ });
138
+ it('logs a debug settlement message once multiple tracked promises all resolve under the threshold', async () => {
139
+ stopwatch.durationByName.set('TestContribution.settled', 50);
140
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
141
+ const item = new TestContribution();
142
+ context.ensureEntry(item);
143
+ const first = new promise_util_1.Deferred();
144
+ const second = new promise_util_1.Deferred();
145
+ context.trackSettlement(item, first.promise);
146
+ context.trackSettlement(item, second.promise);
147
+ // Before any promise resolves, nothing has been logged.
148
+ const perContribution = stopwatch.measurementFor('TestContribution.settled');
149
+ sinon.assert.notCalled(perContribution.debug);
150
+ first.resolve();
151
+ await flushPromises();
152
+ sinon.assert.notCalled(perContribution.debug);
153
+ second.resolve();
154
+ await flushPromises();
155
+ sinon.assert.calledOnceWithExactly(perContribution.debug, 'Frontend TestContribution settled');
156
+ sinon.assert.notCalled(perContribution.warn);
157
+ });
158
+ it('logs a warn settlement message when multiple tracked promises exceed the threshold', async () => {
159
+ stopwatch.durationByName.set('TestContribution.settled', 500);
160
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
161
+ const item = new TestContribution();
162
+ context.ensureEntry(item);
163
+ context.trackSettlement(item, Promise.resolve());
164
+ context.trackSettlement(item, Promise.resolve());
165
+ await flushPromises();
166
+ const perContribution = stopwatch.measurementFor('TestContribution.settled');
167
+ sinon.assert.calledOnceWithExactly(perContribution.warn, 'Frontend TestContribution took longer than expected to settle');
168
+ sinon.assert.notCalled(perContribution.debug);
169
+ });
170
+ it('treats a rejected promise as settled', async () => {
171
+ stopwatch.durationByName.set('TestContribution.settled', 10);
172
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
173
+ const item = new TestContribution();
174
+ context.ensureEntry(item);
175
+ const rejecting = new promise_util_1.Deferred();
176
+ context.trackSettlement(item, Promise.resolve());
177
+ context.trackSettlement(item, rejecting.promise);
178
+ rejecting.reject(new Error('expected failure'));
179
+ await flushPromises();
180
+ const perContribution = stopwatch.measurementFor('TestContribution.settled');
181
+ sinon.assert.calledOnce(perContribution.debug);
182
+ });
183
+ it('tracks promises independently for each contribution', async () => {
184
+ stopwatch.durationByName.set('TestContribution.settled', 50);
185
+ stopwatch.durationByName.set('OtherTestContribution.settled', 50);
186
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
187
+ const a = new TestContribution();
188
+ const b = new OtherTestContribution();
189
+ context.ensureEntry(a);
190
+ context.ensureEntry(b);
191
+ context.trackSettlement(a, Promise.resolve());
192
+ context.trackSettlement(a, Promise.resolve());
193
+ context.trackSettlement(b, Promise.resolve());
194
+ await flushPromises();
195
+ // a had two tracked promises: logs once.
196
+ sinon.assert.calledOnce(stopwatch.measurementFor('TestContribution.settled').debug);
197
+ // b had a single tracked promise: logs nothing.
198
+ sinon.assert.notCalled(stopwatch.measurementFor('OtherTestContribution.settled').debug);
199
+ });
200
+ });
201
+ describe('armAllSettled', () => {
202
+ it('logs the aggregate message immediately when armed with zero pending promises', () => {
203
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
204
+ context.armAllSettled();
205
+ const allSettled = stopwatch.measurementFor('frontend-all-settled');
206
+ sinon.assert.calledOnceWithExactly(allSettled.info, 'All frontend contributions settled');
207
+ });
208
+ it('defers the aggregate log until the last tracked promise settles', async () => {
209
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
210
+ const item = new TestContribution();
211
+ context.ensureEntry(item);
212
+ const pending = new promise_util_1.Deferred();
213
+ context.trackSettlement(item, pending.promise);
214
+ context.armAllSettled();
215
+ const allSettled = stopwatch.measurementFor('frontend-all-settled');
216
+ sinon.assert.notCalled(allSettled.info);
217
+ pending.resolve();
218
+ await flushPromises();
219
+ sinon.assert.calledOnce(allSettled.info);
220
+ });
221
+ it('does not log the aggregate message when all promises settle before arming', async () => {
222
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
223
+ const item = new TestContribution();
224
+ context.ensureEntry(item);
225
+ context.trackSettlement(item, Promise.resolve());
226
+ await flushPromises();
227
+ const allSettled = stopwatch.measurementFor('frontend-all-settled');
228
+ sinon.assert.notCalled(allSettled.info);
229
+ });
230
+ it('logs the aggregate message when arming after all tracked promises have already settled', async () => {
231
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
232
+ const item = new TestContribution();
233
+ context.ensureEntry(item);
234
+ context.trackSettlement(item, Promise.resolve());
235
+ await flushPromises();
236
+ const allSettled = stopwatch.measurementFor('frontend-all-settled');
237
+ sinon.assert.notCalled(allSettled.info);
238
+ context.armAllSettled();
239
+ sinon.assert.calledOnce(allSettled.info);
240
+ });
241
+ it('logs the aggregate message exactly once when multiple contributions finish', async () => {
242
+ const context = new stopwatch_1.MeasurementContext(stopwatch, 'Frontend', 100);
243
+ const a = new TestContribution();
244
+ const b = new OtherTestContribution();
245
+ context.ensureEntry(a);
246
+ context.ensureEntry(b);
247
+ context.trackSettlement(a, Promise.resolve());
248
+ context.trackSettlement(b, Promise.resolve());
249
+ context.armAllSettled();
250
+ await flushPromises();
251
+ const allSettled = stopwatch.measurementFor('frontend-all-settled');
252
+ sinon.assert.calledOnce(allSettled.info);
253
+ });
254
+ });
255
+ });
256
+ //# sourceMappingURL=stopwatch.spec.js.map