1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var fs_1 = require("fs");
|
4 | var node_plantuml_1 = require("node-plantuml");
|
5 | var _1 = require(".");
|
6 | var util_1 = require("./util");
|
7 | function isValidDiagramConfiguration(toBeValidated) {
|
8 | if (typeof toBeValidated !== 'object' || toBeValidated === null) {
|
9 | return false;
|
10 | }
|
11 | var diagramConfiguration = toBeValidated;
|
12 | return (['boolean', 'undefined'].includes(typeof diagramConfiguration.hidePlaintext) &&
|
13 | (typeof diagramConfiguration.hiddenFields === 'undefined' ||
|
14 | util_1.isArrayOfStrings(diagramConfiguration.hiddenFields)));
|
15 | }
|
16 | exports.isValidDiagramConfiguration = isValidDiagramConfiguration;
|
17 | function getInputFile(scenario) {
|
18 | return _1.OUTPUT_DIR() + "/_" + scenario + ".input";
|
19 | }
|
20 | function getOutputFile(scenario) {
|
21 | return _1.OUTPUT_DIR() + "/_" + scenario + ".png";
|
22 | }
|
23 | var hidingText = '***';
|
24 | function hideFields(payload, hiddenFields) {
|
25 | return util_1.objectFromEntries(Object.entries(payload).map(function (_a) {
|
26 | var key = _a[0], value = _a[1];
|
27 | return hiddenFields.includes(key) ? [key, hidingText] : [key, value];
|
28 | }));
|
29 | }
|
30 | function hideFieldsIfNeeded(payload, hiddenFields) {
|
31 | return typeof payload === 'object' &&
|
32 | payload !== null &&
|
33 | hiddenFields !== undefined &&
|
34 | hiddenFields.length !== 0
|
35 | ? hideFields(payload, hiddenFields)
|
36 | : payload;
|
37 | }
|
38 | function hidePlaintextIfNeeded(payload, hidePlaintext) {
|
39 | if (hidePlaintext === void 0) { hidePlaintext = false; }
|
40 | return hidePlaintext ? hidingText : payload;
|
41 | }
|
42 | function formatBinaryPayload(payload) {
|
43 | return "binary data (" + payload.length + " bytes)";
|
44 | }
|
45 | function formatPlaintextPayload(payload, diagramConfiguration) {
|
46 | return util_1.trim(hidePlaintextIfNeeded(payload, diagramConfiguration.hidePlaintext), 30);
|
47 | }
|
48 | function formatObjectPayload(payload, diagramConfiguration) {
|
49 | return JSON.stringify(hideFieldsIfNeeded(payload, diagramConfiguration.hiddenFields), null, 1);
|
50 | }
|
51 | function formatPayload(payload, diagramConfiguration) {
|
52 | if (Buffer.isBuffer(payload)) {
|
53 | return formatBinaryPayload(payload);
|
54 | }
|
55 | if (typeof payload === 'string') {
|
56 | return formatPlaintextPayload(payload, diagramConfiguration);
|
57 | }
|
58 | return formatObjectPayload(payload, diagramConfiguration);
|
59 | }
|
60 | exports.formatPayload = formatPayload;
|
61 | function currentTimestamp() {
|
62 | return new Date().toISOString();
|
63 | }
|
64 | function quote(str) {
|
65 | return "\"" + str + "\"";
|
66 | }
|
67 | exports.initDiagramCreation = function (scenarioId) {
|
68 | fs_1.writeFileSync(getInputFile(scenarioId), '');
|
69 | var initValues = [
|
70 | '@startuml',
|
71 | 'autonumber',
|
72 | 'skinparam handwritten false',
|
73 | 'control MQTT',
|
74 | 'control AMQP',
|
75 | 'actor ALT #red\n',
|
76 | ];
|
77 | fs_1.appendFileSync(getInputFile(scenarioId), initValues.join('\n'));
|
78 | };
|
79 | exports.addRequest = function (scenarioId, target, url, data, diagramConfiguration) {
|
80 | var quotedTarget = quote(target);
|
81 | var request = "ALT -> " + quotedTarget + ": " + url + "\nactivate " + quotedTarget + "\n" + (data
|
82 | ? "note right\n**" + currentTimestamp() + "**\n" + formatPayload(data, diagramConfiguration) + "\nend note\n"
|
83 | : '');
|
84 | fs_1.appendFileSync(getInputFile(scenarioId), request);
|
85 | };
|
86 | exports.addSuccessfulResponse = function (scenarioId, source, status, body, diagramConfiguration) {
|
87 | doAddResponse(scenarioId, source, status, 'green');
|
88 | if (body) {
|
89 | var note = "note left\n**" + currentTimestamp() + "**\n" + formatPayload(body, diagramConfiguration) + "\nend note\n";
|
90 | fs_1.appendFileSync(getInputFile(scenarioId), note);
|
91 | }
|
92 | };
|
93 | exports.addFailedResponse = function (scenarioId, source, status, body, diagramConfiguration) {
|
94 | doAddResponse(scenarioId, source, status, 'red');
|
95 | fs_1.appendFileSync(getInputFile(scenarioId), "note right: <color red>" + formatPayload(body, diagramConfiguration) + "</color>\n||20||\n");
|
96 | };
|
97 | var doAddResponse = function (scenarioId, source, status, color) {
|
98 | var quotedSource = quote(source);
|
99 | fs_1.appendFileSync(getInputFile(scenarioId), quotedSource + " --> ALT: <color " + color + ">" + status + "</color>\ndeactivate " + quotedSource + "\n");
|
100 | };
|
101 | exports.addDelay = function (scenarioId, durationInSec) {
|
102 | fs_1.appendFileSync(getInputFile(scenarioId), "\n...sleep " + durationInSec + " s...\n");
|
103 | };
|
104 | exports.addWsMessage = function (scenarioId, source, payload, diagramConfiguration) {
|
105 | var quotedSource = quote(source);
|
106 | fs_1.appendFileSync(getInputFile(scenarioId), quotedSource + " -[#0000FF]->o ALT : [WS]\n");
|
107 | var note = "note left #aqua\n**" + currentTimestamp() + "**\n" + formatPayload(payload, diagramConfiguration) + "\nend note\n";
|
108 | fs_1.appendFileSync(getInputFile(scenarioId), note);
|
109 | };
|
110 | exports.addMqttMessage = function (scenarioId, topic, payload, diagramConfiguration) {
|
111 | fs_1.appendFileSync(getInputFile(scenarioId), "MQTT -[#green]->o ALT : " + topic + "\n");
|
112 | var note = "note right #99FF99\n**" + currentTimestamp() + "**\n" + formatPayload(payload, diagramConfiguration) + "\nend note\n";
|
113 | fs_1.appendFileSync(getInputFile(scenarioId), note);
|
114 | };
|
115 | exports.addMqttPublishMessage = function (scenarioId, topic, payload, diagramConfiguration) {
|
116 | fs_1.appendFileSync(getInputFile(scenarioId), "ALT -[#green]->o MQTT : " + topic + "\n");
|
117 | var note = "note left #99FF99\n**" + currentTimestamp() + "**\n" + formatPayload(JSON.parse(payload), diagramConfiguration) + "\nend note\n";
|
118 | fs_1.appendFileSync(getInputFile(scenarioId), note);
|
119 | };
|
120 | exports.addAMQPReceivedMessage = function (scenarioId, source, exchange, routingKey, payload, diagramConfiguration) {
|
121 | var quotedSource = quote(source);
|
122 | fs_1.appendFileSync(getInputFile(scenarioId), quotedSource + " -[#FF6600]->o ALT : " + exchange + "/" + routingKey + "\n");
|
123 | var note = "note left #FF6600\n**" + currentTimestamp() + "**\n" + formatPayload(payload, diagramConfiguration) + "\nend note\n";
|
124 | fs_1.appendFileSync(getInputFile(scenarioId), note);
|
125 | };
|
126 | exports.addMissingAMQPMessage = function (scenarioId, exchange, routingKey, expectedMessages, receivedMessages, errorMsg) {
|
127 | exports.addMissingAsyncMessage(scenarioId, exchange + "/" + routingKey, 'AMQP', expectedMessages, receivedMessages, errorMsg);
|
128 | };
|
129 | exports.addMissingMQTTMessage = function (scenarioId, topic, expectedMessages, receivedMessages, errorMsg) {
|
130 | exports.addMissingAsyncMessage(scenarioId, topic, 'MQTT', expectedMessages, receivedMessages, errorMsg);
|
131 | };
|
132 | exports.addMissingAsyncMessage = function (scenarioId, asyncInfo, source, expectedMessages, receivedMessages, errorMsg) {
|
133 | var quotedSource = quote(source);
|
134 | fs_1.appendFileSync(getInputFile(scenarioId), quotedSource + " -[#red]->x ALT : " + asyncInfo + "\n\n ");
|
135 | var note = "note right #FF0000\n**" + currentTimestamp() + "**\n\n\n" + errorMsg + "\n\n\nExpected Messages:" + expectedMessages + "\nReceived Messages: " + receivedMessages + "\nend note\n";
|
136 | fs_1.appendFileSync(getInputFile(scenarioId), note);
|
137 | };
|
138 | exports.generateSequenceDiagram = function (scenarioId) {
|
139 | return new Promise(function (resolve) {
|
140 | fs_1.appendFileSync(getInputFile(scenarioId), '\n@enduml');
|
141 | var gen = node_plantuml_1.generate(getInputFile(scenarioId));
|
142 | gen.out.pipe(fs_1.createWriteStream(getOutputFile(scenarioId)));
|
143 | gen.out.on('end', function () { return resolve(); });
|
144 | });
|
145 | };
|