@eclipse-glsp/server 1.1.0-RC06 → 1.1.0-next.146ae06.49

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.
Files changed (146) hide show
  1. package/lib/browser/di/app-module.d.ts +2 -7
  2. package/lib/browser/di/app-module.d.ts.map +1 -1
  3. package/lib/browser/di/app-module.js +5 -30
  4. package/lib/browser/di/app-module.js.map +1 -1
  5. package/lib/browser/index.d.ts +0 -1
  6. package/lib/browser/index.d.ts.map +1 -1
  7. package/lib/browser/index.js +0 -1
  8. package/lib/browser/index.js.map +1 -1
  9. package/lib/browser/launch/worker-server-launcher.d.ts +4 -4
  10. package/lib/browser/launch/worker-server-launcher.d.ts.map +1 -1
  11. package/lib/browser/launch/worker-server-launcher.js +5 -11
  12. package/lib/browser/launch/worker-server-launcher.js.map +1 -1
  13. package/lib/common/actions/client-action-handler.d.ts +1 -2
  14. package/lib/common/actions/client-action-handler.d.ts.map +1 -1
  15. package/lib/common/actions/client-action-handler.js +17 -2
  16. package/lib/common/actions/client-action-handler.js.map +1 -1
  17. package/lib/common/command/command-stack.d.ts +16 -1
  18. package/lib/common/command/command-stack.d.ts.map +1 -1
  19. package/lib/common/command/command-stack.js +0 -15
  20. package/lib/common/command/command-stack.js.map +1 -1
  21. package/lib/common/di/client-session-module.d.ts +1 -1
  22. package/lib/common/di/client-session-module.d.ts.map +1 -1
  23. package/lib/common/di/client-session-module.js +2 -2
  24. package/lib/common/di/client-session-module.js.map +1 -1
  25. package/lib/common/di/glsp-module.d.ts +3 -1
  26. package/lib/common/di/glsp-module.d.ts.map +1 -1
  27. package/lib/common/di/glsp-module.js +0 -15
  28. package/lib/common/di/glsp-module.js.map +1 -1
  29. package/lib/common/di/multi-binding.d.ts +19 -4
  30. package/lib/common/di/multi-binding.d.ts.map +1 -1
  31. package/lib/common/di/multi-binding.js.map +1 -1
  32. package/lib/common/di/server-module.d.ts +1 -6
  33. package/lib/common/di/server-module.d.ts.map +1 -1
  34. package/lib/common/di/server-module.js +21 -17
  35. package/lib/common/di/server-module.js.map +1 -1
  36. package/lib/common/features/model/model-submission-handler.d.ts +2 -0
  37. package/lib/common/features/model/model-submission-handler.d.ts.map +1 -1
  38. package/lib/common/features/model/model-submission-handler.js +10 -0
  39. package/lib/common/features/model/model-submission-handler.js.map +1 -1
  40. package/lib/common/features/validation/model-validator.d.ts +47 -2
  41. package/lib/common/features/validation/model-validator.d.ts.map +1 -1
  42. package/lib/common/features/validation/model-validator.js +80 -1
  43. package/lib/common/features/validation/model-validator.js.map +1 -1
  44. package/lib/common/features/validation/request-markers-handler.d.ts +15 -0
  45. package/lib/common/features/validation/request-markers-handler.d.ts.map +1 -1
  46. package/lib/common/features/validation/request-markers-handler.js +3 -9
  47. package/lib/common/features/validation/request-markers-handler.js.map +1 -1
  48. package/lib/common/index.d.ts +1 -2
  49. package/lib/common/index.d.ts.map +1 -1
  50. package/lib/common/index.js +1 -2
  51. package/lib/common/index.js.map +1 -1
  52. package/lib/common/launch/glsp-server-launcher.d.ts +1 -1
  53. package/lib/common/launch/glsp-server-launcher.d.ts.map +1 -1
  54. package/lib/common/launch/glsp-server-launcher.js +2 -2
  55. package/lib/common/launch/glsp-server-launcher.js.map +1 -1
  56. package/lib/common/launch/jsonrpc-server-launcher.d.ts +38 -0
  57. package/lib/common/launch/jsonrpc-server-launcher.d.ts.map +1 -0
  58. package/lib/common/launch/jsonrpc-server-launcher.js +84 -0
  59. package/lib/common/launch/jsonrpc-server-launcher.js.map +1 -0
  60. package/lib/common/protocol/glsp-server.d.ts +4 -104
  61. package/lib/common/protocol/glsp-server.d.ts.map +1 -1
  62. package/lib/common/protocol/glsp-server.js +13 -20
  63. package/lib/common/protocol/glsp-server.js.map +1 -1
  64. package/lib/common/protocol/glsp-server.spec.js +18 -5
  65. package/lib/common/protocol/glsp-server.spec.js.map +1 -1
  66. package/lib/common/session/client-session-factory.d.ts +1 -2
  67. package/lib/common/session/client-session-factory.d.ts.map +1 -1
  68. package/lib/common/session/client-session-factory.js +17 -2
  69. package/lib/common/session/client-session-factory.js.map +1 -1
  70. package/lib/common/session/client-session-factory.spec.js +2 -2
  71. package/lib/common/session/client-session-factory.spec.js.map +1 -1
  72. package/lib/common/session/client-session-manager.d.ts +1 -3
  73. package/lib/common/session/client-session-manager.d.ts.map +1 -1
  74. package/lib/common/session/client-session-manager.js.map +1 -1
  75. package/lib/common/test/mock-util.d.ts +3 -6
  76. package/lib/common/test/mock-util.d.ts.map +1 -1
  77. package/lib/common/test/mock-util.js.map +1 -1
  78. package/lib/{browser/di → common/utils}/console-logger.d.ts +8 -2
  79. package/lib/common/utils/console-logger.d.ts.map +1 -0
  80. package/lib/{browser/di → common/utils}/console-logger.js +27 -9
  81. package/lib/common/utils/console-logger.js.map +1 -0
  82. package/lib/common/utils/logger.d.ts +21 -0
  83. package/lib/common/utils/logger.d.ts.map +1 -1
  84. package/lib/common/utils/logger.js +12 -1
  85. package/lib/common/utils/logger.js.map +1 -1
  86. package/lib/node/di/app-module.d.ts +2 -2
  87. package/lib/node/di/app-module.d.ts.map +1 -1
  88. package/lib/node/di/app-module.js +10 -35
  89. package/lib/node/di/app-module.js.map +1 -1
  90. package/lib/node/launch/cli-parser.d.ts +2 -3
  91. package/lib/node/launch/cli-parser.d.ts.map +1 -1
  92. package/lib/node/launch/cli-parser.js.map +1 -1
  93. package/lib/node/launch/socket-cli-parser.js +1 -1
  94. package/lib/node/launch/socket-cli-parser.js.map +1 -1
  95. package/lib/node/launch/socket-server-launcher.d.ts +2 -23
  96. package/lib/node/launch/socket-server-launcher.d.ts.map +1 -1
  97. package/lib/node/launch/socket-server-launcher.js +8 -28
  98. package/lib/node/launch/socket-server-launcher.js.map +1 -1
  99. package/lib/node/launch/socket-server-launcher.spec.js +5 -0
  100. package/lib/node/launch/socket-server-launcher.spec.js.map +1 -1
  101. package/lib/node/launch/websocket-server-launcher.d.ts +2 -8
  102. package/lib/node/launch/websocket-server-launcher.d.ts.map +1 -1
  103. package/lib/node/launch/websocket-server-launcher.js +4 -28
  104. package/lib/node/launch/websocket-server-launcher.js.map +1 -1
  105. package/package.json +4 -4
  106. package/src/browser/di/app-module.ts +4 -32
  107. package/src/browser/index.ts +0 -1
  108. package/src/browser/launch/worker-server-launcher.ts +7 -13
  109. package/src/common/actions/client-action-handler.ts +1 -2
  110. package/src/common/command/command-stack.ts +1 -1
  111. package/src/common/di/client-session-module.ts +1 -1
  112. package/src/common/di/glsp-module.ts +3 -1
  113. package/src/common/di/multi-binding.ts +4 -5
  114. package/src/common/di/server-module.ts +6 -21
  115. package/src/common/features/model/model-submission-handler.ts +12 -0
  116. package/src/common/features/validation/model-validator.ts +75 -3
  117. package/src/common/features/validation/request-markers-handler.ts +4 -10
  118. package/src/common/index.ts +1 -2
  119. package/src/common/launch/glsp-server-launcher.ts +2 -2
  120. package/src/common/launch/jsonrpc-server-launcher.ts +95 -0
  121. package/src/common/protocol/glsp-server.spec.ts +7 -4
  122. package/src/common/protocol/glsp-server.ts +17 -132
  123. package/src/common/session/client-session-factory.spec.ts +1 -1
  124. package/src/common/session/client-session-factory.ts +1 -2
  125. package/src/common/session/client-session-manager.ts +1 -3
  126. package/src/common/test/mock-util.ts +5 -5
  127. package/src/{browser/di → common/utils}/console-logger.ts +20 -2
  128. package/src/common/utils/logger.ts +16 -1
  129. package/src/node/di/app-module.ts +4 -13
  130. package/src/node/launch/cli-parser.ts +2 -3
  131. package/src/node/launch/socket-cli-parser.ts +1 -1
  132. package/src/node/launch/socket-server-launcher.spec.ts +6 -0
  133. package/src/node/launch/socket-server-launcher.ts +8 -30
  134. package/src/node/launch/websocket-server-launcher.ts +5 -31
  135. package/lib/browser/di/console-logger.d.ts.map +0 -1
  136. package/lib/browser/di/console-logger.js.map +0 -1
  137. package/lib/common/protocol/glsp-client-proxy.d.ts +0 -45
  138. package/lib/common/protocol/glsp-client-proxy.d.ts.map +0 -1
  139. package/lib/common/protocol/glsp-client-proxy.js +0 -53
  140. package/lib/common/protocol/glsp-client-proxy.js.map +0 -1
  141. package/lib/common/protocol/glsp-server-listener.d.ts +0 -37
  142. package/lib/common/protocol/glsp-server-listener.d.ts.map +0 -1
  143. package/lib/common/protocol/glsp-server-listener.js +0 -5
  144. package/lib/common/protocol/glsp-server-listener.js.map +0 -1
  145. package/src/common/protocol/glsp-client-proxy.ts +0 -65
  146. package/src/common/protocol/glsp-server-listener.ts +0 -39
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-glsp/server",
3
- "version": "1.1.0-RC06",
3
+ "version": "1.1.0-next.146ae06.49+146ae06",
4
4
  "description": "A js server framework for Eclipse GLSP",
5
5
  "keywords": [
6
6
  "eclipse",
@@ -59,8 +59,8 @@
59
59
  "watch": "tsc -w"
60
60
  },
61
61
  "dependencies": {
62
- "@eclipse-glsp/graph": "1.1.0-RC06",
63
- "@eclipse-glsp/protocol": "1.1.0-RC06",
62
+ "@eclipse-glsp/graph": "1.1.0-next.146ae06.49+146ae06",
63
+ "@eclipse-glsp/protocol": "next",
64
64
  "@types/uuid": "8.3.1",
65
65
  "commander": "^8.3.0",
66
66
  "fast-json-patch": "^3.1.0",
@@ -75,5 +75,5 @@
75
75
  "publishConfig": {
76
76
  "access": "public"
77
77
  },
78
- "gitHead": "591801638567465e0210f5960f30343c2153fdd4"
78
+ "gitHead": "146ae06fdf2dcaea924873e830a81b0ca4033d85"
79
79
  }
@@ -14,42 +14,14 @@
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
16
 
17
- import { ContainerModule, interfaces } from 'inversify';
18
- import { InjectionContainer, Logger, LoggerFactory, LogLevel, ModuleContext, NullLogger } from '../../common/index';
19
- import { ConsoleLogger } from './console-logger';
17
+ import { ContainerModule } from 'inversify';
18
+ import { InjectionContainer, LogLevel, LoggerConfigOptions, configureConsoleLogger } from '../../common/';
20
19
 
21
- export interface LaunchOptions {
22
- consoleLog?: boolean;
23
- logLevel?: LogLevel;
24
- }
25
- export function createAppModule(options: LaunchOptions = {}): ContainerModule {
26
- const resolvedOptions: LaunchOptions = { consoleLog: true, logLevel: LogLevel.info, ...options };
20
+ export function createAppModule(options: LoggerConfigOptions = {}): ContainerModule {
21
+ const resolvedOptions: LoggerConfigOptions = { consoleLog: true, logLevel: LogLevel.info, ...options };
27
22
  return new ContainerModule((bind, unbind, isBound, rebind) => {
28
23
  bind(InjectionContainer).toDynamicValue(dynamicContext => dynamicContext.container);
29
24
  const context = { bind, unbind, isBound, rebind };
30
25
  configureConsoleLogger(context, resolvedOptions);
31
26
  });
32
27
  }
33
-
34
- export function configureConsoleLogger<T extends LaunchOptions>(context: ModuleContext, options: T): void {
35
- if (!options.consoleLog) {
36
- context.bind(Logger).to(NullLogger).inSingletonScope();
37
- } else {
38
- context.bind(Logger).toDynamicValue(ctx => new ConsoleLogger(options.logLevel, getRequestParentName(ctx)));
39
- }
40
- context.bind(LoggerFactory).toFactory(dynamicContext => (caller: string) => {
41
- const logger = dynamicContext.container.get(Logger);
42
- logger.caller = caller;
43
- return logger;
44
- });
45
- }
46
-
47
- function getRequestParentName(context: interfaces.Context): string | undefined {
48
- if (context.currentRequest.parentRequest) {
49
- const bindings = context.currentRequest.parentRequest.bindings;
50
- if (bindings.length > 0) {
51
- return bindings[0].implementationType?.name;
52
- }
53
- }
54
- return undefined;
55
- }
@@ -15,5 +15,4 @@
15
15
  ********************************************************************************/
16
16
  export * from '../common/index';
17
17
  export * from './di/app-module';
18
- export * from './di/console-logger';
19
18
  export * from './launch/worker-server-launcher';
@@ -14,9 +14,10 @@
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
16
 
17
- import { Container, injectable } from 'inversify';
17
+ import { injectable } from 'inversify';
18
18
  import * as jsonrpc from 'vscode-jsonrpc/browser';
19
- import { GLSPServer, GLSPServerLauncher, JsonRpcGLSPServer, MaybePromise } from '../../common/index';
19
+ import { MaybePromise } from '../../common/index';
20
+ import { JsonRpcGLSPServerLauncher, JsonRpcServerInstance } from '../../common/launch/jsonrpc-server-launcher';
20
21
  export interface WorkerLaunchOptions {
21
22
  context?: Worker;
22
23
  }
@@ -24,22 +25,16 @@ export interface WorkerLaunchOptions {
24
25
  export const START_UP_COMPLETE_MSG = '[GLSP-Server]:Startup completed.';
25
26
 
26
27
  @injectable()
27
- export class WorkerServerLauncher extends GLSPServerLauncher<WorkerLaunchOptions> {
28
+ export class WorkerServerLauncher extends JsonRpcGLSPServerLauncher<WorkerLaunchOptions> {
28
29
  protected connection?: jsonrpc.MessageConnection;
29
30
 
30
31
  protected run(options: WorkerLaunchOptions): MaybePromise<void> {
31
32
  if (this.connection) {
32
33
  throw new Error('Error during launch. Server already has an active client connection');
33
34
  }
34
- const container = this.createContainer();
35
35
  this.connection = this.createConnection(options);
36
- const glspServer = container.get<JsonRpcGLSPServer>(JsonRpcGLSPServer);
37
- glspServer.connect(this.connection);
38
- this.connection.onDispose(() => this.disposeClientConnection(container, glspServer));
39
-
36
+ this.createServerInstance(this.connection);
40
37
  this.logger.info('GLSP server worker connection established');
41
- this.connection.listen();
42
- this.toDispose.push(this.connection);
43
38
  postMessage(START_UP_COMPLETE_MSG);
44
39
  return new Promise((resolve, rejects) => {
45
40
  this.connection?.onClose(() => resolve(undefined));
@@ -47,9 +42,8 @@ export class WorkerServerLauncher extends GLSPServerLauncher<WorkerLaunchOptions
47
42
  });
48
43
  }
49
44
 
50
- protected disposeClientConnection(container: Container, glspServer: GLSPServer): void {
51
- glspServer.shutdown();
52
- container.unbindAll();
45
+ protected override disposeServerInstance(instance: JsonRpcServerInstance): void {
46
+ super.disposeServerInstance(instance);
53
47
  this.connection = undefined;
54
48
  }
55
49
 
@@ -13,10 +13,9 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { Action, ActionMessage } from '@eclipse-glsp/protocol';
16
+ import { Action, ActionMessage, GLSPClientProxy } from '@eclipse-glsp/protocol';
17
17
  import { inject, injectable, optional } from 'inversify';
18
18
  import { ClientActionKinds, ClientId } from '../di/service-identifiers';
19
- import { GLSPClientProxy } from '../protocol/glsp-client-proxy';
20
19
 
21
20
  /**
22
21
  * The client action handler is responsible of handling action kinds that are intended for the
@@ -13,8 +13,8 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
+ import { MaybePromise } from '@eclipse-glsp/protocol';
16
17
  import { inject, injectable } from 'inversify';
17
- import { MaybePromise } from '..';
18
18
  import { Logger } from '../utils/logger';
19
19
  import { Command } from './command';
20
20
 
@@ -13,8 +13,8 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
+ import { GLSPClientProxy } from '@eclipse-glsp/protocol';
16
17
  import { ContainerModule } from 'inversify';
17
- import { GLSPClientProxy } from '../protocol/glsp-client-proxy';
18
18
  import { ClientId } from './service-identifiers';
19
19
 
20
20
  export function createClientSessionModule(clientId: string, glspClient: GLSPClientProxy): ContainerModule {
@@ -13,12 +13,14 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
+ import { BindingContext } from '@eclipse-glsp/protocol';
16
17
  import { ContainerModule, injectable, interfaces } from 'inversify';
17
18
  import { AbstractMultiBinding } from './multi-binding';
18
19
 
19
20
  /**
20
21
  * A wrapper interface to get access to the binding related functions
21
22
  * for a inversify container.
23
+ * @deprecated Use `BindingContext` from `@eclipse-glsp/protocol` instead
22
24
  */
23
25
  export interface ModuleContext {
24
26
  bind: interfaces.Bind;
@@ -34,7 +36,7 @@ export interface ModuleContext {
34
36
  export abstract class GLSPModule extends ContainerModule {
35
37
  public static CLIENT_ACTIONS = 'ClientActions';
36
38
 
37
- protected context: ModuleContext;
39
+ protected context: BindingContext;
38
40
 
39
41
  constructor() {
40
42
  super((bind, unbind, isBound, rebind) => {
@@ -13,9 +13,8 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { distinctAdd, flatPush, MaybeArray, remove } from '@eclipse-glsp/protocol';
16
+ import { BindingContext, distinctAdd, flatPush, MaybeArray, remove } from '@eclipse-glsp/protocol';
17
17
  import { applyBindingTarget, BindingTarget } from './binding-target';
18
- import { ModuleContext } from './glsp-module';
19
18
 
20
19
  /**
21
20
  * A helper class used in `GLSPModules` to ease the configuration of multi-injected service identifiers.
@@ -29,7 +28,7 @@ export abstract class AbstractMultiBinding<T> {
29
28
 
30
29
  constructor(readonly identifier: string | symbol) {}
31
30
 
32
- abstract applyBindings(context: ModuleContext): void;
31
+ abstract applyBindings(context: BindingContext): void;
33
32
 
34
33
  add(newBinding: T): void {
35
34
  distinctAdd(this.bindings, newBinding);
@@ -71,7 +70,7 @@ export abstract class AbstractMultiBinding<T> {
71
70
  * @typeparam T the base type of {@link BindingTarget}.
72
71
  */
73
72
  export class MultiBinding<T> extends AbstractMultiBinding<BindingTarget<T>> {
74
- applyBindings(context: ModuleContext): void {
73
+ applyBindings(context: BindingContext): void {
75
74
  this.bindings.forEach(binding => applyBindingTarget(context, this.identifier, binding));
76
75
  }
77
76
  }
@@ -83,7 +82,7 @@ export class MultiBinding<T> extends AbstractMultiBinding<BindingTarget<T>> {
83
82
  * * @typeparam T the type of the instances
84
83
  */
85
84
  export class InstanceMultiBinding<T> extends AbstractMultiBinding<T> {
86
- applyBindings(context: ModuleContext): void {
85
+ applyBindings(context: BindingContext): void {
87
86
  context.bind(this.identifier).toConstantValue(this.bindings);
88
87
  }
89
88
  }
@@ -13,14 +13,13 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
+ import { GLSPServer, GLSPServerListener } from '@eclipse-glsp/protocol';
16
17
  import { ContainerModule, interfaces } from 'inversify';
17
18
  import { DefaultGlobalActionProvider, GlobalActionProvider } from '../actions/global-action-provider';
18
- import { DefaultGLSPClientProxy, GLSPClientProxy, JsonRpcGLSPClientProxy } from '../protocol/glsp-client-proxy';
19
- import { DefaultGLSPServer, GLSPServer, JsonRpcGLSPServer } from '../protocol/glsp-server';
20
- import { GLSPServerListener } from '../protocol/glsp-server-listener';
19
+ import { DefaultGLSPServer } from '../protocol/glsp-server';
21
20
  import { ClientSessionFactory, DefaultClientSessionFactory } from '../session/client-session-factory';
22
21
  import { ClientSessionManager, DefaultClientSessionManager } from '../session/client-session-manager';
23
- import { applyBindingTarget, BindingTarget } from './binding-target';
22
+ import { BindingTarget, applyBindingTarget } from './binding-target';
24
23
  import { DiagramModule } from './diagram-module';
25
24
  import { GLSPModule } from './glsp-module';
26
25
  import { MultiBinding } from './multi-binding';
@@ -74,7 +73,6 @@ export class ServerModule extends GLSPModule {
74
73
  applyBindingTarget(context, DiagramModules, this.bindDiagramModules());
75
74
 
76
75
  applyBindingTarget(context, GLSPServer, this.bindGLSPServer()).inSingletonScope();
77
- applyBindingTarget(context, JsonRpcGLSPServer, this.bindJsonRpcGLSPServer());
78
76
  applyBindingTarget(context, ClientSessionFactory, this.bindClientSessionFactory()).inSingletonScope();
79
77
  applyBindingTarget(context, ClientSessionManager, this.bindClientSessionManager()).inSingletonScope();
80
78
  this.configureMultiBinding(new MultiBinding<GLSPServerListener>(GLSPServerListener), binding =>
@@ -83,10 +81,9 @@ export class ServerModule extends GLSPModule {
83
81
 
84
82
  applyBindingTarget(context, GlobalActionProvider, this.bindGlobalActionProvider()).inSingletonScope();
85
83
 
86
- applyBindingTarget(context, InjectionContainer, this.bindInjectionContainer());
87
-
88
- applyBindingTarget(context, GLSPClientProxy, this.bindGLSPClientProxy()).inSingletonScope();
89
- applyBindingTarget(context, JsonRpcGLSPClientProxy, this.bindJsonRpcGLSPClientProxy());
84
+ if (!isBound(InjectionContainer)) {
85
+ applyBindingTarget(context, InjectionContainer, this.bindInjectionContainer());
86
+ }
90
87
  }
91
88
 
92
89
  protected bindDiagramModules(): BindingTarget<Map<string, ContainerModule[]>> {
@@ -97,10 +94,6 @@ export class ServerModule extends GLSPModule {
97
94
  return DefaultGLSPServer;
98
95
  }
99
96
 
100
- protected bindJsonRpcGLSPServer(): BindingTarget<JsonRpcGLSPServer> {
101
- return { service: GLSPServer };
102
- }
103
-
104
97
  protected bindClientSessionFactory(): BindingTarget<ClientSessionFactory> {
105
98
  return DefaultClientSessionFactory;
106
99
  }
@@ -117,14 +110,6 @@ export class ServerModule extends GLSPModule {
117
110
  return { dynamicValue: context => context.container };
118
111
  }
119
112
 
120
- protected bindGLSPClientProxy(): BindingTarget<GLSPClientProxy> {
121
- return DefaultGLSPClientProxy;
122
- }
123
-
124
- protected bindJsonRpcGLSPClientProxy(): BindingTarget<JsonRpcGLSPClientProxy> {
125
- return { service: GLSPClientProxy };
126
- }
127
-
128
113
  protected configureGLSPServerListeners(binding: MultiBinding<GLSPServerListener>): void {
129
114
  binding.add({ service: ClientSessionManager });
130
115
  }
@@ -17,16 +17,20 @@ import { GModelRootSchema } from '@eclipse-glsp/graph';
17
17
  import {
18
18
  Action,
19
19
  DirtyStateChangeReason,
20
+ MarkersReason,
20
21
  MaybePromise,
21
22
  RequestBoundsAction,
22
23
  SetDirtyStateAction,
24
+ SetMarkersAction,
23
25
  SetModelAction,
24
26
  UpdateModelAction
25
27
  } from '@eclipse-glsp/protocol';
28
+
26
29
  import { inject, injectable, optional } from 'inversify';
27
30
  import { CommandStack } from '../../command/command-stack';
28
31
  import { DiagramConfiguration, ServerLayoutKind } from '../../diagram/diagram-configuration';
29
32
  import { LayoutEngine } from '../layout/layout-engine';
33
+ import { ModelValidator } from '../validation/model-validator';
30
34
  import { GModelFactory } from './gmodel-factory';
31
35
  import { GModelSerializer } from './gmodel-serializer';
32
36
  import { ModelState } from './model-state';
@@ -52,6 +56,10 @@ export class ModelSubmissionHandler {
52
56
  @inject(CommandStack)
53
57
  protected commandStack: CommandStack;
54
58
 
59
+ @inject(ModelValidator)
60
+ @optional()
61
+ protected validator?: ModelValidator;
62
+
55
63
  /**
56
64
  * Returns a list of actions to update the client-side model, based on the specified <code>modelState</code>.
57
65
  *
@@ -101,6 +109,10 @@ export class ModelSubmissionHandler {
101
109
  if (!this.diagramConfiguration.needsClientLayout) {
102
110
  result.push(SetDirtyStateAction.create(this.commandStack.isDirty, { reason }));
103
111
  }
112
+ if (this.validator) {
113
+ const markers = await this.validator.validate([this.modelState.root], MarkersReason.LIVE);
114
+ result.push(SetMarkersAction.create(markers, { reason: MarkersReason.LIVE }));
115
+ }
104
116
  return result;
105
117
  }
106
118
 
@@ -14,7 +14,8 @@
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
16
  import { GModelElement } from '@eclipse-glsp/graph';
17
- import { Marker, MaybePromise } from '@eclipse-glsp/protocol';
17
+ import { Marker, MarkersReason, MaybePromise } from '@eclipse-glsp/protocol';
18
+ import { injectable } from 'inversify';
18
19
 
19
20
  export const ModelValidator = Symbol('ModelValidator');
20
21
 
@@ -28,7 +29,78 @@ export interface ModelValidator {
28
29
  * Validates the given list of {@link GModelElement}s and returns a list of {@link Marker}s.
29
30
  *
30
31
  * @param elements The list of {@link GModelElement} to validate.
31
- * @returns A list of {@link Marker}s for the validated {@link GModelElement}s.
32
+ * @param reason The reason for a validation request, such as "batch" or "live" validation.
33
+ * @return A list of {@link Marker}s for the validated {@link GModelElement}s.
32
34
  */
33
- validate(elements: GModelElement[]): MaybePromise<Marker[]>;
35
+ validate(elements: GModelElement[], reason?: string): MaybePromise<Marker[]>;
36
+ }
37
+
38
+ @injectable()
39
+ export abstract class AbstractModelValidator implements ModelValidator {
40
+ validate(elements: GModelElement[], reason: string): Marker[] {
41
+ const markers: Marker[] = [];
42
+ for (const element of elements) {
43
+ if (MarkersReason.LIVE === reason) {
44
+ markers.push(...this.doLiveValidation(element));
45
+ } else if (MarkersReason.BATCH === reason) {
46
+ markers.push(...this.doBatchValidation(element));
47
+ } else {
48
+ markers.push(...this.doValidationForCustomReason(element));
49
+ }
50
+ if (element.children) {
51
+ markers.push(...this.validate(element.children, reason));
52
+ }
53
+ }
54
+ return markers;
55
+ }
56
+
57
+ /**
58
+ * Perform the live validation rules for the given <code>element</code>.
59
+ *
60
+ * This will be invoked on start and after each operation for all elements.
61
+ * Thus, the validation should be rather inexpensive.
62
+ * There is no need to traverse through the children in this method as {@link #validate(List, String)} will invoke
63
+ * this method for all children anyway.
64
+ *
65
+ * @param element The element to validate.
66
+ * @return A list of {@link Marker}s for the validated {@link GModelElement}.
67
+ */
68
+ doLiveValidation(element: GModelElement): Marker[] {
69
+ return [];
70
+ }
71
+
72
+ /**
73
+ * Perform the batch validation rules for the given <code>element</code>.
74
+ *
75
+ * <p>
76
+ * This will be invoked on demand by the client.
77
+ * Thus, the validation can include more expensive validation rules.
78
+ * There is no need to traverse through the children in this method as {@link #validate(List, String)} will invoke
79
+ * this method for all children anyway.
80
+ * </p>
81
+ *
82
+ * @param element The element to validate.
83
+ * @return A list of {@link Marker}s for the validated {@link GModelElement}.
84
+ */
85
+ doBatchValidation(element: GModelElement): Marker[] {
86
+ return [];
87
+ }
88
+
89
+ /**
90
+ * Perform a validation for a custom <code>reason</code> with the given <code>element</code>.
91
+ *
92
+ * <p>
93
+ * GLSP editors may add custom reasons for triggering a validation, other than <code>live</code> and
94
+ * <code>batch</code>.
95
+ * Validation requests that are not live or batch validations will be handled by this method.
96
+ * There is no need to traverse through the children in this method as {@link #validate(List, String)} will invoke
97
+ * this method for all children anyway.
98
+ * </p>
99
+ *
100
+ * @param element The element to validate.
101
+ * @return A list of {@link Marker}s for the validated {@link GModelElement}.
102
+ */
103
+ doValidationForCustomReason(element: GModelElement): Marker[] {
104
+ return [];
105
+ }
34
106
  }
@@ -13,8 +13,7 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { GGraph } from '@eclipse-glsp/graph';
17
- import { Action, Marker, RequestMarkersAction, SetMarkersAction } from '@eclipse-glsp/protocol';
16
+ import { Action, MarkersReason, RequestMarkersAction, SetMarkersAction } from '@eclipse-glsp/protocol';
18
17
  import { inject, injectable, optional } from 'inversify';
19
18
  import { ActionHandler } from '../../actions/action-handler';
20
19
  import { GLSPServerError } from '../../utils/glsp-server-error';
@@ -38,14 +37,9 @@ export class RequestMarkersHandler implements ActionHandler {
38
37
  elementIDs = [this.modelState.root.id];
39
38
  }
40
39
 
41
- let markers: Marker[] = [];
42
- const currentModelIndex = this.modelState.index;
43
- for (const elementID of elementIDs) {
44
- const modelElement = currentModelIndex.findByClass(elementID, GGraph);
45
- if (modelElement) {
46
- markers = markers.concat(await this.validator.validate([modelElement]));
47
- }
48
- }
40
+ const modelElements = this.modelState.index.getAll(elementIDs);
41
+ const markers = await this.validator.validate(modelElements, action.reason ?? MarkersReason.BATCH);
42
+
49
43
  return [SetMarkersAction.create(markers)];
50
44
  }
51
45
  }
@@ -74,9 +74,7 @@ export * from './operations/create-operation-handler';
74
74
  export * from './operations/operation-action-handler';
75
75
  export * from './operations/operation-handler';
76
76
  export * from './operations/operation-handler-registry';
77
- export * from './protocol/glsp-client-proxy';
78
77
  export * from './protocol/glsp-server';
79
- export * from './protocol/glsp-server-listener';
80
78
  export * from './session/client-session';
81
79
  export * from './session/client-session-factory';
82
80
  export * from './session/client-session-initializer';
@@ -84,6 +82,7 @@ export * from './session/client-session-listener';
84
82
  export * from './session/client-session-manager';
85
83
  export * from './utils/args-util';
86
84
  export * from './utils/client-options-util';
85
+ export * from './utils/console-logger';
87
86
  export * from './utils/glsp-server-error';
88
87
  export * from './utils/layout-util';
89
88
  export * from './utils/logger';
@@ -33,9 +33,9 @@ export abstract class GLSPServerLauncher<T> implements Disposable {
33
33
  this._modules.push(serverModule, ...additionalModules);
34
34
  }
35
35
 
36
- createContainer(): Container {
36
+ createContainer(...additionalModules: ContainerModule[]): Container {
37
37
  const container = this.parentContainer ? this.parentContainer.createChild() : new Container();
38
- container.load(...this._modules);
38
+ container.load(...this._modules, ...additionalModules);
39
39
  return container;
40
40
  }
41
41
 
@@ -0,0 +1,95 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2023 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the Eclipse Public License v. 2.0 which is available at
6
+ * http://www.eclipse.org/legal/epl-2.0.
7
+ *
8
+ * This Source Code may also be made available under the following Secondary
9
+ * Licenses when the conditions for such availability set forth in the Eclipse
10
+ * Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ * with the GNU Classpath Exception which is available at
12
+ * https://www.gnu.org/software/classpath/license.html.
13
+ *
14
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
+ ********************************************************************************/
16
+
17
+ import {
18
+ Disposable,
19
+ GLSPClientProxy,
20
+ GLSPServer,
21
+ JsonrpcClientProxy,
22
+ JsonrpcGLSPClient,
23
+ configureClientConnection
24
+ } from '@eclipse-glsp/protocol';
25
+ import { Container, ContainerModule, inject, injectable } from 'inversify';
26
+ import * as jsonrpc from 'vscode-jsonrpc';
27
+ import { Logger } from '../utils/logger';
28
+ import { GLSPServerLauncher } from './glsp-server-launcher';
29
+
30
+ export const START_UP_COMPLETE_MSG = '[GLSP-Server]:Startup completed. Accepting requests on port:';
31
+
32
+ export interface JsonRpcServerInstance {
33
+ server: GLSPServer;
34
+ clientConnection: jsonrpc.MessageConnection;
35
+ container: Container;
36
+ }
37
+
38
+ @injectable()
39
+ export abstract class JsonRpcGLSPServerLauncher<T> extends GLSPServerLauncher<T> {
40
+ @inject(Logger)
41
+ protected override logger: Logger;
42
+
43
+ protected serverInstances = new Map<jsonrpc.MessageConnection, JsonRpcServerInstance>();
44
+ protected startupCompleteMessage = START_UP_COMPLETE_MSG;
45
+
46
+ constructor() {
47
+ super();
48
+ this.toDispose.push(
49
+ Disposable.create(() => {
50
+ this.serverInstances.forEach(instance => this.disposeServerInstance(instance));
51
+ })
52
+ );
53
+ }
54
+
55
+ protected disposeServerInstance(instance: JsonRpcServerInstance): void {
56
+ this.serverInstances.delete(instance.clientConnection);
57
+ instance.server.shutdown();
58
+ instance.container.unbindAll();
59
+ instance.clientConnection.dispose();
60
+ }
61
+
62
+ protected createServerInstance(clientConnection: jsonrpc.MessageConnection): void {
63
+ const container = this.createContainer(this.createJsonRpcModule(clientConnection));
64
+ const server = container.get<GLSPServer>(GLSPServer);
65
+ const instance = { container, clientConnection, server };
66
+ this.serverInstances.set(clientConnection, instance);
67
+ this.configureClientConnection(instance);
68
+ }
69
+
70
+ protected createJsonRpcModule(clientConnection: jsonrpc.MessageConnection): ContainerModule {
71
+ return new ContainerModule(bind => {
72
+ bind(GLSPClientProxy).toDynamicValue(ctx => {
73
+ const proxy = ctx.container.resolve(JsonrpcClientProxy);
74
+ proxy.initialize(clientConnection);
75
+ return proxy;
76
+ });
77
+ });
78
+ }
79
+
80
+ protected configureClientConnection(serverInstance: JsonRpcServerInstance): void {
81
+ configureClientConnection(serverInstance.clientConnection, serverInstance.server);
82
+
83
+ serverInstance.clientConnection.onNotification(JsonrpcGLSPClient.ShutdownNotification, () =>
84
+ this.disposeServerInstance(serverInstance)
85
+ );
86
+
87
+ this.logger.info('Starting GLSP server connection');
88
+ }
89
+
90
+ protected createClientProxy(serverInstance: JsonRpcServerInstance): GLSPClientProxy {
91
+ const proxy = serverInstance.container.resolve(JsonrpcClientProxy);
92
+ proxy.initialize(serverInstance.clientConnection);
93
+ return proxy;
94
+ }
95
+ }
@@ -13,7 +13,13 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { DisposeClientSessionParameters, InitializeClientSessionParameters, InitializeParameters } from '@eclipse-glsp/protocol';
16
+ import {
17
+ DisposeClientSessionParameters,
18
+ GLSPClientProxy,
19
+ GLSPServerListener,
20
+ InitializeClientSessionParameters,
21
+ InitializeParameters
22
+ } from '@eclipse-glsp/protocol';
17
23
  import { expect } from 'chai';
18
24
  import { Container, ContainerModule } from 'inversify';
19
25
  import * as sinon from 'sinon';
@@ -21,9 +27,7 @@ import { GlobalActionProvider } from '../actions/global-action-provider';
21
27
  import { ClientSessionManager } from '../session/client-session-manager';
22
28
  import * as mock from '../test/mock-util';
23
29
  import { Logger } from '../utils/logger';
24
- import { GLSPClientProxy, JsonRpcGLSPClientProxy } from './glsp-client-proxy';
25
30
  import { DefaultGLSPServer } from './glsp-server';
26
- import { GLSPServerListener } from './glsp-server-listener';
27
31
  import assert = require('assert');
28
32
 
29
33
  describe('test DefaultGLSPServer', () => {
@@ -48,7 +52,6 @@ describe('test DefaultGLSPServer', () => {
48
52
  new ContainerModule(bind => {
49
53
  bind(Logger).toConstantValue(new mock.StubLogger());
50
54
  bind(GLSPClientProxy).toConstantValue(new mock.StubGLSPClientProxy());
51
- bind(JsonRpcGLSPClientProxy).toConstantValue(new mock.StubGLSPClientProxy());
52
55
  bind(ClientSessionManager).toConstantValue(sessionManager);
53
56
  bind(GlobalActionProvider).toConstantValue({ clientActionKinds: new Map<string, string[]>(), serverActionKinds });
54
57
  bind(GLSPServerListener).toConstantValue(listener1);