@theia/core 1.27.0-next.9 → 1.27.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 (436) hide show
  1. package/README.md +6 -7
  2. package/i18n/nls.cs.json +52 -6
  3. package/i18n/nls.de.json +52 -6
  4. package/i18n/nls.es.json +52 -6
  5. package/i18n/nls.fr.json +52 -6
  6. package/i18n/nls.hu.json +55 -9
  7. package/i18n/nls.it.json +52 -6
  8. package/i18n/nls.ja.json +52 -6
  9. package/i18n/nls.json +52 -6
  10. package/i18n/nls.pl.json +52 -6
  11. package/i18n/nls.pt-br.json +52 -6
  12. package/i18n/nls.pt-pt.json +52 -6
  13. package/i18n/nls.ru.json +52 -6
  14. package/i18n/nls.zh-cn.json +52 -6
  15. package/lib/browser/color-application-contribution.d.ts +2 -2
  16. package/lib/browser/color-application-contribution.d.ts.map +1 -1
  17. package/lib/browser/color-application-contribution.js +15 -16
  18. package/lib/browser/color-application-contribution.js.map +1 -1
  19. package/lib/browser/color-registry.d.ts +0 -4
  20. package/lib/browser/color-registry.d.ts.map +1 -1
  21. package/lib/browser/color-registry.js +0 -14
  22. package/lib/browser/color-registry.js.map +1 -1
  23. package/lib/browser/common-frontend-contribution.d.ts +4 -0
  24. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  25. package/lib/browser/common-frontend-contribution.js +157 -163
  26. package/lib/browser/common-frontend-contribution.js.map +1 -1
  27. package/lib/browser/common-styling-participants.d.ts +28 -0
  28. package/lib/browser/common-styling-participants.d.ts.map +1 -0
  29. package/lib/browser/common-styling-participants.js +319 -0
  30. package/lib/browser/common-styling-participants.js.map +1 -0
  31. package/lib/browser/connection-status-service.d.ts.map +1 -1
  32. package/lib/browser/connection-status-service.js +2 -2
  33. package/lib/browser/connection-status-service.js.map +1 -1
  34. package/lib/browser/connection-status-service.spec.js +1 -2
  35. package/lib/browser/connection-status-service.spec.js.map +1 -1
  36. package/lib/browser/context-menu-renderer.d.ts +1 -5
  37. package/lib/browser/context-menu-renderer.d.ts.map +1 -1
  38. package/lib/browser/context-menu-renderer.js +10 -30
  39. package/lib/browser/context-menu-renderer.js.map +1 -1
  40. package/lib/browser/core-preferences.d.ts +1 -0
  41. package/lib/browser/core-preferences.d.ts.map +1 -1
  42. package/lib/browser/core-preferences.js +5 -0
  43. package/lib/browser/core-preferences.js.map +1 -1
  44. package/lib/browser/decoration-style.d.ts +1 -0
  45. package/lib/browser/decoration-style.d.ts.map +1 -1
  46. package/lib/browser/decoration-style.js +6 -2
  47. package/lib/browser/decoration-style.js.map +1 -1
  48. package/lib/browser/frontend-application-bindings.d.ts.map +1 -1
  49. package/lib/browser/frontend-application-bindings.js +1 -3
  50. package/lib/browser/frontend-application-bindings.js.map +1 -1
  51. package/lib/browser/frontend-application-config-provider.d.ts +1 -0
  52. package/lib/browser/frontend-application-config-provider.d.ts.map +1 -1
  53. package/lib/browser/frontend-application-config-provider.js +2 -1
  54. package/lib/browser/frontend-application-config-provider.js.map +1 -1
  55. package/lib/browser/frontend-application-module.d.ts.map +1 -1
  56. package/lib/browser/frontend-application-module.js +9 -3
  57. package/lib/browser/frontend-application-module.js.map +1 -1
  58. package/lib/browser/i18n/i18n-frontend-module.d.ts.map +1 -1
  59. package/lib/browser/i18n/i18n-frontend-module.js +2 -0
  60. package/lib/browser/i18n/i18n-frontend-module.js.map +1 -1
  61. package/lib/browser/i18n/language-quick-pick-service.d.ts +17 -0
  62. package/lib/browser/i18n/language-quick-pick-service.d.ts.map +1 -0
  63. package/lib/browser/i18n/language-quick-pick-service.js +142 -0
  64. package/lib/browser/i18n/language-quick-pick-service.js.map +1 -0
  65. package/lib/browser/index.d.ts +1 -0
  66. package/lib/browser/index.d.ts.map +1 -1
  67. package/lib/browser/index.js +1 -0
  68. package/lib/browser/index.js.map +1 -1
  69. package/lib/browser/keybinding.d.ts.map +1 -1
  70. package/lib/browser/keybinding.js +2 -1
  71. package/lib/browser/keybinding.js.map +1 -1
  72. package/lib/browser/keybinding.spec.js +18 -21
  73. package/lib/browser/keybinding.spec.js.map +1 -1
  74. package/lib/browser/label-provider.d.ts +0 -12
  75. package/lib/browser/label-provider.d.ts.map +1 -1
  76. package/lib/browser/label-provider.js +1 -13
  77. package/lib/browser/label-provider.js.map +1 -1
  78. package/lib/browser/logger-frontend-module.d.ts.map +1 -1
  79. package/lib/browser/logger-frontend-module.js +8 -1
  80. package/lib/browser/logger-frontend-module.js.map +1 -1
  81. package/lib/browser/messaging/ws-connection-provider.d.ts +5 -4
  82. package/lib/browser/messaging/ws-connection-provider.d.ts.map +1 -1
  83. package/lib/browser/messaging/ws-connection-provider.js +30 -23
  84. package/lib/browser/messaging/ws-connection-provider.js.map +1 -1
  85. package/lib/browser/preferences/preference-contribution.d.ts +2 -19
  86. package/lib/browser/preferences/preference-contribution.d.ts.map +1 -1
  87. package/lib/browser/preferences/preference-contribution.js +1 -24
  88. package/lib/browser/preferences/preference-contribution.js.map +1 -1
  89. package/lib/browser/preferences/preference-proxy.d.ts +0 -4
  90. package/lib/browser/preferences/preference-proxy.d.ts.map +1 -1
  91. package/lib/browser/preferences/preference-proxy.js.map +1 -1
  92. package/lib/browser/preferences/preference-proxy.spec.js +3 -102
  93. package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
  94. package/lib/browser/preferences/preference-schema-provider.spec.js +4 -3
  95. package/lib/browser/preferences/preference-schema-provider.spec.js.map +1 -1
  96. package/lib/browser/preferences/preference-service.spec.js +1 -2
  97. package/lib/browser/preferences/preference-service.spec.js.map +1 -1
  98. package/lib/browser/preferences/preference-validation-service.d.ts +2 -2
  99. package/lib/browser/preferences/preference-validation-service.d.ts.map +1 -1
  100. package/lib/browser/preferences/preference-validation-service.spec.js.map +1 -1
  101. package/lib/browser/preloader.d.ts.map +1 -1
  102. package/lib/browser/preloader.js +7 -1
  103. package/lib/browser/preloader.js.map +1 -1
  104. package/lib/browser/progress-status-bar-item.d.ts +1 -1
  105. package/lib/browser/progress-status-bar-item.d.ts.map +1 -1
  106. package/lib/browser/quick-input/quick-command-service.d.ts.map +1 -1
  107. package/lib/browser/quick-input/quick-command-service.js +2 -2
  108. package/lib/browser/quick-input/quick-command-service.js.map +1 -1
  109. package/lib/browser/saveable.d.ts.map +1 -1
  110. package/lib/browser/saveable.js +5 -4
  111. package/lib/browser/saveable.js.map +1 -1
  112. package/lib/browser/shell/application-shell.d.ts +4 -0
  113. package/lib/browser/shell/application-shell.d.ts.map +1 -1
  114. package/lib/browser/shell/application-shell.js +42 -36
  115. package/lib/browser/shell/application-shell.js.map +1 -1
  116. package/lib/browser/shell/shell-layout-restorer.d.ts +2 -0
  117. package/lib/browser/shell/shell-layout-restorer.d.ts.map +1 -1
  118. package/lib/browser/shell/shell-layout-restorer.js +5 -1
  119. package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
  120. package/lib/browser/shell/side-panel-handler.d.ts.map +1 -1
  121. package/lib/browser/shell/side-panel-handler.js +3 -2
  122. package/lib/browser/shell/side-panel-handler.js.map +1 -1
  123. package/lib/browser/shell/tab-bars.d.ts +4 -2
  124. package/lib/browser/shell/tab-bars.d.ts.map +1 -1
  125. package/lib/browser/shell/tab-bars.js +12 -4
  126. package/lib/browser/shell/tab-bars.js.map +1 -1
  127. package/lib/browser/source-tree/source-tree-widget.js +1 -1
  128. package/lib/browser/source-tree/source-tree-widget.js.map +1 -1
  129. package/lib/browser/source-tree/tree-source.d.ts +2 -1
  130. package/lib/browser/source-tree/tree-source.d.ts.map +1 -1
  131. package/lib/browser/source-tree/tree-source.js.map +1 -1
  132. package/lib/browser/styling-service.d.ts +26 -0
  133. package/lib/browser/styling-service.d.ts.map +1 -0
  134. package/lib/browser/styling-service.js +76 -0
  135. package/lib/browser/styling-service.js.map +1 -0
  136. package/lib/browser/theming.d.ts +4 -8
  137. package/lib/browser/theming.d.ts.map +1 -1
  138. package/lib/browser/theming.js +38 -53
  139. package/lib/browser/theming.js.map +1 -1
  140. package/lib/browser/tree/search-box.d.ts.map +1 -1
  141. package/lib/browser/tree/search-box.js +5 -4
  142. package/lib/browser/tree/search-box.js.map +1 -1
  143. package/lib/browser/tree/test/tree-test-container.d.ts.map +1 -1
  144. package/lib/browser/tree/test/tree-test-container.js +2 -0
  145. package/lib/browser/tree/test/tree-test-container.js.map +1 -1
  146. package/lib/browser/tree/tree-compression/compressed-tree-model.d.ts +1 -1
  147. package/lib/browser/tree/tree-compression/compressed-tree-model.d.ts.map +1 -1
  148. package/lib/browser/tree/tree-compression/compressed-tree-model.js +4 -2
  149. package/lib/browser/tree/tree-compression/compressed-tree-model.js.map +1 -1
  150. package/lib/browser/tree/tree-compression/compressed-tree-widget.d.ts.map +1 -1
  151. package/lib/browser/tree/tree-compression/compressed-tree-widget.js +4 -2
  152. package/lib/browser/tree/tree-compression/compressed-tree-widget.js.map +1 -1
  153. package/lib/browser/tree/tree-container.d.ts +2 -0
  154. package/lib/browser/tree/tree-container.d.ts.map +1 -1
  155. package/lib/browser/tree/tree-container.js +3 -0
  156. package/lib/browser/tree/tree-container.js.map +1 -1
  157. package/lib/browser/tree/tree-focus-service.d.ts +20 -0
  158. package/lib/browser/tree/tree-focus-service.d.ts.map +1 -0
  159. package/lib/browser/tree/tree-focus-service.js +62 -0
  160. package/lib/browser/tree/tree-focus-service.js.map +1 -0
  161. package/lib/browser/tree/tree-model.d.ts +11 -2
  162. package/lib/browser/tree/tree-model.d.ts.map +1 -1
  163. package/lib/browser/tree/tree-model.js +29 -8
  164. package/lib/browser/tree/tree-model.js.map +1 -1
  165. package/lib/browser/tree/tree-selection-impl.d.ts +4 -1
  166. package/lib/browser/tree/tree-selection-impl.d.ts.map +1 -1
  167. package/lib/browser/tree/tree-selection-impl.js +13 -2
  168. package/lib/browser/tree/tree-selection-impl.js.map +1 -1
  169. package/lib/browser/tree/tree-selection-state.d.ts +1 -0
  170. package/lib/browser/tree/tree-selection-state.d.ts.map +1 -1
  171. package/lib/browser/tree/tree-selection-state.js +8 -2
  172. package/lib/browser/tree/tree-selection-state.js.map +1 -1
  173. package/lib/browser/tree/tree-selection.d.ts +9 -0
  174. package/lib/browser/tree/tree-selection.d.ts.map +1 -1
  175. package/lib/browser/tree/tree-selection.js +3 -0
  176. package/lib/browser/tree/tree-selection.js.map +1 -1
  177. package/lib/browser/tree/tree-widget-selection.d.ts.map +1 -1
  178. package/lib/browser/tree/tree-widget-selection.js +9 -1
  179. package/lib/browser/tree/tree-widget-selection.js.map +1 -1
  180. package/lib/browser/tree/tree-widget.d.ts +14 -0
  181. package/lib/browser/tree/tree-widget.d.ts.map +1 -1
  182. package/lib/browser/tree/tree-widget.js +80 -40
  183. package/lib/browser/tree/tree-widget.js.map +1 -1
  184. package/lib/browser/tree/tree.d.ts +2 -1
  185. package/lib/browser/tree/tree.d.ts.map +1 -1
  186. package/lib/browser/tree/tree.js +12 -2
  187. package/lib/browser/tree/tree.js.map +1 -1
  188. package/lib/browser/view-container.d.ts +9 -4
  189. package/lib/browser/view-container.d.ts.map +1 -1
  190. package/lib/browser/view-container.js +36 -6
  191. package/lib/browser/view-container.js.map +1 -1
  192. package/lib/common/cancellation.d.ts +1 -0
  193. package/lib/common/cancellation.d.ts.map +1 -1
  194. package/lib/common/cancellation.js +8 -0
  195. package/lib/common/cancellation.js.map +1 -1
  196. package/lib/common/command.d.ts +1 -1
  197. package/lib/common/command.d.ts.map +1 -1
  198. package/lib/common/command.js +13 -16
  199. package/lib/common/command.js.map +1 -1
  200. package/lib/common/index.d.ts +1 -0
  201. package/lib/common/index.d.ts.map +1 -1
  202. package/lib/common/index.js +1 -0
  203. package/lib/common/index.js.map +1 -1
  204. package/lib/common/message-rpc/channel.d.ts +106 -0
  205. package/lib/common/message-rpc/channel.d.ts.map +1 -0
  206. package/lib/common/message-rpc/channel.js +195 -0
  207. package/lib/common/message-rpc/channel.js.map +1 -0
  208. package/lib/common/message-rpc/channel.spec.d.ts +9 -0
  209. package/lib/common/message-rpc/channel.spec.d.ts.map +1 -0
  210. package/lib/common/message-rpc/channel.spec.js +80 -0
  211. package/lib/common/message-rpc/channel.spec.js.map +1 -0
  212. package/lib/common/message-rpc/index.d.ts +4 -0
  213. package/lib/common/message-rpc/index.d.ts.map +1 -0
  214. package/lib/{node/messaging/logger.js → common/message-rpc/index.js} +6 -19
  215. package/lib/common/message-rpc/index.js.map +1 -0
  216. package/lib/common/message-rpc/message-buffer.d.ts +50 -0
  217. package/lib/common/message-rpc/message-buffer.d.ts.map +1 -0
  218. package/lib/common/message-rpc/message-buffer.js +56 -0
  219. package/lib/common/message-rpc/message-buffer.js.map +1 -0
  220. package/lib/common/message-rpc/rpc-message-encoder.d.ts +171 -0
  221. package/lib/common/message-rpc/rpc-message-encoder.d.ts.map +1 -0
  222. package/lib/common/message-rpc/rpc-message-encoder.js +409 -0
  223. package/lib/common/message-rpc/rpc-message-encoder.js.map +1 -0
  224. package/lib/common/message-rpc/rpc-message-encoder.spec.d.ts +2 -0
  225. package/lib/common/message-rpc/rpc-message-encoder.spec.d.ts.map +1 -0
  226. package/lib/common/message-rpc/rpc-message-encoder.spec.js +49 -0
  227. package/lib/common/message-rpc/rpc-message-encoder.spec.js.map +1 -0
  228. package/lib/common/message-rpc/rpc-protocol.d.ts +61 -0
  229. package/lib/common/message-rpc/rpc-protocol.d.ts.map +1 -0
  230. package/lib/common/message-rpc/rpc-protocol.js +183 -0
  231. package/lib/common/message-rpc/rpc-protocol.js.map +1 -0
  232. package/lib/common/message-rpc/uint8-array-message-buffer.d.ts +52 -0
  233. package/lib/common/message-rpc/uint8-array-message-buffer.d.ts.map +1 -0
  234. package/lib/common/message-rpc/uint8-array-message-buffer.js +169 -0
  235. package/lib/common/message-rpc/uint8-array-message-buffer.js.map +1 -0
  236. package/lib/common/message-rpc/uint8-array-message-buffer.spec.d.ts +2 -0
  237. package/lib/common/message-rpc/uint8-array-message-buffer.spec.d.ts.map +1 -0
  238. package/lib/common/message-rpc/uint8-array-message-buffer.spec.js +39 -0
  239. package/lib/common/message-rpc/uint8-array-message-buffer.spec.js.map +1 -0
  240. package/lib/common/messaging/abstract-connection-provider.d.ts +9 -8
  241. package/lib/common/messaging/abstract-connection-provider.d.ts.map +1 -1
  242. package/lib/common/messaging/abstract-connection-provider.js +20 -35
  243. package/lib/common/messaging/abstract-connection-provider.js.map +1 -1
  244. package/lib/common/messaging/connection-error-handler.d.ts +1 -2
  245. package/lib/common/messaging/connection-error-handler.d.ts.map +1 -1
  246. package/lib/common/messaging/connection-error-handler.js +1 -1
  247. package/lib/common/messaging/connection-error-handler.js.map +1 -1
  248. package/lib/common/messaging/handler.d.ts +2 -2
  249. package/lib/common/messaging/handler.d.ts.map +1 -1
  250. package/lib/common/messaging/proxy-factory.d.ts +13 -7
  251. package/lib/common/messaging/proxy-factory.d.ts.map +1 -1
  252. package/lib/common/messaging/proxy-factory.js +18 -13
  253. package/lib/common/messaging/proxy-factory.js.map +1 -1
  254. package/lib/common/messaging/proxy-factory.spec.js +4 -15
  255. package/lib/common/messaging/proxy-factory.spec.js.map +1 -1
  256. package/lib/common/messaging/web-socket-channel.d.ts +54 -48
  257. package/lib/common/messaging/web-socket-channel.d.ts.map +1 -1
  258. package/lib/common/messaging/web-socket-channel.js +41 -105
  259. package/lib/common/messaging/web-socket-channel.js.map +1 -1
  260. package/lib/common/nls.d.ts +2 -0
  261. package/lib/common/nls.d.ts.map +1 -1
  262. package/lib/common/nls.js +11 -0
  263. package/lib/common/nls.js.map +1 -1
  264. package/lib/common/preferences/preference-schema.d.ts +1 -5
  265. package/lib/common/preferences/preference-schema.d.ts.map +1 -1
  266. package/lib/common/preferences/preference-schema.js.map +1 -1
  267. package/lib/common/promise-util.d.ts +2 -1
  268. package/lib/common/promise-util.d.ts.map +1 -1
  269. package/lib/common/promise-util.js +8 -13
  270. package/lib/common/promise-util.js.map +1 -1
  271. package/lib/common/resource.d.ts +5 -0
  272. package/lib/common/resource.d.ts.map +1 -1
  273. package/lib/common/resource.js +28 -1
  274. package/lib/common/resource.js.map +1 -1
  275. package/lib/common/theme.d.ts +3 -2
  276. package/lib/common/theme.d.ts.map +1 -1
  277. package/lib/common/theme.js +5 -0
  278. package/lib/common/theme.js.map +1 -1
  279. package/lib/electron-browser/messaging/electron-ipc-connection-provider.d.ts +2 -2
  280. package/lib/electron-browser/messaging/electron-ipc-connection-provider.d.ts.map +1 -1
  281. package/lib/electron-browser/messaging/electron-ipc-connection-provider.js +18 -7
  282. package/lib/electron-browser/messaging/electron-ipc-connection-provider.js.map +1 -1
  283. package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts +2 -2
  284. package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts.map +1 -1
  285. package/lib/electron-browser/messaging/electron-ws-connection-provider.js +5 -7
  286. package/lib/electron-browser/messaging/electron-ws-connection-provider.js.map +1 -1
  287. package/lib/electron-main/event-utils.d.ts +1 -1
  288. package/lib/electron-main/messaging/electron-messaging-contribution.d.ts +37 -9
  289. package/lib/electron-main/messaging/electron-messaging-contribution.d.ts.map +1 -1
  290. package/lib/electron-main/messaging/electron-messaging-contribution.js +83 -68
  291. package/lib/electron-main/messaging/electron-messaging-contribution.js.map +1 -1
  292. package/lib/electron-main/messaging/electron-messaging-service.d.ts +2 -8
  293. package/lib/electron-main/messaging/electron-messaging-service.d.ts.map +1 -1
  294. package/lib/electron-main/messaging/electron-messaging-service.js.map +1 -1
  295. package/lib/node/messaging/binary-message-pipe.d.ts +45 -0
  296. package/lib/node/messaging/binary-message-pipe.d.ts.map +1 -0
  297. package/lib/node/messaging/binary-message-pipe.js +152 -0
  298. package/lib/node/messaging/binary-message-pipe.js.map +1 -0
  299. package/lib/node/messaging/ipc-bootstrap.js +2 -11
  300. package/lib/node/messaging/ipc-bootstrap.js.map +1 -1
  301. package/lib/node/messaging/ipc-channel.d.ts +26 -0
  302. package/lib/node/messaging/ipc-channel.d.ts.map +1 -0
  303. package/lib/node/messaging/ipc-channel.js +86 -0
  304. package/lib/node/messaging/ipc-channel.js.map +1 -0
  305. package/lib/node/messaging/ipc-connection-provider.d.ts +3 -5
  306. package/lib/node/messaging/ipc-connection-provider.d.ts.map +1 -1
  307. package/lib/node/messaging/ipc-connection-provider.js +14 -31
  308. package/lib/node/messaging/ipc-connection-provider.js.map +1 -1
  309. package/lib/node/messaging/ipc-protocol.d.ts +2 -2
  310. package/lib/node/messaging/ipc-protocol.d.ts.map +1 -1
  311. package/lib/node/messaging/messaging-contribution.d.ts +6 -9
  312. package/lib/node/messaging/messaging-contribution.d.ts.map +1 -1
  313. package/lib/node/messaging/messaging-contribution.js +23 -68
  314. package/lib/node/messaging/messaging-contribution.js.map +1 -1
  315. package/lib/node/messaging/messaging-service.d.ts +4 -23
  316. package/lib/node/messaging/messaging-service.d.ts.map +1 -1
  317. package/lib/node/messaging/messaging-service.js +1 -15
  318. package/lib/node/messaging/messaging-service.js.map +1 -1
  319. package/lib/node/messaging/test/test-web-socket-channel.d.ts +4 -2
  320. package/lib/node/messaging/test/test-web-socket-channel.d.ts.map +1 -1
  321. package/lib/node/messaging/test/test-web-socket-channel.js +25 -12
  322. package/lib/node/messaging/test/test-web-socket-channel.js.map +1 -1
  323. package/lib/node/request/proxy-cli-contribution.js +1 -1
  324. package/lib/node/request/proxy-cli-contribution.js.map +1 -1
  325. package/package.json +7 -10
  326. package/src/browser/color-application-contribution.ts +10 -17
  327. package/src/browser/color-registry.ts +0 -5
  328. package/src/browser/common-frontend-contribution.ts +26 -33
  329. package/src/browser/common-styling-participants.ts +307 -0
  330. package/src/browser/connection-status-service.spec.ts +1 -4
  331. package/src/browser/connection-status-service.ts +3 -3
  332. package/src/browser/context-menu-renderer.ts +13 -29
  333. package/src/browser/core-preferences.ts +6 -0
  334. package/src/browser/decoration-style.ts +6 -2
  335. package/src/browser/frontend-application-bindings.ts +1 -3
  336. package/src/browser/frontend-application-config-provider.ts +2 -0
  337. package/src/browser/frontend-application-module.ts +11 -4
  338. package/src/browser/i18n/i18n-frontend-module.ts +2 -0
  339. package/src/browser/i18n/language-quick-pick-service.ts +128 -0
  340. package/src/browser/index.ts +1 -0
  341. package/src/browser/keybinding.spec.ts +22 -27
  342. package/src/browser/keybinding.ts +2 -1
  343. package/src/browser/label-provider.ts +0 -13
  344. package/src/browser/logger-frontend-module.ts +8 -1
  345. package/src/browser/messaging/ws-connection-provider.ts +34 -25
  346. package/src/browser/preferences/preference-contribution.ts +3 -28
  347. package/src/browser/preferences/preference-proxy.spec.ts +3 -113
  348. package/src/browser/preferences/preference-proxy.ts +0 -4
  349. package/src/browser/preferences/preference-schema-provider.spec.ts +1 -4
  350. package/src/browser/preferences/preference-service.spec.ts +1 -5
  351. package/src/browser/preferences/preference-validation-service.spec.ts +2 -2
  352. package/src/browser/preferences/preference-validation-service.ts +2 -2
  353. package/src/browser/preloader.ts +9 -2
  354. package/src/browser/progress-status-bar-item.ts +1 -1
  355. package/src/browser/quick-input/quick-command-service.ts +3 -3
  356. package/src/browser/saveable.ts +5 -4
  357. package/src/browser/shell/application-shell.ts +42 -35
  358. package/src/browser/shell/shell-layout-restorer.ts +4 -6
  359. package/src/browser/shell/side-panel-handler.ts +3 -2
  360. package/src/browser/shell/tab-bars.ts +14 -4
  361. package/src/browser/source-tree/source-tree-widget.tsx +1 -1
  362. package/src/browser/source-tree/tree-source.ts +2 -1
  363. package/src/browser/style/breadcrumbs.css +0 -1
  364. package/src/browser/style/index.css +66 -29
  365. package/src/browser/style/menus.css +4 -2
  366. package/src/browser/style/select-component.css +2 -0
  367. package/src/browser/style/sidepanel.css +11 -25
  368. package/src/browser/style/status-bar.css +8 -17
  369. package/src/browser/style/tabs.css +0 -16
  370. package/src/browser/style/tooltip.css +3 -3
  371. package/src/browser/style/tree.css +27 -11
  372. package/src/browser/style/view-container.css +4 -0
  373. package/src/browser/styling-service.ts +76 -0
  374. package/src/browser/theming.ts +18 -45
  375. package/src/browser/tree/search-box.ts +5 -4
  376. package/src/browser/tree/test/tree-test-container.ts +2 -0
  377. package/src/browser/tree/tree-compression/compressed-tree-model.ts +8 -2
  378. package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +4 -2
  379. package/src/browser/tree/tree-container.ts +4 -0
  380. package/src/browser/tree/tree-focus-service.ts +55 -0
  381. package/src/browser/tree/tree-model.ts +32 -8
  382. package/src/browser/tree/tree-selection-impl.ts +13 -4
  383. package/src/browser/tree/tree-selection-state.ts +7 -2
  384. package/src/browser/tree/tree-selection.ts +10 -0
  385. package/src/browser/tree/tree-widget-selection.ts +10 -1
  386. package/src/browser/tree/tree-widget.tsx +83 -43
  387. package/src/browser/tree/tree.ts +8 -2
  388. package/src/browser/view-container.ts +41 -4
  389. package/src/common/cancellation.ts +8 -0
  390. package/src/common/command.ts +14 -16
  391. package/src/common/index.ts +1 -0
  392. package/src/common/message-rpc/channel.spec.ts +88 -0
  393. package/src/common/message-rpc/channel.ts +260 -0
  394. package/src/{node/messaging/logger.ts → common/message-rpc/index.ts} +4 -23
  395. package/src/common/message-rpc/message-buffer.ts +99 -0
  396. package/src/common/message-rpc/rpc-message-encoder.spec.ts +55 -0
  397. package/src/common/message-rpc/rpc-message-encoder.ts +552 -0
  398. package/src/common/message-rpc/rpc-protocol.ts +217 -0
  399. package/src/common/message-rpc/uint8-array-message-buffer.spec.ts +41 -0
  400. package/src/common/message-rpc/uint8-array-message-buffer.ts +206 -0
  401. package/src/common/messaging/abstract-connection-provider.ts +28 -37
  402. package/src/common/messaging/connection-error-handler.ts +1 -2
  403. package/src/common/messaging/handler.ts +2 -2
  404. package/src/common/messaging/proxy-factory.spec.ts +4 -17
  405. package/src/common/messaging/proxy-factory.ts +27 -16
  406. package/src/common/messaging/web-socket-channel.ts +79 -135
  407. package/src/common/nls.ts +11 -0
  408. package/src/common/preferences/preference-schema.ts +1 -6
  409. package/src/common/promise-util.ts +13 -14
  410. package/src/common/resource.ts +29 -2
  411. package/src/common/theme.ts +6 -2
  412. package/src/electron-browser/messaging/electron-ipc-connection-provider.ts +21 -7
  413. package/src/electron-browser/messaging/electron-ws-connection-provider.ts +5 -8
  414. package/src/electron-main/messaging/electron-messaging-contribution.ts +87 -65
  415. package/src/electron-main/messaging/electron-messaging-service.ts +2 -8
  416. package/src/node/messaging/binary-message-pipe.ts +168 -0
  417. package/src/node/messaging/ipc-bootstrap.ts +3 -11
  418. package/src/node/messaging/ipc-channel.ts +97 -0
  419. package/src/node/messaging/ipc-connection-provider.ts +18 -35
  420. package/src/node/messaging/ipc-protocol.ts +2 -2
  421. package/src/node/messaging/messaging-contribution.ts +29 -74
  422. package/src/node/messaging/messaging-service.ts +4 -31
  423. package/src/node/messaging/test/test-web-socket-channel.ts +26 -17
  424. package/src/node/request/proxy-cli-contribution.ts +1 -1
  425. package/lib/browser/preferences/validated-preference-proxy.d.ts +0 -21
  426. package/lib/browser/preferences/validated-preference-proxy.d.ts.map +0 -1
  427. package/lib/browser/preferences/validated-preference-proxy.js +0 -118
  428. package/lib/browser/preferences/validated-preference-proxy.js.map +0 -1
  429. package/lib/node/messaging/logger.d.ts +0 -8
  430. package/lib/node/messaging/logger.d.ts.map +0 -1
  431. package/lib/node/messaging/logger.js.map +0 -1
  432. package/shared/vscode-ws-jsonrpc/index.d.ts +0 -1
  433. package/shared/vscode-ws-jsonrpc/index.js +0 -1
  434. package/src/browser/preferences/validated-preference-proxy.ts +0 -111
  435. package/src/browser/style/variables-bright.useable.css +0 -93
  436. package/src/browser/style/variables-dark.useable.css +0 -93
@@ -258,11 +258,15 @@ export class TreeImpl implements Tree {
258
258
  return this._root;
259
259
  }
260
260
 
261
+ protected toDisposeOnSetRoot = new DisposableCollection();
261
262
  set root(root: TreeNode | undefined) {
263
+ this.toDisposeOnSetRoot.dispose();
264
+ const cancelRefresh = new CancellationTokenSource();
265
+ this.toDisposeOnSetRoot.push(cancelRefresh);
262
266
  this.nodes = {};
263
267
  this._root = root;
264
268
  this.addNode(root);
265
- this.refresh();
269
+ this.refresh(undefined, cancelRefresh.token);
266
270
  }
267
271
 
268
272
  get onChanged(): Event<void> {
@@ -291,7 +295,7 @@ export class TreeImpl implements Tree {
291
295
  return this.getNode(id);
292
296
  }
293
297
 
294
- async refresh(raw?: CompositeTreeNode): Promise<CompositeTreeNode | undefined> {
298
+ async refresh(raw?: CompositeTreeNode, cancellationToken?: CancellationToken): Promise<CompositeTreeNode | undefined> {
295
299
  const parent = !raw ? this._root : this.validateNode(raw);
296
300
  let result: CompositeTreeNode | undefined;
297
301
  if (CompositeTreeNode.is(parent)) {
@@ -300,7 +304,9 @@ export class TreeImpl implements Tree {
300
304
  try {
301
305
  result = parent;
302
306
  const children = await this.resolveChildren(parent);
307
+ if (cancellationToken?.isCancellationRequested) { return; }
303
308
  result = await this.setChildren(parent, children);
309
+ if (cancellationToken?.isCancellationRequested) { return; }
304
310
  } finally {
305
311
  busySource.cancel();
306
312
  }
@@ -57,12 +57,23 @@ export interface DescriptionWidget {
57
57
  onDidChangeDescription: Emitter<void>;
58
58
  }
59
59
 
60
+ export interface BadgeWidget {
61
+ badge: number | undefined;
62
+ onDidChangeBadge: Emitter<void>;
63
+ }
64
+
60
65
  export namespace DescriptionWidget {
61
66
  export function is(arg: Object | undefined): arg is DescriptionWidget {
62
67
  return !!arg && typeof arg === 'object' && 'onDidChangeDescription' in arg;
63
68
  }
64
69
  }
65
70
 
71
+ export namespace BadgeWidget {
72
+ export function is(arg: Object | undefined): arg is BadgeWidget {
73
+ return !!arg && typeof arg === 'object' && 'onDidChangeBadge' in arg;
74
+ }
75
+ }
76
+
66
77
  /**
67
78
  * A view container holds an arbitrary number of widgets inside a split panel.
68
79
  * Each widget is wrapped in a _part_ that displays the widget title and toolbar
@@ -912,10 +923,7 @@ export class ViewContainerPart extends BaseWidget {
912
923
  protected readonly body: HTMLElement;
913
924
  protected readonly collapsedEmitter = new Emitter<boolean>();
914
925
  protected readonly contextMenuEmitter = new Emitter<MouseEvent>();
915
- /**
916
- * @deprecated since 0.11.0, use `onDidChangeVisibility` instead
917
- */
918
- readonly onVisibilityChanged = this.onDidChangeVisibility;
926
+
919
927
  protected readonly onTitleChangedEmitter = new Emitter<void>();
920
928
  readonly onTitleChanged = this.onTitleChangedEmitter.event;
921
929
  protected readonly onDidFocusEmitter = new Emitter<this>();
@@ -924,6 +932,8 @@ export class ViewContainerPart extends BaseWidget {
924
932
  readonly onDidMove = this.onPartMovedEmitter.event;
925
933
  protected readonly onDidChangeDescriptionEmitter = new Emitter<void>();
926
934
  readonly onDidChangeDescription = this.onDidChangeDescriptionEmitter.event;
935
+ protected readonly onDidChangeBadgeEmitter = new Emitter<void>();
936
+ readonly onDidChangeBadge = this.onDidChangeBadgeEmitter.event;
927
937
 
928
938
  protected readonly toolbar: TabBarToolbar;
929
939
 
@@ -959,6 +969,11 @@ export class ViewContainerPart extends BaseWidget {
959
969
  this.toDispose.push(this.wrapped?.onDidChangeDescription.event(fireDescriptionChanged));
960
970
  }
961
971
 
972
+ if (BadgeWidget.is(this.wrapped)) {
973
+ const fireBadgeChanged = () => this.onDidChangeBadgeEmitter.fire(undefined);
974
+ this.toDispose.push(this.wrapped?.onDidChangeBadge.event(fireBadgeChanged));
975
+ }
976
+
962
977
  const { header, body, disposable } = this.createContent();
963
978
  this.header = header;
964
979
  this.body = body;
@@ -975,6 +990,7 @@ export class ViewContainerPart extends BaseWidget {
975
990
  this.contextMenuEmitter,
976
991
  this.onTitleChangedEmitter,
977
992
  this.onDidChangeDescriptionEmitter,
993
+ this.onDidChangeBadgeEmitter,
978
994
  this.registerContextMenu(),
979
995
  this.onDidFocusEmitter,
980
996
  // focus event does not bubble, capture it
@@ -1142,6 +1158,14 @@ export class ViewContainerPart extends BaseWidget {
1142
1158
  const description = document.createElement('span');
1143
1159
  description.classList.add('description');
1144
1160
 
1161
+ const badgeSpan = document.createElement('span');
1162
+ badgeSpan.classList.add('notification-count');
1163
+
1164
+ const badgeContainer = document.createElement('div');
1165
+ badgeContainer.classList.add('notification-count-container');
1166
+ badgeContainer.appendChild(badgeSpan);
1167
+ const badgeContainerDisplay = badgeContainer.style.display;
1168
+
1145
1169
  const updateTitle = () => {
1146
1170
  if (this.currentContainerId !== this.originalContainerId && this.originalContainerTitle?.label) {
1147
1171
  // Creating a title in format: <original_container_title>: <part_title>.
@@ -1154,20 +1178,33 @@ export class ViewContainerPart extends BaseWidget {
1154
1178
  const updateDescription = () => {
1155
1179
  description.innerText = DescriptionWidget.is(this.wrapped) && !this.collapsed && this.wrapped.description || '';
1156
1180
  };
1181
+ const updateBadge = () => {
1182
+ const visibleToolBarItems = this.toolbarRegistry.visibleItems(this.wrapped).length > 0;
1183
+ const badge = BadgeWidget.is(this.wrapped) && this.wrapped.badge;
1184
+ if (typeof badge === 'number' && !visibleToolBarItems) {
1185
+ badgeSpan.innerText = badge.toString();
1186
+ badgeContainer.style.display = badgeContainerDisplay;
1187
+ } else {
1188
+ badgeContainer.style.display = 'none';
1189
+ }
1190
+ };
1157
1191
 
1158
1192
  updateTitle();
1159
1193
  updateCaption();
1160
1194
  updateDescription();
1195
+ updateBadge();
1161
1196
 
1162
1197
  disposable.pushAll([
1163
1198
  this.onTitleChanged(updateTitle),
1164
1199
  this.onTitleChanged(updateCaption),
1165
1200
  this.onDidMove(updateTitle),
1166
1201
  this.onDidChangeDescription(updateDescription),
1202
+ this.onDidChangeBadge(updateBadge),
1167
1203
  this.onCollapsed(updateDescription)
1168
1204
  ]);
1169
1205
  header.appendChild(title);
1170
1206
  header.appendChild(description);
1207
+ header.appendChild(badgeContainer);
1171
1208
 
1172
1209
  return {
1173
1210
  header,
@@ -49,6 +49,14 @@ export namespace CancellationToken {
49
49
  isCancellationRequested: true,
50
50
  onCancellationRequested: shortcutEvent
51
51
  });
52
+
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ export function is(value: any): value is CancellationToken {
55
+ const candidate = value as CancellationToken;
56
+ return candidate && (candidate === CancellationToken.None
57
+ || candidate === CancellationToken.Cancelled
58
+ || (typeof candidate.isCancellationRequested === 'boolean' && !!candidate.onCancellationRequested));
59
+ }
52
60
  }
53
61
 
54
62
  export class CancellationError extends Error {
@@ -191,7 +191,7 @@ export class CommandRegistry implements CommandService {
191
191
  protected readonly toUnregisterCommands = new Map<string, Disposable>();
192
192
 
193
193
  // List of recently used commands.
194
- protected _recent: Command[] = [];
194
+ protected _recent: string[] = [];
195
195
 
196
196
  protected readonly onWillExecuteCommandEmitter = new Emitter<WillExecuteCommandEvent>();
197
197
  readonly onWillExecuteCommand = this.onWillExecuteCommandEmitter.event;
@@ -418,14 +418,7 @@ export class CommandRegistry implements CommandService {
418
418
  * Get all registered commands.
419
419
  */
420
420
  get commands(): Command[] {
421
- const commands: Command[] = [];
422
- for (const id of this.commandIds) {
423
- const cmd = this.getCommand(id);
424
- if (cmd) {
425
- commands.push(cmd);
426
- }
427
- }
428
- return commands;
421
+ return Object.values(this._commands);
429
422
  }
430
423
 
431
424
  /**
@@ -446,7 +439,14 @@ export class CommandRegistry implements CommandService {
446
439
  * Get the list of recently used commands.
447
440
  */
448
441
  get recent(): Command[] {
449
- return this._recent;
442
+ const commands: Command[] = [];
443
+ for (const recentId of this._recent) {
444
+ const command = this.getCommand(recentId);
445
+ if (command) {
446
+ commands.push(command);
447
+ }
448
+ }
449
+ return commands;
450
450
  }
451
451
 
452
452
  /**
@@ -454,7 +454,7 @@ export class CommandRegistry implements CommandService {
454
454
  * @param commands the list of recently used commands.
455
455
  */
456
456
  set recent(commands: Command[]) {
457
- this._recent = commands;
457
+ this._recent = Array.from(new Set(commands.map(e => e.id)));
458
458
  }
459
459
 
460
460
  /**
@@ -464,15 +464,13 @@ export class CommandRegistry implements CommandService {
464
464
  * @param recent a recent command, or array of recent commands.
465
465
  */
466
466
  addRecentCommand(recent: Command | Command[]): void {
467
- if (Array.isArray(recent)) {
468
- recent.forEach((command: Command) => this.addRecentCommand(command));
469
- } else {
467
+ for (const recentCommand of Array.isArray(recent) ? recent : [recent]) {
470
468
  // Determine if the command currently exists in the recently used list.
471
- const index = this._recent.findIndex((command: Command) => Command.equals(recent, command));
469
+ const index = this._recent.findIndex(commandId => commandId === recentCommand.id);
472
470
  // If the command exists, remove it from the array so it can later be placed at the top.
473
471
  if (index >= 0) { this._recent.splice(index, 1); }
474
472
  // Add the recent command to the beginning of the array (most recent).
475
- this._recent.unshift(recent);
473
+ this._recent.unshift(recentCommand.id);
476
474
  }
477
475
  }
478
476
 
@@ -29,6 +29,7 @@ export * from './contribution-provider';
29
29
  export * from './path';
30
30
  export * from './logger';
31
31
  export * from './messaging';
32
+ export * from './message-rpc';
32
33
  export * from './message-service';
33
34
  export * from './message-service-protocol';
34
35
  export * from './progress-service';
@@ -0,0 +1,88 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021 Red Hat, Inc. and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { assert, expect, spy, use } from 'chai';
18
+ import * as spies from 'chai-spies';
19
+ import { Uint8ArrayReadBuffer, Uint8ArrayWriteBuffer } from './uint8-array-message-buffer';
20
+ import { ChannelMultiplexer, ForwardingChannel, MessageProvider } from './channel';
21
+
22
+ use(spies);
23
+
24
+ /**
25
+ * A pipe with two channels at each end for testing.
26
+ */
27
+ export class ChannelPipe {
28
+ readonly left: ForwardingChannel = new ForwardingChannel('left', () => this.right.onCloseEmitter.fire({ reason: 'Left channel has been closed' }), () => {
29
+ const leftWrite = new Uint8ArrayWriteBuffer();
30
+ leftWrite.onCommit(buffer => {
31
+ this.right.onMessageEmitter.fire(() => new Uint8ArrayReadBuffer(buffer));
32
+ });
33
+ return leftWrite;
34
+ });
35
+ readonly right: ForwardingChannel = new ForwardingChannel('right', () => this.left.onCloseEmitter.fire({ reason: 'Right channel has been closed' }), () => {
36
+ const rightWrite = new Uint8ArrayWriteBuffer();
37
+ rightWrite.onCommit(buffer => {
38
+ this.left.onMessageEmitter.fire(() => new Uint8ArrayReadBuffer(buffer));
39
+ });
40
+ return rightWrite;
41
+ });
42
+ }
43
+ describe('Message Channel', () => {
44
+ describe('Channel multiplexer', () => {
45
+ it('should forward messages to intended target channel', async () => {
46
+ const pipe = new ChannelPipe();
47
+
48
+ const leftMultiplexer = new ChannelMultiplexer(pipe.left);
49
+ const rightMultiplexer = new ChannelMultiplexer(pipe.right);
50
+ const openChannelSpy = spy(() => {
51
+ });
52
+
53
+ rightMultiplexer.onDidOpenChannel(openChannelSpy);
54
+ leftMultiplexer.onDidOpenChannel(openChannelSpy);
55
+
56
+ const leftFirst = await leftMultiplexer.open('first');
57
+ const leftSecond = await leftMultiplexer.open('second');
58
+
59
+ const rightFirst = rightMultiplexer.getOpenChannel('first');
60
+ const rightSecond = rightMultiplexer.getOpenChannel('second');
61
+
62
+ assert.isNotNull(rightFirst);
63
+ assert.isNotNull(rightSecond);
64
+
65
+ const leftSecondSpy = spy((buf: MessageProvider) => {
66
+ const message = buf().readString();
67
+ expect(message).equal('message for second');
68
+ });
69
+
70
+ leftSecond.onMessage(leftSecondSpy);
71
+
72
+ const rightFirstSpy = spy((buf: MessageProvider) => {
73
+ const message = buf().readString();
74
+ expect(message).equal('message for first');
75
+ });
76
+
77
+ rightFirst!.onMessage(rightFirstSpy);
78
+
79
+ leftFirst.getWriteBuffer().writeString('message for first').commit();
80
+ rightSecond!.getWriteBuffer().writeString('message for second').commit();
81
+
82
+ expect(leftSecondSpy).to.be.called();
83
+ expect(rightFirstSpy).to.be.called();
84
+
85
+ expect(openChannelSpy).to.be.called.exactly(4);
86
+ });
87
+ });
88
+ });
@@ -0,0 +1,260 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021 Red Hat, Inc. and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { Disposable, DisposableCollection } from '../disposable';
18
+ import { Emitter, Event } from '../event';
19
+ import { ReadBuffer, WriteBuffer } from './message-buffer';
20
+
21
+ /**
22
+ * A channel is a bidirectional communications channel with lifecycle and
23
+ * error signalling. Note that creation of channels is specific to particular
24
+ * implementations and thus not part of the protocol.
25
+ */
26
+ export interface Channel {
27
+
28
+ /**
29
+ * The remote side has closed the channel
30
+ */
31
+ onClose: Event<ChannelCloseEvent>;
32
+
33
+ /**
34
+ * An error has occurred while writing to or reading from the channel
35
+ */
36
+ onError: Event<unknown>;
37
+
38
+ /**
39
+ * A message has arrived and can be read by listeners using a {@link MessageProvider}.
40
+ */
41
+ onMessage: Event<MessageProvider>;
42
+
43
+ /**
44
+ * Obtain a {@link WriteBuffer} to write a message to the channel.
45
+ */
46
+ getWriteBuffer(): WriteBuffer;
47
+
48
+ /**
49
+ * Close this channel. No {@link onClose} event should be sent
50
+ */
51
+ close(): void;
52
+ }
53
+
54
+ /**
55
+ * The event that is emitted when a channel is closed from the remote side.
56
+ */
57
+ export interface ChannelCloseEvent {
58
+ reason: string,
59
+ code?: number
60
+ };
61
+
62
+ /**
63
+ * The `MessageProvider` is emitted when a channel receives a new message.
64
+ * Listeners can invoke the provider to obtain a new {@link ReadBuffer} for the received message.
65
+ * This ensures that each listener has its own isolated {@link ReadBuffer} instance.
66
+ *
67
+ */
68
+ export type MessageProvider = () => ReadBuffer;
69
+
70
+ /**
71
+ * Helper class to implement the single channels on a {@link ChannelMultiplexer}. Simply forwards write requests to
72
+ * the given write buffer source i.e. the main channel of the {@link ChannelMultiplexer}.
73
+ */
74
+ export class ForwardingChannel implements Channel {
75
+
76
+ protected toDispose = new DisposableCollection();
77
+ constructor(readonly id: string, protected readonly closeHandler: () => void, protected readonly writeBufferSource: () => WriteBuffer) {
78
+ this.toDispose.pushAll([this.onCloseEmitter, this.onErrorEmitter, this.onMessageEmitter]);
79
+ }
80
+
81
+ onCloseEmitter: Emitter<ChannelCloseEvent> = new Emitter();
82
+ get onClose(): Event<ChannelCloseEvent> {
83
+ return this.onCloseEmitter.event;
84
+ };
85
+
86
+ onErrorEmitter: Emitter<unknown> = new Emitter();
87
+ get onError(): Event<unknown> {
88
+ return this.onErrorEmitter.event;
89
+ };
90
+
91
+ onMessageEmitter: Emitter<MessageProvider> = new Emitter();
92
+ get onMessage(): Event<MessageProvider> {
93
+ return this.onMessageEmitter.event;
94
+ };
95
+
96
+ getWriteBuffer(): WriteBuffer {
97
+ return this.writeBufferSource();
98
+ }
99
+
100
+ close(): void {
101
+ this.closeHandler();
102
+ this.toDispose.dispose();
103
+ }
104
+ }
105
+
106
+ /**
107
+ * The different message types used in the messaging protocol of the {@link ChannelMultiplexer}
108
+ */
109
+ export enum MessageTypes {
110
+ Open = 1,
111
+ Close = 2,
112
+ AckOpen = 3,
113
+ Data = 4
114
+ }
115
+
116
+ /**
117
+ * The write buffers in this implementation immediately write to the underlying
118
+ * channel, so we rely on writers to the multiplexed channels to always commit their
119
+ * messages and always in one go.
120
+ */
121
+ export class ChannelMultiplexer implements Disposable {
122
+ protected pendingOpen: Map<string, (channel: ForwardingChannel) => void> = new Map();
123
+ protected openChannels: Map<string, ForwardingChannel> = new Map();
124
+
125
+ protected readonly onOpenChannelEmitter = new Emitter<{ id: string, channel: Channel }>();
126
+ get onDidOpenChannel(): Event<{ id: string, channel: Channel }> {
127
+ return this.onOpenChannelEmitter.event;
128
+ }
129
+
130
+ protected toDispose = new DisposableCollection();
131
+
132
+ constructor(protected readonly underlyingChannel: Channel) {
133
+ this.toDispose.pushAll([
134
+ this.underlyingChannel.onMessage(buffer => this.handleMessage(buffer())),
135
+ this.underlyingChannel.onClose(event => this.onUnderlyingChannelClose(event)),
136
+ this.underlyingChannel.onError(error => this.handleError(error)),
137
+ this.onOpenChannelEmitter
138
+ ]);
139
+ }
140
+
141
+ protected handleError(error: unknown): void {
142
+ this.openChannels.forEach(channel => {
143
+ channel.onErrorEmitter.fire(error);
144
+ });
145
+ }
146
+
147
+ onUnderlyingChannelClose(event?: ChannelCloseEvent): void {
148
+ if (!this.toDispose.disposed) {
149
+ this.toDispose.push(Disposable.create(() => {
150
+ this.pendingOpen.clear();
151
+ this.openChannels.forEach(channel => {
152
+ channel.onCloseEmitter.fire(event ?? { reason: 'Multiplexer main channel has been closed from the remote side!' });
153
+ });
154
+
155
+ this.openChannels.clear();
156
+ }));
157
+ this.dispose();
158
+ }
159
+
160
+ }
161
+
162
+ protected handleMessage(buffer: ReadBuffer): void {
163
+ const type = buffer.readUint8();
164
+ const id = buffer.readString();
165
+ switch (type) {
166
+ case MessageTypes.AckOpen: {
167
+ return this.handleAckOpen(id);
168
+ }
169
+ case MessageTypes.Open: {
170
+ return this.handleOpen(id);
171
+ }
172
+ case MessageTypes.Close: {
173
+ return this.handleClose(id);
174
+ }
175
+ case MessageTypes.Data: {
176
+ return this.handleData(id, buffer.sliceAtReadPosition());
177
+ }
178
+ }
179
+ }
180
+
181
+ protected handleAckOpen(id: string): void {
182
+ // edge case: both side try to open a channel at the same time.
183
+ const resolve = this.pendingOpen.get(id);
184
+ if (resolve) {
185
+ const channel = this.createChannel(id);
186
+ this.pendingOpen.delete(id);
187
+ this.openChannels.set(id, channel);
188
+ resolve!(channel);
189
+ this.onOpenChannelEmitter.fire({ id, channel });
190
+ }
191
+ }
192
+
193
+ protected handleOpen(id: string): void {
194
+ if (!this.openChannels.has(id)) {
195
+ const channel = this.createChannel(id);
196
+ this.openChannels.set(id, channel);
197
+ const resolve = this.pendingOpen.get(id);
198
+ if (resolve) {
199
+ // edge case: both side try to open a channel at the same time.
200
+ resolve(channel);
201
+ }
202
+ this.underlyingChannel.getWriteBuffer().writeUint8(MessageTypes.AckOpen).writeString(id).commit();
203
+ this.onOpenChannelEmitter.fire({ id, channel });
204
+ }
205
+ }
206
+
207
+ protected handleClose(id: string): void {
208
+ const channel = this.openChannels.get(id);
209
+ if (channel) {
210
+ channel.onCloseEmitter.fire({ reason: 'Channel has been closed from the remote side' });
211
+ this.openChannels.delete(id);
212
+ }
213
+ }
214
+
215
+ protected handleData(id: string, data: ReadBuffer): void {
216
+ const channel = this.openChannels.get(id);
217
+ if (channel) {
218
+ channel.onMessageEmitter.fire(() => data);
219
+ }
220
+ }
221
+
222
+ protected createChannel(id: string): ForwardingChannel {
223
+ return new ForwardingChannel(id, () => this.closeChannel(id), () => this.prepareWriteBuffer(id));
224
+ }
225
+
226
+ // Prepare the write buffer for the channel with the give, id. The channel id has to be encoded
227
+ // and written to the buffer before the actual message.
228
+ protected prepareWriteBuffer(id: string): WriteBuffer {
229
+ const underlying = this.underlyingChannel.getWriteBuffer();
230
+ underlying.writeUint8(MessageTypes.Data);
231
+ underlying.writeString(id);
232
+ return underlying;
233
+ }
234
+
235
+ protected closeChannel(id: string): void {
236
+ this.underlyingChannel.getWriteBuffer()
237
+ .writeUint8(MessageTypes.Close)
238
+ .writeString(id)
239
+ .commit();
240
+
241
+ this.openChannels.delete(id);
242
+ }
243
+
244
+ open(id: string): Promise<Channel> {
245
+ const result = new Promise<Channel>((resolve, reject) => {
246
+ this.pendingOpen.set(id, resolve);
247
+ });
248
+ this.underlyingChannel.getWriteBuffer().writeUint8(MessageTypes.Open).writeString(id).commit();
249
+ return result;
250
+ }
251
+
252
+ getOpenChannel(id: string): Channel | undefined {
253
+ return this.openChannels.get(id);
254
+ }
255
+
256
+ dispose(): void {
257
+ this.toDispose.dispose();
258
+ }
259
+ }
260
+
@@ -1,5 +1,5 @@
1
1
  // *****************************************************************************
2
- // Copyright (C) 2017 TypeFox and others.
2
+ // Copyright (C) 2022 STMicroelectronics and others.
3
3
  //
4
4
  // This program and the accompanying materials are made available under the
5
5
  // terms of the Eclipse Public License v. 2.0 which is available at
@@ -13,25 +13,6 @@
13
13
  //
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
-
17
- import { Logger } from 'vscode-ws-jsonrpc';
18
-
19
- export class ConsoleLogger implements Logger {
20
-
21
- error(message: string): void {
22
- console.log(message);
23
- }
24
-
25
- warn(message: string): void {
26
- console.log(message);
27
- }
28
-
29
- info(message: string): void {
30
- console.log(message);
31
- }
32
-
33
- log(message: string): void {
34
- console.log(message);
35
- }
36
-
37
- }
16
+ export { RequestHandler, RpcProtocol, RpcProtocolOptions } from './rpc-protocol';
17
+ export { Channel, ChannelCloseEvent, MessageProvider } from './channel';
18
+ export { ReadBuffer, WriteBuffer } from './message-buffer';