@lwc/lwc-dev-server 10.2.1 → 10.3.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.
Files changed (61) hide show
  1. package/README.md +0 -6
  2. package/dist/bin.js +31 -0
  3. package/dist/bin.js.map +1 -0
  4. package/dist/server/bundler/lexBundler.spec.d.ts +1 -0
  5. package/dist/server/bundler/lexBundler.spec.js +71 -0
  6. package/dist/server/bundler/lexBundler.spec.js.map +1 -0
  7. package/dist/server/connection/client.d.ts +2 -19
  8. package/dist/server/connection/client.js +3 -40
  9. package/dist/server/connection/client.js.map +1 -1
  10. package/dist/server/connection/client.spec.d.ts +1 -0
  11. package/dist/server/connection/client.spec.js +107 -0
  12. package/dist/server/connection/client.spec.js.map +1 -0
  13. package/dist/server/connection/connection.d.ts +1 -1
  14. package/dist/server/connection/connection.js +4 -12
  15. package/dist/server/connection/connection.js.map +1 -1
  16. package/dist/server/connection/connection.spec.d.ts +1 -0
  17. package/dist/server/connection/connection.spec.js +60 -0
  18. package/dist/server/connection/connection.spec.js.map +1 -0
  19. package/dist/server/connection/web-socket-server.d.ts +10 -8
  20. package/dist/server/connection/web-socket-server.js +80 -51
  21. package/dist/server/connection/web-socket-server.js.map +1 -1
  22. package/dist/server/connection/web-socket-server.spec.d.ts +1 -0
  23. package/dist/server/connection/web-socket-server.spec.js +174 -0
  24. package/dist/server/connection/web-socket-server.spec.js.map +1 -0
  25. package/dist/server/index.d.ts +6 -18
  26. package/dist/server/index.js +33 -111
  27. package/dist/server/index.js.map +1 -1
  28. package/dist/server/index.spec.d.ts +1 -0
  29. package/dist/server/index.spec.js +98 -0
  30. package/dist/server/index.spec.js.map +1 -0
  31. package/dist/server/moduleGraph/index.js +19 -20
  32. package/dist/server/moduleGraph/index.js.map +1 -1
  33. package/dist/server/moduleGraph/index.spec.d.ts +1 -0
  34. package/dist/server/moduleGraph/index.spec.js +70 -0
  35. package/dist/server/moduleGraph/index.spec.js.map +1 -0
  36. package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.d.ts +1 -0
  37. package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.js +22 -0
  38. package/dist/server/moduleGraph/workspaceScanner/__tests__/sfcli.spec.js.map +1 -0
  39. package/dist/server/util/fileUtil.d.ts +0 -1
  40. package/dist/server/util/fileUtil.js +2 -10
  41. package/dist/server/util/fileUtil.js.map +1 -1
  42. package/dist/server/watcher/index.spec.d.ts +1 -0
  43. package/dist/server/watcher/index.spec.js +33 -0
  44. package/dist/server/watcher/index.spec.js.map +1 -0
  45. package/dist/types/devServer.d.ts +1 -2
  46. package/dist/types/devServer.js +1 -7
  47. package/dist/types/devServer.js.map +1 -1
  48. package/dist/utils/utils.test.d.ts +1 -0
  49. package/dist/utils/utils.test.js +49 -0
  50. package/dist/utils/utils.test.js.map +1 -0
  51. package/package.json +3 -7
  52. package/bin/dev-server.js +0 -2
  53. package/dist/cli/cli.js +0 -4
  54. package/dist/cli/cli.js.map +0 -1
  55. package/dist/cli/commands/devServer.d.ts +0 -2
  56. package/dist/cli/commands/devServer.js +0 -188
  57. package/dist/cli/commands/devServer.js.map +0 -1
  58. package/dist/cli/commands/index.d.ts +0 -2
  59. package/dist/cli/commands/index.js +0 -21
  60. package/dist/cli/commands/index.js.map +0 -1
  61. /package/dist/{cli/cli.d.ts → bin.d.ts} +0 -0
package/README.md CHANGED
@@ -1,7 +1 @@
1
1
  # LWC Development Server
2
-
3
- ## Usage
4
-
5
- - To start the development server
6
- - `npm install -g @lwc/lwc-dev-server`
7
- - `lwc-dev-server start -p 8081 -c ./lwc.config.json` from your project directory.
package/dist/bin.js ADDED
@@ -0,0 +1,31 @@
1
+ import path from 'path';
2
+ import { parseArgs } from 'node:util';
3
+ import { startLwcDevServer } from './server/index.js';
4
+ import { LogLevel, Workspace } from './types/index.js';
5
+ const { values: { 'root-dir': rootDir, paths, port }, } = parseArgs({
6
+ args: process.argv.slice(2),
7
+ options: {
8
+ port: {
9
+ type: 'string',
10
+ },
11
+ [`root-dir`]: {
12
+ type: 'string',
13
+ },
14
+ paths: {
15
+ type: 'string',
16
+ multiple: true,
17
+ },
18
+ },
19
+ });
20
+ if (!rootDir)
21
+ throw new Error(`root-dir is required`);
22
+ if (!paths)
23
+ throw new Error(`paths is required`);
24
+ startLwcDevServer({
25
+ rootDir,
26
+ logLevel: LogLevel.debug,
27
+ paths: paths.map((p) => path.join(rootDir, p)),
28
+ port: +(port || 50182),
29
+ workspace: Workspace.Internal,
30
+ });
31
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,EACF,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAC/C,GAAG,SAAS,CAAC;IACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE;QACL,IAAI,EAAE;YACF,IAAI,EAAE,QAAQ;SACjB;QACD,CAAC,UAAU,CAAC,EAAE;YACV,IAAI,EAAE,QAAQ;SACjB;QACD,KAAK,EAAE;YACH,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;SACjB;KACJ;CACJ,CAAC,CAAC;AACH,IAAI,CAAC,OAAO;IAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACtD,IAAI,CAAC,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;AACjD,iBAAiB,CAAC;IACd,OAAO;IACP,QAAQ,EAAE,QAAQ,CAAC,KAAK;IACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC,QAAQ;CAChC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import { compile as platformCompile } from '@lwc/sfdc-lwc-compiler';
2
+ import { Workspace } from '../../types/index';
3
+ import { compile } from './lexBundler';
4
+ vi.mock('@lwc/sfdc-lwc-compiler');
5
+ describe('compile', () => {
6
+ let mockCtx;
7
+ let mockLogger;
8
+ const mockModulePath = 'src/modules/myModule';
9
+ const mockTransformOptions = {
10
+ enableDynamicComponents: true,
11
+ enableLightningWebSecurityTransforms: true,
12
+ experimentalComplexExpressions: true,
13
+ apiVersion: 50,
14
+ name: 'myModule',
15
+ namespace: 'c',
16
+ };
17
+ beforeEach(() => {
18
+ mockLogger = {
19
+ log: vi.fn(),
20
+ };
21
+ mockCtx = {
22
+ config: {
23
+ workspace: Workspace.Internal,
24
+ },
25
+ moduleGraph: {
26
+ getModuleFiles: vi.fn().mockReturnValue(['file1', 'file2']),
27
+ },
28
+ };
29
+ vi.clearAllMocks();
30
+ });
31
+ it('should compile successfully and return code and warnings', async () => {
32
+ const mockResult = {
33
+ success: true,
34
+ results: [
35
+ {
36
+ code: 'compiled code',
37
+ map: '',
38
+ imports: [],
39
+ diagnostics: [],
40
+ outputConfig: {
41
+ minify: false,
42
+ sourcemap: false,
43
+ lockerConfig: {},
44
+ env: { NODE_ENV: 'dev' },
45
+ },
46
+ timings: {},
47
+ },
48
+ ],
49
+ diagnostics: [],
50
+ timings: {},
51
+ version: '1',
52
+ };
53
+ vi.mocked(platformCompile).mockResolvedValue(mockResult);
54
+ const result = await compile(mockCtx, mockModulePath, mockTransformOptions, mockLogger);
55
+ expect(platformCompile).toHaveBeenCalledWith(expect.any(Object));
56
+ expect(result.code).toBe('compiled code');
57
+ expect(result.warnings).toEqual([]);
58
+ });
59
+ it('should return undefined code and warnings when compilation fails', async () => {
60
+ vi.mocked(platformCompile).mockResolvedValue({
61
+ success: false,
62
+ results: [],
63
+ diagnostics: [],
64
+ version: '1',
65
+ timings: {},
66
+ });
67
+ const result = await compile(mockCtx, mockModulePath, mockTransformOptions, mockLogger);
68
+ expect(result.code).toBeUndefined();
69
+ });
70
+ });
71
+ //# sourceMappingURL=lexBundler.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexBundler.spec.js","sourceRoot":"","sources":["../../../src/server/bundler/lexBundler.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIvC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAElC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,IAAI,OAAyB,CAAC;IAC9B,IAAI,UAAkB,CAAC;IACvB,MAAM,cAAc,GAAG,sBAAsB,CAAC;IAC9C,MAAM,oBAAoB,GAAqB;QAC3C,uBAAuB,EAAE,IAAI;QAC7B,oCAAoC,EAAE,IAAI;QAC1C,8BAA8B,EAAE,IAAI;QACpC,UAAU,EAAE,EAAE;QACd,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,GAAG;KACjB,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACZ,UAAU,GAAG;YACT,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;SACM,CAAC;QAEvB,OAAO,GAAG;YACN,MAAM,EAAE;gBACJ,SAAS,EAAE,SAAS,CAAC,QAAQ;aAChC;YACD,WAAW,EAAE;gBACT,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aAC9D;SAC2B,CAAC;QAEjC,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,UAAU,GAAG;YACf,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,eAAe;oBACrB,GAAG,EAAE,EAAE;oBACP,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,EAAE;oBACf,YAAY,EAAE;wBACV,MAAM,EAAE,KAAK;wBACb,SAAS,EAAE,KAAK;wBAChB,YAAY,EAAE,EAAE;wBAChB,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;qBAC3B;oBACD,OAAO,EAAE,EAAE;iBACd;aACJ;YACD,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,GAAG;SACf,CAAC;QACF,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAExF,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAC9E,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,iBAAiB,CAAC;YACzC,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAExF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,7 +1,6 @@
1
- import * as Websocket from 'ws';
2
1
  import { DevServerContext } from '../../types/devServer.js';
3
2
  import { Connection } from './connection.js';
4
- import type { HMR_Data, HMR_Data_Update } from '@lwc/lwc-dev-server-types';
3
+ import type { HMR_Data } from '@lwc/lwc-dev-server-types';
5
4
  import type { TransformOptions } from '@lwc/compiler';
6
5
  /**
7
6
  * Class representing a client that has connected to the dev server.
@@ -16,6 +15,7 @@ export declare class Client {
16
15
  connection: Connection;
17
16
  ctx: DevServerContext;
18
17
  constructor(clientId: string, url: string, connection: Connection, ctx: DevServerContext);
18
+ onClose(callback: () => void): void;
19
19
  addActivePaths(paths: {
20
20
  modulePath: string;
21
21
  compileOptions: TransformOptions;
@@ -26,20 +26,3 @@ export declare class Client {
26
26
  messageCallback(data: HMR_Data): Promise<void>;
27
27
  close(): void;
28
28
  }
29
- /**
30
- * Class to manage all connected clients.
31
- * This serves as a manager of clients with routines to broadcast updates, reset clients.
32
- */
33
- export declare class ClientPool {
34
- socketToClientMap: Map<Websocket.WebSocket, Client>;
35
- clientToSocketMap: Map<Client, Websocket.WebSocket>;
36
- addClient(ws: Websocket.WebSocket, client: Client): void;
37
- removeClient(client: Client): void;
38
- /**
39
- * Broad case to all clients of an available module update.
40
- * @param message
41
- */
42
- sendModuleUpdateBroadcast(message: HMR_Data_Update): void;
43
- reset(): void;
44
- size(): number;
45
- }
@@ -23,6 +23,9 @@ export class Client {
23
23
  this.connection.receive(this.messageCallback.bind(this));
24
24
  this.ctx = ctx;
25
25
  }
26
+ onClose(callback) {
27
+ this.connection.onClose(callback);
28
+ }
26
29
  addActivePaths(paths) {
27
30
  paths.forEach(({ modulePath, compileOptions }) => {
28
31
  const existing = this.activePaths.get(modulePath);
@@ -116,44 +119,4 @@ export class Client {
116
119
  this.connection.close();
117
120
  }
118
121
  }
119
- /**
120
- * Class to manage all connected clients.
121
- * This serves as a manager of clients with routines to broadcast updates, reset clients.
122
- */
123
- export class ClientPool {
124
- constructor() {
125
- this.socketToClientMap = new Map();
126
- this.clientToSocketMap = new Map();
127
- }
128
- addClient(ws, client) {
129
- this.socketToClientMap.set(ws, client);
130
- this.clientToSocketMap.set(client, ws);
131
- }
132
- removeClient(client) {
133
- const socket = this.clientToSocketMap.get(client);
134
- if (socket) {
135
- this.socketToClientMap.delete(socket);
136
- this.clientToSocketMap.delete(client);
137
- }
138
- }
139
- /**
140
- * Broad case to all clients of an available module update.
141
- * @param message
142
- */
143
- sendModuleUpdateBroadcast(message) {
144
- for (const client of this.clientToSocketMap.keys()) {
145
- client.send(message);
146
- }
147
- }
148
- reset() {
149
- for (const client of this.clientToSocketMap.keys()) {
150
- client.close();
151
- }
152
- this.socketToClientMap.clear();
153
- this.clientToSocketMap.clear();
154
- }
155
- size() {
156
- return this.clientToSocketMap.size;
157
- }
158
- }
159
122
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/server/connection/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/server/connection/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,107 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { LogLevel, Workspace } from '../../types/serverConfig';
3
+ import { compile } from '../bundler/lexBundler.js';
4
+ import { Client } from './client';
5
+ vi.mock('../bundler/lexBundler.js');
6
+ describe('Client', () => {
7
+ let client;
8
+ let mockConnection;
9
+ let mockCtx;
10
+ let mockConfig;
11
+ const mockClientId = 'client-id';
12
+ const mockUrl = 'http://localhost';
13
+ const mockModuleGraph = {
14
+ getFileByModulePath: vi.fn(),
15
+ registerActivePaths: vi.fn(),
16
+ getModuleBoundary: vi.fn(),
17
+ };
18
+ const mockLogger = {
19
+ log: vi.fn(),
20
+ };
21
+ beforeEach(() => {
22
+ mockConnection = {
23
+ send: vi.fn(),
24
+ receive: vi.fn(),
25
+ onClose: vi.fn(),
26
+ close: vi.fn(),
27
+ };
28
+ mockConfig = {
29
+ logLevel: LogLevel.debug,
30
+ paths: [],
31
+ port: 50182,
32
+ rootDir: '',
33
+ workspace: Workspace.Internal,
34
+ };
35
+ mockCtx = {
36
+ config: mockConfig,
37
+ logger: mockLogger,
38
+ moduleGraph: mockModuleGraph,
39
+ };
40
+ vi.mocked(compile).mockResolvedValue({ code: 'code', warnings: [] });
41
+ client = new Client(mockClientId, mockUrl, mockConnection, mockCtx);
42
+ });
43
+ it('should initialize correctly', () => {
44
+ expect(client.clientId).toBe(mockClientId);
45
+ expect(client.url).toBe(mockUrl);
46
+ expect(client.connection).toBe(mockConnection);
47
+ expect(client.ctx).toBe(mockCtx);
48
+ expect(mockConnection.receive).toHaveBeenCalled();
49
+ });
50
+ it('should add active paths', () => {
51
+ const paths = [{ modulePath: 'path1', compileOptions: {} }];
52
+ client.addActivePaths(paths);
53
+ expect(client.activePaths.get('path1')).toEqual(paths[0].compileOptions);
54
+ });
55
+ it('should not override existing active paths', () => {
56
+ const initialPath = 'path1';
57
+ const paths = [{ modulePath: initialPath, compileOptions: {} }];
58
+ client.addActivePaths(paths);
59
+ const newPaths = [{ modulePath: initialPath, compileOptions: {} }];
60
+ client.addActivePaths(newPaths);
61
+ expect(client.activePaths.get(initialPath)).toEqual(paths[0].compileOptions);
62
+ });
63
+ it('should remove stale paths', () => {
64
+ const paths = [{ modulePath: 'path1', compileOptions: {} }];
65
+ client.addActivePaths(paths);
66
+ client.removeStalePaths(['path1']);
67
+ expect(client.activePaths.has('path1')).toBe(false);
68
+ });
69
+ it('should send data when allowed', () => {
70
+ const data = { type: 'update', data: [] };
71
+ client.send(data);
72
+ expect(mockConnection.send).toHaveBeenCalledWith(data);
73
+ });
74
+ it('should not send data when type is not allowed', () => {
75
+ const data = { type: 'not-allowed', data: [] };
76
+ client.send(data);
77
+ expect(mockCtx.logger.log).toHaveBeenCalledWith(LogLevel.debug, `[LWC Dev Server] Blocking unexpected type of data being sent from server to hmr-client 'not-allowed'`);
78
+ expect(mockConnection.send).not.toHaveBeenCalled();
79
+ });
80
+ it('should handle fetch message correctly', async () => {
81
+ const data = { type: 'fetch', data: { modulePath: 'path1' } };
82
+ mockModuleGraph.getFileByModulePath.mockReturnValue('file1');
83
+ client.getCompileOptions = vi.fn().mockReturnValue({});
84
+ await client.messageCallback(data);
85
+ expect(mockCtx.logger.log).toHaveBeenCalledWith(LogLevel.debug, `[LWC Dev Server] Compiling path1`);
86
+ expect(mockConnection.send).toHaveBeenCalled();
87
+ });
88
+ it('should handle register message correctly', async () => {
89
+ const data = {
90
+ type: 'register',
91
+ data: { modules: [{ modulePath: 'path1', compileOptions: {}, hash: '0' }] },
92
+ };
93
+ mockModuleGraph.registerActivePaths.mockReturnValue(['path1']);
94
+ mockModuleGraph.getModuleBoundary.mockReturnValue('boundary1');
95
+ await client.messageCallback(data);
96
+ expect(client.activePaths.get('path1')).toEqual({});
97
+ expect(mockConnection.send).toHaveBeenCalledWith({
98
+ type: 'update',
99
+ data: [{ modulePath: 'boundary1' }],
100
+ });
101
+ });
102
+ it('should close the connection', () => {
103
+ client.close();
104
+ expect(mockConnection.close).toHaveBeenCalled();
105
+ });
106
+ });
107
+ //# sourceMappingURL=client.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.spec.js","sourceRoot":"","sources":["../../../src/server/connection/client.spec.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export declare class Connection {
10
10
  logger: Logger;
11
11
  constructor(socket: Websocket.WebSocket, logger: Logger);
12
12
  close(): void;
13
- isReady(): boolean;
13
+ onClose(callback: () => void): void;
14
14
  send(data: HMR_Data): void;
15
15
  receive(callback: (data: HMR_Data) => void): void;
16
16
  }
@@ -18,27 +18,19 @@ export class Connection {
18
18
  close() {
19
19
  this.socket.close();
20
20
  }
21
- isReady() {
22
- return this.socket.readyState === this.socket.OPEN;
21
+ onClose(callback) {
22
+ this.socket.on('close', callback);
23
23
  }
24
24
  send(data) {
25
- if (this.isReady()) {
26
- this.socket.send(JSON.stringify(data));
27
- }
25
+ this.socket.send(JSON.stringify(data));
28
26
  }
29
27
  receive(callback) {
30
- if (!this.isReady()) {
31
- this.logger.log(LogLevel.debug, 'Connection not ready to receive data from server.');
32
- return;
33
- }
34
28
  this.socket.addEventListener('message', ({ data }) => {
35
29
  if (typeof data === 'string') {
36
- const payload = JSON.parse(data);
37
- callback(payload);
30
+ callback(JSON.parse(data));
38
31
  }
39
32
  else {
40
33
  this.logger.log(LogLevel.error, UNRECOGNIZED_MESSAGE_TYPE);
41
- this.socket.close();
42
34
  }
43
35
  });
44
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/server/connection/connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAe,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;GAGG;AACH,MAAM,OAAO,UAAU;IAGnB,YAAY,MAA2B,EAAE,MAAc;QACnD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,IAAc;QACf,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IAED,OAAO,CAAC,QAAkC;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,mDAAmD,CAAC,CAAC;YACrF,OAAO;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAA0B,EAAE,EAAE;YACzE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,QAAQ,CAAC,OAAmB,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/server/connection/connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAe,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;GAGG;AACH,MAAM,OAAO,UAAU;IAGnB,YAAY,MAA2B,EAAE,MAAc;QACnD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,QAAoB;QACxB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,IAAc;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,QAAkC;QACtC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAA0B,EAAE,EAAE;YACzE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { LogLevel } from '../../types/index.js';
3
+ import { UNRECOGNIZED_MESSAGE_TYPE } from '../../labels.js';
4
+ import { Connection } from './connection.js';
5
+ describe('Connection', () => {
6
+ let mockSocket;
7
+ let mockLogger;
8
+ let connection;
9
+ beforeEach(() => {
10
+ mockSocket = {
11
+ close: vi.fn(),
12
+ on: vi.fn(),
13
+ send: vi.fn(),
14
+ addEventListener: vi.fn(),
15
+ };
16
+ mockLogger = {
17
+ log: vi.fn(),
18
+ };
19
+ connection = new Connection(mockSocket, mockLogger);
20
+ });
21
+ afterEach(() => {
22
+ vi.clearAllMocks();
23
+ });
24
+ it('should close the WebSocket connection', () => {
25
+ connection.close();
26
+ expect(mockSocket.close).toHaveBeenCalled();
27
+ });
28
+ it('should register a close event listener', () => {
29
+ const closeCallback = vi.fn();
30
+ connection.onClose(closeCallback);
31
+ expect(mockSocket.on).toHaveBeenCalledWith('close', closeCallback);
32
+ });
33
+ it('should send data over the WebSocket connection', () => {
34
+ const mockData = { type: 'register', data: { modules: [] } };
35
+ connection.send(mockData);
36
+ expect(mockSocket.send).toHaveBeenCalledWith(JSON.stringify(mockData));
37
+ });
38
+ it('should receive data from the WebSocket connection', () => {
39
+ const mockMessageEvent = {
40
+ data: JSON.stringify({ type: 'mockType', data: {} }),
41
+ };
42
+ const receiveCallback = vi.fn();
43
+ connection.receive(receiveCallback);
44
+ const addEventListenerCall = vi.mocked(mockSocket).addEventListener.mock.calls[0];
45
+ const eventListener = addEventListenerCall[1];
46
+ eventListener(mockMessageEvent);
47
+ expect(receiveCallback).toHaveBeenCalledWith({ type: 'mockType', data: {} });
48
+ });
49
+ it('should log an error for unrecognized message types', () => {
50
+ const mockMessageEvent = {
51
+ data: new ArrayBuffer(8), // Non-string data to simulate unrecognized message type
52
+ };
53
+ connection.receive(vi.fn());
54
+ const addEventListenerCall = vi.mocked(mockSocket).addEventListener.mock.calls[0];
55
+ const eventListener = addEventListenerCall[1];
56
+ eventListener(mockMessageEvent);
57
+ expect(mockLogger.log).toHaveBeenCalledWith(LogLevel.error, UNRECOGNIZED_MESSAGE_TYPE);
58
+ });
59
+ });
60
+ //# sourceMappingURL=connection.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.spec.js","sourceRoot":"","sources":["../../../src/server/connection/connection.spec.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
- import { WebSocketServer } from 'ws';
2
1
  import { Logger, ServerConfig } from '../../types/index.js';
2
+ import { Connection } from './connection.js';
3
3
  /**
4
- * Start a WebSocketServer.
5
- *
6
- * Note: Based on examples in the ws git repo: https://github.com/websockets/ws/blob/master/examples/express-session-parse/index.js
7
- * @param param0
8
- * @param logger
9
- * @returns
4
+ * Wrapper over WebSocketServer that does authentication and produces `Connection`s
10
5
  */
11
- export declare function startWebSocketServer({ port, https: httpsConfig }: ServerConfig, logger: Logger): WebSocketServer;
6
+ export declare class AuthenticatedWebSocketServer {
7
+ private logger;
8
+ private wss;
9
+ identityToken: string | undefined;
10
+ constructor({ port, https: httpsConfig, identityToken }: ServerConfig, logger: Logger);
11
+ close(): void;
12
+ onNewConnection(callback: (connection: Connection, url: string) => void): void;
13
+ }