@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
@@ -1,17 +1,21 @@
1
1
  const get = require('lodash/get');
2
+ const pick = require('lodash/pick');
2
3
  const cloneDeep = require('lodash/cloneDeep');
3
4
  const {
4
5
  DOMAIN_FOR_DEFAULT_SITE,
5
6
  DOMAIN_FOR_IP_SITE_REGEXP,
6
7
  ROUTING_RULE_TYPES,
7
- DEFAULT_DASHBOARD_DOMAIN,
8
+ DEFAULT_IP_DOMAIN,
8
9
  BLOCKLET_PROXY_PATH_PREFIX,
9
10
  BLOCKLET_SITE_GROUP_SUFFIX,
11
+ GATEWAY_REQ_LIMIT,
10
12
  } = require('@abtnode/constant');
11
- const { BLOCKLET_UI_INTERFACES } = require('@blocklet/meta/lib/constants');
12
- const { pick } = require('lodash');
13
+ const { BLOCKLET_UI_INTERFACES, BLOCKLET_MODES } = require('@blocklet/constant');
14
+
13
15
  const logger = require('@abtnode/logger')('@abtnode/core:router');
14
16
 
17
+ const { isGatewayCacheEnabled } = require('../util');
18
+
15
19
  const expandSites = (sites = []) => {
16
20
  const result = [];
17
21
 
@@ -60,12 +64,12 @@ const getRoutingTable = ({ sites, nodeInfo }) => {
60
64
  let routingTable = Router.formatSites(sites);
61
65
  routingTable = expandSites(routingTable);
62
66
 
63
- // put dashboardDomain to last, to let blockletDomain match first
67
+ // put ipWildcardDomain to last, to let blockletDomain match first
64
68
  // e.g.
65
- // dashboardDomain: 192-168-3-2.ip.abtnet.io
69
+ // ipWildcardDomain: 192-168-3-2.ip.abtnet.io
66
70
  // blockletDomain: static-demo-xxx-192-168-3-2.ip.abtnet.io
67
- const dashboardDomain = get(nodeInfo, 'routing.dashboardDomain', '');
68
- const index = routingTable.findIndex((x) => x.domain === dashboardDomain);
71
+ const ipWildcardDomain = get(nodeInfo, 'routing.ipWildcardDomain', '');
72
+ const index = routingTable.findIndex((x) => x.domain === ipWildcardDomain);
69
73
  if (index > -1) {
70
74
  routingTable.push(...routingTable.splice(index, 1));
71
75
  }
@@ -94,35 +98,34 @@ class Router {
94
98
  }
95
99
 
96
100
  async updateRoutingTable() {
101
+ logger.info('update routing table');
102
+
97
103
  const { sites, certificates, headers = {}, services = [], nodeInfo = {} } = (await this.getRoutingParams()) || {};
98
104
  if (!Array.isArray(sites)) {
99
105
  logger.error('sites is not an array', { sites });
100
106
  return;
101
107
  }
102
108
 
103
- logger.info('updateRoutingTable sites:', { sites });
104
-
105
109
  this.routingTable = getRoutingTable({ sites, nodeInfo });
106
110
 
107
- logger.info('updateRoutingTable routingTable:', { routingTable: this.routingTable });
108
- logger.info('updateRoutingTable certificates:', { certificates: certificates.map((item) => item.domain) });
111
+ const requestLimit = nodeInfo.routing.requestLimit || { enable: false, rate: GATEWAY_REQ_LIMIT.min };
112
+ if (requestLimit.enabled) {
113
+ requestLimit.maxInstantRate = requestLimit.rate >= 20 ? 20 : requestLimit.rate + 20;
114
+ }
109
115
 
110
116
  await this.provider.update({
111
117
  routingTable: this.routingTable,
112
118
  certificates,
113
- globalHeaders: headers,
119
+ commonHeaders: headers,
114
120
  services,
115
121
  nodeInfo: pick(nodeInfo, ['name', 'version', 'port', 'mode', 'enableWelcomePage', 'routing']),
122
+ requestLimit,
123
+ cacheEnabled: isGatewayCacheEnabled(nodeInfo),
116
124
  });
117
125
  }
118
126
 
119
127
  async update() {
120
- if (!this.provider) {
121
- throw new Error('use setProvider() to set provider first');
122
- }
123
-
124
128
  logger.info('router: update');
125
-
126
129
  await this.updateRoutingTable();
127
130
  await this.provider.reload();
128
131
  }
@@ -139,6 +142,12 @@ class Router {
139
142
  return this.provider.restart();
140
143
  }
141
144
 
145
+ async reload() {
146
+ logger.info('router: reload');
147
+ await this.updateRoutingTable();
148
+ return this.provider.reload();
149
+ }
150
+
142
151
  stop() {
143
152
  logger.info('router: stop');
144
153
  return this.provider.stop();
@@ -153,6 +162,14 @@ class Router {
153
162
  logger.info('router: rotate logs');
154
163
  await this.provider.rotateLogs();
155
164
  }
165
+
166
+ getLogFilesForToday() {
167
+ return this.provider.getLogFilesForToday();
168
+ }
169
+
170
+ getLogDir() {
171
+ return this.provider.getLogDir();
172
+ }
156
173
  }
157
174
 
158
175
  Router.formatSites = (sites = []) => {
@@ -170,6 +187,10 @@ Router.formatSites = (sites = []) => {
170
187
  result.forEach((site) => {
171
188
  if (Array.isArray(site.rules) && site.rules.length > 0) {
172
189
  const rules = cloneDeep(site.rules);
190
+
191
+ let hasRootPathBlockletRule = false;
192
+ let tmpBlockletRule;
193
+
173
194
  rules.forEach((rule) => {
174
195
  if ([ROUTING_RULE_TYPES.BLOCKLET].includes(rule.to.type) === false) {
175
196
  return;
@@ -179,10 +200,19 @@ Router.formatSites = (sites = []) => {
179
200
  return;
180
201
  }
181
202
 
203
+ if (rule.dynamic) {
204
+ return;
205
+ }
206
+
182
207
  if (daemonRule) {
208
+ if (rule.from.pathPrefix === '/') {
209
+ hasRootPathBlockletRule = true;
210
+ }
211
+ tmpBlockletRule = rule;
212
+
183
213
  // Serve meta js: both prefix and suffix do not contain trailing slash
184
214
  // NOTICE: 这里隐含了一个约定
185
- // 如果安装的 blockletA 和 blockletB 都需要 __meta__.js
215
+ // 如果安装的 blockletA 和 blockletB 都需要 __blocklet__.js
186
216
  // 则不可以将 blockletA mount 在 /a, 将 blockletB mount 在 /a/b (实际上也不会有这种需求)
187
217
  site.rules.push({
188
218
  from: {
@@ -194,7 +224,22 @@ Router.formatSites = (sites = []) => {
194
224
  type: ROUTING_RULE_TYPES.DAEMON,
195
225
  port: daemonRule.to.port,
196
226
  did: rule.to.did,
197
- realDid: rule.to.realDid,
227
+ componentId: rule.to.componentId,
228
+ cacheGroup: site.mode === BLOCKLET_MODES.PRODUCTION ? 'blockletJs' : '',
229
+ },
230
+ });
231
+ site.rules.push({
232
+ from: {
233
+ pathPrefix: rule.from.pathPrefix.replace(/\/$/, ''),
234
+ groupPathPrefix: (rule.from.groupPathPrefix || '').replace(/\/$/, ''),
235
+ pathSuffix: '/__blocklet__.js',
236
+ },
237
+ to: {
238
+ type: ROUTING_RULE_TYPES.DAEMON,
239
+ port: daemonRule.to.port,
240
+ did: rule.to.did,
241
+ componentId: rule.to.componentId,
242
+ cacheGroup: site.mode === BLOCKLET_MODES.PRODUCTION ? 'blockletJs' : '',
198
243
  },
199
244
  });
200
245
 
@@ -207,10 +252,29 @@ Router.formatSites = (sites = []) => {
207
252
  did: rule.to.did,
208
253
  type: ROUTING_RULE_TYPES.DAEMON,
209
254
  target: BLOCKLET_PROXY_PATH_PREFIX,
255
+ cacheGroup: site.mode === BLOCKLET_MODES.PRODUCTION ? 'blockletProxy' : '',
210
256
  },
211
257
  });
212
258
  }
213
259
  });
260
+
261
+ // ensure /__blocklet__.js should be proxy to daemon
262
+ if (daemonRule && !hasRootPathBlockletRule && tmpBlockletRule) {
263
+ site.rules.push({
264
+ from: {
265
+ pathPrefix: '/',
266
+ groupPathPrefix: '/',
267
+ pathSuffix: '/__blocklet__.js',
268
+ },
269
+ to: {
270
+ type: ROUTING_RULE_TYPES.DAEMON,
271
+ port: daemonRule.to.port,
272
+ did: tmpBlockletRule.to.did,
273
+ componentId: tmpBlockletRule.to.did,
274
+ cacheGroup: site.mode === BLOCKLET_MODES.PRODUCTION ? 'blockletJs' : '',
275
+ },
276
+ });
277
+ }
214
278
  }
215
279
  });
216
280
 
@@ -219,11 +283,11 @@ Router.formatSites = (sites = []) => {
219
283
 
220
284
  Router.flattenSitesToRules = (sites = [], info = {}) => {
221
285
  const result = [];
222
- const dashboardDomain = get(info, 'routing.dashboardDomain', DEFAULT_DASHBOARD_DOMAIN);
286
+ const ipWildcardDomain = get(info, 'routing.ipWildcardDomain', DEFAULT_IP_DOMAIN);
223
287
  sites.forEach((site) => {
224
288
  const aliases = (site.domainAliases || [])
225
289
  .map((x) => (typeof x === 'string' ? x : x.value))
226
- .filter((x) => x !== dashboardDomain)
290
+ .filter((x) => x !== ipWildcardDomain)
227
291
  .filter(Boolean);
228
292
 
229
293
  if (Array.isArray(site.rules) && site.rules.length > 0) {