@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.
@@ -1,651 +1,85 @@
1
- const SERVICE_METADATA_PREFIX = '$METADATA';
2
- const PACKAGE_SERVICES_KEY = '$PACKAGE-SERVICES';
3
- const PACKAGE_SERVICE_PREFIX = '~packages-';
4
- const METADATA_SERVICES_PERFIX = '$METADATA-SERVICES';
5
- import * as _ from 'underscore';
6
- import { map } from 'lodash';
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
- let savePackageServicesTimeoutID = null;
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 ctx.broker.cacher.get(ctx.params.key);
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 query(ctx, ctx.params.key);
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
- const values = [];
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.cacher.set(ctx.params.key, transformMetadata(ctx));
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 mset(ctx, transformMetadatas(ctx));
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
- const keyPrefix = ctx.broker.cacher?.prefix || "";
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
- try {
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
- try {
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
- let { nodeID, serviceName, metadataType, metadataApiName } = ctx.params;
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
- let { serviceName, metadataType, metadataApiName } = ctx.params;
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
- let { serviceName, metadataType, metadataApiName } = ctx.params;
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
- const { offlinePackageServices: _offlinePackageServices } = ctx.params || { offlinePackageServices: undefined };
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
- const keyPrefix = ctx.broker.cacher?.prefix || "";
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
- const keyPrefix = ctx.broker.cacher?.prefix || "";
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
- const keyPrefix = ctx.broker.cacher?.prefix || "";
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
- const keyPrefix = ctx.broker.cacher?.prefix || "";
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
  };