@abtnode/core 1.16.15 → 1.16.16-beta-e038cde7
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/api/node.js +1 -1
- package/lib/api/team.js +17 -0
- package/lib/blocklet/extras.js +7 -8
- package/lib/blocklet/manager/disk.js +10 -11
- package/lib/index.js +1 -0
- package/lib/monitor/blocklet-runtime-monitor.js +7 -2
- package/lib/monitor/node-runtime-monitor.js +7 -2
- package/lib/router/index.js +0 -2
- package/lib/router/manager.js +21 -38
- package/lib/states/audit-log.js +3 -0
- package/lib/states/index.js +1 -1
- package/lib/states/runtime-insight.js +0 -1
- package/lib/states/site.js +4 -0
- package/lib/states/user.js +9 -0
- package/lib/util/blocklet.js +14 -13
- package/lib/util/log.js +7 -5
- package/package.json +21 -21
package/lib/api/node.js
CHANGED
|
@@ -143,7 +143,7 @@ class NodeAPI {
|
|
|
143
143
|
|
|
144
144
|
// eslint-disable-next-line no-unused-vars
|
|
145
145
|
async getHistory({ hours = 1 } = {}, context) {
|
|
146
|
-
const history = await this.runtimeMonitor.getHistory();
|
|
146
|
+
const history = await this.runtimeMonitor.getHistory(hours);
|
|
147
147
|
return getHistoryList({
|
|
148
148
|
history,
|
|
149
149
|
hours,
|
package/lib/api/team.js
CHANGED
|
@@ -533,6 +533,23 @@ class TeamAPI extends EventEmitter {
|
|
|
533
533
|
return doc;
|
|
534
534
|
}
|
|
535
535
|
|
|
536
|
+
async removeUserPassport({ passportId, userDid, teamDid }) {
|
|
537
|
+
if (!passportId) {
|
|
538
|
+
throw new Error('Revoked passport should not be empty');
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
const state = await this.getUserState(teamDid);
|
|
542
|
+
|
|
543
|
+
const doc = await state.removePassportById({ id: passportId });
|
|
544
|
+
|
|
545
|
+
logger.info('user passport remove successfully', { teamDid, userDid, passportId });
|
|
546
|
+
|
|
547
|
+
this.emit(EVENTS.USER_UPDATED, { teamDid, user: doc });
|
|
548
|
+
this.emit(EVENTS.USER_PERMISSION_UPDATED, { teamDid, user: doc });
|
|
549
|
+
|
|
550
|
+
return doc;
|
|
551
|
+
}
|
|
552
|
+
|
|
536
553
|
async switchProfile({ teamDid, userDid, profile }) {
|
|
537
554
|
const state = await this.getUserState(teamDid);
|
|
538
555
|
// NOTICE: 这个 schema 没有对数据做任何 default 操作,所以没必要用 validate 之后的值
|
package/lib/blocklet/extras.js
CHANGED
|
@@ -65,16 +65,15 @@ const mergeConfigs = ({ old: oldConfigs, cur: newConfigs = [], did = '', dek = '
|
|
|
65
65
|
const { name, key, value, default: defaultVal, required, description, secure, validation, custom, shared } = config;
|
|
66
66
|
// 新增、更新或者删除
|
|
67
67
|
if (key) {
|
|
68
|
-
const
|
|
68
|
+
const origin = oldConfig[key] || {};
|
|
69
69
|
oldConfig[key] = {
|
|
70
|
-
...originalVal,
|
|
71
70
|
value,
|
|
72
|
-
required: required === undefined ?
|
|
73
|
-
description: description || '',
|
|
74
|
-
validation: validation || '',
|
|
75
|
-
secure: secure === undefined ?
|
|
76
|
-
custom: custom === undefined ?
|
|
77
|
-
shared,
|
|
71
|
+
required: required === undefined ? !!origin.required : required,
|
|
72
|
+
description: description || origin.description || '',
|
|
73
|
+
validation: validation || origin.validation || '',
|
|
74
|
+
secure: secure === undefined ? !!origin.secure : secure,
|
|
75
|
+
custom: custom === undefined ? !!origin.custom : custom,
|
|
76
|
+
shared: shared === undefined ? origin.shared : shared,
|
|
78
77
|
};
|
|
79
78
|
return;
|
|
80
79
|
}
|
|
@@ -1479,7 +1479,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1479
1479
|
// eslint-disable-next-line no-unused-vars
|
|
1480
1480
|
async getRuntimeHistory({ did, hours }, context) {
|
|
1481
1481
|
const metaDid = await states.blocklet.getBlockletMetaDid(did);
|
|
1482
|
-
const history = await this.runtimeMonitor.getHistory(metaDid);
|
|
1482
|
+
const history = await this.runtimeMonitor.getHistory(metaDid, hours);
|
|
1483
1483
|
|
|
1484
1484
|
return getHistoryList({
|
|
1485
1485
|
history,
|
|
@@ -2665,13 +2665,14 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2665
2665
|
// delete old process
|
|
2666
2666
|
try {
|
|
2667
2667
|
await this.deleteProcess({ did, componentDids }, context);
|
|
2668
|
-
logger.info('delete blocklet process for upgrading', { did,
|
|
2668
|
+
logger.info('delete blocklet process for upgrading', { did, componentDids });
|
|
2669
2669
|
} catch (err) {
|
|
2670
|
-
logger.error('delete blocklet process for upgrading', { did,
|
|
2670
|
+
logger.error('delete blocklet process for upgrading', { did, componentDids, error: err });
|
|
2671
2671
|
}
|
|
2672
2672
|
|
|
2673
2673
|
// update state
|
|
2674
2674
|
await states.blocklet.upgradeBlocklet({ meta, source, deployedFrom, children });
|
|
2675
|
+
logger.info('updated blocklet for upgrading', { did, componentDids, source, name });
|
|
2675
2676
|
// ensure component status is upgrading
|
|
2676
2677
|
await states.blocklet.setBlockletStatus(did, BlockletStatus.upgrading, { componentDids });
|
|
2677
2678
|
await this._setConfigsFromMeta(did);
|
|
@@ -2689,7 +2690,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2689
2690
|
// post install
|
|
2690
2691
|
await this._runPostInstallHook(blocklet, context);
|
|
2691
2692
|
|
|
2692
|
-
logger.info('start migration');
|
|
2693
|
+
logger.info('start migration on upgrading', { did, componentDids });
|
|
2693
2694
|
{
|
|
2694
2695
|
const oldVersions = {};
|
|
2695
2696
|
forEachBlockletSync(oldBlocklet, (b, { id }) => {
|
|
@@ -2712,11 +2713,9 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2712
2713
|
throw error;
|
|
2713
2714
|
}
|
|
2714
2715
|
};
|
|
2715
|
-
await forEachBlocklet(blocklet, runMigration, { parallel: true });
|
|
2716
|
+
await forEachBlocklet(blocklet, runMigration, { parallel: true, concurrencyLimit: 2 });
|
|
2716
2717
|
}
|
|
2717
|
-
logger.info('
|
|
2718
|
-
|
|
2719
|
-
logger.info('updated blocklet for upgrading', { did, version, source, name });
|
|
2718
|
+
logger.info('done migration on upgrading', { did, componentDids });
|
|
2720
2719
|
|
|
2721
2720
|
if (oldBlocklet.status === BlockletStatus.running) {
|
|
2722
2721
|
try {
|
|
@@ -2917,7 +2916,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2917
2916
|
// rollback blocklet extra state
|
|
2918
2917
|
await states.blockletExtras.update({ did: blocklet.meta.did }, extraState);
|
|
2919
2918
|
|
|
2920
|
-
logger.info('blocklet rollback successfully', { did });
|
|
2919
|
+
logger.info('blocklet rollback successfully', { did, action });
|
|
2921
2920
|
this.emit(BlockletEvents.updated, result);
|
|
2922
2921
|
return result;
|
|
2923
2922
|
}
|
|
@@ -3075,7 +3074,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
3075
3074
|
...getHooksOutputFiles(b),
|
|
3076
3075
|
});
|
|
3077
3076
|
|
|
3078
|
-
await forEachBlocklet(blocklet, preInstall, { parallel: true });
|
|
3077
|
+
await forEachBlocklet(blocklet, preInstall, { parallel: true, concurrencyLimit: 2 });
|
|
3079
3078
|
}
|
|
3080
3079
|
|
|
3081
3080
|
async _runPostInstallHook(blocklet, context) {
|
|
@@ -3092,7 +3091,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
3092
3091
|
...getHooksOutputFiles(b),
|
|
3093
3092
|
});
|
|
3094
3093
|
|
|
3095
|
-
await forEachBlocklet(blocklet, postInstall, { parallel: true });
|
|
3094
|
+
await forEachBlocklet(blocklet, postInstall, { parallel: true, concurrencyLimit: 2 });
|
|
3096
3095
|
}
|
|
3097
3096
|
|
|
3098
3097
|
async _createNotification(did, notification) {
|
package/lib/index.js
CHANGED
|
@@ -390,6 +390,7 @@ function ABTNode(options) {
|
|
|
390
390
|
// Passport
|
|
391
391
|
revokeUserPassport: teamAPI.revokeUserPassport.bind(teamAPI),
|
|
392
392
|
enableUserPassport: teamAPI.enableUserPassport.bind(teamAPI),
|
|
393
|
+
removeUserPassport: teamAPI.removeUserPassport.bind(teamAPI),
|
|
393
394
|
issuePassportToUser: teamAPI.issuePassportToUser.bind(teamAPI),
|
|
394
395
|
|
|
395
396
|
createPassportIssuance: teamAPI.createPassportIssuance.bind(teamAPI),
|
|
@@ -2,6 +2,7 @@ const EventEmitter = require('events');
|
|
|
2
2
|
|
|
3
3
|
const cloneDeep = require('lodash/cloneDeep');
|
|
4
4
|
const pLimit = require('p-limit');
|
|
5
|
+
const dayjs = require('@abtnode/util/lib/dayjs');
|
|
5
6
|
const { forEachBlocklet, isGatewayBlocklet, hasStartEngine } = require('@blocklet/meta/lib/util');
|
|
6
7
|
const getComponentProcessId = require('@blocklet/meta/lib/get-component-process-id');
|
|
7
8
|
const { EVENTS } = require('@abtnode/constant');
|
|
@@ -53,8 +54,12 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
53
54
|
this.inProgress = false;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
async getHistory(blockletDid) {
|
|
57
|
-
const result = await this.states.runtimeInsight.findPaginated({
|
|
57
|
+
async getHistory(blockletDid, hours = 1) {
|
|
58
|
+
const result = await this.states.runtimeInsight.findPaginated({
|
|
59
|
+
did: blockletDid,
|
|
60
|
+
startDate: dayjs().subtract(hours, 'hours').toDate().getTime(),
|
|
61
|
+
paging: { pageSize: hours * 360 },
|
|
62
|
+
});
|
|
58
63
|
return (result.list || []).reverse();
|
|
59
64
|
}
|
|
60
65
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const EventEmitter = require('events');
|
|
2
|
+
const dayjs = require('@abtnode/util/lib/dayjs');
|
|
2
3
|
const pick = require('lodash/pick');
|
|
3
4
|
const cloneDeep = require('lodash/cloneDeep');
|
|
4
5
|
|
|
@@ -93,8 +94,12 @@ class NodeRuntimeMonitor extends EventEmitter {
|
|
|
93
94
|
return this.data.realtime;
|
|
94
95
|
}
|
|
95
96
|
|
|
96
|
-
async getHistory() {
|
|
97
|
-
const result = await this.state.findPaginated({
|
|
97
|
+
async getHistory(hours = 1) {
|
|
98
|
+
const result = await this.state.findPaginated({
|
|
99
|
+
did: this.did,
|
|
100
|
+
startDate: dayjs().subtract(hours, 'hours').toDate().getTime(),
|
|
101
|
+
paging: { pageSize: hours * 360 },
|
|
102
|
+
});
|
|
98
103
|
return (result.list || []).reverse();
|
|
99
104
|
}
|
|
100
105
|
|
package/lib/router/index.js
CHANGED
|
@@ -247,7 +247,6 @@ Router.formatSites = (sites = []) => {
|
|
|
247
247
|
port: daemonRule.to.port,
|
|
248
248
|
did: rule.to.did,
|
|
249
249
|
componentId: rule.to.componentId,
|
|
250
|
-
cacheGroup: site.mode === BLOCKLET_MODES.PRODUCTION ? 'blockletJs' : '',
|
|
251
250
|
pageGroup: rule.to.pageGroup,
|
|
252
251
|
},
|
|
253
252
|
});
|
|
@@ -281,7 +280,6 @@ Router.formatSites = (sites = []) => {
|
|
|
281
280
|
to: {
|
|
282
281
|
type: ROUTING_RULE_TYPES.DAEMON,
|
|
283
282
|
port: daemonRule.to.port,
|
|
284
|
-
cacheGroup: site.mode === BLOCKLET_MODES.PRODUCTION ? 'blockletJs' : '',
|
|
285
283
|
pageGroup: rule.to.pageGroup,
|
|
286
284
|
did: rule.to.did,
|
|
287
285
|
},
|
package/lib/router/manager.js
CHANGED
|
@@ -140,9 +140,6 @@ class RouterManager extends EventEmitter {
|
|
|
140
140
|
throw new Error("Can not delete this site because it's protected");
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
// validate router config
|
|
144
|
-
await this.validateRouterConfig('deleteRoutingSite', { id });
|
|
145
|
-
|
|
146
143
|
const removedSiteCount = await states.site.remove({ id });
|
|
147
144
|
|
|
148
145
|
if (removedSiteCount === 0) {
|
|
@@ -365,9 +362,6 @@ class RouterManager extends EventEmitter {
|
|
|
365
362
|
throw new Error('Deleting an system protected rule is forbidden');
|
|
366
363
|
}
|
|
367
364
|
|
|
368
|
-
// validate router config
|
|
369
|
-
await this.validateRouterConfig('deleteRoutingRule', { id, ruleId });
|
|
370
|
-
|
|
371
365
|
// 只要有匹配到的查询条件,不管是否删除成功都不会返回 0,所以这里没用 update 的返回值
|
|
372
366
|
const doc = await states.site.findOne({ id });
|
|
373
367
|
if (doc.rules.some((x) => x.id === ruleId || x.groupId === ruleId)) {
|
|
@@ -507,47 +501,34 @@ class RouterManager extends EventEmitter {
|
|
|
507
501
|
}
|
|
508
502
|
|
|
509
503
|
async validateRouterConfig(action, data) {
|
|
504
|
+
logger.info('validateRouterConfig.start', { action, data });
|
|
505
|
+
|
|
510
506
|
// get data from db
|
|
511
507
|
const info = await states.node.read();
|
|
512
508
|
const httpsEnabled = get(info, 'routing.https', true);
|
|
513
509
|
|
|
514
510
|
const certificates = httpsEnabled ? await this.certManager.getAllNormal() : [];
|
|
515
511
|
|
|
516
|
-
let
|
|
512
|
+
let site;
|
|
513
|
+
if (data.site) {
|
|
514
|
+
site = cloneDeep(data.site);
|
|
515
|
+
} else if (data.id) {
|
|
516
|
+
site = await states.site.getSiteById(data.id);
|
|
517
|
+
}
|
|
518
|
+
|
|
517
519
|
// mutate data by input
|
|
518
520
|
const mutations = {
|
|
519
|
-
addRoutingRule: ({
|
|
520
|
-
|
|
521
|
-
if (site.id === id) {
|
|
522
|
-
site.rules.push(rule);
|
|
523
|
-
}
|
|
524
|
-
});
|
|
525
|
-
},
|
|
526
|
-
updateRoutingRule: ({ id, rule }) => {
|
|
527
|
-
sites.forEach((site) => {
|
|
528
|
-
if (site.id === id) {
|
|
529
|
-
site.rules = site.rules.map((x) => {
|
|
530
|
-
if (x.id === rule.id) {
|
|
531
|
-
return rule;
|
|
532
|
-
}
|
|
533
|
-
return x;
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
});
|
|
521
|
+
addRoutingRule: ({ rule }) => {
|
|
522
|
+
site.rules.push(rule);
|
|
537
523
|
},
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
if (
|
|
541
|
-
|
|
524
|
+
updateRoutingRule: ({ rule }) => {
|
|
525
|
+
site.rules = site.rules.map((x) => {
|
|
526
|
+
if (x.id === rule.id) {
|
|
527
|
+
return rule;
|
|
542
528
|
}
|
|
529
|
+
return x;
|
|
543
530
|
});
|
|
544
531
|
},
|
|
545
|
-
addRoutingSite: ({ site }) => {
|
|
546
|
-
sites.push(site);
|
|
547
|
-
},
|
|
548
|
-
deleteRoutingSite: ({ id }) => {
|
|
549
|
-
sites = sites.filter((site) => site.id !== id);
|
|
550
|
-
},
|
|
551
532
|
};
|
|
552
533
|
if (mutations[action]) {
|
|
553
534
|
mutations[action](cloneDeep(data));
|
|
@@ -557,11 +538,12 @@ class RouterManager extends EventEmitter {
|
|
|
557
538
|
const providerName = getProviderFromNodeInfo(info);
|
|
558
539
|
const Provider = getProvider(providerName);
|
|
559
540
|
const tmpDir = path.join(os.tmpdir(), `${providerName}-${Date.now()}`);
|
|
560
|
-
|
|
541
|
+
// disable cache to reduce nginx reload time and memory consumption
|
|
542
|
+
const provider = new Provider({ configDir: tmpDir, cacheEnabled: false });
|
|
561
543
|
const tempRouter = new Router({
|
|
562
544
|
provider,
|
|
563
545
|
getRoutingParams: async () => ({
|
|
564
|
-
sites: await ensureLatestInfo(
|
|
546
|
+
sites: await ensureLatestInfo([site]),
|
|
565
547
|
certificates,
|
|
566
548
|
commonHeaders: get(info, 'routing.headers', {}),
|
|
567
549
|
services: [], // TODO: do we need to add some item here?
|
|
@@ -573,9 +555,10 @@ class RouterManager extends EventEmitter {
|
|
|
573
555
|
try {
|
|
574
556
|
await tempRouter.validateConfig();
|
|
575
557
|
await fse.remove(tmpDir);
|
|
558
|
+
logger.info('validateRouterConfig.done', { action, data });
|
|
576
559
|
} catch (error) {
|
|
577
560
|
// 如果出错,保留 Nginx 配置文件,方便定位问题
|
|
578
|
-
logger.error('
|
|
561
|
+
logger.error('validateRouterConfig.failed', { error, action, data });
|
|
579
562
|
throw error;
|
|
580
563
|
}
|
|
581
564
|
}
|
package/lib/states/audit-log.js
CHANGED
|
@@ -207,6 +207,8 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
207
207
|
return `revoked **${passport}** passport of user ${user}`;
|
|
208
208
|
case 'enableUserPassport':
|
|
209
209
|
return `enabled **${passport}** passport of user ${user}`;
|
|
210
|
+
case 'removeUserPassport':
|
|
211
|
+
return `remove **${passport}** passport of user ${user}`;
|
|
210
212
|
case 'updateUserApproval':
|
|
211
213
|
return `${args.user.approved ? 'enabled' : 'disabled'} user ${user}`;
|
|
212
214
|
case 'updateUserTags':
|
|
@@ -368,6 +370,7 @@ const getLogCategory = (action) => {
|
|
|
368
370
|
case 'deletePassportIssuance':
|
|
369
371
|
case 'revokeUserPassport':
|
|
370
372
|
case 'enableUserPassport':
|
|
373
|
+
case 'removeUserPassport':
|
|
371
374
|
case 'updateUserApproval':
|
|
372
375
|
case 'updateUserTags':
|
|
373
376
|
case 'createMemberInvitation':
|
package/lib/states/index.js
CHANGED
|
@@ -42,7 +42,7 @@ const init = (dataDirs, config = {}) => {
|
|
|
42
42
|
const jobState = new JobState(models.Job, config);
|
|
43
43
|
const backupState = new BackupState(models.Backup, config);
|
|
44
44
|
const trafficInsight = new TrafficInsightState(models.TrafficInsight, config);
|
|
45
|
-
const runtimeInsight = new RuntimeInsightState(models.RuntimeInsight, config);
|
|
45
|
+
const runtimeInsight = new RuntimeInsightState(models.RuntimeInsight, { ...config, maxPageSize: 8640 });
|
|
46
46
|
|
|
47
47
|
return {
|
|
48
48
|
node: nodeState,
|
|
@@ -5,7 +5,6 @@ const BaseState = require('./base');
|
|
|
5
5
|
* @extends BaseState<import('@abtnode/models').RuntimeInsightState>
|
|
6
6
|
*/
|
|
7
7
|
class RuntimeInsight extends BaseState {
|
|
8
|
-
// fetch data for recent hour
|
|
9
8
|
findPaginated({ did = '', startDate = '', endDate = '', paging = { pageSize: 360 } } = {}) {
|
|
10
9
|
const where = {};
|
|
11
10
|
if (did) {
|
package/lib/states/site.js
CHANGED
|
@@ -51,6 +51,10 @@ class SiteState extends BaseState {
|
|
|
51
51
|
return sites.filter((x) => x.rules.some((r) => r.to?.did === did));
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
getSiteById(id) {
|
|
55
|
+
return this.findOne({ id });
|
|
56
|
+
}
|
|
57
|
+
|
|
54
58
|
async getSiteByRuleId(id, ruleId) {
|
|
55
59
|
const site = await this.findOne({ id });
|
|
56
60
|
if (site && site.rules.some((r) => r.id === ruleId)) {
|
package/lib/states/user.js
CHANGED
|
@@ -129,6 +129,15 @@ class User extends ExtendBase {
|
|
|
129
129
|
return this._setPassportStatusById({ did, id, status: PASSPORT_STATUS.VALID });
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
async removePassportById({ id }) {
|
|
133
|
+
const num = await this.passport.remove({ id });
|
|
134
|
+
if (num === 0) {
|
|
135
|
+
throw new Error(`passport does not exist: ${id}`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return num;
|
|
139
|
+
}
|
|
140
|
+
|
|
132
141
|
/**
|
|
133
142
|
* remove a user by user's did
|
|
134
143
|
* @param {object} params
|
package/lib/util/blocklet.js
CHANGED
|
@@ -499,7 +499,8 @@ const startBlockletProcess = async (
|
|
|
499
499
|
throw new Error('blocklet should not be empty');
|
|
500
500
|
}
|
|
501
501
|
|
|
502
|
-
|
|
502
|
+
// 需要在在这里传入字符串类型,否则进程中如法转化成 Date 对象
|
|
503
|
+
const now = `${new Date()}`;
|
|
503
504
|
|
|
504
505
|
await forEachBlocklet(
|
|
505
506
|
blocklet,
|
|
@@ -515,12 +516,12 @@ const startBlockletProcess = async (
|
|
|
515
516
|
const { processId, logsDir, appDir } = b.env;
|
|
516
517
|
|
|
517
518
|
if (skippedProcessIds.includes(processId)) {
|
|
518
|
-
logger.info(
|
|
519
|
+
logger.info('skip start skipped process', { processId });
|
|
519
520
|
return;
|
|
520
521
|
}
|
|
521
522
|
|
|
522
523
|
if (shouldSkipComponent(b.meta.did, componentDids)) {
|
|
523
|
-
logger.info(
|
|
524
|
+
logger.info('skip start process not selected', { processId });
|
|
524
525
|
return;
|
|
525
526
|
}
|
|
526
527
|
|
|
@@ -616,14 +617,14 @@ const startBlockletProcess = async (
|
|
|
616
617
|
if (status === BlockletStatus.error) {
|
|
617
618
|
throw new Error(`${processId} is not running within 3 seconds`);
|
|
618
619
|
}
|
|
619
|
-
logger.info('blocklet
|
|
620
|
+
logger.info('done start blocklet', { processId, status, time: Date.now() - startedAt });
|
|
620
621
|
|
|
621
622
|
// run hook
|
|
622
623
|
postStart(b, { env }).catch((err) => {
|
|
623
624
|
logger.error('blocklet post start failed', { processId, error: err });
|
|
624
625
|
});
|
|
625
626
|
},
|
|
626
|
-
{ parallel: true }
|
|
627
|
+
{ parallel: true, concurrencyLimit: 2 }
|
|
627
628
|
);
|
|
628
629
|
};
|
|
629
630
|
|
|
@@ -682,12 +683,12 @@ const reloadBlockletProcess = (blocklet, { componentDids } = {}) =>
|
|
|
682
683
|
}
|
|
683
684
|
|
|
684
685
|
if (shouldSkipComponent(b.meta.did, componentDids)) {
|
|
685
|
-
logger.info(
|
|
686
|
+
logger.info('skip reload process', { processId: b.env.processId });
|
|
686
687
|
return;
|
|
687
688
|
}
|
|
688
689
|
|
|
689
|
-
logger.info('reload process', { processId: b.env.processId });
|
|
690
690
|
await reloadProcess(b.env.processId);
|
|
691
|
+
logger.info('done reload process', { processId: b.env.processId });
|
|
691
692
|
},
|
|
692
693
|
{ parallel: false }
|
|
693
694
|
);
|
|
@@ -716,10 +717,10 @@ const deleteProcess = (processId) =>
|
|
|
716
717
|
new Promise((resolve, reject) => {
|
|
717
718
|
pm2.delete(processId, (err) => {
|
|
718
719
|
if (isUsefulError(err)) {
|
|
719
|
-
logger.error('blocklet process delete failed', { error: err });
|
|
720
|
+
logger.error('blocklet process delete failed', { processId, error: err });
|
|
720
721
|
return reject(err);
|
|
721
722
|
}
|
|
722
|
-
return resolve();
|
|
723
|
+
return resolve(processId);
|
|
723
724
|
});
|
|
724
725
|
});
|
|
725
726
|
|
|
@@ -728,11 +729,11 @@ const reloadProcess = (processId) =>
|
|
|
728
729
|
pm2.reload(processId, (err) => {
|
|
729
730
|
if (err) {
|
|
730
731
|
if (isUsefulError(err)) {
|
|
731
|
-
logger.error('blocklet reload failed', { error: err });
|
|
732
|
+
logger.error('blocklet reload failed', { processId, error: err });
|
|
732
733
|
}
|
|
733
734
|
return reject(err);
|
|
734
735
|
}
|
|
735
|
-
return resolve();
|
|
736
|
+
return resolve(processId);
|
|
736
737
|
});
|
|
737
738
|
});
|
|
738
739
|
|
|
@@ -770,7 +771,7 @@ const checkBlockletProcessHealthy = async (blocklet, { minConsecutiveTime, timeo
|
|
|
770
771
|
}
|
|
771
772
|
|
|
772
773
|
if (shouldSkipComponent(b.meta.did, componentDids)) {
|
|
773
|
-
logger.info('skip check component healthy
|
|
774
|
+
logger.info('skip check component healthy', { processId: b.env.processId });
|
|
774
775
|
return;
|
|
775
776
|
}
|
|
776
777
|
|
|
@@ -778,7 +779,7 @@ const checkBlockletProcessHealthy = async (blocklet, { minConsecutiveTime, timeo
|
|
|
778
779
|
|
|
779
780
|
const startedAt = Date.now();
|
|
780
781
|
await _checkProcessHealthy(b, { minConsecutiveTime, timeout, logToTerminal });
|
|
781
|
-
logger.info('component healthy', {
|
|
782
|
+
logger.info('done check component healthy', { processId: b.env.processId, time: Date.now() - startedAt });
|
|
782
783
|
},
|
|
783
784
|
{ parallel: true }
|
|
784
785
|
);
|
package/lib/util/log.js
CHANGED
|
@@ -138,9 +138,11 @@ const getLogFiles = async ({ name, node }) => {
|
|
|
138
138
|
if (name === 'blocklet-services') {
|
|
139
139
|
const logDir = path.join(node.dataDirs.logs, '_abtnode');
|
|
140
140
|
const info = path.join(logDir, 'service.log');
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
141
|
+
const access = path.join(logDir, 'service.access.log');
|
|
142
|
+
const stdout = path.join(logDir, 'service.stdout.log');
|
|
143
|
+
const stderr = path.join(logDir, 'service.stderr.log');
|
|
144
|
+
createFile({ info, access, stdout, stderr });
|
|
145
|
+
return { info, access, stdout, stderr };
|
|
144
146
|
}
|
|
145
147
|
|
|
146
148
|
if (name.indexOf('blocklet-') === 0) {
|
|
@@ -230,8 +232,8 @@ const getDownloadLogFilesFromServer = async ({ dates, nodeInfo, node } = {}) =>
|
|
|
230
232
|
list.push(path.join(logDir, 'access.log*'));
|
|
231
233
|
|
|
232
234
|
// abt-node-service console & gateway
|
|
233
|
-
list.push(path.join(logDir, 'service.
|
|
234
|
-
list.push(path.join(logDir, 'service.
|
|
235
|
+
list.push(path.join(logDir, 'service.stdout.log*'));
|
|
236
|
+
list.push(path.join(logDir, 'service.stderr.log*'));
|
|
235
237
|
list.push(path.join(logDir, 'service.log*'));
|
|
236
238
|
|
|
237
239
|
// abt-node-db-hub console & backup
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.
|
|
6
|
+
"version": "1.16.16-beta-e038cde7",
|
|
7
7
|
"description": "",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"files": [
|
|
@@ -19,19 +19,19 @@
|
|
|
19
19
|
"author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
|
|
20
20
|
"license": "Apache-2.0",
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@abtnode/analytics": "1.16.
|
|
23
|
-
"@abtnode/auth": "1.16.
|
|
24
|
-
"@abtnode/certificate-manager": "1.16.
|
|
25
|
-
"@abtnode/constant": "1.16.
|
|
26
|
-
"@abtnode/cron": "1.16.
|
|
27
|
-
"@abtnode/logger": "1.16.
|
|
28
|
-
"@abtnode/models": "1.16.
|
|
29
|
-
"@abtnode/queue": "1.16.
|
|
30
|
-
"@abtnode/rbac": "1.16.
|
|
31
|
-
"@abtnode/router-provider": "1.16.
|
|
32
|
-
"@abtnode/static-server": "1.16.
|
|
33
|
-
"@abtnode/timemachine": "1.16.
|
|
34
|
-
"@abtnode/util": "1.16.
|
|
22
|
+
"@abtnode/analytics": "1.16.16-beta-e038cde7",
|
|
23
|
+
"@abtnode/auth": "1.16.16-beta-e038cde7",
|
|
24
|
+
"@abtnode/certificate-manager": "1.16.16-beta-e038cde7",
|
|
25
|
+
"@abtnode/constant": "1.16.16-beta-e038cde7",
|
|
26
|
+
"@abtnode/cron": "1.16.16-beta-e038cde7",
|
|
27
|
+
"@abtnode/logger": "1.16.16-beta-e038cde7",
|
|
28
|
+
"@abtnode/models": "1.16.16-beta-e038cde7",
|
|
29
|
+
"@abtnode/queue": "1.16.16-beta-e038cde7",
|
|
30
|
+
"@abtnode/rbac": "1.16.16-beta-e038cde7",
|
|
31
|
+
"@abtnode/router-provider": "1.16.16-beta-e038cde7",
|
|
32
|
+
"@abtnode/static-server": "1.16.16-beta-e038cde7",
|
|
33
|
+
"@abtnode/timemachine": "1.16.16-beta-e038cde7",
|
|
34
|
+
"@abtnode/util": "1.16.16-beta-e038cde7",
|
|
35
35
|
"@arcblock/did": "1.18.89",
|
|
36
36
|
"@arcblock/did-auth": "1.18.89",
|
|
37
37
|
"@arcblock/did-ext": "^1.18.89",
|
|
@@ -42,12 +42,12 @@
|
|
|
42
42
|
"@arcblock/pm2-events": "^0.0.5",
|
|
43
43
|
"@arcblock/validator": "^1.18.89",
|
|
44
44
|
"@arcblock/vc": "1.18.89",
|
|
45
|
-
"@blocklet/constant": "1.16.
|
|
46
|
-
"@blocklet/env": "1.16.
|
|
47
|
-
"@blocklet/meta": "1.16.
|
|
48
|
-
"@blocklet/resolver": "1.16.
|
|
49
|
-
"@blocklet/sdk": "1.16.
|
|
50
|
-
"@did-space/client": "^0.2.
|
|
45
|
+
"@blocklet/constant": "1.16.16-beta-e038cde7",
|
|
46
|
+
"@blocklet/env": "1.16.16-beta-e038cde7",
|
|
47
|
+
"@blocklet/meta": "1.16.16-beta-e038cde7",
|
|
48
|
+
"@blocklet/resolver": "1.16.16-beta-e038cde7",
|
|
49
|
+
"@blocklet/sdk": "1.16.16-beta-e038cde7",
|
|
50
|
+
"@did-space/client": "^0.2.170",
|
|
51
51
|
"@fidm/x509": "^1.2.1",
|
|
52
52
|
"@ocap/mcrypto": "1.18.89",
|
|
53
53
|
"@ocap/util": "1.18.89",
|
|
@@ -100,5 +100,5 @@
|
|
|
100
100
|
"jest": "^27.5.1",
|
|
101
101
|
"unzipper": "^0.10.11"
|
|
102
102
|
},
|
|
103
|
-
"gitHead": "
|
|
103
|
+
"gitHead": "688b1c7ae0f6652094100c101f5d218266dd86ac"
|
|
104
104
|
}
|