@onlineapps/service-wrapper 2.1.39 → 2.1.41
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/package.json +4 -4
- package/src/ServiceWrapper.js +48 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onlineapps/service-wrapper",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.41",
|
|
4
4
|
"description": "Thin orchestration layer for microservices - delegates all infrastructure concerns to specialized connectors",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
"@onlineapps/conn-base-cache": "1.0.2",
|
|
28
28
|
"@onlineapps/conn-base-monitoring": "1.0.2",
|
|
29
29
|
"@onlineapps/conn-infra-error-handler": "^1.0.0",
|
|
30
|
-
"@onlineapps/conn-infra-mq": "1.1.
|
|
30
|
+
"@onlineapps/conn-infra-mq": "1.1.55",
|
|
31
31
|
"@onlineapps/conn-orch-api-mapper": "1.0.15",
|
|
32
32
|
"@onlineapps/conn-orch-cookbook": "2.0.13",
|
|
33
|
-
"@onlineapps/conn-orch-orchestrator": "1.0.
|
|
34
|
-
"@onlineapps/conn-orch-registry": "1.1.
|
|
33
|
+
"@onlineapps/conn-orch-orchestrator": "1.0.68",
|
|
34
|
+
"@onlineapps/conn-orch-registry": "1.1.26",
|
|
35
35
|
"@onlineapps/conn-orch-validator": "2.0.14",
|
|
36
36
|
"@onlineapps/monitoring-core": "1.0.8",
|
|
37
37
|
"@onlineapps/service-common": "^1.0.4"
|
package/src/ServiceWrapper.js
CHANGED
|
@@ -25,6 +25,7 @@ const { ValidationOrchestrator } = require('@onlineapps/conn-orch-validator');
|
|
|
25
25
|
|
|
26
26
|
const INFRA_QUEUE_OWNERS = {
|
|
27
27
|
'workflow.init': 'Gateway (api_gateway)',
|
|
28
|
+
'workflow.control': 'Gateway (api_gateway)',
|
|
28
29
|
'registry.register': 'Registry (api_services_registry)',
|
|
29
30
|
'validation.requests': 'Validator (api_services_validator)',
|
|
30
31
|
'workflow.completed': 'Delivery Dispatcher (api_delivery_dispatcher)',
|
|
@@ -132,6 +133,7 @@ class ServiceWrapper {
|
|
|
132
133
|
|
|
133
134
|
try {
|
|
134
135
|
await this._startWorkflowInitListener();
|
|
136
|
+
await this._startWorkflowControlListener();
|
|
135
137
|
await this._startServiceWorkflowListener();
|
|
136
138
|
this.logger?.info('✓ All workflow listeners started successfully');
|
|
137
139
|
this._logPhase('0.9', 'Workflow Listener Startup', 'PASSED', null, Date.now() - workflowListenerStartTime);
|
|
@@ -341,6 +343,16 @@ class ServiceWrapper {
|
|
|
341
343
|
console.warn(`[CLEANUP] Failed to cancel workflow.init consumer:`, err.message);
|
|
342
344
|
}
|
|
343
345
|
}
|
|
346
|
+
if (this.workflowControlConsumerTag) {
|
|
347
|
+
try {
|
|
348
|
+
if (this.mqClient?.channel) {
|
|
349
|
+
await this.mqClient.channel.cancel(this.workflowControlConsumerTag);
|
|
350
|
+
console.log(`[CLEANUP] ✓ Canceled workflow.control consumer`);
|
|
351
|
+
}
|
|
352
|
+
} catch (err) {
|
|
353
|
+
console.warn(`[CLEANUP] Failed to cancel workflow.control consumer:`, err.message);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
344
356
|
|
|
345
357
|
if (this.serviceWorkflowConsumerTag) {
|
|
346
358
|
try {
|
|
@@ -384,6 +396,7 @@ class ServiceWrapper {
|
|
|
384
396
|
|
|
385
397
|
// 5. Clear state variables
|
|
386
398
|
this.workflowInitConsumerTag = null;
|
|
399
|
+
this.workflowControlConsumerTag = null;
|
|
387
400
|
this.serviceWorkflowConsumerTag = null;
|
|
388
401
|
this.isInitialized = false;
|
|
389
402
|
|
|
@@ -913,7 +926,8 @@ class ServiceWrapper {
|
|
|
913
926
|
|
|
914
927
|
// Required infrastructure queues that must exist before business queues can be created
|
|
915
928
|
const requiredInfrastructureQueues = [
|
|
916
|
-
'workflow.init', // Gateway responsibility
|
|
929
|
+
'workflow.init', // Gateway responsibility (workflow entrypoint)
|
|
930
|
+
'workflow.control', // Gateway responsibility (shared control-flow steps)
|
|
917
931
|
'registry.register', // Registry responsibility
|
|
918
932
|
];
|
|
919
933
|
|
|
@@ -1167,6 +1181,39 @@ class ServiceWrapper {
|
|
|
1167
1181
|
}
|
|
1168
1182
|
}
|
|
1169
1183
|
|
|
1184
|
+
/**
|
|
1185
|
+
* Start workflow.control listener (runs ONLY after successful registration)
|
|
1186
|
+
* Service must be registered and have a certificate before listening to workflow.control
|
|
1187
|
+
* @private
|
|
1188
|
+
*/
|
|
1189
|
+
async _startWorkflowControlListener() {
|
|
1190
|
+
if (!this.mqClient) {
|
|
1191
|
+
this.logger?.warn('Cannot start workflow.control listener: MQ client not initialized');
|
|
1192
|
+
return;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
const queueName = 'workflow.control';
|
|
1196
|
+
this.logger?.info(`[ServiceWrapper] [CONSUMER] Starting workflow.control listener for queue: ${queueName}`);
|
|
1197
|
+
this.logger?.info(`[ServiceWrapper] [CONSUMER] Service: ${this.config.service?.name || 'unnamed-service'}`);
|
|
1198
|
+
this.logger?.info(`[ServiceWrapper] [CONSUMER] Timestamp: ${new Date().toISOString()}`);
|
|
1199
|
+
|
|
1200
|
+
try {
|
|
1201
|
+
// Subscribe to workflow.control queue (for all business services)
|
|
1202
|
+
const consumerTag = await this.mqClient.consume(queueName, async (message) => {
|
|
1203
|
+
await this._processWorkflowMessage(message, queueName);
|
|
1204
|
+
});
|
|
1205
|
+
this.workflowControlConsumerTag = consumerTag;
|
|
1206
|
+
|
|
1207
|
+
this.logger?.info(`[ServiceWrapper] [CONSUMER] ✓ workflow.control listener started successfully for queue: ${queueName} (consumerTag: ${consumerTag})`);
|
|
1208
|
+
} catch (consumeErr) {
|
|
1209
|
+
this.logger?.error(`[ServiceWrapper] [CONSUMER] ✗ Failed to start workflow.control listener for queue: ${queueName}`, {
|
|
1210
|
+
error: consumeErr.message,
|
|
1211
|
+
stack: consumeErr.stack
|
|
1212
|
+
});
|
|
1213
|
+
throw consumeErr;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1170
1217
|
/**
|
|
1171
1218
|
* Start service-specific workflow listener (runs only after successful validation and registration)
|
|
1172
1219
|
* @private
|