@abtnode/core 1.16.27 → 1.16.28-beta-bfbab430

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/team.js CHANGED
@@ -1526,7 +1526,15 @@ class TeamAPI extends EventEmitter {
1526
1526
  } else {
1527
1527
  const exist = await state.findOne({ userDid, visitorId, appPid });
1528
1528
  if (exist) {
1529
- [, [data]] = await state.update(exist.id, { ua, lastLoginIp, passportId, status, extra });
1529
+ const mergeExtra = defaults({}, extra || {}, exist.extra || {});
1530
+
1531
+ [, [data]] = await state.update(exist.id, {
1532
+ ua,
1533
+ lastLoginIp,
1534
+ passportId,
1535
+ status,
1536
+ extra: mergeExtra,
1537
+ });
1530
1538
  logger.info('update userSession successfully', { id: exist.id, ua, lastLoginIp, passportId, status, extra });
1531
1539
  } else {
1532
1540
  data = await state.insert({
@@ -34,7 +34,7 @@ const {
34
34
  SESSION_CACHE_TTL,
35
35
  } = require('@abtnode/constant');
36
36
 
37
- const getBlockletEngine = require('@blocklet/meta/lib/engine');
37
+ const { getBlockletEngine } = require('@blocklet/meta/lib/engine');
38
38
  const {
39
39
  isDeletableBlocklet,
40
40
  getComponentMissingConfigs,
@@ -103,6 +103,7 @@ const formatContext = require('@abtnode/util/lib/format-context');
103
103
  const md5 = require('@abtnode/util/lib/md5');
104
104
  const { callFederated } = require('@abtnode/auth/lib/util/federated');
105
105
  const pAll = require('p-all');
106
+ const toBlockletDid = require('@blocklet/meta/lib/did');
106
107
  const launcher = require('../../util/launcher');
107
108
  const util = require('../../util');
108
109
  const {
@@ -218,13 +219,6 @@ const pm2StatusMap = {
218
219
  stop: BlockletStatus.stopped,
219
220
  };
220
221
 
221
- /**
222
- * get blocklet engine info, default is node
223
- * @param {object} blockletMeta blocklet meta
224
- * @return {string} engine name
225
- */
226
- const getBlockletEngineNameByPlatform = (blockletMeta) => getBlockletEngine(blockletMeta).interpreter;
227
-
228
222
  const getWalletAppNotification = async (blocklet, tempBlockletInfo) => {
229
223
  let blockletInfo = tempBlockletInfo;
230
224
  if (!blockletInfo) {
@@ -1733,6 +1727,26 @@ class DiskBlockletManager extends BaseBlockletManager {
1733
1727
  throw new Error(result?.reason || 'failed to send email');
1734
1728
  }
1735
1729
 
1730
+ async sendPush({ did, receiver, notification }) {
1731
+ const blocklet = await this.getBlocklet(did);
1732
+ const nodeInfo = await states.node.read();
1733
+ const { wallet } = getBlockletInfo(blocklet, nodeInfo.sk);
1734
+ // HACK: 因为发送方法是按照数组来处理的
1735
+
1736
+ const result = await sendToUser(
1737
+ receiver,
1738
+ JSON.parse(notification),
1739
+ {
1740
+ appDid: wallet.address,
1741
+ appSk: wallet.secretKey,
1742
+ },
1743
+ undefined,
1744
+ undefined,
1745
+ 'send-to-push-kit'
1746
+ );
1747
+ return result;
1748
+ }
1749
+
1736
1750
  async configNotification({ did, notification = {} }, context) {
1737
1751
  let newConfig = {};
1738
1752
  try {
@@ -3211,7 +3225,27 @@ class DiskBlockletManager extends BaseBlockletManager {
3211
3225
 
3212
3226
  // app disk info, component runtime info, component engine
3213
3227
  await forEachBlocklet(blocklet, async (component, { level }) => {
3214
- component.engine = getEngine(getBlockletEngineNameByPlatform(component.meta)).describe();
3228
+ const engine = getBlockletEngine(component.meta);
3229
+ if (engine.interpreter === 'blocklet') {
3230
+ const engineId = toBlockletDid(engine.source.name);
3231
+ const engineComponent = findComponentByIdV2(blocklet, [engineId]);
3232
+ if (engineComponent) {
3233
+ component.engine = {
3234
+ name: engineComponent.meta.did,
3235
+ displayName: engineComponent.meta.title,
3236
+ description: engineComponent.meta.description,
3237
+ version: engineComponent.meta.version,
3238
+ available: true,
3239
+ visible: true,
3240
+ // FIXME: @wangshijun this should be dynamic
3241
+ logo: '',
3242
+ };
3243
+ } else {
3244
+ throw new Error(`engine component ${engineId} not found`);
3245
+ }
3246
+ } else {
3247
+ component.engine = getEngine(engine.interpreter)?.describe();
3248
+ }
3215
3249
 
3216
3250
  if (level === 0) {
3217
3251
  component.diskInfo = await getDiskInfo(component, {
@@ -3471,6 +3505,7 @@ class DiskBlockletManager extends BaseBlockletManager {
3471
3505
  deployedFrom || fromBlockletSource(source)
3472
3506
  })`,
3473
3507
  action: `/blocklets/${did}/overview`,
3508
+ blockletDashboardAction: '/.well-known/service/admin/blocklets',
3474
3509
  entityType: 'blocklet',
3475
3510
  entityId: did,
3476
3511
  severity: 'success',
@@ -3639,6 +3674,7 @@ class DiskBlockletManager extends BaseBlockletManager {
3639
3674
  componentDids
3640
3675
  )} is ${actionName} successfully for ${title}`,
3641
3676
  action: `/blocklets/${did}/overview`,
3677
+ blockletDashboardAction: '/.well-known/service/admin/blocklets',
3642
3678
  entityType: 'blocklet',
3643
3679
  entityId: did,
3644
3680
  severity: 'success',
@@ -82,6 +82,9 @@ const validate = (engine) => {
82
82
  if (!engine) {
83
83
  return true;
84
84
  }
85
+ if (engine === 'blocklet') {
86
+ return true;
87
+ }
85
88
 
86
89
  if (!engineMap.has(engine)) {
87
90
  throw new Error(
@@ -89,7 +92,7 @@ const validate = (engine) => {
89
92
  );
90
93
  }
91
94
 
92
- if (!engineMap.get(engine).isAvailable()) {
95
+ if (!engineMap.get(engine)?.isAvailable()) {
93
96
  throw new Error(`${engine} bin path does not exist`);
94
97
  }
95
98
 
@@ -5,9 +5,10 @@
5
5
  const path = require('path');
6
6
  const fs = require('fs-extra');
7
7
  const createArchive = require('archiver');
8
+ const pick = require('lodash/pick');
8
9
  const { slugify } = require('transliteration');
9
- const { BLOCKLET_META_FILE, PROJECT } = require('@blocklet/constant');
10
- const { update: updateMetaFile } = require('@blocklet/meta/lib/file');
10
+ const { BLOCKLET_META_FILE, PROJECT, BLOCKLET_INTERFACE_TYPE_WEB } = require('@blocklet/constant');
11
+ const { update: updateMetaFile, read: readMetaFile } = require('@blocklet/meta/lib/file');
11
12
  const { createRelease: createBlockletRelease } = require('@abtnode/util/lib/create-blocklet-release');
12
13
  const urlPathFriendly = require('@blocklet/meta/lib/url-path-friendly').default;
13
14
  const { hasStartEngine } = require('@blocklet/meta/lib/util');
@@ -16,7 +17,13 @@ const logger = require('@abtnode/logger')('create-resource-blocklet-pack');
16
17
 
17
18
  const { createReleaseSchema } = require('../../validators/project');
18
19
 
19
- const { getLogoFile, exportBlockletResources, getResourceList, checkResourceExists } = require('./util');
20
+ const {
21
+ getLogoFile,
22
+ exportBlockletResources,
23
+ getResourceList,
24
+ checkResourceExists,
25
+ getExtendedMetaFile,
26
+ } = require('./util');
20
27
 
21
28
  const createPackRelease = async ({
22
29
  did,
@@ -215,6 +222,30 @@ const createPackRelease = async ({
215
222
  files: project.blockletScreenshots?.length ? ['screenshots'] : [],
216
223
  screenshots: project.blockletScreenshots || [],
217
224
  };
225
+
226
+ // merge extended blocklet.yml
227
+ const extendedMetaFile = getExtendedMetaFile({ app: blocklet, projectId, releaseId });
228
+ if (fs.existsSync(extendedMetaFile)) {
229
+ const extendedMeta = readMetaFile(extendedMetaFile);
230
+ logger.info('merge extended blocklet.yml', extendedMeta);
231
+ Object.assign(meta, pick(extendedMeta, ['environments', 'engine']));
232
+ }
233
+
234
+ // Reset group for blocklets with engine specified
235
+ if (meta.engine?.interpreter === 'blocklet') {
236
+ delete meta.group;
237
+ meta.interfaces = [
238
+ {
239
+ name: 'publicUrl',
240
+ path: '/',
241
+ port: 'BLOCKLET_PORT',
242
+ prefix: '*',
243
+ protocol: 'tcp',
244
+ type: BLOCKLET_INTERFACE_TYPE_WEB,
245
+ },
246
+ ];
247
+ }
248
+
218
249
  await updateMetaFile(path.join(releaseBundleDir, BLOCKLET_META_FILE), meta);
219
250
 
220
251
  // create release
@@ -1,9 +1,10 @@
1
1
  const path = require('path');
2
2
  const fs = require('fs-extra');
3
3
  const createArchive = require('archiver');
4
+ const pick = require('lodash/pick');
4
5
  const { slugify } = require('transliteration');
5
- const { BLOCKLET_META_FILE, PROJECT } = require('@blocklet/constant');
6
- const { update: updateMetaFile } = require('@blocklet/meta/lib/file');
6
+ const { BLOCKLET_META_FILE, PROJECT, BLOCKLET_INTERFACE_TYPE_WEB } = require('@blocklet/constant');
7
+ const { update: updateMetaFile, read: readMetaFile } = require('@blocklet/meta/lib/file');
7
8
  const { createRelease: createBlockletRelease } = require('@abtnode/util/lib/create-blocklet-release');
8
9
  const { titleSchema } = require('@blocklet/meta/lib/schema');
9
10
  const { validateNewDid } = require('@blocklet/meta/lib/name');
@@ -14,7 +15,13 @@ const logger = require('@abtnode/logger')('create-resource-blocklet');
14
15
  const { createReleaseSchema } = require('../../validators/project');
15
16
  const getIsMultipleTenant = require('./get-is-multiple-tenant');
16
17
 
17
- const { getLogoFile, exportBlockletResources, getResourceList, checkResourceExists } = require('./util');
18
+ const {
19
+ getLogoFile,
20
+ exportBlockletResources,
21
+ getResourceList,
22
+ checkResourceExists,
23
+ getExtendedMetaFile,
24
+ } = require('./util');
18
25
  const createPackRelease = require('./create-pack-release');
19
26
  const connectToStore = require('./connect-to-store');
20
27
  const publishToStore = require('./publish-to-store');
@@ -356,6 +363,29 @@ const createRelease = async ({
356
363
  files: project.blockletScreenshots?.length ? ['screenshots'] : [],
357
364
  screenshots: project.blockletScreenshots || [],
358
365
  };
366
+
367
+ // merge extended blocklet.yml
368
+ const extendedMetaFile = getExtendedMetaFile({ app: blocklet, projectId, releaseId });
369
+ if (fs.existsSync(extendedMetaFile)) {
370
+ const extendedMeta = readMetaFile(extendedMetaFile);
371
+ logger.info('merge extended blocklet.yml', extendedMeta);
372
+ Object.assign(meta, pick(extendedMeta, ['environments', 'engine']));
373
+ }
374
+
375
+ // Enable mountPoint for blocklets with engine specified
376
+ if (meta.engine?.interpreter === 'blocklet') {
377
+ meta.interfaces = [
378
+ {
379
+ name: 'publicUrl',
380
+ path: '/',
381
+ port: 'BLOCKLET_PORT',
382
+ prefix: '*',
383
+ protocol: 'tcp',
384
+ type: BLOCKLET_INTERFACE_TYPE_WEB,
385
+ },
386
+ ];
387
+ }
388
+
359
389
  await updateMetaFile(path.join(releaseBundleDir, BLOCKLET_META_FILE), meta);
360
390
 
361
391
  // create release
@@ -2,7 +2,7 @@ const path = require('path');
2
2
  const fs = require('fs-extra');
3
3
  const fg = require('fast-glob');
4
4
  const { isValid: isValidDid } = require('@arcblock/did');
5
- const { PROJECT, BLOCKLET_RESOURCE_DIR } = require('@blocklet/constant');
5
+ const { PROJECT, BLOCKLET_RESOURCE_DIR, BLOCKLET_META_FILE } = require('@blocklet/constant');
6
6
 
7
7
  const COMPONENT_CONFIG_MAP_DIR = '.component_config';
8
8
 
@@ -135,9 +135,20 @@ const checkResourceExists = async (projectDir, action, releaseId) => {
135
135
  }
136
136
  };
137
137
 
138
+ const getExtendedMetaFile = ({ app, projectId, releaseId }) => {
139
+ const { dataDir } = app.env;
140
+ const dirArr = [dataDir, PROJECT.DIR, projectId || '/'];
141
+ if (releaseId) {
142
+ dirArr.push(PROJECT.RELEASE_DIR, releaseId || '/');
143
+ }
144
+ dirArr.push(BLOCKLET_META_FILE);
145
+ return path.join(...dirArr);
146
+ };
147
+
138
148
  module.exports = {
139
149
  getLogoFile,
140
150
  exportBlockletResources,
141
151
  getResourceList,
142
152
  checkResourceExists,
153
+ getExtendedMetaFile,
143
154
  };
package/lib/index.js CHANGED
@@ -328,6 +328,7 @@ function ABTNode(options) {
328
328
  loginFederated: blockletManager.loginFederated.bind(blockletManager),
329
329
  configNotification: blockletManager.configNotification.bind(blockletManager),
330
330
  sendEmail: blockletManager.sendEmail.bind(blockletManager),
331
+ sendPush: blockletManager.sendPush.bind(blockletManager),
331
332
  updateWhoCanAccess: blockletManager.updateWhoCanAccess.bind(blockletManager),
332
333
  updateAppSessionConfig: blockletManager.updateAppSessionConfig.bind(blockletManager),
333
334
  updateComponentTitle: blockletManager.updateComponentTitle.bind(blockletManager),
@@ -30,15 +30,10 @@ const {
30
30
  BLOCKLET_BUNDLE_FOLDER,
31
31
  BLOCKLET_DYNAMIC_PATH_PREFIX,
32
32
  BLOCKLET_INTERFACE_TYPE_WEB,
33
- BlockletGroup,
34
33
  } = require('@blocklet/constant');
35
- const {
36
- forEachComponentV2Sync,
37
- hasStartEngine,
38
- isGatewayBlocklet,
39
- getComponentId,
40
- } = require('@blocklet/meta/lib/util');
34
+ const { forEachComponentV2Sync, isGatewayBlocklet, getComponentId } = require('@blocklet/meta/lib/util');
41
35
  const { fromPublicKey } = require('@ocap/wallet');
36
+ const { hasMountPoint } = require('@blocklet/meta/lib/engine');
42
37
 
43
38
  const {
44
39
  validateAddSite,
@@ -712,15 +707,14 @@ class RouterManager extends EventEmitter {
712
707
  const rootComponentPrefix = joinUrl(blockletPrefix, blocklet.mountPoint || '/');
713
708
  rawRule.from.pathPrefix = normalizePathPrefix(rootComponentPrefix);
714
709
 
715
- const isOccupiable = blocklet.meta.group === BlockletGroup.gateway;
716
-
710
+ const isOccupiable = isGatewayBlocklet(blocklet.meta);
717
711
  if (!isOccupiable) {
718
712
  rules.push(rawRule);
719
713
  }
720
714
 
721
715
  forEachComponentV2Sync(blocklet, (component) => {
722
716
  const { meta } = component;
723
- if (isGatewayBlocklet(meta) || !hasStartEngine(meta)) {
717
+ if (hasMountPoint(meta) === false) {
724
718
  return;
725
719
  }
726
720
 
@@ -252,7 +252,7 @@ class User extends ExtendBase {
252
252
 
253
253
  // eslint-disable-next-line require-await
254
254
  async getUsersByDids({ dids, query }) {
255
- const { approved, includeTags, includePassports } = query || {};
255
+ const { approved, includeTags, includePassports, includeUserSessions } = query || {};
256
256
  const condition = { did: dids };
257
257
  if (isNullOrUndefined(approved) === false) {
258
258
  condition.approved = !!approved;
@@ -267,6 +267,16 @@ class User extends ExtendBase {
267
267
  as: 'passports',
268
268
  });
269
269
  }
270
+ if (includeUserSessions) {
271
+ include.push({
272
+ model: this.models.UserSession,
273
+ as: 'userSessions',
274
+ where: {
275
+ status: 'online',
276
+ },
277
+ required: false,
278
+ });
279
+ }
270
280
 
271
281
  return this.find({ where: condition, include });
272
282
  }
@@ -33,13 +33,7 @@ const getFolderSize = require('@abtnode/util/lib/get-folder-size');
33
33
  const normalizePathPrefix = require('@abtnode/util/lib/normalize-path-prefix');
34
34
  const hashFiles = require('@abtnode/util/lib/hash-files');
35
35
  const didDocument = require('@abtnode/util/lib/did-document');
36
- const {
37
- BLOCKLET_MAX_MEM_LIMIT_IN_MB,
38
- BLOCKLET_INSTALL_TYPE,
39
- APP_STRUCT_VERSION,
40
- BLOCKLET_STORE,
41
- BLOCKLET_STORE_DEV,
42
- } = require('@abtnode/constant');
36
+ const { BLOCKLET_MAX_MEM_LIMIT_IN_MB, BLOCKLET_INSTALL_TYPE, APP_STRUCT_VERSION } = require('@abtnode/constant');
43
37
  const {
44
38
  parseComponents,
45
39
  ensureMeta,
@@ -75,7 +69,7 @@ const {
75
69
  BLOCKLET_TENANT_MODES,
76
70
  } = require('@blocklet/constant');
77
71
  const validateBlockletEntry = require('@blocklet/meta/lib/entry');
78
- const getBlockletEngine = require('@blocklet/meta/lib/engine');
72
+ const { getBlockletEngine } = require('@blocklet/meta/lib/engine');
79
73
  const getBlockletInfo = require('@blocklet/meta/lib/info');
80
74
  const getBlockletWallet = require('@blocklet/meta/lib/wallet');
81
75
  const {
@@ -111,10 +105,10 @@ const { installExternalDependencies } = require('./install-external-dependencies
111
105
 
112
106
  /**
113
107
  * get blocklet engine info, default is node
114
- * @param {object} blockletMeta blocklet meta
108
+ * @param {object} meta blocklet meta
115
109
  * @return {string} engine name
116
110
  */
117
- const getBlockletEngineNameByPlatform = (blockletMeta) => getBlockletEngine(blockletMeta).interpreter;
111
+ const getBlockletEngineNameByPlatform = (meta) => getBlockletEngine(meta).interpreter;
118
112
 
119
113
  const noop = () => {};
120
114
  const noopAsync = async () => {};
@@ -209,6 +203,9 @@ const getComponentStartEngine = (component, { e2eMode = false } = {}) => {
209
203
  }
210
204
 
211
205
  const blockletEngineInfo = getBlockletEngine(component.meta);
206
+ if (blockletEngineInfo.interpreter === 'blocklet') {
207
+ return {};
208
+ }
212
209
 
213
210
  let script = null;
214
211
  let interpreter = '';
@@ -218,10 +215,11 @@ const getComponentStartEngine = (component, { e2eMode = false } = {}) => {
218
215
 
219
216
  if (startFromDevEntry) {
220
217
  script = startFromDevEntry;
221
- } else if (group === 'dapp') {
222
- script = blockletEngineInfo.script || BLOCKLET_ENTRY_FILE;
218
+ } else if (group === 'dapp' || group === 'engine') {
219
+ script = blockletEngineInfo.source || BLOCKLET_ENTRY_FILE;
223
220
  args = blockletEngineInfo.args || [];
224
221
  } else if (group === 'static') {
222
+ // FIXME: @wangshijun deprecate this
225
223
  script = require.resolve('@abtnode/static-server');
226
224
  environmentObj.BLOCKLET_MAIN_DIR = path.join(appDir, main);
227
225
  }
@@ -562,6 +560,10 @@ const startBlockletProcess = async (
562
560
  const { cwd, script, args, environmentObj, interpreter, interpreterArgs } = getComponentStartEngine(b, {
563
561
  e2eMode,
564
562
  });
563
+ if (!script) {
564
+ logger.info('skip start process without script', { processId });
565
+ return;
566
+ }
565
567
 
566
568
  // get env
567
569
  const env = getRuntimeEnvironments(b, nodeEnvironments, ancestors);
@@ -809,6 +811,12 @@ const checkBlockletProcessHealthy = async (blocklet, { minConsecutiveTime, timeo
809
811
  return;
810
812
  }
811
813
 
814
+ // components that relies on another engine component should not be checked
815
+ const engine = getBlockletEngine(b.meta);
816
+ if (engine.interpreter === 'blocklet') {
817
+ return;
818
+ }
819
+
812
820
  if (!hasStartEngine(b.meta)) {
813
821
  return;
814
822
  }
@@ -1308,27 +1316,6 @@ const getBlocklet = async ({
1308
1316
 
1309
1317
  const nodeInfo = await states.node.read();
1310
1318
 
1311
- // FIXME: 梁柱, 下面的代码块, 在 1.16.29 之后的版本, 可以删除
1312
- {
1313
- // 对于历史项目, server.db -> servers -> blockletRegistryList 已经存储了没有 id 的 store, 这里需要兼容处理
1314
- let isNeedFixRedundantData = false;
1315
- const urlToId = {
1316
- [BLOCKLET_STORE.url]: BLOCKLET_STORE.id,
1317
- [BLOCKLET_STORE_DEV.url]: BLOCKLET_STORE_DEV.id,
1318
- };
1319
- (nodeInfo?.blockletRegistryList || []).forEach((store) => {
1320
- if (!store.id) {
1321
- store.id = urlToId[store.url];
1322
- isNeedFixRedundantData = true;
1323
- }
1324
- });
1325
-
1326
- // 更新历史数据中遗漏的 store id, 方便后期删除这段代码
1327
- if (isNeedFixRedundantData) {
1328
- await states.node.updateNodeInfo({ blockletRegistryList: nodeInfo.blockletRegistryList });
1329
- }
1330
- }
1331
-
1332
1319
  (nodeInfo?.blockletRegistryList || []).forEach((store) => {
1333
1320
  if (!blocklet.settings.storeList.find((x) => x.url === store.url)) {
1334
1321
  blocklet.settings.storeList.push({
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.27",
6
+ "version": "1.16.28-beta-bfbab430",
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.27",
23
- "@abtnode/auth": "1.16.27",
24
- "@abtnode/certificate-manager": "1.16.27",
25
- "@abtnode/constant": "1.16.27",
26
- "@abtnode/cron": "1.16.27",
27
- "@abtnode/logger": "1.16.27",
28
- "@abtnode/models": "1.16.27",
29
- "@abtnode/queue": "1.16.27",
30
- "@abtnode/rbac": "1.16.27",
31
- "@abtnode/router-provider": "1.16.27",
32
- "@abtnode/static-server": "1.16.27",
33
- "@abtnode/timemachine": "1.16.27",
34
- "@abtnode/util": "1.16.27",
22
+ "@abtnode/analytics": "1.16.28-beta-bfbab430",
23
+ "@abtnode/auth": "1.16.28-beta-bfbab430",
24
+ "@abtnode/certificate-manager": "1.16.28-beta-bfbab430",
25
+ "@abtnode/constant": "1.16.28-beta-bfbab430",
26
+ "@abtnode/cron": "1.16.28-beta-bfbab430",
27
+ "@abtnode/logger": "1.16.28-beta-bfbab430",
28
+ "@abtnode/models": "1.16.28-beta-bfbab430",
29
+ "@abtnode/queue": "1.16.28-beta-bfbab430",
30
+ "@abtnode/rbac": "1.16.28-beta-bfbab430",
31
+ "@abtnode/router-provider": "1.16.28-beta-bfbab430",
32
+ "@abtnode/static-server": "1.16.28-beta-bfbab430",
33
+ "@abtnode/timemachine": "1.16.28-beta-bfbab430",
34
+ "@abtnode/util": "1.16.28-beta-bfbab430",
35
35
  "@arcblock/did": "1.18.123",
36
36
  "@arcblock/did-auth": "1.18.123",
37
37
  "@arcblock/did-ext": "^1.18.123",
@@ -42,12 +42,12 @@
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
43
  "@arcblock/validator": "^1.18.123",
44
44
  "@arcblock/vc": "1.18.123",
45
- "@blocklet/constant": "1.16.27",
46
- "@blocklet/env": "1.16.27",
47
- "@blocklet/meta": "1.16.27",
48
- "@blocklet/resolver": "1.16.27",
49
- "@blocklet/sdk": "1.16.27",
50
- "@blocklet/store": "1.16.27",
45
+ "@blocklet/constant": "1.16.28-beta-bfbab430",
46
+ "@blocklet/env": "1.16.28-beta-bfbab430",
47
+ "@blocklet/meta": "1.16.28-beta-bfbab430",
48
+ "@blocklet/resolver": "1.16.28-beta-bfbab430",
49
+ "@blocklet/sdk": "1.16.28-beta-bfbab430",
50
+ "@blocklet/store": "1.16.28-beta-bfbab430",
51
51
  "@did-space/client": "^0.4.20",
52
52
  "@fidm/x509": "^1.2.1",
53
53
  "@ocap/mcrypto": "1.18.123",
@@ -103,5 +103,5 @@
103
103
  "jest": "^29.7.0",
104
104
  "unzipper": "^0.10.11"
105
105
  },
106
- "gitHead": "b7dcd46b040c5ad3a273b14b1a411fafc1390828"
106
+ "gitHead": "f1fbf0752de46be00d1faa0d54eb7d28016e0bb9"
107
107
  }