Skip to content

Commit 2691989

Browse files
committed
#28: Enable to separately acquire vscode API
1 parent bd616bb commit 2691989

File tree

5 files changed

+28
-33
lines changed

5 files changed

+28
-33
lines changed

sprotty-vscode-webview/src/lsp/editing/language-client-proxy.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,24 @@
1313
*
1414
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
1515
********************************************************************************/
16-
import { injectable } from 'inversify';
16+
import { injectable, inject } from 'inversify';
1717
import { NotificationType, NotificationType0, RequestType, RequestType0 } from 'vscode-jsonrpc';
1818
import { isResponseMessage } from 'vscode-jsonrpc/lib/common/messages';
1919
import { CancellationToken, NotificationMessage, RequestMessage, MessageSignature } from 'vscode-languageserver-protocol';
20-
import { vscodeApi } from '../../vscode-api';
20+
import { VsCodeApi } from '../../services';
2121

2222
@injectable()
2323
export class LanguageClientProxy {
2424

25+
@inject(VsCodeApi) vscodeApi: VsCodeApi;
26+
2527
private currentNumber = 0;
2628
private openRequestsResolves = new Map<number, (value: any) => void>();
2729
private openRequestsRejects = new Map<number, (reason: any) => void>();
2830

2931
constructor() {
3032
window.addEventListener('message', message => {
31-
if ('data' in message && isResponseMessage(message.data)) {
33+
if ('data' in message && isResponseMessage(message.data)) {
3234
const id = message.data.id;
3335
if (typeof id === 'number') {
3436
if (message.data.error) {
@@ -50,9 +52,10 @@ export class LanguageClientProxy {
5052
async sendRequest<R, E>(type: RequestType0<R, E>, token?: CancellationToken): Promise<R>;
5153
async sendRequest<P, R, E>(type: RequestType<P, R, E>, params: P, token?: CancellationToken): Promise<R>;
5254
async sendRequest<R>(signature: MessageSignature, ...params: any[]): Promise<R> {
53-
if (CancellationToken.is(params[params.length - 1]))
55+
if (CancellationToken.is(params[params.length - 1])) {
5456
params.pop();
55-
vscodeApi.postMessage(<RequestMessage> {
57+
}
58+
this.vscodeApi.postMessage(<RequestMessage> {
5659
method: signature.method,
5760
id: this.currentNumber,
5861
jsonrpc: 'request',
@@ -69,11 +72,10 @@ export class LanguageClientProxy {
6972
sendNotification(type: NotificationType0): void;
7073
sendNotification<P>(type: NotificationType<P>, params?: P): void;
7174
sendNotification<P>(signature: MessageSignature, params?: P): void {
72-
vscodeApi.postMessage(<NotificationMessage> {
75+
this.vscodeApi.postMessage(<NotificationMessage> {
7376
method: signature.method,
7477
jsonrpc: 'notify',
7578
params
7679
});
7780
}
7881
}
79-

sprotty-vscode-webview/src/vscode-api-typing.d.ts renamed to sprotty-vscode-webview/src/services.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/********************************************************************************
2-
* Copyright (c) 2018 TypeFox and others.
2+
* Copyright (c) 2022 TypeFox and others.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0 which is available at
@@ -14,8 +14,12 @@
1414
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
1515
********************************************************************************/
1616

17-
declare function acquireVsCodeApi(): VsCodeApi;
18-
19-
declare interface VsCodeApi {
17+
export interface VsCodeApi {
2018
postMessage: (message: any) => void
2119
}
20+
21+
export const VsCodeApi = Symbol('VsCodeApi');
22+
23+
export interface SprottyStarterServices {
24+
vscodeApi?: VsCodeApi
25+
}

sprotty-vscode-webview/src/sprotty-starter.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,25 @@ import { Container } from 'inversify';
1818
import { DiagramServerProxy, KeyTool, TYPES } from 'sprotty';
1919
import { isDiagramIdentifier, SprottyDiagramIdentifier, WebviewReadyMessage } from 'sprotty-vscode-protocol';
2020
import { DisabledKeyTool } from './disabled-keytool';
21-
import { vscodeApi } from './vscode-api';
21+
import { SprottyStarterServices, VsCodeApi } from './services';
2222
import { VscodeDiagramServer } from './vscode-diagram-server';
2323
import { VscodeDiagramWidget, VscodeDiagramWidgetFactory } from './vscode-diagram-widget';
2424

25+
declare function acquireVsCodeApi(): VsCodeApi;
26+
2527
export abstract class SprottyStarter {
2628

2729
protected container?: Container;
30+
protected vscodeApi: VsCodeApi;
2831

29-
constructor() {
32+
constructor(services: SprottyStarterServices = {}) {
33+
this.vscodeApi = services.vscodeApi ?? acquireVsCodeApi();
3034
this.sendReadyMessage();
3135
this.acceptDiagramIdentifier();
3236
}
3337

3438
protected sendReadyMessage(): void {
35-
vscodeApi.postMessage({ readyMessage: 'Sprotty Webview ready' } as WebviewReadyMessage);
39+
this.vscodeApi.postMessage({ readyMessage: 'Sprotty Webview ready' } as WebviewReadyMessage);
3640
}
3741

3842
protected acceptDiagramIdentifier(): void {
@@ -61,6 +65,7 @@ export abstract class SprottyStarter {
6165
protected abstract createContainer(diagramIdentifier: SprottyDiagramIdentifier): Container;
6266

6367
protected addVscodeBindings(container: Container, diagramIdentifier: SprottyDiagramIdentifier): void {
68+
container.bind(VsCodeApi).toConstantValue(this.vscodeApi);
6469
container.bind(VscodeDiagramWidget).toSelf().inSingletonScope();
6570
container.bind(VscodeDiagramWidgetFactory).toFactory(context => {
6671
return () => context.container.get<VscodeDiagramWidget>(VscodeDiagramWidget);

sprotty-vscode-webview/src/vscode-api.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

sprotty-vscode-webview/src/vscode-diagram-server.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ import {
2222
} from 'sprotty-protocol';
2323

2424
import { VscodeDiagramWidgetFactory } from './vscode-diagram-widget';
25-
import { vscodeApi } from './vscode-api';
2625
import { IRootPopupModelProvider } from './root-popup-model-provider';
26+
import { VsCodeApi } from './services';
2727

2828
export class VscodeDiagramServer extends DiagramServerProxy {
2929

30+
@inject(VsCodeApi) vscodeApi: VsCodeApi;
3031
@inject(VscodeDiagramWidgetFactory) diagramWidgetFactory: VscodeDiagramWidgetFactory;
3132
@inject(IRootPopupModelProvider)@optional() protected rootPopupModelProvider: IRootPopupModelProvider;
3233

@@ -41,7 +42,7 @@ export class VscodeDiagramServer extends DiagramServerProxy {
4142
}
4243

4344
protected sendMessage(message: ActionMessage): void {
44-
vscodeApi.postMessage(message);
45+
this.vscodeApi.postMessage(message);
4546
}
4647

4748
handleLocally(action: Action): boolean {

0 commit comments

Comments
 (0)