@abtnode/core 1.16.14-beta-08abf537 → 1.16.14-beta-9743e8e2

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.
@@ -12,7 +12,6 @@ const pick = require('lodash/pick');
12
12
  const isEmpty = require('lodash/isEmpty');
13
13
  const cloneDeep = require('lodash/cloneDeep');
14
14
  const { isNFTExpired, getNftExpirationDate } = require('@abtnode/util/lib/nft');
15
- const didDocument = require('@abtnode/util/lib/did-document');
16
15
  const { sign } = require('@arcblock/jwt');
17
16
  const sleep = require('@abtnode/util/lib/sleep');
18
17
  const getBlockletInfo = require('@blocklet/meta/lib/info');
@@ -118,7 +117,6 @@ const {
118
117
  validateStore,
119
118
  isRotatingAppSk,
120
119
  checkVersionCompatibility,
121
- getBlockletKnownAs,
122
120
  updateBlockletFallbackLogo,
123
121
  ensureAppLogo,
124
122
  getBlockletDidDomainList,
@@ -128,6 +126,7 @@ const {
128
126
  exceedRedemptionPeriod,
129
127
  ensureAppPortsNotOccupied,
130
128
  getComponentNamesWithVersion,
129
+ updateDidDocument: updateBlockletDocument,
131
130
  } = require('../../util/blocklet');
132
131
  const { getDidDomainForBlocklet } = require('../../util/get-domain-for-blocklet');
133
132
  const states = require('../../states');
@@ -1624,8 +1623,10 @@ class DiskBlockletManager extends BaseBlockletManager {
1624
1623
  }
1625
1624
  }
1626
1625
 
1627
- getCrons() {
1628
- return [
1626
+ async getCrons() {
1627
+ const info = await states.node.read();
1628
+
1629
+ const crons = [
1629
1630
  {
1630
1631
  name: 'sync-blocklet-status',
1631
1632
  time: '*/60 * * * * *', // 60s
@@ -1646,30 +1647,41 @@ class DiskBlockletManager extends BaseBlockletManager {
1646
1647
  await refreshAccessibleExternalNodeIp(nodeInfo);
1647
1648
  },
1648
1649
  },
1649
- {
1650
- name: 'check-renewed-blocklet',
1651
- time: '0 */10 * * * *', // 10min
1652
- options: { runOnInit: false },
1653
- fn: () => this.checkRenewedBlocklet(),
1654
- },
1655
- {
1656
- name: 'stop-expired-external-blocklet',
1657
- time: '0 */30 * * * *', // 30min
1658
- options: { runOnInit: false },
1659
- fn: () => this.stopExpiredBlocklets(),
1660
- },
1661
- {
1662
- name: 'clean-expired-blocklet-data',
1663
- time: '0 */20 0 * * *', // 每天凌晨 0 点的每 20 分钟
1664
- options: { runOnInit: false },
1665
- fn: () => this.cleanExpiredBlocklets(),
1666
- },
1667
1650
  {
1668
1651
  name: 'record-blocklet-runtime-history',
1669
1652
  time: `*/${MONITOR_RECORD_INTERVAL_SEC} * * * * *`, // 10s
1670
1653
  fn: () => this.runtimeMonitor.monitAll(),
1671
1654
  },
1672
1655
  ];
1656
+
1657
+ if (info.mode === NODE_MODES.SERVERLESS) {
1658
+ const serverlessJobs = [
1659
+ {
1660
+ name: 'check-renewed-blocklet',
1661
+ time: '0 */10 * * * *', // 10min
1662
+ options: { runOnInit: false },
1663
+ fn: () => this.checkRenewedBlocklet(),
1664
+ },
1665
+ {
1666
+ name: 'stop-expired-external-blocklet',
1667
+ time: '0 */30 * * * *', // 30min
1668
+ options: { runOnInit: false },
1669
+ fn: () => this.stopExpiredBlocklets(),
1670
+ },
1671
+ {
1672
+ name: 'clean-expired-blocklet-data',
1673
+ time: '0 */20 0 * * *', // 每天凌晨 0 点的每 20 分钟
1674
+ options: { runOnInit: false },
1675
+ fn: () => this.cleanExpiredBlocklets(),
1676
+ },
1677
+ ];
1678
+
1679
+ logger.info('enable serverless jobs', serverlessJobs.map((x) => x.name).join(','));
1680
+
1681
+ crons.push(...serverlessJobs);
1682
+ }
1683
+
1684
+ return crons;
1673
1685
  }
1674
1686
 
1675
1687
  /**
@@ -3035,7 +3047,7 @@ class DiskBlockletManager extends BaseBlockletManager {
3035
3047
  const urls = blocklet.site?.domainAliases || [];
3036
3048
  const customUrl = urls.find((x) => !x.isProtected)?.value;
3037
3049
  blockletUrl = `http://${
3038
- customUrl || getDidDomainForBlocklet({ appPid: blocklet.appPid })
3050
+ customUrl || getDidDomainForBlocklet({ did: blocklet.appPid })
3039
3051
  }${WELLKNOWN_BLOCKLET_ADMIN_PATH}`;
3040
3052
  }
3041
3053
  } catch (error) {
@@ -3237,15 +3249,9 @@ class DiskBlockletManager extends BaseBlockletManager {
3237
3249
 
3238
3250
  this.emit(BlockletEvents.appDidChanged, blocklet);
3239
3251
 
3240
- const { wallet } = getBlockletInfo(blocklet, nodeInfo.sk);
3241
- const alsoKnownAs = getBlockletKnownAs(blocklet);
3242
- await didDocument.updateBlockletDocument({
3243
- wallet,
3244
- appPid: blocklet.appPid,
3245
- alsoKnownAs,
3246
- daemonDidDomain: util.getServerDidDomain(nodeInfo),
3247
- didRegistryUrl: nodeInfo.didRegistry,
3248
- domain: nodeInfo.didDomain,
3252
+ await updateBlockletDocument({
3253
+ blocklet,
3254
+ nodeInfo,
3249
3255
  });
3250
3256
  logger.info('updated blocklet dns document', { appPid: blocklet.appPid, appDid: blocklet.appDid });
3251
3257
  }
package/lib/index.js CHANGED
@@ -518,14 +518,14 @@ function ABTNode(options) {
518
518
 
519
519
  const webhook = WebHook({ events, dataDirs, instance });
520
520
 
521
- const initCron = () => {
521
+ const initCron = async () => {
522
522
  Cron.init({
523
523
  context: { states, events, webhook },
524
524
  jobs: [
525
525
  IP.cron,
526
526
  VersionChecker.getCron(),
527
527
  ...getRoutingCrons(),
528
- ...blockletManager.getCrons(),
528
+ ...(await blockletManager.getCrons()),
529
529
  DiskMonitor.getCron(),
530
530
  LogRotator.getCron(),
531
531
  ...getStateCrons(states),
@@ -566,12 +566,12 @@ function ABTNode(options) {
566
566
  .catch((error) => logger.error('Certificate manager service start failed', { error }));
567
567
 
568
568
  // start jobs
569
- setTimeout(() => {
569
+ setTimeout(async () => {
570
570
  if (process.env.NODE_ENV === 'development') {
571
- initCron();
571
+ await initCron();
572
572
  } else {
573
573
  pm2Events.resume();
574
- initCron();
574
+ await initCron();
575
575
  createCLILog('startServer');
576
576
  logger.info('Cron jobs start successfully on daemon start');
577
577
  }
@@ -16,8 +16,6 @@ const { getProvider } = require('@abtnode/router-provider');
16
16
  const normalizePathPrefix = require('@abtnode/util/lib/normalize-path-prefix');
17
17
  const getTmpDir = require('@abtnode/util/lib/get-tmp-directory');
18
18
  const downloadFile = require('@abtnode/util/lib/download-file');
19
- const { updateBlockletDocument } = require('@abtnode/util/lib/did-document');
20
- const getBlockletInfo = require('@blocklet/meta/lib/info');
21
19
  const { forEachBlockletSync } = require('@blocklet/meta/lib/util');
22
20
  const { processLogByDate } = require('@abtnode/analytics');
23
21
  const {
@@ -73,7 +71,7 @@ const { getFromCache: getAccessibleExternalNodeIp } = require('../util/get-acces
73
71
  const Router = require('./index');
74
72
  const states = require('../states');
75
73
  const { getBlockletDomainGroupName, getDidFromDomainGroupName } = require('../util/router');
76
- const { getBlockletKnownAs, getBlockletDidDomainList } = require('../util/blocklet');
74
+ const { getBlockletDidDomainList, updateDidDocument: updateBlockletDocument } = require('../util/blocklet');
77
75
  const { toCamelCase } = require('../util/index');
78
76
  const { get: getIp } = require('../util/ip');
79
77
 
@@ -983,14 +981,9 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
983
981
  };
984
982
 
985
983
  const existSite = await states.site.findOne({ domain: domainGroup });
986
- const { wallet } = getBlockletInfo(blocklet, nodeInfo.sk);
987
984
  updateBlockletDocument({
988
- wallet,
989
- appPid: blocklet.appPid,
990
- alsoKnownAs: getBlockletKnownAs(blocklet),
991
- daemonDidDomain: getServerDidDomain(nodeInfo),
992
- didRegistryUrl: nodeInfo.didRegistry,
993
- domain: nodeInfo.didDomain,
985
+ blocklet,
986
+ nodeInfo,
994
987
  })
995
988
  .then(() => {
996
989
  logger.info(`updated blocklet ${blocklet.appDid} dns`);
@@ -83,6 +83,7 @@ class NodeState extends BaseState {
83
83
  launcher,
84
84
  didRegistry,
85
85
  didDomain,
86
+ slpDomain,
86
87
  enablePassportIssuance = true,
87
88
  trustedPassports = [],
88
89
  webWalletUrl,
@@ -119,6 +120,7 @@ class NodeState extends BaseState {
119
120
  launcher: launcher || null,
120
121
  didRegistry,
121
122
  didDomain,
123
+ slpDomain,
122
124
  enablePassportIssuance,
123
125
  trustedPassports,
124
126
  customBlockletNumber: 0,
@@ -19,8 +19,8 @@ const isUrl = require('is-url');
19
19
  const semver = require('semver');
20
20
  const { chainInfo: chainInfoSchema } = require('@arcblock/did-auth/lib/schema');
21
21
 
22
- const { fromSecretKey } = require('@ocap/wallet');
23
- const { toHex, isHex, toDid, toAddress } = require('@ocap/util');
22
+ const { fromSecretKey, fromPublicKey } = require('@ocap/wallet');
23
+ const { toHex, isHex, toDid, toAddress, toBuffer } = require('@ocap/util');
24
24
  const { isValid: isValidDid, isEthereumDid } = require('@arcblock/did');
25
25
  const logger = require('@abtnode/logger')('@abtnode/core:util:blocklet');
26
26
  const pm2 = require('@abtnode/util/lib/async-pm2');
@@ -32,6 +32,7 @@ const CustomError = require('@abtnode/util/lib/custom-error');
32
32
  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
+ const didDocument = require('@abtnode/util/lib/did-document');
35
36
  const {
36
37
  BLOCKLET_MAX_MEM_LIMIT_IN_MB,
37
38
  BLOCKLET_STORE,
@@ -39,6 +40,7 @@ const {
39
40
  BLOCKLET_STORE_DEV,
40
41
  APP_STRUCT_VERSION,
41
42
  EXPIRED_BLOCKLET_DATA_RETENTION_DAYS,
43
+ NODE_MODES,
42
44
  } = require('@abtnode/constant');
43
45
  const {
44
46
  parseComponents,
@@ -94,15 +96,13 @@ const {
94
96
  const { titleSchema, descriptionSchema, logoSchema } = require('@blocklet/meta/lib/schema');
95
97
  const { getBlockletMetaFromUrl } = require('@blocklet/meta/lib/util-meta');
96
98
  const getComponentProcessId = require('@blocklet/meta/lib/get-component-process-id');
99
+ const md5 = require('@abtnode/util/lib/md5');
97
100
 
98
101
  const { validate: validateEngine, get: getEngine } = require('../blocklet/manager/engine');
99
102
 
100
103
  const isRequirementsSatisfied = require('./requirement');
101
104
  const { getDidDomainForBlocklet } = require('./get-domain-for-blocklet');
102
- const { expandBundle, findInterfacePortByName, prettyURL, templateReplace } = require('./index');
103
- const externalIpUtil = require('./get-accessible-external-node-ip');
104
- const { getIpDnsDomainForBlocklet } = require('./get-domain-for-blocklet');
105
- const { replaceDomainSlot } = require('./index');
105
+ const { expandBundle, findInterfacePortByName, prettyURL, templateReplace, getServerDidDomain } = require('./index');
106
106
 
107
107
  /**
108
108
  * get blocklet engine info, default is node
@@ -296,7 +296,7 @@ const getAppSystemEnvironments = (blocklet, nodeInfo) => {
296
296
  * 2. 如果没有,再拼接
297
297
  */
298
298
 
299
- const pidDomain = getDidDomainForBlocklet({ appPid, didDomain: nodeInfo.didDomain });
299
+ const pidDomain = getDidDomainForBlocklet({ did: appPid, didDomain: nodeInfo.didDomain });
300
300
  const domainAliases = get(blocklet, 'site.domainAliases') || [];
301
301
 
302
302
  let didDomain = domainAliases.find((item) => toLower(item.value) === toLower(pidDomain));
@@ -1346,19 +1346,12 @@ const getConfigFromPreferences = (blocklet) => {
1346
1346
  return result;
1347
1347
  };
1348
1348
 
1349
- const getBlockletURLForLauncher = async ({ blocklet, nodeInfo }) => {
1350
- let nodeIp = await externalIpUtil.getFromCache();
1351
- if (process.env.ABT_NODE_HOST) {
1352
- // 开发调试用
1353
- nodeIp = process.env.ABT_NODE_HOST;
1354
- }
1355
-
1356
- if (nodeIp) {
1357
- const ipEchoDomain = getIpDnsDomainForBlocklet(blocklet);
1358
- return `https://${replaceDomainSlot({ domain: ipEchoDomain, nodeIp })}`;
1359
- }
1349
+ const getBlockletURLForLauncher = ({ blocklet, nodeInfo }) => {
1350
+ const didDomain = getDidDomainForBlocklet({
1351
+ did: getSlpDid(nodeInfo.did, blocklet.appPid),
1352
+ didDomain: nodeInfo.slpDomain,
1353
+ });
1360
1354
 
1361
- const didDomain = getDidDomainForBlocklet({ appPid: blocklet.appPid, didDomain: nodeInfo.didDomain });
1362
1355
  return `https://${didDomain}`;
1363
1356
  };
1364
1357
  const createDataArchive = (dataDir, fileName) => {
@@ -1692,11 +1685,19 @@ const getBlockletDidDomainList = (blocklet, nodeInfo) => {
1692
1685
  const dids = [blocklet.appPid, blocklet.appDid, ...alsoKnownAs].filter(Boolean).map((did) => toAddress(did));
1693
1686
 
1694
1687
  uniq(dids).forEach((did) => {
1695
- const domain = getDidDomainForBlocklet({ appPid: did, didDomain: nodeInfo.didDomain });
1688
+ const domain = getDidDomainForBlocklet({ did, didDomain: nodeInfo.didDomain });
1696
1689
 
1697
1690
  domainAliases.push({ value: domain, isProtected: true });
1698
1691
  });
1699
1692
 
1693
+ const enableSlpDomain = shouldEnableSlpDomain({ mode: nodeInfo.mode, launcher: nodeInfo.launcher, blocklet });
1694
+ if (enableSlpDomain) {
1695
+ const slpDid = getSlpDid(nodeInfo.did, blocklet.appPid);
1696
+ const domain = getDidDomainForBlocklet({ did: slpDid, didDomain: nodeInfo.slpDomain });
1697
+
1698
+ domainAliases.push({ value: domain, isProtected: true });
1699
+ }
1700
+
1700
1701
  return domainAliases;
1701
1702
  };
1702
1703
 
@@ -1821,6 +1822,54 @@ const getComponentNamesWithVersion = (app = {}, componentDids = []) => {
1821
1822
  return str;
1822
1823
  };
1823
1824
 
1825
+ const shouldEnableSlpDomain = ({ mode, launcher, blocklet }) => {
1826
+ if (process.env.NODE_ENV === 'development' && process.env.ABT_NODE_ENABLE_SLP_DOMAIN === 'true') {
1827
+ return true;
1828
+ }
1829
+
1830
+ return mode === NODE_MODES.SERVERLESS && !!launcher && !!blocklet.controller;
1831
+ };
1832
+
1833
+ const getSlpDid = (serverDid, appPid) => {
1834
+ if (!serverDid || !appPid) {
1835
+ throw new Error('serverDid and appPid is required');
1836
+ }
1837
+
1838
+ const buffer = Buffer.concat([toBuffer(serverDid), toBuffer(appPid)]);
1839
+ const md5Str = md5(buffer);
1840
+
1841
+ const wallet = fromPublicKey(md5Str);
1842
+ return wallet.address;
1843
+ };
1844
+
1845
+ // eslint-disable-next-line require-await
1846
+ const updateDidDocument = async ({ blocklet, nodeInfo }) => {
1847
+ const alsoKnownAs = getBlockletKnownAs(blocklet);
1848
+ const { wallet } = getBlockletInfo(blocklet, nodeInfo.sk);
1849
+ const { mode, launcher, did: serverDid } = nodeInfo;
1850
+
1851
+ let slpDid = null;
1852
+ const enableSlpDomain = shouldEnableSlpDomain({ mode, launcher, blocklet });
1853
+ if (enableSlpDomain) {
1854
+ slpDid = getSlpDid(serverDid, blocklet.appPid);
1855
+
1856
+ if (alsoKnownAs.indexOf(slpDid) === -1) {
1857
+ alsoKnownAs.push(toDid(slpDid));
1858
+ }
1859
+ }
1860
+
1861
+ return didDocument.updateBlockletDocument({
1862
+ blocklet,
1863
+ wallet,
1864
+ alsoKnownAs,
1865
+ slpDid,
1866
+ daemonDidDomain: getServerDidDomain(nodeInfo),
1867
+ didRegistryUrl: nodeInfo.didRegistry,
1868
+ domain: nodeInfo.didDomain,
1869
+ slpDomain: nodeInfo.slpDomain,
1870
+ });
1871
+ };
1872
+
1824
1873
  module.exports = {
1825
1874
  updateBlockletFallbackLogo,
1826
1875
  forEachBlocklet,
@@ -1884,4 +1933,7 @@ module.exports = {
1884
1933
  exceedRedemptionPeriod,
1885
1934
  ensureAppPortsNotOccupied,
1886
1935
  getComponentNamesWithVersion,
1936
+ updateDidDocument,
1937
+ getSlpDid,
1938
+ shouldEnableSlpDomain,
1887
1939
  };
@@ -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 = DEFAULT_DID_DOMAIN }) => {
10
- return `${encodeBase32(appPid)}.${didDomain}`;
9
+ const getDidDomainForBlocklet = ({ did, didDomain = DEFAULT_DID_DOMAIN }) => {
10
+ return `${encodeBase32(did)}.${didDomain}`;
11
11
  };
12
12
 
13
13
  module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet, formatName };
@@ -60,7 +60,9 @@ const consumeServerlessNFT = async ({ nftId, blocklet }) => {
60
60
  const consumeLauncherSession = async ({ params, blocklet }) => {
61
61
  try {
62
62
  const info = await states.node.read();
63
- const { appUrl, name } = getBlockletInfo(blocklet, info.sk);
63
+ const { name } = getBlockletInfo(blocklet, info.sk);
64
+ const appUrl = getBlockletURLForLauncher({ blocklet, nodeInfo: info });
65
+
64
66
  const result = await doRequest(info.sk, {
65
67
  launcherUrl: params.launcherUrl,
66
68
  pathname: `/api/launches/${params.launcherSessionId}/installed`,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.14-beta-08abf537",
6
+ "version": "1.16.14-beta-9743e8e2",
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-08abf537",
23
- "@abtnode/auth": "1.16.14-beta-08abf537",
24
- "@abtnode/certificate-manager": "1.16.14-beta-08abf537",
25
- "@abtnode/constant": "1.16.14-beta-08abf537",
26
- "@abtnode/cron": "1.16.14-beta-08abf537",
27
- "@abtnode/logger": "1.16.14-beta-08abf537",
28
- "@abtnode/models": "1.16.14-beta-08abf537",
29
- "@abtnode/queue": "1.16.14-beta-08abf537",
30
- "@abtnode/rbac": "1.16.14-beta-08abf537",
31
- "@abtnode/router-provider": "1.16.14-beta-08abf537",
32
- "@abtnode/static-server": "1.16.14-beta-08abf537",
33
- "@abtnode/timemachine": "1.16.14-beta-08abf537",
34
- "@abtnode/util": "1.16.14-beta-08abf537",
22
+ "@abtnode/analytics": "1.16.14-beta-9743e8e2",
23
+ "@abtnode/auth": "1.16.14-beta-9743e8e2",
24
+ "@abtnode/certificate-manager": "1.16.14-beta-9743e8e2",
25
+ "@abtnode/constant": "1.16.14-beta-9743e8e2",
26
+ "@abtnode/cron": "1.16.14-beta-9743e8e2",
27
+ "@abtnode/logger": "1.16.14-beta-9743e8e2",
28
+ "@abtnode/models": "1.16.14-beta-9743e8e2",
29
+ "@abtnode/queue": "1.16.14-beta-9743e8e2",
30
+ "@abtnode/rbac": "1.16.14-beta-9743e8e2",
31
+ "@abtnode/router-provider": "1.16.14-beta-9743e8e2",
32
+ "@abtnode/static-server": "1.16.14-beta-9743e8e2",
33
+ "@abtnode/timemachine": "1.16.14-beta-9743e8e2",
34
+ "@abtnode/util": "1.16.14-beta-9743e8e2",
35
35
  "@arcblock/did": "1.18.88",
36
36
  "@arcblock/did-auth": "1.18.88",
37
37
  "@arcblock/did-ext": "^1.18.88",
@@ -42,10 +42,10 @@
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
43
  "@arcblock/validator": "^1.18.88",
44
44
  "@arcblock/vc": "1.18.88",
45
- "@blocklet/constant": "1.16.14-beta-08abf537",
46
- "@blocklet/meta": "1.16.14-beta-08abf537",
47
- "@blocklet/resolver": "1.16.14-beta-08abf537",
48
- "@blocklet/sdk": "1.16.14-beta-08abf537",
45
+ "@blocklet/constant": "1.16.14-beta-9743e8e2",
46
+ "@blocklet/meta": "1.16.14-beta-9743e8e2",
47
+ "@blocklet/resolver": "1.16.14-beta-9743e8e2",
48
+ "@blocklet/sdk": "1.16.14-beta-9743e8e2",
49
49
  "@did-space/client": "^0.2.141",
50
50
  "@fidm/x509": "^1.2.1",
51
51
  "@ocap/mcrypto": "1.18.88",
@@ -98,5 +98,5 @@
98
98
  "jest": "^27.5.1",
99
99
  "unzipper": "^0.10.11"
100
100
  },
101
- "gitHead": "656c4bf8e2ca94cdc604a5d45ba7e8c3443f1dac"
101
+ "gitHead": "8c98d12062bfe1ea2d4faff920e4dd99436bea1f"
102
102
  }