@abtnode/core 1.16.8-beta-186fd5aa → 1.16.8-next-d1e52353

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.
Files changed (38) hide show
  1. package/lib/api/team.js +24 -64
  2. package/lib/blocklet/manager/disk.js +2 -8
  3. package/lib/blocklet/manager/helper/migrate-application-to-struct-v2.js +5 -5
  4. package/lib/blocklet/storage/backup/blocklet-extras.js +2 -2
  5. package/lib/blocklet/storage/backup/blocklet.js +2 -2
  6. package/lib/index.js +14 -16
  7. package/lib/migrations/1.16.8-component-title.js +1 -1
  8. package/lib/migrations/1.6.9-update-node-info-and-certificate.js +1 -1
  9. package/lib/migrations/index.js +190 -40
  10. package/lib/monitor/node-runtime-monitor.js +2 -29
  11. package/lib/router/helper.js +6 -6
  12. package/lib/router/manager.js +35 -36
  13. package/lib/states/access-key.js +3 -20
  14. package/lib/states/audit-log.js +7 -8
  15. package/lib/states/backup.js +11 -59
  16. package/lib/states/base.js +13 -5
  17. package/lib/states/blocklet-extras.js +11 -8
  18. package/lib/states/blocklet.js +136 -225
  19. package/lib/states/cache.js +3 -21
  20. package/lib/states/connect-account.js +8 -0
  21. package/lib/states/index.js +28 -18
  22. package/lib/states/job.js +8 -0
  23. package/lib/states/migration.js +3 -4
  24. package/lib/states/node.js +104 -145
  25. package/lib/states/notification.js +18 -40
  26. package/lib/states/passport.js +8 -0
  27. package/lib/states/session.js +28 -44
  28. package/lib/states/site.js +32 -39
  29. package/lib/states/user.js +187 -374
  30. package/lib/states/webhook.js +5 -7
  31. package/lib/team/manager.js +108 -116
  32. package/lib/util/blocklet.js +0 -1
  33. package/lib/util/index.js +3 -0
  34. package/lib/util/queue.js +14 -20
  35. package/lib/util/ready.js +1 -1
  36. package/lib/webhook/index.js +6 -4
  37. package/package.json +19 -18
  38. package/lib/states/challenge.js +0 -58
package/lib/api/team.js CHANGED
@@ -25,7 +25,7 @@ const {
25
25
  } = require('@abtnode/auth/lib/passport');
26
26
  const { getPassportStatusEndpoint } = require('@abtnode/auth/lib/auth');
27
27
  const getBlockletInfo = require('@blocklet/meta/lib/info');
28
- const { parseUserAvatar } = require('@abtnode/util/lib/user-avatar');
28
+ const { parseUserAvatar } = require('@abtnode/util/lib/user');
29
29
  const { getChainClient } = require('@abtnode/util/lib/get-chain-client');
30
30
  const { getWalletDid } = require('@blocklet/meta/lib/did-utils');
31
31
 
@@ -85,7 +85,7 @@ const sendPassportVcNotification = ({ userDid, appWallet: wallet, locale, vc })
85
85
  };
86
86
 
87
87
  const formatTransferData = (data) => ({
88
- transferId: data._id,
88
+ transferId: data.id,
89
89
  remark: data.remark || '',
90
90
  expireDate: new Date(data.expireDate).toString(),
91
91
  appDid: data.appDid,
@@ -119,13 +119,12 @@ class TeamAPI extends EventEmitter {
119
119
  if (teamDid !== nodeInfo.did) {
120
120
  throw new Error('Cannot add user of owner role');
121
121
  }
122
-
123
122
  if (await state.count({ role: ROLES.OWNER })) {
124
123
  throw new Error('The owner already exists');
125
124
  }
126
125
  }
127
126
 
128
- const { _action, ...doc } = await state.login(user);
127
+ const { _action, ...doc } = await state.loginUser(user);
129
128
  if (_action === 'update') {
130
129
  logger.info('user updated successfully', { teamDid, userDid: user.did });
131
130
  this.emit(EVENTS.USER_UPDATED, { teamDid, user: doc });
@@ -162,7 +161,7 @@ class TeamAPI extends EventEmitter {
162
161
  }
163
162
  }
164
163
 
165
- const doc = await state.add(user);
164
+ const doc = await state.addUser(user);
166
165
 
167
166
  logger.info('user added successfully', { teamDid, userDid: user.did, userPk: user.pk, userName: user.fullName });
168
167
 
@@ -183,7 +182,7 @@ class TeamAPI extends EventEmitter {
183
182
  return doc;
184
183
  }
185
184
 
186
- async getUsers({ teamDid, query, paging: inputPaging, sort, dids, sourceIds }) {
185
+ async getUsers({ teamDid, query, paging: inputPaging, sort, dids }) {
187
186
  const state = await this.getUserState(teamDid);
188
187
 
189
188
  if (inputPaging?.pageSize > MAX_USER_PAGE_SIZE) {
@@ -205,14 +204,6 @@ class TeamAPI extends EventEmitter {
205
204
  pageCount: 1,
206
205
  page: 1,
207
206
  };
208
- } else if (sourceIds) {
209
- list = await state.getUsersBySourceIds({ query, sourceIds });
210
- paging = {
211
- total: list.length,
212
- pageSize: sourceIds.length,
213
- pageCount: 1,
214
- page: 1,
215
- };
216
207
  } else {
217
208
  const doc = await state.getUsers({ query, sort, paging: { pageSize: 20, ...inputPaging } });
218
209
  list = doc.list;
@@ -239,8 +230,8 @@ class TeamAPI extends EventEmitter {
239
230
  'avatar',
240
231
  'locale',
241
232
  // oauth relate fields
242
- 'source',
243
- 'extraConfigs',
233
+ 'sourceProvider',
234
+ 'connectedAccounts',
244
235
  ])
245
236
  // eslint-disable-next-line function-paren-newline
246
237
  ),
@@ -250,35 +241,23 @@ class TeamAPI extends EventEmitter {
250
241
 
251
242
  async getUsersCount({ teamDid }) {
252
243
  const state = await this.getUserState(teamDid);
253
-
254
244
  return state.count();
255
245
  }
256
246
 
257
247
  async getUsersCountPerRole({ teamDid }) {
258
248
  const roles = await this.getRoles({ teamDid });
259
-
260
249
  const state = await this.getUserState(teamDid);
261
-
262
- const res = [];
263
-
264
- const all = await state.count();
265
- res.push({ key: '$all', value: all });
266
-
267
- for (const { name } of roles) {
268
- // eslint-disable-next-line no-await-in-loop
269
- const count = await state.count({ passports: { $elemMatch: { name, status: PASSPORT_STATUS.VALID } } });
270
- res.push({ key: name, value: count });
271
- }
272
-
273
- const none = await state.count({ passports: { $size: 0 } });
274
- res.push({ key: '$none', value: none });
275
-
276
- return res;
250
+ const names = ['$all', ...roles.map((x) => x.name), '$none'];
251
+ return Promise.all(
252
+ names.map(async (name) => {
253
+ const count = await state.countByPassport({ name, status: PASSPORT_STATUS.VALID });
254
+ return { key: name, value: count };
255
+ })
256
+ );
277
257
  }
278
258
 
279
259
  async getUser({ teamDid, user, options = {} }) {
280
260
  const state = await this.getUserState(teamDid);
281
-
282
261
  return state.getUser(user.did, options);
283
262
  }
284
263
 
@@ -298,12 +277,9 @@ class TeamAPI extends EventEmitter {
298
277
 
299
278
  async updateUser({ teamDid, user }) {
300
279
  const state = await this.getUserState(teamDid);
301
-
302
- const doc = await state.update(user);
303
-
280
+ const doc = await state.updateUser(user.did, user);
304
281
  logger.info('user updated successfully', { teamDid, userDid: user.did });
305
282
  this.emit(EVENTS.USER_UPDATED, { teamDid, user: doc });
306
-
307
283
  return doc;
308
284
  }
309
285
 
@@ -321,9 +297,7 @@ class TeamAPI extends EventEmitter {
321
297
  const state = await this.getUserState(teamDid);
322
298
 
323
299
  await state.remove({ did });
324
-
325
300
  logger.info('user removed successfully', { teamDid, userDid: did });
326
-
327
301
  this.emit(EVENTS.USER_REMOVED, { teamDid, user: { did } });
328
302
 
329
303
  return { did };
@@ -545,15 +519,14 @@ class TeamAPI extends EventEmitter {
545
519
  }
546
520
 
547
521
  const state = await this.getSessionState(teamDid);
548
-
549
- const invitation = await state.findOne({ _id: inviteId, type: 'invite' });
522
+ const invitation = await state.read(inviteId);
550
523
  if (!invitation) {
551
524
  return null;
552
525
  }
553
526
 
554
527
  return {
555
528
  // eslint-disable-next-line no-underscore-dangle
556
- inviteId: invitation._id,
529
+ inviteId: invitation.id,
557
530
  role: invitation.role,
558
531
  remark: invitation.remark,
559
532
  expireDate: new Date(invitation.expireDate).toString(),
@@ -571,7 +544,7 @@ class TeamAPI extends EventEmitter {
571
544
 
572
545
  return invitations.filter(filter || ((x) => x.status !== 'success')).map((d) => ({
573
546
  // eslint-disable-next-line no-underscore-dangle
574
- inviteId: d._id,
547
+ inviteId: d.id,
575
548
  role: d.role,
576
549
  remark: d.remark,
577
550
  expireDate: new Date(d.expireDate).toString(),
@@ -695,7 +668,7 @@ class TeamAPI extends EventEmitter {
695
668
 
696
669
  const state = await this.getSessionState(appDid);
697
670
 
698
- const transfer = await state.findOne({ _id: transferId, type: 'transfer-app-owner' });
671
+ const transfer = await state.read(transferId);
699
672
  if (!transfer) {
700
673
  return null;
701
674
  }
@@ -826,6 +799,7 @@ class TeamAPI extends EventEmitter {
826
799
  }
827
800
  const { id } = await state.start({
828
801
  type: 'passport-issuance',
802
+ key: userDid,
829
803
  expireDate, // session expireDate
830
804
  name: role.name,
831
805
  title: role.title,
@@ -851,14 +825,14 @@ class TeamAPI extends EventEmitter {
851
825
  const query = { type: 'passport-issuance' };
852
826
 
853
827
  if (ownerDid) {
854
- query.ownerDid = ownerDid;
828
+ query.key = ownerDid;
855
829
  }
856
830
 
857
831
  const list = await state.find(query);
858
832
 
859
833
  return list.map((d) => ({
860
834
  // eslint-disable-next-line no-underscore-dangle
861
- id: d._id,
835
+ id: d.id,
862
836
  name: d.name,
863
837
  title: d.title,
864
838
  expireDate: new Date(d.expireDate).toString(),
@@ -869,13 +843,7 @@ class TeamAPI extends EventEmitter {
869
843
 
870
844
  async getPassportIssuance({ teamDid, sessionId }) {
871
845
  const state = await this.getSessionState(teamDid);
872
-
873
- const doc = await state.findOne({ _id: sessionId });
874
-
875
- if (doc) {
876
- doc.id = doc._id;
877
- }
878
-
846
+ const doc = await state.read(sessionId);
879
847
  return doc;
880
848
  }
881
849
 
@@ -1007,11 +975,9 @@ class TeamAPI extends EventEmitter {
1007
975
 
1008
976
  async getPermissions({ teamDid }) {
1009
977
  const rbac = await this.getRBAC(teamDid);
1010
-
1011
978
  const permissions = await rbac.getPermissions();
1012
-
1013
979
  return permissions.map((d) => {
1014
- d.isProtected = d.extra && d.extra.isProtected;
980
+ d.isProtected = !!(d.extra && d.extra.isProtected);
1015
981
  return pick(d, ['name', 'description', 'isProtected']);
1016
982
  });
1017
983
  }
@@ -1022,7 +988,6 @@ class TeamAPI extends EventEmitter {
1022
988
  await validateCreatePermission({ name, description });
1023
989
 
1024
990
  const rbac = await this.getRBAC(teamDid);
1025
-
1026
991
  const added = await rbac.createPermission({ name, description });
1027
992
 
1028
993
  return pick(added, ['name', 'description']);
@@ -1034,7 +999,6 @@ class TeamAPI extends EventEmitter {
1034
999
  await validateUpdatePermission({ name, description });
1035
1000
 
1036
1001
  const rbac = await this.getRBAC(teamDid);
1037
-
1038
1002
  const state = await rbac.updatePermission({ name, description });
1039
1003
 
1040
1004
  return pick(state, ['name', 'description']);
@@ -1044,7 +1008,6 @@ class TeamAPI extends EventEmitter {
1044
1008
  logger.info('grant', { teamDid, roleName, grantName });
1045
1009
 
1046
1010
  const rbac = await this.getRBAC(teamDid);
1047
-
1048
1011
  await rbac.grant(roleName, grantName);
1049
1012
 
1050
1013
  return true;
@@ -1054,7 +1017,6 @@ class TeamAPI extends EventEmitter {
1054
1017
  logger.info('revoke', { teamDid, roleName, grantName });
1055
1018
 
1056
1019
  const rbac = await this.getRBAC(teamDid);
1057
-
1058
1020
  await rbac.revoke(roleName, grantName);
1059
1021
 
1060
1022
  return true;
@@ -1064,7 +1026,6 @@ class TeamAPI extends EventEmitter {
1064
1026
  logger.info('update grants', { teamDid, roleName, grantNames });
1065
1027
 
1066
1028
  const rbac = await this.getRBAC(teamDid);
1067
-
1068
1029
  const role = await rbac.updateGrants(roleName, grantNames);
1069
1030
 
1070
1031
  return pick(role, ['name', 'grants', 'title', 'description']);
@@ -1076,7 +1037,6 @@ class TeamAPI extends EventEmitter {
1076
1037
  validateReservedRole(name);
1077
1038
 
1078
1039
  const rbac = await this.getRBAC(teamDid);
1079
-
1080
1040
  await rbac.removeRole(name);
1081
1041
 
1082
1042
  return true;
@@ -636,7 +636,6 @@ class BlockletManager extends BaseBlockletManager {
636
636
 
637
637
  /**
638
638
  * FIXME: @linchen support cancel
639
- * FIXME: @wangshijun create audit log for this
640
639
  * @param {import('@abtnode/client').RequestRestoreBlockletInput} input
641
640
  * @memberof BlockletManager
642
641
  */
@@ -1883,7 +1882,6 @@ class BlockletManager extends BaseBlockletManager {
1883
1882
  }
1884
1883
 
1885
1884
  /**
1886
- * FIXME: @wangshijun create audit log for this
1887
1885
  * @param {{
1888
1886
  * blocklet: import('@abtnode/client').BlockletState,
1889
1887
  * context: {
@@ -1916,7 +1914,7 @@ class BlockletManager extends BaseBlockletManager {
1916
1914
  });
1917
1915
  await spacesBackup.backup();
1918
1916
 
1919
- await states.backup.success(backup._id, {
1917
+ await states.backup.success(backup.id, {
1920
1918
  targetUrl: getBackupFilesUrlFromEndpoint(getBackupEndpoint(blocklet?.environments)),
1921
1919
  });
1922
1920
 
@@ -1930,7 +1928,7 @@ class BlockletManager extends BaseBlockletManager {
1930
1928
  blocklet,
1931
1929
  });
1932
1930
  } catch (error) {
1933
- await states.backup.fail(backup._id, {
1931
+ await states.backup.fail(backup.id, {
1934
1932
  message: error?.message,
1935
1933
  });
1936
1934
  this.emit(BlockletEvents.backupProgress, {
@@ -1947,8 +1945,6 @@ class BlockletManager extends BaseBlockletManager {
1947
1945
  }
1948
1946
 
1949
1947
  /**
1950
- * FIXME: @linchen support cancel
1951
- * FIXME: @wangshijun create audit log for this
1952
1948
  * @param {{
1953
1949
  * input: import('@abtnode/client').RequestRestoreBlockletInput,
1954
1950
  * context: Record<string, string>,
@@ -2937,7 +2933,6 @@ class BlockletManager extends BaseBlockletManager {
2937
2933
  }
2938
2934
 
2939
2935
  /**
2940
- * FIXME: @wangshijun create audit log for this
2941
2936
  * @param {{
2942
2937
  * blocklet: import('@abtnode/client').BlockletState,
2943
2938
  * context: {
@@ -2992,7 +2987,6 @@ class BlockletManager extends BaseBlockletManager {
2992
2987
 
2993
2988
  /**
2994
2989
  * FIXME: @linchen support cancel
2995
- * FIXME: @wangshijun create audit log for this
2996
2990
  * @param {import('@abtnode/client').RequestRestoreBlockletInput} input
2997
2991
  * @memberof BlockletManager
2998
2992
  */
@@ -216,7 +216,7 @@ const migrateApplicationToStructV2 = async ({ did, appSk: newAppSk, context = {}
216
216
 
217
217
  const backupBlocklet = await states.blocklet.findOne({ 'meta.did': oldBlocklet.meta.did });
218
218
  const backupExtra = cloneDeep(extraData);
219
- const backupSite = await states.site.findOne({ _id: siteData.id });
219
+ const backupSite = await states.site.findOne({ id: siteData.id });
220
220
 
221
221
  const { appPid } = oldBlocklet;
222
222
 
@@ -447,7 +447,7 @@ const migrateApplicationToStructV2 = async ({ did, appSk: newAppSk, context = {}
447
447
 
448
448
  // update routing
449
449
  await states.site.update(
450
- { _id: siteData.id },
450
+ { id: siteData.id },
451
451
  { $set: { domain: siteData.domain, domainAliases: siteData.domainAliases, rules: siteData.rules } }
452
452
  );
453
453
 
@@ -473,12 +473,12 @@ const migrateApplicationToStructV2 = async ({ did, appSk: newAppSk, context = {}
473
473
  logger.error('Migrate application state failed: ', { did, error });
474
474
 
475
475
  try {
476
- await states.blocklet.remove({ _id: backupBlocklet._id });
476
+ await states.blocklet.remove({ id: backupBlocklet.id });
477
477
  await states.blocklet.remove({ 'meta.did': blockletData.meta.did });
478
478
  await states.blocklet.insert(backupBlocklet);
479
- await states.blockletExtras.remove({ _id: backupExtra._id });
479
+ await states.blockletExtras.remove({ id: backupExtra.id });
480
480
  await states.blockletExtras.insert(backupExtra);
481
- await states.site.remove({ _id: backupSite._id });
481
+ await states.site.remove({ id: backupSite.id });
482
482
  await states.site.insert(backupSite);
483
483
 
484
484
  logger.info('Rollback application state');
@@ -50,8 +50,8 @@ class BlockletExtrasBackup extends BaseBackup {
50
50
  const current = queue.pop();
51
51
 
52
52
  // 删除父 blocklet 的某些数据
53
- if (current._id) {
54
- delete current._id;
53
+ if (current.id) {
54
+ delete current.id;
55
55
  delete current.createdAt;
56
56
  delete current.updatedAt;
57
57
  }
@@ -39,8 +39,8 @@ class BlockletBackup extends BaseBackup {
39
39
  const current = queue.pop();
40
40
 
41
41
  // 父组件才需要删除的属性
42
- if (current._id) {
43
- delete current._id;
42
+ if (current.id) {
43
+ delete current.id;
44
44
  delete current.createdAt;
45
45
  delete current.startedAt;
46
46
  delete current.installedAt;
package/lib/index.js CHANGED
@@ -66,17 +66,21 @@ function ABTNode(options) {
66
66
  options.daemon = false;
67
67
  }
68
68
 
69
+ // 0. ensure data dirs
69
70
  const dataDirs = ensureDataDirs(options.dataDir);
70
71
 
71
- const concurrency = getQueueConcurrencyByMem();
72
+ // 1. initialize storage
73
+ states.init(dataDirs, options);
72
74
 
75
+ // 2. initialize queues
76
+ const concurrency = getQueueConcurrencyByMem();
73
77
  logger.info('startup and installation queue currency', { concurrency });
74
78
 
75
- // Initialize the start queue
79
+ // 2.1 initialize the start queue
76
80
  const startQueue = createQueue({
77
81
  daemon: options.daemon,
82
+ model: states.job,
78
83
  name: 'jobs',
79
- dataDir: dataDirs.core,
80
84
  onJob: async (job) => {
81
85
  if (typeof blockletManager.onJob === 'function') {
82
86
  await blockletManager.onJob(job);
@@ -88,11 +92,11 @@ function ABTNode(options) {
88
92
  },
89
93
  });
90
94
 
91
- // Initialize the install queue
95
+ // 2.2 initialize the install queue
92
96
  const installQueue = createQueue({
93
97
  daemon: options.daemon,
98
+ model: states.job,
94
99
  name: 'install_queue',
95
- dataDir: dataDirs.core,
96
100
  onJob: async (job) => {
97
101
  if (typeof blockletManager.onJob === 'function') {
98
102
  await blockletManager.onJob(job);
@@ -109,8 +113,8 @@ function ABTNode(options) {
109
113
 
110
114
  const backupQueue = createQueue({
111
115
  daemon: options.daemon,
116
+ model: states.job,
112
117
  name: 'backup_queue',
113
- dataDir: dataDirs.core,
114
118
  onJob: async (job) => {
115
119
  if (typeof blockletManager.onJob === 'function') {
116
120
  await blockletManager.onJob(job);
@@ -129,7 +133,7 @@ function ABTNode(options) {
129
133
  const restoreQueue = createQueue({
130
134
  daemon: options.daemon,
131
135
  name: 'restore_queue',
132
- dataDir: dataDirs.core,
136
+ model: states.job,
133
137
  onJob: async (job) => {
134
138
  if (typeof blockletManager.onJob === 'function') {
135
139
  await blockletManager.onJob(job);
@@ -145,27 +149,26 @@ function ABTNode(options) {
145
149
  },
146
150
  });
147
151
 
148
- // Initialize storage
149
- states.init(dataDirs, options);
150
-
151
152
  const certManager = new Cert({
152
153
  maintainerEmail: DEFAULT_CERTIFICATE_EMAIL,
153
154
  dataDir: dataDirs.certManagerModule,
154
155
  states,
155
156
  });
156
157
 
158
+ // 3. init routing manager
157
159
  const routerManager = new RouterManager({ certManager });
158
160
  const routingSnapshot = new RoutingSnapshot({
159
161
  baseDir: dataDirs.core,
160
162
  getRoutingData: async () => {
161
163
  const sites = await states.site.getSites();
162
-
163
164
  return { sites };
164
165
  },
165
166
  });
166
167
 
168
+ // 4. init team manager
167
169
  const teamManager = new TeamManager({ nodeDid: options.nodeDid, dataDirs, states });
168
170
 
171
+ // 5. init blocklet manager
169
172
  const blockletManager = new BlockletManager({
170
173
  dataDirs,
171
174
  startQueue,
@@ -377,10 +380,6 @@ function ABTNode(options) {
377
380
  addBlockletStore: teamAPI.addStore.bind(teamAPI),
378
381
  deleteBlockletStore: teamAPI.deleteStore.bind(teamAPI),
379
382
 
380
- // Challenge
381
- generateChallenge: states.challenge.generate.bind(states.challenge),
382
- verifyChallenge: states.challenge.verify.bind(states.challenge),
383
-
384
383
  // Notifications
385
384
  getNotifications: states.notification.findPaginated.bind(states.notification),
386
385
  readNotifications: states.notification.read.bind(states.notification),
@@ -425,7 +424,6 @@ function ABTNode(options) {
425
424
  // Access Key
426
425
  getAccessKeys: states.accessKey.list.bind(states.accessKey),
427
426
  getAccessKey: states.accessKey.detail.bind(states.accessKey),
428
- getAccessKeyByTag: states.accessKey.getAccessKeyByTag.bind(states.accessKey),
429
427
  createAccessKey: states.accessKey.create.bind(states.accessKey),
430
428
  updateAccessKey: states.accessKey.update.bind(states.accessKey),
431
429
  deleteAccessKey: states.accessKey.remove.bind(states.accessKey),
@@ -59,7 +59,7 @@ module.exports = async ({ states, printInfo }) => {
59
59
  }
60
60
 
61
61
  if (shouldUpdate) {
62
- await states.blocklet.update({ _id: app._id }, { $set: { children: app.children } });
62
+ await states.blocklet.update({ id: app.id }, { $set: { children: app.children } });
63
63
  printInfo(`Blocklet in blocklet.db updated: ${app.meta?.title}`);
64
64
  }
65
65
  }
@@ -16,7 +16,7 @@ const updateNodeInfo = async ({ printInfo, states }) => {
16
16
  }
17
17
 
18
18
  if (!isEmpty(data)) {
19
- await states.node.update({ _id: info._id }, { $set: data });
19
+ await states.node.update({ did: info.did }, { $set: data });
20
20
  }
21
21
 
22
22
  printInfo('update did registry and did domain successfully');