@abtnode/core 1.16.14-beta-c2843ec5 → 1.16.14-beta-be739405

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
@@ -24,8 +24,7 @@ class NodeAPI {
24
24
  * @param {object} states StateDB
25
25
  * @param {string} nodeDid
26
26
  */
27
- // eslint-disable-next-line no-unused-vars
28
- constructor(states, nodeDid, getRouterCapabilities = (_) => ({})) {
27
+ constructor(states, nodeDid) {
29
28
  assert.notStrictEqual(states, undefined, 'argument states can not be undefined');
30
29
  assert.notStrictEqual(states, null, 'argument states can not be null');
31
30
 
@@ -40,7 +39,6 @@ class NodeAPI {
40
39
  });
41
40
 
42
41
  this.state = states.node;
43
- this.getRouterCapabilities = getRouterCapabilities;
44
42
  }
45
43
 
46
44
  async updateNodeInfo(entity = {}, context) {
@@ -75,7 +73,6 @@ class NodeAPI {
75
73
  }
76
74
 
77
75
  info.uptime = process.uptime() * 1000;
78
- info.capabilities = this.getRouterCapabilities(info);
79
76
 
80
77
  return info;
81
78
  }
@@ -209,7 +209,7 @@ class BlockletDownloader extends EventEmitter {
209
209
 
210
210
  const cachedBundles = (await this.cache.get(CACHE_KEY)) || [];
211
211
 
212
- forEachComponentV2Sync(blocklet, (component) => {
212
+ const handle = (component) => {
213
213
  const bundleId = getComponentBundleId(component);
214
214
 
215
215
  if (scheduled[bundleId]) {
@@ -238,7 +238,10 @@ class BlockletDownloader extends EventEmitter {
238
238
 
239
239
  scheduled[bundleId] = component.meta;
240
240
  downloadComponentIds.push(component.meta.did);
241
- });
241
+ };
242
+
243
+ handle(blocklet);
244
+ forEachComponentV2Sync(blocklet, handle);
242
245
 
243
246
  const downloadList = Object.values(scheduled);
244
247
  const skipList = Object.values(skipped);
@@ -46,6 +46,7 @@ const {
46
46
  forEachComponentV2,
47
47
  forEachComponentV2Sync,
48
48
  findComponentByIdV2,
49
+ isGatewayBlocklet,
49
50
  } = require('@blocklet/meta/lib/util');
50
51
  const { update: updateMetaFile } = require('@blocklet/meta/lib/file');
51
52
  const { titleSchema, updateMountPointSchema, environmentNameSchema } = require('@blocklet/meta/lib/schema');
@@ -159,7 +160,7 @@ const { sessionConfigSchema } = require('../../validators/util');
159
160
 
160
161
  const request = require('../../util/request');
161
162
 
162
- const { formatEnvironments, getBlockletMeta, validateOwner } = util;
163
+ const { formatEnvironments, getBlockletMeta, validateOwner, isCLI } = util;
163
164
 
164
165
  const statusLock = new Lock('blocklet-status-lock');
165
166
  const limitSync = pLimit(1);
@@ -1045,9 +1046,7 @@ class DiskBlockletManager extends BaseBlockletManager {
1045
1046
  }
1046
1047
 
1047
1048
  if (attachRuntimeInfo) {
1048
- const nodeInfo = await states.node.read();
1049
-
1050
- return this._attachRuntimeInfo({ did, nodeInfo, diskInfo: true, context });
1049
+ return this._attachRuntimeInfo({ did, diskInfo: true, context });
1051
1050
  }
1052
1051
 
1053
1052
  if (useCache && this.cachedBlocklets.has(did)) {
@@ -1641,7 +1640,7 @@ class DiskBlockletManager extends BaseBlockletManager {
1641
1640
  {
1642
1641
  name: 'refresh-accessible-ip',
1643
1642
  time: '0 */10 * * * *', // 10min
1644
- options: { runOnInit: true },
1643
+ options: { runOnInit: true, runInService: true },
1645
1644
  fn: async () => {
1646
1645
  const nodeInfo = await states.node.read();
1647
1646
  await refreshAccessibleExternalNodeIp(nodeInfo);
@@ -2272,7 +2271,6 @@ class DiskBlockletManager extends BaseBlockletManager {
2272
2271
  }
2273
2272
 
2274
2273
  async _attachBlockletListRuntimeInfo({ blocklets }, context) {
2275
- const nodeInfo = await states.node.read();
2276
2274
  return (
2277
2275
  await Promise.all(
2278
2276
  blocklets.map((x) => {
@@ -2282,7 +2280,6 @@ class DiskBlockletManager extends BaseBlockletManager {
2282
2280
 
2283
2281
  return this._attachRuntimeInfo({
2284
2282
  did: x.meta.did,
2285
- nodeInfo,
2286
2283
  diskInfo: false,
2287
2284
  context,
2288
2285
  });
@@ -2291,7 +2288,20 @@ class DiskBlockletManager extends BaseBlockletManager {
2291
2288
  ).filter(Boolean);
2292
2289
  }
2293
2290
 
2294
- async _attachRuntimeInfo({ did, nodeInfo, diskInfo = true, context }) {
2291
+ // 处理 domainAliases#value SLOT_FOR_IP_DNS_SITE
2292
+ async getDomainAliases(blocklet, context = {}) {
2293
+ if (blocklet?.site?.domainAliases?.length) {
2294
+ const nodeIp = await getAccessibleExternalNodeIp();
2295
+ return blocklet.site.domainAliases.map((x) => ({
2296
+ ...x,
2297
+ value: util.replaceDomainSlot({ domain: x.value, context, nodeIp }),
2298
+ }));
2299
+ }
2300
+
2301
+ return [];
2302
+ }
2303
+
2304
+ async _attachRuntimeInfo({ did, diskInfo = true, context }) {
2295
2305
  if (!did) {
2296
2306
  throw new Error('did should not be empty');
2297
2307
  }
@@ -2303,14 +2313,7 @@ class DiskBlockletManager extends BaseBlockletManager {
2303
2313
  return null;
2304
2314
  }
2305
2315
 
2306
- // 处理 domainAliases#value SLOT_FOR_IP_DNS_SITE
2307
- if (blocklet?.site?.domainAliases?.length) {
2308
- const nodeIp = await getAccessibleExternalNodeIp(nodeInfo);
2309
- blocklet.site.domainAliases = blocklet.site.domainAliases.map((x) => ({
2310
- ...x,
2311
- value: util.replaceDomainSlot({ domain: x.value, context, nodeIp }),
2312
- }));
2313
- }
2316
+ blocklet.site.domainAliases = await this.getDomainAliases(blocklet, context);
2314
2317
 
2315
2318
  // app runtime info, app status
2316
2319
  blocklet.appRuntimeInfo = this.runtimeMonitor.getRuntimeInfo(blocklet.meta.did);
@@ -2368,7 +2371,16 @@ class DiskBlockletManager extends BaseBlockletManager {
2368
2371
  return children;
2369
2372
  }
2370
2373
 
2371
- async _addBlocklet({ component, mode = BLOCKLET_MODES.PRODUCTION, name, did, title, description, skSource = '' }) {
2374
+ async _addBlocklet({
2375
+ component,
2376
+ mode = BLOCKLET_MODES.PRODUCTION,
2377
+ name,
2378
+ did,
2379
+ title,
2380
+ description,
2381
+ skSource = '',
2382
+ folder,
2383
+ }) {
2372
2384
  const environments = component?.meta?.environments || [];
2373
2385
 
2374
2386
  const meta = {
@@ -2397,7 +2409,7 @@ class DiskBlockletManager extends BaseBlockletManager {
2397
2409
 
2398
2410
  let children;
2399
2411
  if (mode === BLOCKLET_MODES.DEVELOPMENT) {
2400
- children = [component];
2412
+ children = isGatewayBlocklet(component.meta) ? [] : [component];
2401
2413
  } else {
2402
2414
  children = component ? await this._getChildrenForInstallation(component) : [];
2403
2415
  }
@@ -2417,6 +2429,8 @@ class DiskBlockletManager extends BaseBlockletManager {
2417
2429
  meta.logo = component.meta.logo;
2418
2430
  } else if (children[0]?.meta?.logo) {
2419
2431
  meta.logo = children[0].meta.logo;
2432
+ } else if (mode === BLOCKLET_MODES.DEVELOPMENT && isGatewayBlocklet(component.meta)) {
2433
+ meta.logo = component.meta.logo;
2420
2434
  }
2421
2435
 
2422
2436
  await validateBlocklet({ meta, children });
@@ -2442,6 +2456,11 @@ class DiskBlockletManager extends BaseBlockletManager {
2442
2456
  params.deployedFrom = containerSourceUrl;
2443
2457
  }
2444
2458
 
2459
+ if (mode === BLOCKLET_MODES.DEVELOPMENT && isGatewayBlocklet(component.meta)) {
2460
+ params.source = BlockletSource.local;
2461
+ params.deployedFrom = folder;
2462
+ }
2463
+
2445
2464
  const blocklet = await states.blocklet.addBlocklet(params);
2446
2465
 
2447
2466
  // set chain type
@@ -2997,6 +3016,10 @@ class DiskBlockletManager extends BaseBlockletManager {
2997
3016
  }
2998
3017
 
2999
3018
  async _createNotification(did, notification) {
3019
+ if (isCLI()) {
3020
+ return;
3021
+ }
3022
+
3000
3023
  try {
3001
3024
  const extra = await states.blockletExtras.getMeta(did);
3002
3025
  const isExternal = !!extra?.controller;
@@ -3468,14 +3491,16 @@ class FederatedBlockletManager extends DiskBlockletManager {
3468
3491
  const blocklet = await this.getBlocklet(did);
3469
3492
  const nodeInfo = await states.node.read();
3470
3493
  const blockletInfo = getBlockletInfo(blocklet, nodeInfo.sk);
3494
+ const domainAliases = await this.getDomainAliases(blocklet);
3471
3495
  const { permanentWallet } = blockletInfo;
3472
3496
  const memberSite = {
3473
3497
  appId: blocklet.appDid,
3474
3498
  appPid: blocklet.appPid,
3475
- aliasDid: (blocklet.migratedFrom || []).map((item) => item.appDid),
3499
+ aliasDid: (blocklet.migratedFrom || []).map((x) => x.appDid),
3476
3500
  appName: blockletInfo.name,
3477
3501
  appDescription: blockletInfo.description,
3478
3502
  appUrl: blockletInfo.appUrl,
3503
+ aliasDomain: domainAliases.map((x) => x.value),
3479
3504
  appLogo:
3480
3505
  blocklet.environmentObj.BLOCKLET_APP_LOGO ||
3481
3506
  normalizePathPrefix(`${WELLKNOWN_SERVICE_PATH_PREFIX}/blocklet/logo`) ||
@@ -3689,16 +3714,22 @@ class FederatedBlockletManager extends DiskBlockletManager {
3689
3714
  const waitingList = federated.sites
3690
3715
  .filter((item) => item.appId !== federated.config.appId)
3691
3716
  .map((item) => {
3692
- return limitSync(() =>
3693
- pRetry(
3694
- () =>
3695
- request.post(`${item.appUrl}/${WELLKNOWN_SERVICE_PATH_PREFIX}/api/federated/sync`, {
3696
- signer: permanentWallet.address,
3697
- data: signV2(permanentWallet.address, permanentWallet.secretKey, { sites: federated.sites }),
3698
- }),
3699
- { retries: 3 }
3700
- )
3701
- );
3717
+ return limitSync(async () => {
3718
+ const url = `${item.appUrl}/${WELLKNOWN_SERVICE_PATH_PREFIX}/api/federated/sync`;
3719
+ try {
3720
+ // NOTICE: 即使通知某个 member 失败了,也不影响其他 member 接收同步结果
3721
+ await pRetry(
3722
+ () =>
3723
+ request.post(url, {
3724
+ signer: permanentWallet.address,
3725
+ data: signV2(permanentWallet.address, permanentWallet.secretKey, { sites: federated.sites }),
3726
+ }),
3727
+ { retries: 3 }
3728
+ );
3729
+ } catch (error) {
3730
+ logger.warn('Failed to sync federated sites', { error, did, url, action: 'audit' });
3731
+ }
3732
+ });
3702
3733
  });
3703
3734
  await Promise.all(waitingList);
3704
3735
  return newState;
@@ -37,6 +37,7 @@ const installApplicationFromDev = async ({ folder, meta, states, manager } = {})
37
37
  name,
38
38
  did,
39
39
  mode: BLOCKLET_MODES.DEVELOPMENT,
40
+ folder,
40
41
  });
41
42
  logger.info('add blocklet for dev', { did, version, meta });
42
43
 
@@ -1,7 +1,7 @@
1
1
  const logger = require('@abtnode/logger')('@abtnode/core:install-component-dev');
2
2
 
3
3
  const { BlockletStatus, BlockletSource, BLOCKLET_MODES, fromBlockletStatus } = require('@blocklet/constant');
4
- const { isInProgress } = require('@blocklet/meta/lib/util');
4
+ const { isInProgress, isGatewayBlocklet } = require('@blocklet/meta/lib/util');
5
5
  const {
6
6
  parseComponents,
7
7
  filterDuplicateComponents,
@@ -59,7 +59,15 @@ const installComponentFromDev = async ({ folder, meta, rootDid, mountPoint, mana
59
59
  existRoot.children.filter((x) => x.meta.did !== component.meta.did)
60
60
  );
61
61
  }
62
- children.unshift(component);
62
+
63
+ if (!isGatewayBlocklet(meta)) {
64
+ children.unshift(component);
65
+ }
66
+
67
+ if (children.length <= 0) {
68
+ return manager.getBlocklet(rootDid);
69
+ }
70
+
63
71
  checkVersionCompatibility([...children, ...existRoot.children]);
64
72
 
65
73
  const componentDids = children.map((x) => x.meta.did);
package/lib/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
+ const get = require('lodash/get');
3
4
  const uniq = require('lodash/uniq');
4
5
  const md5 = require('@abtnode/util/lib/md5');
5
6
  const formatContext = require('@abtnode/util/lib/format-context');
@@ -206,10 +207,9 @@ function ABTNode(options) {
206
207
  deleteRoutingRule,
207
208
  addDomainAlias,
208
209
  deleteDomainAlias,
209
- getRouterCapabilities,
210
210
  } = getRouterHelpers({ dataDirs, routingSnapshot, routerManager, blockletManager, certManager });
211
211
 
212
- const nodeAPI = new NodeAPI(states, options.nodeDid, getRouterCapabilities);
212
+ const nodeAPI = new NodeAPI(states, options.nodeDid);
213
213
  const teamAPI = new TeamAPI({ states, teamManager, dataDirs });
214
214
 
215
215
  blockletManager.resetSiteByDid = resetSiteByDid;
@@ -254,6 +254,7 @@ function ABTNode(options) {
254
254
  checkComponentsForUpdates: blockletManager.checkComponentsForUpdates.bind(blockletManager),
255
255
  upgradeComponents: blockletManager.upgradeComponents.bind(blockletManager),
256
256
  getBlockletForLauncher: blockletManager.getBlockletForLauncher.bind(blockletManager),
257
+ getBlockletDomainAliases: blockletManager.getDomainAliases.bind(blockletManager),
257
258
  resetBlocklet: blockletManager.reset.bind(blockletManager),
258
259
  deleteBlockletProcess: blockletManager.deleteProcess.bind(blockletManager),
259
260
  configPublicToStore: blockletManager.configPublicToStore.bind(blockletManager),
@@ -529,7 +530,7 @@ function ABTNode(options) {
529
530
  LogRotator.getCron(),
530
531
  ...getStateCrons(states),
531
532
  ...nodeAPI.getCrons(),
532
- ],
533
+ ].filter((x) => options.daemon || (options.service && get(x, 'options.runInService'))),
533
534
  onError: (error, name) => {
534
535
  states.notification.create({
535
536
  title: 'Run job failed',
@@ -556,8 +557,8 @@ function ABTNode(options) {
556
557
  .catch(console.error);
557
558
  };
558
559
 
559
- if (options.daemon) {
560
- onStatesReady(() => {
560
+ onStatesReady(() => {
561
+ if (options.daemon) {
561
562
  // start cert manager
562
563
  certManager
563
564
  .start()
@@ -575,8 +576,8 @@ function ABTNode(options) {
575
576
  logger.info('Cron jobs start successfully on daemon start');
576
577
  }
577
578
  }, 1000);
578
- });
579
- }
579
+ }
580
+ });
580
581
 
581
582
  events.on(EVENTS.NODE_STOPPED, () => {
582
583
  pm2Events.pause();
@@ -7,7 +7,6 @@ const UUID = require('uuid');
7
7
  const dayjs = require('@abtnode/util/lib/dayjs');
8
8
  const isUrl = require('is-url');
9
9
  const get = require('lodash/get');
10
- const pick = require('lodash/pick');
11
10
  const cloneDeep = require('lodash/cloneDeep');
12
11
  const groupBy = require('lodash/groupBy');
13
12
  const isEqual = require('lodash/isEqual');
@@ -1282,16 +1281,6 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1282
1281
  }
1283
1282
  };
1284
1283
 
1285
- const getRouterCapabilities = (info) => {
1286
- const providerName = get(info, 'routing.provider', null);
1287
-
1288
- if (providerName && providers[providerName]) {
1289
- return pick(providers[providerName].capabilities || {}, ['httpImageFilter']);
1290
- }
1291
-
1292
- return {};
1293
- };
1294
-
1295
1284
  const analyzeRouterLog = async () => {
1296
1285
  const info = await nodeState.read();
1297
1286
  const sites = await getRoutingSites({});
@@ -1602,7 +1591,6 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1602
1591
  deleteDomainAlias,
1603
1592
 
1604
1593
  isGatewayCacheEnabled,
1605
- getRouterCapabilities,
1606
1594
  };
1607
1595
  };
1608
1596
 
@@ -96,7 +96,6 @@ class Router {
96
96
  }
97
97
 
98
98
  this.provider = provider;
99
- this.capabilities = provider.capabilities;
100
99
  this.getRoutingParams = getRoutingParams;
101
100
  this.routingTable = [];
102
101
  }
@@ -12,8 +12,8 @@ const timeout = process.env.NODE_ENV === 'test' ? 500 : 5000;
12
12
 
13
13
  // check if node dashboard https endpoint return 2xx
14
14
  // FIXME: check connected by wellknown endpoint
15
- const checkConnected = async ({ ip, nodeInfo }) => {
16
- const { adminPath = WELLKNOWN_SERVER_ADMIN_PATH } = nodeInfo.routing || {};
15
+ const checkConnected = async ({ ip, info }) => {
16
+ const { adminPath = WELLKNOWN_SERVER_ADMIN_PATH } = info.routing || {};
17
17
  const origin = `https://${getNodeDomain(ip)}`;
18
18
  const endpoint = joinUrl(origin, adminPath);
19
19
  await axios.get(endpoint, { timeout });
@@ -22,25 +22,32 @@ const checkConnected = async ({ ip, nodeInfo }) => {
22
22
  /**
23
23
  * Get accessible external ip of abtnode
24
24
  */
25
- const fetch = async (nodeInfo) => {
26
- const { external } = await getIp();
25
+ const fetch = async (info) => {
26
+ const { external, internal } = await getIp();
27
27
  logger.info('refresh external ip:', external);
28
28
 
29
- if (!external) {
30
- return null;
31
- }
32
-
33
- if (cache === external) {
29
+ if ([external, internal].includes(cache)) {
34
30
  return cache;
35
31
  }
36
32
 
33
+ // prefer external ip
37
34
  try {
38
- await checkConnected({ ip: external, nodeInfo });
35
+ await checkConnected({ ip: external, info });
39
36
  cache = external;
40
37
  } catch {
41
38
  cache = null;
42
39
  }
43
40
 
41
+ // fallback to internal ip
42
+ if (!cache) {
43
+ try {
44
+ await checkConnected({ ip: internal, info });
45
+ cache = external;
46
+ } catch {
47
+ cache = null;
48
+ }
49
+ }
50
+
44
51
  return cache;
45
52
  };
46
53
 
@@ -6,8 +6,8 @@ const getIpDnsDomainForBlocklet = (blocklet) => {
6
6
  return `${encodeBase32(blocklet.meta.did)}-${SLOT_FOR_IP_DNS_SITE}.${DEFAULT_IP_DOMAIN_SUFFIX}`;
7
7
  };
8
8
 
9
- const getDidDomainForBlocklet = ({ appPid, didDomain }) => {
10
- return `${encodeBase32(appPid)}.${didDomain || DEFAULT_DID_DOMAIN}`;
9
+ const getDidDomainForBlocklet = ({ appPid, didDomain = DEFAULT_DID_DOMAIN }) => {
10
+ return `${encodeBase32(appPid)}.${didDomain}`;
11
11
  };
12
12
 
13
13
  module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet, formatName };
package/lib/util/ip.js CHANGED
@@ -20,6 +20,7 @@ const cron = {
20
20
  name: 'refetch-ip',
21
21
  time: '0 */30 * * * *', // refetch every 30 minutes
22
22
  fn: fetch,
23
+ options: { runOnInit: true, runInService: true },
23
24
  };
24
25
 
25
26
  module.exports.fetch = fetch;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.14-beta-c2843ec5",
6
+ "version": "1.16.14-beta-be739405",
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.14-beta-c2843ec5",
23
- "@abtnode/auth": "1.16.14-beta-c2843ec5",
24
- "@abtnode/certificate-manager": "1.16.14-beta-c2843ec5",
25
- "@abtnode/constant": "1.16.14-beta-c2843ec5",
26
- "@abtnode/cron": "1.16.14-beta-c2843ec5",
27
- "@abtnode/logger": "1.16.14-beta-c2843ec5",
28
- "@abtnode/models": "1.16.14-beta-c2843ec5",
29
- "@abtnode/queue": "1.16.14-beta-c2843ec5",
30
- "@abtnode/rbac": "1.16.14-beta-c2843ec5",
31
- "@abtnode/router-provider": "1.16.14-beta-c2843ec5",
32
- "@abtnode/static-server": "1.16.14-beta-c2843ec5",
33
- "@abtnode/timemachine": "1.16.14-beta-c2843ec5",
34
- "@abtnode/util": "1.16.14-beta-c2843ec5",
22
+ "@abtnode/analytics": "1.16.14-beta-be739405",
23
+ "@abtnode/auth": "1.16.14-beta-be739405",
24
+ "@abtnode/certificate-manager": "1.16.14-beta-be739405",
25
+ "@abtnode/constant": "1.16.14-beta-be739405",
26
+ "@abtnode/cron": "1.16.14-beta-be739405",
27
+ "@abtnode/logger": "1.16.14-beta-be739405",
28
+ "@abtnode/models": "1.16.14-beta-be739405",
29
+ "@abtnode/queue": "1.16.14-beta-be739405",
30
+ "@abtnode/rbac": "1.16.14-beta-be739405",
31
+ "@abtnode/router-provider": "1.16.14-beta-be739405",
32
+ "@abtnode/static-server": "1.16.14-beta-be739405",
33
+ "@abtnode/timemachine": "1.16.14-beta-be739405",
34
+ "@abtnode/util": "1.16.14-beta-be739405",
35
35
  "@arcblock/did": "1.18.87",
36
36
  "@arcblock/did-auth": "1.18.87",
37
37
  "@arcblock/did-ext": "^1.18.87",
@@ -42,10 +42,10 @@
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
43
  "@arcblock/validator": "^1.18.87",
44
44
  "@arcblock/vc": "1.18.87",
45
- "@blocklet/constant": "1.16.14-beta-c2843ec5",
46
- "@blocklet/meta": "1.16.14-beta-c2843ec5",
47
- "@blocklet/resolver": "1.16.14-beta-c2843ec5",
48
- "@blocklet/sdk": "1.16.14-beta-c2843ec5",
45
+ "@blocklet/constant": "1.16.14-beta-be739405",
46
+ "@blocklet/meta": "1.16.14-beta-be739405",
47
+ "@blocklet/resolver": "1.16.14-beta-be739405",
48
+ "@blocklet/sdk": "1.16.14-beta-be739405",
49
49
  "@did-space/client": "^0.2.141",
50
50
  "@fidm/x509": "^1.2.1",
51
51
  "@ocap/mcrypto": "1.18.87",
@@ -99,5 +99,5 @@
99
99
  "jest": "^27.5.1",
100
100
  "unzipper": "^0.10.11"
101
101
  },
102
- "gitHead": "968bfad93779a21dd1374eede3ac7d4d6d40822b"
102
+ "gitHead": "4a7be8e8a321f8be5b172c10c09c32af216a1c73"
103
103
  }