node-consul-service 1.0.70 → 1.0.71

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/dist/index.cjs.js CHANGED
@@ -119,18 +119,60 @@ async function appendDiscoveryLog(targetService, instance, elapsedMs) {
119
119
  }
120
120
  }
121
121
 
122
+ const store = new Map();
123
+ /**
124
+ * Set a value in memory with optional TTL (ms).
125
+ */
126
+ function set(key, value, ttl) {
127
+ const record = { value };
128
+ {
129
+ record.expiresAt = Date.now() + ttl;
130
+ }
131
+ store.set(key, record);
132
+ }
133
+ /**
134
+ * Get a value from memory.
135
+ * Returns undefined if key does not exist or expired.
136
+ */
137
+ function get$1(key) {
138
+ const record = store.get(key);
139
+ if (!record)
140
+ return undefined;
141
+ if (record.expiresAt && record.expiresAt < Date.now()) {
142
+ store.delete(key);
143
+ return undefined;
144
+ }
145
+ return record.value;
146
+ }
147
+
148
+ const CACHE_TTL = 10000; // 10 ثواني – عدلها حسب احتياجك
122
149
  async function listServices() {
150
+ const cacheKey = 'services:list';
151
+ const cached = get$1(cacheKey);
152
+ if (cached)
153
+ return cached;
123
154
  const services = await getClient().agent.service.list();
124
- return Object.values(services);
155
+ const values = Object.values(services);
156
+ set(cacheKey, values, CACHE_TTL);
157
+ return values;
125
158
  }
126
159
  async function getServiceInstances(serviceName) {
160
+ const cacheKey = `services:${serviceName}`;
161
+ const cached = get$1(cacheKey);
162
+ if (cached)
163
+ return cached;
127
164
  const start = Date.now();
128
165
  const services = await getClient().catalog.service.nodes(serviceName);
129
166
  const elapsed = Date.now() - start;
130
167
  console.log(`⏱️ Discovery for ${serviceName} took ${elapsed}ms`);
168
+ set(cacheKey, services, CACHE_TTL);
131
169
  return services;
132
170
  }
133
171
  async function getRandomServiceInstance(serviceName) {
172
+ const cacheKey = `random:${serviceName}`;
173
+ const cached = get$1(cacheKey);
174
+ if (cached)
175
+ return cached;
134
176
  const start = Date.now();
135
177
  const instances = await getServiceInstances(serviceName);
136
178
  if (!instances.length)
@@ -139,11 +181,20 @@ async function getRandomServiceInstance(serviceName) {
139
181
  const instance = instances[randomIndex];
140
182
  const elapsed = Date.now() - start;
141
183
  await appendDiscoveryLog(serviceName, instance, elapsed);
184
+ // cache random instance
185
+ set(cacheKey, instance, CACHE_TTL);
142
186
  return instance;
143
187
  }
144
188
  async function getServiceUrl(serviceName) {
189
+ const cacheKey = `url:${serviceName}`;
190
+ const cached = get$1(cacheKey);
191
+ if (cached)
192
+ return cached;
145
193
  const instance = await getRandomServiceInstance(serviceName);
146
- return `http://${instance.ServiceAddress}:${instance.ServicePort}`;
194
+ const url = `http://${instance.ServiceAddress}:${instance.ServicePort}`;
195
+ // cache url
196
+ set(cacheKey, url, CACHE_TTL);
197
+ return url;
147
198
  }
148
199
 
149
200
  function bind(fn, thisArg) {
@@ -20262,25 +20313,25 @@ const {
20262
20313
  } = axios;
20263
20314
 
20264
20315
  const BASE_LOG_DIR = '/home/log';
20265
- // لازم تكون ضابط اسم السيرفس الحالي في env
20266
20316
  const CURRENT_SERVICE = process.env.SERVICE_NAME || 'unknown-service';
20267
20317
  async function ensureLogDir(dir) {
20268
20318
  await require$$6.promises.mkdir(dir, { recursive: true });
20269
20319
  }
20270
20320
  function getLogFileForStatus(status) {
20321
+ const date = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
20271
20322
  const serviceDir = path.join(BASE_LOG_DIR, CURRENT_SERVICE);
20272
20323
  if (status >= 200 && status < 300)
20273
- return path.join(serviceDir, 'calls-2xx.log');
20324
+ return path.join(serviceDir, `calls-2xx-${date}.log`);
20274
20325
  if (status >= 400 && status < 500)
20275
- return path.join(serviceDir, 'calls-4xx.log');
20326
+ return path.join(serviceDir, `calls-4xx-${date}.log`);
20276
20327
  if (status >= 500 && status < 600)
20277
- return path.join(serviceDir, 'calls-5xx.log');
20278
- return path.join(serviceDir, 'calls-other.log');
20328
+ return path.join(serviceDir, `calls-5xx-${date}.log`);
20329
+ return path.join(serviceDir, `calls-other-${date}.log`);
20279
20330
  }
20280
20331
  function formatCallLogLine(targetService, url, method, status, elapsedMs, errorMessage) {
20281
20332
  const ts = new Date().toISOString();
20282
20333
  const errPart = errorMessage ? ` | Error="${errorMessage}"` : '';
20283
- return `${ts} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
20334
+ return `${ts} | Caller=${CURRENT_SERVICE} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
20284
20335
  }
20285
20336
  async function appendCallLog(targetService, url, method, status, elapsedMs, errorMessage) {
20286
20337
  try {
package/dist/index.esm.js CHANGED
@@ -117,18 +117,60 @@ async function appendDiscoveryLog(targetService, instance, elapsedMs) {
117
117
  }
118
118
  }
119
119
 
120
+ const store = new Map();
121
+ /**
122
+ * Set a value in memory with optional TTL (ms).
123
+ */
124
+ function set(key, value, ttl) {
125
+ const record = { value };
126
+ {
127
+ record.expiresAt = Date.now() + ttl;
128
+ }
129
+ store.set(key, record);
130
+ }
131
+ /**
132
+ * Get a value from memory.
133
+ * Returns undefined if key does not exist or expired.
134
+ */
135
+ function get$1(key) {
136
+ const record = store.get(key);
137
+ if (!record)
138
+ return undefined;
139
+ if (record.expiresAt && record.expiresAt < Date.now()) {
140
+ store.delete(key);
141
+ return undefined;
142
+ }
143
+ return record.value;
144
+ }
145
+
146
+ const CACHE_TTL = 10000; // 10 ثواني – عدلها حسب احتياجك
120
147
  async function listServices() {
148
+ const cacheKey = 'services:list';
149
+ const cached = get$1(cacheKey);
150
+ if (cached)
151
+ return cached;
121
152
  const services = await getClient().agent.service.list();
122
- return Object.values(services);
153
+ const values = Object.values(services);
154
+ set(cacheKey, values, CACHE_TTL);
155
+ return values;
123
156
  }
124
157
  async function getServiceInstances(serviceName) {
158
+ const cacheKey = `services:${serviceName}`;
159
+ const cached = get$1(cacheKey);
160
+ if (cached)
161
+ return cached;
125
162
  const start = Date.now();
126
163
  const services = await getClient().catalog.service.nodes(serviceName);
127
164
  const elapsed = Date.now() - start;
128
165
  console.log(`⏱️ Discovery for ${serviceName} took ${elapsed}ms`);
166
+ set(cacheKey, services, CACHE_TTL);
129
167
  return services;
130
168
  }
131
169
  async function getRandomServiceInstance(serviceName) {
170
+ const cacheKey = `random:${serviceName}`;
171
+ const cached = get$1(cacheKey);
172
+ if (cached)
173
+ return cached;
132
174
  const start = Date.now();
133
175
  const instances = await getServiceInstances(serviceName);
134
176
  if (!instances.length)
@@ -137,11 +179,20 @@ async function getRandomServiceInstance(serviceName) {
137
179
  const instance = instances[randomIndex];
138
180
  const elapsed = Date.now() - start;
139
181
  await appendDiscoveryLog(serviceName, instance, elapsed);
182
+ // cache random instance
183
+ set(cacheKey, instance, CACHE_TTL);
140
184
  return instance;
141
185
  }
142
186
  async function getServiceUrl(serviceName) {
187
+ const cacheKey = `url:${serviceName}`;
188
+ const cached = get$1(cacheKey);
189
+ if (cached)
190
+ return cached;
143
191
  const instance = await getRandomServiceInstance(serviceName);
144
- return `http://${instance.ServiceAddress}:${instance.ServicePort}`;
192
+ const url = `http://${instance.ServiceAddress}:${instance.ServicePort}`;
193
+ // cache url
194
+ set(cacheKey, url, CACHE_TTL);
195
+ return url;
145
196
  }
146
197
 
147
198
  function bind(fn, thisArg) {
@@ -20260,25 +20311,25 @@ const {
20260
20311
  } = axios;
20261
20312
 
20262
20313
  const BASE_LOG_DIR = '/home/log';
20263
- // لازم تكون ضابط اسم السيرفس الحالي في env
20264
20314
  const CURRENT_SERVICE = process.env.SERVICE_NAME || 'unknown-service';
20265
20315
  async function ensureLogDir(dir) {
20266
20316
  await promises.mkdir(dir, { recursive: true });
20267
20317
  }
20268
20318
  function getLogFileForStatus(status) {
20319
+ const date = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
20269
20320
  const serviceDir = path.join(BASE_LOG_DIR, CURRENT_SERVICE);
20270
20321
  if (status >= 200 && status < 300)
20271
- return path.join(serviceDir, 'calls-2xx.log');
20322
+ return path.join(serviceDir, `calls-2xx-${date}.log`);
20272
20323
  if (status >= 400 && status < 500)
20273
- return path.join(serviceDir, 'calls-4xx.log');
20324
+ return path.join(serviceDir, `calls-4xx-${date}.log`);
20274
20325
  if (status >= 500 && status < 600)
20275
- return path.join(serviceDir, 'calls-5xx.log');
20276
- return path.join(serviceDir, 'calls-other.log');
20326
+ return path.join(serviceDir, `calls-5xx-${date}.log`);
20327
+ return path.join(serviceDir, `calls-other-${date}.log`);
20277
20328
  }
20278
20329
  function formatCallLogLine(targetService, url, method, status, elapsedMs, errorMessage) {
20279
20330
  const ts = new Date().toISOString();
20280
20331
  const errPart = errorMessage ? ` | Error="${errorMessage}"` : '';
20281
- return `${ts} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
20332
+ return `${ts} | Caller=${CURRENT_SERVICE} | Target=${targetService} | ${method.toUpperCase()} ${url} | Status=${status} | Elapsed=${elapsedMs}ms${errPart}\n`;
20282
20333
  }
20283
20334
  async function appendCallLog(targetService, url, method, status, elapsedMs, errorMessage) {
20284
20335
  try {
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Set a value in memory with optional TTL (ms).
3
+ */
4
+ export declare function set(key: string, value: any, ttl?: number): void;
5
+ /**
6
+ * Get a value from memory.
7
+ * Returns undefined if key does not exist or expired.
8
+ */
9
+ export declare function get<T = any>(key: string): T | undefined;
10
+ /**
11
+ * Delete a value.
12
+ */
13
+ export declare function del(key: string): void;
14
+ /**
15
+ * Clear all keys.
16
+ */
17
+ export declare function clear(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-consul-service",
3
- "version": "1.0.70",
3
+ "version": "1.0.71",
4
4
  "main": "dist/index.cjs.js",
5
5
  "module": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",