@onlineapps/service-wrapper 2.1.39 → 2.1.40

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onlineapps/service-wrapper",
3
- "version": "2.1.39",
3
+ "version": "2.1.40",
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.54",
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.67",
34
- "@onlineapps/conn-orch-registry": "1.1.25",
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"
@@ -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