@theia/core 1.53.0-next.55 → 1.53.0-next.64
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 -6
- package/i18n/nls.cs.json +582 -582
- package/i18n/nls.de.json +582 -582
- package/i18n/nls.es.json +582 -582
- package/i18n/nls.fr.json +582 -582
- package/i18n/nls.hu.json +582 -582
- package/i18n/nls.it.json +582 -582
- package/i18n/nls.ja.json +582 -582
- package/i18n/nls.json +582 -582
- package/i18n/nls.ko.json +582 -582
- package/i18n/nls.pl.json +582 -582
- package/i18n/nls.pt-br.json +582 -582
- package/i18n/nls.ru.json +582 -582
- package/i18n/nls.tr.json +582 -582
- package/i18n/nls.zh-cn.json +582 -582
- package/i18n/nls.zh-tw.json +582 -582
- package/lib/browser/catalog.json +54 -6
- package/lib/browser/common-frontend-contribution.js +3 -3
- package/lib/browser/common-styling-participants.js +166 -166
- package/lib/browser/progress-location-service.spec.js +7 -7
- package/lib/browser/storage-service.js +3 -3
- package/lib/browser/tree/tree.spec.js +75 -75
- package/lib/node/process-utils.spec.js +8 -8
- package/package.json +4 -4
- 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 -467
- 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 -343
- 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 -474
- 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 -118
- 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 -140
- package/src/browser/opener-service.spec.ts +49 -49
- package/src/browser/opener-service.ts +169 -169
- 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 -332
- package/src/browser/saveable.ts +395 -395
- 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 -242
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +149 -149
- 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 -443
- 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 -353
- 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 -38
- package/src/browser/style/status-bar.css +127 -127
- package/src/browser/style/tabs.css +647 -647
- 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 -187
- 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 -168
- 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 -21
- 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 -163
- 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 -493
- 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 -108
- 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 -220
- 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 -42
- 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 -339
- 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 -264
- 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 -48
- 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 -157
- 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 -373
- package/src/electron-main/electron-main-application-module.ts +65 -65
- package/src/electron-main/electron-main-application.ts +860 -860
- 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 -219
- 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 -40
- 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/src/common/event.ts
CHANGED
|
@@ -1,493 +1,493 @@
|
|
|
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
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
18
|
-
|
|
19
|
-
import { Disposable, DisposableGroup, DisposableCollection } from './disposable';
|
|
20
|
-
import { MaybePromise } from './types';
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Represents a typed event.
|
|
24
|
-
*/
|
|
25
|
-
export interface Event<T> {
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
* @param listener The listener function will be call when the event happens.
|
|
30
|
-
* @param thisArgs The 'this' which will be used when calling the event listener.
|
|
31
|
-
* @param disposables An array to which a {{IDisposable}} will be added.
|
|
32
|
-
* @return a disposable to remove the listener again.
|
|
33
|
-
*/
|
|
34
|
-
(listener: (e: T) => any, thisArgs?: any, disposables?: DisposableGroup): Disposable;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export namespace Event {
|
|
38
|
-
const _disposable = { dispose(): void { } };
|
|
39
|
-
export function getMaxListeners(event: Event<unknown>): number {
|
|
40
|
-
const { maxListeners } = event as any;
|
|
41
|
-
return typeof maxListeners === 'number' ? maxListeners : 0;
|
|
42
|
-
}
|
|
43
|
-
export function setMaxListeners<N extends number>(event: Event<unknown>, maxListeners: N): N {
|
|
44
|
-
if (typeof (event as any).maxListeners === 'number') {
|
|
45
|
-
return (event as any).maxListeners = maxListeners;
|
|
46
|
-
}
|
|
47
|
-
return maxListeners;
|
|
48
|
-
}
|
|
49
|
-
export function addMaxListeners(event: Event<unknown>, add: number): number {
|
|
50
|
-
if (typeof (event as any).maxListeners === 'number') {
|
|
51
|
-
return (event as any).maxListeners += add;
|
|
52
|
-
}
|
|
53
|
-
return add;
|
|
54
|
-
}
|
|
55
|
-
export const None: Event<any> = Object.assign(function (): { dispose(): void } { return _disposable; }, {
|
|
56
|
-
get maxListeners(): number { return 0; },
|
|
57
|
-
set maxListeners(maxListeners: number) { }
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Given an event, returns another event which only fires once.
|
|
62
|
-
*/
|
|
63
|
-
export function once<T>(event: Event<T>): Event<T> {
|
|
64
|
-
return (listener, thisArgs = undefined, disposables?) => {
|
|
65
|
-
// we need this, in case the event fires during the listener call
|
|
66
|
-
let didFire = false;
|
|
67
|
-
let result: Disposable | undefined = undefined;
|
|
68
|
-
result = event(e => {
|
|
69
|
-
if (didFire) {
|
|
70
|
-
return;
|
|
71
|
-
} else if (result) {
|
|
72
|
-
result.dispose();
|
|
73
|
-
} else {
|
|
74
|
-
didFire = true;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return listener.call(thisArgs, e);
|
|
78
|
-
}, undefined, disposables);
|
|
79
|
-
|
|
80
|
-
if (didFire) {
|
|
81
|
-
result.dispose();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return result;
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function toPromise<T>(event: Event<T>): Promise<T> {
|
|
89
|
-
return new Promise(resolve => once(event)(resolve));
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export function filter<T>(event: Event<T>, predicate: (e: T) => unknown): Event<T>;
|
|
93
|
-
export function filter<T, S extends T>(event: Event<T>, predicate: (e: T) => e is S): Event<S>;
|
|
94
|
-
export function filter<T>(event: Event<T>, predicate: (e: T) => unknown): Event<T> {
|
|
95
|
-
return (listener, thisArg, disposables) => event(e => predicate(e) && listener.call(thisArg, e), undefined, disposables);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Given an event and a `map` function, returns another event which maps each element
|
|
100
|
-
* through the mapping function.
|
|
101
|
-
*/
|
|
102
|
-
export function map<I, O>(event: Event<I>, mapFunc: (i: I) => O): Event<O> {
|
|
103
|
-
return Object.assign((listener: (e: O) => any, thisArgs?: any, disposables?: Disposable[]) => event(i => listener.call(thisArgs, mapFunc(i)), undefined, disposables), {
|
|
104
|
-
get maxListeners(): number { return 0; },
|
|
105
|
-
set maxListeners(maxListeners: number) { }
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Given a collection of events, returns a single event which emits whenever any of the provided events emit.
|
|
111
|
-
*/
|
|
112
|
-
export function any<T>(...events: Event<T>[]): Event<T>;
|
|
113
|
-
export function any(...events: Event<any>[]): Event<void>;
|
|
114
|
-
export function any<T>(...events: Event<T>[]): Event<T> {
|
|
115
|
-
return (listener, thisArgs = undefined, disposables?: Disposable[]) =>
|
|
116
|
-
new DisposableCollection(...events.map(event => event(e => listener.call(thisArgs, e), undefined, disposables)));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
type Callback = (...args: any[]) => any;
|
|
121
|
-
class CallbackList implements Iterable<Callback> {
|
|
122
|
-
|
|
123
|
-
private _callbacks: Function[] | undefined;
|
|
124
|
-
private _contexts: any[] | undefined;
|
|
125
|
-
|
|
126
|
-
get length(): number {
|
|
127
|
-
return this._callbacks && this._callbacks.length || 0;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
public add(callback: Function, context: any = undefined, bucket?: Disposable[]): void {
|
|
131
|
-
if (!this._callbacks) {
|
|
132
|
-
this._callbacks = [];
|
|
133
|
-
this._contexts = [];
|
|
134
|
-
}
|
|
135
|
-
this._callbacks.push(callback);
|
|
136
|
-
this._contexts!.push(context);
|
|
137
|
-
|
|
138
|
-
if (Array.isArray(bucket)) {
|
|
139
|
-
bucket.push({ dispose: () => this.remove(callback, context) });
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
public remove(callback: Function, context: any = undefined): void {
|
|
144
|
-
if (!this._callbacks) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
let foundCallbackWithDifferentContext = false;
|
|
149
|
-
for (let i = 0; i < this._callbacks.length; i++) {
|
|
150
|
-
if (this._callbacks[i] === callback) {
|
|
151
|
-
if (this._contexts![i] === context) {
|
|
152
|
-
// callback & context match => remove it
|
|
153
|
-
this._callbacks.splice(i, 1);
|
|
154
|
-
this._contexts!.splice(i, 1);
|
|
155
|
-
return;
|
|
156
|
-
} else {
|
|
157
|
-
foundCallbackWithDifferentContext = true;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (foundCallbackWithDifferentContext) {
|
|
163
|
-
throw new Error('When adding a listener with a context, you should remove it with the same context');
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// tslint:disable-next-line:typedef
|
|
168
|
-
public [Symbol.iterator]() {
|
|
169
|
-
if (!this._callbacks) {
|
|
170
|
-
return [][Symbol.iterator]();
|
|
171
|
-
}
|
|
172
|
-
const callbacks = this._callbacks.slice(0);
|
|
173
|
-
const contexts = this._contexts!.slice(0);
|
|
174
|
-
|
|
175
|
-
return callbacks.map((callback, i) =>
|
|
176
|
-
(...args: any[]) => callback.apply(contexts[i], args)
|
|
177
|
-
)[Symbol.iterator]();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
public invoke(...args: any[]): any[] {
|
|
181
|
-
const ret: any[] = [];
|
|
182
|
-
for (const callback of this) {
|
|
183
|
-
try {
|
|
184
|
-
ret.push(callback(...args));
|
|
185
|
-
} catch (e) {
|
|
186
|
-
console.error(e);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
return ret;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
public isEmpty(): boolean {
|
|
193
|
-
return !this._callbacks || this._callbacks.length === 0;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
public dispose(): void {
|
|
197
|
-
this._callbacks = undefined;
|
|
198
|
-
this._contexts = undefined;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export interface EmitterOptions {
|
|
203
|
-
onFirstListenerAdd?: Function;
|
|
204
|
-
onLastListenerRemove?: Function;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export class Emitter<T = any> {
|
|
208
|
-
|
|
209
|
-
private static LEAK_WARNING_THRESHHOLD = 175;
|
|
210
|
-
|
|
211
|
-
private static _noop = function (): void { };
|
|
212
|
-
|
|
213
|
-
private _event: Event<T>;
|
|
214
|
-
protected _callbacks: CallbackList | undefined;
|
|
215
|
-
private _disposed = false;
|
|
216
|
-
|
|
217
|
-
private _leakingStacks: Map<string, number> | undefined;
|
|
218
|
-
private _leakWarnCountdown = 0;
|
|
219
|
-
|
|
220
|
-
constructor(
|
|
221
|
-
private _options?: EmitterOptions
|
|
222
|
-
) { }
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* For the public to allow to subscribe
|
|
226
|
-
* to events from this Emitter
|
|
227
|
-
*/
|
|
228
|
-
get event(): Event<T> {
|
|
229
|
-
if (!this._event) {
|
|
230
|
-
this._event = Object.assign((listener: (e: T) => any, thisArgs?: any, disposables?: DisposableGroup) => {
|
|
231
|
-
if (!this._callbacks) {
|
|
232
|
-
this._callbacks = new CallbackList();
|
|
233
|
-
}
|
|
234
|
-
if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
|
|
235
|
-
this._options.onFirstListenerAdd(this);
|
|
236
|
-
}
|
|
237
|
-
this._callbacks.add(listener, thisArgs);
|
|
238
|
-
const removeMaxListenersCheck = this.checkMaxListeners(Event.getMaxListeners(this._event));
|
|
239
|
-
|
|
240
|
-
const result: Disposable = {
|
|
241
|
-
dispose: () => {
|
|
242
|
-
if (removeMaxListenersCheck) {
|
|
243
|
-
removeMaxListenersCheck();
|
|
244
|
-
}
|
|
245
|
-
result.dispose = Emitter._noop;
|
|
246
|
-
if (!this._disposed) {
|
|
247
|
-
this._callbacks!.remove(listener, thisArgs);
|
|
248
|
-
result.dispose = Emitter._noop;
|
|
249
|
-
if (this._options && this._options.onLastListenerRemove && this._callbacks!.isEmpty()) {
|
|
250
|
-
this._options.onLastListenerRemove(this);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
};
|
|
255
|
-
if (DisposableGroup.canPush(disposables)) {
|
|
256
|
-
disposables.push(result);
|
|
257
|
-
} else if (DisposableGroup.canAdd(disposables)) {
|
|
258
|
-
disposables.add(result);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
return result;
|
|
262
|
-
}, {
|
|
263
|
-
maxListeners: Emitter.LEAK_WARNING_THRESHHOLD
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
return this._event;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
protected checkMaxListeners(maxListeners: number): (() => void) | undefined {
|
|
270
|
-
if (maxListeners === 0 || !this._callbacks) {
|
|
271
|
-
return undefined;
|
|
272
|
-
}
|
|
273
|
-
const listenerCount = this._callbacks.length;
|
|
274
|
-
if (listenerCount <= maxListeners) {
|
|
275
|
-
return undefined;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
const popStack = this.pushLeakingStack();
|
|
279
|
-
|
|
280
|
-
this._leakWarnCountdown -= 1;
|
|
281
|
-
if (this._leakWarnCountdown <= 0) {
|
|
282
|
-
// only warn on first exceed and then every time the limit
|
|
283
|
-
// is exceeded by 50% again
|
|
284
|
-
this._leakWarnCountdown = maxListeners * 0.5;
|
|
285
|
-
|
|
286
|
-
let topStack: string;
|
|
287
|
-
let topCount = 0;
|
|
288
|
-
this._leakingStacks!.forEach((stackCount, stack) => {
|
|
289
|
-
if (!topStack || topCount < stackCount) {
|
|
290
|
-
topStack = stack;
|
|
291
|
-
topCount = stackCount;
|
|
292
|
-
}
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
// eslint-disable-next-line max-len
|
|
296
|
-
console.warn(`Possible Emitter memory leak detected. ${listenerCount} listeners added. Use event.maxListeners to increase the limit (${maxListeners}). MOST frequent listener (${topCount}):`);
|
|
297
|
-
console.warn(topStack!);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
return popStack;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
protected pushLeakingStack(): () => void {
|
|
304
|
-
if (!this._leakingStacks) {
|
|
305
|
-
this._leakingStacks = new Map();
|
|
306
|
-
}
|
|
307
|
-
const stack = new Error().stack!.split('\n').slice(3).join('\n');
|
|
308
|
-
const count = (this._leakingStacks.get(stack) || 0);
|
|
309
|
-
this._leakingStacks.set(stack, count + 1);
|
|
310
|
-
return () => this.popLeakingStack(stack);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
protected popLeakingStack(stack: string): void {
|
|
314
|
-
if (!this._leakingStacks) {
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
const count = (this._leakingStacks.get(stack) || 0);
|
|
318
|
-
this._leakingStacks.set(stack, count - 1);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* To be kept private to fire an event to
|
|
323
|
-
* subscribers
|
|
324
|
-
*/
|
|
325
|
-
fire(event: T): any {
|
|
326
|
-
if (this._callbacks) {
|
|
327
|
-
return this._callbacks.invoke(event);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Process each listener one by one.
|
|
333
|
-
* Return `false` to stop iterating over the listeners, `true` to continue.
|
|
334
|
-
*/
|
|
335
|
-
async sequence(processor: (listener: (e: T) => any) => MaybePromise<boolean>): Promise<void> {
|
|
336
|
-
if (this._callbacks) {
|
|
337
|
-
for (const listener of this._callbacks) {
|
|
338
|
-
if (!await processor(listener)) {
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
dispose(): void {
|
|
346
|
-
if (this._leakingStacks) {
|
|
347
|
-
this._leakingStacks.clear();
|
|
348
|
-
this._leakingStacks = undefined;
|
|
349
|
-
}
|
|
350
|
-
if (this._callbacks) {
|
|
351
|
-
this._callbacks.dispose();
|
|
352
|
-
this._callbacks = undefined;
|
|
353
|
-
}
|
|
354
|
-
this._disposed = true;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
export type WaitUntilData<T> = Omit<T, 'waitUntil' | 'token'>;
|
|
359
|
-
|
|
360
|
-
export interface WaitUntilEvent {
|
|
361
|
-
/**
|
|
362
|
-
* A cancellation token.
|
|
363
|
-
*/
|
|
364
|
-
token: CancellationToken;
|
|
365
|
-
/**
|
|
366
|
-
* Allows to pause the event loop until the provided thenable resolved.
|
|
367
|
-
*
|
|
368
|
-
* *Note:* It can only be called during event dispatch and not in an asynchronous manner
|
|
369
|
-
*
|
|
370
|
-
* @param thenable A thenable that delays execution.
|
|
371
|
-
*/
|
|
372
|
-
waitUntil(thenable: Promise<any>): void;
|
|
373
|
-
}
|
|
374
|
-
export namespace WaitUntilEvent {
|
|
375
|
-
/**
|
|
376
|
-
* Fire all listeners in the same tick.
|
|
377
|
-
*
|
|
378
|
-
* Use `AsyncEmitter.fire` to fire listeners async one after another.
|
|
379
|
-
*/
|
|
380
|
-
export async function fire<T extends WaitUntilEvent>(
|
|
381
|
-
emitter: Emitter<T>,
|
|
382
|
-
event: WaitUntilData<T>,
|
|
383
|
-
timeout?: number,
|
|
384
|
-
token = CancellationToken.None
|
|
385
|
-
): Promise<void> {
|
|
386
|
-
const waitables: Promise<void>[] = [];
|
|
387
|
-
const asyncEvent = Object.assign(event, {
|
|
388
|
-
token,
|
|
389
|
-
waitUntil: (thenable: Promise<any>) => {
|
|
390
|
-
if (Object.isFrozen(waitables)) {
|
|
391
|
-
throw new Error('waitUntil cannot be called asynchronously.');
|
|
392
|
-
}
|
|
393
|
-
waitables.push(thenable);
|
|
394
|
-
}
|
|
395
|
-
}) as T;
|
|
396
|
-
try {
|
|
397
|
-
emitter.fire(asyncEvent);
|
|
398
|
-
// Asynchronous calls to `waitUntil` should fail.
|
|
399
|
-
Object.freeze(waitables);
|
|
400
|
-
} finally {
|
|
401
|
-
delete (asyncEvent as any)['waitUntil'];
|
|
402
|
-
}
|
|
403
|
-
if (!waitables.length) {
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
if (timeout !== undefined) {
|
|
407
|
-
await Promise.race([Promise.all(waitables), new Promise(resolve => setTimeout(resolve, timeout))]);
|
|
408
|
-
} else {
|
|
409
|
-
await Promise.all(waitables);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
import { CancellationToken } from './cancellation';
|
|
415
|
-
|
|
416
|
-
export class AsyncEmitter<T extends WaitUntilEvent> extends Emitter<T> {
|
|
417
|
-
|
|
418
|
-
protected deliveryQueue: Promise<void> | undefined;
|
|
419
|
-
|
|
420
|
-
/**
|
|
421
|
-
* Fire listeners async one after another.
|
|
422
|
-
*/
|
|
423
|
-
override fire(event: WaitUntilData<T>, token: CancellationToken = CancellationToken.None,
|
|
424
|
-
promiseJoin?: (p: Promise<any>, listener: Function) => Promise<any>): Promise<void> {
|
|
425
|
-
const callbacks = this._callbacks;
|
|
426
|
-
if (!callbacks) {
|
|
427
|
-
return Promise.resolve();
|
|
428
|
-
}
|
|
429
|
-
const listeners = [...callbacks];
|
|
430
|
-
if (this.deliveryQueue) {
|
|
431
|
-
return this.deliveryQueue = this.deliveryQueue.then(() => this.deliver(listeners, event, token, promiseJoin));
|
|
432
|
-
}
|
|
433
|
-
return this.deliveryQueue = this.deliver(listeners, event, token, promiseJoin);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
protected async deliver(listeners: Callback[], event: WaitUntilData<T>, token: CancellationToken,
|
|
437
|
-
promiseJoin?: (p: Promise<any>, listener: Function) => Promise<any>): Promise<void> {
|
|
438
|
-
for (const listener of listeners) {
|
|
439
|
-
if (token.isCancellationRequested) {
|
|
440
|
-
return;
|
|
441
|
-
}
|
|
442
|
-
const waitables: Promise<void>[] = [];
|
|
443
|
-
const asyncEvent = Object.assign(event, {
|
|
444
|
-
token,
|
|
445
|
-
waitUntil: (thenable: Promise<any>) => {
|
|
446
|
-
if (Object.isFrozen(waitables)) {
|
|
447
|
-
throw new Error('waitUntil cannot be called asynchronously.');
|
|
448
|
-
}
|
|
449
|
-
if (promiseJoin) {
|
|
450
|
-
thenable = promiseJoin(thenable, listener);
|
|
451
|
-
}
|
|
452
|
-
waitables.push(thenable);
|
|
453
|
-
}
|
|
454
|
-
}) as T;
|
|
455
|
-
try {
|
|
456
|
-
listener(event);
|
|
457
|
-
// Asynchronous calls to `waitUntil` should fail.
|
|
458
|
-
Object.freeze(waitables);
|
|
459
|
-
} catch (e) {
|
|
460
|
-
console.error(e);
|
|
461
|
-
} finally {
|
|
462
|
-
delete (asyncEvent as any)['waitUntil'];
|
|
463
|
-
}
|
|
464
|
-
if (!waitables.length) {
|
|
465
|
-
continue;
|
|
466
|
-
}
|
|
467
|
-
try {
|
|
468
|
-
await Promise.all(waitables);
|
|
469
|
-
} catch (e) {
|
|
470
|
-
console.error(e);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
export class QueueableEmitter<T> extends Emitter<T[]> {
|
|
478
|
-
|
|
479
|
-
currentQueue?: T[];
|
|
480
|
-
|
|
481
|
-
queue(...arg: T[]): void {
|
|
482
|
-
if (!this.currentQueue) {
|
|
483
|
-
this.currentQueue = [];
|
|
484
|
-
}
|
|
485
|
-
this.currentQueue.push(...arg);
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
override fire(): void {
|
|
489
|
-
super.fire(this.currentQueue || []);
|
|
490
|
-
this.currentQueue = undefined;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
}
|
|
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
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
18
|
+
|
|
19
|
+
import { Disposable, DisposableGroup, DisposableCollection } from './disposable';
|
|
20
|
+
import { MaybePromise } from './types';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Represents a typed event.
|
|
24
|
+
*/
|
|
25
|
+
export interface Event<T> {
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param listener The listener function will be call when the event happens.
|
|
30
|
+
* @param thisArgs The 'this' which will be used when calling the event listener.
|
|
31
|
+
* @param disposables An array to which a {{IDisposable}} will be added.
|
|
32
|
+
* @return a disposable to remove the listener again.
|
|
33
|
+
*/
|
|
34
|
+
(listener: (e: T) => any, thisArgs?: any, disposables?: DisposableGroup): Disposable;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export namespace Event {
|
|
38
|
+
const _disposable = { dispose(): void { } };
|
|
39
|
+
export function getMaxListeners(event: Event<unknown>): number {
|
|
40
|
+
const { maxListeners } = event as any;
|
|
41
|
+
return typeof maxListeners === 'number' ? maxListeners : 0;
|
|
42
|
+
}
|
|
43
|
+
export function setMaxListeners<N extends number>(event: Event<unknown>, maxListeners: N): N {
|
|
44
|
+
if (typeof (event as any).maxListeners === 'number') {
|
|
45
|
+
return (event as any).maxListeners = maxListeners;
|
|
46
|
+
}
|
|
47
|
+
return maxListeners;
|
|
48
|
+
}
|
|
49
|
+
export function addMaxListeners(event: Event<unknown>, add: number): number {
|
|
50
|
+
if (typeof (event as any).maxListeners === 'number') {
|
|
51
|
+
return (event as any).maxListeners += add;
|
|
52
|
+
}
|
|
53
|
+
return add;
|
|
54
|
+
}
|
|
55
|
+
export const None: Event<any> = Object.assign(function (): { dispose(): void } { return _disposable; }, {
|
|
56
|
+
get maxListeners(): number { return 0; },
|
|
57
|
+
set maxListeners(maxListeners: number) { }
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Given an event, returns another event which only fires once.
|
|
62
|
+
*/
|
|
63
|
+
export function once<T>(event: Event<T>): Event<T> {
|
|
64
|
+
return (listener, thisArgs = undefined, disposables?) => {
|
|
65
|
+
// we need this, in case the event fires during the listener call
|
|
66
|
+
let didFire = false;
|
|
67
|
+
let result: Disposable | undefined = undefined;
|
|
68
|
+
result = event(e => {
|
|
69
|
+
if (didFire) {
|
|
70
|
+
return;
|
|
71
|
+
} else if (result) {
|
|
72
|
+
result.dispose();
|
|
73
|
+
} else {
|
|
74
|
+
didFire = true;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return listener.call(thisArgs, e);
|
|
78
|
+
}, undefined, disposables);
|
|
79
|
+
|
|
80
|
+
if (didFire) {
|
|
81
|
+
result.dispose();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return result;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function toPromise<T>(event: Event<T>): Promise<T> {
|
|
89
|
+
return new Promise(resolve => once(event)(resolve));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function filter<T>(event: Event<T>, predicate: (e: T) => unknown): Event<T>;
|
|
93
|
+
export function filter<T, S extends T>(event: Event<T>, predicate: (e: T) => e is S): Event<S>;
|
|
94
|
+
export function filter<T>(event: Event<T>, predicate: (e: T) => unknown): Event<T> {
|
|
95
|
+
return (listener, thisArg, disposables) => event(e => predicate(e) && listener.call(thisArg, e), undefined, disposables);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Given an event and a `map` function, returns another event which maps each element
|
|
100
|
+
* through the mapping function.
|
|
101
|
+
*/
|
|
102
|
+
export function map<I, O>(event: Event<I>, mapFunc: (i: I) => O): Event<O> {
|
|
103
|
+
return Object.assign((listener: (e: O) => any, thisArgs?: any, disposables?: Disposable[]) => event(i => listener.call(thisArgs, mapFunc(i)), undefined, disposables), {
|
|
104
|
+
get maxListeners(): number { return 0; },
|
|
105
|
+
set maxListeners(maxListeners: number) { }
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Given a collection of events, returns a single event which emits whenever any of the provided events emit.
|
|
111
|
+
*/
|
|
112
|
+
export function any<T>(...events: Event<T>[]): Event<T>;
|
|
113
|
+
export function any(...events: Event<any>[]): Event<void>;
|
|
114
|
+
export function any<T>(...events: Event<T>[]): Event<T> {
|
|
115
|
+
return (listener, thisArgs = undefined, disposables?: Disposable[]) =>
|
|
116
|
+
new DisposableCollection(...events.map(event => event(e => listener.call(thisArgs, e), undefined, disposables)));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
type Callback = (...args: any[]) => any;
|
|
121
|
+
class CallbackList implements Iterable<Callback> {
|
|
122
|
+
|
|
123
|
+
private _callbacks: Function[] | undefined;
|
|
124
|
+
private _contexts: any[] | undefined;
|
|
125
|
+
|
|
126
|
+
get length(): number {
|
|
127
|
+
return this._callbacks && this._callbacks.length || 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public add(callback: Function, context: any = undefined, bucket?: Disposable[]): void {
|
|
131
|
+
if (!this._callbacks) {
|
|
132
|
+
this._callbacks = [];
|
|
133
|
+
this._contexts = [];
|
|
134
|
+
}
|
|
135
|
+
this._callbacks.push(callback);
|
|
136
|
+
this._contexts!.push(context);
|
|
137
|
+
|
|
138
|
+
if (Array.isArray(bucket)) {
|
|
139
|
+
bucket.push({ dispose: () => this.remove(callback, context) });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public remove(callback: Function, context: any = undefined): void {
|
|
144
|
+
if (!this._callbacks) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
let foundCallbackWithDifferentContext = false;
|
|
149
|
+
for (let i = 0; i < this._callbacks.length; i++) {
|
|
150
|
+
if (this._callbacks[i] === callback) {
|
|
151
|
+
if (this._contexts![i] === context) {
|
|
152
|
+
// callback & context match => remove it
|
|
153
|
+
this._callbacks.splice(i, 1);
|
|
154
|
+
this._contexts!.splice(i, 1);
|
|
155
|
+
return;
|
|
156
|
+
} else {
|
|
157
|
+
foundCallbackWithDifferentContext = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (foundCallbackWithDifferentContext) {
|
|
163
|
+
throw new Error('When adding a listener with a context, you should remove it with the same context');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// tslint:disable-next-line:typedef
|
|
168
|
+
public [Symbol.iterator]() {
|
|
169
|
+
if (!this._callbacks) {
|
|
170
|
+
return [][Symbol.iterator]();
|
|
171
|
+
}
|
|
172
|
+
const callbacks = this._callbacks.slice(0);
|
|
173
|
+
const contexts = this._contexts!.slice(0);
|
|
174
|
+
|
|
175
|
+
return callbacks.map((callback, i) =>
|
|
176
|
+
(...args: any[]) => callback.apply(contexts[i], args)
|
|
177
|
+
)[Symbol.iterator]();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public invoke(...args: any[]): any[] {
|
|
181
|
+
const ret: any[] = [];
|
|
182
|
+
for (const callback of this) {
|
|
183
|
+
try {
|
|
184
|
+
ret.push(callback(...args));
|
|
185
|
+
} catch (e) {
|
|
186
|
+
console.error(e);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return ret;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public isEmpty(): boolean {
|
|
193
|
+
return !this._callbacks || this._callbacks.length === 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public dispose(): void {
|
|
197
|
+
this._callbacks = undefined;
|
|
198
|
+
this._contexts = undefined;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export interface EmitterOptions {
|
|
203
|
+
onFirstListenerAdd?: Function;
|
|
204
|
+
onLastListenerRemove?: Function;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export class Emitter<T = any> {
|
|
208
|
+
|
|
209
|
+
private static LEAK_WARNING_THRESHHOLD = 175;
|
|
210
|
+
|
|
211
|
+
private static _noop = function (): void { };
|
|
212
|
+
|
|
213
|
+
private _event: Event<T>;
|
|
214
|
+
protected _callbacks: CallbackList | undefined;
|
|
215
|
+
private _disposed = false;
|
|
216
|
+
|
|
217
|
+
private _leakingStacks: Map<string, number> | undefined;
|
|
218
|
+
private _leakWarnCountdown = 0;
|
|
219
|
+
|
|
220
|
+
constructor(
|
|
221
|
+
private _options?: EmitterOptions
|
|
222
|
+
) { }
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* For the public to allow to subscribe
|
|
226
|
+
* to events from this Emitter
|
|
227
|
+
*/
|
|
228
|
+
get event(): Event<T> {
|
|
229
|
+
if (!this._event) {
|
|
230
|
+
this._event = Object.assign((listener: (e: T) => any, thisArgs?: any, disposables?: DisposableGroup) => {
|
|
231
|
+
if (!this._callbacks) {
|
|
232
|
+
this._callbacks = new CallbackList();
|
|
233
|
+
}
|
|
234
|
+
if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
|
|
235
|
+
this._options.onFirstListenerAdd(this);
|
|
236
|
+
}
|
|
237
|
+
this._callbacks.add(listener, thisArgs);
|
|
238
|
+
const removeMaxListenersCheck = this.checkMaxListeners(Event.getMaxListeners(this._event));
|
|
239
|
+
|
|
240
|
+
const result: Disposable = {
|
|
241
|
+
dispose: () => {
|
|
242
|
+
if (removeMaxListenersCheck) {
|
|
243
|
+
removeMaxListenersCheck();
|
|
244
|
+
}
|
|
245
|
+
result.dispose = Emitter._noop;
|
|
246
|
+
if (!this._disposed) {
|
|
247
|
+
this._callbacks!.remove(listener, thisArgs);
|
|
248
|
+
result.dispose = Emitter._noop;
|
|
249
|
+
if (this._options && this._options.onLastListenerRemove && this._callbacks!.isEmpty()) {
|
|
250
|
+
this._options.onLastListenerRemove(this);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
if (DisposableGroup.canPush(disposables)) {
|
|
256
|
+
disposables.push(result);
|
|
257
|
+
} else if (DisposableGroup.canAdd(disposables)) {
|
|
258
|
+
disposables.add(result);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return result;
|
|
262
|
+
}, {
|
|
263
|
+
maxListeners: Emitter.LEAK_WARNING_THRESHHOLD
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return this._event;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
protected checkMaxListeners(maxListeners: number): (() => void) | undefined {
|
|
270
|
+
if (maxListeners === 0 || !this._callbacks) {
|
|
271
|
+
return undefined;
|
|
272
|
+
}
|
|
273
|
+
const listenerCount = this._callbacks.length;
|
|
274
|
+
if (listenerCount <= maxListeners) {
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const popStack = this.pushLeakingStack();
|
|
279
|
+
|
|
280
|
+
this._leakWarnCountdown -= 1;
|
|
281
|
+
if (this._leakWarnCountdown <= 0) {
|
|
282
|
+
// only warn on first exceed and then every time the limit
|
|
283
|
+
// is exceeded by 50% again
|
|
284
|
+
this._leakWarnCountdown = maxListeners * 0.5;
|
|
285
|
+
|
|
286
|
+
let topStack: string;
|
|
287
|
+
let topCount = 0;
|
|
288
|
+
this._leakingStacks!.forEach((stackCount, stack) => {
|
|
289
|
+
if (!topStack || topCount < stackCount) {
|
|
290
|
+
topStack = stack;
|
|
291
|
+
topCount = stackCount;
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
// eslint-disable-next-line max-len
|
|
296
|
+
console.warn(`Possible Emitter memory leak detected. ${listenerCount} listeners added. Use event.maxListeners to increase the limit (${maxListeners}). MOST frequent listener (${topCount}):`);
|
|
297
|
+
console.warn(topStack!);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return popStack;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
protected pushLeakingStack(): () => void {
|
|
304
|
+
if (!this._leakingStacks) {
|
|
305
|
+
this._leakingStacks = new Map();
|
|
306
|
+
}
|
|
307
|
+
const stack = new Error().stack!.split('\n').slice(3).join('\n');
|
|
308
|
+
const count = (this._leakingStacks.get(stack) || 0);
|
|
309
|
+
this._leakingStacks.set(stack, count + 1);
|
|
310
|
+
return () => this.popLeakingStack(stack);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
protected popLeakingStack(stack: string): void {
|
|
314
|
+
if (!this._leakingStacks) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const count = (this._leakingStacks.get(stack) || 0);
|
|
318
|
+
this._leakingStacks.set(stack, count - 1);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* To be kept private to fire an event to
|
|
323
|
+
* subscribers
|
|
324
|
+
*/
|
|
325
|
+
fire(event: T): any {
|
|
326
|
+
if (this._callbacks) {
|
|
327
|
+
return this._callbacks.invoke(event);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Process each listener one by one.
|
|
333
|
+
* Return `false` to stop iterating over the listeners, `true` to continue.
|
|
334
|
+
*/
|
|
335
|
+
async sequence(processor: (listener: (e: T) => any) => MaybePromise<boolean>): Promise<void> {
|
|
336
|
+
if (this._callbacks) {
|
|
337
|
+
for (const listener of this._callbacks) {
|
|
338
|
+
if (!await processor(listener)) {
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
dispose(): void {
|
|
346
|
+
if (this._leakingStacks) {
|
|
347
|
+
this._leakingStacks.clear();
|
|
348
|
+
this._leakingStacks = undefined;
|
|
349
|
+
}
|
|
350
|
+
if (this._callbacks) {
|
|
351
|
+
this._callbacks.dispose();
|
|
352
|
+
this._callbacks = undefined;
|
|
353
|
+
}
|
|
354
|
+
this._disposed = true;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export type WaitUntilData<T> = Omit<T, 'waitUntil' | 'token'>;
|
|
359
|
+
|
|
360
|
+
export interface WaitUntilEvent {
|
|
361
|
+
/**
|
|
362
|
+
* A cancellation token.
|
|
363
|
+
*/
|
|
364
|
+
token: CancellationToken;
|
|
365
|
+
/**
|
|
366
|
+
* Allows to pause the event loop until the provided thenable resolved.
|
|
367
|
+
*
|
|
368
|
+
* *Note:* It can only be called during event dispatch and not in an asynchronous manner
|
|
369
|
+
*
|
|
370
|
+
* @param thenable A thenable that delays execution.
|
|
371
|
+
*/
|
|
372
|
+
waitUntil(thenable: Promise<any>): void;
|
|
373
|
+
}
|
|
374
|
+
export namespace WaitUntilEvent {
|
|
375
|
+
/**
|
|
376
|
+
* Fire all listeners in the same tick.
|
|
377
|
+
*
|
|
378
|
+
* Use `AsyncEmitter.fire` to fire listeners async one after another.
|
|
379
|
+
*/
|
|
380
|
+
export async function fire<T extends WaitUntilEvent>(
|
|
381
|
+
emitter: Emitter<T>,
|
|
382
|
+
event: WaitUntilData<T>,
|
|
383
|
+
timeout?: number,
|
|
384
|
+
token = CancellationToken.None
|
|
385
|
+
): Promise<void> {
|
|
386
|
+
const waitables: Promise<void>[] = [];
|
|
387
|
+
const asyncEvent = Object.assign(event, {
|
|
388
|
+
token,
|
|
389
|
+
waitUntil: (thenable: Promise<any>) => {
|
|
390
|
+
if (Object.isFrozen(waitables)) {
|
|
391
|
+
throw new Error('waitUntil cannot be called asynchronously.');
|
|
392
|
+
}
|
|
393
|
+
waitables.push(thenable);
|
|
394
|
+
}
|
|
395
|
+
}) as T;
|
|
396
|
+
try {
|
|
397
|
+
emitter.fire(asyncEvent);
|
|
398
|
+
// Asynchronous calls to `waitUntil` should fail.
|
|
399
|
+
Object.freeze(waitables);
|
|
400
|
+
} finally {
|
|
401
|
+
delete (asyncEvent as any)['waitUntil'];
|
|
402
|
+
}
|
|
403
|
+
if (!waitables.length) {
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (timeout !== undefined) {
|
|
407
|
+
await Promise.race([Promise.all(waitables), new Promise(resolve => setTimeout(resolve, timeout))]);
|
|
408
|
+
} else {
|
|
409
|
+
await Promise.all(waitables);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
import { CancellationToken } from './cancellation';
|
|
415
|
+
|
|
416
|
+
export class AsyncEmitter<T extends WaitUntilEvent> extends Emitter<T> {
|
|
417
|
+
|
|
418
|
+
protected deliveryQueue: Promise<void> | undefined;
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Fire listeners async one after another.
|
|
422
|
+
*/
|
|
423
|
+
override fire(event: WaitUntilData<T>, token: CancellationToken = CancellationToken.None,
|
|
424
|
+
promiseJoin?: (p: Promise<any>, listener: Function) => Promise<any>): Promise<void> {
|
|
425
|
+
const callbacks = this._callbacks;
|
|
426
|
+
if (!callbacks) {
|
|
427
|
+
return Promise.resolve();
|
|
428
|
+
}
|
|
429
|
+
const listeners = [...callbacks];
|
|
430
|
+
if (this.deliveryQueue) {
|
|
431
|
+
return this.deliveryQueue = this.deliveryQueue.then(() => this.deliver(listeners, event, token, promiseJoin));
|
|
432
|
+
}
|
|
433
|
+
return this.deliveryQueue = this.deliver(listeners, event, token, promiseJoin);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
protected async deliver(listeners: Callback[], event: WaitUntilData<T>, token: CancellationToken,
|
|
437
|
+
promiseJoin?: (p: Promise<any>, listener: Function) => Promise<any>): Promise<void> {
|
|
438
|
+
for (const listener of listeners) {
|
|
439
|
+
if (token.isCancellationRequested) {
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
const waitables: Promise<void>[] = [];
|
|
443
|
+
const asyncEvent = Object.assign(event, {
|
|
444
|
+
token,
|
|
445
|
+
waitUntil: (thenable: Promise<any>) => {
|
|
446
|
+
if (Object.isFrozen(waitables)) {
|
|
447
|
+
throw new Error('waitUntil cannot be called asynchronously.');
|
|
448
|
+
}
|
|
449
|
+
if (promiseJoin) {
|
|
450
|
+
thenable = promiseJoin(thenable, listener);
|
|
451
|
+
}
|
|
452
|
+
waitables.push(thenable);
|
|
453
|
+
}
|
|
454
|
+
}) as T;
|
|
455
|
+
try {
|
|
456
|
+
listener(event);
|
|
457
|
+
// Asynchronous calls to `waitUntil` should fail.
|
|
458
|
+
Object.freeze(waitables);
|
|
459
|
+
} catch (e) {
|
|
460
|
+
console.error(e);
|
|
461
|
+
} finally {
|
|
462
|
+
delete (asyncEvent as any)['waitUntil'];
|
|
463
|
+
}
|
|
464
|
+
if (!waitables.length) {
|
|
465
|
+
continue;
|
|
466
|
+
}
|
|
467
|
+
try {
|
|
468
|
+
await Promise.all(waitables);
|
|
469
|
+
} catch (e) {
|
|
470
|
+
console.error(e);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export class QueueableEmitter<T> extends Emitter<T[]> {
|
|
478
|
+
|
|
479
|
+
currentQueue?: T[];
|
|
480
|
+
|
|
481
|
+
queue(...arg: T[]): void {
|
|
482
|
+
if (!this.currentQueue) {
|
|
483
|
+
this.currentQueue = [];
|
|
484
|
+
}
|
|
485
|
+
this.currentQueue.push(...arg);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
override fire(): void {
|
|
489
|
+
super.fire(this.currentQueue || []);
|
|
490
|
+
this.currentQueue = undefined;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
}
|