@alagoni97/cli 0.72.1
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.
- package/LICENSE +201 -0
- package/README.md +336 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.mjs +3 -0
- package/bin/run.cmd +3 -0
- package/bin/run.mjs +4 -0
- package/dist/LoggingInterface.d.ts +123 -0
- package/dist/LoggingInterface.js +300 -0
- package/dist/PersistedConfig.d.ts +46 -0
- package/dist/PersistedConfig.js +94 -0
- package/dist/browser/adapters/output.d.ts +69 -0
- package/dist/browser/adapters/output.js +91 -0
- package/dist/browser/config.d.ts +18 -0
- package/dist/browser/config.js +59 -0
- package/dist/browser/generate.d.ts +20 -0
- package/dist/browser/generate.js +129 -0
- package/dist/browser/index.d.ts +17 -0
- package/dist/browser/index.js +26 -0
- package/dist/browser/parser.d.ts +9 -0
- package/dist/browser/parser.js +61 -0
- package/dist/browser/shims/asyncapi-parser.d.ts +30 -0
- package/dist/browser/shims/asyncapi-parser.js +52 -0
- package/dist/browser/shims/fs.d.ts +190 -0
- package/dist/browser/shims/fs.js +188 -0
- package/dist/browser/shims/json-schema-ref-parser.d.ts +73 -0
- package/dist/browser/shims/json-schema-ref-parser.js +246 -0
- package/dist/browser/shims/swagger-parser.d.ts +20 -0
- package/dist/browser/shims/swagger-parser.js +40 -0
- package/dist/codegen/configurationSchemaBuilder.d.ts +15 -0
- package/dist/codegen/configurationSchemaBuilder.js +48 -0
- package/dist/codegen/configurations.d.ts +29 -0
- package/dist/codegen/configurations.js +260 -0
- package/dist/codegen/detection.d.ts +19 -0
- package/dist/codegen/detection.js +174 -0
- package/dist/codegen/errors.d.ts +111 -0
- package/dist/codegen/errors.js +352 -0
- package/dist/codegen/generators/generic/custom.d.ts +75 -0
- package/dist/codegen/generators/generic/custom.js +66 -0
- package/dist/codegen/generators/index.d.ts +14 -0
- package/dist/codegen/generators/index.js +42 -0
- package/dist/codegen/generators/typescript/channels/asyncapi.d.ts +10 -0
- package/dist/codegen/generators/typescript/channels/asyncapi.js +131 -0
- package/dist/codegen/generators/typescript/channels/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/channels/index.js +142 -0
- package/dist/codegen/generators/typescript/channels/openapi.d.ts +9 -0
- package/dist/codegen/generators/typescript/channels/openapi.js +168 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/index.js +149 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishExchange.d.ts +5 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishExchange.js +106 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishQueue.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishQueue.js +102 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/subscribeQueue.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/subscribeQueue.js +133 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/express.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/express.js +100 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/fetch.d.ts +5 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/fetch.js +144 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/index.js +132 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/client.d.ts +10 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/client.js +224 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/common-types.d.ts +14 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/common-types.js +800 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/index.js +96 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/security.d.ts +48 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/security.js +491 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/index.js +127 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/publish.js +108 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/subscribe.js +154 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/utils.d.ts +11 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/utils.js +58 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/index.js +113 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/publish.js +99 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/subscribe.js +186 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/corePublish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/corePublish.js +90 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreReply.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreReply.js +142 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreRequest.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreRequest.js +100 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreSubscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreSubscribe.js +143 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/index.d.ts +11 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/index.js +224 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPublish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPublish.js +89 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPullSubscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPullSubscribe.js +146 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPushSubscription.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPushSubscription.js +149 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/utils.d.ts +35 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/utils.js +120 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/index.js +152 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/publish.js +64 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/register.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/register.js +115 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/subscribe.js +151 -0
- package/dist/codegen/generators/typescript/channels/types.d.ts +181 -0
- package/dist/codegen/generators/typescript/channels/types.js +131 -0
- package/dist/codegen/generators/typescript/channels/utils.d.ts +64 -0
- package/dist/codegen/generators/typescript/channels/utils.js +163 -0
- package/dist/codegen/generators/typescript/client/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/client/index.js +61 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/corePublish.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/corePublish.js +53 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/coreSubscribe.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/coreSubscribe.js +90 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetStreamPullSubscription.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetStreamPullSubscription.js +83 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPublish.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPublish.js +54 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPushSubscription.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPushSubscription.js +82 -0
- package/dist/codegen/generators/typescript/client/protocols/nats.d.ts +2 -0
- package/dist/codegen/generators/typescript/client/protocols/nats.js +182 -0
- package/dist/codegen/generators/typescript/client/types.d.ts +49 -0
- package/dist/codegen/generators/typescript/client/types.js +37 -0
- package/dist/codegen/generators/typescript/headers.d.ts +54 -0
- package/dist/codegen/generators/typescript/headers.js +138 -0
- package/dist/codegen/generators/typescript/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/index.js +38 -0
- package/dist/codegen/generators/typescript/models.d.ts +21761 -0
- package/dist/codegen/generators/typescript/models.js +64 -0
- package/dist/codegen/generators/typescript/parameters.d.ts +37 -0
- package/dist/codegen/generators/typescript/parameters.js +101 -0
- package/dist/codegen/generators/typescript/payloads.d.ts +73 -0
- package/dist/codegen/generators/typescript/payloads.js +250 -0
- package/dist/codegen/generators/typescript/types.d.ts +34 -0
- package/dist/codegen/generators/typescript/types.js +70 -0
- package/dist/codegen/generators/typescript/utils.d.ts +38 -0
- package/dist/codegen/generators/typescript/utils.js +195 -0
- package/dist/codegen/index.d.ts +7 -0
- package/dist/codegen/index.js +38 -0
- package/dist/codegen/inputs/asyncapi/generators/headers.d.ts +3 -0
- package/dist/codegen/inputs/asyncapi/generators/headers.js +41 -0
- package/dist/codegen/inputs/asyncapi/generators/parameters.d.ts +14 -0
- package/dist/codegen/inputs/asyncapi/generators/parameters.js +120 -0
- package/dist/codegen/inputs/asyncapi/generators/payloads.d.ts +16 -0
- package/dist/codegen/inputs/asyncapi/generators/payloads.js +124 -0
- package/dist/codegen/inputs/asyncapi/generators/types.d.ts +9 -0
- package/dist/codegen/inputs/asyncapi/generators/types.js +61 -0
- package/dist/codegen/inputs/asyncapi/index.d.ts +1 -0
- package/dist/codegen/inputs/asyncapi/index.js +7 -0
- package/dist/codegen/inputs/asyncapi/parser.d.ts +4 -0
- package/dist/codegen/inputs/asyncapi/parser.js +90 -0
- package/dist/codegen/inputs/index.d.ts +3 -0
- package/dist/codegen/inputs/index.js +19 -0
- package/dist/codegen/inputs/jsonschema/generators/index.d.ts +1 -0
- package/dist/codegen/inputs/jsonschema/generators/index.js +5 -0
- package/dist/codegen/inputs/jsonschema/generators/models.d.ts +7 -0
- package/dist/codegen/inputs/jsonschema/generators/models.js +26 -0
- package/dist/codegen/inputs/jsonschema/index.d.ts +1 -0
- package/dist/codegen/inputs/jsonschema/index.js +7 -0
- package/dist/codegen/inputs/jsonschema/parser.d.ts +31 -0
- package/dist/codegen/inputs/jsonschema/parser.js +128 -0
- package/dist/codegen/inputs/openapi/generators/headers.d.ts +3 -0
- package/dist/codegen/inputs/openapi/generators/headers.js +101 -0
- package/dist/codegen/inputs/openapi/generators/parameters.d.ts +10 -0
- package/dist/codegen/inputs/openapi/generators/parameters.js +852 -0
- package/dist/codegen/inputs/openapi/generators/payloads.d.ts +3 -0
- package/dist/codegen/inputs/openapi/generators/payloads.js +231 -0
- package/dist/codegen/inputs/openapi/generators/types.d.ts +9 -0
- package/dist/codegen/inputs/openapi/generators/types.js +86 -0
- package/dist/codegen/inputs/openapi/index.d.ts +2 -0
- package/dist/codegen/inputs/openapi/index.js +8 -0
- package/dist/codegen/inputs/openapi/parser.d.ts +4 -0
- package/dist/codegen/inputs/openapi/parser.js +115 -0
- package/dist/codegen/inputs/openapi/security.d.ts +56 -0
- package/dist/codegen/inputs/openapi/security.js +193 -0
- package/dist/codegen/modelina/index.d.ts +2 -0
- package/dist/codegen/modelina/index.js +20 -0
- package/dist/codegen/modelina/presets/index.d.ts +3 -0
- package/dist/codegen/modelina/presets/index.js +14 -0
- package/dist/codegen/modelina/presets/primitives.d.ts +34 -0
- package/dist/codegen/modelina/presets/primitives.js +211 -0
- package/dist/codegen/modelina/presets/union.d.ts +33 -0
- package/dist/codegen/modelina/presets/union.js +197 -0
- package/dist/codegen/modelina/presets/validation.d.ts +66 -0
- package/dist/codegen/modelina/presets/validation.js +183 -0
- package/dist/codegen/modelina/types.d.ts +61845 -0
- package/dist/codegen/modelina/types.js +412 -0
- package/dist/codegen/output/filesystem.d.ts +30 -0
- package/dist/codegen/output/filesystem.js +61 -0
- package/dist/codegen/output/index.d.ts +16 -0
- package/dist/codegen/output/index.js +57 -0
- package/dist/codegen/output/memory.d.ts +54 -0
- package/dist/codegen/output/memory.js +81 -0
- package/dist/codegen/output/modelina.d.ts +30 -0
- package/dist/codegen/output/modelina.js +30 -0
- package/dist/codegen/output/types.d.ts +47 -0
- package/dist/codegen/output/types.js +6 -0
- package/dist/codegen/renderer.d.ts +13 -0
- package/dist/codegen/renderer.js +309 -0
- package/dist/codegen/schemaPostProcess.d.ts +25 -0
- package/dist/codegen/schemaPostProcess.js +38 -0
- package/dist/codegen/types.d.ts +285187 -0
- package/dist/codegen/types.js +177 -0
- package/dist/codegen/utils.d.ts +126 -0
- package/dist/codegen/utils.js +373 -0
- package/dist/commands/base.d.ts +18 -0
- package/dist/commands/base.js +59 -0
- package/dist/commands/generate.d.ts +46 -0
- package/dist/commands/generate.js +305 -0
- package/dist/commands/init.d.ts +55 -0
- package/dist/commands/init.js +544 -0
- package/dist/commands/telemetry.d.ts +25 -0
- package/dist/commands/telemetry.js +115 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +35 -0
- package/dist/telemetry/anonymize.d.ts +19 -0
- package/dist/telemetry/anonymize.js +73 -0
- package/dist/telemetry/collector.d.ts +26 -0
- package/dist/telemetry/collector.js +57 -0
- package/dist/telemetry/config.d.ts +32 -0
- package/dist/telemetry/config.js +97 -0
- package/dist/telemetry/events.d.ts +72 -0
- package/dist/telemetry/events.js +5 -0
- package/dist/telemetry/index.d.ts +46 -0
- package/dist/telemetry/index.js +91 -0
- package/dist/telemetry/notice.d.ts +8 -0
- package/dist/telemetry/notice.js +50 -0
- package/dist/telemetry/sender.d.ts +14 -0
- package/dist/telemetry/sender.js +125 -0
- package/dist/utils/gitignore.d.ts +66 -0
- package/dist/utils/gitignore.js +111 -0
- package/dist/utils/inputSource.d.ts +3 -0
- package/dist/utils/inputSource.js +26 -0
- package/dist/utils/refResolvers.d.ts +29 -0
- package/dist/utils/refResolvers.js +83 -0
- package/dist/utils/remoteFetch.d.ts +18 -0
- package/dist/utils/remoteFetch.js +64 -0
- package/oclif.manifest.json +510 -0
- package/package.json +155 -0
package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPushSubscription.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderJetstreamPushSubscription = void 0;
|
|
4
|
+
/* eslint-disable sonarjs/no-nested-template-literals */
|
|
5
|
+
/* eslint-disable no-nested-ternary */
|
|
6
|
+
const __1 = require("../..");
|
|
7
|
+
const utils_1 = require("../../../utils");
|
|
8
|
+
const utils_2 = require("../../utils");
|
|
9
|
+
const utils_3 = require("./utils");
|
|
10
|
+
function renderJetstreamPushSubscription({ topic, messageType, messageModule, channelParameters, channelHeaders, subName = (0, utils_1.pascalCase)(topic), payloadGenerator, functionName = `jetStreamPushSubscriptionFrom${subName}`, description, deprecated }) {
|
|
11
|
+
const includeValidation = payloadGenerator.generator.includeValidation;
|
|
12
|
+
const addressToUse = channelParameters
|
|
13
|
+
? `parameters.getChannelWithParameters('${topic}')`
|
|
14
|
+
: `'${topic}'`;
|
|
15
|
+
let messageUnmarshalling = `${messageType}.unmarshal(receivedData)`;
|
|
16
|
+
if (messageModule) {
|
|
17
|
+
messageUnmarshalling = `${messageModule}.unmarshal(receivedData)`;
|
|
18
|
+
}
|
|
19
|
+
messageType = messageModule ? `${messageModule}.${messageType}` : messageType;
|
|
20
|
+
const { potentialValidatorCreation, potentialValidationFunction } = (0, utils_2.getValidationFunctions)({
|
|
21
|
+
includeValidation,
|
|
22
|
+
messageModule,
|
|
23
|
+
messageType,
|
|
24
|
+
onValidationFail: `onDataCallback(new Error(\`Invalid message payload received; $\{JSON.stringify({cause: errors})}\`), undefined,${channelParameters ? 'parameters, ' : ''}${channelHeaders ? 'extractedHeaders, ' : ''} msg); continue;`
|
|
25
|
+
});
|
|
26
|
+
const callbackFunctionParameters = [
|
|
27
|
+
{
|
|
28
|
+
parameter: 'err?: Error',
|
|
29
|
+
jsDoc: ' * @param err if any error occurred this will be sat'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
parameter: `msg?: ${messageType}`,
|
|
33
|
+
jsDoc: ' * @param msg that was received'
|
|
34
|
+
},
|
|
35
|
+
...(channelParameters
|
|
36
|
+
? [
|
|
37
|
+
{
|
|
38
|
+
parameter: `parameters?: ${channelParameters.type}`,
|
|
39
|
+
jsDoc: ' * @param parameters that was received in the topic'
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
: []),
|
|
43
|
+
...(channelHeaders
|
|
44
|
+
? [
|
|
45
|
+
{
|
|
46
|
+
parameter: `headers?: ${channelHeaders.type}`,
|
|
47
|
+
jsDoc: ' * @param headers that was received with the message'
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
: []),
|
|
51
|
+
{
|
|
52
|
+
parameter: 'jetstreamMsg?: Nats.JsMsg',
|
|
53
|
+
jsDoc: ' * @param jetstreamMsg'
|
|
54
|
+
}
|
|
55
|
+
];
|
|
56
|
+
const functionParameters = [
|
|
57
|
+
{
|
|
58
|
+
parameter: `onDataCallback`,
|
|
59
|
+
parameterType: `onDataCallback: (${callbackFunctionParameters.map((param) => param.parameter).join(', ')}) => void`,
|
|
60
|
+
jsDoc: ` * @param {${functionName}Callback} onDataCallback to call when messages are received`
|
|
61
|
+
},
|
|
62
|
+
...(channelParameters
|
|
63
|
+
? [
|
|
64
|
+
{
|
|
65
|
+
parameter: `parameters`,
|
|
66
|
+
parameterType: `parameters: ${channelParameters.type}`,
|
|
67
|
+
jsDoc: ' * @param parameters for topic substitution'
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
: []),
|
|
71
|
+
{
|
|
72
|
+
parameter: 'js',
|
|
73
|
+
parameterType: 'js: Nats.JetStreamClient',
|
|
74
|
+
jsDoc: ' * @param js the JetStream client to pull subscribe through'
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
parameter: 'options',
|
|
78
|
+
parameterType: 'options: Nats.ConsumerOptsBuilder | Partial<Nats.ConsumerOpts>',
|
|
79
|
+
jsDoc: ' * @param options when setting up the subscription'
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
parameter: 'codec = Nats.JSONCodec()',
|
|
83
|
+
parameterType: 'codec?: Nats.Codec<any>',
|
|
84
|
+
jsDoc: ' * @param codec the serialization codec to use while transmitting the message'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
parameter: 'skipMessageValidation = false',
|
|
88
|
+
parameterType: 'skipMessageValidation?: boolean',
|
|
89
|
+
jsDoc: ' * @param skipMessageValidation turn off runtime validation of incoming messages'
|
|
90
|
+
}
|
|
91
|
+
];
|
|
92
|
+
const headerExtraction = (0, utils_3.generateHeaderExtractionCode)(channelHeaders);
|
|
93
|
+
const whenReceivingMessage = (0, utils_3.generateMessageReceivingCode)({
|
|
94
|
+
channelParameters,
|
|
95
|
+
channelHeaders,
|
|
96
|
+
messageType,
|
|
97
|
+
messageUnmarshalling,
|
|
98
|
+
headerExtraction,
|
|
99
|
+
potentialValidationFunction
|
|
100
|
+
});
|
|
101
|
+
const callbackJsDocParameters = callbackFunctionParameters
|
|
102
|
+
.map((param) => param.jsDoc)
|
|
103
|
+
.join('\n');
|
|
104
|
+
const jsDoc = (0, utils_2.renderChannelJSDoc)({
|
|
105
|
+
description,
|
|
106
|
+
deprecated,
|
|
107
|
+
fallbackDescription: `JetStream push subscription for \`${topic}\``,
|
|
108
|
+
parameters: functionParameters.map((param) => ({
|
|
109
|
+
jsDoc: param.jsDoc
|
|
110
|
+
}))
|
|
111
|
+
});
|
|
112
|
+
const code = `/**
|
|
113
|
+
* Callback for when receiving messages
|
|
114
|
+
*
|
|
115
|
+
* @callback ${functionName}Callback
|
|
116
|
+
${callbackJsDocParameters}
|
|
117
|
+
*/
|
|
118
|
+
|
|
119
|
+
${jsDoc}
|
|
120
|
+
function ${functionName}({
|
|
121
|
+
${functionParameters.map((param) => param.parameter).join(', \n ')}
|
|
122
|
+
}: {
|
|
123
|
+
${functionParameters.map((param) => param.parameterType).join(', \n ')}
|
|
124
|
+
}): Promise<Nats.JetStreamSubscription> {
|
|
125
|
+
return new Promise(async (resolve, reject) => {
|
|
126
|
+
try {
|
|
127
|
+
const subscription = await js.subscribe(${addressToUse}, options);
|
|
128
|
+
${potentialValidatorCreation}
|
|
129
|
+
(async () => {
|
|
130
|
+
for await (const msg of subscription) {
|
|
131
|
+
${channelParameters ? `const parameters = ${channelParameters.type}.createFromChannel(msg.subject, '${topic}', ${(0, utils_1.findRegexFromChannel)(topic)})` : ''}
|
|
132
|
+
${whenReceivingMessage}
|
|
133
|
+
}
|
|
134
|
+
})();
|
|
135
|
+
resolve(subscription);
|
|
136
|
+
} catch (e: any) {
|
|
137
|
+
reject(e);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}`;
|
|
141
|
+
return {
|
|
142
|
+
messageType,
|
|
143
|
+
code,
|
|
144
|
+
functionName,
|
|
145
|
+
dependencies: [`import * as Nats from 'nats';`],
|
|
146
|
+
functionType: __1.ChannelFunctionTypes.NATS_JETSTREAM_PUSH_SUBSCRIBE
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
exports.renderJetstreamPushSubscription = renderJetstreamPushSubscription;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ConstrainedObjectModel } from '@asyncapi/modelina';
|
|
2
|
+
/**
|
|
3
|
+
* Generates the header setup code for NATS publish operations
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateHeaderSetupCode(channelHeaders: ConstrainedObjectModel | undefined): string;
|
|
6
|
+
/**
|
|
7
|
+
* Generates the header extraction code for NATS subscribe operations
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateHeaderExtractionCode(channelHeaders: ConstrainedObjectModel | undefined): string;
|
|
10
|
+
/**
|
|
11
|
+
* Generates the function parameter for headers
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateHeaderParameter(channelHeaders: ConstrainedObjectModel | undefined): {
|
|
14
|
+
parameter: string;
|
|
15
|
+
parameterType: string;
|
|
16
|
+
jsDoc: string;
|
|
17
|
+
} | null;
|
|
18
|
+
/**
|
|
19
|
+
* Generates the callback parameter for headers in subscribe functions
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateHeaderCallbackParameter(channelHeaders: ConstrainedObjectModel | undefined): {
|
|
22
|
+
parameter: string;
|
|
23
|
+
jsDoc: string;
|
|
24
|
+
} | null;
|
|
25
|
+
/**
|
|
26
|
+
* Generates the message receiving code for NATS subscribe operations
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateMessageReceivingCode({ channelParameters, channelHeaders, messageType, messageUnmarshalling, headerExtraction, potentialValidationFunction }: {
|
|
29
|
+
channelParameters: ConstrainedObjectModel | undefined;
|
|
30
|
+
channelHeaders: ConstrainedObjectModel | undefined;
|
|
31
|
+
messageType: string;
|
|
32
|
+
messageUnmarshalling: string;
|
|
33
|
+
headerExtraction: string;
|
|
34
|
+
potentialValidationFunction: string;
|
|
35
|
+
}): string;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateMessageReceivingCode = exports.generateHeaderCallbackParameter = exports.generateHeaderParameter = exports.generateHeaderExtractionCode = exports.generateHeaderSetupCode = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Generates the header setup code for NATS publish operations
|
|
6
|
+
*/
|
|
7
|
+
function generateHeaderSetupCode(channelHeaders) {
|
|
8
|
+
if (!channelHeaders) {
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
return `// Set up headers if provided
|
|
12
|
+
if (headers) {
|
|
13
|
+
const natsHeaders = Nats.headers();
|
|
14
|
+
const headerData = headers.marshal();
|
|
15
|
+
const parsedHeaders = typeof headerData === 'string' ? JSON.parse(headerData) : headerData;
|
|
16
|
+
for (const [key, value] of Object.entries(parsedHeaders)) {
|
|
17
|
+
if (value !== undefined) {
|
|
18
|
+
natsHeaders.append(key, String(value));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
options = { ...options, headers: natsHeaders };
|
|
22
|
+
}`;
|
|
23
|
+
}
|
|
24
|
+
exports.generateHeaderSetupCode = generateHeaderSetupCode;
|
|
25
|
+
/**
|
|
26
|
+
* Generates the header extraction code for NATS subscribe operations
|
|
27
|
+
*/
|
|
28
|
+
function generateHeaderExtractionCode(channelHeaders) {
|
|
29
|
+
if (!channelHeaders) {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
return `// Extract headers if present
|
|
33
|
+
let extractedHeaders: ${channelHeaders.type} | undefined = undefined;
|
|
34
|
+
if (msg.headers) {
|
|
35
|
+
const headerObj: Record<string, any> = {};
|
|
36
|
+
// NATS headers support both iteration and get() method
|
|
37
|
+
if (typeof msg.headers.keys === 'function') {
|
|
38
|
+
// Use keys() method if available (NATS MsgHdrs)
|
|
39
|
+
for (const key of msg.headers.keys()) {
|
|
40
|
+
headerObj[key] = msg.headers.get(key);
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
// Fallback to Object.entries for plain objects
|
|
44
|
+
for (const [key, value] of Object.entries(msg.headers)) {
|
|
45
|
+
headerObj[key] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
extractedHeaders = ${channelHeaders.type}.unmarshal(headerObj);
|
|
49
|
+
}`;
|
|
50
|
+
}
|
|
51
|
+
exports.generateHeaderExtractionCode = generateHeaderExtractionCode;
|
|
52
|
+
/**
|
|
53
|
+
* Generates the function parameter for headers
|
|
54
|
+
*/
|
|
55
|
+
function generateHeaderParameter(channelHeaders) {
|
|
56
|
+
if (!channelHeaders) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
parameter: 'headers',
|
|
61
|
+
parameterType: `headers?: ${channelHeaders.type}`,
|
|
62
|
+
jsDoc: ' * @param headers optional headers to include with the message'
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
exports.generateHeaderParameter = generateHeaderParameter;
|
|
66
|
+
/**
|
|
67
|
+
* Generates the callback parameter for headers in subscribe functions
|
|
68
|
+
*/
|
|
69
|
+
function generateHeaderCallbackParameter(channelHeaders) {
|
|
70
|
+
if (!channelHeaders) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
parameter: `headers?: ${channelHeaders.type}`,
|
|
75
|
+
jsDoc: ' * @param headers that were received with the message'
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
exports.generateHeaderCallbackParameter = generateHeaderCallbackParameter;
|
|
79
|
+
/**
|
|
80
|
+
* Generates the message receiving code for NATS subscribe operations
|
|
81
|
+
*/
|
|
82
|
+
function generateMessageReceivingCode({ channelParameters, channelHeaders, messageType, messageUnmarshalling, headerExtraction, potentialValidationFunction }) {
|
|
83
|
+
const hasParameters = !!channelParameters;
|
|
84
|
+
const hasHeaders = !!channelHeaders;
|
|
85
|
+
const isNullMessage = messageType === 'null';
|
|
86
|
+
// Build callback parameters
|
|
87
|
+
const callbackParams = ['undefined'];
|
|
88
|
+
if (isNullMessage) {
|
|
89
|
+
callbackParams.push('null');
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
callbackParams.push(messageUnmarshalling);
|
|
93
|
+
}
|
|
94
|
+
if (hasParameters) {
|
|
95
|
+
callbackParams.push('parameters');
|
|
96
|
+
}
|
|
97
|
+
if (hasHeaders) {
|
|
98
|
+
callbackParams.push('extractedHeaders');
|
|
99
|
+
}
|
|
100
|
+
callbackParams.push('msg');
|
|
101
|
+
const callbackInvocation = `onDataCallback(${callbackParams.join(', ')});`;
|
|
102
|
+
// Generate message processing code
|
|
103
|
+
if (isNullMessage) {
|
|
104
|
+
return hasHeaders
|
|
105
|
+
? `${headerExtraction}\n ${callbackInvocation}`
|
|
106
|
+
: callbackInvocation;
|
|
107
|
+
}
|
|
108
|
+
// Non-null message processing
|
|
109
|
+
const messageDecoding = 'let receivedData: any = codec.decode(msg.data);';
|
|
110
|
+
const parts = [messageDecoding];
|
|
111
|
+
if (hasHeaders) {
|
|
112
|
+
parts.push(headerExtraction);
|
|
113
|
+
}
|
|
114
|
+
if (potentialValidationFunction) {
|
|
115
|
+
parts.push(potentialValidationFunction);
|
|
116
|
+
}
|
|
117
|
+
parts.push(callbackInvocation);
|
|
118
|
+
return parts.join('\n');
|
|
119
|
+
}
|
|
120
|
+
exports.generateMessageReceivingCode = generateMessageReceivingCode;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TypeScriptChannelsGeneratorContext, TypeScriptChannelRenderedFunctionType } from '../../types';
|
|
2
|
+
import { renderWebSocketPublish } from './publish';
|
|
3
|
+
import { renderWebSocketSubscribe } from './subscribe';
|
|
4
|
+
import { renderWebSocketRegister } from './register';
|
|
5
|
+
import { ChannelInterface } from '@asyncapi/parser';
|
|
6
|
+
export { renderWebSocketPublish, renderWebSocketSubscribe, renderWebSocketRegister };
|
|
7
|
+
export declare function generateWebSocketChannels(context: TypeScriptChannelsGeneratorContext, channel: ChannelInterface, protocolCodeFunctions: Record<string, string[]>, externalProtocolFunctionInformation: Record<string, TypeScriptChannelRenderedFunctionType[]>, dependencies: string[]): Promise<void>;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateWebSocketChannels = exports.renderWebSocketRegister = exports.renderWebSocketSubscribe = exports.renderWebSocketPublish = void 0;
|
|
4
|
+
/* eslint-disable sonarjs/cognitive-complexity */
|
|
5
|
+
/* eslint-disable security/detect-object-injection */
|
|
6
|
+
const types_1 = require("../../types");
|
|
7
|
+
const utils_1 = require("../../../../../utils");
|
|
8
|
+
const utils_2 = require("../../utils");
|
|
9
|
+
const asyncapi_1 = require("../../asyncapi");
|
|
10
|
+
const publish_1 = require("./publish");
|
|
11
|
+
Object.defineProperty(exports, "renderWebSocketPublish", { enumerable: true, get: function () { return publish_1.renderWebSocketPublish; } });
|
|
12
|
+
const subscribe_1 = require("./subscribe");
|
|
13
|
+
Object.defineProperty(exports, "renderWebSocketSubscribe", { enumerable: true, get: function () { return subscribe_1.renderWebSocketSubscribe; } });
|
|
14
|
+
const register_1 = require("./register");
|
|
15
|
+
Object.defineProperty(exports, "renderWebSocketRegister", { enumerable: true, get: function () { return register_1.renderWebSocketRegister; } });
|
|
16
|
+
const errors_1 = require("../../../../../errors");
|
|
17
|
+
async function generateWebSocketChannels(context, channel, protocolCodeFunctions, externalProtocolFunctionInformation, dependencies) {
|
|
18
|
+
const { parameter, topic, payloads } = context;
|
|
19
|
+
const ignoreOperation = !context.generator.asyncapiGenerateForOperations;
|
|
20
|
+
// Convert AsyncAPI topic format to WebSocket path format
|
|
21
|
+
const websocketTopic = topic.startsWith('/') ? topic : `/${topic}`;
|
|
22
|
+
// Keep the topic as is for WebSocket paths
|
|
23
|
+
const websocketContext = {
|
|
24
|
+
channelParameters: parameter,
|
|
25
|
+
channelHeaders: undefined, // WebSocket doesn't use headers in the same way
|
|
26
|
+
topic: websocketTopic,
|
|
27
|
+
messageType: '',
|
|
28
|
+
subName: context.subName,
|
|
29
|
+
payloadGenerator: payloads
|
|
30
|
+
};
|
|
31
|
+
const operations = channel.operations().all();
|
|
32
|
+
const renders = operations.length > 0 && !ignoreOperation
|
|
33
|
+
? await generateForOperations(context, channel, websocketContext)
|
|
34
|
+
: await generateForChannels(context, channel, websocketContext);
|
|
35
|
+
addRendersToExternal(renders, protocolCodeFunctions, externalProtocolFunctionInformation, dependencies, parameter);
|
|
36
|
+
}
|
|
37
|
+
exports.generateWebSocketChannels = generateWebSocketChannels;
|
|
38
|
+
function addRendersToExternal(renders, protocolCodeFunctions, externalProtocolFunctionInformation, dependencies, parameter) {
|
|
39
|
+
protocolCodeFunctions['websocket'].push(...renders.map((value) => value.code));
|
|
40
|
+
externalProtocolFunctionInformation['websocket'].push(...renders.map((value) => ({
|
|
41
|
+
functionType: value.functionType,
|
|
42
|
+
functionName: value.functionName,
|
|
43
|
+
messageType: value.messageType,
|
|
44
|
+
replyType: value.replyType,
|
|
45
|
+
parameterType: parameter?.type
|
|
46
|
+
})));
|
|
47
|
+
const renderedDependencies = renders
|
|
48
|
+
.map((value) => value.dependencies)
|
|
49
|
+
.flat(Infinity);
|
|
50
|
+
dependencies.push(...new Set(renderedDependencies));
|
|
51
|
+
}
|
|
52
|
+
async function generateForOperations(context, channel, websocketContext) {
|
|
53
|
+
const renders = [];
|
|
54
|
+
const { generator, payloads } = context;
|
|
55
|
+
const functionTypeMapping = generator.functionTypeMapping?.[channel.id()];
|
|
56
|
+
for (const operation of channel.operations().all()) {
|
|
57
|
+
const updatedFunctionTypeMapping = (0, asyncapi_1.getFunctionTypeMappingFromAsyncAPI)(operation) ?? functionTypeMapping;
|
|
58
|
+
if (updatedFunctionTypeMapping !== undefined &&
|
|
59
|
+
!updatedFunctionTypeMapping?.some((f) => [
|
|
60
|
+
types_1.ChannelFunctionTypes.WEBSOCKET_PUBLISH,
|
|
61
|
+
types_1.ChannelFunctionTypes.WEBSOCKET_SUBSCRIBE,
|
|
62
|
+
types_1.ChannelFunctionTypes.WEBSOCKET_REGISTER
|
|
63
|
+
].includes(f))) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const payload = payloads.operationModels[(0, utils_1.findOperationId)(operation, channel)];
|
|
67
|
+
if (!payload) {
|
|
68
|
+
throw new Error(`Could not find payload for operation in channel typescript generator for WebSocket`);
|
|
69
|
+
}
|
|
70
|
+
const { messageModule, messageType } = (0, utils_2.getMessageTypeAndModule)(payload);
|
|
71
|
+
if (messageType === undefined) {
|
|
72
|
+
throw new Error(`Could not find message type for channel typescript generator for WebSocket`);
|
|
73
|
+
}
|
|
74
|
+
// Extract operation metadata for JSDoc
|
|
75
|
+
const { description, deprecated } = (0, utils_1.getOperationMetadata)(operation);
|
|
76
|
+
const updatedContext = {
|
|
77
|
+
...websocketContext,
|
|
78
|
+
messageType,
|
|
79
|
+
messageModule,
|
|
80
|
+
subName: (0, utils_1.findNameFromOperation)(operation, channel),
|
|
81
|
+
description,
|
|
82
|
+
deprecated
|
|
83
|
+
};
|
|
84
|
+
renders.push(...(await generateOperationRenders(operation, updatedContext, updatedFunctionTypeMapping, generator)));
|
|
85
|
+
}
|
|
86
|
+
return renders;
|
|
87
|
+
}
|
|
88
|
+
async function generateOperationRenders(operation, websocketContext, functionTypeMapping, generator) {
|
|
89
|
+
const renders = [];
|
|
90
|
+
const action = operation.action();
|
|
91
|
+
const renderChecks = [
|
|
92
|
+
{
|
|
93
|
+
check: types_1.ChannelFunctionTypes.WEBSOCKET_PUBLISH,
|
|
94
|
+
render: publish_1.renderWebSocketPublish
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
check: types_1.ChannelFunctionTypes.WEBSOCKET_SUBSCRIBE,
|
|
98
|
+
render: subscribe_1.renderWebSocketSubscribe
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
check: types_1.ChannelFunctionTypes.WEBSOCKET_REGISTER,
|
|
102
|
+
render: register_1.renderWebSocketRegister
|
|
103
|
+
}
|
|
104
|
+
];
|
|
105
|
+
for (const { check, render } of renderChecks) {
|
|
106
|
+
if ((0, asyncapi_1.shouldRenderFunctionType)(functionTypeMapping, check, action, generator.asyncapiReverseOperations)) {
|
|
107
|
+
renders.push(render(websocketContext));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return renders;
|
|
111
|
+
}
|
|
112
|
+
async function generateForChannels(context, channel, websocketContext) {
|
|
113
|
+
const renders = [];
|
|
114
|
+
const { generator, payloads } = context;
|
|
115
|
+
const functionTypeMapping = (0, asyncapi_1.getFunctionTypeMappingFromAsyncAPI)(channel) ??
|
|
116
|
+
generator.functionTypeMapping?.[channel.id()];
|
|
117
|
+
const payload = payloads.channelModels[channel.id()];
|
|
118
|
+
if (!payload) {
|
|
119
|
+
throw (0, errors_1.createMissingPayloadError)({
|
|
120
|
+
channelOrOperation: channel.id(),
|
|
121
|
+
protocol: 'WebSocket'
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const { messageModule, messageType } = (0, utils_2.getMessageTypeAndModule)(payload);
|
|
125
|
+
if (messageType === undefined) {
|
|
126
|
+
throw new Error(`Could not find message type for channel typescript generator for WebSocket`);
|
|
127
|
+
}
|
|
128
|
+
const updatedContext = { ...websocketContext, messageType, messageModule };
|
|
129
|
+
const renderChecks = [
|
|
130
|
+
{
|
|
131
|
+
check: types_1.ChannelFunctionTypes.WEBSOCKET_PUBLISH,
|
|
132
|
+
render: publish_1.renderWebSocketPublish,
|
|
133
|
+
action: 'send'
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
check: types_1.ChannelFunctionTypes.WEBSOCKET_SUBSCRIBE,
|
|
137
|
+
render: subscribe_1.renderWebSocketSubscribe,
|
|
138
|
+
action: 'receive'
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
check: types_1.ChannelFunctionTypes.WEBSOCKET_REGISTER,
|
|
142
|
+
render: register_1.renderWebSocketRegister,
|
|
143
|
+
action: 'send'
|
|
144
|
+
}
|
|
145
|
+
];
|
|
146
|
+
for (const { check, render, action } of renderChecks) {
|
|
147
|
+
if ((0, asyncapi_1.shouldRenderFunctionType)(functionTypeMapping, check, action, generator.asyncapiReverseOperations)) {
|
|
148
|
+
renders.push(render(updatedContext));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return renders;
|
|
152
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { SingleFunctionRenderType } from '../../../../../types';
|
|
2
|
+
import { RenderRegularParameters } from '../../types';
|
|
3
|
+
export declare function renderWebSocketPublish({ topic, messageType, messageModule, subName, functionName, description, deprecated }: RenderRegularParameters): SingleFunctionRenderType;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderWebSocketPublish = void 0;
|
|
4
|
+
/* eslint-disable sonarjs/no-nested-template-literals */
|
|
5
|
+
const __1 = require("../..");
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
const utils_2 = require("../../utils");
|
|
8
|
+
function renderWebSocketPublish({ topic, messageType, messageModule, subName = (0, utils_1.pascalCase)(topic), functionName = `publishTo${subName}`, description, deprecated }) {
|
|
9
|
+
let messageMarshalling = 'message.marshal()';
|
|
10
|
+
if (messageModule) {
|
|
11
|
+
messageMarshalling = `${messageModule}.marshal(message)`;
|
|
12
|
+
}
|
|
13
|
+
messageType = messageModule ? `${messageModule}.${messageType}` : messageType;
|
|
14
|
+
const functionParameters = [
|
|
15
|
+
{
|
|
16
|
+
parameter: `message`,
|
|
17
|
+
parameterType: `message: ${messageType}`,
|
|
18
|
+
jsDoc: ' * @param message to publish'
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
parameter: 'ws',
|
|
22
|
+
parameterType: 'ws: WebSocket.WebSocket',
|
|
23
|
+
jsDoc: ' * @param ws the WebSocket connection (assumed to be already connected)'
|
|
24
|
+
}
|
|
25
|
+
];
|
|
26
|
+
const jsDoc = (0, utils_2.renderChannelJSDoc)({
|
|
27
|
+
description,
|
|
28
|
+
deprecated,
|
|
29
|
+
fallbackDescription: `WebSocket client-side function to publish messages to \`${topic}\``,
|
|
30
|
+
parameters: functionParameters.map((param) => ({
|
|
31
|
+
jsDoc: param.jsDoc
|
|
32
|
+
}))
|
|
33
|
+
});
|
|
34
|
+
const code = `${jsDoc}
|
|
35
|
+
function ${functionName}({
|
|
36
|
+
${functionParameters.map((param) => param.parameter).join(',\n ')}
|
|
37
|
+
}: {
|
|
38
|
+
${functionParameters.map((param) => param.parameterType).join(',\n ')}
|
|
39
|
+
}): Promise<void> {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
// Check if WebSocket is open
|
|
42
|
+
if (ws.readyState !== WebSocket.WebSocket.OPEN) {
|
|
43
|
+
reject(new Error('WebSocket is not open'));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Send message directly
|
|
48
|
+
ws.send(${messageMarshalling}, (err) => {
|
|
49
|
+
if (err) {
|
|
50
|
+
reject(new Error(\`Failed to send message: \${err.message}\`));
|
|
51
|
+
}
|
|
52
|
+
resolve();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}`;
|
|
56
|
+
return {
|
|
57
|
+
messageType,
|
|
58
|
+
code,
|
|
59
|
+
functionName,
|
|
60
|
+
dependencies: [`import * as WebSocket from 'ws';`],
|
|
61
|
+
functionType: __1.ChannelFunctionTypes.WEBSOCKET_PUBLISH
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
exports.renderWebSocketPublish = renderWebSocketPublish;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { SingleFunctionRenderType } from '../../../../../types';
|
|
2
|
+
import { RenderRegularParameters } from '../../types';
|
|
3
|
+
export declare function renderWebSocketRegister({ topic, messageType, messageModule, channelParameters, subName, functionName, description, deprecated }: RenderRegularParameters): SingleFunctionRenderType;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderWebSocketRegister = void 0;
|
|
4
|
+
/* eslint-disable sonarjs/no-nested-template-literals */
|
|
5
|
+
const __1 = require("../..");
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
const utils_2 = require("../../utils");
|
|
8
|
+
function renderWebSocketRegister({ topic, messageType, messageModule, channelParameters, subName = (0, utils_1.pascalCase)(topic), functionName = `register${subName}`, description, deprecated }) {
|
|
9
|
+
let messageUnmarshalling = `${messageType}.unmarshal(receivedData)`;
|
|
10
|
+
if (messageModule) {
|
|
11
|
+
messageUnmarshalling = `${messageModule}.unmarshal(receivedData)`;
|
|
12
|
+
}
|
|
13
|
+
messageType = messageModule ? `${messageModule}.${messageType}` : messageType;
|
|
14
|
+
// Create channel pattern based on topic
|
|
15
|
+
const channelPattern = topic.replace(/\{[^}]+\}/g, '([^\\/]*)');
|
|
16
|
+
const escapedChannelPattern = channelPattern.replace(/\//g, '\\/');
|
|
17
|
+
const regexPattern = `/^${escapedChannelPattern}(?:\\?.*)?$/`;
|
|
18
|
+
// Create parameter extraction logic
|
|
19
|
+
const topicWithoutLeadingSlash = topic.startsWith('/')
|
|
20
|
+
? topic.slice(1)
|
|
21
|
+
: topic;
|
|
22
|
+
const channelPatternWithoutLeadingSlash = topicWithoutLeadingSlash.replace(/\{[^}]+\}/g, '([^\\/]*)');
|
|
23
|
+
const parameterExtraction = channelParameters
|
|
24
|
+
? `const channelPath = url.startsWith('/') ? url.slice(1) : url;
|
|
25
|
+
const parameters = ${channelParameters.type}.createFromChannel(channelPath, '${topicWithoutLeadingSlash}', /^${channelPatternWithoutLeadingSlash.replace(/\//g, '\\/')}$/);`
|
|
26
|
+
: '';
|
|
27
|
+
const onConnectionParameters = [
|
|
28
|
+
...(channelParameters ? [`parameters: ${channelParameters.type}`] : []),
|
|
29
|
+
'ws: WebSocket.WebSocket',
|
|
30
|
+
'request: IncomingMessage'
|
|
31
|
+
];
|
|
32
|
+
const onMessageParameters = [
|
|
33
|
+
`message: ${messageType}`,
|
|
34
|
+
'ws: WebSocket.WebSocket'
|
|
35
|
+
];
|
|
36
|
+
const functionParameters = [
|
|
37
|
+
{
|
|
38
|
+
parameter: `wss`,
|
|
39
|
+
parameterType: `wss: WebSocket.WebSocketServer`,
|
|
40
|
+
jsDoc: ' * @param wss the WebSocket server instance'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
parameter: `onConnection`,
|
|
44
|
+
parameterType: `onConnection: (params: {${onConnectionParameters.join(', ')}}) => void`,
|
|
45
|
+
jsDoc: ' * @param onConnection callback when a client connects to this channel'
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
parameter: `onMessage`,
|
|
49
|
+
parameterType: `onMessage: (params: {${onMessageParameters.join(', ')}}) => void`,
|
|
50
|
+
jsDoc: ' * @param onMessage callback when a message is received on this channel'
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
const jsDoc = (0, utils_2.renderChannelJSDoc)({
|
|
54
|
+
description,
|
|
55
|
+
deprecated,
|
|
56
|
+
fallbackDescription: `WebSocket server-side function to handle messages for \`${topic}\``,
|
|
57
|
+
parameters: functionParameters.map((param) => ({
|
|
58
|
+
jsDoc: param.jsDoc
|
|
59
|
+
}))
|
|
60
|
+
});
|
|
61
|
+
const code = `${jsDoc}
|
|
62
|
+
function ${functionName}({
|
|
63
|
+
${functionParameters.map((param) => param.parameter).join(',\n ')}
|
|
64
|
+
}: {
|
|
65
|
+
${functionParameters.map((param) => param.parameterType).join(',\n ')}
|
|
66
|
+
}): void {
|
|
67
|
+
const channelPattern = ${regexPattern};
|
|
68
|
+
|
|
69
|
+
wss.on('connection', (ws: WebSocket.WebSocket, request: IncomingMessage) => {
|
|
70
|
+
try {
|
|
71
|
+
const url = request.url || '';
|
|
72
|
+
const match = url.match(channelPattern);
|
|
73
|
+
if (match) {
|
|
74
|
+
try {
|
|
75
|
+
${parameterExtraction}
|
|
76
|
+
onConnection({${channelParameters ? '\n parameters,' : ''}
|
|
77
|
+
ws,
|
|
78
|
+
request
|
|
79
|
+
});
|
|
80
|
+
} catch (connectionError) {
|
|
81
|
+
console.error('Error in onConnection callback:', connectionError);
|
|
82
|
+
ws.close(1011, 'Connection error');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
ws.on('message', (data: WebSocket.RawData) => {
|
|
87
|
+
try {
|
|
88
|
+
const receivedData = data.toString();
|
|
89
|
+
const parsedMessage = ${messageUnmarshalling};
|
|
90
|
+
onMessage({
|
|
91
|
+
message: parsedMessage,
|
|
92
|
+
ws
|
|
93
|
+
});
|
|
94
|
+
} catch (error: any) {
|
|
95
|
+
// Ignore parsing errors
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
} catch (error: any) {
|
|
100
|
+
ws.close(1011, 'Server error');
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}`;
|
|
104
|
+
return {
|
|
105
|
+
messageType,
|
|
106
|
+
code,
|
|
107
|
+
functionName,
|
|
108
|
+
dependencies: [
|
|
109
|
+
`import * as WebSocket from 'ws';`,
|
|
110
|
+
`import { IncomingMessage } from 'http';`
|
|
111
|
+
],
|
|
112
|
+
functionType: __1.ChannelFunctionTypes.WEBSOCKET_REGISTER
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
exports.renderWebSocketRegister = renderWebSocketRegister;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { SingleFunctionRenderType } from '../../../../../types';
|
|
2
|
+
import { RenderRegularParameters } from '../../types';
|
|
3
|
+
export declare function renderWebSocketSubscribe({ topic, messageType, messageModule, channelParameters, subName, functionName, description, deprecated }: RenderRegularParameters): SingleFunctionRenderType;
|