@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.
- package/lib/actionsHandler.d.ts +3 -8
- package/lib/actionsHandler.js +30 -623
- 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 -597
- package/src/metadata.service.ts +4 -5
package/lib/actionsHandler.js
CHANGED
|
@@ -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 =
|
|
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
|
-
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|