@hydranium/data-client-theia 1.0.0-next.14 → 1.0.0-next.140

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 (59) hide show
  1. package/README.md +33 -29
  2. package/lib/browser/channel-connection.d.ts +2 -2
  3. package/lib/browser/channel-data-port.d.ts +65 -0
  4. package/lib/browser/channel-data-port.d.ts.map +1 -0
  5. package/lib/browser/channel-data-port.js +115 -0
  6. package/lib/browser/channel-data-port.js.map +1 -0
  7. package/lib/browser/data-session-stop-contribution.d.ts +64 -0
  8. package/lib/browser/data-session-stop-contribution.d.ts.map +1 -0
  9. package/lib/browser/data-session-stop-contribution.js +117 -0
  10. package/lib/browser/data-session-stop-contribution.js.map +1 -0
  11. package/lib/browser/index.d.ts +2 -3
  12. package/lib/browser/index.d.ts.map +1 -1
  13. package/lib/browser/index.js +2 -3
  14. package/lib/browser/index.js.map +1 -1
  15. package/lib/common/emitter-data-client.d.ts +13 -1
  16. package/lib/common/emitter-data-client.d.ts.map +1 -1
  17. package/lib/common/emitter-data-client.js +18 -0
  18. package/lib/common/emitter-data-client.js.map +1 -1
  19. package/lib/node/connection-container-module.d.ts +5 -4
  20. package/lib/node/connection-container-module.d.ts.map +1 -1
  21. package/lib/node/connection-container-module.js +5 -4
  22. package/lib/node/connection-container-module.js.map +1 -1
  23. package/lib/node/data-server-connection-handler.d.ts +14 -9
  24. package/lib/node/data-server-connection-handler.d.ts.map +1 -1
  25. package/lib/node/data-server-connection-handler.js +5 -12
  26. package/lib/node/data-server-connection-handler.js.map +1 -1
  27. package/lib/node/index.d.ts +0 -1
  28. package/lib/node/index.d.ts.map +1 -1
  29. package/lib/node/index.js +0 -1
  30. package/lib/node/index.js.map +1 -1
  31. package/package.json +13 -12
  32. package/src/browser/channel-connection.ts +2 -2
  33. package/src/browser/channel-data-port.ts +100 -0
  34. package/src/browser/data-session-stop-contribution.ts +117 -0
  35. package/src/browser/index.ts +2 -3
  36. package/src/common/emitter-data-client.ts +27 -0
  37. package/src/node/connection-container-module.ts +5 -4
  38. package/src/node/data-server-connection-handler.ts +15 -14
  39. package/src/node/index.ts +0 -1
  40. package/lib/browser/data-service-frontend.d.ts +0 -154
  41. package/lib/browser/data-service-frontend.d.ts.map +0 -1
  42. package/lib/browser/data-service-frontend.js +0 -169
  43. package/lib/browser/data-service-frontend.js.map +0 -1
  44. package/lib/browser/diagnostics-data-service-frontend.d.ts +0 -35
  45. package/lib/browser/diagnostics-data-service-frontend.d.ts.map +0 -1
  46. package/lib/browser/diagnostics-data-service-frontend.js +0 -54
  47. package/lib/browser/diagnostics-data-service-frontend.js.map +0 -1
  48. package/lib/browser/references-data-service-frontend.d.ts +0 -45
  49. package/lib/browser/references-data-service-frontend.d.ts.map +0 -1
  50. package/lib/browser/references-data-service-frontend.js +0 -55
  51. package/lib/browser/references-data-service-frontend.js.map +0 -1
  52. package/lib/node/socket-channel-forwarder.d.ts +0 -34
  53. package/lib/node/socket-channel-forwarder.d.ts.map +0 -1
  54. package/lib/node/socket-channel-forwarder.js +0 -63
  55. package/lib/node/socket-channel-forwarder.js.map +0 -1
  56. package/src/browser/data-service-frontend.ts +0 -208
  57. package/src/browser/diagnostics-data-service-frontend.ts +0 -70
  58. package/src/browser/references-data-service-frontend.ts +0 -70
  59. package/src/node/socket-channel-forwarder.ts +0 -64
@@ -24,11 +24,12 @@ import { ContainerModule, type interfaces } from '@theia/core/shared/inversify';
24
24
  *
25
25
  * **More than one handler is the normal case, not an exotic one.** Theia keys a
26
26
  * frontend channel by its service path and refuses a second channel on a path
27
- * already open, so every frontend abstraction reaching the data head needs its
28
- * own path and therefore its own handler — a host-neutral `DataPort` beside a
29
- * Theia `AbstractDataServiceFrontend` is exactly that shape. They still forward
27
+ * already open, so every frontend abstraction reaching the data head on its own
28
+ * channel needs its own path and therefore its own handler. They still forward
30
29
  * to the SAME data server: the path distinguishes the channel, the shared
31
- * `portCommand` names the one process behind it.
30
+ * `portCommand` names the one process behind it. Several participants over ONE
31
+ * channel need no second handler — that is what `DataConnection`'s sessions are
32
+ * for, and it is the cheaper arrangement.
32
33
  */
33
34
  export declare function createDataServerConnectionContainerModule(...handlerClasses: interfaces.Newable<ConnectionHandler>[]): ContainerModule;
34
35
  //# sourceMappingURL=connection-container-module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection-container-module.d.ts","sourceRoot":"","sources":["../../src/node/connection-container-module.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yCAAyC,CAAC,GAAG,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,GAAG,eAAe,CAerI"}
1
+ {"version":3,"file":"connection-container-module.d.ts","sourceRoot":"","sources":["../../src/node/connection-container-module.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yCAAyC,CAAC,GAAG,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,GAAG,eAAe,CAerI"}
@@ -28,11 +28,12 @@ const inversify_1 = require("@theia/core/shared/inversify");
28
28
  *
29
29
  * **More than one handler is the normal case, not an exotic one.** Theia keys a
30
30
  * frontend channel by its service path and refuses a second channel on a path
31
- * already open, so every frontend abstraction reaching the data head needs its
32
- * own path and therefore its own handler — a host-neutral `DataPort` beside a
33
- * Theia `AbstractDataServiceFrontend` is exactly that shape. They still forward
31
+ * already open, so every frontend abstraction reaching the data head on its own
32
+ * channel needs its own path and therefore its own handler. They still forward
34
33
  * to the SAME data server: the path distinguishes the channel, the shared
35
- * `portCommand` names the one process behind it.
34
+ * `portCommand` names the one process behind it. Several participants over ONE
35
+ * channel need no second handler — that is what `DataConnection`'s sessions are
36
+ * for, and it is the cheaper arrangement.
36
37
  */
37
38
  function createDataServerConnectionContainerModule(...handlerClasses) {
38
39
  const frontendScopedConnectionModule = connection_container_module_1.ConnectionContainerModule.create(({ bind }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"connection-container-module.js","sourceRoot":"","sources":["../../src/node/connection-container-module.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;AA4BlF,8FAeC;AAzCD,sCAAgD;AAChD,4GAAuG;AACvG,4DAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,yCAAyC,CAAC,GAAG,cAAuD;IACjH,MAAM,8BAA8B,GAAG,uDAAyB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QAClF,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;YAC/C,mEAAmE;YACnE,mEAAmE;YACnE,oEAAoE;YACpE,IAAI,CAAC,wBAAiB,CAAC;iBACnB,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;iBAC9D,gBAAgB,EAAE,CAAC;QAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,2BAAe,CAAC,IAAI,CAAC,EAAE;QAC/B,IAAI,CAAC,uDAAyB,CAAC,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"connection-container-module.js","sourceRoot":"","sources":["../../src/node/connection-container-module.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;AA6BlF,8FAeC;AA1CD,sCAAgD;AAChD,4GAAuG;AACvG,4DAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAgB,yCAAyC,CAAC,GAAG,cAAuD;IACjH,MAAM,8BAA8B,GAAG,uDAAyB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QAClF,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;YAC/C,mEAAmE;YACnE,mEAAmE;YACnE,oEAAoE;YACpE,IAAI,CAAC,wBAAiB,CAAC;iBACnB,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;iBAC9D,gBAAgB,EAAE,CAAC;QAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,2BAAe,CAAC,IAAI,CAAC,EAAE;QAC/B,IAAI,CAAC,uDAAyB,CAAC,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -7,7 +7,6 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  import { AbstractSocketForwardingConnectionHandler } from '@hydranium/client-theia/lib/node';
10
- import { type Channel, type Disposable } from '@theia/core';
11
10
  import type * as net from 'node:net';
12
11
  /** Options for {@link DataServerConnectionHandler}. `servicePath` is the Theia
13
12
  * service path the browser frontend opens a channel to; `portCommand` is the
@@ -25,6 +24,16 @@ export interface DataServerConnectionHandlerOptions {
25
24
  * Defaults to the framework `DATA_SERVER_PORT_COMMAND`; override to match
26
25
  * an adopter's established id. */
27
26
  readonly portCommand?: string;
27
+ /**
28
+ * Product name for the connect-failure dialog this handler raises.
29
+ *
30
+ * It reaches the adopter's UI verbatim, so the framework default leaks a
31
+ * framework noun into a product that is not ours. Not a translation concern —
32
+ * routing it through a catalogue would ask an adopter to "translate" English
33
+ * into their own product name, and would make their branding
34
+ * locale-dependent.
35
+ */
36
+ readonly serverName?: string;
28
37
  readonly findPortTimeout?: number;
29
38
  readonly findPortAttempts?: number;
30
39
  readonly connectTimeoutMs?: number;
@@ -41,16 +50,12 @@ export interface DataServerConnectionHandlerOptions {
41
50
  * Bridges a Theia browser-frontend channel to a data-server's TCP socket — the
42
51
  * backend half of the data-server head's transport.
43
52
  *
44
- * The port-discovery + buffer-and-replay race fix + connect orchestration live
45
- * on the cross-head {@link AbstractSocketForwardingConnectionHandler} base; this
46
- * subclass supplies only the data-server defaults (service path / port command /
47
- * log labels) and plugs in {@link SocketChannelForwarder} as the byte relay —
48
- * its own forwarder, so the data head carries no GLSP dependency. Sibling of
49
- * `@hydranium/glsp-client-theia`'s `GlspServerConnectionHandler`, which
50
- * subclasses the same base with `@eclipse-glsp`'s `SocketConnectionForwarder`.
53
+ * The port discovery, the buffer-and-replay race fix, the connect orchestration
54
+ * and the byte forwarder live on the cross-head
55
+ * {@link AbstractSocketForwardingConnectionHandler} base; this subclass supplies
56
+ * only the data-server defaults (service path / port command / log labels).
51
57
  */
52
58
  export declare class DataServerConnectionHandler extends AbstractSocketForwardingConnectionHandler {
53
59
  constructor(options?: DataServerConnectionHandlerOptions);
54
- protected forwardToSocketConnection(clientChannel: Channel, socket: net.Socket): Disposable;
55
60
  }
56
61
  //# sourceMappingURL=data-server-connection-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-server-connection-handler.d.ts","sourceRoot":"","sources":["../../src/node/data-server-connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,yCAAyC,EAAE,MAAM,kCAAkC,CAAC;AAE7F,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAGrC;;;;kBAIkB;AAClB,MAAM,WAAW,kCAAkC;IAChD;;;;yDAIqD;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;uCAEmC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED;;;;;;;;;;;GAWG;AACH,qBACa,2BAA4B,SAAQ,yCAAyC;gBAC9D,OAAO,GAAE,kCAAuC;IAazE,SAAS,CAAC,yBAAyB,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,UAAU;CAG7F"}
1
+ {"version":3,"file":"data-server-connection-handler.d.ts","sourceRoot":"","sources":["../../src/node/data-server-connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,yCAAyC,EAAE,MAAM,kCAAkC,CAAC;AAG7F,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC;;;;kBAIkB;AAClB,MAAM,WAAW,kCAAkC;IAChD;;;;yDAIqD;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;uCAEmC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED;;;;;;;;GAQG;AACH,qBACa,2BAA4B,SAAQ,yCAAyC;gBAC9D,OAAO,GAAE,kCAAuC;CAY3E"}
@@ -24,18 +24,14 @@ exports.DataServerConnectionHandler = void 0;
24
24
  const node_1 = require("@hydranium/client-theia/lib/node");
25
25
  const protocol_1 = require("@hydranium/protocol");
26
26
  const inversify_1 = require("@theia/core/shared/inversify");
27
- const socket_channel_forwarder_1 = require("./socket-channel-forwarder");
28
27
  /**
29
28
  * Bridges a Theia browser-frontend channel to a data-server's TCP socket — the
30
29
  * backend half of the data-server head's transport.
31
30
  *
32
- * The port-discovery + buffer-and-replay race fix + connect orchestration live
33
- * on the cross-head {@link AbstractSocketForwardingConnectionHandler} base; this
34
- * subclass supplies only the data-server defaults (service path / port command /
35
- * log labels) and plugs in {@link SocketChannelForwarder} as the byte relay —
36
- * its own forwarder, so the data head carries no GLSP dependency. Sibling of
37
- * `@hydranium/glsp-client-theia`'s `GlspServerConnectionHandler`, which
38
- * subclasses the same base with `@eclipse-glsp`'s `SocketConnectionForwarder`.
31
+ * The port discovery, the buffer-and-replay race fix, the connect orchestration
32
+ * and the byte forwarder live on the cross-head
33
+ * {@link AbstractSocketForwardingConnectionHandler} base; this subclass supplies
34
+ * only the data-server defaults (service path / port command / log labels).
39
35
  */
40
36
  let DataServerConnectionHandler = class DataServerConnectionHandler extends node_1.AbstractSocketForwardingConnectionHandler {
41
37
  constructor(options = {}) {
@@ -43,16 +39,13 @@ let DataServerConnectionHandler = class DataServerConnectionHandler extends node
43
39
  path: options.servicePath ?? protocol_1.DATA_SERVER_PATH,
44
40
  portCommand: options.portCommand ?? protocol_1.DATA_SERVER_PORT_COMMAND,
45
41
  logComponent: 'DataServer',
46
- serverName: 'Model Server',
42
+ serverName: options.serverName ?? 'Model Server',
47
43
  findPortTimeout: options.findPortTimeout,
48
44
  findPortAttempts: options.findPortAttempts,
49
45
  connectTimeoutMs: options.connectTimeoutMs,
50
46
  onSocketCreated: options.onSocketCreated
51
47
  });
52
48
  }
53
- forwardToSocketConnection(clientChannel, socket) {
54
- return new socket_channel_forwarder_1.SocketChannelForwarder(clientChannel, socket);
55
- }
56
49
  };
57
50
  exports.DataServerConnectionHandler = DataServerConnectionHandler;
58
51
  exports.DataServerConnectionHandler = DataServerConnectionHandler = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"data-server-connection-handler.js","sourceRoot":"","sources":["../../src/node/data-server-connection-handler.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;AAElF,2DAA6F;AAC7F,kDAAiF;AAEjF,4DAAqE;AAErE,yEAAoE;AA+BpE;;;;;;;;;;;GAWG;AAEI,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,gDAAyC;IACvF,YAAyB,UAA8C,EAAE;QACtE,KAAK,CAAC;YACH,IAAI,EAAE,OAAO,CAAC,WAAW,IAAI,2BAAgB;YAC7C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,mCAAwB;YAC5D,YAAY,EAAE,YAAY;YAC1B,UAAU,EAAE,cAAc;YAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,eAAe,EAAE,OAAO,CAAC,eAAe;SAC1C,CAAC,CAAC;IACN,CAAC;IAES,yBAAyB,CAAC,aAAsB,EAAE,MAAkB;QAC3E,OAAO,IAAI,iDAAsB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;CACH,CAAA;AAjBY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,sBAAU,GAAE;IAEG,WAAA,IAAA,qBAAS,GAAE,CAAA;;GADd,2BAA2B,CAiBvC"}
1
+ {"version":3,"file":"data-server-connection-handler.js","sourceRoot":"","sources":["../../src/node/data-server-connection-handler.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;AAElF,2DAA6F;AAC7F,kDAAiF;AACjF,4DAAqE;AA0CrE;;;;;;;;GAQG;AAEI,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,gDAAyC;IACvF,YAAyB,UAA8C,EAAE;QACtE,KAAK,CAAC;YACH,IAAI,EAAE,OAAO,CAAC,WAAW,IAAI,2BAAgB;YAC7C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,mCAAwB;YAC5D,YAAY,EAAE,YAAY;YAC1B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,cAAc;YAChD,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,eAAe,EAAE,OAAO,CAAC,eAAe;SAC1C,CAAC,CAAC;IACN,CAAC;CACH,CAAA;AAbY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,sBAAU,GAAE;IAEG,WAAA,IAAA,qBAAS,GAAE,CAAA;;GADd,2BAA2B,CAavC"}
@@ -9,5 +9,4 @@
9
9
  export * from './connection-container-module';
10
10
  export * from './data-server-connection-handler';
11
11
  export * from './host-diagnostics-server';
12
- export * from './socket-channel-forwarder';
13
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC"}
package/lib/node/index.js CHANGED
@@ -25,5 +25,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
25
25
  __exportStar(require("./connection-container-module"), exports);
26
26
  __exportStar(require("./data-server-connection-handler"), exports);
27
27
  __exportStar(require("./host-diagnostics-server"), exports);
28
- __exportStar(require("./socket-channel-forwarder"), exports);
29
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;;AAElF,gEAA8C;AAC9C,mEAAiD;AACjD,4DAA0C;AAC1C,6DAA2C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;;AAElF,gEAA8C;AAC9C,mEAAiD;AACjD,4DAA0C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hydranium/data-client-theia",
3
- "version": "1.0.0-next.14",
3
+ "version": "1.0.0-next.140",
4
4
  "description": "Theia-coupled client primitives for the hydranium data-server protocol head; companion of @hydranium/data-server. Bridges framework typed errors (e.g. ConflictError) across Theia's RPC boundary so their code + data survive the wire.",
5
5
  "keywords": [
6
6
  "hydranium",
@@ -70,11 +70,11 @@
70
70
  "watch": "tsc -b -w --preserveWatchOutput"
71
71
  },
72
72
  "devDependencies": {
73
- "@hydranium/client-theia": "1.0.0-next.14",
74
- "@hydranium/core": "1.0.0-next.14",
75
- "@hydranium/protocol": "1.0.0-next.14",
76
- "@theia/core": "^1.71.0",
77
- "@theia/workspace": "^1.71.0",
73
+ "@hydranium/client-theia": "1.0.0-next.140",
74
+ "@hydranium/core": "1.0.0-next.140",
75
+ "@hydranium/protocol": "1.0.0-next.140",
76
+ "@theia/core": "^1.70.0",
77
+ "@theia/workspace": "^1.70.0",
78
78
  "@types/node": "^22.0.0",
79
79
  "inversify": "6.2.2",
80
80
  "reflect-metadata": "0.2.2",
@@ -83,13 +83,13 @@
83
83
  "vscode-jsonrpc": "9.0.1"
84
84
  },
85
85
  "peerDependencies": {
86
- "@hydranium/client-theia": "1.0.0-next.14",
87
- "@hydranium/core": "1.0.0-next.14",
88
- "@hydranium/protocol": "1.0.0-next.14",
89
- "@theia/core": "^1.71.0",
90
- "@theia/workspace": "^1.71.0",
86
+ "@hydranium/client-theia": "1.0.0-next.140",
87
+ "@hydranium/core": "1.0.0-next.140",
88
+ "@hydranium/protocol": "1.0.0-next.140",
89
+ "@theia/core": "^1.70.0",
90
+ "@theia/workspace": "^1.70.0",
91
91
  "inversify": "^6.0.0",
92
- "vscode-jsonrpc": "^8.0.0 || ^9.0.0"
92
+ "vscode-jsonrpc": "9.0.1"
93
93
  },
94
94
  "engines": {
95
95
  "node": ">=22.13"
@@ -97,5 +97,6 @@
97
97
  "publishConfig": {
98
98
  "access": "public"
99
99
  },
100
+ "//peerDependencies": "`vscode-jsonrpc` is EXACT rather than a range, because it is one link of an atomic chain with no independently movable link: `vscode-languageserver-protocol` depends on it at exactly 9.0.1, so any other value an adopter supplies is a SECOND physical copy rather than an upgrade. This wire stack breaks on copy identity rather than on structure — `ParameterStructures.auto` is a singleton compared by `===` in connection.js, so a request type built by one copy and sent over a connection owned by the other throws `Unknown parameter structure auto`. A caret or union range was rejected because npm then resolves a `vscode-jsonrpc@8.2.0` tree SILENTLY, with no diagnostic at all, and the failure surfaces only later at server init. Exact does not fail the install either — npm downgrades an unsatisfiable peer to a warning — but it is a NAMED ERESOLVE warning printing the required version beside the found one, and a hard error for anyone installing with `--strict-peer-deps`. It does NOT prevent a NESTED copy — `@eclipse-glsp/*` carries its own exact `vscode-jsonrpc@8.2.0` dependency and root `overrides` do not ship — so a consumer of the GLSP head must pin the chain in its own manifest, and docs/adopting/requirements.md carries the block to paste.",
100
101
  "//prepack": "The publish guard, and it deliberately is NOT a `prepare`: npm runs a workspace `prepare` BEFORE the root `postinstall` that applies patches/vscode-jsonrpc+9.0.1.patch, so building there fails on a cold clone and npm rolls the entire install back. `prepack` runs only when a tarball is made (`npm pack`, `npm publish`) and never on install, so it cannot break the install it has no business touching. It FAILS rather than rebuilds, because the rebuild is exactly the part that ordering defeats. What it defends against: `files` lists `lib`, `lib` is gitignored, and a `files` entry matching nothing is skipped SILENTLY — so `npm publish` from an unbuilt tree emits a tarball of `src` and nothing else, with no error."
101
102
  }
@@ -199,8 +199,8 @@ export interface ChannelConnectionHandle {
199
199
  /**
200
200
  * The current connection. Read it per use rather than caching it: after a
201
201
  * reconnect this returns a NEW promise, and a cached one resolves to the
202
- * dead connection forever. The same reasoning makes
203
- * `AbstractDataServiceFrontend` rebuild its proxy rather than hold one.
202
+ * dead connection forever. The same reasoning makes `RpcConnection` rebuild
203
+ * its proxy per generation rather than hold one.
204
204
  */
205
205
  readonly current: Promise<MessageConnection>;
206
206
 
@@ -0,0 +1,100 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import { renderFrameworkMessage, type DataPort, type ResolvedMessage } from '@hydranium/protocol';
11
+ import { Emitter, MessageService, nls, type Event } from '@theia/core';
12
+ import { type ServiceConnectionProvider } from '@theia/core/lib/browser';
13
+ import { RemoteConnectionProvider } from '@theia/core/lib/browser/messaging/service-connection-provider';
14
+ import { inject, injectable } from '@theia/core/shared/inversify';
15
+ import { WorkspaceService } from '@theia/workspace/lib/browser';
16
+ import type { MessageConnection } from 'vscode-jsonrpc';
17
+ import { type ChannelConnectionHandle, openChannelConnection } from './channel-connection';
18
+ import { whenWorkspaceOpen } from './workspace-gate';
19
+
20
+ /**
21
+ * A {@link DataPort} over a Theia frontend channel.
22
+ *
23
+ * Subclasses supply {@link servicePath}; everything above the port —
24
+ * `DataConnection`, its sessions, and whatever model a widget drives — is
25
+ * host-neutral and shared with the VS Code and browser shells.
26
+ *
27
+ * Bind one per service path and in singleton scope. Theia keys a frontend
28
+ * channel by its path and refuses a second on a path already open, and the
29
+ * throw escapes the `openChannelConnection` the loser is awaiting, leaving that
30
+ * promise unsettled rather than rejected.
31
+ */
32
+ @injectable()
33
+ export abstract class ChannelDataPort implements DataPort {
34
+ @inject(RemoteConnectionProvider) protected readonly connectionProvider!: ServiceConnectionProvider;
35
+ @inject(WorkspaceService) protected readonly workspaceService!: WorkspaceService;
36
+ @inject(MessageService) protected readonly messageService!: MessageService;
37
+
38
+ /** Frontend service path the backend forwarder for this head is registered under. */
39
+ protected abstract readonly servicePath: string;
40
+
41
+ /**
42
+ * Re-open the channel when the current connection is lost. Default `true` —
43
+ * re-opening is the only thing that recovers a restarted language server,
44
+ * which binds new ephemeral ports. Turn it off for a frontend that tears
45
+ * itself down on transport loss instead.
46
+ */
47
+ protected readonly reconnectOnConnectionLoss: boolean = true;
48
+
49
+ protected readonly disposeEmitter = new Emitter<void>();
50
+ readonly onDispose: Event<void> = this.disposeEmitter.event;
51
+
52
+ protected handle?: ChannelConnectionHandle;
53
+
54
+ /**
55
+ * Open the workspace-gated channel and hand back its listening connection.
56
+ *
57
+ * Gated because the backend forwarder discovers the head's port by executing
58
+ * a command the language server answers, and the language server only
59
+ * launches once there is a workspace to launch it for. Asking earlier polls
60
+ * a command nobody has registered.
61
+ */
62
+ connect(): Promise<MessageConnection> {
63
+ // Read per call rather than cached: `current` is repointed at a fresh
64
+ // promise every time the channel is re-opened, so reading through the
65
+ // handle is what makes a later generation reach the live server.
66
+ if (!this.handle) {
67
+ this.handle = openChannelConnection(this.connectionProvider, this.servicePath, {
68
+ whenReady: whenWorkspaceOpen(this.workspaceService),
69
+ reconnect: this.reconnectOnConnectionLoss
70
+ });
71
+ // A relaunched server binds new ephemeral ports; the handle re-opens
72
+ // and the forwarder rediscovers, but `DataConnection` caches its
73
+ // generation and would go on addressing the dead one. Its signal to
74
+ // drop that generation is this event.
75
+ this.handle.onDidLoseConnection(() => this.disposeEmitter.fire(undefined));
76
+ }
77
+ return this.handle.current;
78
+ }
79
+
80
+ /**
81
+ * Surface a transport or write failure as a Theia notification.
82
+ *
83
+ * Swallowing it is the failure this exists to prevent: a dead connection and
84
+ * an empty document are indistinguishable in a widget.
85
+ *
86
+ * `reported` is already a complete sentence with the detail interpolated, so
87
+ * wrapping it in a sentence of the host's own would nest one owner's clause
88
+ * inside another's and leave no translator in control of the whole.
89
+ */
90
+ reportError(_error: unknown, reported: ResolvedMessage): void {
91
+ this.messageService.error(renderFrameworkMessage(reported, nls.localization?.translations));
92
+ }
93
+
94
+ dispose(): void {
95
+ this.handle?.dispose();
96
+ this.handle = undefined;
97
+ this.disposeEmitter.fire(undefined);
98
+ this.disposeEmitter.dispose();
99
+ }
100
+ }
@@ -0,0 +1,117 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import type { DataConnection, DataServerProtocol, DataSession, DiagnosticOf, TransferElement } from '@hydranium/protocol';
11
+ // Type-only: the `@theia/core/lib/browser` barrel touches DOM globals at module
12
+ // load, which the node-environment unit tests cannot provide.
13
+ import type { FrontendApplicationContribution, OnWillStopAction } from '@theia/core/lib/browser';
14
+ import { injectable } from '@theia/core/shared/inversify';
15
+
16
+ /**
17
+ * Ends a Theia frontend's data sessions with its page, and holds the page
18
+ * while one of them is still saving. Bind it as a
19
+ * `FrontendApplicationContribution` in singleton scope and {@link track} each
20
+ * data connection the frontend binds, once.
21
+ *
22
+ * **Stop.** {@link onStop} disposes every tracked session, which sends its
23
+ * `closeSession`, so the server ends it as closed: each document it was the
24
+ * last to hold reverts at once. Otherwise the server learns of the page only
25
+ * when its connection goes, which Theia may hold open for its reconnect
26
+ * timeout, and then ends the sessions as lost, so their documents wait out the
27
+ * revert grace. The close is best effort: under load the page's last frames
28
+ * can be lost on the way, and the server then ends the sessions as lost. A
29
+ * session with calls still in flight at the stop closes after them, which is
30
+ * too late for a page going away, and is left to the server's connection-close
31
+ * cleanup. A call a session makes in the same tick as the stop is refused and
32
+ * never sent.
33
+ *
34
+ * **Veto.** While a tracked session has a save in flight, {@link onWillStop}
35
+ * vetoes, including a session disposed meanwhile. In Electron, Theia awaits
36
+ * the veto's action, which waits for the saves to answer, a save started during
37
+ * the wait included, up to {@link maxSettlePasses} times. The browser runs no
38
+ * action before unload, so there the veto shows the leave-page prompt and
39
+ * nothing more. Theia ignores every veto under
40
+ * `application.confirmExit: 'never'`, so there a save in flight at the stop
41
+ * may be cut off.
42
+ */
43
+ @injectable()
44
+ export class DataSessionStopContribution implements FrontendApplicationContribution {
45
+ /** The sessions to end at the stop, and to wait for while they save. */
46
+ protected readonly sessions = new Set<DataSession<TransferElement>>();
47
+ /**
48
+ * How many times the veto's action waits for the saves in flight before it
49
+ * lets the stop go. Each wait ends by the session's own bound, so a save
50
+ * that never answers holds the stop for a few bounds, not for good.
51
+ */
52
+ protected readonly maxSettlePasses: number = 3;
53
+
54
+ /**
55
+ * Take every session of `connection` into the stop: the ones it has
56
+ * started already, and each one it starts from now on. Generic, so a
57
+ * connection of any transfer root, server and client fits.
58
+ */
59
+ track<TTransfer extends TransferElement, TServer extends DataServerProtocol<TTransfer, DiagnosticOf<TServer>>, TClient extends object>(
60
+ connection: DataConnection<TTransfer, TServer, TClient>
61
+ ): void {
62
+ connection.liveSessions.forEach(session => this.trackSession(session));
63
+ connection.onDidCreateSession(session => this.trackSession(session));
64
+ }
65
+
66
+ /**
67
+ * Take `session` into the stop. It leaves once it has ended and its saves
68
+ * have answered, so a session disposed with a save in flight still holds
69
+ * the page.
70
+ */
71
+ protected trackSession(session: DataSession<TransferElement>): void {
72
+ this.sessions.add(session);
73
+ // A save can outlast the wait's bound, so the session stays until none
74
+ // is left in flight.
75
+ const release = (): void =>
76
+ void session.whenSavesSettled().then(() => (session.hasSavesInFlight ? release() : this.sessions.delete(session)));
77
+ // An ended session has fired its event already, and never fires it again.
78
+ if (session.isDisposed) {
79
+ release();
80
+ } else {
81
+ session.onDidDispose(release);
82
+ }
83
+ }
84
+
85
+ onWillStop(): OnWillStopAction | undefined {
86
+ if (this.savingSessions().length === 0) {
87
+ return undefined;
88
+ }
89
+ return {
90
+ // Theia logs the reason and shows it nowhere, so it is not translated.
91
+ reason: 'Data sessions are saving',
92
+ action: async () => {
93
+ // The page stays usable while Theia awaits this, so a save can
94
+ // start during a wait; each pass waits for the saves then in flight.
95
+ for (let pass = 0; pass < this.maxSettlePasses; pass++) {
96
+ const saving = this.savingSessions();
97
+ if (saving.length === 0) {
98
+ break;
99
+ }
100
+ await Promise.all(saving.map(session => session.whenSavesSettled()));
101
+ }
102
+ return true;
103
+ }
104
+ };
105
+ }
106
+
107
+ /** The tracked sessions with a save in flight. */
108
+ protected savingSessions(): DataSession<TransferElement>[] {
109
+ return [...this.sessions].filter(session => session.hasSavesInFlight);
110
+ }
111
+
112
+ onStop(): void {
113
+ for (const session of this.sessions) {
114
+ session.dispose();
115
+ }
116
+ }
117
+ }
@@ -8,8 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  export * from './channel-connection';
11
- export * from './data-service-frontend';
12
- export * from './diagnostics-data-service-frontend';
11
+ export * from './channel-data-port';
12
+ export * from './data-session-stop-contribution';
13
13
  export * from './host-diagnostics-frontend';
14
- export * from './references-data-service-frontend';
15
14
  export * from './workspace-gate';
@@ -12,7 +12,10 @@ import type {
12
12
  Project,
13
13
  ProjectsChangedEvent,
14
14
  TransferDiagnostic,
15
+ TransferDocumentDeletedEvent,
16
+ TransferDocumentDirtyChangedEvent,
15
17
  TransferDocumentSavedEvent,
18
+ TransferDocumentsBuiltEvent,
16
19
  TransferDocumentUpdatedEvent,
17
20
  TransferElement
18
21
  } from '@hydranium/protocol';
@@ -46,6 +49,18 @@ export class EmitterDataClient<
46
49
  /** Fires for each inbound {@link onDocumentSaved} notification. */
47
50
  readonly onDidSaveDocument: Event<TransferDocumentSavedEvent<TTransfer, TDiagnostic>> = this.onDocumentSavedEmitter.event;
48
51
 
52
+ protected readonly onDocumentDirtyChangedEmitter = new Emitter<TransferDocumentDirtyChangedEvent>();
53
+ /** Fires for each inbound {@link onDocumentDirtyChanged} notification. */
54
+ readonly onDidChangeDocumentDirty: Event<TransferDocumentDirtyChangedEvent> = this.onDocumentDirtyChangedEmitter.event;
55
+
56
+ protected readonly onDocumentDeletedEmitter = new Emitter<TransferDocumentDeletedEvent>();
57
+ /** Fires for each inbound {@link onDocumentDeleted} notification. */
58
+ readonly onDidDeleteDocument: Event<TransferDocumentDeletedEvent> = this.onDocumentDeletedEmitter.event;
59
+
60
+ protected readonly onDocumentsBuiltEmitter = new Emitter<TransferDocumentsBuiltEvent>();
61
+ /** Fires for each inbound {@link onDocumentsBuilt} notification. */
62
+ readonly onDidBuildDocuments: Event<TransferDocumentsBuiltEvent> = this.onDocumentsBuiltEmitter.event;
63
+
49
64
  protected readonly onProjectsChangedEmitter = new Emitter<ProjectsChangedEvent<TProject>>();
50
65
  /** Fires for each inbound {@link onProjectsChanged} notification. */
51
66
  readonly onDidChangeProjects: Event<ProjectsChangedEvent<TProject>> = this.onProjectsChangedEmitter.event;
@@ -58,6 +73,18 @@ export class EmitterDataClient<
58
73
  this.onDocumentSavedEmitter.fire(event);
59
74
  }
60
75
 
76
+ onDocumentDirtyChanged(event: TransferDocumentDirtyChangedEvent): void {
77
+ this.onDocumentDirtyChangedEmitter.fire(event);
78
+ }
79
+
80
+ onDocumentDeleted(event: TransferDocumentDeletedEvent): void {
81
+ this.onDocumentDeletedEmitter.fire(event);
82
+ }
83
+
84
+ onDocumentsBuilt(event: TransferDocumentsBuiltEvent): void {
85
+ this.onDocumentsBuiltEmitter.fire(event);
86
+ }
87
+
61
88
  onProjectsChanged(event: ProjectsChangedEvent<TProject>): void {
62
89
  this.onProjectsChangedEmitter.fire(event);
63
90
  }
@@ -27,11 +27,12 @@ import { ContainerModule, type interfaces } from '@theia/core/shared/inversify';
27
27
  *
28
28
  * **More than one handler is the normal case, not an exotic one.** Theia keys a
29
29
  * frontend channel by its service path and refuses a second channel on a path
30
- * already open, so every frontend abstraction reaching the data head needs its
31
- * own path and therefore its own handler — a host-neutral `DataPort` beside a
32
- * Theia `AbstractDataServiceFrontend` is exactly that shape. They still forward
30
+ * already open, so every frontend abstraction reaching the data head on its own
31
+ * channel needs its own path and therefore its own handler. They still forward
33
32
  * to the SAME data server: the path distinguishes the channel, the shared
34
- * `portCommand` names the one process behind it.
33
+ * `portCommand` names the one process behind it. Several participants over ONE
34
+ * channel need no second handler — that is what `DataConnection`'s sessions are
35
+ * for, and it is the cheaper arrangement.
35
36
  */
36
37
  export function createDataServerConnectionContainerModule(...handlerClasses: interfaces.Newable<ConnectionHandler>[]): ContainerModule {
37
38
  const frontendScopedConnectionModule = ConnectionContainerModule.create(({ bind }) => {
@@ -9,10 +9,8 @@
9
9
 
10
10
  import { AbstractSocketForwardingConnectionHandler } from '@hydranium/client-theia/lib/node';
11
11
  import { DATA_SERVER_PATH, DATA_SERVER_PORT_COMMAND } from '@hydranium/protocol';
12
- import { type Channel, type Disposable } from '@theia/core';
13
12
  import { injectable, unmanaged } from '@theia/core/shared/inversify';
14
13
  import type * as net from 'node:net';
15
- import { SocketChannelForwarder } from './socket-channel-forwarder';
16
14
 
17
15
  /** Options for {@link DataServerConnectionHandler}. `servicePath` is the Theia
18
16
  * service path the browser frontend opens a channel to; `portCommand` is the
@@ -30,6 +28,16 @@ export interface DataServerConnectionHandlerOptions {
30
28
  * Defaults to the framework `DATA_SERVER_PORT_COMMAND`; override to match
31
29
  * an adopter's established id. */
32
30
  readonly portCommand?: string;
31
+ /**
32
+ * Product name for the connect-failure dialog this handler raises.
33
+ *
34
+ * It reaches the adopter's UI verbatim, so the framework default leaks a
35
+ * framework noun into a product that is not ours. Not a translation concern —
36
+ * routing it through a catalogue would ask an adopter to "translate" English
37
+ * into their own product name, and would make their branding
38
+ * locale-dependent.
39
+ */
40
+ readonly serverName?: string;
33
41
  readonly findPortTimeout?: number;
34
42
  readonly findPortAttempts?: number;
35
43
  readonly connectTimeoutMs?: number;
@@ -47,13 +55,10 @@ export interface DataServerConnectionHandlerOptions {
47
55
  * Bridges a Theia browser-frontend channel to a data-server's TCP socket — the
48
56
  * backend half of the data-server head's transport.
49
57
  *
50
- * The port-discovery + buffer-and-replay race fix + connect orchestration live
51
- * on the cross-head {@link AbstractSocketForwardingConnectionHandler} base; this
52
- * subclass supplies only the data-server defaults (service path / port command /
53
- * log labels) and plugs in {@link SocketChannelForwarder} as the byte relay —
54
- * its own forwarder, so the data head carries no GLSP dependency. Sibling of
55
- * `@hydranium/glsp-client-theia`'s `GlspServerConnectionHandler`, which
56
- * subclasses the same base with `@eclipse-glsp`'s `SocketConnectionForwarder`.
58
+ * The port discovery, the buffer-and-replay race fix, the connect orchestration
59
+ * and the byte forwarder live on the cross-head
60
+ * {@link AbstractSocketForwardingConnectionHandler} base; this subclass supplies
61
+ * only the data-server defaults (service path / port command / log labels).
57
62
  */
58
63
  @injectable()
59
64
  export class DataServerConnectionHandler extends AbstractSocketForwardingConnectionHandler {
@@ -62,15 +67,11 @@ export class DataServerConnectionHandler extends AbstractSocketForwardingConnect
62
67
  path: options.servicePath ?? DATA_SERVER_PATH,
63
68
  portCommand: options.portCommand ?? DATA_SERVER_PORT_COMMAND,
64
69
  logComponent: 'DataServer',
65
- serverName: 'Model Server',
70
+ serverName: options.serverName ?? 'Model Server',
66
71
  findPortTimeout: options.findPortTimeout,
67
72
  findPortAttempts: options.findPortAttempts,
68
73
  connectTimeoutMs: options.connectTimeoutMs,
69
74
  onSocketCreated: options.onSocketCreated
70
75
  });
71
76
  }
72
-
73
- protected forwardToSocketConnection(clientChannel: Channel, socket: net.Socket): Disposable {
74
- return new SocketChannelForwarder(clientChannel, socket);
75
- }
76
77
  }
package/src/node/index.ts CHANGED
@@ -10,4 +10,3 @@
10
10
  export * from './connection-container-module';
11
11
  export * from './data-server-connection-handler';
12
12
  export * from './host-diagnostics-server';
13
- export * from './socket-channel-forwarder';