@theia/core 1.53.0-next.4 → 1.53.0-next.55
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 +7 -7
- package/i18n/nls.cs.json +582 -552
- package/i18n/nls.de.json +582 -552
- package/i18n/nls.es.json +582 -552
- package/i18n/nls.fr.json +582 -552
- package/i18n/nls.hu.json +582 -552
- package/i18n/nls.it.json +582 -552
- package/i18n/nls.ja.json +582 -552
- package/i18n/nls.json +582 -552
- package/i18n/nls.ko.json +582 -0
- package/i18n/nls.pl.json +582 -552
- package/i18n/nls.pt-br.json +582 -552
- package/i18n/nls.ru.json +582 -552
- package/i18n/nls.tr.json +582 -0
- package/i18n/nls.zh-cn.json +582 -552
- package/i18n/nls.zh-tw.json +582 -0
- package/lib/browser/authentication-service.d.ts +15 -14
- package/lib/browser/authentication-service.d.ts.map +1 -1
- package/lib/browser/authentication-service.js +5 -5
- package/lib/browser/authentication-service.js.map +1 -1
- package/lib/browser/catalog.json +6889 -0
- package/lib/browser/common-frontend-contribution.js +3 -3
- package/lib/browser/common-styling-participants.js +166 -166
- package/lib/browser/context-key-service.d.ts +3 -2
- package/lib/browser/context-key-service.d.ts.map +1 -1
- package/lib/browser/context-key-service.js.map +1 -1
- package/lib/browser/core-preferences.d.ts.map +1 -1
- package/lib/browser/core-preferences.js +9 -0
- package/lib/browser/core-preferences.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/json-schema-store.d.ts +0 -3
- package/lib/browser/json-schema-store.d.ts.map +1 -1
- package/lib/browser/json-schema-store.js +2 -12
- package/lib/browser/json-schema-store.js.map +1 -1
- package/lib/browser/open-with-service.d.ts +13 -1
- package/lib/browser/open-with-service.d.ts.map +1 -1
- package/lib/browser/open-with-service.js +48 -9
- package/lib/browser/open-with-service.js.map +1 -1
- package/lib/browser/opener-service.d.ts +8 -0
- package/lib/browser/opener-service.d.ts.map +1 -1
- package/lib/browser/opener-service.js +18 -3
- package/lib/browser/opener-service.js.map +1 -1
- package/lib/browser/progress-location-service.spec.js +7 -7
- package/lib/browser/saveable-service.d.ts.map +1 -1
- package/lib/browser/saveable-service.js +6 -2
- package/lib/browser/saveable-service.js.map +1 -1
- package/lib/browser/saveable.d.ts +17 -1
- package/lib/browser/saveable.d.ts.map +1 -1
- package/lib/browser/saveable.js +62 -1
- package/lib/browser/saveable.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts +5 -4
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +2 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +6 -16
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +12 -29
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts +43 -78
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js +8 -39
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts +10 -10
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +43 -32
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
- package/lib/browser/storage-service.js +3 -3
- package/lib/browser/tree/tree.spec.js +75 -75
- package/lib/browser/view-container.d.ts +2 -2
- package/lib/browser/view-container.d.ts.map +1 -1
- package/lib/browser/view-container.js.map +1 -1
- package/lib/browser/widget-open-handler.d.ts +4 -1
- package/lib/browser/widget-open-handler.d.ts.map +1 -1
- package/lib/browser/widget-open-handler.js.map +1 -1
- package/lib/browser/widgets/extractable-widget.js +1 -1
- package/lib/browser/widgets/extractable-widget.js.map +1 -1
- package/lib/browser/widgets/index.d.ts +1 -0
- package/lib/browser/widgets/index.d.ts.map +1 -1
- package/lib/browser/widgets/index.js +1 -0
- package/lib/browser/widgets/index.js.map +1 -1
- package/lib/browser/widgets/split-widget.d.ts +45 -0
- package/lib/browser/widgets/split-widget.d.ts.map +1 -0
- package/lib/browser/widgets/split-widget.js +126 -0
- package/lib/browser/widgets/split-widget.js.map +1 -0
- package/lib/common/event.d.ts +2 -0
- package/lib/common/event.d.ts.map +1 -1
- package/lib/common/event.js +4 -0
- package/lib/common/event.js.map +1 -1
- package/lib/common/glob.d.ts +4 -4
- package/lib/common/json-schema.d.ts +2 -0
- package/lib/common/json-schema.d.ts.map +1 -1
- package/lib/common/menu/menu-types.d.ts.map +1 -1
- package/lib/common/menu/menu-types.js.map +1 -1
- package/lib/electron-browser/electron-uri-handler.d.ts +6 -0
- package/lib/electron-browser/electron-uri-handler.d.ts.map +1 -0
- package/lib/electron-browser/electron-uri-handler.js +49 -0
- package/lib/electron-browser/electron-uri-handler.js.map +1 -0
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.js +6 -6
- package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
- package/lib/electron-browser/preload.d.ts.map +1 -1
- package/lib/electron-browser/preload.js +12 -0
- package/lib/electron-browser/preload.js.map +1 -1
- package/lib/electron-browser/window/electron-window-module.d.ts.map +1 -1
- package/lib/electron-browser/window/electron-window-module.js +3 -0
- package/lib/electron-browser/window/electron-window-module.js.map +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js.map +1 -1
- package/lib/electron-common/electron-api.d.ts +2 -0
- package/lib/electron-common/electron-api.d.ts.map +1 -1
- package/lib/electron-common/electron-api.js +2 -1
- package/lib/electron-common/electron-api.js.map +1 -1
- package/lib/electron-main/electron-api-main.d.ts +2 -0
- package/lib/electron-main/electron-api-main.d.ts.map +1 -1
- package/lib/electron-main/electron-api-main.js +27 -3
- package/lib/electron-main/electron-api-main.js.map +1 -1
- package/lib/electron-main/electron-main-application.d.ts +5 -3
- package/lib/electron-main/electron-main-application.d.ts.map +1 -1
- package/lib/electron-main/electron-main-application.js +57 -14
- package/lib/electron-main/electron-main-application.js.map +1 -1
- package/lib/electron-main/theia-electron-window.d.ts +1 -0
- package/lib/electron-main/theia-electron-window.d.ts.map +1 -1
- package/lib/electron-main/theia-electron-window.js +3 -0
- package/lib/electron-main/theia-electron-window.js.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.d.ts.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.js +12 -8
- package/lib/node/i18n/theia-localization-contribution.js.map +1 -1
- package/lib/node/process-utils.spec.js +8 -8
- package/package.json +10 -8
- package/shared/ajv/index.d.ts +2 -2
- package/shared/markdown-it.d.ts +2 -2
- package/shared/markdown-it.js +1 -1
- package/shared/reflect-metadata/index.d.ts +1 -1
- package/shared/reflect-metadata/index.js +1 -1
- package/shared/vscode-languageserver-types/index.d.ts +1 -1
- package/src/browser/about-dialog.tsx +137 -137
- package/src/browser/authentication-service.ts +467 -468
- package/src/browser/breadcrumbs/breadcrumb-popup-container.ts +101 -101
- package/src/browser/breadcrumbs/breadcrumb-renderer.tsx +41 -41
- package/src/browser/breadcrumbs/breadcrumbs-constants.ts +79 -79
- package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +185 -185
- package/src/browser/breadcrumbs/breadcrumbs-service.ts +108 -108
- package/src/browser/breadcrumbs/index.ts +21 -21
- package/src/browser/browser-clipboard-service.ts +122 -122
- package/src/browser/browser.ts +239 -239
- package/src/browser/clipboard-service.ts +23 -23
- package/src/browser/color-application-contribution.ts +110 -110
- package/src/browser/color-registry.ts +60 -60
- package/src/browser/command-open-handler.ts +54 -54
- package/src/browser/common-frontend-contribution.ts +2680 -2680
- package/src/browser/common-styling-participants.ts +361 -361
- package/src/browser/connection-status-service.spec.ts +200 -200
- package/src/browser/connection-status-service.ts +216 -216
- package/src/browser/context-key-service.ts +142 -142
- package/src/browser/context-menu-renderer.ts +124 -124
- package/src/browser/core-preferences.ts +343 -334
- package/src/browser/credentials-service.ts +106 -106
- package/src/browser/decoration-style.ts +65 -65
- package/src/browser/decorations-service.ts +209 -209
- package/src/browser/dialogs/react-dialog.tsx +56 -56
- package/src/browser/dialogs.ts +534 -534
- package/src/browser/diff-uris.ts +117 -117
- package/src/browser/encoding-registry.ts +97 -97
- package/src/browser/endpoint.spec.ts +148 -148
- package/src/browser/endpoint.ts +136 -136
- package/src/browser/external-uri-service.ts +79 -79
- package/src/browser/file-icons-js.d.ts +20 -20
- package/src/browser/frontend-application-bindings.ts +62 -62
- package/src/browser/frontend-application-config-provider.spec.ts +45 -45
- package/src/browser/frontend-application-config-provider.ts +50 -50
- package/src/browser/frontend-application-contribution.ts +110 -110
- package/src/browser/frontend-application-module.ts +474 -475
- package/src/browser/frontend-application-state.ts +74 -74
- package/src/browser/frontend-application.ts +326 -326
- package/src/browser/hover-service.ts +218 -218
- package/src/browser/http-open-handler.ts +49 -49
- package/src/browser/i18n/i18n-frontend-module.ts +27 -27
- package/src/browser/i18n/language-quick-pick-service.ts +130 -130
- package/src/browser/icon-registry.ts +87 -87
- package/src/browser/icon-theme-contribution.ts +64 -64
- package/src/browser/icon-theme-service.ts +217 -217
- package/src/browser/icons/CollapseAll.svg +7 -7
- package/src/browser/icons/CollapseAll_inverse.svg +7 -7
- package/src/browser/icons/Refresh.svg +7 -7
- package/src/browser/icons/Refresh_inverse.svg +7 -7
- package/src/browser/icons/add-inverse.svg +4 -4
- package/src/browser/icons/add.svg +4 -4
- package/src/browser/icons/arrow-down-bright.svg +6 -6
- package/src/browser/icons/arrow-down-dark.svg +6 -6
- package/src/browser/icons/arrow-up-bright.svg +6 -6
- package/src/browser/icons/arrow-up-dark.svg +6 -6
- package/src/browser/icons/case-sensitive-dark.svg +16 -16
- package/src/browser/icons/case-sensitive.svg +16 -16
- package/src/browser/icons/chevron-right-dark.svg +5 -5
- package/src/browser/icons/chevron-right-light.svg +6 -6
- package/src/browser/icons/circle-bright.svg +7 -7
- package/src/browser/icons/circle-dark.svg +7 -7
- package/src/browser/icons/clear-search-results-dark.svg +7 -7
- package/src/browser/icons/clear-search-results.svg +7 -7
- package/src/browser/icons/close-all-bright.svg +7 -7
- package/src/browser/icons/close-all-dark.svg +7 -7
- package/src/browser/icons/close-bright.svg +7 -7
- package/src/browser/icons/close-dark.svg +7 -7
- package/src/browser/icons/collapse.svg +4 -4
- package/src/browser/icons/edit-json-dark.svg +6 -6
- package/src/browser/icons/edit-json.svg +6 -6
- package/src/browser/icons/expand.svg +4 -4
- package/src/browser/icons/loading-dark.svg +6 -6
- package/src/browser/icons/loading-light.svg +6 -6
- package/src/browser/icons/open-change-bright.svg +3 -3
- package/src/browser/icons/open-change-dark.svg +4 -4
- package/src/browser/icons/open-file-bright.svg +4 -4
- package/src/browser/icons/open-file-dark.svg +4 -4
- package/src/browser/icons/preview-bright.svg +3 -3
- package/src/browser/icons/preview-dark.svg +3 -3
- package/src/browser/icons/regex-dark.svg +10 -10
- package/src/browser/icons/regex.svg +10 -10
- package/src/browser/icons/remove-all-inverse.svg +4 -4
- package/src/browser/icons/remove-all.svg +4 -4
- package/src/browser/icons/replace-all-inverse.svg +13 -13
- package/src/browser/icons/replace-all.svg +13 -13
- package/src/browser/icons/replace-inverse.svg +15 -15
- package/src/browser/icons/replace.svg +15 -15
- package/src/browser/icons/whole-word-dark.svg +19 -19
- package/src/browser/icons/whole-word.svg +19 -19
- package/src/browser/index.ts +50 -50
- package/src/browser/json-schema-store.ts +118 -127
- package/src/browser/keybinding.spec.ts +554 -554
- package/src/browser/keybinding.ts +759 -759
- package/src/browser/keyboard/browser-keyboard-frontend-contribution.ts +108 -108
- package/src/browser/keyboard/browser-keyboard-layout-provider.spec.ts +171 -171
- package/src/browser/keyboard/browser-keyboard-layout-provider.ts +469 -469
- package/src/browser/keyboard/browser-keyboard-module.ts +30 -30
- package/src/browser/keyboard/index.ts +20 -20
- package/src/browser/keyboard/keyboard-layout-service.spec.ts +121 -121
- package/src/browser/keyboard/keyboard-layout-service.ts +455 -455
- package/src/browser/keyboard/keys.spec.ts +258 -258
- package/src/browser/keyboard/keys.ts +20 -20
- package/src/browser/keys.ts +21 -21
- package/src/browser/label-parser.spec.ts +165 -165
- package/src/browser/label-parser.ts +108 -108
- package/src/browser/label-provider.spec.ts +62 -62
- package/src/browser/label-provider.ts +385 -385
- package/src/browser/language-icon-provider.ts +55 -55
- package/src/browser/language-service.ts +77 -77
- package/src/browser/logger-frontend-module.ts +65 -65
- package/src/browser/markdown-rendering/markdown-renderer.ts +98 -98
- package/src/browser/menu/browser-context-menu-renderer.ts +48 -48
- package/src/browser/menu/browser-menu-module.ts +28 -28
- package/src/browser/menu/browser-menu-plugin.ts +491 -491
- package/src/browser/menu/context-menu-context.ts +41 -41
- package/src/browser/messaging/connection-source.ts +26 -26
- package/src/browser/messaging/frontend-id-provider.ts +37 -37
- package/src/browser/messaging/index.ts +18 -18
- package/src/browser/messaging/messaging-frontend-module.ts +41 -41
- package/src/browser/messaging/service-connection-provider.ts +140 -140
- package/src/browser/messaging/ws-connection-provider.ts +49 -49
- package/src/browser/messaging/ws-connection-source.ts +230 -230
- package/src/browser/mime-service.ts +30 -30
- package/src/browser/navigatable-types.ts +81 -81
- package/src/browser/navigatable.ts +39 -39
- package/src/browser/open-with-service.ts +140 -93
- package/src/browser/opener-service.spec.ts +49 -49
- package/src/browser/opener-service.ts +169 -146
- package/src/browser/performance/frontend-stopwatch.ts +65 -65
- package/src/browser/performance/index.ts +18 -18
- package/src/browser/performance/measurement-frontend-bindings.ts +31 -31
- package/src/browser/preferences/index.ts +23 -23
- package/src/browser/preferences/injectable-preference-proxy.ts +283 -283
- package/src/browser/preferences/preference-configurations.ts +82 -82
- package/src/browser/preferences/preference-contribution.ts +436 -436
- package/src/browser/preferences/preference-language-override-service.ts +111 -111
- package/src/browser/preferences/preference-provider.spec.ts +36 -36
- package/src/browser/preferences/preference-provider.ts +277 -277
- package/src/browser/preferences/preference-proxy.spec.ts +367 -367
- package/src/browser/preferences/preference-proxy.ts +367 -367
- package/src/browser/preferences/preference-schema-provider.spec.ts +130 -130
- package/src/browser/preferences/preference-scope.ts +18 -18
- package/src/browser/preferences/preference-service.spec.ts +613 -613
- package/src/browser/preferences/preference-service.ts +594 -594
- package/src/browser/preferences/preference-validation-service.spec.ts +334 -334
- package/src/browser/preferences/preference-validation-service.ts +358 -358
- package/src/browser/preferences/test/index.ts +19 -19
- package/src/browser/preferences/test/mock-preference-provider.ts +50 -50
- package/src/browser/preferences/test/mock-preference-proxy.ts +48 -48
- package/src/browser/preferences/test/mock-preference-service.ts +63 -63
- package/src/browser/preload/i18n-preload-contribution.ts +50 -50
- package/src/browser/preload/os-preload-contribution.ts +37 -37
- package/src/browser/preload/preload-module.ts +45 -45
- package/src/browser/preload/preloader.ts +37 -37
- package/src/browser/preload/theme-preload-contribution.ts +31 -31
- package/src/browser/progress-bar-factory.ts +29 -29
- package/src/browser/progress-bar.ts +76 -76
- package/src/browser/progress-client.ts +53 -53
- package/src/browser/progress-location-service.spec.ts +50 -50
- package/src/browser/progress-location-service.ts +96 -96
- package/src/browser/progress-status-bar-item.ts +83 -83
- package/src/browser/quick-input/index.ts +23 -23
- package/src/browser/quick-input/quick-access.ts +75 -75
- package/src/browser/quick-input/quick-command-frontend-contribution.ts +89 -89
- package/src/browser/quick-input/quick-command-service.ts +246 -246
- package/src/browser/quick-input/quick-help-service.ts +87 -87
- package/src/browser/quick-input/quick-input-frontend-contribution.ts +33 -33
- package/src/browser/quick-input/quick-input-service.spec.ts +176 -176
- package/src/browser/quick-input/quick-input-service.ts +17 -17
- package/src/browser/quick-input/quick-pick-service-impl.ts +69 -69
- package/src/browser/quick-input/quick-view-service.ts +83 -83
- package/src/browser/request/browser-request-module.ts +23 -23
- package/src/browser/request/browser-request-service.ts +172 -172
- package/src/browser/resource-context-key.ts +77 -77
- package/src/browser/saveable-service.ts +332 -328
- package/src/browser/saveable.ts +395 -327
- package/src/browser/secondary-window-handler.ts +211 -211
- package/src/browser/shell/additional-views-menu-widget.tsx +71 -71
- package/src/browser/shell/application-shell-mouse-tracker.ts +103 -103
- package/src/browser/shell/application-shell.ts +2271 -2271
- package/src/browser/shell/current-widget-command-adapter.ts +57 -57
- package/src/browser/shell/index.ts +23 -23
- package/src/browser/shell/shell-layout-restorer.ts +399 -399
- package/src/browser/shell/side-panel-handler.ts +794 -794
- package/src/browser/shell/side-panel-toolbar.ts +111 -111
- package/src/browser/shell/sidebar-bottom-menu-widget.tsx +39 -39
- package/src/browser/shell/sidebar-menu-widget.tsx +183 -183
- package/src/browser/shell/sidebar-top-menu-widget.tsx +26 -26
- package/src/browser/shell/split-panels.ts +191 -191
- package/src/browser/shell/tab-bar-decorator.ts +106 -106
- package/src/browser/shell/tab-bar-toolbar/index.ts +19 -19
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.ts +31 -31
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +242 -256
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +149 -207
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.ts +62 -62
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +443 -428
- package/src/browser/shell/tab-bars.spec.ts +63 -63
- package/src/browser/shell/tab-bars.ts +1468 -1468
- package/src/browser/shell/theia-dock-panel.ts +265 -265
- package/src/browser/shell/view-column-service.ts +125 -125
- package/src/browser/shell/view-contribution.ts +178 -178
- package/src/browser/source-tree/index.ts +19 -19
- package/src/browser/source-tree/source-tree-widget.tsx +107 -107
- package/src/browser/source-tree/source-tree.ts +146 -146
- package/src/browser/source-tree/tree-source.ts +73 -73
- package/src/browser/status-bar/index.ts +29 -29
- package/src/browser/status-bar/status-bar-types.ts +97 -97
- package/src/browser/status-bar/status-bar-view-model.ts +209 -209
- package/src/browser/status-bar/status-bar.tsx +189 -189
- package/src/browser/storage-service.spec.ts +76 -76
- package/src/browser/storage-service.ts +129 -129
- package/src/browser/style/about.css +36 -36
- package/src/browser/style/alert-messages.css +62 -62
- package/src/browser/style/ansi.css +88 -88
- package/src/browser/style/breadcrumbs.css +130 -130
- package/src/browser/style/dialog.css +126 -126
- package/src/browser/style/dockpanel.css +76 -76
- package/src/browser/style/hover-service.css +101 -101
- package/src/browser/style/icons.css +61 -61
- package/src/browser/style/index.css +353 -351
- package/src/browser/style/materialcolors.css +278 -278
- package/src/browser/style/menus.css +230 -230
- package/src/browser/style/notification.css +39 -39
- package/src/browser/style/os.css +87 -87
- package/src/browser/style/progress-bar.css +43 -43
- package/src/browser/style/quick-title-bar.css +45 -45
- package/src/browser/style/scrollbars.css +172 -172
- package/src/browser/style/search-box.css +123 -123
- package/src/browser/style/select-component.css +107 -107
- package/src/browser/style/sidepanel.css +367 -367
- package/src/browser/style/split-widget.css +38 -0
- package/src/browser/style/status-bar.css +127 -127
- package/src/browser/style/tabs.css +647 -658
- package/src/browser/style/tooltip.css +28 -28
- package/src/browser/style/tree-decorators.css +81 -81
- package/src/browser/style/tree.css +232 -232
- package/src/browser/style/view-container.css +187 -194
- package/src/browser/style/widget.css +19 -19
- package/src/browser/styling-service.ts +96 -96
- package/src/browser/supported-encodings.ts +262 -262
- package/src/browser/test/jsdom.ts +69 -69
- package/src/browser/test/mock-connection-status-service.ts +33 -33
- package/src/browser/test/mock-env-variables-server.ts +47 -47
- package/src/browser/test/mock-opener-service.ts +34 -34
- package/src/browser/test/mock-storage-service.ts +49 -49
- package/src/browser/theming.ts +206 -206
- package/src/browser/tooltip-service.tsx +96 -96
- package/src/browser/tree/fuzzy-search.spec.ts +99 -99
- package/src/browser/tree/fuzzy-search.ts +136 -136
- package/src/browser/tree/index.ts +29 -29
- package/src/browser/tree/search-box-debounce.ts +96 -96
- package/src/browser/tree/search-box.ts +355 -355
- package/src/browser/tree/test/mock-selectable-tree-model.ts +109 -109
- package/src/browser/tree/test/mock-tree-model.ts +136 -136
- package/src/browser/tree/test/tree-test-container.ts +50 -50
- package/src/browser/tree/tree-compression/compressed-tree-expansion-service.ts +46 -46
- package/src/browser/tree/tree-compression/compressed-tree-model.ts +88 -88
- package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +203 -203
- package/src/browser/tree/tree-compression/index.ts +20 -20
- package/src/browser/tree/tree-compression/tree-compression-service.ts +125 -125
- package/src/browser/tree/tree-compression/tree-compression.css +28 -28
- package/src/browser/tree/tree-consistency.spec.ts +105 -105
- package/src/browser/tree/tree-container.spec.ts +45 -45
- package/src/browser/tree/tree-container.ts +155 -155
- package/src/browser/tree/tree-decorator.spec.ts +162 -162
- package/src/browser/tree/tree-decorator.ts +238 -238
- package/src/browser/tree/tree-expansion.spec.ts +173 -173
- package/src/browser/tree/tree-expansion.ts +165 -165
- package/src/browser/tree/tree-focus-service.ts +55 -55
- package/src/browser/tree/tree-iterator.spec.ts +170 -170
- package/src/browser/tree/tree-iterator.ts +256 -256
- package/src/browser/tree/tree-label-provider.ts +40 -40
- package/src/browser/tree/tree-model.ts +562 -562
- package/src/browser/tree/tree-navigation.ts +58 -58
- package/src/browser/tree/tree-preference.ts +50 -50
- package/src/browser/tree/tree-search.ts +128 -128
- package/src/browser/tree/tree-selectable.spec.ts +152 -152
- package/src/browser/tree/tree-selection-impl.ts +176 -176
- package/src/browser/tree/tree-selection-state.spec.ts +462 -462
- package/src/browser/tree/tree-selection-state.ts +245 -245
- package/src/browser/tree/tree-selection.ts +159 -159
- package/src/browser/tree/tree-view-welcome-widget.tsx +263 -263
- package/src/browser/tree/tree-widget-selection.ts +45 -45
- package/src/browser/tree/tree-widget.tsx +1591 -1591
- package/src/browser/tree/tree.spec.ts +241 -241
- package/src/browser/tree/tree.ts +425 -425
- package/src/browser/undo-redo-handler.ts +85 -85
- package/src/browser/user-working-directory-provider.ts +77 -77
- package/src/browser/view-container.ts +1640 -1640
- package/src/browser/widget-decoration.ts +358 -358
- package/src/browser/widget-manager.spec.ts +102 -102
- package/src/browser/widget-manager.ts +318 -318
- package/src/browser/widget-open-handler.ts +168 -165
- package/src/browser/widgets/alert-message.tsx +56 -56
- package/src/browser/widgets/enhanced-preview-widget.ts +27 -27
- package/src/browser/widgets/extractable-widget.ts +33 -33
- package/src/browser/widgets/index.ts +21 -20
- package/src/browser/widgets/previewable-widget.ts +31 -31
- package/src/browser/widgets/react-renderer.tsx +53 -53
- package/src/browser/widgets/react-widget.tsx +51 -51
- package/src/browser/widgets/select-component.tsx +367 -367
- package/src/browser/widgets/split-widget.ts +163 -0
- package/src/browser/widgets/widget.ts +406 -406
- package/src/browser/window/browser-window-module.ts +32 -32
- package/src/browser/window/default-secondary-window-service.ts +189 -189
- package/src/browser/window/default-window-service.spec.ts +78 -78
- package/src/browser/window/default-window-service.ts +171 -171
- package/src/browser/window/secondary-window-service.ts +39 -39
- package/src/browser/window/test/mock-window-service.ts +29 -29
- package/src/browser/window/window-service.ts +78 -78
- package/src/browser/window/window-title-service.ts +107 -107
- package/src/browser/window/window-title-updater.ts +95 -95
- package/src/browser/window-contribution.ts +64 -64
- package/src/browser-only/frontend-only-application-module.ts +116 -116
- package/src/browser-only/i18n/i18n-frontend-only-module.ts +37 -37
- package/src/browser-only/logger-frontend-only-module.ts +63 -63
- package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +39 -39
- package/src/browser-only/messaging/messaging-frontend-only-module.ts +42 -42
- package/src/browser-only/preload/frontend-only-preload-module.ts +49 -49
- package/src/common/accessibility.ts +33 -33
- package/src/common/application-error.spec.ts +27 -27
- package/src/common/application-error.ts +76 -76
- package/src/common/application-protocol.ts +42 -42
- package/src/common/array-utils.ts +129 -129
- package/src/common/buffer.ts +228 -228
- package/src/common/cancellation.ts +163 -163
- package/src/common/char-code.ts +438 -438
- package/src/common/collections.ts +125 -125
- package/src/common/color.ts +103 -103
- package/src/common/command.spec.ts +208 -208
- package/src/common/command.ts +489 -489
- package/src/common/contribution-filter/contribution-filter-registry.ts +79 -79
- package/src/common/contribution-filter/contribution-filter.ts +64 -64
- package/src/common/contribution-filter/filter.ts +23 -23
- package/src/common/contribution-filter/index.ts +19 -19
- package/src/common/contribution-provider.ts +96 -96
- package/src/common/disposable.spec.ts +94 -94
- package/src/common/disposable.ts +188 -188
- package/src/common/encoding-service.ts +380 -380
- package/src/common/encodings.ts +24 -24
- package/src/common/env-variables/env-variables-protocol.ts +38 -38
- package/src/common/env-variables/index.ts +17 -17
- package/src/common/event.spec.ts +32 -32
- package/src/common/event.ts +493 -487
- package/src/common/file-uri.ts +61 -61
- package/src/common/frontend-application-state.ts +38 -38
- package/src/common/glob.ts +741 -741
- package/src/common/hash.ts +85 -85
- package/src/common/i18n/localization-server.ts +25 -25
- package/src/common/i18n/localization.ts +80 -80
- package/src/common/i18n/nls.metadata.json +34112 -34112
- package/src/common/index.ts +51 -51
- package/src/common/json-schema.ts +108 -106
- package/src/common/key-store.ts +26 -26
- package/src/common/keybinding.ts +152 -152
- package/src/common/keyboard/keyboard-layout-provider.ts +51 -51
- package/src/common/keys.ts +694 -694
- package/src/common/label-protocol.ts +35 -35
- package/src/common/logger-protocol.ts +119 -119
- package/src/common/logger-watcher.ts +48 -48
- package/src/common/logger.spec.ts +46 -46
- package/src/common/logger.ts +389 -389
- package/src/common/lsp-types.ts +34 -34
- package/src/common/markdown-rendering/icon-utilities.ts +30 -30
- package/src/common/markdown-rendering/index.ts +18 -18
- package/src/common/markdown-rendering/markdown-string.ts +152 -152
- package/src/common/menu/action-menu-node.ts +65 -65
- package/src/common/menu/composite-menu-node.spec.ts +67 -67
- package/src/common/menu/composite-menu-node.ts +114 -114
- package/src/common/menu/index.ts +21 -21
- package/src/common/menu/menu-adapter.ts +103 -103
- package/src/common/menu/menu-model-registry.ts +374 -374
- package/src/common/menu/menu-types.ts +220 -219
- package/src/common/menu/menu.spec.ts +101 -101
- package/src/common/message-rpc/channel.spec.ts +88 -88
- package/src/common/message-rpc/channel.ts +300 -300
- package/src/common/message-rpc/index.ts +22 -22
- package/src/common/message-rpc/message-buffer.ts +105 -105
- package/src/common/message-rpc/msg-pack-extension-manager.ts +70 -70
- package/src/common/message-rpc/rpc-message-encoder.spec.ts +65 -65
- package/src/common/message-rpc/rpc-message-encoder.ts +190 -190
- package/src/common/message-rpc/rpc-protocol.ts +255 -255
- package/src/common/message-rpc/uint8-array-message-buffer.spec.ts +41 -41
- package/src/common/message-rpc/uint8-array-message-buffer.ts +213 -213
- package/src/common/message-service-protocol.ts +148 -148
- package/src/common/message-service.ts +226 -226
- package/src/common/messaging/connection-error-handler.ts +73 -73
- package/src/common/messaging/connection-management.ts +43 -43
- package/src/common/messaging/handler.ts +26 -26
- package/src/common/messaging/index.ts +19 -19
- package/src/common/messaging/proxy-factory.spec.ts +108 -108
- package/src/common/messaging/proxy-factory.ts +336 -336
- package/src/common/messaging/socket-write-buffer.ts +52 -52
- package/src/common/messaging/web-socket-channel.ts +76 -76
- package/src/common/nls.ts +151 -151
- package/src/common/numbers.ts +21 -21
- package/src/common/objects.spec.ts +112 -112
- package/src/common/objects.ts +123 -123
- package/src/common/os.ts +82 -82
- package/src/common/path.spec.ts +415 -415
- package/src/common/path.ts +334 -334
- package/src/common/paths.ts +250 -250
- package/src/common/performance/index.ts +19 -19
- package/src/common/performance/measurement-protocol.ts +104 -104
- package/src/common/performance/measurement.ts +130 -130
- package/src/common/performance/stopwatch.ts +183 -183
- package/src/common/preferences/preference-schema.ts +101 -101
- package/src/common/preferences/preference-scope.spec.ts +48 -48
- package/src/common/preferences/preference-scope.ts +68 -68
- package/src/common/prioritizeable.ts +58 -58
- package/src/common/progress-service-protocol.ts +35 -35
- package/src/common/progress-service.ts +82 -82
- package/src/common/promise-util.spec.ts +102 -102
- package/src/common/promise-util.ts +143 -143
- package/src/common/quick-pick-service.ts +353 -353
- package/src/common/reference.spec.ts +145 -145
- package/src/common/reference.ts +230 -230
- package/src/common/resource.ts +430 -430
- package/src/common/selection-command-handler.ts +101 -101
- package/src/common/selection-service.spec.ts +43 -43
- package/src/common/selection-service.ts +49 -49
- package/src/common/selection.ts +50 -50
- package/src/common/severity.ts +111 -111
- package/src/common/stream.ts +718 -718
- package/src/common/strings.ts +231 -231
- package/src/common/telemetry.ts +45 -45
- package/src/common/ternary-search-tree.ts +417 -417
- package/src/common/test/expect.ts +34 -34
- package/src/common/test/mock-logger.ts +118 -118
- package/src/common/test/mock-menu.ts +35 -35
- package/src/common/test/mock-resource-provider.ts +33 -33
- package/src/common/theme.ts +68 -68
- package/src/common/types.spec.ts +86 -86
- package/src/common/types.ts +140 -140
- package/src/common/uri-command-handler.spec.ts +90 -90
- package/src/common/uri-command-handler.ts +148 -148
- package/src/common/uri.spec.ts +278 -278
- package/src/common/uri.ts +279 -279
- package/src/common/uuid.ts +45 -45
- package/src/common/version.ts +17 -17
- package/src/common/view-column.ts +33 -33
- package/src/common/window.ts +34 -34
- package/src/electron-browser/electron-clipboard-service.ts +32 -32
- package/src/electron-browser/electron-uri-handler.ts +42 -0
- package/src/electron-browser/keyboard/electron-keyboard-layout-change-notifier.ts +39 -39
- package/src/electron-browser/keyboard/electron-keyboard-module.ts +28 -28
- package/src/electron-browser/menu/electron-context-menu-renderer.ts +122 -122
- package/src/electron-browser/menu/electron-main-menu-factory.ts +339 -338
- package/src/electron-browser/menu/electron-menu-contribution.ts +506 -506
- package/src/electron-browser/menu/electron-menu-module.ts +40 -40
- package/src/electron-browser/menu/electron-menu-style.css +110 -110
- package/src/electron-browser/messaging/electron-frontend-id-provider.ts +25 -25
- package/src/electron-browser/messaging/electron-ipc-connection-source.ts +65 -65
- package/src/electron-browser/messaging/electron-local-ws-connection-source.ts +45 -45
- package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +78 -78
- package/src/electron-browser/messaging/electron-ws-connection-source.ts +38 -38
- package/src/electron-browser/preload.ts +264 -249
- package/src/electron-browser/request/electron-browser-request-module.ts +26 -26
- package/src/electron-browser/token/electron-token-frontend-module.ts +22 -22
- package/src/electron-browser/window/electron-frontend-application-state.ts +26 -26
- package/src/electron-browser/window/electron-secondary-window-service.ts +35 -35
- package/src/electron-browser/window/electron-window-module.ts +48 -45
- package/src/electron-browser/window/electron-window-preferences.ts +76 -76
- package/src/electron-browser/window/electron-window-service.ts +109 -109
- package/src/electron-browser/window/external-app-open-handler.ts +42 -42
- package/src/electron-common/electron-api.ts +157 -154
- package/src/electron-common/electron-main-window-service.ts +24 -24
- package/src/electron-common/electron-token.ts +27 -27
- package/src/electron-main/electron-api-main.ts +373 -347
- package/src/electron-main/electron-main-application-module.ts +65 -65
- package/src/electron-main/electron-main-application.ts +860 -818
- package/src/electron-main/electron-main-constants.ts +23 -23
- package/src/electron-main/electron-main-window-service-impl.ts +44 -44
- package/src/electron-main/electron-security-token-service.ts +36 -36
- package/src/electron-main/event-utils.ts +36 -36
- package/src/electron-main/messaging/electron-connection-handler.ts +21 -21
- package/src/electron-main/messaging/electron-messaging-contribution.ts +143 -143
- package/src/electron-main/messaging/electron-messaging-service.ts +35 -35
- package/src/electron-main/theia-electron-window.ts +219 -214
- package/src/electron-node/cli/electron-backend-cli-module.ts +24 -24
- package/src/electron-node/cli/electron-cli-contribution.ts +35 -35
- package/src/electron-node/hosting/electron-backend-hosting-module.ts +24 -24
- package/src/electron-node/hosting/electron-ws-origin-validator.ts +37 -37
- package/src/electron-node/keyboard/electron-backend-keyboard-module.ts +30 -30
- package/src/electron-node/keyboard/electron-keyboard-layout-provider.ts +35 -35
- package/src/electron-node/request/electron-backend-request-module.ts +23 -23
- package/src/electron-node/request/electron-backend-request-service.ts +78 -78
- package/src/electron-node/token/electron-token-backend-contribution.ts +48 -48
- package/src/electron-node/token/electron-token-backend-module.ts +28 -28
- package/src/electron-node/token/electron-token-validator.ts +93 -93
- package/src/node/application-server.ts +59 -59
- package/src/node/backend-application-config-provider.spec.ts +29 -29
- package/src/node/backend-application-config-provider.ts +48 -48
- package/src/node/backend-application-module.ts +139 -139
- package/src/node/backend-application.ts +374 -374
- package/src/node/cli.spec.ts +94 -94
- package/src/node/cli.ts +63 -63
- package/src/node/console-logger-server.spec.ts +59 -59
- package/src/node/console-logger-server.ts +76 -76
- package/src/node/debug.ts +30 -30
- package/src/node/dynamic-require.ts +56 -56
- package/src/node/env-variables/env-variables-server.ts +123 -123
- package/src/node/env-variables/index.ts +17 -17
- package/src/node/environment-utils.spec.ts +92 -92
- package/src/node/environment-utils.ts +66 -66
- package/src/node/file-uri.spec.ts +76 -76
- package/src/node/filesystem-locking.ts +77 -77
- package/src/node/hosting/backend-application-hosts.ts +60 -60
- package/src/node/hosting/backend-hosting-module.ts +26 -26
- package/src/node/hosting/ws-origin-validator.ts +36 -36
- package/src/node/i18n/i18n-backend-module.ts +42 -42
- package/src/node/i18n/localization-contribution.ts +112 -112
- package/src/node/i18n/localization-provider.ts +125 -125
- package/src/node/i18n/localization-server.ts +52 -52
- package/src/node/i18n/theia-localization-contribution.ts +40 -36
- package/src/node/index.ts +22 -22
- package/src/node/key-store-server.ts +162 -162
- package/src/node/logger-backend-module.ts +88 -88
- package/src/node/logger-cli-contribution.spec.ts +245 -245
- package/src/node/logger-cli-contribution.ts +168 -168
- package/src/node/main.ts +33 -33
- package/src/node/messaging/binary-message-pipe.ts +168 -168
- package/src/node/messaging/connection-container-module.ts +96 -96
- package/src/node/messaging/default-messaging-service.ts +129 -129
- package/src/node/messaging/frontend-connection-service.ts +24 -24
- package/src/node/messaging/index.ts +19 -19
- package/src/node/messaging/ipc-bootstrap.ts +27 -27
- package/src/node/messaging/ipc-channel.ts +77 -77
- package/src/node/messaging/ipc-connection-provider.ts +107 -107
- package/src/node/messaging/ipc-protocol.ts +76 -76
- package/src/node/messaging/messaging-backend-module.ts +52 -52
- package/src/node/messaging/messaging-listeners.ts +52 -52
- package/src/node/messaging/messaging-service.ts +46 -46
- package/src/node/messaging/test/test-web-socket-channel.ts +61 -61
- package/src/node/messaging/websocket-endpoint.ts +79 -79
- package/src/node/messaging/websocket-frontend-connection-service.ts +186 -186
- package/src/node/os-backend-provider.ts +25 -25
- package/src/node/performance/index.ts +18 -18
- package/src/node/performance/measurement-backend-bindings.ts +35 -35
- package/src/node/performance/node-stopwatch.ts +40 -40
- package/src/node/process-utils.spec.ts +48 -48
- package/src/node/process-utils.ts +102 -102
- package/src/node/remote/backend-remote-service.ts +25 -25
- package/src/node/remote/remote-cli-contribution.ts +34 -34
- package/src/node/remote/remote-copy-contribution.ts +45 -45
- package/src/node/request/backend-request-facade.ts +39 -39
- package/src/node/request/backend-request-module.ts +25 -25
- package/src/node/request/proxy-cli-contribution.ts +65 -65
- package/src/node/ws-request-validators.ts +56 -56
- package/src/typings/native-keymap.d.ts +108 -108
- package/i18n/nls.pt-pt.json +0 -552
|
@@ -1,374 +1,374 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2017 TypeFox 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-only WITH Classpath-exception-2.0
|
|
15
|
-
// *****************************************************************************
|
|
16
|
-
|
|
17
|
-
import * as dns from 'dns';
|
|
18
|
-
import * as path from 'path';
|
|
19
|
-
import * as http from 'http';
|
|
20
|
-
import * as https from 'https';
|
|
21
|
-
import * as express from 'express';
|
|
22
|
-
import * as yargs from 'yargs';
|
|
23
|
-
import * as fs from 'fs-extra';
|
|
24
|
-
import { inject, named, injectable, postConstruct } from 'inversify';
|
|
25
|
-
import { ContributionProvider, MaybePromise, Stopwatch } from '../common';
|
|
26
|
-
import { CliContribution } from './cli';
|
|
27
|
-
import { Deferred } from '../common/promise-util';
|
|
28
|
-
import { environment } from '../common/index';
|
|
29
|
-
import { AddressInfo } from 'net';
|
|
30
|
-
import { ProcessUtils } from './process-utils';
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* The path to the application project directory. This is the directory where the application code is located.
|
|
34
|
-
* Mostly contains the `package.json` file and the `lib` directory.
|
|
35
|
-
*/
|
|
36
|
-
export const BackendApplicationPath = process.env.THEIA_APP_PROJECT_PATH || process.cwd();
|
|
37
|
-
|
|
38
|
-
export type DnsResultOrder = 'ipv4first' | 'verbatim' | 'nodeDefault';
|
|
39
|
-
|
|
40
|
-
const APP_PROJECT_PATH = 'app-project-path';
|
|
41
|
-
|
|
42
|
-
const TIMER_WARNING_THRESHOLD = 50;
|
|
43
|
-
|
|
44
|
-
const DEFAULT_PORT = environment.electron.is() ? 0 : 3000;
|
|
45
|
-
const DEFAULT_HOST = 'localhost';
|
|
46
|
-
const DEFAULT_SSL = false;
|
|
47
|
-
const DEFAULT_DNS_DEFAULT_RESULT_ORDER: DnsResultOrder = 'ipv4first';
|
|
48
|
-
|
|
49
|
-
export const BackendApplicationServer = Symbol('BackendApplicationServer');
|
|
50
|
-
/**
|
|
51
|
-
* This service is responsible for serving the frontend files.
|
|
52
|
-
*
|
|
53
|
-
* When not bound, `@theia/cli` generators will bind it on the fly to serve files according to its own layout.
|
|
54
|
-
*/
|
|
55
|
-
export interface BackendApplicationServer extends BackendApplicationContribution { }
|
|
56
|
-
|
|
57
|
-
export const BackendApplicationContribution = Symbol('BackendApplicationContribution');
|
|
58
|
-
/**
|
|
59
|
-
* Contribution for hooking into the backend lifecycle:
|
|
60
|
-
*
|
|
61
|
-
* - `initialize()`
|
|
62
|
-
* - `configure(expressApp)`
|
|
63
|
-
* - `onStart(httpServer)`
|
|
64
|
-
* - `onStop()`
|
|
65
|
-
*/
|
|
66
|
-
export interface BackendApplicationContribution {
|
|
67
|
-
/**
|
|
68
|
-
* Called during the initialization of the backend application.
|
|
69
|
-
* Use this for functionality which has to run as early as possible.
|
|
70
|
-
*
|
|
71
|
-
* The implementation may be async, however it will still block the
|
|
72
|
-
* initialization step until it's resolved.
|
|
73
|
-
*
|
|
74
|
-
* @returns either `undefined` or a Promise resolving to `undefined`.
|
|
75
|
-
*/
|
|
76
|
-
initialize?(): MaybePromise<void>;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Called after the initialization of the backend application is complete.
|
|
80
|
-
* Use this to configure the Express app before it is started, for example
|
|
81
|
-
* to offer additional endpoints.
|
|
82
|
-
*
|
|
83
|
-
* The implementation may be async, however it will still block the
|
|
84
|
-
* configuration step until it's resolved.
|
|
85
|
-
*
|
|
86
|
-
* @param app the express application to configure.
|
|
87
|
-
*
|
|
88
|
-
* @returns either `undefined` or a Promise resolving to `undefined`.
|
|
89
|
-
*/
|
|
90
|
-
configure?(app: express.Application): MaybePromise<void>;
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Called right after the server for the Express app is started.
|
|
94
|
-
* Use this to additionally configure the server or as ready-signal for your service.
|
|
95
|
-
*
|
|
96
|
-
* The implementation may be async, however it will still block the
|
|
97
|
-
* startup step until it's resolved.
|
|
98
|
-
*
|
|
99
|
-
* @param server the backend server running the express app.
|
|
100
|
-
*
|
|
101
|
-
* @returns either `undefined` or a Promise resolving to `undefined`.
|
|
102
|
-
*/
|
|
103
|
-
onStart?(server: http.Server | https.Server): MaybePromise<void>;
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Called when the backend application shuts down. Contributions must perform only synchronous operations.
|
|
107
|
-
* Any kind of additional asynchronous work queued in the event loop will be ignored and abandoned.
|
|
108
|
-
*
|
|
109
|
-
* @param app the express application.
|
|
110
|
-
*/
|
|
111
|
-
onStop?(app?: express.Application): void;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
@injectable()
|
|
115
|
-
export class BackendApplicationCliContribution implements CliContribution {
|
|
116
|
-
|
|
117
|
-
port: number;
|
|
118
|
-
hostname: string | undefined;
|
|
119
|
-
dnsDefaultResultOrder: DnsResultOrder = DEFAULT_DNS_DEFAULT_RESULT_ORDER;
|
|
120
|
-
ssl: boolean | undefined;
|
|
121
|
-
cert: string | undefined;
|
|
122
|
-
certkey: string | undefined;
|
|
123
|
-
/** @deprecated Use the `BackendApplicationPath` constant or `process.env.THEIA_APP_PROJECT_PATH` environment variable instead */
|
|
124
|
-
projectPath = BackendApplicationPath;
|
|
125
|
-
|
|
126
|
-
configure(conf: yargs.Argv): void {
|
|
127
|
-
conf.option('port', { alias: 'p', description: 'The port the backend server listens on.', type: 'number', default: DEFAULT_PORT });
|
|
128
|
-
conf.option('hostname', { alias: 'h', description: 'The allowed hostname for connections.', type: 'string', default: DEFAULT_HOST });
|
|
129
|
-
conf.option('ssl', { description: 'Use SSL (HTTPS), cert and certkey must also be set', type: 'boolean', default: DEFAULT_SSL });
|
|
130
|
-
conf.option('cert', { description: 'Path to SSL certificate.', type: 'string' });
|
|
131
|
-
conf.option('certkey', { description: 'Path to SSL certificate key.', type: 'string' });
|
|
132
|
-
conf.option(APP_PROJECT_PATH, { description: 'Sets the application project directory', deprecated: true });
|
|
133
|
-
conf.option('dnsDefaultResultOrder', {
|
|
134
|
-
type: 'string',
|
|
135
|
-
description: 'Configure Node\'s DNS resolver default behavior, see https://nodejs.org/docs/latest-v18.x/api/dns.html#dnssetdefaultresultorderorder',
|
|
136
|
-
choices: ['ipv4first', 'verbatim', 'nodeDefault'],
|
|
137
|
-
default: DEFAULT_DNS_DEFAULT_RESULT_ORDER
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
setArguments(args: yargs.Arguments): void {
|
|
142
|
-
this.port = args.port as number;
|
|
143
|
-
this.hostname = args.hostname as string;
|
|
144
|
-
this.ssl = args.ssl as boolean;
|
|
145
|
-
this.cert = args.cert as string;
|
|
146
|
-
this.certkey = args.certkey as string;
|
|
147
|
-
this.dnsDefaultResultOrder = args.dnsDefaultResultOrder as DnsResultOrder;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* The main entry point for Theia applications.
|
|
153
|
-
*/
|
|
154
|
-
@injectable()
|
|
155
|
-
export class BackendApplication {
|
|
156
|
-
|
|
157
|
-
protected readonly app: express.Application = express();
|
|
158
|
-
|
|
159
|
-
@inject(ProcessUtils)
|
|
160
|
-
protected readonly processUtils: ProcessUtils;
|
|
161
|
-
|
|
162
|
-
@inject(Stopwatch)
|
|
163
|
-
protected readonly stopwatch: Stopwatch;
|
|
164
|
-
|
|
165
|
-
private _configured: Promise<void>;
|
|
166
|
-
|
|
167
|
-
constructor(
|
|
168
|
-
@inject(ContributionProvider) @named(BackendApplicationContribution)
|
|
169
|
-
protected readonly contributionsProvider: ContributionProvider<BackendApplicationContribution>,
|
|
170
|
-
@inject(BackendApplicationCliContribution) protected readonly cliParams: BackendApplicationCliContribution) {
|
|
171
|
-
process.on('uncaughtException', error => {
|
|
172
|
-
this.handleUncaughtError(error);
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
// Workaround for Electron not installing a handler to ignore SIGPIPE error
|
|
176
|
-
// (https://github.com/electron/electron/issues/13254)
|
|
177
|
-
process.on('SIGPIPE', () => {
|
|
178
|
-
console.error(new Error('Unexpected SIGPIPE'));
|
|
179
|
-
});
|
|
180
|
-
/**
|
|
181
|
-
* Kill the current process tree on exit.
|
|
182
|
-
*/
|
|
183
|
-
function signalHandler(signal: NodeJS.Signals): never {
|
|
184
|
-
process.exit(1);
|
|
185
|
-
}
|
|
186
|
-
// Handles normal process termination.
|
|
187
|
-
process.on('exit', () => this.onStop());
|
|
188
|
-
// Handles `Ctrl+C`.
|
|
189
|
-
process.on('SIGINT', signalHandler);
|
|
190
|
-
// Handles `kill pid`.
|
|
191
|
-
process.on('SIGTERM', signalHandler);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
protected async initialize(): Promise<void> {
|
|
195
|
-
await Promise.all(this.contributionsProvider.getContributions().map(async contribution => {
|
|
196
|
-
if (contribution.initialize) {
|
|
197
|
-
try {
|
|
198
|
-
await this.measure(contribution.constructor.name + '.initialize',
|
|
199
|
-
() => contribution.initialize!()
|
|
200
|
-
);
|
|
201
|
-
} catch (error) {
|
|
202
|
-
console.error('Could not initialize contribution', error);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}));
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
get configured(): Promise<void> {
|
|
209
|
-
return this._configured;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
@postConstruct()
|
|
213
|
-
protected init(): void {
|
|
214
|
-
this._configured = this.configure();
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
protected async configure(): Promise<void> {
|
|
218
|
-
await this.initialize();
|
|
219
|
-
|
|
220
|
-
this.app.get('*.js', this.serveGzipped.bind(this, 'text/javascript'));
|
|
221
|
-
this.app.get('*.js.map', this.serveGzipped.bind(this, 'application/json'));
|
|
222
|
-
this.app.get('*.css', this.serveGzipped.bind(this, 'text/css'));
|
|
223
|
-
this.app.get('*.wasm', this.serveGzipped.bind(this, 'application/wasm'));
|
|
224
|
-
this.app.get('*.gif', this.serveGzipped.bind(this, 'image/gif'));
|
|
225
|
-
this.app.get('*.png', this.serveGzipped.bind(this, 'image/png'));
|
|
226
|
-
this.app.get('*.svg', this.serveGzipped.bind(this, 'image/svg+xml'));
|
|
227
|
-
this.app.get('*.eot', this.serveGzipped.bind(this, 'application/vnd.ms-fontobject'));
|
|
228
|
-
this.app.get('*.ttf', this.serveGzipped.bind(this, 'font/ttf'));
|
|
229
|
-
this.app.get('*.woff', this.serveGzipped.bind(this, 'font/woff'));
|
|
230
|
-
this.app.get('*.woff2', this.serveGzipped.bind(this, 'font/woff2'));
|
|
231
|
-
|
|
232
|
-
await Promise.all(this.contributionsProvider.getContributions().map(async contribution => {
|
|
233
|
-
if (contribution.configure) {
|
|
234
|
-
try {
|
|
235
|
-
await contribution.configure!(this.app);
|
|
236
|
-
} catch (error) {
|
|
237
|
-
console.error('Could not configure contribution', error);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}));
|
|
241
|
-
console.info('configured all backend app contributions');
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
use(...handlers: express.Handler[]): void {
|
|
245
|
-
this.app.use(...handlers);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
async start(port?: number, hostname?: string): Promise<http.Server | https.Server> {
|
|
249
|
-
hostname ??= this.cliParams.hostname;
|
|
250
|
-
port ??= this.cliParams.port;
|
|
251
|
-
|
|
252
|
-
if (this.cliParams.dnsDefaultResultOrder !== 'nodeDefault') {
|
|
253
|
-
dns.setDefaultResultOrder(this.cliParams.dnsDefaultResultOrder);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
const deferred = new Deferred<http.Server | https.Server>();
|
|
257
|
-
let server: http.Server | https.Server;
|
|
258
|
-
|
|
259
|
-
if (this.cliParams.ssl) {
|
|
260
|
-
|
|
261
|
-
if (this.cliParams.cert === undefined) {
|
|
262
|
-
throw new Error('Missing --cert option, see --help for usage');
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (this.cliParams.certkey === undefined) {
|
|
266
|
-
throw new Error('Missing --certkey option, see --help for usage');
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
let key: Buffer;
|
|
270
|
-
let cert: Buffer;
|
|
271
|
-
try {
|
|
272
|
-
key = await fs.readFile(this.cliParams.certkey as string);
|
|
273
|
-
} catch (err) {
|
|
274
|
-
console.error("Can't read certificate key");
|
|
275
|
-
throw err;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
try {
|
|
279
|
-
cert = await fs.readFile(this.cliParams.cert as string);
|
|
280
|
-
} catch (err) {
|
|
281
|
-
console.error("Can't read certificate");
|
|
282
|
-
throw err;
|
|
283
|
-
}
|
|
284
|
-
server = https.createServer({ key, cert }, this.app);
|
|
285
|
-
} else {
|
|
286
|
-
server = http.createServer(this.app);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
server.on('error', error => {
|
|
290
|
-
deferred.reject(error);
|
|
291
|
-
/* The backend might run in a separate process,
|
|
292
|
-
* so we defer `process.exit` to let time for logging in the parent process */
|
|
293
|
-
setTimeout(process.exit, 0, 1);
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
server.listen(port, hostname, () => {
|
|
297
|
-
// address should be defined at this point
|
|
298
|
-
const address = server.address()!;
|
|
299
|
-
const url = typeof address === 'string' ? address : this.getHttpUrl(address, this.cliParams.ssl);
|
|
300
|
-
console.info(`Theia app listening on ${url}.`);
|
|
301
|
-
deferred.resolve(server);
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
/* Allow any number of websocket servers. */
|
|
305
|
-
server.setMaxListeners(0);
|
|
306
|
-
|
|
307
|
-
for (const contribution of this.contributionsProvider.getContributions()) {
|
|
308
|
-
if (contribution.onStart) {
|
|
309
|
-
try {
|
|
310
|
-
await this.measure(contribution.constructor.name + '.onStart',
|
|
311
|
-
() => contribution.onStart!(server)
|
|
312
|
-
);
|
|
313
|
-
} catch (error) {
|
|
314
|
-
console.error('Could not start contribution', error);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
return this.stopwatch.startAsync('server', 'Finished starting backend application', () => deferred.promise);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
protected getHttpUrl({ address, port, family }: AddressInfo, ssl?: boolean): string {
|
|
322
|
-
const scheme = ssl ? 'https' : 'http';
|
|
323
|
-
return family.toLowerCase() === 'ipv6'
|
|
324
|
-
? `${scheme}://[${address}]:${port}`
|
|
325
|
-
: `${scheme}://${address}:${port}`;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
protected onStop(): void {
|
|
329
|
-
console.info('>>> Stopping backend contributions...');
|
|
330
|
-
for (const contrib of this.contributionsProvider.getContributions()) {
|
|
331
|
-
if (contrib.onStop) {
|
|
332
|
-
try {
|
|
333
|
-
contrib.onStop(this.app);
|
|
334
|
-
} catch (error) {
|
|
335
|
-
console.error('Could not stop contribution', error);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
console.info('<<< All backend contributions have been stopped.');
|
|
340
|
-
this.processUtils.terminateProcessTree(process.pid);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
protected async serveGzipped(contentType: string, req: express.Request, res: express.Response, next: express.NextFunction): Promise<void> {
|
|
344
|
-
const acceptedEncodings = req.acceptsEncodings();
|
|
345
|
-
|
|
346
|
-
const gzUrl = `${req.url}.gz`;
|
|
347
|
-
const gzPath = path.join(BackendApplicationPath, 'lib', 'frontend', gzUrl);
|
|
348
|
-
if (acceptedEncodings.indexOf('gzip') === -1 || !(await fs.pathExists(gzPath))) {
|
|
349
|
-
next();
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
req.url = gzUrl;
|
|
354
|
-
|
|
355
|
-
res.set('Content-Encoding', 'gzip');
|
|
356
|
-
res.set('Content-Type', contentType);
|
|
357
|
-
|
|
358
|
-
next();
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
protected async measure<T>(name: string, fn: () => MaybePromise<T>): Promise<T> {
|
|
362
|
-
return this.stopwatch.startAsync(name, `Backend ${name}`, fn, { thresholdMillis: TIMER_WARNING_THRESHOLD });
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
protected handleUncaughtError(error: Error): void {
|
|
366
|
-
if (error) {
|
|
367
|
-
console.error('Uncaught Exception: ', error.toString());
|
|
368
|
-
if (error.stack) {
|
|
369
|
-
console.error(error.stack);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2017 TypeFox 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-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import * as dns from 'dns';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import * as http from 'http';
|
|
20
|
+
import * as https from 'https';
|
|
21
|
+
import * as express from 'express';
|
|
22
|
+
import * as yargs from 'yargs';
|
|
23
|
+
import * as fs from 'fs-extra';
|
|
24
|
+
import { inject, named, injectable, postConstruct } from 'inversify';
|
|
25
|
+
import { ContributionProvider, MaybePromise, Stopwatch } from '../common';
|
|
26
|
+
import { CliContribution } from './cli';
|
|
27
|
+
import { Deferred } from '../common/promise-util';
|
|
28
|
+
import { environment } from '../common/index';
|
|
29
|
+
import { AddressInfo } from 'net';
|
|
30
|
+
import { ProcessUtils } from './process-utils';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The path to the application project directory. This is the directory where the application code is located.
|
|
34
|
+
* Mostly contains the `package.json` file and the `lib` directory.
|
|
35
|
+
*/
|
|
36
|
+
export const BackendApplicationPath = process.env.THEIA_APP_PROJECT_PATH || process.cwd();
|
|
37
|
+
|
|
38
|
+
export type DnsResultOrder = 'ipv4first' | 'verbatim' | 'nodeDefault';
|
|
39
|
+
|
|
40
|
+
const APP_PROJECT_PATH = 'app-project-path';
|
|
41
|
+
|
|
42
|
+
const TIMER_WARNING_THRESHOLD = 50;
|
|
43
|
+
|
|
44
|
+
const DEFAULT_PORT = environment.electron.is() ? 0 : 3000;
|
|
45
|
+
const DEFAULT_HOST = 'localhost';
|
|
46
|
+
const DEFAULT_SSL = false;
|
|
47
|
+
const DEFAULT_DNS_DEFAULT_RESULT_ORDER: DnsResultOrder = 'ipv4first';
|
|
48
|
+
|
|
49
|
+
export const BackendApplicationServer = Symbol('BackendApplicationServer');
|
|
50
|
+
/**
|
|
51
|
+
* This service is responsible for serving the frontend files.
|
|
52
|
+
*
|
|
53
|
+
* When not bound, `@theia/cli` generators will bind it on the fly to serve files according to its own layout.
|
|
54
|
+
*/
|
|
55
|
+
export interface BackendApplicationServer extends BackendApplicationContribution { }
|
|
56
|
+
|
|
57
|
+
export const BackendApplicationContribution = Symbol('BackendApplicationContribution');
|
|
58
|
+
/**
|
|
59
|
+
* Contribution for hooking into the backend lifecycle:
|
|
60
|
+
*
|
|
61
|
+
* - `initialize()`
|
|
62
|
+
* - `configure(expressApp)`
|
|
63
|
+
* - `onStart(httpServer)`
|
|
64
|
+
* - `onStop()`
|
|
65
|
+
*/
|
|
66
|
+
export interface BackendApplicationContribution {
|
|
67
|
+
/**
|
|
68
|
+
* Called during the initialization of the backend application.
|
|
69
|
+
* Use this for functionality which has to run as early as possible.
|
|
70
|
+
*
|
|
71
|
+
* The implementation may be async, however it will still block the
|
|
72
|
+
* initialization step until it's resolved.
|
|
73
|
+
*
|
|
74
|
+
* @returns either `undefined` or a Promise resolving to `undefined`.
|
|
75
|
+
*/
|
|
76
|
+
initialize?(): MaybePromise<void>;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Called after the initialization of the backend application is complete.
|
|
80
|
+
* Use this to configure the Express app before it is started, for example
|
|
81
|
+
* to offer additional endpoints.
|
|
82
|
+
*
|
|
83
|
+
* The implementation may be async, however it will still block the
|
|
84
|
+
* configuration step until it's resolved.
|
|
85
|
+
*
|
|
86
|
+
* @param app the express application to configure.
|
|
87
|
+
*
|
|
88
|
+
* @returns either `undefined` or a Promise resolving to `undefined`.
|
|
89
|
+
*/
|
|
90
|
+
configure?(app: express.Application): MaybePromise<void>;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Called right after the server for the Express app is started.
|
|
94
|
+
* Use this to additionally configure the server or as ready-signal for your service.
|
|
95
|
+
*
|
|
96
|
+
* The implementation may be async, however it will still block the
|
|
97
|
+
* startup step until it's resolved.
|
|
98
|
+
*
|
|
99
|
+
* @param server the backend server running the express app.
|
|
100
|
+
*
|
|
101
|
+
* @returns either `undefined` or a Promise resolving to `undefined`.
|
|
102
|
+
*/
|
|
103
|
+
onStart?(server: http.Server | https.Server): MaybePromise<void>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Called when the backend application shuts down. Contributions must perform only synchronous operations.
|
|
107
|
+
* Any kind of additional asynchronous work queued in the event loop will be ignored and abandoned.
|
|
108
|
+
*
|
|
109
|
+
* @param app the express application.
|
|
110
|
+
*/
|
|
111
|
+
onStop?(app?: express.Application): void;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@injectable()
|
|
115
|
+
export class BackendApplicationCliContribution implements CliContribution {
|
|
116
|
+
|
|
117
|
+
port: number;
|
|
118
|
+
hostname: string | undefined;
|
|
119
|
+
dnsDefaultResultOrder: DnsResultOrder = DEFAULT_DNS_DEFAULT_RESULT_ORDER;
|
|
120
|
+
ssl: boolean | undefined;
|
|
121
|
+
cert: string | undefined;
|
|
122
|
+
certkey: string | undefined;
|
|
123
|
+
/** @deprecated Use the `BackendApplicationPath` constant or `process.env.THEIA_APP_PROJECT_PATH` environment variable instead */
|
|
124
|
+
projectPath = BackendApplicationPath;
|
|
125
|
+
|
|
126
|
+
configure(conf: yargs.Argv): void {
|
|
127
|
+
conf.option('port', { alias: 'p', description: 'The port the backend server listens on.', type: 'number', default: DEFAULT_PORT });
|
|
128
|
+
conf.option('hostname', { alias: 'h', description: 'The allowed hostname for connections.', type: 'string', default: DEFAULT_HOST });
|
|
129
|
+
conf.option('ssl', { description: 'Use SSL (HTTPS), cert and certkey must also be set', type: 'boolean', default: DEFAULT_SSL });
|
|
130
|
+
conf.option('cert', { description: 'Path to SSL certificate.', type: 'string' });
|
|
131
|
+
conf.option('certkey', { description: 'Path to SSL certificate key.', type: 'string' });
|
|
132
|
+
conf.option(APP_PROJECT_PATH, { description: 'Sets the application project directory', deprecated: true });
|
|
133
|
+
conf.option('dnsDefaultResultOrder', {
|
|
134
|
+
type: 'string',
|
|
135
|
+
description: 'Configure Node\'s DNS resolver default behavior, see https://nodejs.org/docs/latest-v18.x/api/dns.html#dnssetdefaultresultorderorder',
|
|
136
|
+
choices: ['ipv4first', 'verbatim', 'nodeDefault'],
|
|
137
|
+
default: DEFAULT_DNS_DEFAULT_RESULT_ORDER
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
setArguments(args: yargs.Arguments): void {
|
|
142
|
+
this.port = args.port as number;
|
|
143
|
+
this.hostname = args.hostname as string;
|
|
144
|
+
this.ssl = args.ssl as boolean;
|
|
145
|
+
this.cert = args.cert as string;
|
|
146
|
+
this.certkey = args.certkey as string;
|
|
147
|
+
this.dnsDefaultResultOrder = args.dnsDefaultResultOrder as DnsResultOrder;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The main entry point for Theia applications.
|
|
153
|
+
*/
|
|
154
|
+
@injectable()
|
|
155
|
+
export class BackendApplication {
|
|
156
|
+
|
|
157
|
+
protected readonly app: express.Application = express();
|
|
158
|
+
|
|
159
|
+
@inject(ProcessUtils)
|
|
160
|
+
protected readonly processUtils: ProcessUtils;
|
|
161
|
+
|
|
162
|
+
@inject(Stopwatch)
|
|
163
|
+
protected readonly stopwatch: Stopwatch;
|
|
164
|
+
|
|
165
|
+
private _configured: Promise<void>;
|
|
166
|
+
|
|
167
|
+
constructor(
|
|
168
|
+
@inject(ContributionProvider) @named(BackendApplicationContribution)
|
|
169
|
+
protected readonly contributionsProvider: ContributionProvider<BackendApplicationContribution>,
|
|
170
|
+
@inject(BackendApplicationCliContribution) protected readonly cliParams: BackendApplicationCliContribution) {
|
|
171
|
+
process.on('uncaughtException', error => {
|
|
172
|
+
this.handleUncaughtError(error);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Workaround for Electron not installing a handler to ignore SIGPIPE error
|
|
176
|
+
// (https://github.com/electron/electron/issues/13254)
|
|
177
|
+
process.on('SIGPIPE', () => {
|
|
178
|
+
console.error(new Error('Unexpected SIGPIPE'));
|
|
179
|
+
});
|
|
180
|
+
/**
|
|
181
|
+
* Kill the current process tree on exit.
|
|
182
|
+
*/
|
|
183
|
+
function signalHandler(signal: NodeJS.Signals): never {
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
// Handles normal process termination.
|
|
187
|
+
process.on('exit', () => this.onStop());
|
|
188
|
+
// Handles `Ctrl+C`.
|
|
189
|
+
process.on('SIGINT', signalHandler);
|
|
190
|
+
// Handles `kill pid`.
|
|
191
|
+
process.on('SIGTERM', signalHandler);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
protected async initialize(): Promise<void> {
|
|
195
|
+
await Promise.all(this.contributionsProvider.getContributions().map(async contribution => {
|
|
196
|
+
if (contribution.initialize) {
|
|
197
|
+
try {
|
|
198
|
+
await this.measure(contribution.constructor.name + '.initialize',
|
|
199
|
+
() => contribution.initialize!()
|
|
200
|
+
);
|
|
201
|
+
} catch (error) {
|
|
202
|
+
console.error('Could not initialize contribution', error);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
get configured(): Promise<void> {
|
|
209
|
+
return this._configured;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@postConstruct()
|
|
213
|
+
protected init(): void {
|
|
214
|
+
this._configured = this.configure();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
protected async configure(): Promise<void> {
|
|
218
|
+
await this.initialize();
|
|
219
|
+
|
|
220
|
+
this.app.get('*.js', this.serveGzipped.bind(this, 'text/javascript'));
|
|
221
|
+
this.app.get('*.js.map', this.serveGzipped.bind(this, 'application/json'));
|
|
222
|
+
this.app.get('*.css', this.serveGzipped.bind(this, 'text/css'));
|
|
223
|
+
this.app.get('*.wasm', this.serveGzipped.bind(this, 'application/wasm'));
|
|
224
|
+
this.app.get('*.gif', this.serveGzipped.bind(this, 'image/gif'));
|
|
225
|
+
this.app.get('*.png', this.serveGzipped.bind(this, 'image/png'));
|
|
226
|
+
this.app.get('*.svg', this.serveGzipped.bind(this, 'image/svg+xml'));
|
|
227
|
+
this.app.get('*.eot', this.serveGzipped.bind(this, 'application/vnd.ms-fontobject'));
|
|
228
|
+
this.app.get('*.ttf', this.serveGzipped.bind(this, 'font/ttf'));
|
|
229
|
+
this.app.get('*.woff', this.serveGzipped.bind(this, 'font/woff'));
|
|
230
|
+
this.app.get('*.woff2', this.serveGzipped.bind(this, 'font/woff2'));
|
|
231
|
+
|
|
232
|
+
await Promise.all(this.contributionsProvider.getContributions().map(async contribution => {
|
|
233
|
+
if (contribution.configure) {
|
|
234
|
+
try {
|
|
235
|
+
await contribution.configure!(this.app);
|
|
236
|
+
} catch (error) {
|
|
237
|
+
console.error('Could not configure contribution', error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}));
|
|
241
|
+
console.info('configured all backend app contributions');
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
use(...handlers: express.Handler[]): void {
|
|
245
|
+
this.app.use(...handlers);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async start(port?: number, hostname?: string): Promise<http.Server | https.Server> {
|
|
249
|
+
hostname ??= this.cliParams.hostname;
|
|
250
|
+
port ??= this.cliParams.port;
|
|
251
|
+
|
|
252
|
+
if (this.cliParams.dnsDefaultResultOrder !== 'nodeDefault') {
|
|
253
|
+
dns.setDefaultResultOrder(this.cliParams.dnsDefaultResultOrder);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const deferred = new Deferred<http.Server | https.Server>();
|
|
257
|
+
let server: http.Server | https.Server;
|
|
258
|
+
|
|
259
|
+
if (this.cliParams.ssl) {
|
|
260
|
+
|
|
261
|
+
if (this.cliParams.cert === undefined) {
|
|
262
|
+
throw new Error('Missing --cert option, see --help for usage');
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (this.cliParams.certkey === undefined) {
|
|
266
|
+
throw new Error('Missing --certkey option, see --help for usage');
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
let key: Buffer;
|
|
270
|
+
let cert: Buffer;
|
|
271
|
+
try {
|
|
272
|
+
key = await fs.readFile(this.cliParams.certkey as string);
|
|
273
|
+
} catch (err) {
|
|
274
|
+
console.error("Can't read certificate key");
|
|
275
|
+
throw err;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
try {
|
|
279
|
+
cert = await fs.readFile(this.cliParams.cert as string);
|
|
280
|
+
} catch (err) {
|
|
281
|
+
console.error("Can't read certificate");
|
|
282
|
+
throw err;
|
|
283
|
+
}
|
|
284
|
+
server = https.createServer({ key, cert }, this.app);
|
|
285
|
+
} else {
|
|
286
|
+
server = http.createServer(this.app);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
server.on('error', error => {
|
|
290
|
+
deferred.reject(error);
|
|
291
|
+
/* The backend might run in a separate process,
|
|
292
|
+
* so we defer `process.exit` to let time for logging in the parent process */
|
|
293
|
+
setTimeout(process.exit, 0, 1);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
server.listen(port, hostname, () => {
|
|
297
|
+
// address should be defined at this point
|
|
298
|
+
const address = server.address()!;
|
|
299
|
+
const url = typeof address === 'string' ? address : this.getHttpUrl(address, this.cliParams.ssl);
|
|
300
|
+
console.info(`Theia app listening on ${url}.`);
|
|
301
|
+
deferred.resolve(server);
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
/* Allow any number of websocket servers. */
|
|
305
|
+
server.setMaxListeners(0);
|
|
306
|
+
|
|
307
|
+
for (const contribution of this.contributionsProvider.getContributions()) {
|
|
308
|
+
if (contribution.onStart) {
|
|
309
|
+
try {
|
|
310
|
+
await this.measure(contribution.constructor.name + '.onStart',
|
|
311
|
+
() => contribution.onStart!(server)
|
|
312
|
+
);
|
|
313
|
+
} catch (error) {
|
|
314
|
+
console.error('Could not start contribution', error);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return this.stopwatch.startAsync('server', 'Finished starting backend application', () => deferred.promise);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
protected getHttpUrl({ address, port, family }: AddressInfo, ssl?: boolean): string {
|
|
322
|
+
const scheme = ssl ? 'https' : 'http';
|
|
323
|
+
return family.toLowerCase() === 'ipv6'
|
|
324
|
+
? `${scheme}://[${address}]:${port}`
|
|
325
|
+
: `${scheme}://${address}:${port}`;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
protected onStop(): void {
|
|
329
|
+
console.info('>>> Stopping backend contributions...');
|
|
330
|
+
for (const contrib of this.contributionsProvider.getContributions()) {
|
|
331
|
+
if (contrib.onStop) {
|
|
332
|
+
try {
|
|
333
|
+
contrib.onStop(this.app);
|
|
334
|
+
} catch (error) {
|
|
335
|
+
console.error('Could not stop contribution', error);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
console.info('<<< All backend contributions have been stopped.');
|
|
340
|
+
this.processUtils.terminateProcessTree(process.pid);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
protected async serveGzipped(contentType: string, req: express.Request, res: express.Response, next: express.NextFunction): Promise<void> {
|
|
344
|
+
const acceptedEncodings = req.acceptsEncodings();
|
|
345
|
+
|
|
346
|
+
const gzUrl = `${req.url}.gz`;
|
|
347
|
+
const gzPath = path.join(BackendApplicationPath, 'lib', 'frontend', gzUrl);
|
|
348
|
+
if (acceptedEncodings.indexOf('gzip') === -1 || !(await fs.pathExists(gzPath))) {
|
|
349
|
+
next();
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
req.url = gzUrl;
|
|
354
|
+
|
|
355
|
+
res.set('Content-Encoding', 'gzip');
|
|
356
|
+
res.set('Content-Type', contentType);
|
|
357
|
+
|
|
358
|
+
next();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
protected async measure<T>(name: string, fn: () => MaybePromise<T>): Promise<T> {
|
|
362
|
+
return this.stopwatch.startAsync(name, `Backend ${name}`, fn, { thresholdMillis: TIMER_WARNING_THRESHOLD });
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
protected handleUncaughtError(error: Error): void {
|
|
366
|
+
if (error) {
|
|
367
|
+
console.error('Uncaught Exception: ', error.toString());
|
|
368
|
+
if (error.stack) {
|
|
369
|
+
console.error(error.stack);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
}
|