Skip to content

Commit edf7b01

Browse files
authored
refactor: move HandleMessage component to @asyncapi/generator-components (#1713)
Co-authored-by: Adi-204 <adiboghawala@gmail.com>
1 parent 187699b commit edf7b01

File tree

11 files changed

+168
-77
lines changed

11 files changed

+168
-77
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { MethodGenerator } from './MethodGenerator';
2+
3+
/**
4+
* @typedef {'python' | 'javascript' | 'dart'} Language
5+
* Supported programming languages.
6+
*/
7+
8+
/**
9+
* Configuration for WebSocket message handler method logic per language.
10+
* @type {Record<Language, { methodDocs?: string, methodLogic: string }>}
11+
*/
12+
const websocketHandleMessageConfig = {
13+
python: {
14+
methodLogic: `if len(self.message_handlers) == 0:
15+
print("\\033[94mReceived raw message:\\033[0m", message)
16+
else:
17+
for handler in self.message_handlers:
18+
handler(message)`
19+
},
20+
javascript: {
21+
methodDocs: '// Method to handle message with callback',
22+
methodLogic: 'if (cb) cb(message);'
23+
},
24+
dart: {
25+
methodDocs: '/// Method to handle message with callback',
26+
methodLogic: 'cb(message is String ? message : message.toString());'
27+
}
28+
};
29+
30+
/**
31+
* Renders a WebSocket message handler method with optional pre and post execution logic.
32+
*
33+
* @param {Object} props - Component props.
34+
* @param {Language} props.language - Programming language used for method formatting.
35+
* @param {string} props.methodName='handleMessage' - Name of the method to generate.
36+
* @param {string[]} props.methodParams=[] - List of parameters for the method.
37+
* @param {string} props.preExecutionCode - Code to insert before the main function logic.
38+
* @param {string} props.postExecutionCode - Code to insert after the main function logic.
39+
* @returns {JSX.Element} Rendered method block with appropriate formatting.
40+
*/
41+
export function HandleMessage({ language, methodName = 'handleMessage', methodParams = [], preExecutionCode = '', postExecutionCode = '' }) {
42+
const {
43+
methodDocs = '',
44+
methodLogic = ''
45+
} = websocketHandleMessageConfig[language];
46+
47+
return (
48+
<MethodGenerator
49+
language={language}
50+
methodName={methodName}
51+
methodParams={methodParams}
52+
methodDocs={methodDocs}
53+
methodLogic={methodLogic}
54+
preExecutionCode={preExecutionCode}
55+
postExecutionCode={postExecutionCode}
56+
indent={2}
57+
newLines={2}
58+
/>
59+
);
60+
}

packages/components/src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export { CloseConnection } from './components/CloseConnection';
44
export { DependencyProvider } from './components/DependencyProvider';
55
export { RegisterMessageHandler } from './components/RegisterMessageHandler';
66
export { MethodGenerator } from './components/MethodGenerator';
7+
export { HandleMessage } from './components/HandleMessage';
78
export { Connect } from './components/Connect';
89
export { OnOpen } from './components/OnOpen';
910
export { OnMessage } from './components/OnMessage';
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { render } from '@asyncapi/generator-react-sdk';
2+
import { HandleMessage } from '../../src/index';
3+
4+
describe('Testing of HandleMessage function', () => {
5+
test('render javascript websocket message handler method', () => {
6+
const result = render(
7+
<HandleMessage language='javascript' methodParams={['message','cb']} />
8+
);
9+
const actual = result.trim();
10+
expect(actual).toMatchSnapshot();
11+
});
12+
13+
test('render python websocket message handler method', () => {
14+
const result = render(
15+
<HandleMessage
16+
language="python"
17+
methodName='handle_message'
18+
methodParams={['self', 'message']}
19+
preExecutionCode='"""Pass the incoming message to all registered message handlers. """'
20+
/>
21+
);
22+
const actual = result.trim();
23+
expect(actual).toMatchSnapshot();
24+
});
25+
26+
test('render dart websocket message handler method', () => {
27+
const result = render(
28+
<HandleMessage
29+
language="dart"
30+
methodName="_handleMessage"
31+
methodParams={['dynamic message', 'void Function(String) cb']}
32+
/>
33+
);
34+
const actual = result.trim();
35+
expect(actual).toMatchSnapshot();
36+
});
37+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Testing of HandleMessage function render dart websocket message handler method 1`] = `
4+
"/// Method to handle message with callback
5+
void _handleMessage(dynamic message, void Function(String) cb) {
6+
cb(message is String ? message : message.toString());
7+
}"
8+
`;
9+
10+
exports[`Testing of HandleMessage function render javascript websocket message handler method 1`] = `
11+
"// Method to handle message with callback
12+
handleMessage(message, cb) {
13+
if (cb) cb(message);
14+
}"
15+
`;
16+
17+
exports[`Testing of HandleMessage function render python websocket message handler method 1`] = `
18+
"def handle_message(self, message) :
19+
\\"\\"\\"Pass the incoming message to all registered message handlers. \\"\\"\\"
20+
if len(self.message_handlers) == 0:
21+
print(\\"\\\\033[94mReceived raw message:\\\\033[0m\\", message)
22+
else:
23+
for handler in self.message_handlers:
24+
handler(message)"
25+
`;

packages/templates/clients/websocket/dart/components/ClientClass.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { Text } from '@asyncapi/generator-react-sdk';
22
import { Constructor } from './Constructor';
3-
import { HandleMessage } from './HandleMessage';
43
import { SendEchoMessage } from './SendEchoMessage';
5-
import { CloseConnection, RegisterMessageHandler, RegisterErrorHandler, Connect } from '@asyncapi/generator-components';
4+
import { CloseConnection, RegisterMessageHandler, RegisterErrorHandler, Connect, HandleMessage } from '@asyncapi/generator-components';
65
import { ClientFields } from './ClientFields';
76

87
export function ClientClass({ clientName, serverUrl, title }) {
@@ -22,7 +21,11 @@ export function ClientClass({ clientName, serverUrl, title }) {
2221
language="dart"
2322
methodParams={['void Function(Object) handler']}
2423
/>
25-
<HandleMessage />
24+
<HandleMessage
25+
language="dart"
26+
methodName="_handleMessage"
27+
methodParams={['dynamic message', 'void Function(String) cb']}
28+
/>
2629
<SendEchoMessage />
2730
<CloseConnection language="dart" />
2831
<Text>

packages/templates/clients/websocket/dart/components/HandleMessage.js

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

packages/templates/clients/websocket/javascript/components/ClientClass.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Text } from '@asyncapi/generator-react-sdk';
22
import { Constructor } from './Constructor';
3-
import { HandleMessage } from './HandleMessage';
4-
import { CloseConnection, RegisterMessageHandler, RegisterErrorHandler, SendOperations, Connect } from '@asyncapi/generator-components';
3+
import { CloseConnection, RegisterMessageHandler, RegisterErrorHandler, SendOperations, Connect, HandleMessage } from '@asyncapi/generator-components';
54
import { ModuleExport } from './ModuleExport';
65

76
export function ClientClass({ clientName, serverUrl, title, sendOperations}) {
@@ -20,7 +19,10 @@ export function ClientClass({ clientName, serverUrl, title, sendOperations}) {
2019
language="javascript"
2120
methodParams={['handler']}
2221
/>
23-
<HandleMessage />
22+
<HandleMessage
23+
language="javascript"
24+
methodParams={['message', 'cb']}
25+
/>
2426
<SendOperations
2527
language="javascript"
2628
sendOperations={sendOperations}

packages/templates/clients/websocket/javascript/components/HandleMessage.js

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

packages/templates/clients/websocket/python/components/ClientClass.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { Text } from '@asyncapi/generator-react-sdk';
22
import { getClientName, getServerUrl, getServer, getQueryParams, getTitle } from '@asyncapi/generator-helpers';
33
import { Send } from './Send';
44
import { Constructor } from './Constructor';
5-
import { HandleMessage } from './HandleMessage';
6-
import { CloseConnection, RegisterMessageHandler, RegisterErrorHandler, SendOperations, Connect } from '@asyncapi/generator-components';
5+
import { CloseConnection, RegisterMessageHandler, RegisterErrorHandler, SendOperations, Connect, HandleMessage } from '@asyncapi/generator-components';
76
import { RegisterOutgoingProcessor } from './RegisterOutgoingProcessor';
87
import { HandleError } from './HandleError';
98

@@ -35,7 +34,12 @@ export function ClientClass({ asyncapi, params }) {
3534
preExecutionCode='"""Register a callable to process errors."""'
3635
/>
3736
<RegisterOutgoingProcessor />
38-
<HandleMessage />
37+
<HandleMessage
38+
language="python"
39+
methodName='handle_message'
40+
methodParams={['self', 'message']}
41+
preExecutionCode='"""Pass the incoming message to all registered message handlers. """'
42+
/>
3943
<HandleError />
4044
<SendOperations
4145
language="python"

packages/templates/clients/websocket/python/components/HandleMessage.js

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

0 commit comments

Comments
 (0)