@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/lib/actionsHandler.js
CHANGED
|
@@ -1,712 +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 =
|
|
10
|
+
exports.ActionHandlers = void 0;
|
|
4
11
|
const tslib_1 = require("tslib");
|
|
5
|
-
const
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
return yield query(ctx, key);
|
|
82
|
+
return yield metadata_registrar_1.Register.getServiceMetadatas(ctx.broker, ctx.params);
|
|
561
83
|
});
|
|
562
84
|
},
|
|
563
85
|
getServiceMetadata(ctx) {
|
|
564
86
|
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
565
|
-
|
|
566
|
-
const { nodeID } = ctx.meta.caller || { nodeID: undefined };
|
|
567
|
-
if (!nodeID) {
|
|
568
|
-
console.log(`getServiceMetadata ctx.meta`, ctx.meta);
|
|
569
|
-
}
|
|
570
|
-
const key = getServiceMetadataCacherKey(nodeID, serviceName, metadataType, metadataApiName);
|
|
571
|
-
return yield ctx.broker.cacher.get(key);
|
|
572
|
-
// REPLACE: return await mockCacherGet(ctx, key);
|
|
87
|
+
return yield metadata_registrar_1.Register.getServiceMetadata(ctx.broker, ctx.params, ctx.meta);
|
|
573
88
|
});
|
|
574
89
|
},
|
|
575
90
|
removeServiceMetadata(ctx) {
|
|
576
91
|
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
577
|
-
|
|
578
|
-
const { nodeID } = ctx.meta.caller || { nodeID: undefined };
|
|
579
|
-
if (!nodeID) {
|
|
580
|
-
console.log(`getServiceMetadata ctx.meta`, ctx.meta);
|
|
581
|
-
}
|
|
582
|
-
const key = getServiceMetadataCacherKey(nodeID, serviceName, metadataType, metadataApiName);
|
|
583
|
-
return yield ctx.broker.cacher.del(key);
|
|
92
|
+
return yield metadata_registrar_1.Register.removeServiceMetadata(ctx.broker, ctx.params, ctx.meta);
|
|
584
93
|
});
|
|
585
94
|
},
|
|
586
95
|
refreshServiceMetadatas(ctx) {
|
|
587
96
|
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
588
|
-
|
|
589
|
-
const offlinePackageServicesListString = [];
|
|
590
|
-
if (_offlinePackageServices && _offlinePackageServices.length > 0) {
|
|
591
|
-
// 检查 offlinePackageServices 中的每一项必须包含nodeID、name
|
|
592
|
-
_.each(_offlinePackageServices, (item) => {
|
|
593
|
-
if (!item) {
|
|
594
|
-
throw new Error('offlinePackageInfo is null');
|
|
595
|
-
}
|
|
596
|
-
if (_.isString(item)) {
|
|
597
|
-
throw new Error('offlinePackageInfo cannot be string');
|
|
598
|
-
}
|
|
599
|
-
if (_.isObject(item)) {
|
|
600
|
-
const { nodeID, name } = item; //, instanceID
|
|
601
|
-
if (!_.isString(nodeID)) {
|
|
602
|
-
throw new Error('offlinePackageInfo.nodeID must be string');
|
|
603
|
-
}
|
|
604
|
-
if (!_.isString(name)) {
|
|
605
|
-
throw new Error('offlinePackageInfo.name must be string');
|
|
606
|
-
}
|
|
607
|
-
offlinePackageServicesListString.push(`${nodeID}.${name}`);
|
|
608
|
-
}
|
|
609
|
-
});
|
|
610
|
-
yield ctx.broker.call('metadata.clearPackageServices', { offlinePackageServicesName: _offlinePackageServices });
|
|
611
|
-
// ctx.broker.broadcast(`$metadata.clearPackageServices`, { offlinePackageServicesName: _offlinePackageServices });
|
|
612
|
-
}
|
|
613
|
-
let packageServices = yield getPackageServices(ctx);
|
|
614
|
-
const packageServicesName = _.pluck(packageServices, "apiName");
|
|
615
|
-
const lastPackageServices = yield getLastPackageServices(ctx);
|
|
616
|
-
const lastPackageServicesNames = _.pluck(lastPackageServices, "apiName");
|
|
617
|
-
let offlinePackageServicesName = _.difference(lastPackageServicesNames, packageServicesName);
|
|
618
|
-
let timeoutOfflinePackageServices = _.filter(lastPackageServices, (lastPackageService) => {
|
|
619
|
-
return lastPackageService && _.include(offlinePackageServicesName, lastPackageService.apiName);
|
|
620
|
-
});
|
|
621
|
-
if (_offlinePackageServices && _offlinePackageServices.length > 0) {
|
|
622
|
-
timeoutOfflinePackageServices = timeoutOfflinePackageServices.concat(_offlinePackageServices);
|
|
623
|
-
const onlinePackageServicesName = _.difference(lastPackageServices, offlinePackageServicesListString);
|
|
624
|
-
packageServices = _.filter(packageServices, (packageService) => {
|
|
625
|
-
return packageService && _.include(onlinePackageServicesName, packageService.apiName);
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
// if (timeoutOfflinePackageServices.length > 0) {
|
|
629
|
-
// ctx.broker.broadcast(`$metadata.clearPackageServices`, { offlinePackageServicesName: timeoutOfflinePackageServices });
|
|
630
|
-
// }
|
|
631
|
-
//使用延时方式存储软件包记录, 防止多服务之间服务发现延时导致数据清理异常。延时来自moleculer内部的服务发现机制(broker.registry.getServiceList)
|
|
632
|
-
//清理数据无需做到实时,延时30秒
|
|
633
|
-
if (savePackageServicesTimeoutID) {
|
|
634
|
-
clearTimeout(savePackageServicesTimeoutID);
|
|
635
|
-
savePackageServicesTimeoutID = null;
|
|
636
|
-
}
|
|
637
|
-
if (!savePackageServicesTimeoutID) {
|
|
638
|
-
savePackageServicesTimeoutID = setTimeout(() => {
|
|
639
|
-
setPackageServices(ctx, packageServices);
|
|
640
|
-
}, 30 * 1000);
|
|
641
|
-
}
|
|
97
|
+
return yield metadata_registrar_1.Register.refreshServiceMetadatas(ctx.broker, ctx.params);
|
|
642
98
|
});
|
|
643
99
|
},
|
|
644
100
|
lpush(ctx) {
|
|
645
|
-
var _a;
|
|
646
101
|
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
647
|
-
|
|
648
|
-
const key = ctx.params.key;
|
|
649
|
-
const data = ctx.params.data;
|
|
650
|
-
if (!_.isArray(data)) {
|
|
651
|
-
throw new Error('data must be an array.');
|
|
652
|
-
}
|
|
653
|
-
const _data = [];
|
|
654
|
-
_.each(data, (item) => {
|
|
655
|
-
_data.push(JSON.stringify(item));
|
|
656
|
-
});
|
|
657
|
-
return yield ctx.broker.cacher.client.lpush(`${keyPrefix}${key}`, ..._data);
|
|
102
|
+
return yield metadata_registrar_1.Register.lpush(ctx.broker, ctx.params);
|
|
658
103
|
});
|
|
659
104
|
},
|
|
660
105
|
rpush(ctx) {
|
|
661
|
-
var _a;
|
|
662
106
|
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
663
|
-
|
|
664
|
-
const key = ctx.params.key;
|
|
665
|
-
const data = ctx.params.data;
|
|
666
|
-
if (!_.isArray(data)) {
|
|
667
|
-
throw new Error('data must be an array.');
|
|
668
|
-
}
|
|
669
|
-
const _data = [];
|
|
670
|
-
_.each(data, (item) => {
|
|
671
|
-
_data.push(JSON.stringify(item));
|
|
672
|
-
});
|
|
673
|
-
return yield ctx.broker.cacher.client.rpush(`${keyPrefix}${key}`, ..._data);
|
|
107
|
+
return yield metadata_registrar_1.Register.rpush(ctx.broker, ctx.params);
|
|
674
108
|
});
|
|
675
109
|
},
|
|
676
110
|
lrange(ctx) {
|
|
677
|
-
var _a;
|
|
678
111
|
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
679
|
-
|
|
680
|
-
const { key, start = 0, end = -1 } = ctx.params.key;
|
|
681
|
-
return yield lrange(ctx, `${keyPrefix}${key}`, start, end);
|
|
112
|
+
return yield metadata_registrar_1.Register.lrange(ctx.broker, ctx.params);
|
|
682
113
|
});
|
|
683
114
|
},
|
|
684
115
|
filterList(ctx) {
|
|
685
|
-
var _a;
|
|
686
116
|
return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
|
|
687
|
-
|
|
688
|
-
const { key } = ctx.params;
|
|
689
|
-
const keys = yield redisScanKeys(ctx.broker.cacher.client, `${keyPrefix}${key}`);
|
|
690
|
-
if (!keys || keys.length == 0) {
|
|
691
|
-
return [];
|
|
692
|
-
}
|
|
693
|
-
const results = [];
|
|
694
|
-
for (const itemKey of keys) {
|
|
695
|
-
try {
|
|
696
|
-
if (itemKey) {
|
|
697
|
-
const itemList = yield lrange(ctx, itemKey);
|
|
698
|
-
if (itemList && _.isArray(itemList)) {
|
|
699
|
-
_.each(itemList, (item) => {
|
|
700
|
-
results.push(JSON.parse(item));
|
|
701
|
-
});
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
catch (error) {
|
|
706
|
-
console.error(`error`, error);
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
return results;
|
|
117
|
+
return yield metadata_registrar_1.Register.filterList(ctx.broker, ctx.params);
|
|
710
118
|
});
|
|
711
119
|
}
|
|
712
120
|
};
|