@abtnode/core 1.15.17 → 1.16.0-beta-8ee536d7
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 +67 -69
- package/lib/api/team.js +386 -55
- package/lib/blocklet/downloader/blocklet-downloader.js +226 -0
- package/lib/blocklet/downloader/bundle-downloader.js +272 -0
- package/lib/blocklet/downloader/constants.js +3 -0
- package/lib/blocklet/downloader/resolve-download.js +199 -0
- package/lib/blocklet/extras.js +83 -26
- package/lib/blocklet/hooks.js +18 -65
- package/lib/blocklet/manager/base.js +10 -16
- package/lib/blocklet/manager/disk.js +1680 -1566
- package/lib/blocklet/manager/helper/install-application-from-backup.js +177 -0
- package/lib/blocklet/manager/helper/install-application-from-dev.js +94 -0
- package/lib/blocklet/manager/helper/install-application-from-general.js +188 -0
- package/lib/blocklet/manager/helper/install-component-from-dev.js +84 -0
- package/lib/blocklet/manager/helper/install-component-from-upload.js +181 -0
- package/lib/blocklet/manager/helper/install-component-from-url.js +173 -0
- package/lib/blocklet/manager/helper/migrate-application-to-struct-v2.js +450 -0
- package/lib/blocklet/manager/helper/rollback-cache.js +41 -0
- package/lib/blocklet/manager/helper/upgrade-components.js +152 -0
- package/lib/blocklet/migration.js +30 -52
- package/lib/blocklet/storage/backup/audit-log.js +27 -0
- package/lib/blocklet/storage/backup/base.js +62 -0
- package/lib/blocklet/storage/backup/blocklet-extras.js +92 -0
- package/lib/blocklet/storage/backup/blocklet.js +70 -0
- package/lib/blocklet/storage/backup/blocklets.js +74 -0
- package/lib/blocklet/storage/backup/data.js +19 -0
- package/lib/blocklet/storage/backup/logs.js +24 -0
- package/lib/blocklet/storage/backup/routing-rule.js +19 -0
- package/lib/blocklet/storage/backup/spaces.js +240 -0
- package/lib/blocklet/storage/restore/base.js +67 -0
- package/lib/blocklet/storage/restore/blocklet-extras.js +86 -0
- package/lib/blocklet/storage/restore/blocklet.js +56 -0
- package/lib/blocklet/storage/restore/blocklets.js +43 -0
- package/lib/blocklet/storage/restore/logs.js +21 -0
- package/lib/blocklet/storage/restore/spaces.js +156 -0
- package/lib/blocklet/storage/utils/hash.js +51 -0
- package/lib/blocklet/storage/utils/zip.js +43 -0
- package/lib/cert.js +206 -0
- package/lib/event.js +237 -64
- package/lib/index.js +191 -83
- package/lib/migrations/1.0.21-update-config.js +1 -1
- package/lib/migrations/1.0.22-max-memory.js +1 -1
- package/lib/migrations/1.0.25.js +1 -1
- package/lib/migrations/1.0.32-update-config.js +1 -1
- package/lib/migrations/1.0.33-blocklets.js +1 -1
- package/lib/migrations/1.5.20-registry.js +15 -0
- package/lib/migrations/1.6.17-blocklet-children.js +48 -0
- package/lib/migrations/1.6.21-rename-ip-echo-domain.js +35 -0
- package/lib/migrations/1.6.4-security.js +59 -0
- package/lib/migrations/1.6.5-security.js +60 -0
- package/lib/migrations/1.6.9-update-node-info-and-certificate.js +38 -0
- package/lib/migrations/1.7.1-blocklet-setup.js +18 -0
- package/lib/migrations/1.7.12-blocklet-meta.js +51 -0
- package/lib/migrations/1.7.15-blocklet-bundle-source.js +42 -0
- package/lib/migrations/1.7.20-blocklet-component.js +41 -0
- package/lib/migrations/1.8.33-blocklet-mem-limit.js +20 -0
- package/lib/migrations/README.md +1 -1
- package/lib/migrations/index.js +6 -2
- package/lib/monitor/blocklet-runtime-monitor.js +200 -0
- package/lib/monitor/get-history-list.js +37 -0
- package/lib/monitor/node-runtime-monitor.js +228 -0
- package/lib/router/helper.js +576 -500
- package/lib/router/index.js +85 -21
- package/lib/router/manager.js +146 -187
- package/lib/states/README.md +36 -1
- package/lib/states/access-key.js +39 -17
- package/lib/states/audit-log.js +462 -0
- package/lib/states/base.js +4 -213
- package/lib/states/blocklet-extras.js +195 -138
- package/lib/states/blocklet.js +371 -110
- package/lib/states/cache.js +8 -6
- package/lib/states/challenge.js +5 -5
- package/lib/states/index.js +19 -36
- package/lib/states/migration.js +4 -4
- package/lib/states/node.js +135 -46
- package/lib/states/notification.js +22 -35
- package/lib/states/session.js +17 -9
- package/lib/states/site.js +50 -25
- package/lib/states/user.js +74 -20
- package/lib/states/webhook.js +10 -6
- package/lib/team/manager.js +124 -7
- package/lib/util/blocklet.js +1223 -246
- package/lib/util/chain.js +1 -1
- package/lib/util/default-node-config.js +5 -23
- package/lib/util/disk-monitor.js +13 -10
- package/lib/util/domain-status.js +84 -15
- package/lib/util/get-accessible-external-node-ip.js +2 -2
- package/lib/util/get-domain-for-blocklet.js +13 -0
- package/lib/util/get-meta-from-url.js +33 -0
- package/lib/util/index.js +207 -272
- package/lib/util/ip.js +6 -0
- package/lib/util/maintain.js +233 -0
- package/lib/util/public-to-store.js +85 -0
- package/lib/util/ready.js +1 -1
- package/lib/util/requirement.js +28 -9
- package/lib/util/reset-node.js +22 -7
- package/lib/util/router.js +13 -0
- package/lib/util/rpc.js +16 -0
- package/lib/util/store.js +179 -0
- package/lib/util/sysinfo.js +44 -0
- package/lib/util/ua.js +54 -0
- package/lib/validators/blocklet-extra.js +24 -0
- package/lib/validators/node.js +25 -12
- package/lib/validators/permission.js +16 -1
- package/lib/validators/role.js +17 -3
- package/lib/validators/router.js +40 -20
- package/lib/validators/trusted-passport.js +1 -0
- package/lib/validators/util.js +22 -5
- package/lib/webhook/index.js +45 -35
- package/lib/webhook/sender/index.js +5 -0
- package/lib/webhook/sender/slack/index.js +1 -1
- package/lib/webhook/sender/wallet/index.js +48 -0
- package/package.json +54 -36
- package/lib/blocklet/registry.js +0 -205
- package/lib/states/https-cert.js +0 -67
- package/lib/util/get-ip-dns-domain-for-blocklet.js +0 -19
- package/lib/util/service.js +0 -66
- package/lib/util/upgrade.js +0 -178
- /package/lib/{queue.js → util/queue.js} +0 -0
package/lib/router/index.js
CHANGED
|
@@ -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
|
-
|
|
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/
|
|
12
|
-
|
|
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
|
|
67
|
+
// put ipWildcardDomain to last, to let blockletDomain match first
|
|
64
68
|
// e.g.
|
|
65
|
-
//
|
|
69
|
+
// ipWildcardDomain: 192-168-3-2.ip.abtnet.io
|
|
66
70
|
// blockletDomain: static-demo-xxx-192-168-3-2.ip.abtnet.io
|
|
67
|
-
const
|
|
68
|
-
const index = routingTable.findIndex((x) => x.domain ===
|
|
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
|
-
|
|
108
|
-
|
|
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
|
-
|
|
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 都需要
|
|
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
|
-
|
|
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
|
|
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 !==
|
|
290
|
+
.filter((x) => x !== ipWildcardDomain)
|
|
227
291
|
.filter(Boolean);
|
|
228
292
|
|
|
229
293
|
if (Array.isArray(site.rules) && site.rules.length > 0) {
|