@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.
- package/README.md +6 -7
- package/i18n/nls.cs.json +52 -6
- package/i18n/nls.de.json +52 -6
- package/i18n/nls.es.json +52 -6
- package/i18n/nls.fr.json +52 -6
- package/i18n/nls.hu.json +55 -9
- package/i18n/nls.it.json +52 -6
- package/i18n/nls.ja.json +52 -6
- package/i18n/nls.json +52 -6
- package/i18n/nls.pl.json +52 -6
- package/i18n/nls.pt-br.json +52 -6
- package/i18n/nls.pt-pt.json +52 -6
- package/i18n/nls.ru.json +52 -6
- package/i18n/nls.zh-cn.json +52 -6
- package/lib/browser/color-application-contribution.d.ts +2 -2
- package/lib/browser/color-application-contribution.d.ts.map +1 -1
- package/lib/browser/color-application-contribution.js +15 -16
- package/lib/browser/color-application-contribution.js.map +1 -1
- package/lib/browser/color-registry.d.ts +0 -4
- package/lib/browser/color-registry.d.ts.map +1 -1
- package/lib/browser/color-registry.js +0 -14
- package/lib/browser/color-registry.js.map +1 -1
- package/lib/browser/common-frontend-contribution.d.ts +4 -0
- package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
- package/lib/browser/common-frontend-contribution.js +157 -163
- package/lib/browser/common-frontend-contribution.js.map +1 -1
- package/lib/browser/common-styling-participants.d.ts +28 -0
- package/lib/browser/common-styling-participants.d.ts.map +1 -0
- package/lib/browser/common-styling-participants.js +319 -0
- package/lib/browser/common-styling-participants.js.map +1 -0
- package/lib/browser/connection-status-service.d.ts.map +1 -1
- package/lib/browser/connection-status-service.js +2 -2
- package/lib/browser/connection-status-service.js.map +1 -1
- package/lib/browser/connection-status-service.spec.js +1 -2
- package/lib/browser/connection-status-service.spec.js.map +1 -1
- package/lib/browser/context-menu-renderer.d.ts +1 -5
- package/lib/browser/context-menu-renderer.d.ts.map +1 -1
- package/lib/browser/context-menu-renderer.js +10 -30
- package/lib/browser/context-menu-renderer.js.map +1 -1
- package/lib/browser/core-preferences.d.ts +1 -0
- package/lib/browser/core-preferences.d.ts.map +1 -1
- package/lib/browser/core-preferences.js +5 -0
- package/lib/browser/core-preferences.js.map +1 -1
- package/lib/browser/decoration-style.d.ts +1 -0
- package/lib/browser/decoration-style.d.ts.map +1 -1
- package/lib/browser/decoration-style.js +6 -2
- package/lib/browser/decoration-style.js.map +1 -1
- package/lib/browser/frontend-application-bindings.d.ts.map +1 -1
- package/lib/browser/frontend-application-bindings.js +1 -3
- package/lib/browser/frontend-application-bindings.js.map +1 -1
- package/lib/browser/frontend-application-config-provider.d.ts +1 -0
- package/lib/browser/frontend-application-config-provider.d.ts.map +1 -1
- package/lib/browser/frontend-application-config-provider.js +2 -1
- package/lib/browser/frontend-application-config-provider.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js +9 -3
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/i18n/i18n-frontend-module.d.ts.map +1 -1
- package/lib/browser/i18n/i18n-frontend-module.js +2 -0
- package/lib/browser/i18n/i18n-frontend-module.js.map +1 -1
- package/lib/browser/i18n/language-quick-pick-service.d.ts +17 -0
- package/lib/browser/i18n/language-quick-pick-service.d.ts.map +1 -0
- package/lib/browser/i18n/language-quick-pick-service.js +142 -0
- package/lib/browser/i18n/language-quick-pick-service.js.map +1 -0
- package/lib/browser/index.d.ts +1 -0
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +1 -0
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/keybinding.d.ts.map +1 -1
- package/lib/browser/keybinding.js +2 -1
- package/lib/browser/keybinding.js.map +1 -1
- package/lib/browser/keybinding.spec.js +18 -21
- package/lib/browser/keybinding.spec.js.map +1 -1
- package/lib/browser/label-provider.d.ts +0 -12
- package/lib/browser/label-provider.d.ts.map +1 -1
- package/lib/browser/label-provider.js +1 -13
- package/lib/browser/label-provider.js.map +1 -1
- package/lib/browser/logger-frontend-module.d.ts.map +1 -1
- package/lib/browser/logger-frontend-module.js +8 -1
- package/lib/browser/logger-frontend-module.js.map +1 -1
- package/lib/browser/messaging/ws-connection-provider.d.ts +5 -4
- package/lib/browser/messaging/ws-connection-provider.d.ts.map +1 -1
- package/lib/browser/messaging/ws-connection-provider.js +30 -23
- package/lib/browser/messaging/ws-connection-provider.js.map +1 -1
- package/lib/browser/preferences/preference-contribution.d.ts +2 -19
- package/lib/browser/preferences/preference-contribution.d.ts.map +1 -1
- package/lib/browser/preferences/preference-contribution.js +1 -24
- package/lib/browser/preferences/preference-contribution.js.map +1 -1
- package/lib/browser/preferences/preference-proxy.d.ts +0 -4
- package/lib/browser/preferences/preference-proxy.d.ts.map +1 -1
- package/lib/browser/preferences/preference-proxy.js.map +1 -1
- package/lib/browser/preferences/preference-proxy.spec.js +3 -102
- package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
- package/lib/browser/preferences/preference-schema-provider.spec.js +4 -3
- package/lib/browser/preferences/preference-schema-provider.spec.js.map +1 -1
- package/lib/browser/preferences/preference-service.spec.js +1 -2
- package/lib/browser/preferences/preference-service.spec.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.d.ts +2 -2
- package/lib/browser/preferences/preference-validation-service.d.ts.map +1 -1
- package/lib/browser/preferences/preference-validation-service.spec.js.map +1 -1
- package/lib/browser/preloader.d.ts.map +1 -1
- package/lib/browser/preloader.js +7 -1
- package/lib/browser/preloader.js.map +1 -1
- package/lib/browser/progress-status-bar-item.d.ts +1 -1
- package/lib/browser/progress-status-bar-item.d.ts.map +1 -1
- package/lib/browser/quick-input/quick-command-service.d.ts.map +1 -1
- package/lib/browser/quick-input/quick-command-service.js +2 -2
- package/lib/browser/quick-input/quick-command-service.js.map +1 -1
- package/lib/browser/saveable.d.ts.map +1 -1
- package/lib/browser/saveable.js +5 -4
- package/lib/browser/saveable.js.map +1 -1
- package/lib/browser/shell/application-shell.d.ts +4 -0
- package/lib/browser/shell/application-shell.d.ts.map +1 -1
- package/lib/browser/shell/application-shell.js +42 -36
- package/lib/browser/shell/application-shell.js.map +1 -1
- package/lib/browser/shell/shell-layout-restorer.d.ts +2 -0
- package/lib/browser/shell/shell-layout-restorer.d.ts.map +1 -1
- package/lib/browser/shell/shell-layout-restorer.js +5 -1
- package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
- package/lib/browser/shell/side-panel-handler.d.ts.map +1 -1
- package/lib/browser/shell/side-panel-handler.js +3 -2
- package/lib/browser/shell/side-panel-handler.js.map +1 -1
- package/lib/browser/shell/tab-bars.d.ts +4 -2
- package/lib/browser/shell/tab-bars.d.ts.map +1 -1
- package/lib/browser/shell/tab-bars.js +12 -4
- package/lib/browser/shell/tab-bars.js.map +1 -1
- package/lib/browser/source-tree/source-tree-widget.js +1 -1
- package/lib/browser/source-tree/source-tree-widget.js.map +1 -1
- package/lib/browser/source-tree/tree-source.d.ts +2 -1
- package/lib/browser/source-tree/tree-source.d.ts.map +1 -1
- package/lib/browser/source-tree/tree-source.js.map +1 -1
- package/lib/browser/styling-service.d.ts +26 -0
- package/lib/browser/styling-service.d.ts.map +1 -0
- package/lib/browser/styling-service.js +76 -0
- package/lib/browser/styling-service.js.map +1 -0
- package/lib/browser/theming.d.ts +4 -8
- package/lib/browser/theming.d.ts.map +1 -1
- package/lib/browser/theming.js +38 -53
- package/lib/browser/theming.js.map +1 -1
- package/lib/browser/tree/search-box.d.ts.map +1 -1
- package/lib/browser/tree/search-box.js +5 -4
- package/lib/browser/tree/search-box.js.map +1 -1
- package/lib/browser/tree/test/tree-test-container.d.ts.map +1 -1
- package/lib/browser/tree/test/tree-test-container.js +2 -0
- package/lib/browser/tree/test/tree-test-container.js.map +1 -1
- package/lib/browser/tree/tree-compression/compressed-tree-model.d.ts +1 -1
- package/lib/browser/tree/tree-compression/compressed-tree-model.d.ts.map +1 -1
- package/lib/browser/tree/tree-compression/compressed-tree-model.js +4 -2
- package/lib/browser/tree/tree-compression/compressed-tree-model.js.map +1 -1
- package/lib/browser/tree/tree-compression/compressed-tree-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-compression/compressed-tree-widget.js +4 -2
- package/lib/browser/tree/tree-compression/compressed-tree-widget.js.map +1 -1
- package/lib/browser/tree/tree-container.d.ts +2 -0
- package/lib/browser/tree/tree-container.d.ts.map +1 -1
- package/lib/browser/tree/tree-container.js +3 -0
- package/lib/browser/tree/tree-container.js.map +1 -1
- package/lib/browser/tree/tree-focus-service.d.ts +20 -0
- package/lib/browser/tree/tree-focus-service.d.ts.map +1 -0
- package/lib/browser/tree/tree-focus-service.js +62 -0
- package/lib/browser/tree/tree-focus-service.js.map +1 -0
- package/lib/browser/tree/tree-model.d.ts +11 -2
- package/lib/browser/tree/tree-model.d.ts.map +1 -1
- package/lib/browser/tree/tree-model.js +29 -8
- package/lib/browser/tree/tree-model.js.map +1 -1
- package/lib/browser/tree/tree-selection-impl.d.ts +4 -1
- package/lib/browser/tree/tree-selection-impl.d.ts.map +1 -1
- package/lib/browser/tree/tree-selection-impl.js +13 -2
- package/lib/browser/tree/tree-selection-impl.js.map +1 -1
- package/lib/browser/tree/tree-selection-state.d.ts +1 -0
- package/lib/browser/tree/tree-selection-state.d.ts.map +1 -1
- package/lib/browser/tree/tree-selection-state.js +8 -2
- package/lib/browser/tree/tree-selection-state.js.map +1 -1
- package/lib/browser/tree/tree-selection.d.ts +9 -0
- package/lib/browser/tree/tree-selection.d.ts.map +1 -1
- package/lib/browser/tree/tree-selection.js +3 -0
- package/lib/browser/tree/tree-selection.js.map +1 -1
- package/lib/browser/tree/tree-widget-selection.d.ts.map +1 -1
- package/lib/browser/tree/tree-widget-selection.js +9 -1
- package/lib/browser/tree/tree-widget-selection.js.map +1 -1
- package/lib/browser/tree/tree-widget.d.ts +14 -0
- package/lib/browser/tree/tree-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-widget.js +80 -40
- package/lib/browser/tree/tree-widget.js.map +1 -1
- package/lib/browser/tree/tree.d.ts +2 -1
- package/lib/browser/tree/tree.d.ts.map +1 -1
- package/lib/browser/tree/tree.js +12 -2
- package/lib/browser/tree/tree.js.map +1 -1
- package/lib/browser/view-container.d.ts +9 -4
- package/lib/browser/view-container.d.ts.map +1 -1
- package/lib/browser/view-container.js +36 -6
- package/lib/browser/view-container.js.map +1 -1
- package/lib/common/cancellation.d.ts +1 -0
- package/lib/common/cancellation.d.ts.map +1 -1
- package/lib/common/cancellation.js +8 -0
- package/lib/common/cancellation.js.map +1 -1
- package/lib/common/command.d.ts +1 -1
- package/lib/common/command.d.ts.map +1 -1
- package/lib/common/command.js +13 -16
- package/lib/common/command.js.map +1 -1
- package/lib/common/index.d.ts +1 -0
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +1 -0
- package/lib/common/index.js.map +1 -1
- package/lib/common/message-rpc/channel.d.ts +106 -0
- package/lib/common/message-rpc/channel.d.ts.map +1 -0
- package/lib/common/message-rpc/channel.js +195 -0
- package/lib/common/message-rpc/channel.js.map +1 -0
- package/lib/common/message-rpc/channel.spec.d.ts +9 -0
- package/lib/common/message-rpc/channel.spec.d.ts.map +1 -0
- package/lib/common/message-rpc/channel.spec.js +80 -0
- package/lib/common/message-rpc/channel.spec.js.map +1 -0
- package/lib/common/message-rpc/index.d.ts +4 -0
- package/lib/common/message-rpc/index.d.ts.map +1 -0
- package/lib/{node/messaging/logger.js → common/message-rpc/index.js} +6 -19
- package/lib/common/message-rpc/index.js.map +1 -0
- package/lib/common/message-rpc/message-buffer.d.ts +50 -0
- package/lib/common/message-rpc/message-buffer.d.ts.map +1 -0
- package/lib/common/message-rpc/message-buffer.js +56 -0
- package/lib/common/message-rpc/message-buffer.js.map +1 -0
- package/lib/common/message-rpc/rpc-message-encoder.d.ts +171 -0
- package/lib/common/message-rpc/rpc-message-encoder.d.ts.map +1 -0
- package/lib/common/message-rpc/rpc-message-encoder.js +409 -0
- package/lib/common/message-rpc/rpc-message-encoder.js.map +1 -0
- package/lib/common/message-rpc/rpc-message-encoder.spec.d.ts +2 -0
- package/lib/common/message-rpc/rpc-message-encoder.spec.d.ts.map +1 -0
- package/lib/common/message-rpc/rpc-message-encoder.spec.js +49 -0
- package/lib/common/message-rpc/rpc-message-encoder.spec.js.map +1 -0
- package/lib/common/message-rpc/rpc-protocol.d.ts +61 -0
- package/lib/common/message-rpc/rpc-protocol.d.ts.map +1 -0
- package/lib/common/message-rpc/rpc-protocol.js +183 -0
- package/lib/common/message-rpc/rpc-protocol.js.map +1 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.d.ts +52 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.d.ts.map +1 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.js +169 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.js.map +1 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.spec.d.ts +2 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.spec.d.ts.map +1 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.spec.js +39 -0
- package/lib/common/message-rpc/uint8-array-message-buffer.spec.js.map +1 -0
- package/lib/common/messaging/abstract-connection-provider.d.ts +9 -8
- package/lib/common/messaging/abstract-connection-provider.d.ts.map +1 -1
- package/lib/common/messaging/abstract-connection-provider.js +20 -35
- package/lib/common/messaging/abstract-connection-provider.js.map +1 -1
- package/lib/common/messaging/connection-error-handler.d.ts +1 -2
- package/lib/common/messaging/connection-error-handler.d.ts.map +1 -1
- package/lib/common/messaging/connection-error-handler.js +1 -1
- package/lib/common/messaging/connection-error-handler.js.map +1 -1
- package/lib/common/messaging/handler.d.ts +2 -2
- package/lib/common/messaging/handler.d.ts.map +1 -1
- package/lib/common/messaging/proxy-factory.d.ts +13 -7
- package/lib/common/messaging/proxy-factory.d.ts.map +1 -1
- package/lib/common/messaging/proxy-factory.js +18 -13
- package/lib/common/messaging/proxy-factory.js.map +1 -1
- package/lib/common/messaging/proxy-factory.spec.js +4 -15
- package/lib/common/messaging/proxy-factory.spec.js.map +1 -1
- package/lib/common/messaging/web-socket-channel.d.ts +54 -48
- package/lib/common/messaging/web-socket-channel.d.ts.map +1 -1
- package/lib/common/messaging/web-socket-channel.js +41 -105
- package/lib/common/messaging/web-socket-channel.js.map +1 -1
- package/lib/common/nls.d.ts +2 -0
- package/lib/common/nls.d.ts.map +1 -1
- package/lib/common/nls.js +11 -0
- package/lib/common/nls.js.map +1 -1
- package/lib/common/preferences/preference-schema.d.ts +1 -5
- package/lib/common/preferences/preference-schema.d.ts.map +1 -1
- package/lib/common/preferences/preference-schema.js.map +1 -1
- package/lib/common/promise-util.d.ts +2 -1
- package/lib/common/promise-util.d.ts.map +1 -1
- package/lib/common/promise-util.js +8 -13
- package/lib/common/promise-util.js.map +1 -1
- package/lib/common/resource.d.ts +5 -0
- package/lib/common/resource.d.ts.map +1 -1
- package/lib/common/resource.js +28 -1
- package/lib/common/resource.js.map +1 -1
- package/lib/common/theme.d.ts +3 -2
- package/lib/common/theme.d.ts.map +1 -1
- package/lib/common/theme.js +5 -0
- package/lib/common/theme.js.map +1 -1
- package/lib/electron-browser/messaging/electron-ipc-connection-provider.d.ts +2 -2
- package/lib/electron-browser/messaging/electron-ipc-connection-provider.d.ts.map +1 -1
- package/lib/electron-browser/messaging/electron-ipc-connection-provider.js +18 -7
- package/lib/electron-browser/messaging/electron-ipc-connection-provider.js.map +1 -1
- package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts +2 -2
- package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts.map +1 -1
- package/lib/electron-browser/messaging/electron-ws-connection-provider.js +5 -7
- package/lib/electron-browser/messaging/electron-ws-connection-provider.js.map +1 -1
- package/lib/electron-main/event-utils.d.ts +1 -1
- package/lib/electron-main/messaging/electron-messaging-contribution.d.ts +37 -9
- package/lib/electron-main/messaging/electron-messaging-contribution.d.ts.map +1 -1
- package/lib/electron-main/messaging/electron-messaging-contribution.js +83 -68
- package/lib/electron-main/messaging/electron-messaging-contribution.js.map +1 -1
- package/lib/electron-main/messaging/electron-messaging-service.d.ts +2 -8
- package/lib/electron-main/messaging/electron-messaging-service.d.ts.map +1 -1
- package/lib/electron-main/messaging/electron-messaging-service.js.map +1 -1
- package/lib/node/messaging/binary-message-pipe.d.ts +45 -0
- package/lib/node/messaging/binary-message-pipe.d.ts.map +1 -0
- package/lib/node/messaging/binary-message-pipe.js +152 -0
- package/lib/node/messaging/binary-message-pipe.js.map +1 -0
- package/lib/node/messaging/ipc-bootstrap.js +2 -11
- package/lib/node/messaging/ipc-bootstrap.js.map +1 -1
- package/lib/node/messaging/ipc-channel.d.ts +26 -0
- package/lib/node/messaging/ipc-channel.d.ts.map +1 -0
- package/lib/node/messaging/ipc-channel.js +86 -0
- package/lib/node/messaging/ipc-channel.js.map +1 -0
- package/lib/node/messaging/ipc-connection-provider.d.ts +3 -5
- package/lib/node/messaging/ipc-connection-provider.d.ts.map +1 -1
- package/lib/node/messaging/ipc-connection-provider.js +14 -31
- package/lib/node/messaging/ipc-connection-provider.js.map +1 -1
- package/lib/node/messaging/ipc-protocol.d.ts +2 -2
- package/lib/node/messaging/ipc-protocol.d.ts.map +1 -1
- package/lib/node/messaging/messaging-contribution.d.ts +6 -9
- package/lib/node/messaging/messaging-contribution.d.ts.map +1 -1
- package/lib/node/messaging/messaging-contribution.js +23 -68
- package/lib/node/messaging/messaging-contribution.js.map +1 -1
- package/lib/node/messaging/messaging-service.d.ts +4 -23
- package/lib/node/messaging/messaging-service.d.ts.map +1 -1
- package/lib/node/messaging/messaging-service.js +1 -15
- package/lib/node/messaging/messaging-service.js.map +1 -1
- package/lib/node/messaging/test/test-web-socket-channel.d.ts +4 -2
- package/lib/node/messaging/test/test-web-socket-channel.d.ts.map +1 -1
- package/lib/node/messaging/test/test-web-socket-channel.js +25 -12
- package/lib/node/messaging/test/test-web-socket-channel.js.map +1 -1
- package/lib/node/request/proxy-cli-contribution.js +1 -1
- package/lib/node/request/proxy-cli-contribution.js.map +1 -1
- package/package.json +7 -10
- package/src/browser/color-application-contribution.ts +10 -17
- package/src/browser/color-registry.ts +0 -5
- package/src/browser/common-frontend-contribution.ts +26 -33
- package/src/browser/common-styling-participants.ts +307 -0
- package/src/browser/connection-status-service.spec.ts +1 -4
- package/src/browser/connection-status-service.ts +3 -3
- package/src/browser/context-menu-renderer.ts +13 -29
- package/src/browser/core-preferences.ts +6 -0
- package/src/browser/decoration-style.ts +6 -2
- package/src/browser/frontend-application-bindings.ts +1 -3
- package/src/browser/frontend-application-config-provider.ts +2 -0
- package/src/browser/frontend-application-module.ts +11 -4
- package/src/browser/i18n/i18n-frontend-module.ts +2 -0
- package/src/browser/i18n/language-quick-pick-service.ts +128 -0
- package/src/browser/index.ts +1 -0
- package/src/browser/keybinding.spec.ts +22 -27
- package/src/browser/keybinding.ts +2 -1
- package/src/browser/label-provider.ts +0 -13
- package/src/browser/logger-frontend-module.ts +8 -1
- package/src/browser/messaging/ws-connection-provider.ts +34 -25
- package/src/browser/preferences/preference-contribution.ts +3 -28
- package/src/browser/preferences/preference-proxy.spec.ts +3 -113
- package/src/browser/preferences/preference-proxy.ts +0 -4
- package/src/browser/preferences/preference-schema-provider.spec.ts +1 -4
- package/src/browser/preferences/preference-service.spec.ts +1 -5
- package/src/browser/preferences/preference-validation-service.spec.ts +2 -2
- package/src/browser/preferences/preference-validation-service.ts +2 -2
- package/src/browser/preloader.ts +9 -2
- package/src/browser/progress-status-bar-item.ts +1 -1
- package/src/browser/quick-input/quick-command-service.ts +3 -3
- package/src/browser/saveable.ts +5 -4
- package/src/browser/shell/application-shell.ts +42 -35
- package/src/browser/shell/shell-layout-restorer.ts +4 -6
- package/src/browser/shell/side-panel-handler.ts +3 -2
- package/src/browser/shell/tab-bars.ts +14 -4
- package/src/browser/source-tree/source-tree-widget.tsx +1 -1
- package/src/browser/source-tree/tree-source.ts +2 -1
- package/src/browser/style/breadcrumbs.css +0 -1
- package/src/browser/style/index.css +66 -29
- package/src/browser/style/menus.css +4 -2
- package/src/browser/style/select-component.css +2 -0
- package/src/browser/style/sidepanel.css +11 -25
- package/src/browser/style/status-bar.css +8 -17
- package/src/browser/style/tabs.css +0 -16
- package/src/browser/style/tooltip.css +3 -3
- package/src/browser/style/tree.css +27 -11
- package/src/browser/style/view-container.css +4 -0
- package/src/browser/styling-service.ts +76 -0
- package/src/browser/theming.ts +18 -45
- package/src/browser/tree/search-box.ts +5 -4
- package/src/browser/tree/test/tree-test-container.ts +2 -0
- package/src/browser/tree/tree-compression/compressed-tree-model.ts +8 -2
- package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +4 -2
- package/src/browser/tree/tree-container.ts +4 -0
- package/src/browser/tree/tree-focus-service.ts +55 -0
- package/src/browser/tree/tree-model.ts +32 -8
- package/src/browser/tree/tree-selection-impl.ts +13 -4
- package/src/browser/tree/tree-selection-state.ts +7 -2
- package/src/browser/tree/tree-selection.ts +10 -0
- package/src/browser/tree/tree-widget-selection.ts +10 -1
- package/src/browser/tree/tree-widget.tsx +83 -43
- package/src/browser/tree/tree.ts +8 -2
- package/src/browser/view-container.ts +41 -4
- package/src/common/cancellation.ts +8 -0
- package/src/common/command.ts +14 -16
- package/src/common/index.ts +1 -0
- package/src/common/message-rpc/channel.spec.ts +88 -0
- package/src/common/message-rpc/channel.ts +260 -0
- package/src/{node/messaging/logger.ts → common/message-rpc/index.ts} +4 -23
- package/src/common/message-rpc/message-buffer.ts +99 -0
- package/src/common/message-rpc/rpc-message-encoder.spec.ts +55 -0
- package/src/common/message-rpc/rpc-message-encoder.ts +552 -0
- package/src/common/message-rpc/rpc-protocol.ts +217 -0
- package/src/common/message-rpc/uint8-array-message-buffer.spec.ts +41 -0
- package/src/common/message-rpc/uint8-array-message-buffer.ts +206 -0
- package/src/common/messaging/abstract-connection-provider.ts +28 -37
- package/src/common/messaging/connection-error-handler.ts +1 -2
- package/src/common/messaging/handler.ts +2 -2
- package/src/common/messaging/proxy-factory.spec.ts +4 -17
- package/src/common/messaging/proxy-factory.ts +27 -16
- package/src/common/messaging/web-socket-channel.ts +79 -135
- package/src/common/nls.ts +11 -0
- package/src/common/preferences/preference-schema.ts +1 -6
- package/src/common/promise-util.ts +13 -14
- package/src/common/resource.ts +29 -2
- package/src/common/theme.ts +6 -2
- package/src/electron-browser/messaging/electron-ipc-connection-provider.ts +21 -7
- package/src/electron-browser/messaging/electron-ws-connection-provider.ts +5 -8
- package/src/electron-main/messaging/electron-messaging-contribution.ts +87 -65
- package/src/electron-main/messaging/electron-messaging-service.ts +2 -8
- package/src/node/messaging/binary-message-pipe.ts +168 -0
- package/src/node/messaging/ipc-bootstrap.ts +3 -11
- package/src/node/messaging/ipc-channel.ts +97 -0
- package/src/node/messaging/ipc-connection-provider.ts +18 -35
- package/src/node/messaging/ipc-protocol.ts +2 -2
- package/src/node/messaging/messaging-contribution.ts +29 -74
- package/src/node/messaging/messaging-service.ts +4 -31
- package/src/node/messaging/test/test-web-socket-channel.ts +26 -17
- package/src/node/request/proxy-cli-contribution.ts +1 -1
- package/lib/browser/preferences/validated-preference-proxy.d.ts +0 -21
- package/lib/browser/preferences/validated-preference-proxy.d.ts.map +0 -1
- package/lib/browser/preferences/validated-preference-proxy.js +0 -118
- package/lib/browser/preferences/validated-preference-proxy.js.map +0 -1
- package/lib/node/messaging/logger.d.ts +0 -8
- package/lib/node/messaging/logger.d.ts.map +0 -1
- package/lib/node/messaging/logger.js.map +0 -1
- package/shared/vscode-ws-jsonrpc/index.d.ts +0 -1
- package/shared/vscode-ws-jsonrpc/index.js +0 -1
- package/src/browser/preferences/validated-preference-proxy.ts +0 -111
- package/src/browser/style/variables-bright.useable.css +0 -93
- package/src/browser/style/variables-dark.useable.css +0 -93
package/src/browser/tree/tree.ts
CHANGED
|
@@ -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 {
|
package/src/common/command.ts
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
473
|
+
this._recent.unshift(recentCommand.id);
|
|
476
474
|
}
|
|
477
475
|
}
|
|
478
476
|
|
package/src/common/index.ts
CHANGED
|
@@ -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)
|
|
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
|
-
|
|
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';
|