@openforis/arena-server 2.8.4 → 2.8.5

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.
@@ -4,7 +4,12 @@ export declare class ClusterBus {
4
4
  private static listenConnection;
5
5
  private static readonly handlers;
6
6
  private static sweepInterval;
7
+ private static reconnectTimeout;
8
+ private static shuttingDown;
7
9
  static init(): Promise<void>;
10
+ private static listen;
11
+ private static readonly onConnectionLost;
12
+ private static scheduleReconnect;
8
13
  static shutdown(): Promise<void>;
9
14
  static onEvent(handler: ClusterEventHandler): void;
10
15
  static publish(event: ClusterEvent): Promise<void>;
@@ -10,21 +10,22 @@ const CHANNEL = 'arena_cluster_event';
10
10
  const RELAY_MESSAGE_TTL_MS = 10 * 60_000;
11
11
  const RELAY_MESSAGE_SWEEP_INTERVAL_MS = 5 * 60_000;
12
12
  const RELAY_MESSAGE_SWEEP_LOCK_NAME = 'ws-relay-message-ttl-sweep';
13
+ const RECONNECT_INITIAL_DELAY_MS = 1000;
14
+ const RECONNECT_MAX_DELAY_MS = 30_000;
13
15
  class ClusterBus {
14
16
  static logger = new log_1.Logger('ClusterBus');
15
17
  static listenConnection = null;
16
18
  static handlers = [];
17
19
  static sweepInterval = null;
20
+ static reconnectTimeout = null;
21
+ static shuttingDown = false;
18
22
  static async init() {
19
23
  if (ClusterBus.listenConnection)
20
24
  return;
21
- const connection = await db_1.DB.connect({ direct: true });
22
- ClusterBus.listenConnection = connection;
23
- connection.client.on('notification', (msg) => {
24
- ClusterBus.onNotification(msg).catch((error) => ClusterBus.logger.error(`error handling notification: ${error}`));
25
- });
26
- await connection.none(`LISTEN ${CHANNEL}`);
27
- ClusterBus.logger.info(`listening on channel "${CHANNEL}"`);
25
+ ClusterBus.shuttingDown = false;
26
+ await ClusterBus.listen();
27
+ if (ClusterBus.sweepInterval)
28
+ return;
28
29
  ClusterBus.sweepInterval = setInterval(() => {
29
30
  (0, clusterLock_1.runWithClusterLock)({
30
31
  lockName: RELAY_MESSAGE_SWEEP_LOCK_NAME,
@@ -35,7 +36,46 @@ class ClusterBus {
35
36
  }, RELAY_MESSAGE_SWEEP_INTERVAL_MS);
36
37
  ClusterBus.sweepInterval.unref();
37
38
  }
39
+ static async listen() {
40
+ const connection = await db_1.DB.connect({ direct: true, onLost: ClusterBus.onConnectionLost });
41
+ connection.client.on('notification', (msg) => {
42
+ ClusterBus.onNotification(msg).catch((error) => ClusterBus.logger.error(`error handling notification: ${error}`));
43
+ });
44
+ try {
45
+ await connection.none(`LISTEN ${CHANNEL}`);
46
+ }
47
+ catch (error) {
48
+ await connection.done();
49
+ throw error;
50
+ }
51
+ ClusterBus.listenConnection = connection;
52
+ ClusterBus.logger.info(`listening on channel "${CHANNEL}"`);
53
+ }
54
+ static onConnectionLost = (error, context) => {
55
+ ClusterBus.logger.error(`LISTEN connection lost: ${error}`);
56
+ context.client.removeAllListeners('notification');
57
+ ClusterBus.listenConnection = null;
58
+ ClusterBus.scheduleReconnect(RECONNECT_INITIAL_DELAY_MS);
59
+ };
60
+ static scheduleReconnect(delayMs) {
61
+ if (ClusterBus.shuttingDown || ClusterBus.reconnectTimeout)
62
+ return;
63
+ ClusterBus.reconnectTimeout = setTimeout(() => {
64
+ ClusterBus.reconnectTimeout = null;
65
+ if (ClusterBus.shuttingDown || ClusterBus.listenConnection)
66
+ return;
67
+ ClusterBus.listen().catch((error) => {
68
+ ClusterBus.logger.error(`error re-establishing LISTEN connection, retrying in ${delayMs}ms: ${error}`);
69
+ ClusterBus.scheduleReconnect(Math.min(delayMs * 2, RECONNECT_MAX_DELAY_MS));
70
+ });
71
+ }, delayMs);
72
+ ClusterBus.reconnectTimeout.unref();
73
+ }
38
74
  static async shutdown() {
75
+ ClusterBus.shuttingDown = true;
76
+ if (ClusterBus.reconnectTimeout)
77
+ clearTimeout(ClusterBus.reconnectTimeout);
78
+ ClusterBus.reconnectTimeout = null;
39
79
  if (ClusterBus.sweepInterval)
40
80
  clearInterval(ClusterBus.sweepInterval);
41
81
  ClusterBus.sweepInterval = null;
@@ -1 +1 @@
1
- {"version":3,"file":"clusterBus.js","sourceRoot":"","sources":["../../src/clusterBus/clusterBus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clusterBus.js","sourceRoot":"","sources":["../../src/clusterBus/clusterBus.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "name": "OpenForis",
5
5
  "email": "openforis.arena@gmail.com"
6
6
  },
7
- "version": "2.8.4",
7
+ "version": "2.8.5",
8
8
  "description": "",
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",