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 +59 -8
- package/dist/index.esm.js +59 -8
- package/dist/utils/memoryStore.d.ts +17 -0
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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,
|
|
20324
|
+
return path.join(serviceDir, `calls-2xx-${date}.log`);
|
|
20274
20325
|
if (status >= 400 && status < 500)
|
|
20275
|
-
return path.join(serviceDir,
|
|
20326
|
+
return path.join(serviceDir, `calls-4xx-${date}.log`);
|
|
20276
20327
|
if (status >= 500 && status < 600)
|
|
20277
|
-
return path.join(serviceDir,
|
|
20278
|
-
return path.join(serviceDir,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
20322
|
+
return path.join(serviceDir, `calls-2xx-${date}.log`);
|
|
20272
20323
|
if (status >= 400 && status < 500)
|
|
20273
|
-
return path.join(serviceDir,
|
|
20324
|
+
return path.join(serviceDir, `calls-4xx-${date}.log`);
|
|
20274
20325
|
if (status >= 500 && status < 600)
|
|
20275
|
-
return path.join(serviceDir,
|
|
20276
|
-
return path.join(serviceDir,
|
|
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;
|