node-server-engine 1.12.1 → 1.12.2

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.
@@ -1,38 +1,24 @@
1
1
  import { Attributes } from '@google-cloud/pubsub';
2
2
  import { PubSubAddSubscriberOptions, PubSubMessageHandler, PubSubPublisherOptions } from './PubSub.types';
3
- /**
4
- * This is a singleton service who's role is to manage pub/sub connections
5
- * It is the preferred way to interact with Pub/Sub as it manages the underlying subscription and handler objects
6
- * It avoids potential subscription splitting on an instance
7
- */
8
3
  export declare const PubSub: {
9
4
  /**
10
- * Initialize the registered publishers and subscribers
5
+ * ✅ FAST + NON-BLOCKING INIT
11
6
  */
12
7
  init(): Promise<void>;
13
8
  /**
14
- * Shutdown the registered publishers and subscribers
9
+ * Shutdown
15
10
  */
16
11
  shutdown(): Promise<void>;
17
12
  /**
18
- * Creates a publisher if it does not exist yet
19
- * @param topic - Topic name or array of topic names
20
- * @param options - Publisher configuration options
13
+ * Publisher registration
21
14
  */
22
15
  addPublisher(topic: string | Array<string>, options?: PubSubPublisherOptions): void;
23
16
  /**
24
- * Add message handlers to a subscription
25
- * @param subscription - Name of the Pub/Sub subscription
26
- * @param handler - Function or list of functions to set as message handlers
27
- * @param options - Indicates that the additional options need to handle on Subscriber
17
+ * Subscriber registration
28
18
  */
29
- addSubscriber<T>(subscription: string, handler: PubSubMessageHandler<T> | Array<PubSubMessageHandler<T>>, options?: PubSubAddSubscriberOptions): void;
19
+ addSubscriber<T>(subscriptionName: string, handler: PubSubMessageHandler<T> | Array<PubSubMessageHandler<T>>, options?: PubSubAddSubscriberOptions): void;
30
20
  /**
31
- * Send a message to a Pub/Sub topic
32
- * @param topic - Name of the topic
33
- * @param message - Content of the message, must be an object that can be JSON stringified
34
- * @param attributes - Attributes for this message, can be used to filter messages on the subscription
35
- * @param orderingKey - Enforce order guarantee of messages sent with the same key
21
+ * ✅ SAFE PUBLISH (with retry)
36
22
  */
37
23
  publish(topic: string, message: unknown, attributes?: Attributes, orderingKey?: string): Promise<void>;
38
24
  };
@@ -10,91 +10,71 @@ var _EngineError = require("../EngineError");
10
10
  var _LifecycleController = require("../LifecycleController");
11
11
  var _utils = require("../../utils");
12
12
  const namespace = 'engine:PubSub';
13
-
14
- /**
15
- * Associative containing all the subscriptions sorted by topic registered for publishing
16
- */
17
13
  const subscriptions = {};
14
+ const topics = {};
18
15
 
19
16
  /**
20
- * Associative containing all the topics registered for publishing
17
+ * Add basic retry wrapper
21
18
  */
22
- const topics = {};
23
- const pubSubClient = new _pubsub.PubSub();
19
+ const withRetry = async (fn, retries = 3, delay = 500) => {
20
+ let lastError;
21
+ for (let i = 0; i < retries; i++) {
22
+ try {
23
+ return await fn();
24
+ } catch (err) {
25
+ lastError = err;
26
+ await new Promise(res => setTimeout(res, delay * (i + 1)));
27
+ }
28
+ }
29
+ throw lastError;
30
+ };
24
31
 
25
32
  /**
26
- * This is a singleton service who's role is to manage pub/sub connections
27
- * It is the preferred way to interact with Pub/Sub as it manages the underlying subscription and handler objects
28
- * It avoids potential subscription splitting on an instance
33
+ * PubSub client with safer defaults
29
34
  */
35
+ const pubSubClient = new _pubsub.PubSub({
36
+ apiEndpoint: 'pubsub.googleapis.com'
37
+ });
30
38
  const PubSub = exports.PubSub = {
31
39
  /**
32
- * Initialize the registered publishers and subscribers
40
+ * ✅ FAST + NON-BLOCKING INIT
33
41
  */
34
42
  async init() {
35
43
  (0, _utils.reportDebug)({
36
44
  namespace,
37
- message: `Initializing Pub/Sub`
45
+ message: `Initializing Pub/Sub (safe mode)`
38
46
  });
39
- // Check that all topics/permissions exist, and that we have permission on them
40
- await Promise.all([
41
- // Test that all topics actually exist and that we have permissions
42
- ...Object.values(topics).map(async topic => {
43
- const [exists] = await topic.exists();
44
- if (!exists) throw new _EngineError.EngineError(`Topic ${topic.name} does not exist`);
45
- // Test permission ton publish to topic
46
- const [permissions] = await topic.iam.testPermissions(['pubsub.topics.publish']);
47
- const hasPermissions = Object.values(permissions).every(success => success);
48
- if (!hasPermissions) throw new _EngineError.EngineError(`Instance does not have appropriate permissions to publish to topic ${topic.name}`);
49
- }),
50
- // Test that all subscriptions actually exist and that we have permissions
51
- ...Object.values(subscriptions).map(async ({
52
- subscription
53
- }) => {
54
- const [exists] = await subscription.exists();
55
- if (!exists) throw new _EngineError.EngineError(`Subscription ${subscription.name} does not exist`);
56
- // Test permission ton consume subscription
57
- const [permissions] = await subscription.iam.testPermissions(['pubsub.subscriptions.consume']);
58
- const hasPermissions = Object.values(permissions).every(success => success);
59
- if (!hasPermissions) throw new _EngineError.EngineError(`Instance does not have appropriate permissions to subscribe to subscription ${subscription.name}`);
60
- })]);
61
-
62
- // Register handlers on the subscriptions to activate them
63
47
  for (const {
64
48
  subscription,
65
49
  handlers,
66
50
  isDebezium
67
51
  } of Object.values(subscriptions)) {
68
52
  subscription.on('message', message => {
69
- (0, _handleMessage.handleMessage)(message, subscription, handlers, isDebezium).catch(error => {
70
- (0, _utils.reportError)(error);
71
- });
53
+ (0, _handleMessage.handleMessage)(message, subscription, handlers, isDebezium).catch(_utils.reportError);
54
+ });
55
+ subscription.on('error', error => {
56
+ (0, _utils.reportError)(error);
72
57
  });
73
58
  }
74
59
  _LifecycleController.LifecycleController.register(PubSub);
75
60
  },
76
61
  /**
77
- * Shutdown the registered publishers and subscribers
62
+ * Shutdown
78
63
  */
79
64
  async shutdown() {
80
65
  (0, _utils.reportDebug)({
81
66
  namespace,
82
67
  message: `Shutting down Pub/Sub`
83
68
  });
84
- // Flush all pending messages and shut down connections
85
69
  await Promise.all([...Object.values(topics).map(async topic => topic.flush()), ...Object.values(subscriptions).map(async ({
86
70
  subscription
87
71
  }) => subscription.close())]);
88
- // Delete the stored topics/subscriptions
89
72
  Object.keys(topics).forEach(topic => delete topics[topic]);
90
73
  Object.keys(subscriptions).forEach(subscription => delete subscriptions[subscription]);
91
- // Close the client
92
74
  await pubSubClient.close();
93
75
  },
94
76
  /**
95
- * Creates a publisher if it does not exist yet
96
- * @param topic - Topic name or array of topic names
97
- * @param options - Publisher configuration options
77
+ * Publisher registration
98
78
  */
99
79
  addPublisher(topic, options) {
100
80
  const topicArray = topic instanceof Array ? topic : [topic];
@@ -103,104 +83,68 @@ const PubSub = exports.PubSub = {
103
83
  message: `Registering publisher for topics '${topicArray.join("', '")}'`,
104
84
  data: options
105
85
  });
106
- // Register a new topic if it does not exist yet
107
86
  for (const topic of topicArray) {
108
- if (!Object.keys(topics).includes(topic)) {
87
+ if (!topics[topic]) {
109
88
  topics[topic] = pubSubClient.topic(topic, {
110
89
  enableOpenTelemetryTracing: true,
111
90
  messageOrdering: options?.enableMessageOrdering ?? false,
112
91
  batching: options?.batching ? {
113
92
  maxMessages: options.batching.maxMessages ?? 100,
114
93
  maxBytes: options.batching.maxBytes ?? 1024 * 1024,
115
- // 1MB
116
94
  maxMilliseconds: options.batching.maxMilliseconds ?? 100
117
- } : undefined,
118
- gaxOpts: options?.retry ? {
119
- retry: {
120
- retryCodes: [10, 14],
121
- // ABORTED, UNAVAILABLE
122
- backoffSettings: {
123
- initialRetryDelayMillis: options.retry.initialDelayMillis ?? 100,
124
- maxRetryDelayMillis: options.retry.maxDelayMillis ?? 60000,
125
- retryDelayMultiplier: options.retry.delayMultiplier ?? 1.3,
126
- initialRpcTimeoutMillis: 60000,
127
- maxRpcTimeoutMillis: 600000,
128
- rpcTimeoutMultiplier: 1.0,
129
- totalTimeoutMillis: 600000
130
- }
131
- }
132
95
  } : undefined
133
96
  });
134
97
  }
135
98
  }
136
99
  },
137
100
  /**
138
- * Add message handlers to a subscription
139
- * @param subscription - Name of the Pub/Sub subscription
140
- * @param handler - Function or list of functions to set as message handlers
141
- * @param options - Indicates that the additional options need to handle on Subscriber
101
+ * Subscriber registration
142
102
  */
143
- addSubscriber(subscription, handler, options = {}) {
103
+ addSubscriber(subscriptionName, handler, options = {}) {
144
104
  const handlers = handler instanceof Array ? handler : [handler];
145
- const isDebezium = options?.isDebezium ?? false;
146
- const first = options?.first ?? false;
147
- const flowControl = options?.flowControl;
148
- const ackDeadline = options?.ackDeadline;
149
105
  (0, _utils.reportDebug)({
150
106
  namespace,
151
- message: `Registering subscriber for subscription '${subscription}'`,
152
- data: {
153
- first,
154
- handlersCount: handlers.length,
155
- isDebezium,
156
- flowControl
157
- }
107
+ message: `Registering subscriber '${subscriptionName}'`,
108
+ data: options
158
109
  });
159
- if (!Object.keys(subscriptions).includes(subscription)) {
160
- subscriptions[subscription] = {
161
- subscription: pubSubClient.subscription(subscription, {
110
+ if (!subscriptions[subscriptionName]) {
111
+ subscriptions[subscriptionName] = {
112
+ subscription: pubSubClient.subscription(subscriptionName, {
162
113
  enableOpenTelemetryTracing: true,
163
- flowControl: flowControl ? {
164
- maxMessages: flowControl.maxMessages ?? 1000,
165
- maxBytes: flowControl.maxBytes ?? 100 * 1024 * 1024,
166
- // 100MB
167
- allowExcessMessages: flowControl.allowExcessMessages ?? true
168
- } : {
114
+ flowControl: options.flowControl ?? {
169
115
  maxMessages: 1000,
170
116
  maxBytes: 100 * 1024 * 1024,
171
117
  allowExcessMessages: true
172
118
  },
173
- ackDeadline: ackDeadline ?? 60
119
+ ackDeadline: options.ackDeadline ?? 60
174
120
  }),
175
- handlers: []
121
+ handlers: [],
122
+ isDebezium: options?.isDebezium ?? false
176
123
  };
177
124
  }
178
- if (isDebezium) subscriptions[subscription].isDebezium = true;
179
- if (first) subscriptions[subscription].handlers.push(...handlers);else subscriptions[subscription].handlers.unshift(...handlers);
125
+ if (options.first) subscriptions[subscriptionName].handlers.push(...handlers);else subscriptions[subscriptionName].handlers.unshift(...handlers);
180
126
  },
181
127
  /**
182
- * Send a message to a Pub/Sub topic
183
- * @param topic - Name of the topic
184
- * @param message - Content of the message, must be an object that can be JSON stringified
185
- * @param attributes - Attributes for this message, can be used to filter messages on the subscription
186
- * @param orderingKey - Enforce order guarantee of messages sent with the same key
128
+ * ✅ SAFE PUBLISH (with retry)
187
129
  */
188
130
  async publish(topic, message, attributes, orderingKey) {
189
- if (!topics[topic]) throw new _EngineError.EngineError(`No publisher was registered for topic '${topic}'`);
131
+ if (!topics[topic]) {
132
+ throw new _EngineError.EngineError(`No publisher registered for topic '${topic}'`);
133
+ }
190
134
  (0, _utils.reportDebug)({
191
135
  namespace,
192
- message: `Sending message to topic '${topic}'`,
136
+ message: `Publishing to '${topic}'`,
193
137
  data: {
194
138
  message,
195
139
  attributes,
196
140
  orderingKey
197
141
  }
198
142
  });
199
- await topics[topic].publishMessage({
143
+ await withRetry(() => topics[topic].publishMessage({
200
144
  json: message,
201
145
  attributes,
202
146
  orderingKey
203
- });
147
+ }));
204
148
  }
205
149
  };
206
150
  //# sourceMappingURL=PubSub.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PubSub.js","names":["_pubsub","require","_handleMessage","_EngineError","_LifecycleController","_utils","namespace","subscriptions","topics","pubSubClient","PubsubClient","PubSub","exports","init","reportDebug","message","Promise","all","Object","values","map","topic","exists","EngineError","name","permissions","iam","testPermissions","hasPermissions","every","success","subscription","handlers","isDebezium","on","handleMessage","catch","error","reportError","LifecycleController","register","shutdown","flush","close","keys","forEach","addPublisher","options","topicArray","Array","join","data","includes","enableOpenTelemetryTracing","messageOrdering","enableMessageOrdering","batching","maxMessages","maxBytes","maxMilliseconds","undefined","gaxOpts","retry","retryCodes","backoffSettings","initialRetryDelayMillis","initialDelayMillis","maxRetryDelayMillis","maxDelayMillis","retryDelayMultiplier","delayMultiplier","initialRpcTimeoutMillis","maxRpcTimeoutMillis","rpcTimeoutMultiplier","totalTimeoutMillis","addSubscriber","handler","first","flowControl","ackDeadline","handlersCount","length","allowExcessMessages","push","unshift","publish","attributes","orderingKey","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\n/**\n * Associative containing all the subscriptions sorted by topic registered for publishing\n */\nconst subscriptions: PubSubSubscriptionsMap = {};\n\n/**\n * Associative containing all the topics registered for publishing\n */\nconst topics: PubSubTopicsMap = {};\n\nconst pubSubClient = new PubsubClient();\n\n/**\n * This is a singleton service who's role is to manage pub/sub connections\n * It is the preferred way to interact with Pub/Sub as it manages the underlying subscription and handler objects\n * It avoids potential subscription splitting on an instance\n */\nexport const PubSub = {\n /**\n * Initialize the registered publishers and subscribers\n */\n async init(): Promise<void> {\n reportDebug({ namespace, message: `Initializing Pub/Sub` });\n // Check that all topics/permissions exist, and that we have permission on them\n await Promise.all([\n // Test that all topics actually exist and that we have permissions\n ...Object.values(topics).map(async (topic) => {\n const [exists] = await topic.exists();\n if (!exists)\n throw new EngineError(`Topic ${topic.name} does not exist`);\n // Test permission ton publish to topic\n const [permissions] = await topic.iam.testPermissions([\n 'pubsub.topics.publish'\n ]);\n const hasPermissions = Object.values(permissions).every(\n (success) => success\n );\n if (!hasPermissions)\n throw new EngineError(\n `Instance does not have appropriate permissions to publish to topic ${topic.name}`\n );\n }),\n // Test that all subscriptions actually exist and that we have permissions\n ...Object.values(subscriptions).map(async ({ subscription }) => {\n const [exists] = await subscription.exists();\n if (!exists)\n throw new EngineError(\n `Subscription ${subscription.name} does not exist`\n );\n // Test permission ton consume subscription\n const [permissions] = await subscription.iam.testPermissions([\n 'pubsub.subscriptions.consume'\n ]);\n const hasPermissions = Object.values(permissions).every(\n (success) => success\n );\n if (!hasPermissions)\n throw new EngineError(\n `Instance does not have appropriate permissions to subscribe to subscription ${subscription.name}`\n );\n })\n ]);\n\n // Register handlers on the subscriptions to activate them\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((error) => {\n reportError(error);\n });\n });\n }\n\n LifecycleController.register(PubSub);\n },\n\n /**\n * Shutdown the registered publishers and subscribers\n */\n async shutdown(): Promise<void> {\n reportDebug({ namespace, message: `Shutting down Pub/Sub` });\n // Flush all pending messages and shut down connections\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 // Delete the stored topics/subscriptions\n Object.keys(topics).forEach((topic) => delete topics[topic]);\n Object.keys(subscriptions).forEach(\n (subscription) => delete subscriptions[subscription]\n );\n // Close the client\n await pubSubClient.close();\n },\n\n /**\n * Creates a publisher if it does not exist yet\n * @param topic - Topic name or array of topic names\n * @param options - Publisher configuration options\n */\n addPublisher(\n topic: string | Array<string>,\n options?: PubSubPublisherOptions\n ): void {\n const topicArray = topic instanceof Array ? topic : [topic];\n reportDebug({\n namespace,\n message: `Registering publisher for topics '${topicArray.join(\"', '\")}'`,\n data: options\n });\n // Register a new topic if it does not exist yet\n for (const topic of topicArray) {\n if (!Object.keys(topics).includes(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, // 1MB\n maxMilliseconds: options.batching.maxMilliseconds ?? 100\n }\n : undefined,\n gaxOpts: options?.retry\n ? {\n retry: {\n retryCodes: [10, 14], // ABORTED, UNAVAILABLE\n backoffSettings: {\n initialRetryDelayMillis:\n options.retry.initialDelayMillis ?? 100,\n maxRetryDelayMillis: options.retry.maxDelayMillis ?? 60000,\n retryDelayMultiplier: options.retry.delayMultiplier ?? 1.3,\n initialRpcTimeoutMillis: 60000,\n maxRpcTimeoutMillis: 600000,\n rpcTimeoutMultiplier: 1.0,\n totalTimeoutMillis: 600000\n }\n }\n }\n : undefined\n });\n }\n }\n },\n\n /**\n * Add message handlers to a subscription\n * @param subscription - Name of the Pub/Sub subscription\n * @param handler - Function or list of functions to set as message handlers\n * @param options - Indicates that the additional options need to handle on Subscriber\n */\n addSubscriber<T>(\n subscription: string,\n handler: PubSubMessageHandler<T> | Array<PubSubMessageHandler<T>>,\n options: PubSubAddSubscriberOptions = {}\n ): void {\n const handlers = handler instanceof Array ? handler : [handler];\n const isDebezium = options?.isDebezium ?? false;\n const first = options?.first ?? false;\n const flowControl = options?.flowControl;\n const ackDeadline = options?.ackDeadline;\n\n reportDebug({\n namespace,\n message: `Registering subscriber for subscription '${subscription}'`,\n data: {\n first,\n handlersCount: handlers.length,\n isDebezium,\n flowControl\n }\n });\n if (!Object.keys(subscriptions).includes(subscription)) {\n subscriptions[subscription] = {\n subscription: pubSubClient.subscription(subscription, {\n enableOpenTelemetryTracing: true,\n flowControl: flowControl\n ? {\n maxMessages: flowControl.maxMessages ?? 1000,\n maxBytes: flowControl.maxBytes ?? 100 * 1024 * 1024, // 100MB\n allowExcessMessages: flowControl.allowExcessMessages ?? true\n }\n : {\n maxMessages: 1000,\n maxBytes: 100 * 1024 * 1024,\n allowExcessMessages: true\n },\n ackDeadline: ackDeadline ?? 60\n }),\n handlers: []\n };\n }\n\n if (isDebezium) subscriptions[subscription].isDebezium = true;\n\n if (first) subscriptions[subscription].handlers.push(...handlers);\n else subscriptions[subscription].handlers.unshift(...handlers);\n },\n\n /**\n * Send a message to a Pub/Sub topic\n * @param topic - Name of the topic\n * @param message - Content of the message, must be an object that can be JSON stringified\n * @param attributes - Attributes for this message, can be used to filter messages on the subscription\n * @param orderingKey - Enforce order guarantee of messages sent with the same key\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 was registered for topic '${topic}'`);\n reportDebug({\n namespace,\n message: `Sending message to topic '${topic}'`,\n data: { message, attributes, orderingKey }\n });\n await 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","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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-server-engine",
3
- "version": "1.12.1",
3
+ "version": "1.12.2",
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": {