@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 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 之后的值
@@ -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 originalVal = oldConfig[key] || {};
68
+ const origin = oldConfig[key] || {};
69
69
  oldConfig[key] = {
70
- ...originalVal,
71
70
  value,
72
- required: required === undefined ? false : required,
73
- description: description || '',
74
- validation: validation || '',
75
- secure: secure === undefined ? false : secure,
76
- custom: custom === undefined ? false : custom,
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, name });
2668
+ logger.info('delete blocklet process for upgrading', { did, componentDids });
2669
2669
  } catch (err) {
2670
- logger.error('delete blocklet process for upgrading', { did, name, error: err });
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('end migration');
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({ did: blockletDid });
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({ did: this.did });
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
 
@@ -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
  },
@@ -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 sites = await states.site.getSites();
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: ({ id, rule }) => {
520
- sites.forEach((site) => {
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
- deleteRoutingRule: ({ id, ruleId }) => {
539
- sites.forEach((site) => {
540
- if (site.id === id) {
541
- site.rules = site.rules.filter((rule) => rule.id !== ruleId);
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
- const provider = new Provider({ configDir: tmpDir });
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(sites),
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('validate router config failed', { error, action, data });
561
+ logger.error('validateRouterConfig.failed', { error, action, data });
579
562
  throw error;
580
563
  }
581
564
  }
@@ -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':
@@ -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) {
@@ -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)) {
@@ -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
@@ -499,7 +499,8 @@ const startBlockletProcess = async (
499
499
  throw new Error('blocklet should not be empty');
500
500
  }
501
501
 
502
- const now = Date.now();
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(`skip start skipped process ${processId}`);
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(`skip start process not selected: ${b.meta.did}`, { processId });
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 started', { processId, status, time: Date.now() - startedAt });
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(`skip reload process not selected: ${b.meta.did}`, { processId: b.env.processId });
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 not selected', { id: b.env.id, processId: b.env.processId });
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', { did: b.meta.did, time: Date.now() - startedAt });
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 error = path.join(logDir, 'service.error.log');
142
- createFile({ info, error });
143
- return { info, error };
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.output.log*'));
234
- list.push(path.join(logDir, 'service.error.log*'));
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.15",
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.15",
23
- "@abtnode/auth": "1.16.15",
24
- "@abtnode/certificate-manager": "1.16.15",
25
- "@abtnode/constant": "1.16.15",
26
- "@abtnode/cron": "1.16.15",
27
- "@abtnode/logger": "1.16.15",
28
- "@abtnode/models": "1.16.15",
29
- "@abtnode/queue": "1.16.15",
30
- "@abtnode/rbac": "1.16.15",
31
- "@abtnode/router-provider": "1.16.15",
32
- "@abtnode/static-server": "1.16.15",
33
- "@abtnode/timemachine": "1.16.15",
34
- "@abtnode/util": "1.16.15",
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.15",
46
- "@blocklet/env": "1.16.15",
47
- "@blocklet/meta": "1.16.15",
48
- "@blocklet/resolver": "1.16.15",
49
- "@blocklet/sdk": "1.16.15",
50
- "@did-space/client": "^0.2.165",
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": "643adb67bfc0b33f4db0be1b75000324c8e5a248"
103
+ "gitHead": "688b1c7ae0f6652094100c101f5d218266dd86ac"
104
104
  }