@steedos/service-metadata 2.2.38 → 2.2.41
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/lib/actionsHandler.d.ts +3 -8
- package/lib/actionsHandler.js +30 -622
- package/lib/actionsHandler.js.map +1 -1
- package/lib/metadata.service.js +5 -5
- package/lib/metadata.service.js.map +1 -1
- package/package.json +3 -2
- package/src/actionsHandler.ts +30 -596
- package/src/metadata.service.ts +4 -5
package/src/actionsHandler.ts
CHANGED
|
@@ -1,651 +1,85 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/*
|
|
2
|
+
* @Author: baozhoutao@steedos.com
|
|
3
|
+
* @Date: 2022-06-10 18:35:07
|
|
4
|
+
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
+
* @LastEditTime: 2022-06-10 23:50:45
|
|
6
|
+
* @Description:
|
|
7
|
+
*/
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const useScan = true;
|
|
11
|
-
|
|
12
|
-
async function redisScanKeys(redisClient, match, count = 10000): Promise<Array<string>> {
|
|
13
|
-
if (!useScan) {
|
|
14
|
-
return await redisClient.keys(match);
|
|
15
|
-
} else {
|
|
16
|
-
return await new Promise((resolve, reject) => {
|
|
17
|
-
if (_.isFunction(redisClient.scanStream)) {
|
|
18
|
-
var stream = redisClient.scanStream({
|
|
19
|
-
// only returns keys following the pattern of `user:*`
|
|
20
|
-
match: match,
|
|
21
|
-
// returns approximately 100 elements per call
|
|
22
|
-
count: count
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
var keys = [];
|
|
26
|
-
stream.on('data', function (resultKeys) {
|
|
27
|
-
for (var i = 0; i < resultKeys.length; i++) {
|
|
28
|
-
keys.push(resultKeys[i]);
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
stream.on('end', function () {
|
|
32
|
-
resolve(keys)
|
|
33
|
-
});
|
|
34
|
-
} else {
|
|
35
|
-
|
|
36
|
-
let nodes = redisClient.nodes('master');
|
|
37
|
-
let allPromises = [];
|
|
38
|
-
for (let index = 0; index < nodes.length; index++) {
|
|
39
|
-
const node = nodes[index];
|
|
40
|
-
allPromises.push(new Promise((res, reject) => {
|
|
41
|
-
var keys = [];
|
|
42
|
-
node.scanStream({
|
|
43
|
-
// only returns keys following the pattern of `user:*`
|
|
44
|
-
match: match,
|
|
45
|
-
// returns approximately 100 elements per call
|
|
46
|
-
count: count
|
|
47
|
-
}).on('data', resultKeys => {
|
|
48
|
-
for (var i = 0; i < resultKeys.length; i++) {
|
|
49
|
-
keys.push(resultKeys[i]);
|
|
50
|
-
}
|
|
51
|
-
}).on('end', () => {
|
|
52
|
-
// console.info("scan end, node %s:%d", node.options.host, node.options.port);
|
|
53
|
-
res(keys)
|
|
54
|
-
});
|
|
55
|
-
}));
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
Promise.all(allPromises).then((values) => {
|
|
59
|
-
let joinedKeys = [];
|
|
60
|
-
for (const keys of values) {
|
|
61
|
-
joinedKeys = joinedKeys.concat(keys);
|
|
62
|
-
}
|
|
63
|
-
resolve(joinedKeys)
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
})
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
//////////////// mock for redis cacher ////////////////
|
|
72
|
-
// let mockCacherData: string[] = [];
|
|
73
|
-
// let mock_prefix = "";
|
|
74
|
-
|
|
75
|
-
// async function mockCacherGet(ctx: any, key: string): Promise<any> { // cacher.get
|
|
76
|
-
// return await ctx.broker.cacher.get(key);
|
|
77
|
-
// }
|
|
78
|
-
|
|
79
|
-
// // 支持 * 通配符
|
|
80
|
-
// async function mockCacherKeys(ctx: any, key: string): Promise<string[]> { // cacher.client.keys
|
|
81
|
-
// // // 原来是:
|
|
82
|
-
// // const broker_res = await ctx.broker.cacher.client.keys(key);
|
|
83
|
-
|
|
84
|
-
// const regex_key = "^"+ key.split(".").join("\\.").split("*").join(".+").split("$").join("\\$") + "$";
|
|
85
|
-
// const reg = new RegExp(regex_key);
|
|
86
|
-
// const keys = mockCacherData.filter(item => reg.test(item));
|
|
87
|
-
|
|
88
|
-
// // const diff_d = _.difference(broker_res, keys); // 差错 diff 代码
|
|
89
|
-
// // if (diff_d.length > 0) {
|
|
90
|
-
// // console.log("diff is",key, diff_d);
|
|
91
|
-
// // console.log("* is", key,await ctx.broker.cacher.client.keys("*"));
|
|
92
|
-
// // console.log("my is",key, mockCacherData);
|
|
93
|
-
// // process.exit();
|
|
94
|
-
// // }
|
|
95
|
-
|
|
96
|
-
// return keys;
|
|
97
|
-
// }
|
|
98
|
-
|
|
99
|
-
// async function mockCacherSet(ctx: any, key: string, data: any): Promise<any> {
|
|
100
|
-
// // cacher.set
|
|
101
|
-
// const finalKey = mock_prefix + key;
|
|
102
|
-
// // const item = mockCacherData.find(item => item === finalKey);
|
|
103
|
-
// // if (!item) {
|
|
104
|
-
// // mockCacherData.push(finalKey);
|
|
105
|
-
// // }
|
|
106
|
-
|
|
107
|
-
// await ctx.broker.cacher.set(key, data);
|
|
108
|
-
// }
|
|
109
|
-
|
|
110
|
-
// // 支持 * 通配符
|
|
111
|
-
// async function mockCacherClean(ctx: any, key: string): Promise<any> {
|
|
112
|
-
// // cacher.clean
|
|
113
|
-
// if (key == "**") {
|
|
114
|
-
// mockCacherData = [];
|
|
115
|
-
// } else {
|
|
116
|
-
// const regex_key =
|
|
117
|
-
// "^" +
|
|
118
|
-
// key
|
|
119
|
-
// .split(".")
|
|
120
|
-
// .join("\\.")
|
|
121
|
-
// .split("*")
|
|
122
|
-
// .join(".+")
|
|
123
|
-
// .split("$")
|
|
124
|
-
// .join("\\$") +
|
|
125
|
-
// "$";
|
|
126
|
-
// const reg = new RegExp(regex_key);
|
|
127
|
-
// mockCacherData = mockCacherData.filter((item) => !reg.test(item));
|
|
128
|
-
// }
|
|
129
|
-
|
|
130
|
-
// await ctx.broker.cacher.clean(key);
|
|
131
|
-
// }
|
|
132
|
-
// async function mockCacherDel(ctx: any, key: string): Promise<any> {
|
|
133
|
-
// // cacher.del
|
|
134
|
-
// const finalKey = mock_prefix + key;
|
|
135
|
-
// mockCacherData = mockCacherData.filter((item) => item !== finalKey);
|
|
136
|
-
|
|
137
|
-
// await ctx.broker.cacher.del(key);
|
|
138
|
-
// }
|
|
139
|
-
|
|
140
|
-
////////////////////////////////////////////////
|
|
141
|
-
|
|
142
|
-
function transformMetadata(ctx) {
|
|
143
|
-
return {
|
|
144
|
-
...ctx.meta.caller,
|
|
145
|
-
metadata: ctx.params.data,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function transformMetadatas(ctx) {
|
|
150
|
-
const data = {};
|
|
151
|
-
map(ctx.params.data, (value, key) => {
|
|
152
|
-
data[key] = {
|
|
153
|
-
...ctx.meta.caller,
|
|
154
|
-
metadata: value,
|
|
155
|
-
}
|
|
156
|
-
})
|
|
157
|
-
return data;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function getKey(key, keyPrefix) {
|
|
161
|
-
return key.replace(keyPrefix, "");
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function getServiceMetadataCacherKey(nodeID: string, serviceName: string, metadataType: string, metadataApiName: string) {
|
|
165
|
-
return `$${nodeID}.${SERVICE_METADATA_PREFIX}.${serviceName}.${metadataType}.${metadataApiName}`;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
async function addServiceMetadata(ctx) {
|
|
169
|
-
const { nodeID } = ctx.meta.caller || { nodeID: undefined };
|
|
170
|
-
if (!nodeID) {
|
|
171
|
-
console.log(`addServiceMetadata ctx.meta`, ctx.meta);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const { metadataType, metadataApiName, metadataServiceName } = ctx.meta || { metadataType: undefined, metadataApiName: undefined, metadataServiceName: undefined };
|
|
175
|
-
|
|
176
|
-
if (!metadataServiceName) {
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
const key = getServiceMetadataCacherKey(nodeID, metadataServiceName, metadataType, metadataApiName);
|
|
180
|
-
await ctx.broker.cacher.set(key, {
|
|
181
|
-
nodeIds: [nodeID],
|
|
182
|
-
metadataType,
|
|
183
|
-
metadataApiName,
|
|
184
|
-
metadataServiceName,
|
|
185
|
-
metadata: ctx.params.data,
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
async function maddServiceMetadata(ctx) {
|
|
190
|
-
const { nodeID } = ctx.meta.caller || { nodeID: undefined };
|
|
191
|
-
if (!nodeID) {
|
|
192
|
-
console.log(`addServiceMetadata ctx.meta`, ctx.meta);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const { metadataType, metadataServiceName } = ctx.meta || { metadataType: undefined, metadataServiceName: undefined };
|
|
196
|
-
|
|
197
|
-
//data: {k1:v1, k2:v2}
|
|
198
|
-
const { data } = ctx.params
|
|
199
|
-
|
|
200
|
-
if (!metadataServiceName || !data) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
const mdata = {};
|
|
205
|
-
|
|
206
|
-
map(data, (value, metadataApiName) => {
|
|
207
|
-
mdata[getServiceMetadataCacherKey(nodeID, metadataServiceName, metadataType, metadataApiName)] = {
|
|
208
|
-
nodeIds: [nodeID],
|
|
209
|
-
metadataType,
|
|
210
|
-
metadataApiName,
|
|
211
|
-
metadataServiceName,
|
|
212
|
-
metadata: value,
|
|
213
|
-
}
|
|
214
|
-
})
|
|
215
|
-
|
|
216
|
-
await mset(ctx, mdata);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
async function mget(ctx, keys) {
|
|
220
|
-
if (!keys || keys.length == 0) {
|
|
221
|
-
return [];
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
const keyPrefix = ctx.broker.cacher?.prefix || "";
|
|
225
|
-
|
|
226
|
-
const values = await ctx.broker.cacher.client.mget(...map(keys, (key) => {
|
|
227
|
-
if (key && !key.startsWith(keyPrefix)) {
|
|
228
|
-
return `${keyPrefix}${key}`
|
|
229
|
-
} else {
|
|
230
|
-
return key
|
|
231
|
-
}
|
|
232
|
-
}));
|
|
233
|
-
const results = [];
|
|
234
|
-
_.map(values, (item) => {
|
|
235
|
-
try {
|
|
236
|
-
if (item) {
|
|
237
|
-
results.push(JSON.parse(item));
|
|
238
|
-
} else {
|
|
239
|
-
results.push(item);
|
|
240
|
-
}
|
|
241
|
-
} catch (error) {
|
|
242
|
-
results.push(item);
|
|
243
|
-
}
|
|
244
|
-
})
|
|
245
|
-
return results;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
async function mset(ctx, data) {
|
|
249
|
-
if (_.isEmpty(data)) {
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
const keyPrefix = ctx.broker.cacher?.prefix || "";
|
|
253
|
-
const mdata = {};
|
|
254
|
-
_.map(data, (v, k) => {
|
|
255
|
-
mdata[`${keyPrefix}${k}`] = JSON.stringify(v)
|
|
256
|
-
})
|
|
257
|
-
return await ctx.broker.cacher.client.mset(mdata);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// 这里需要更改
|
|
261
|
-
async function query(ctx, queryKey) {
|
|
262
|
-
try {
|
|
263
|
-
// const s = new Date().getTime();
|
|
264
|
-
const keyPrefix = ctx.broker.cacher?.prefix || "";
|
|
265
|
-
// const sk = new Date().getTime();
|
|
266
|
-
const keys = await redisScanKeys(ctx.broker.cacher.client, `${keyPrefix}${queryKey}`) //ctx.broker.cacher.client.keys(`${keyPrefix}${queryKey}`); //TODO 此功能仅支持redis cache
|
|
267
|
-
// const dk = new Date().getTime() - sk;
|
|
268
|
-
// const sv = new Date().getTime();
|
|
269
|
-
// REPLACE: const keys = await mockCacherKeys(ctx, `${keyPrefix}${queryKey}`) //TODO 此功能仅支持redis cache
|
|
270
|
-
const values = _.compact(await mget(ctx, keys));
|
|
271
|
-
// const dv = new Date().getTime() - sv;
|
|
272
|
-
// const d = new Date().getTime() - s;
|
|
273
|
-
// if (d > Number(process.env.STEEDOS_DURATION)) {
|
|
274
|
-
// console.log(`query`, d, dk, dv, `${keyPrefix}${queryKey}`);
|
|
275
|
-
// }
|
|
276
|
-
return values;
|
|
277
|
-
} catch (error) {
|
|
278
|
-
// console.error(`error`, error)
|
|
279
|
-
}
|
|
280
|
-
return []
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function getPackageServiceCacherKey(nodeID, serviceName) {
|
|
284
|
-
return `$${nodeID}.${PACKAGE_SERVICES_KEY}.${serviceName}`;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
async function setPackageServices(ctx, packageServices) {
|
|
288
|
-
for await (const packageService of packageServices) {
|
|
289
|
-
ctx.broker.cacher.set(getPackageServiceCacherKey(packageService.nodeID, packageService.name), { service: packageService });
|
|
290
|
-
// REPLACE: await await mockCacherSet(ctx, getPackageServiceCacherKey(packageServiceName), { service: packageServiceName });
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
async function clearPackageServices(ctx, packageServices) {
|
|
295
|
-
for await (const packageService of packageServices) {
|
|
296
|
-
let nodeID = null;
|
|
297
|
-
let name = null;
|
|
298
|
-
if (_.isString(packageService)) {
|
|
299
|
-
let foo = packageService.split('.');
|
|
300
|
-
nodeID = foo.splice(0, foo.length -1).join('.');
|
|
301
|
-
name = foo.join('.');
|
|
302
|
-
} else if (_.isObject(packageService)) {
|
|
303
|
-
nodeID = packageService.nodeID;
|
|
304
|
-
name = packageService.name;
|
|
305
|
-
}
|
|
306
|
-
// console.log(`clearPackageServices del ===== `, getPackageServiceCacherKey(nodeID, name))
|
|
307
|
-
await ctx.broker.cacher.del(getPackageServiceCacherKey(nodeID, name));
|
|
308
|
-
// REPLACE: await mockCacherDel(ctx, getPackageServiceCacherKey(packageServiceName));
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
async function getLastPackageServices(ctx) {
|
|
313
|
-
const packageServices = await query(ctx, getPackageServiceCacherKey("*", "*"));
|
|
314
|
-
const services = [];
|
|
315
|
-
packageServices.forEach((element) => {
|
|
316
|
-
if (element) {
|
|
317
|
-
services.push(element.service);
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
return services;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
async function getPackageServices(ctx) {
|
|
324
|
-
const packageServices = [];
|
|
325
|
-
const services = ctx.broker.registry.getServiceList({ withActions: true });
|
|
326
|
-
_.each(services, (serviceItem) => {
|
|
327
|
-
const { name, nodeID } = serviceItem; //, version, fullName, settings, local, available, nodeID
|
|
328
|
-
if (name.startsWith(PACKAGE_SERVICE_PREFIX)) {
|
|
329
|
-
// console.log(`serviceItem`, serviceItem)
|
|
330
|
-
packageServices.push(Object.assign({}, serviceItem, { apiName: `${nodeID}.${name}` }))
|
|
331
|
-
}
|
|
332
|
-
})
|
|
333
|
-
return packageServices;
|
|
334
|
-
// const servicesName = _.pluck(services, "name");
|
|
335
|
-
// let packageServicesName = _.filter(servicesName, (serviceName) => {
|
|
336
|
-
// return serviceName.startsWith(PACKAGE_SERVICE_PREFIX);
|
|
337
|
-
// });
|
|
338
|
-
// packageServicesName = _.uniq(packageServicesName);
|
|
339
|
-
// return packageServicesName;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
async function clearPackageServiceMetadatas(ctx, nodeID, packageServiceName) {
|
|
343
|
-
const key = getServiceMetadataCacherKey(nodeID, packageServiceName, "*", "*");
|
|
344
|
-
const clearMetadatas = await query(ctx, key);
|
|
345
|
-
await ctx.broker.cacher.clean(key);
|
|
346
|
-
// REPLACE: await mockCacherClean(ctx, key);
|
|
347
|
-
return clearMetadatas;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
async function clearPackageServicesMetadatas(ctx, offlinePackageServices) {
|
|
351
|
-
let clearMetadatas = [];
|
|
352
|
-
for await (const packageService of offlinePackageServices) {
|
|
353
|
-
let nodeID = null;
|
|
354
|
-
let name = null;
|
|
355
|
-
if (_.isString(packageService)) {
|
|
356
|
-
let foo = packageService.split('.');
|
|
357
|
-
nodeID = foo.splice(0, foo.length -1).join('.');
|
|
358
|
-
name = foo.join('.');
|
|
359
|
-
} else if (_.isObject(packageService)) {
|
|
360
|
-
nodeID = packageService.nodeID;
|
|
361
|
-
name = packageService.name;
|
|
362
|
-
}
|
|
363
|
-
const clearPackageMetadatas = await clearPackageServiceMetadatas(ctx, nodeID, name);
|
|
364
|
-
clearMetadatas = clearMetadatas.concat(clearPackageMetadatas);
|
|
365
|
-
}
|
|
366
|
-
_.each(_.groupBy(clearMetadatas, "metadataType"), function (data: any, metadataType) {
|
|
367
|
-
ctx.broker.emit(`${SERVICE_METADATA_PREFIX}.${metadataType}.clear`, { metadataType, metadataApiNames: _.pluck(data, "metadataApiName"), isClear: true });
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
async function getMetadataServices(broker) {
|
|
372
|
-
const queryKey = `${METADATA_SERVICES_PERFIX}.*`;
|
|
373
|
-
const keyPrefix = broker.cacher?.prefix || "";
|
|
374
|
-
const keys = await redisScanKeys(broker.cacher.client, `${keyPrefix}${queryKey}`) // broker.cacher.client.keys(`${keyPrefix}${queryKey}`); //TODO 此功能仅支持redis cache
|
|
375
|
-
// REPLACE: const keys = await mockCacherKeys({broker,}, `${keyPrefix}${queryKey}`) //TODO 此功能仅支持redis cache
|
|
376
|
-
const values = [];
|
|
377
|
-
for (const key of keys) {
|
|
378
|
-
values.push(await broker.cacher.get(getKey(key, keyPrefix)));
|
|
379
|
-
// REPLACE: values.push(await mockCacherGet({ broker }, getKey(key, keyPrefix)));
|
|
380
|
-
}
|
|
381
|
-
return values;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
async function lrange(ctx, key, start = 0, end = -1) {
|
|
385
|
-
return await ctx.broker.cacher.client.lrange(key, start, end);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
export async function started(broker) {
|
|
389
|
-
// mock_prefix = broker.cacher?.prefix || "";
|
|
390
|
-
await broker.cacher.set(`${METADATA_SERVICES_PERFIX}.${broker.nodeID}`, {});
|
|
391
|
-
// REPLACE: await mockCacherSet({broker, }, `${METADATA_SERVICES_PERFIX}.${broker.nodeID}`, {});
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
export async function stopped(broker) {
|
|
395
|
-
await broker.cacher.del(`${METADATA_SERVICES_PERFIX}.${broker.nodeID}`);
|
|
396
|
-
// REPLACE: await mockCacherDel({broker}, `${METADATA_SERVICES_PERFIX}.${broker.nodeID}`);
|
|
397
|
-
const services = await getMetadataServices(broker);
|
|
398
|
-
if (!services || services.length === 0) {
|
|
399
|
-
await broker.cacher.clean(`**`);
|
|
400
|
-
//REPLACE: await mockCacherClean({broker}, `**`);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
9
|
+
import { Register } from '@steedos/metadata-registrar';
|
|
403
10
|
|
|
404
11
|
export const ActionHandlers = {
|
|
405
|
-
clearPackageServices,
|
|
406
|
-
clearPackageServicesMetadatas,
|
|
12
|
+
clearPackageServices: Register.clearPackageServices,
|
|
13
|
+
clearPackageServicesMetadatas: Register.clearPackageServicesMetadatas,
|
|
407
14
|
async get(ctx: any): Promise<any> {
|
|
408
15
|
try {
|
|
409
|
-
return await
|
|
16
|
+
return await Register.get(ctx.broker, ctx.params.key);
|
|
410
17
|
} catch (error) {
|
|
411
18
|
|
|
412
19
|
}
|
|
413
|
-
// REPLACE: return await mockCacherGet(ctx, ctx.params.key)
|
|
414
20
|
},
|
|
415
21
|
async mget(ctx: any): Promise<any> {
|
|
416
22
|
try {
|
|
417
|
-
return await mget(ctx, ctx.params.keys);
|
|
23
|
+
return await Register.mget(ctx.broker, ctx.params.keys);
|
|
418
24
|
} catch (error) {
|
|
419
25
|
|
|
420
26
|
}
|
|
421
|
-
// REPLACE: return await mockCacherGet(ctx, ctx.params.key)
|
|
422
27
|
},
|
|
423
28
|
async filter(ctx: any): Promise<Array<any>> {
|
|
424
|
-
return await
|
|
425
|
-
// const keyPrefix = ctx.broker.cacher.prefix
|
|
426
|
-
// const keys = await ctx.broker.cacher.client.keys(`${keyPrefix}${ctx.params.key}`) //TODO 此功能仅支持redis cache
|
|
427
|
-
// const values = [];
|
|
428
|
-
// for (const key of keys) {
|
|
429
|
-
// values.push(await ctx.broker.cacher.get(getKey(key, keyPrefix)))
|
|
430
|
-
// }
|
|
431
|
-
// return values;
|
|
29
|
+
return await Register.filter(ctx.broker, ctx.params.key);
|
|
432
30
|
},
|
|
433
31
|
async mfilter(ctx: any): Promise<Array<any>> {
|
|
434
|
-
|
|
435
|
-
for (const key of ctx.params.keys) {
|
|
436
|
-
values.push(await query(ctx, key))
|
|
437
|
-
}
|
|
438
|
-
return values
|
|
32
|
+
return await Register.mfilter(ctx.broker, ctx.params.keys);
|
|
439
33
|
},
|
|
440
34
|
async add(ctx: any) {
|
|
441
|
-
return await ctx.broker
|
|
442
|
-
// REPLACE: return await mockCacherSet(ctx, ctx.params.key, transformMetadata(ctx));
|
|
35
|
+
return await Register.add(ctx.broker, ctx.params, ctx.meta);
|
|
443
36
|
},
|
|
444
37
|
async madd(ctx) {
|
|
445
|
-
return await
|
|
38
|
+
return await Register.madd(ctx.broker, ctx.params, ctx.meta);
|
|
446
39
|
},
|
|
447
40
|
async addServiceMetadata(ctx: any) {
|
|
448
|
-
return await addServiceMetadata(ctx);
|
|
41
|
+
return await Register.addServiceMetadata(ctx.broker, ctx.params, ctx.meta);
|
|
449
42
|
},
|
|
450
43
|
async maddServiceMetadata(ctx: any) {
|
|
451
|
-
return await maddServiceMetadata(ctx);
|
|
44
|
+
return await Register.maddServiceMetadata(ctx.broker, ctx.params, ctx.meta);
|
|
452
45
|
},
|
|
453
46
|
async fuzzyDelete(ctx: any) {
|
|
454
|
-
const { key } = ctx.params
|
|
455
|
-
|
|
456
|
-
const keys = await redisScanKeys(ctx.broker.cacher.client, `${keyPrefix}${key}`) // await ctx.broker.cacher.client.keys(`${keyPrefix}${key}`);
|
|
457
|
-
for (const _key of keys) {
|
|
458
|
-
await ctx.broker.cacher.del(getKey(_key, keyPrefix));
|
|
459
|
-
}
|
|
47
|
+
const { key } = ctx.params;
|
|
48
|
+
return await Register.fuzzyDelete(ctx.broker, key);
|
|
460
49
|
},
|
|
461
50
|
async delete(ctx: any) {
|
|
462
|
-
|
|
463
|
-
await ctx.broker.cacher.del(ctx.params.key);
|
|
464
|
-
} catch (error) {
|
|
465
|
-
ctx.broker.logger.info(error.message);
|
|
466
|
-
}
|
|
467
|
-
return true;
|
|
51
|
+
return await Register.delete(ctx.broker, ctx.params.key);
|
|
468
52
|
},
|
|
469
53
|
async deleteServiceMetadata(ctx: any) {
|
|
470
|
-
|
|
471
|
-
let { nodeID, serviceName, metadataType, metadataApiName } = ctx.params;
|
|
472
|
-
if (!nodeID) {
|
|
473
|
-
throw new Error('nodeID is null');
|
|
474
|
-
}
|
|
475
|
-
if (!serviceName) {
|
|
476
|
-
throw new Error('serviceName is null');
|
|
477
|
-
}
|
|
478
|
-
if (!metadataType) {
|
|
479
|
-
throw new Error('metadataType is null');
|
|
480
|
-
}
|
|
481
|
-
if (!metadataApiName) {
|
|
482
|
-
throw new Error('metadataApiName is null');
|
|
483
|
-
}
|
|
484
|
-
const key = getServiceMetadataCacherKey(nodeID, serviceName, metadataType, metadataApiName);
|
|
485
|
-
await ctx.broker.cacher.del(key);
|
|
486
|
-
} catch (error) {
|
|
487
|
-
ctx.broker.logger.info(error.message);
|
|
488
|
-
}
|
|
489
|
-
return true;
|
|
54
|
+
return await Register.deleteServiceMetadata(ctx.broker, ctx.params);
|
|
490
55
|
},
|
|
491
56
|
|
|
492
57
|
async getServiceMetadatas(ctx: any) {
|
|
493
|
-
|
|
494
|
-
if (!nodeID) {
|
|
495
|
-
nodeID = "*";
|
|
496
|
-
}
|
|
497
|
-
if (!serviceName) {
|
|
498
|
-
serviceName = "*";
|
|
499
|
-
}
|
|
500
|
-
if (!metadataType) {
|
|
501
|
-
metadataType = "*";
|
|
502
|
-
}
|
|
503
|
-
if (!metadataApiName) {
|
|
504
|
-
metadataApiName = "*";
|
|
505
|
-
}
|
|
506
|
-
const key = getServiceMetadataCacherKey(nodeID, serviceName, metadataType, metadataApiName);
|
|
507
|
-
return await query(ctx, key);
|
|
58
|
+
return await Register.getServiceMetadatas(ctx.broker, ctx.params);
|
|
508
59
|
},
|
|
509
60
|
async getServiceMetadata(ctx: any) {
|
|
510
|
-
|
|
511
|
-
const { nodeID } = ctx.meta.caller || { nodeID: undefined };
|
|
512
|
-
if (!nodeID) {
|
|
513
|
-
console.log(`getServiceMetadata ctx.meta`, ctx.meta);
|
|
514
|
-
}
|
|
515
|
-
const key = getServiceMetadataCacherKey(nodeID, serviceName, metadataType, metadataApiName);
|
|
516
|
-
return await ctx.broker.cacher.get(key)
|
|
517
|
-
// REPLACE: return await mockCacherGet(ctx, key);
|
|
61
|
+
return await Register.getServiceMetadata(ctx.broker, ctx.params, ctx.meta);
|
|
518
62
|
},
|
|
519
63
|
async removeServiceMetadata(ctx: any) {
|
|
520
|
-
|
|
521
|
-
const { nodeID } = ctx.meta.caller || { nodeID: undefined };
|
|
522
|
-
if (!nodeID) {
|
|
523
|
-
console.log(`getServiceMetadata ctx.meta`, ctx.meta);
|
|
524
|
-
}
|
|
525
|
-
const key = getServiceMetadataCacherKey(nodeID, serviceName, metadataType, metadataApiName);
|
|
526
|
-
return await ctx.broker.cacher.del(key)
|
|
64
|
+
return await Register.removeServiceMetadata(ctx.broker, ctx.params, ctx.meta);
|
|
527
65
|
},
|
|
528
66
|
async refreshServiceMetadatas(ctx: any) {
|
|
529
|
-
|
|
530
|
-
const offlinePackageServicesListString=[];
|
|
531
|
-
if (_offlinePackageServices && _offlinePackageServices.length > 0) {
|
|
532
|
-
// 检查 offlinePackageServices 中的每一项必须包含nodeID、name
|
|
533
|
-
_.each(_offlinePackageServices, (item)=>{
|
|
534
|
-
if(!item){
|
|
535
|
-
throw new Error('offlinePackageInfo is null')
|
|
536
|
-
}
|
|
537
|
-
if(_.isString(item)){
|
|
538
|
-
throw new Error('offlinePackageInfo cannot be string')
|
|
539
|
-
}
|
|
540
|
-
if(_.isObject(item)){
|
|
541
|
-
const { nodeID, name } = item; //, instanceID
|
|
542
|
-
if(!_.isString(nodeID)){
|
|
543
|
-
throw new Error('offlinePackageInfo.nodeID must be string')
|
|
544
|
-
}
|
|
545
|
-
if(!_.isString(name)){
|
|
546
|
-
throw new Error('offlinePackageInfo.name must be string')
|
|
547
|
-
}
|
|
548
|
-
offlinePackageServicesListString.push(`${nodeID}.${name}`)
|
|
549
|
-
}
|
|
550
|
-
})
|
|
551
|
-
await ctx.broker.call('metadata.clearPackageServices', { offlinePackageServicesName: _offlinePackageServices })
|
|
552
|
-
// ctx.broker.broadcast(`$metadata.clearPackageServices`, { offlinePackageServicesName: _offlinePackageServices });
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
let packageServices = await getPackageServices(ctx);
|
|
556
|
-
const packageServicesName = _.pluck(packageServices, "apiName");
|
|
557
|
-
|
|
558
|
-
const lastPackageServices = await getLastPackageServices(ctx);
|
|
559
|
-
const lastPackageServicesNames = _.pluck(lastPackageServices, "apiName");
|
|
560
|
-
|
|
561
|
-
let offlinePackageServicesName = _.difference(lastPackageServicesNames, packageServicesName);
|
|
562
|
-
|
|
563
|
-
let timeoutOfflinePackageServices = _.filter(lastPackageServices, (lastPackageService) => {
|
|
564
|
-
return lastPackageService && _.include(offlinePackageServicesName, lastPackageService.apiName)
|
|
565
|
-
})
|
|
566
|
-
|
|
567
|
-
if (_offlinePackageServices && _offlinePackageServices.length > 0) {
|
|
568
|
-
timeoutOfflinePackageServices = timeoutOfflinePackageServices.concat(_offlinePackageServices);
|
|
569
|
-
const onlinePackageServicesName = _.difference(lastPackageServices, offlinePackageServicesListString);
|
|
570
|
-
packageServices = _.filter(packageServices, (packageService) => {
|
|
571
|
-
return packageService && _.include(onlinePackageServicesName, packageService.apiName)
|
|
572
|
-
})
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
// if (timeoutOfflinePackageServices.length > 0) {
|
|
576
|
-
// ctx.broker.broadcast(`$metadata.clearPackageServices`, { offlinePackageServicesName: timeoutOfflinePackageServices });
|
|
577
|
-
// }
|
|
578
|
-
|
|
579
|
-
//使用延时方式存储软件包记录, 防止多服务之间服务发现延时导致数据清理异常。延时来自moleculer内部的服务发现机制(broker.registry.getServiceList)
|
|
580
|
-
//清理数据无需做到实时,延时30秒
|
|
581
|
-
if (savePackageServicesTimeoutID) {
|
|
582
|
-
clearTimeout(savePackageServicesTimeoutID);
|
|
583
|
-
savePackageServicesTimeoutID = null;
|
|
584
|
-
}
|
|
585
|
-
if (!savePackageServicesTimeoutID) {
|
|
586
|
-
savePackageServicesTimeoutID = setTimeout(() => {
|
|
587
|
-
setPackageServices(ctx, packageServices);
|
|
588
|
-
}, 30 * 1000)
|
|
589
|
-
}
|
|
590
|
-
|
|
67
|
+
return await Register.refreshServiceMetadatas(ctx.broker, ctx.params);
|
|
591
68
|
},
|
|
592
69
|
|
|
593
70
|
async lpush(ctx: any) {
|
|
594
|
-
|
|
595
|
-
const key = ctx.params.key;
|
|
596
|
-
const data = ctx.params.data;
|
|
597
|
-
if (!_.isArray(data)) {
|
|
598
|
-
throw new Error('data must be an array.');
|
|
599
|
-
}
|
|
600
|
-
const _data = [];
|
|
601
|
-
_.each(data, (item) => {
|
|
602
|
-
_data.push(JSON.stringify(item))
|
|
603
|
-
})
|
|
604
|
-
return await ctx.broker.cacher.client.lpush(`${keyPrefix}${key}`, ..._data);
|
|
71
|
+
return await Register.lpush(ctx.broker, ctx.params);
|
|
605
72
|
},
|
|
606
73
|
|
|
607
74
|
async rpush(ctx: any) {
|
|
608
|
-
|
|
609
|
-
const key = ctx.params.key;
|
|
610
|
-
const data = ctx.params.data;
|
|
611
|
-
if (!_.isArray(data)) {
|
|
612
|
-
throw new Error('data must be an array.');
|
|
613
|
-
}
|
|
614
|
-
const _data = [];
|
|
615
|
-
_.each(data, (item) => {
|
|
616
|
-
_data.push(JSON.stringify(item))
|
|
617
|
-
})
|
|
618
|
-
return await ctx.broker.cacher.client.rpush(`${keyPrefix}${key}`, ..._data);
|
|
75
|
+
return await Register.rpush(ctx.broker, ctx.params);
|
|
619
76
|
},
|
|
620
77
|
|
|
621
78
|
async lrange(ctx: any) {
|
|
622
|
-
|
|
623
|
-
const { key, start = 0, end = -1 } = ctx.params.key;
|
|
624
|
-
return await lrange(ctx, `${keyPrefix}${key}`, start, end);
|
|
79
|
+
return await Register.lrange(ctx.broker, ctx.params);
|
|
625
80
|
},
|
|
626
81
|
|
|
627
82
|
async filterList(ctx: any) {
|
|
628
|
-
|
|
629
|
-
const { key } = ctx.params;
|
|
630
|
-
const keys = await redisScanKeys(ctx.broker.cacher.client, `${keyPrefix}${key}`);
|
|
631
|
-
if (!keys || keys.length == 0) {
|
|
632
|
-
return [];
|
|
633
|
-
}
|
|
634
|
-
const results = [];
|
|
635
|
-
for (const itemKey of keys) {
|
|
636
|
-
try {
|
|
637
|
-
if (itemKey) {
|
|
638
|
-
const itemList = await lrange(ctx, itemKey);
|
|
639
|
-
if (itemList && _.isArray(itemList)) {
|
|
640
|
-
_.each(itemList, (item) => {
|
|
641
|
-
results.push(JSON.parse(item));
|
|
642
|
-
})
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
} catch (error) {
|
|
646
|
-
console.error(`error`, error);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
return results;
|
|
83
|
+
return await Register.filterList(ctx.broker, ctx.params);
|
|
650
84
|
}
|
|
651
85
|
};
|