This repository has been archived by the owner on Oct 2, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathChannelParameterUnwrap.js
89 lines (82 loc) · 3.33 KB
/
ChannelParameterUnwrap.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { camelCase, castToTsType, realizeChannelNameWithoutParameters } from '../../utils/index';
// eslint-disable-next-line no-unused-vars
import { ChannelParameter } from '@asyncapi/parser';
/**
* Component which contains the parameter unwrapping functionality.
*
*
* Example
const unmodifiedChannel = `streetlight.{streetlight_id}.command.turnon`;
const channel = msg.subject;
const streetlightIdSplit = unmodifiedChannel.split("{streetlight_id}");
const splits = [
streetlightIdSplit[0],
streetlightIdSplit[1]
];
channel = channel.substring(splits[0].length);
const streetlightIdEnd = channel.indexOf(splits[1]);
const streetlightIdParam = "" + channel.substring(0, streetlightIdEnd);
*
*
* @param {string} channelName to be unwrapped
* @param {Object.<string, ChannelParameter>} channelParameters the parameters which are to be unwrapped from the NATS topic.
*/
export function unwrap(channelName, channelParameters) {
//Nothing to unwrap if no parameters are used
if (Object.keys(channelParameters).length === 0) {
return '';
}
let parameterSplit = '';
let prevParameterName = null;
//Create the parameter split operation which unwraps it one by one.
parameterSplit = Object.entries(channelParameters).map(([parameterName, _]) => {
let toReturn;
const parameterCamelCase = camelCase(parameterName);
if (prevParameterName) {
toReturn = `const ${parameterCamelCase}Split = ${prevParameterName}Split[1].split("${`{${parameterName}}`}");`;
} else {
toReturn = `const ${parameterCamelCase}Split = unmodifiedChannel.split("${`{${parameterName}}`}");`;
}
prevParameterName = parameterCamelCase;
return toReturn;
});
//Create the split array which contains the string between each parameter
let splits = '';
splits = Object.entries(channelParameters).map(([parameterName, _], index) => {
const parameterCamelCase = camelCase(parameterName);
// Check if we reached the end of the parameter list
if (index+1 === Object.keys(channelParameters).length) {
return `
${parameterCamelCase}Split[0],
${parameterCamelCase}Split[1]
`;
}
return `${parameterCamelCase}Split[0],`;
});
//Retrieve the actual parameters from the received NATS topic using the split array
prevParameterName = null;
let parameterReplacement = '';
parameterReplacement = Object.entries(channelParameters).map(([parameterName, parameter], index) => {
let channelSplit = `channel = channel.substring(${prevParameterName}End+splits[${index}].length);`;
// Overwrite the split if it is the first parameter
if (index === 0) {
channelSplit = `channel = channel.substring(splits[${index}].length);`;
}
prevParameterName = camelCase(parameterName);
const paramToCast = `channel.substring(0, ${prevParameterName}End)`;
return `
${channelSplit}
const ${prevParameterName}End = channel.indexOf(splits[${index+1}]);
const ${prevParameterName}Param = ${castToTsType(parameter.schema().type(), paramToCast)};
`;
});
return `
const unmodifiedChannel = ${realizeChannelNameWithoutParameters(channelName)};
let channel = msg.subject;
${parameterSplit.join('')}
const splits = [
${splits.join('')}
];
${parameterReplacement.join('')}
`;
}