@theia/core 1.74.0-next.8 → 1.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -10
- package/i18n/nls.cs.json +143 -16
- package/i18n/nls.de.json +143 -16
- package/i18n/nls.es.json +143 -16
- package/i18n/nls.fr.json +143 -16
- package/i18n/nls.hu.json +143 -16
- package/i18n/nls.it.json +143 -16
- package/i18n/nls.ja.json +143 -16
- package/i18n/nls.json +143 -16
- package/i18n/nls.ko.json +143 -16
- package/i18n/nls.pl.json +143 -16
- package/i18n/nls.pt-br.json +143 -16
- package/i18n/nls.ru.json +143 -16
- package/i18n/nls.tr.json +143 -16
- package/i18n/nls.zh-cn.json +143 -16
- package/i18n/nls.zh-tw.json +143 -16
- package/lib/browser/browser-clipboard-service.d.ts +3 -0
- package/lib/browser/browser-clipboard-service.d.ts.map +1 -1
- package/lib/browser/browser-clipboard-service.js +8 -1
- package/lib/browser/browser-clipboard-service.js.map +1 -1
- package/lib/browser/catalog.json +419 -41
- package/lib/browser/clipboard-service.d.ts +11 -0
- package/lib/browser/clipboard-service.d.ts.map +1 -1
- package/lib/browser/clipboard-service.js.map +1 -1
- package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
- package/lib/browser/common-frontend-contribution.js +7 -7
- package/lib/browser/common-frontend-contribution.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js +9 -0
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/frontend-application.d.ts.map +1 -1
- package/lib/browser/frontend-application.js +12 -2
- package/lib/browser/frontend-application.js.map +1 -1
- package/lib/browser/index.d.ts +1 -0
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +1 -0
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/keybinding.d.ts.map +1 -1
- package/lib/browser/keybinding.js +12 -7
- package/lib/browser/keybinding.js.map +1 -1
- package/lib/browser/perspective-service.d.ts +173 -0
- package/lib/browser/perspective-service.d.ts.map +1 -0
- package/lib/browser/perspective-service.js +484 -0
- package/lib/browser/perspective-service.js.map +1 -0
- package/lib/browser/perspective-service.spec.d.ts +2 -0
- package/lib/browser/perspective-service.spec.d.ts.map +1 -0
- package/lib/browser/perspective-service.spec.js +1806 -0
- package/lib/browser/perspective-service.spec.js.map +1 -0
- package/lib/browser/preferences/preference-contribution.d.ts.map +1 -1
- package/lib/browser/preferences/preference-contribution.js +9 -1
- package/lib/browser/preferences/preference-contribution.js.map +1 -1
- package/lib/browser/preferences/preference-service.spec.js +63 -0
- package/lib/browser/preferences/preference-service.spec.js.map +1 -1
- package/lib/browser/shell/application-shell.d.ts +7 -0
- package/lib/browser/shell/application-shell.d.ts.map +1 -1
- package/lib/browser/shell/application-shell.js +38 -28
- package/lib/browser/shell/application-shell.js.map +1 -1
- package/lib/browser/shell/shell-layout-restorer.d.ts +9 -0
- package/lib/browser/shell/shell-layout-restorer.d.ts.map +1 -1
- package/lib/browser/shell/shell-layout-restorer.js +124 -14
- package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
- package/lib/browser/shell/shell-layout-restorer.spec.d.ts +2 -0
- package/lib/browser/shell/shell-layout-restorer.spec.d.ts.map +1 -0
- package/lib/browser/shell/shell-layout-restorer.spec.js +539 -0
- package/lib/browser/shell/shell-layout-restorer.spec.js.map +1 -0
- package/lib/browser/shell/view-contribution.d.ts +2 -0
- package/lib/browser/shell/view-contribution.d.ts.map +1 -1
- package/lib/browser/shell/view-contribution.js +5 -1
- package/lib/browser/shell/view-contribution.js.map +1 -1
- package/lib/browser/status-bar/status-bar.d.ts +2 -0
- package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
- package/lib/browser/status-bar/status-bar.js +11 -3
- package/lib/browser/status-bar/status-bar.js.map +1 -1
- package/lib/browser/tree/tree-widget.d.ts +7 -33
- package/lib/browser/tree/tree-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-widget.js +7 -54
- package/lib/browser/tree/tree-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/select-component.d.ts +2 -2
- package/lib/browser/widgets/select-component.d.ts.map +1 -1
- package/lib/browser/widgets/select-component.js +42 -12
- package/lib/browser/widgets/select-component.js.map +1 -1
- package/lib/browser/widgets/tab-bar-tracker.d.ts +23 -0
- package/lib/browser/widgets/tab-bar-tracker.d.ts.map +1 -0
- package/lib/browser/widgets/tab-bar-tracker.js +65 -0
- package/lib/browser/widgets/tab-bar-tracker.js.map +1 -0
- package/lib/browser/widgets/tab-bar-tracker.spec.d.ts +2 -0
- package/lib/browser/widgets/tab-bar-tracker.spec.d.ts.map +1 -0
- package/lib/browser/widgets/tab-bar-tracker.spec.js +109 -0
- package/lib/browser/widgets/tab-bar-tracker.spec.js.map +1 -0
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.d.ts +13 -2
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.d.ts.map +1 -1
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.js +31 -3
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.js.map +1 -1
- package/lib/common/preferences/index.d.ts +1 -0
- package/lib/common/preferences/index.d.ts.map +1 -1
- package/lib/common/preferences/index.js +1 -0
- package/lib/common/preferences/index.js.map +1 -1
- package/lib/common/preferences/preference-provider.d.ts +15 -0
- package/lib/common/preferences/preference-provider.d.ts.map +1 -1
- package/lib/common/preferences/preference-provider.js +21 -1
- package/lib/common/preferences/preference-provider.js.map +1 -1
- package/lib/common/preferences/preference-provider.spec.js +17 -0
- package/lib/common/preferences/preference-provider.spec.js.map +1 -1
- package/lib/common/preferences/preference-scope.d.ts +6 -1
- package/lib/common/preferences/preference-scope.d.ts.map +1 -1
- package/lib/common/preferences/preference-scope.js +5 -0
- package/lib/common/preferences/preference-scope.js.map +1 -1
- package/lib/common/preferences/preference-scope.spec.js +5 -3
- package/lib/common/preferences/preference-scope.spec.js.map +1 -1
- package/lib/common/preferences/preference-service.d.ts +19 -0
- package/lib/common/preferences/preference-service.d.ts.map +1 -1
- package/lib/common/preferences/preference-service.js +34 -5
- package/lib/common/preferences/preference-service.js.map +1 -1
- package/lib/common/preferences/session-preference-provider.d.ts +17 -0
- package/lib/common/preferences/session-preference-provider.d.ts.map +1 -0
- package/lib/common/preferences/session-preference-provider.js +77 -0
- package/lib/common/preferences/session-preference-provider.js.map +1 -0
- package/lib/common/preferences/session-preference-provider.spec.d.ts +2 -0
- package/lib/common/preferences/session-preference-provider.spec.d.ts.map +1 -0
- package/lib/common/preferences/session-preference-provider.spec.js +71 -0
- package/lib/common/preferences/session-preference-provider.spec.js.map +1 -0
- package/lib/electron-browser/electron-clipboard-service.d.ts +3 -0
- package/lib/electron-browser/electron-clipboard-service.d.ts.map +1 -1
- package/lib/electron-browser/electron-clipboard-service.js +6 -0
- package/lib/electron-browser/electron-clipboard-service.js.map +1 -1
- package/lib/electron-browser/preload.d.ts.map +1 -1
- package/lib/electron-browser/preload.js +2 -1
- package/lib/electron-browser/preload.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.map +1 -1
- package/lib/electron-main/electron-api-main.js +43 -0
- package/lib/electron-main/electron-api-main.js.map +1 -1
- package/lib/electron-main/electron-main-application.d.ts.map +1 -1
- package/lib/electron-main/electron-main-application.js +3 -0
- package/lib/electron-main/electron-main-application.js.map +1 -1
- package/lib/electron-node/hosting/electron-backend-hosting-module.d.ts.map +1 -1
- package/lib/electron-node/hosting/electron-backend-hosting-module.js +7 -0
- package/lib/electron-node/hosting/electron-backend-hosting-module.js.map +1 -1
- package/lib/electron-node/hosting/electron-backend-hosting-module.spec.d.ts +2 -0
- package/lib/electron-node/hosting/electron-backend-hosting-module.spec.d.ts.map +1 -0
- package/lib/electron-node/hosting/electron-backend-hosting-module.spec.js +39 -0
- package/lib/electron-node/hosting/electron-backend-hosting-module.spec.js.map +1 -0
- package/lib/node/hosting/backend-hosting-module.d.ts.map +1 -1
- package/lib/node/hosting/backend-hosting-module.js +4 -1
- package/lib/node/hosting/backend-hosting-module.js.map +1 -1
- package/lib/node/hosting/browser-connection-token.d.ts +29 -1
- package/lib/node/hosting/browser-connection-token.d.ts.map +1 -1
- package/lib/node/hosting/browser-connection-token.js +25 -1
- package/lib/node/hosting/browser-connection-token.js.map +1 -1
- package/lib/node/hosting/browser-connection-token.spec.js +70 -0
- package/lib/node/hosting/browser-connection-token.spec.js.map +1 -1
- package/lib/node/index.d.ts +1 -0
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +3 -1
- package/lib/node/index.js.map +1 -1
- package/package.json +11 -11
- package/src/browser/browser-clipboard-service.ts +7 -1
- package/src/browser/clipboard-service.ts +11 -0
- package/src/browser/common-frontend-contribution.ts +7 -7
- package/src/browser/frontend-application-module.ts +11 -1
- package/src/browser/frontend-application.ts +12 -4
- package/src/browser/index.ts +1 -0
- package/src/browser/keybinding.ts +12 -7
- package/src/browser/perspective-service.spec.ts +2270 -0
- package/src/browser/perspective-service.ts +625 -0
- package/src/browser/preferences/preference-contribution.ts +9 -1
- package/src/browser/preferences/preference-service.spec.ts +72 -0
- package/src/browser/shell/application-shell.ts +41 -26
- package/src/browser/shell/shell-layout-restorer.spec.ts +746 -0
- package/src/browser/shell/shell-layout-restorer.ts +134 -13
- package/src/browser/shell/view-contribution.ts +6 -1
- package/src/browser/status-bar/status-bar.tsx +13 -3
- package/src/browser/style/select-component.css +16 -0
- package/src/browser/style/sidepanel.css +5 -0
- package/src/browser/style/status-bar.css +1 -1
- package/src/browser/tree/tree-widget.tsx +12 -78
- package/src/browser/widgets/index.ts +1 -0
- package/src/browser/widgets/select-component.tsx +41 -12
- package/src/browser/widgets/tab-bar-tracker.spec.ts +121 -0
- package/src/browser/widgets/tab-bar-tracker.ts +68 -0
- package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +32 -3
- package/src/common/i18n/nls.metadata.json +4149 -888
- package/src/common/preferences/index.ts +1 -0
- package/src/common/preferences/preference-provider.spec.ts +17 -0
- package/src/common/preferences/preference-provider.ts +22 -1
- package/src/common/preferences/preference-scope.spec.ts +5 -3
- package/src/common/preferences/preference-scope.ts +6 -1
- package/src/common/preferences/preference-service.ts +39 -5
- package/src/common/preferences/session-preference-provider.spec.ts +78 -0
- package/src/common/preferences/session-preference-provider.ts +69 -0
- package/src/electron-browser/electron-clipboard-service.ts +5 -0
- package/src/electron-browser/menu/electron-menu-style.css +3 -1
- package/src/electron-browser/preload.ts +5 -2
- package/src/electron-common/electron-api.ts +4 -0
- package/src/electron-main/electron-api-main.ts +56 -3
- package/src/electron-main/electron-main-application.ts +3 -0
- package/src/electron-node/hosting/electron-backend-hosting-module.spec.ts +42 -0
- package/src/electron-node/hosting/electron-backend-hosting-module.ts +8 -0
- package/src/node/hosting/backend-hosting-module.ts +5 -2
- package/src/node/hosting/browser-connection-token.spec.ts +92 -0
- package/src/node/hosting/browser-connection-token.ts +45 -1
- package/src/node/index.ts +1 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 JuliaHub, Inc. and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { enableJSDOM } from '../test/jsdom';
|
|
18
|
+
let disableJSDOM = enableJSDOM();
|
|
19
|
+
|
|
20
|
+
import { expect } from 'chai';
|
|
21
|
+
import { MessageLoop } from '@lumino/messaging';
|
|
22
|
+
import { DockPanel, TabBar, Widget } from '@lumino/widgets';
|
|
23
|
+
import { TabBarTracker } from './tab-bar-tracker';
|
|
24
|
+
|
|
25
|
+
disableJSDOM();
|
|
26
|
+
|
|
27
|
+
describe('TabBarTracker', () => {
|
|
28
|
+
|
|
29
|
+
before(() => {
|
|
30
|
+
disableJSDOM = enableJSDOM();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
after(() => {
|
|
34
|
+
disableJSDOM();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
let panel: DockPanel | undefined;
|
|
38
|
+
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
if (panel) {
|
|
41
|
+
Widget.detach(panel);
|
|
42
|
+
panel.dispose();
|
|
43
|
+
panel = undefined;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
function attachInDockPanel(): Widget {
|
|
48
|
+
panel = new DockPanel();
|
|
49
|
+
Widget.attach(panel, document.body);
|
|
50
|
+
const widget = new Widget();
|
|
51
|
+
panel.addWidget(widget);
|
|
52
|
+
MessageLoop.flush();
|
|
53
|
+
return widget;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
it('reports the enclosing tab-bar on the first check', () => {
|
|
57
|
+
const widget = attachInDockPanel();
|
|
58
|
+
const events: Array<[TabBar<Widget> | undefined, TabBar<Widget> | undefined]> = [];
|
|
59
|
+
const tracker = new TabBarTracker(widget, (oldTabBar, newTabBar) => events.push([oldTabBar, newTabBar]));
|
|
60
|
+
tracker.check();
|
|
61
|
+
expect(events).lengthOf(1);
|
|
62
|
+
expect(events[0][0]).undefined;
|
|
63
|
+
expect(events[0][1]).not.undefined;
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('does not report again when the tab-bar has not changed', () => {
|
|
67
|
+
const widget = attachInDockPanel();
|
|
68
|
+
let count = 0;
|
|
69
|
+
const tracker = new TabBarTracker(widget, () => count++);
|
|
70
|
+
tracker.check();
|
|
71
|
+
tracker.check();
|
|
72
|
+
expect(count).equal(1);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('does nothing when the widget is not inside a DockPanel', () => {
|
|
76
|
+
let count = 0;
|
|
77
|
+
const tracker = new TabBarTracker(new Widget(), () => count++);
|
|
78
|
+
tracker.check();
|
|
79
|
+
expect(count).equal(0);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('stops reporting once disposed', () => {
|
|
83
|
+
const widget = attachInDockPanel();
|
|
84
|
+
let count = 0;
|
|
85
|
+
const tracker = new TabBarTracker(widget, () => count++);
|
|
86
|
+
tracker.dispose();
|
|
87
|
+
tracker.check();
|
|
88
|
+
expect(count).equal(0);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('reports a move between two tab-bars', () => {
|
|
92
|
+
panel = new DockPanel();
|
|
93
|
+
Widget.attach(panel, document.body);
|
|
94
|
+
const other = new Widget();
|
|
95
|
+
const widget = new Widget();
|
|
96
|
+
panel.addWidget(other);
|
|
97
|
+
panel.addWidget(widget, { mode: 'split-right', ref: other });
|
|
98
|
+
MessageLoop.flush();
|
|
99
|
+
const events: Array<[TabBar<Widget> | undefined, TabBar<Widget> | undefined]> = [];
|
|
100
|
+
const tracker = new TabBarTracker(widget, (oldTabBar, newTabBar) => events.push([oldTabBar, newTabBar]));
|
|
101
|
+
tracker.check();
|
|
102
|
+
panel.addWidget(widget, { mode: 'tab-after', ref: other });
|
|
103
|
+
MessageLoop.flush();
|
|
104
|
+
tracker.check();
|
|
105
|
+
expect(events).lengthOf(2);
|
|
106
|
+
expect(events[1][0]).not.undefined;
|
|
107
|
+
expect(events[1][0]).not.equal(events[1][1]);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('re-reports the current tab-bar after reset', () => {
|
|
111
|
+
const widget = attachInDockPanel();
|
|
112
|
+
const events: Array<[TabBar<Widget> | undefined, TabBar<Widget> | undefined]> = [];
|
|
113
|
+
const tracker = new TabBarTracker(widget, (oldTabBar, newTabBar) => events.push([oldTabBar, newTabBar]));
|
|
114
|
+
tracker.check();
|
|
115
|
+
tracker.reset();
|
|
116
|
+
tracker.check();
|
|
117
|
+
expect(events).lengthOf(2);
|
|
118
|
+
expect(events[1][0]).undefined;
|
|
119
|
+
expect(events[1][1]).not.undefined;
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 JuliaHub, Inc. and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { find } from '@lumino/algorithm';
|
|
18
|
+
import { DockPanel, TabBar, Widget } from '@lumino/widgets';
|
|
19
|
+
import { Disposable, DisposableCollection } from '../../common';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Detects when a widget is moved between the tab-bars of its enclosing {@link DockPanel} and
|
|
23
|
+
* notifies a callback with the previous and current tab-bar. Call {@link check} from the host
|
|
24
|
+
* widget's `onAfterAttach`.
|
|
25
|
+
*/
|
|
26
|
+
export class TabBarTracker implements Disposable {
|
|
27
|
+
|
|
28
|
+
protected currentTabBar: TabBar<Widget> | undefined;
|
|
29
|
+
protected isDisposed = false;
|
|
30
|
+
protected readonly toDisposeOnTabBarChange = new DisposableCollection();
|
|
31
|
+
|
|
32
|
+
constructor(
|
|
33
|
+
protected readonly widget: Widget,
|
|
34
|
+
protected readonly onTabBarChange: (oldTabBar?: TabBar<Widget>, newTabBar?: TabBar<Widget>) => void
|
|
35
|
+
) { }
|
|
36
|
+
|
|
37
|
+
check(): void {
|
|
38
|
+
if (this.isDisposed) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const parent = this.widget.parent;
|
|
42
|
+
if (parent instanceof DockPanel) {
|
|
43
|
+
const newTabBar = find(parent.tabBars(), tabBar => !!tabBar.titles.find(title => title === this.widget.title));
|
|
44
|
+
if (this.currentTabBar !== newTabBar) {
|
|
45
|
+
this.toDisposeOnTabBarChange.dispose();
|
|
46
|
+
const listener = () => this.check();
|
|
47
|
+
parent.layoutModified.connect(listener);
|
|
48
|
+
this.toDisposeOnTabBarChange.push(Disposable.create(() => parent.layoutModified.disconnect(listener)));
|
|
49
|
+
const last = this.currentTabBar;
|
|
50
|
+
this.currentTabBar = newTabBar;
|
|
51
|
+
this.onTabBarChange(last, newTabBar);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Forgets the current tab-bar so that the next {@link check} reports it again as
|
|
58
|
+
* `(undefined, currentTabBar)`. Listeners on the enclosing panel stay connected.
|
|
59
|
+
*/
|
|
60
|
+
reset(): void {
|
|
61
|
+
this.currentTabBar = undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
dispose(): void {
|
|
65
|
+
this.isDisposed = true;
|
|
66
|
+
this.toDisposeOnTabBarChange.dispose();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -24,6 +24,33 @@ export class FrontendOnlyConnectionSource implements ConnectionSource {
|
|
|
24
24
|
onConnectionDidOpen = new Emitter<Channel>().event;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Proxy factory for services without a frontend-only implementation. There is no backend,
|
|
29
|
+
* so no channel will ever open and requests would otherwise be queued forever, blocking
|
|
30
|
+
* any caller that awaits the result, e.g. during application startup.
|
|
31
|
+
* Instead, requests fail immediately and notifications (fire-and-forget) resolve silently.
|
|
32
|
+
*/
|
|
33
|
+
export class FrontendOnlyRpcProxyFactory<T extends object> extends RpcProxyFactory<T> {
|
|
34
|
+
|
|
35
|
+
constructor(protected readonly path: string, target?: object) {
|
|
36
|
+
super(target);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override get(target: T, p: PropertyKey, receiver: unknown): unknown {
|
|
40
|
+
if (typeof p !== 'string') {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
// members handled by the base proxy without a connection
|
|
44
|
+
if (['setClient', 'getClient', 'onDidOpenConnection', 'onDidCloseConnection', 'then', 'toJSON'].includes(p)) {
|
|
45
|
+
return super.get(target, p, receiver);
|
|
46
|
+
}
|
|
47
|
+
if (this.isNotification(p)) {
|
|
48
|
+
return () => Promise.resolve();
|
|
49
|
+
}
|
|
50
|
+
return () => Promise.reject(new Error(`Request '${p}' on service '${this.path}' is unavailable: no backend in frontend-only mode.`));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
27
54
|
@injectable()
|
|
28
55
|
export class FrontendOnlyServiceConnectionProvider extends ServiceConnectionProvider {
|
|
29
56
|
|
|
@@ -33,10 +60,12 @@ export class FrontendOnlyServiceConnectionProvider extends ServiceConnectionProv
|
|
|
33
60
|
onSocketDidOpen = Event.None;
|
|
34
61
|
onSocketDidClose = Event.None;
|
|
35
62
|
onIncomingMessageActivity = Event.None;
|
|
36
|
-
override createProxy<T extends object>(path:
|
|
63
|
+
override createProxy<T extends object>(path: string, target?: object): RpcProxy<T> {
|
|
37
64
|
this.logger.debug(`[Frontend-Only Fallback] Created proxy connection for ${path}`);
|
|
38
|
-
|
|
39
|
-
|
|
65
|
+
if (target instanceof RpcProxyFactory) {
|
|
66
|
+
return target.createProxy();
|
|
67
|
+
}
|
|
68
|
+
return new FrontendOnlyRpcProxyFactory<T>(path, target).createProxy();
|
|
40
69
|
}
|
|
41
70
|
override listen(path: string, handler: ServiceConnectionProvider.ConnectionHandler, reconnect: boolean): void {
|
|
42
71
|
this.logger.debug('[Frontend-Only Fallback] Listen to websocket connection requested');
|