@abtnode/core 1.15.17 → 1.16.0-beta-b16cb035

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 (119) hide show
  1. package/lib/api/node.js +67 -69
  2. package/lib/api/team.js +386 -55
  3. package/lib/blocklet/downloader/blocklet-downloader.js +226 -0
  4. package/lib/blocklet/downloader/bundle-downloader.js +272 -0
  5. package/lib/blocklet/downloader/constants.js +3 -0
  6. package/lib/blocklet/downloader/resolve-download.js +199 -0
  7. package/lib/blocklet/extras.js +83 -26
  8. package/lib/blocklet/hooks.js +18 -65
  9. package/lib/blocklet/manager/base.js +10 -16
  10. package/lib/blocklet/manager/disk.js +1679 -1566
  11. package/lib/blocklet/manager/helper/install-application-from-backup.js +177 -0
  12. package/lib/blocklet/manager/helper/install-application-from-dev.js +94 -0
  13. package/lib/blocklet/manager/helper/install-application-from-general.js +188 -0
  14. package/lib/blocklet/manager/helper/install-component-from-dev.js +84 -0
  15. package/lib/blocklet/manager/helper/install-component-from-upload.js +181 -0
  16. package/lib/blocklet/manager/helper/install-component-from-url.js +173 -0
  17. package/lib/blocklet/manager/helper/migrate-application-to-struct-v2.js +450 -0
  18. package/lib/blocklet/manager/helper/rollback-cache.js +41 -0
  19. package/lib/blocklet/manager/helper/upgrade-components.js +152 -0
  20. package/lib/blocklet/migration.js +30 -52
  21. package/lib/blocklet/storage/backup/audit-log.js +27 -0
  22. package/lib/blocklet/storage/backup/base.js +62 -0
  23. package/lib/blocklet/storage/backup/blocklet-extras.js +92 -0
  24. package/lib/blocklet/storage/backup/blocklet.js +70 -0
  25. package/lib/blocklet/storage/backup/blocklets.js +74 -0
  26. package/lib/blocklet/storage/backup/data.js +19 -0
  27. package/lib/blocklet/storage/backup/logs.js +24 -0
  28. package/lib/blocklet/storage/backup/routing-rule.js +19 -0
  29. package/lib/blocklet/storage/backup/spaces.js +240 -0
  30. package/lib/blocklet/storage/restore/base.js +67 -0
  31. package/lib/blocklet/storage/restore/blocklet-extras.js +86 -0
  32. package/lib/blocklet/storage/restore/blocklet.js +56 -0
  33. package/lib/blocklet/storage/restore/blocklets.js +43 -0
  34. package/lib/blocklet/storage/restore/logs.js +21 -0
  35. package/lib/blocklet/storage/restore/spaces.js +156 -0
  36. package/lib/blocklet/storage/utils/hash.js +51 -0
  37. package/lib/blocklet/storage/utils/zip.js +43 -0
  38. package/lib/cert.js +206 -0
  39. package/lib/event.js +237 -64
  40. package/lib/index.js +191 -83
  41. package/lib/migrations/1.0.21-update-config.js +1 -1
  42. package/lib/migrations/1.0.22-max-memory.js +1 -1
  43. package/lib/migrations/1.0.25.js +1 -1
  44. package/lib/migrations/1.0.32-update-config.js +1 -1
  45. package/lib/migrations/1.0.33-blocklets.js +1 -1
  46. package/lib/migrations/1.5.20-registry.js +15 -0
  47. package/lib/migrations/1.6.17-blocklet-children.js +48 -0
  48. package/lib/migrations/1.6.21-rename-ip-echo-domain.js +35 -0
  49. package/lib/migrations/1.6.4-security.js +59 -0
  50. package/lib/migrations/1.6.5-security.js +60 -0
  51. package/lib/migrations/1.6.9-update-node-info-and-certificate.js +38 -0
  52. package/lib/migrations/1.7.1-blocklet-setup.js +18 -0
  53. package/lib/migrations/1.7.12-blocklet-meta.js +51 -0
  54. package/lib/migrations/1.7.15-blocklet-bundle-source.js +42 -0
  55. package/lib/migrations/1.7.20-blocklet-component.js +41 -0
  56. package/lib/migrations/1.8.33-blocklet-mem-limit.js +20 -0
  57. package/lib/migrations/README.md +1 -1
  58. package/lib/migrations/index.js +6 -2
  59. package/lib/monitor/blocklet-runtime-monitor.js +200 -0
  60. package/lib/monitor/get-history-list.js +37 -0
  61. package/lib/monitor/node-runtime-monitor.js +228 -0
  62. package/lib/router/helper.js +572 -497
  63. package/lib/router/index.js +85 -21
  64. package/lib/router/manager.js +146 -187
  65. package/lib/states/README.md +36 -1
  66. package/lib/states/access-key.js +39 -17
  67. package/lib/states/audit-log.js +462 -0
  68. package/lib/states/base.js +4 -213
  69. package/lib/states/blocklet-extras.js +194 -138
  70. package/lib/states/blocklet.js +361 -104
  71. package/lib/states/cache.js +8 -6
  72. package/lib/states/challenge.js +5 -5
  73. package/lib/states/index.js +19 -36
  74. package/lib/states/migration.js +4 -4
  75. package/lib/states/node.js +135 -46
  76. package/lib/states/notification.js +22 -35
  77. package/lib/states/session.js +17 -9
  78. package/lib/states/site.js +50 -25
  79. package/lib/states/user.js +74 -20
  80. package/lib/states/webhook.js +10 -6
  81. package/lib/team/manager.js +124 -7
  82. package/lib/util/blocklet.js +1223 -246
  83. package/lib/util/chain.js +1 -1
  84. package/lib/util/default-node-config.js +5 -23
  85. package/lib/util/disk-monitor.js +13 -10
  86. package/lib/util/domain-status.js +84 -15
  87. package/lib/util/get-accessible-external-node-ip.js +2 -2
  88. package/lib/util/get-domain-for-blocklet.js +13 -0
  89. package/lib/util/get-meta-from-url.js +33 -0
  90. package/lib/util/index.js +207 -272
  91. package/lib/util/ip.js +6 -0
  92. package/lib/util/maintain.js +233 -0
  93. package/lib/util/public-to-store.js +85 -0
  94. package/lib/util/ready.js +1 -1
  95. package/lib/util/requirement.js +28 -9
  96. package/lib/util/reset-node.js +22 -7
  97. package/lib/util/router.js +13 -0
  98. package/lib/util/rpc.js +16 -0
  99. package/lib/util/store.js +179 -0
  100. package/lib/util/sysinfo.js +44 -0
  101. package/lib/util/ua.js +54 -0
  102. package/lib/validators/blocklet-extra.js +24 -0
  103. package/lib/validators/node.js +25 -12
  104. package/lib/validators/permission.js +16 -1
  105. package/lib/validators/role.js +17 -3
  106. package/lib/validators/router.js +40 -20
  107. package/lib/validators/trusted-passport.js +1 -0
  108. package/lib/validators/util.js +22 -5
  109. package/lib/webhook/index.js +45 -35
  110. package/lib/webhook/sender/index.js +5 -0
  111. package/lib/webhook/sender/slack/index.js +1 -1
  112. package/lib/webhook/sender/wallet/index.js +48 -0
  113. package/package.json +54 -36
  114. package/lib/blocklet/registry.js +0 -205
  115. package/lib/states/https-cert.js +0 -67
  116. package/lib/util/get-ip-dns-domain-for-blocklet.js +0 -19
  117. package/lib/util/service.js +0 -66
  118. package/lib/util/upgrade.js +0 -178
  119. /package/lib/{queue.js → util/queue.js} +0 -0
package/lib/util/chain.js CHANGED
@@ -1,4 +1,4 @@
1
- const axios = require('axios');
1
+ const axios = require('@abtnode/util/lib/axios');
2
2
  const get = require('lodash/get');
3
3
 
4
4
  const getFactoryState = async (endpoint, address) => {
@@ -1,16 +1,9 @@
1
- const {
2
- NODE_REGISTER_URL,
3
- BLOCKLET_STORE_URL,
4
- BLOCKLET_STORE_URL_DEV,
5
- WEB_WALLET_URL,
6
- NODE_PACKAGE_NAME,
7
- NODE_COMMAND_NAME,
8
- } = require('@abtnode/constant');
1
+ const { NODE_REGISTER_URL, BLOCKLET_STORE, BLOCKLET_STORE_DEV } = require('@abtnode/constant');
9
2
  const canPackageReadWrite = require('@abtnode/util/lib/can-pkg-rw');
10
3
 
11
4
  const getDefaultAutoUpgrade = () => {
12
5
  try {
13
- return canPackageReadWrite(NODE_COMMAND_NAME, NODE_PACKAGE_NAME);
6
+ return canPackageReadWrite(process.env.ABT_NODE_BINARY_NAME, process.env.ABT_NODE_PACKAGE_NAME);
14
7
  } catch (err) {
15
8
  return false;
16
9
  }
@@ -23,27 +16,16 @@ const defaultNodeConfigs = {
23
16
  blockletRegistryList: {
24
17
  getDefaultValue: () => [
25
18
  {
26
- name: 'Official Store',
27
- description: 'ArcBlock official blocklet registry',
28
- url: BLOCKLET_STORE_URL,
29
- logoUrl: '/logo.png',
30
- maintainer: 'arcblock',
31
- selected: true,
19
+ ...BLOCKLET_STORE,
32
20
  protected: true,
33
21
  },
34
22
  {
35
- name: 'Dev Store',
36
- description: 'ArcBlock dev registry that contains demo and example blocklets',
37
- url: BLOCKLET_STORE_URL_DEV,
38
- maintainer: 'arcblock',
39
- logoUrl: '/logo.png',
40
- selected: false,
23
+ ...BLOCKLET_STORE_DEV,
41
24
  protected: false,
42
25
  },
43
26
  ],
44
27
  },
45
- registerUrl: { getDefaultValue: () => NODE_REGISTER_URL }, // removed in 1.5.1
46
- webWalletUrl: { getDefaultValue: () => WEB_WALLET_URL },
28
+ registerUrl: { getDefaultValue: () => NODE_REGISTER_URL },
47
29
  };
48
30
 
49
31
  const lib = {
@@ -1,22 +1,26 @@
1
- const systeminformation = require('@abtnode/util/lib/sys-info');
2
1
  const logger = require('@abtnode/logger')('@abtnode/disk-monitor');
2
+ const info = require('./sysinfo');
3
3
 
4
4
  const states = require('../states');
5
5
 
6
6
  /**
7
- *
8
- * @param {number} threshold Threshold for disk alarms, percentage
7
+ * @param {number} threshold Threshold for disk alerts, percentage
9
8
  */
10
9
  const check = async (threshold) => {
11
- const info = await systeminformation.get();
12
- const usageRatio = (info.disk.used / info.disk.total) * 100;
13
- const usageRationText = `${usageRatio.toFixed(2)}%`;
14
- logger.info('monitoring disk usage', { usage: usageRationText, threshold });
10
+ const { disks } = await info.getSysInfo();
11
+ for (const disk of disks) {
12
+ const usageRatio = (disk.used / disk.total) * 100;
13
+ const usageRatioPercent = `${usageRatio.toFixed(2)}%`;
14
+ logger.info('check disk usage', { usage: usageRatioPercent, threshold });
15
15
 
16
- if (usageRatio >= threshold) {
16
+ if (usageRatio < threshold) {
17
+ return;
18
+ }
19
+
20
+ // eslint-disable-next-line no-await-in-loop
17
21
  await states.notification.create({
18
22
  title: 'Disk Usage Alert',
19
- description: `More than ${usageRationText} disk space has been used`,
23
+ description: `More than ${usageRatioPercent} space has been used for disk ${disk.device}, the blocklet server may not function properly.`,
20
24
  entityType: 'node',
21
25
  severity: 'warning',
22
26
  sticky: true,
@@ -30,7 +34,6 @@ const getCron = () => ({
30
34
  fn: async () => {
31
35
  const nodeInfo = await states.node.read();
32
36
  const threshold = nodeInfo.diskAlertThreshold;
33
-
34
37
  await check(threshold);
35
38
  },
36
39
  options: { runOnInit: true },
@@ -1,44 +1,113 @@
1
+ const https = require('https');
1
2
  const { EventEmitter } = require('events');
2
3
  const logger = require('@abtnode/logger')('@abtnode/domain-status');
4
+ const { EVENTS, WELLKNOWN_PING_PREFIX } = require('@abtnode/constant');
5
+ const { BlockletEvents } = require('@blocklet/constant');
3
6
  const { checkDomainDNS } = require('./index');
4
7
 
5
8
  const dnsStatusStore = Object.create(null);
6
9
 
7
- const checkDomainDnsWrapper = async (domain) => {
8
- // 正在执行,并且离上次的执行时间小于 2 分钟则不请求
9
- if (dnsStatusStore[domain] && Date.now() - dnsStatusStore[domain] < 2 * 60 * 1000) {
10
- return {};
11
- }
12
-
10
+ const doCheckDomainDnsWrapper = async (domain) => {
13
11
  try {
14
- dnsStatusStore[domain] = Date.now();
15
12
  const status = await checkDomainDNS(domain);
16
13
  return status;
17
14
  } catch (error) {
18
15
  logger.error('check domain dns error', { domain, error });
19
16
  throw error;
20
17
  } finally {
21
- delete dnsStatusStore[domain];
22
18
  logger.debug('removed dns flag', { domain });
23
19
  }
24
20
  };
25
21
 
22
+ const checkDomainDnsWrapper = (domain) => {
23
+ // 正在执行或已成功,并且离上次的执行时间小于 2 分钟则不请求
24
+ if (dnsStatusStore[domain] && Date.now() - dnsStatusStore[domain].startAt < 2 * 60 * 1000) {
25
+ return dnsStatusStore[domain].promise;
26
+ }
27
+
28
+ const promise = doCheckDomainDnsWrapper(domain);
29
+ dnsStatusStore[domain] = {
30
+ promise,
31
+ startAt: Date.now(),
32
+ };
33
+
34
+ promise.catch(() => {
35
+ delete dnsStatusStore[domain];
36
+ });
37
+
38
+ return promise;
39
+ };
40
+
26
41
  class DomainStatus extends EventEmitter {
27
- constructor(routerManager) {
42
+ constructor({ routerManager, states }) {
28
43
  super();
29
44
 
30
45
  this.routerManager = routerManager;
46
+ this.states = states;
31
47
  }
32
48
 
33
- checkDomainsStatus({ domains } = {}) {
49
+ async getHttpsCert(domain) {
50
+ const matchedCert = await this.routerManager.getMatchedCert(domain);
51
+
52
+ if (matchedCert) {
53
+ return matchedCert;
54
+ }
55
+
56
+ return new Promise((resolve) => {
57
+ const req = https.request(
58
+ {
59
+ host: domain,
60
+ path: WELLKNOWN_PING_PREFIX,
61
+ method: 'GET',
62
+ timeout: 1000 * 10,
63
+ },
64
+ (res) => {
65
+ try {
66
+ const data = res.socket.getPeerCertificate();
67
+ const cert = {
68
+ issuer: {
69
+ countryName: data.issuer.C,
70
+ organizationName: data.issuer.O,
71
+ commonName: data.issuer.CN,
72
+ },
73
+ validFrom: data.valid_from,
74
+ validTo: data.valid_to,
75
+ };
76
+ resolve(cert);
77
+ } catch {
78
+ resolve(null);
79
+ }
80
+ }
81
+ );
82
+
83
+ req.on('error', () => {
84
+ resolve(null);
85
+ });
86
+
87
+ req.end();
88
+ });
89
+ }
90
+
91
+ async checkDomainsStatus({ domains, did } = {}) {
92
+ if (did) {
93
+ // eslint-disable-next-line no-param-reassign
94
+ domains = await this.states.site.getBlockletDomains(did);
95
+ }
96
+
34
97
  (domains || []).forEach((domain) => {
35
- Promise.all([this.routerManager.getMatchedCert(domain), checkDomainDnsWrapper(domain)])
36
- .then((data) => {
37
- const [matchedCert, dns] = data;
38
- this.emit('domain.status', { domain, matchedCert, isHttps: !!matchedCert, dns });
98
+ Promise.all([this.getHttpsCert(domain), checkDomainDnsWrapper(domain)])
99
+ .then(([matchedCert, dns]) => {
100
+ const eventData = { domain, matchedCert, isHttps: !!matchedCert, dns };
101
+
102
+ if (did) {
103
+ eventData.meta = { did };
104
+ this.emit(BlockletEvents.domainStatus, eventData);
105
+ } else {
106
+ this.emit(EVENTS.DOMAIN_STATUS, eventData);
107
+ }
39
108
  })
40
109
  .catch((error) => {
41
- logger.error('check domain status error', { domain, error });
110
+ logger.error('check domain status error', { domain, error, did });
42
111
  });
43
112
  });
44
113
 
@@ -1,9 +1,9 @@
1
1
  const joinUrl = require('url-join');
2
2
  const axios = require('@abtnode/util/lib/axios');
3
- const { DEFAULT_DASHBOARD_DOMAIN, DEFAULT_ADMIN_PATH } = require('@abtnode/constant');
3
+ const { DEFAULT_IP_DOMAIN, DEFAULT_ADMIN_PATH } = require('@abtnode/constant');
4
4
  const { get: getIp } = require('./ip');
5
5
 
6
- const getNodeDomain = (ip) => (ip ? DEFAULT_DASHBOARD_DOMAIN.replace(/^\*/, ip.replace(/\./g, '-')) : '');
6
+ const getNodeDomain = (ip) => (ip ? DEFAULT_IP_DOMAIN.replace(/^\*/, ip.replace(/\./g, '-')) : '');
7
7
 
8
8
  let cache = null;
9
9
 
@@ -0,0 +1,13 @@
1
+ const { DEFAULT_IP_DOMAIN_SUFFIX, SLOT_FOR_IP_DNS_SITE } = require('@abtnode/constant');
2
+ const { encode: encodeBase32 } = require('@abtnode/util/lib/base32');
3
+ const formatName = require('@abtnode/util/lib/format-name');
4
+
5
+ const getIpDnsDomainForBlocklet = (blocklet) => {
6
+ return `${encodeBase32(blocklet.meta.did)}-${SLOT_FOR_IP_DNS_SITE}.${DEFAULT_IP_DOMAIN_SUFFIX}`;
7
+ };
8
+
9
+ const getDidDomainForBlocklet = ({ appPid, didDomain }) => {
10
+ return `${encodeBase32(appPid)}.${didDomain}`;
11
+ };
12
+
13
+ module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet, formatName };
@@ -0,0 +1,33 @@
1
+ const { isFreeBlocklet } = require('@blocklet/meta/lib/util');
2
+
3
+ const logger = require('@abtnode/logger')('getMetaFromUrl');
4
+
5
+ const { getBlockletMetaFromUrl } = require('./blocklet');
6
+ const { getStoreMeta, parseSourceUrl } = require('./store');
7
+ const { getFactoryState } = require('./chain');
8
+
9
+ const getMetaFromUrl = async ({ url, checkPrice = false }) => {
10
+ const meta = await getBlockletMetaFromUrl(url);
11
+ let isFree = isFreeBlocklet(meta);
12
+
13
+ if (checkPrice && !isFree && meta.nftFactory) {
14
+ try {
15
+ const registryMeta = await getStoreMeta(new URL(url).origin);
16
+
17
+ if (registryMeta.chainHost) {
18
+ const state = await getFactoryState(registryMeta.chainHost, meta.nftFactory);
19
+ if (state) {
20
+ isFree = false;
21
+ }
22
+ }
23
+ } catch (error) {
24
+ logger.warn('failed when checking if the blocklet is free', { did: meta.did, error });
25
+ }
26
+ }
27
+
28
+ const { inStore, registryUrl } = await parseSourceUrl(url);
29
+
30
+ return { meta, isFree, inStore, registryUrl };
31
+ };
32
+
33
+ module.exports = getMetaFromUrl;