node-server-engine 1.12.2 → 1.12.3

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/.nycrc CHANGED
@@ -20,7 +20,7 @@
20
20
  "require": ["@babel/register"],
21
21
  "reporter": ["text", "html", "lcov"],
22
22
  "lines": 80,
23
- "branches": 65,
23
+ "branches": 60,
24
24
  "functions": 70,
25
25
  "statements": 80,
26
26
  "report-dir": "./.test-coverage",
@@ -35,6 +35,38 @@ const withRetry = async (fn, retries = 3, delay = 500) => {
35
35
  const pubSubClient = new _pubsub.PubSub({
36
36
  apiEndpoint: 'pubsub.googleapis.com'
37
37
  });
38
+
39
+ /** Re-open a subscription's message stream after a transient error */
40
+ function reattachSubscription(subscriptionName, delayMs = 5000) {
41
+ setTimeout(() => {
42
+ const entry = subscriptions[subscriptionName];
43
+ if (!entry) return;
44
+ const {
45
+ subscription,
46
+ handlers,
47
+ isDebezium
48
+ } = entry;
49
+ (0, _utils.reportDebug)({
50
+ namespace,
51
+ message: `Reattaching subscription '${subscriptionName}'`
52
+ });
53
+
54
+ // Remove all existing listeners before re-adding to avoid duplicates
55
+ subscription.removeAllListeners('message');
56
+ subscription.removeAllListeners('error');
57
+ subscription.on('message', message => {
58
+ (0, _handleMessage.handleMessage)(message, subscription, handlers, isDebezium).catch(_utils.reportError);
59
+ });
60
+ subscription.on('error', error => {
61
+ (0, _utils.reportError)(error);
62
+ // Reconnect on transient errors (DEADLINE_EXCEEDED, UNAVAILABLE, INTERNAL)
63
+ const code = error?.code;
64
+ if (code === 4 || code === 14 || code === 13) {
65
+ reattachSubscription(subscriptionName, Math.min(delayMs * 2, 60000));
66
+ }
67
+ });
68
+ }, delayMs);
69
+ }
38
70
  const PubSub = exports.PubSub = {
39
71
  /**
40
72
  * ✅ FAST + NON-BLOCKING INIT
@@ -44,16 +76,21 @@ const PubSub = exports.PubSub = {
44
76
  namespace,
45
77
  message: `Initializing Pub/Sub (safe mode)`
46
78
  });
47
- for (const {
79
+ for (const [subscriptionName, {
48
80
  subscription,
49
81
  handlers,
50
82
  isDebezium
51
- } of Object.values(subscriptions)) {
83
+ }] of Object.entries(subscriptions)) {
52
84
  subscription.on('message', message => {
53
85
  (0, _handleMessage.handleMessage)(message, subscription, handlers, isDebezium).catch(_utils.reportError);
54
86
  });
55
87
  subscription.on('error', error => {
56
88
  (0, _utils.reportError)(error);
89
+ // Auto-reconnect on transient gRPC errors (DEADLINE_EXCEEDED=4, UNAVAILABLE=14, INTERNAL=13)
90
+ const code = error?.code;
91
+ if (code === 4 || code === 14 || code === 13) {
92
+ reattachSubscription(subscriptionName, 5000);
93
+ }
57
94
  });
58
95
  }
59
96
  _LifecycleController.LifecycleController.register(PubSub);
@@ -1 +1 @@
1
- {"version":3,"file":"PubSub.js","names":["_pubsub","require","_handleMessage","_EngineError","_LifecycleController","_utils","namespace","subscriptions","topics","withRetry","fn","retries","delay","lastError","i","err","Promise","res","setTimeout","pubSubClient","PubsubClient","apiEndpoint","PubSub","exports","init","reportDebug","message","subscription","handlers","isDebezium","Object","values","on","handleMessage","catch","reportError","error","LifecycleController","register","shutdown","all","map","topic","flush","close","keys","forEach","addPublisher","options","topicArray","Array","join","data","enableOpenTelemetryTracing","messageOrdering","enableMessageOrdering","batching","maxMessages","maxBytes","maxMilliseconds","undefined","addSubscriber","subscriptionName","handler","flowControl","allowExcessMessages","ackDeadline","first","push","unshift","publish","attributes","orderingKey","EngineError","publishMessage","json"],"sources":["../../../src/entities/PubSub/PubSub.ts"],"sourcesContent":["import {\n Attributes,\n PubSub as PubsubClient,\n Message\n} from '@google-cloud/pubsub';\nimport { handleMessage } from './handleMessage';\nimport {\n PubSubTopicsMap,\n PubSubSubscriptionsMap,\n PubSubAddSubscriberOptions,\n PubSubMessageHandler,\n PubSubPublisherOptions\n} from './PubSub.types';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { reportDebug, reportError } from 'utils';\n\nconst namespace = 'engine:PubSub';\n\nconst subscriptions: PubSubSubscriptionsMap = {};\nconst topics: PubSubTopicsMap = {};\n\n/**\n * Add basic retry wrapper\n */\nconst withRetry = async <T>(\n fn: () => Promise<T>,\n retries = 3,\n delay = 500\n): Promise<T> => {\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n await new Promise((res) => setTimeout(res, delay * (i + 1)));\n }\n }\n throw lastError;\n};\n\n/**\n * PubSub client with safer defaults\n */\nconst pubSubClient = new PubsubClient({\n apiEndpoint: 'pubsub.googleapis.com'\n});\n\nexport const PubSub = {\n /**\n * ✅ FAST + NON-BLOCKING INIT\n */\n async init(): Promise<void> {\n reportDebug({ namespace, message: `Initializing Pub/Sub (safe mode)` });\n\n for (const { subscription, handlers, isDebezium } of Object.values(\n subscriptions\n )) {\n subscription.on('message', (message) => {\n handleMessage(\n message as Message,\n subscription,\n handlers,\n isDebezium\n ).catch(reportError);\n });\n\n subscription.on('error', (error) => {\n reportError(error);\n });\n }\n\n LifecycleController.register(PubSub);\n },\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n reportDebug({ namespace, message: `Shutting down Pub/Sub` });\n\n await Promise.all([\n ...Object.values(topics).map(async (topic) => topic.flush()),\n ...Object.values(subscriptions).map(async ({ subscription }) =>\n subscription.close()\n )\n ]);\n\n Object.keys(topics).forEach((topic) => delete topics[topic]);\n Object.keys(subscriptions).forEach(\n (subscription) => delete subscriptions[subscription]\n );\n\n await pubSubClient.close();\n },\n\n /**\n * Publisher registration\n */\n addPublisher(\n topic: string | Array<string>,\n options?: PubSubPublisherOptions\n ): void {\n const topicArray = topic instanceof Array ? topic : [topic];\n\n reportDebug({\n namespace,\n message: `Registering publisher for topics '${topicArray.join(\"', '\")}'`,\n data: options\n });\n\n for (const topic of topicArray) {\n if (!topics[topic]) {\n topics[topic] = pubSubClient.topic(topic, {\n enableOpenTelemetryTracing: true,\n messageOrdering: options?.enableMessageOrdering ?? false,\n batching: options?.batching\n ? {\n maxMessages: options.batching.maxMessages ?? 100,\n maxBytes: options.batching.maxBytes ?? 1024 * 1024,\n maxMilliseconds: options.batching.maxMilliseconds ?? 100\n }\n : undefined\n });\n }\n }\n },\n\n /**\n * Subscriber registration\n */\n addSubscriber<T>(\n subscriptionName: string,\n handler: PubSubMessageHandler<T> | Array<PubSubMessageHandler<T>>,\n options: PubSubAddSubscriberOptions = {}\n ): void {\n const handlers = handler instanceof Array ? handler : [handler];\n\n reportDebug({\n namespace,\n message: `Registering subscriber '${subscriptionName}'`,\n data: options\n });\n\n if (!subscriptions[subscriptionName]) {\n subscriptions[subscriptionName] = {\n subscription: pubSubClient.subscription(subscriptionName, {\n enableOpenTelemetryTracing: true,\n flowControl: options.flowControl ?? {\n maxMessages: 1000,\n maxBytes: 100 * 1024 * 1024,\n allowExcessMessages: true\n },\n ackDeadline: options.ackDeadline ?? 60\n }),\n handlers: [],\n isDebezium: options?.isDebezium ?? false\n };\n }\n\n if (options.first)\n subscriptions[subscriptionName].handlers.push(...handlers);\n else subscriptions[subscriptionName].handlers.unshift(...handlers);\n },\n\n /**\n * ✅ SAFE PUBLISH (with retry)\n */\n async publish(\n topic: string,\n message: unknown,\n attributes?: Attributes,\n orderingKey?: string\n ): Promise<void> {\n if (!topics[topic]) {\n throw new EngineError(`No publisher registered for topic '${topic}'`);\n }\n\n reportDebug({\n namespace,\n message: `Publishing to '${topic}'`,\n data: { message, attributes, orderingKey }\n });\n\n await withRetry(() =>\n topics[topic].publishMessage({\n json: message,\n attributes,\n orderingKey\n })\n );\n }\n};"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"PubSub.js","names":["_pubsub","require","_handleMessage","_EngineError","_LifecycleController","_utils","namespace","subscriptions","topics","withRetry","fn","retries","delay","lastError","i","err","Promise","res","setTimeout","pubSubClient","PubsubClient","apiEndpoint","reattachSubscription","subscriptionName","delayMs","entry","subscription","handlers","isDebezium","reportDebug","message","removeAllListeners","on","handleMessage","catch","reportError","error","code","Math","min","PubSub","exports","init","Object","entries","LifecycleController","register","shutdown","all","values","map","topic","flush","close","keys","forEach","addPublisher","options","topicArray","Array","join","data","enableOpenTelemetryTracing","messageOrdering","enableMessageOrdering","batching","maxMessages","maxBytes","maxMilliseconds","undefined","addSubscriber","handler","flowControl","allowExcessMessages","ackDeadline","first","push","unshift","publish","attributes","orderingKey","EngineError","publishMessage","json"],"sources":["../../../src/entities/PubSub/PubSub.ts"],"sourcesContent":["import {\n Attributes,\n PubSub as PubsubClient,\n Message\n} from '@google-cloud/pubsub';\nimport { handleMessage } from './handleMessage';\nimport {\n PubSubTopicsMap,\n PubSubSubscriptionsMap,\n PubSubAddSubscriberOptions,\n PubSubMessageHandler,\n PubSubPublisherOptions\n} from './PubSub.types';\nimport { EngineError } from 'entities/EngineError';\nimport { LifecycleController } from 'entities/LifecycleController';\nimport { reportDebug, reportError } from 'utils';\n\nconst namespace = 'engine:PubSub';\n\nconst subscriptions: PubSubSubscriptionsMap = {};\nconst topics: PubSubTopicsMap = {};\n\n/**\n * Add basic retry wrapper\n */\nconst withRetry = async <T>(\n fn: () => Promise<T>,\n retries = 3,\n delay = 500\n): Promise<T> => {\n let lastError: any;\n for (let i = 0; i < retries; i++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n await new Promise((res) => setTimeout(res, delay * (i + 1)));\n }\n }\n throw lastError;\n};\n\n/**\n * PubSub client with safer defaults\n */\nconst pubSubClient = new PubsubClient({\n apiEndpoint: 'pubsub.googleapis.com'\n});\n\n/** Re-open a subscription's message stream after a transient error */\nfunction reattachSubscription(subscriptionName: string, delayMs = 5000): void {\n setTimeout(() => {\n const entry = subscriptions[subscriptionName];\n if (!entry) return;\n const { subscription, handlers, isDebezium } = entry;\n\n reportDebug({ namespace, message: `Reattaching subscription '${subscriptionName}'` });\n\n // Remove all existing listeners before re-adding to avoid duplicates\n subscription.removeAllListeners('message');\n subscription.removeAllListeners('error');\n\n subscription.on('message', (message) => {\n handleMessage(message as Message, subscription, handlers, isDebezium).catch(reportError);\n });\n\n subscription.on('error', (error) => {\n reportError(error);\n // Reconnect on transient errors (DEADLINE_EXCEEDED, UNAVAILABLE, INTERNAL)\n const code = (error as any)?.code;\n if (code === 4 || code === 14 || code === 13) {\n reattachSubscription(subscriptionName, Math.min(delayMs * 2, 60000));\n }\n });\n }, delayMs);\n}\n\nexport const PubSub = {\n /**\n * ✅ FAST + NON-BLOCKING INIT\n */\n async init(): Promise<void> {\n reportDebug({ namespace, message: `Initializing Pub/Sub (safe mode)` });\n\n for (const [subscriptionName, { subscription, handlers, isDebezium }] of Object.entries(\n subscriptions\n )) {\n subscription.on('message', (message) => {\n handleMessage(\n message as Message,\n subscription,\n handlers,\n isDebezium\n ).catch(reportError);\n });\n\n subscription.on('error', (error) => {\n reportError(error);\n // Auto-reconnect on transient gRPC errors (DEADLINE_EXCEEDED=4, UNAVAILABLE=14, INTERNAL=13)\n const code = (error as any)?.code;\n if (code === 4 || code === 14 || code === 13) {\n reattachSubscription(subscriptionName, 5000);\n }\n });\n }\n\n LifecycleController.register(PubSub);\n },\n\n /**\n * Shutdown\n */\n async shutdown(): Promise<void> {\n reportDebug({ namespace, message: `Shutting down Pub/Sub` });\n\n await Promise.all([\n ...Object.values(topics).map(async (topic) => topic.flush()),\n ...Object.values(subscriptions).map(async ({ subscription }) =>\n subscription.close()\n )\n ]);\n\n Object.keys(topics).forEach((topic) => delete topics[topic]);\n Object.keys(subscriptions).forEach(\n (subscription) => delete subscriptions[subscription]\n );\n\n await pubSubClient.close();\n },\n\n /**\n * Publisher registration\n */\n addPublisher(\n topic: string | Array<string>,\n options?: PubSubPublisherOptions\n ): void {\n const topicArray = topic instanceof Array ? topic : [topic];\n\n reportDebug({\n namespace,\n message: `Registering publisher for topics '${topicArray.join(\"', '\")}'`,\n data: options\n });\n\n for (const topic of topicArray) {\n if (!topics[topic]) {\n topics[topic] = pubSubClient.topic(topic, {\n enableOpenTelemetryTracing: true,\n messageOrdering: options?.enableMessageOrdering ?? false,\n batching: options?.batching\n ? {\n maxMessages: options.batching.maxMessages ?? 100,\n maxBytes: options.batching.maxBytes ?? 1024 * 1024,\n maxMilliseconds: options.batching.maxMilliseconds ?? 100\n }\n : undefined\n });\n }\n }\n },\n\n /**\n * Subscriber registration\n */\n addSubscriber<T>(\n subscriptionName: string,\n handler: PubSubMessageHandler<T> | Array<PubSubMessageHandler<T>>,\n options: PubSubAddSubscriberOptions = {}\n ): void {\n const handlers = handler instanceof Array ? handler : [handler];\n\n reportDebug({\n namespace,\n message: `Registering subscriber '${subscriptionName}'`,\n data: options\n });\n\n if (!subscriptions[subscriptionName]) {\n subscriptions[subscriptionName] = {\n subscription: pubSubClient.subscription(subscriptionName, {\n enableOpenTelemetryTracing: true,\n flowControl: options.flowControl ?? {\n maxMessages: 1000,\n maxBytes: 100 * 1024 * 1024,\n allowExcessMessages: true\n },\n ackDeadline: options.ackDeadline ?? 60\n }),\n handlers: [],\n isDebezium: options?.isDebezium ?? false\n };\n }\n\n if (options.first)\n subscriptions[subscriptionName].handlers.push(...handlers);\n else subscriptions[subscriptionName].handlers.unshift(...handlers);\n },\n\n /**\n * ✅ SAFE PUBLISH (with retry)\n */\n async publish(\n topic: string,\n message: unknown,\n attributes?: Attributes,\n orderingKey?: string\n ): Promise<void> {\n if (!topics[topic]) {\n throw new EngineError(`No publisher registered for topic '${topic}'`);\n }\n\n reportDebug({\n namespace,\n message: `Publishing to '${topic}'`,\n data: { message, attributes, orderingKey }\n });\n\n await withRetry(() =>\n topics[topic].publishMessage({\n json: message,\n attributes,\n orderingKey\n })\n );\n }\n};"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-server-engine",
3
- "version": "1.12.2",
3
+ "version": "1.12.3",
4
4
  "description": "Framework used to develop backend services. This package ships with a lot of features to standardize the creation of services, letting you focus on the business logic.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {