@hile/micro 1.0.8 → 1.0.9

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.
@@ -34,16 +34,12 @@ export declare class Application extends Server {
34
34
  private readonly _registryLookupTimeoutMs;
35
35
  private readonly _requestTimeoutMs;
36
36
  private readonly namespaces;
37
- private static readonly HEARTBEAT_INTERVAL;
38
- private heartbeatTimer?;
39
37
  private static readonly CB_COOLDOWN_MS;
40
38
  private readonly circuitBreakers;
41
39
  constructor(props: ApplicationProps);
42
40
  listen(port?: number): Promise<() => Promise<void>>;
43
41
  private scheduleRegistryRetry;
44
42
  private reconnectToRegistry;
45
- private startHeartbeat;
46
- private stopHeartbeat;
47
43
  private recordSuccess;
48
44
  private recordFailure;
49
45
  private getActiveExcludes;
@@ -46,8 +46,6 @@ export class Application extends Server {
46
46
  _registryLookupTimeoutMs;
47
47
  _requestTimeoutMs;
48
48
  namespaces = new Map();
49
- static HEARTBEAT_INTERVAL = 10000;
50
- heartbeatTimer;
51
49
  static CB_COOLDOWN_MS = 30_000;
52
50
  circuitBreakers = new Map();
53
51
  constructor(props) {
@@ -69,7 +67,6 @@ export class Application extends Server {
69
67
  const callback = await super.listen(port);
70
68
  try {
71
69
  await this.reconnectToRegistry();
72
- this.startHeartbeat();
73
70
  }
74
71
  catch (err) {
75
72
  try {
@@ -82,7 +79,6 @@ export class Application extends Server {
82
79
  }
83
80
  return async () => {
84
81
  this.stopped = true;
85
- this.stopHeartbeat();
86
82
  if (this.reconnectTimeout) {
87
83
  clearTimeout(this.reconnectTimeout);
88
84
  this.reconnectTimeout = undefined;
@@ -134,25 +130,6 @@ export class Application extends Server {
134
130
  });
135
131
  return this.registryReconnectPromise;
136
132
  }
137
- startHeartbeat() {
138
- this.stopHeartbeat();
139
- this.heartbeatTimer = setInterval(() => {
140
- if (!this.registry)
141
- return;
142
- try {
143
- this.registry.push('/-/heartbeat', {});
144
- }
145
- catch {
146
- // registry connection may have dropped between null-check and push
147
- }
148
- }, Application.HEARTBEAT_INTERVAL);
149
- }
150
- stopHeartbeat() {
151
- if (this.heartbeatTimer) {
152
- clearInterval(this.heartbeatTimer);
153
- this.heartbeatTimer = undefined;
154
- }
155
- }
156
133
  recordSuccess(ns, host, port) {
157
134
  const excludes = this.circuitBreakers.get(ns);
158
135
  if (excludes) {
package/dist/client.d.ts CHANGED
@@ -14,8 +14,12 @@ export declare class Client extends MessageWs {
14
14
  readonly host: string;
15
15
  readonly port: number;
16
16
  private _online;
17
+ private lastHeartbeat;
18
+ private heartbeatTimer?;
19
+ private checkTimer?;
17
20
  readonly events: EventEmitter<any>;
18
21
  constructor(props: ClientProps);
22
+ private startHeartbeat;
19
23
  protected exec(data: {
20
24
  url: string;
21
25
  data: any;
package/dist/client.js CHANGED
@@ -7,6 +7,9 @@ export class Client extends MessageWs {
7
7
  host;
8
8
  port;
9
9
  _online = true;
10
+ lastHeartbeat = Date.now();
11
+ heartbeatTimer;
12
+ checkTimer;
10
13
  events = new EventEmitter();
11
14
  constructor(props) {
12
15
  const { server, ws, host, port } = props;
@@ -17,8 +20,32 @@ export class Client extends MessageWs {
17
20
  this.port = port;
18
21
  this.events.on('connect', () => this._online = true);
19
22
  this.events.on('disconnect', () => this._online = false);
23
+ this.lastHeartbeat = Date.now();
24
+ this.startHeartbeat();
25
+ }
26
+ startHeartbeat() {
27
+ const interval = Number(process.env.MICRO_HEARTBEAT_INTERVAL) || 10_000;
28
+ const timeout = Number(process.env.MICRO_HEARTBEAT_TIMEOUT) || 20_000;
29
+ const checkInterval = Number(process.env.MICRO_HEARTBEAT_CHECK_INTERVAL) || 5_000;
30
+ this.heartbeatTimer = setInterval(() => {
31
+ try {
32
+ this._push({ url: '/-/heartbeat', data: {} });
33
+ }
34
+ catch {
35
+ // connection closed — will be cleaned up by checkTimer or close event
36
+ }
37
+ }, interval);
38
+ this.checkTimer = setInterval(() => {
39
+ if (Date.now() - this.lastHeartbeat > timeout) {
40
+ this.dispose();
41
+ }
42
+ }, checkInterval);
20
43
  }
21
44
  async exec(data) {
45
+ if (data.url === '/-/heartbeat') {
46
+ this.lastHeartbeat = Date.now();
47
+ return;
48
+ }
22
49
  if (!this._online)
23
50
  throw new Error('Client is not online');
24
51
  return this.server.dispatch(data.url, data.data, {
@@ -36,6 +63,10 @@ export class Client extends MessageWs {
36
63
  return this._push({ url, data }, timeout);
37
64
  }
38
65
  dispose() {
66
+ if (this.heartbeatTimer)
67
+ clearInterval(this.heartbeatTimer);
68
+ if (this.checkTimer)
69
+ clearInterval(this.checkTimer);
39
70
  super.dispose();
40
71
  if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {
41
72
  this.socket.close();
@@ -16,9 +16,6 @@ export declare function parseConfigFilename(filename: string): string | null;
16
16
  export declare class Registry extends Server {
17
17
  private readonly namespaces;
18
18
  private unregisterFind?;
19
- private static readonly HEARTBEAT_INTERVAL;
20
- private static readonly HEARTBEAT_TIMEOUT;
21
- private readonly heartbeats;
22
19
  private readonly workspace;
23
20
  private readonly configFileSuffix;
24
21
  private readonly configs;
package/dist/registry.js CHANGED
@@ -42,9 +42,6 @@ export function parseConfigFilename(filename) {
42
42
  export class Registry extends Server {
43
43
  namespaces = new Map();
44
44
  unregisterFind;
45
- static HEARTBEAT_INTERVAL = 1000;
46
- static HEARTBEAT_TIMEOUT = 20000;
47
- heartbeats = new Map();
48
45
  workspace;
49
46
  configFileSuffix = '.config.yaml';
50
47
  configs = new Map();
@@ -57,7 +54,6 @@ export class Registry extends Server {
57
54
  this.workspace = workspace;
58
55
  this.events.on('connect', (client, extras) => {
59
56
  const key = client.host + ':' + client.port;
60
- this.heartbeats.set(key, Date.now());
61
57
  const namespace = extras.join('/');
62
58
  if (!this.namespaces.has(namespace)) {
63
59
  this.namespaces.set(namespace, new Set());
@@ -66,7 +62,6 @@ export class Registry extends Server {
66
62
  });
67
63
  this.events.on('disconnect', (client, extras) => {
68
64
  const key = client.host + ':' + client.port;
69
- this.heartbeats.delete(key);
70
65
  const namespace = extras.join('/');
71
66
  if (this.namespaces.has(namespace)) {
72
67
  const keys = this.namespaces.get(namespace);
@@ -80,12 +75,6 @@ export class Registry extends Server {
80
75
  });
81
76
  this.mountFindHandler();
82
77
  this.registerEnvVariables();
83
- this.register('/-/heartbeat', async ({ client }) => {
84
- if (!client)
85
- return;
86
- const key = client.host + ':' + client.port;
87
- this.heartbeats.set(key, Date.now());
88
- });
89
78
  }
90
79
  watchEnvFile() {
91
80
  const configFile = resolve(this.workspace, 'configs');
@@ -119,23 +108,10 @@ export class Registry extends Server {
119
108
  if (!_port || _port <= 0)
120
109
  throw new Error('Unable to resolve registry port: pass `port` in constructor options, or ensure process.env.REGISTRY_PORT is set.');
121
110
  const teardown = await super.listen(_port);
122
- const timer = setInterval(() => {
123
- const now = Date.now();
124
- for (const [key, lastTime] of this.heartbeats) {
125
- if (now - lastTime >= Registry.HEARTBEAT_TIMEOUT) {
126
- const client = this.clients.get(key);
127
- if (client) {
128
- this.heartbeats.delete(key);
129
- client.dispose();
130
- }
131
- }
132
- }
133
- }, Registry.HEARTBEAT_INTERVAL);
134
111
  const watcher = this.watchEnvFile();
135
112
  return async () => {
136
113
  if (watcher)
137
114
  watcher.close();
138
- clearInterval(timer);
139
115
  await teardown();
140
116
  };
141
117
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hile/micro",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -29,5 +29,5 @@
29
29
  "ws": "^8.19.0",
30
30
  "yaml": "^2.9.0"
31
31
  },
32
- "gitHead": "6c83f2e29de07a48e8467456b56351d304e45932"
32
+ "gitHead": "fa7d6d442ab080e6a395ee2a1dacac9eae340cf6"
33
33
  }