@steedos/service-metadata 2.2.39 → 2.2.42

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