@abtnode/core 1.17.7-beta-20251227-001958-ea2ba3f5 → 1.17.7-beta-20251229-223813-e1e6c5e3
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/blocklet/manager/disk.js +74 -32
- package/lib/blocklet/manager/ensure-blocklet-running.js +1 -1
- package/lib/blocklet/manager/helper/blue-green-start-blocklet.js +1 -1
- package/lib/blocklet/manager/helper/install-application-from-general.js +2 -3
- package/lib/blocklet/manager/helper/install-component-from-url.js +7 -4
- package/lib/blocklet/migration-dist/migration.cjs +5 -4
- package/lib/blocklet/passport/index.js +10 -3
- package/lib/blocklet/project/index.js +7 -2
- package/lib/blocklet/security/index.js +2 -2
- package/lib/cert.js +6 -3
- package/lib/event/index.js +98 -87
- package/lib/event/util.js +7 -13
- package/lib/index.js +15 -26
- package/lib/migrations/1.5.0-site.js +3 -7
- package/lib/migrations/1.5.15-site.js +3 -7
- package/lib/monitor/blocklet-runtime-monitor.js +37 -5
- package/lib/monitor/node-runtime-monitor.js +4 -4
- package/lib/router/helper.js +525 -452
- package/lib/router/index.js +280 -104
- package/lib/router/manager.js +14 -28
- package/lib/states/blocklet-child.js +93 -1
- package/lib/states/blocklet-extras.js +1 -1
- package/lib/states/blocklet.js +429 -197
- package/lib/states/node.js +0 -10
- package/lib/states/site.js +87 -4
- package/lib/team/manager.js +2 -21
- package/lib/util/blocklet.js +39 -19
- package/lib/util/get-accessible-external-node-ip.js +21 -6
- package/lib/util/index.js +3 -3
- package/lib/util/ip.js +15 -1
- package/lib/util/launcher.js +11 -11
- package/lib/util/ready.js +2 -9
- package/lib/util/reset-node.js +6 -5
- package/lib/validators/router.js +0 -3
- package/lib/webhook/sender/api/index.js +5 -0
- package/package.json +23 -25
- package/lib/migrations/1.0.36-snapshot.js +0 -10
- package/lib/migrations/1.1.9-snapshot.js +0 -7
- package/lib/states/routing-snapshot.js +0 -146
package/lib/event/index.js
CHANGED
|
@@ -24,7 +24,7 @@ const { joinURL } = require('ufo');
|
|
|
24
24
|
const { encode } = require('@abtnode/util/lib/base32');
|
|
25
25
|
const dayjs = require('@abtnode/util/lib/dayjs');
|
|
26
26
|
|
|
27
|
-
const {
|
|
27
|
+
const { isWorkerInstance } = require('@abtnode/util/lib/pm2/is-instance-worker');
|
|
28
28
|
const { isInServerlessMode } = require('@abtnode/util/lib/serverless');
|
|
29
29
|
const { NodeMonitSender } = require('../monitor/node-monit-sender');
|
|
30
30
|
const { isCLI } = require('../util');
|
|
@@ -43,12 +43,7 @@ const {
|
|
|
43
43
|
updateDidDocument,
|
|
44
44
|
updateDidDocumentStateOnly,
|
|
45
45
|
} = require('../util/blocklet');
|
|
46
|
-
const {
|
|
47
|
-
backupBlockletSites,
|
|
48
|
-
cleanBlockletSitesBackup,
|
|
49
|
-
rollbackBlockletSites,
|
|
50
|
-
routingSnapshotPrefix,
|
|
51
|
-
} = require('./util');
|
|
46
|
+
const { backupBlockletSites, cleanBlockletSitesBackup, rollbackBlockletSites } = require('./util');
|
|
52
47
|
const { ensureBlockletHasMultipleInterfaces } = require('../router/helper');
|
|
53
48
|
const { sendServerlessHeartbeat } = require('../util/launcher');
|
|
54
49
|
|
|
@@ -66,8 +61,8 @@ module.exports = ({
|
|
|
66
61
|
ensureBlockletRouting,
|
|
67
62
|
ensureBlockletRoutingForUpgrade,
|
|
68
63
|
removeBlockletRouting,
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
handleBlockletRouting,
|
|
65
|
+
handleSystemRouting,
|
|
71
66
|
handleBlockletWafChange,
|
|
72
67
|
domainStatus,
|
|
73
68
|
teamAPI,
|
|
@@ -100,7 +95,7 @@ module.exports = ({
|
|
|
100
95
|
|
|
101
96
|
// Listen events from eventHub and call eventHandler
|
|
102
97
|
[...Object.values(BlockletEvents), ...Object.values(TeamEvents), ...Object.values(EVENTS)].forEach((name) => {
|
|
103
|
-
if (
|
|
98
|
+
if (isWorkerInstance()) {
|
|
104
99
|
return;
|
|
105
100
|
}
|
|
106
101
|
eventHub.on(name, (data) => {
|
|
@@ -140,7 +135,7 @@ module.exports = ({
|
|
|
140
135
|
});
|
|
141
136
|
|
|
142
137
|
eventHub.on(EVENTS.NODE_UPDATED, () => {
|
|
143
|
-
if (
|
|
138
|
+
if (isWorkerInstance()) {
|
|
144
139
|
return;
|
|
145
140
|
}
|
|
146
141
|
logger.info('node update');
|
|
@@ -187,7 +182,7 @@ module.exports = ({
|
|
|
187
182
|
}
|
|
188
183
|
};
|
|
189
184
|
|
|
190
|
-
const
|
|
185
|
+
const handleBlockletBlueOrGreenStarted = async (name, { blocklet, componentDids, context }) => {
|
|
191
186
|
try {
|
|
192
187
|
// 只有某些 children 有多个接口时, 才需要更新路由
|
|
193
188
|
const hasMultipleInterfaces = ensureBlockletHasMultipleInterfaces(blocklet, componentDids);
|
|
@@ -196,14 +191,10 @@ module.exports = ({
|
|
|
196
191
|
}
|
|
197
192
|
const changed = await ensureBlockletRouting(blocklet, context);
|
|
198
193
|
if (changed) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
},
|
|
204
|
-
context
|
|
205
|
-
);
|
|
206
|
-
logger.info('created.url.mapping', { event: name, did: blocklet.meta.did, hash });
|
|
194
|
+
await handleBlockletRouting({
|
|
195
|
+
did: blocklet.meta.did,
|
|
196
|
+
message: 'Blue or green start blocklet',
|
|
197
|
+
});
|
|
207
198
|
return true;
|
|
208
199
|
}
|
|
209
200
|
return false;
|
|
@@ -221,26 +212,49 @@ module.exports = ({
|
|
|
221
212
|
}
|
|
222
213
|
};
|
|
223
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Handle BlockletEvents.added - set up routing early for DNS warm-up
|
|
217
|
+
* This is called as soon as blocklet is added to database, before download/install completes
|
|
218
|
+
*/
|
|
219
|
+
const handleBlockletAdded = async (name, { blocklet, context }) => {
|
|
220
|
+
try {
|
|
221
|
+
const changed = await ensureBlockletRouting(blocklet, context);
|
|
222
|
+
if (changed) {
|
|
223
|
+
await handleBlockletRouting({
|
|
224
|
+
did: blocklet.meta.did,
|
|
225
|
+
message: 'Added blocklet (early routing setup)',
|
|
226
|
+
});
|
|
227
|
+
logger.info('early routing setup completed after added', { did: blocklet.meta.did });
|
|
228
|
+
}
|
|
229
|
+
} catch (error) {
|
|
230
|
+
// Non-blocking - don't fail the install if early routing setup fails
|
|
231
|
+
// It will be retried at installed event
|
|
232
|
+
logger.error('early routing setup failed after added', { event: name, did: blocklet.meta.did, error });
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
224
236
|
const handleBlockletInstall = async (name, { blocklet, context }) => {
|
|
225
237
|
try {
|
|
238
|
+
// Routing is already set up at 'added' event, but ensure it's complete
|
|
239
|
+
// This handles cases where 'added' handler failed or was skipped
|
|
226
240
|
const changed = await ensureBlockletRouting(blocklet, context);
|
|
227
241
|
if (changed) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
);
|
|
232
|
-
logger.info('created.url.mapping', { event: name, did: blocklet.meta.did, hash });
|
|
242
|
+
await handleBlockletRouting({
|
|
243
|
+
did: blocklet.meta.did,
|
|
244
|
+
message: 'Install blocklet',
|
|
245
|
+
});
|
|
233
246
|
}
|
|
234
247
|
|
|
235
248
|
await teamAPI.refreshBlockletInterfacePermissions(blocklet.meta);
|
|
236
249
|
logger.info('refreshed blocklet interface permissions after installed', { did: blocklet.meta.did });
|
|
237
250
|
|
|
251
|
+
// Send full DID document update after install to capture any info populated during installation
|
|
252
|
+
// The 'added' event sends an early document for DNS warm-up, but some metadata may be incomplete
|
|
238
253
|
try {
|
|
239
|
-
|
|
240
|
-
await updateDidDocument({ did: blocklet.appPid, nodeInfo, teamManager, states });
|
|
254
|
+
await updateDidDocument({ did: blocklet.appPid, nodeInfo: await node.getNodeInfo(), teamManager, states });
|
|
241
255
|
logger.info('updated blocklet DID document after install', { did: blocklet.meta.did });
|
|
242
256
|
} catch (error) {
|
|
243
|
-
logger.error('update blocklet DID document failed after install', { did: blocklet.meta.did, error });
|
|
257
|
+
logger.error('update blocklet DID document state failed after install', { did: blocklet.meta.did, error });
|
|
244
258
|
}
|
|
245
259
|
} catch (error) {
|
|
246
260
|
logger.error('create.url.mapping.error', { event: name, error });
|
|
@@ -262,25 +276,24 @@ module.exports = ({
|
|
|
262
276
|
|
|
263
277
|
try {
|
|
264
278
|
const changed = await removeBlockletRouting(blocklet, context);
|
|
265
|
-
|
|
266
279
|
if (changed) {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
280
|
+
await handleBlockletRouting({
|
|
281
|
+
did: blocklet.meta.did,
|
|
282
|
+
message: 'Remove blocklet',
|
|
283
|
+
isRemoval: true,
|
|
284
|
+
});
|
|
285
|
+
logger.info('remove blocklet routing rules', { event: name, did: blocklet.meta.did });
|
|
272
286
|
}
|
|
273
287
|
} catch (error) {
|
|
274
288
|
logger.error('remove blocklet routing rules error', { event: name, error });
|
|
275
289
|
}
|
|
276
290
|
|
|
277
291
|
try {
|
|
278
|
-
const nodeInfo = await node.getNodeInfo();
|
|
279
292
|
await updateDidDocumentStateOnly({
|
|
280
293
|
did: blocklet.appPid,
|
|
281
294
|
blocklet,
|
|
282
295
|
state: 'deleted',
|
|
283
|
-
nodeInfo,
|
|
296
|
+
nodeInfo: await node.getNodeInfo(),
|
|
284
297
|
});
|
|
285
298
|
logger.info('updated blocklet DID document state to deleted', { did: blocklet.meta.did });
|
|
286
299
|
} catch (error) {
|
|
@@ -303,11 +316,10 @@ module.exports = ({
|
|
|
303
316
|
|
|
304
317
|
const changed = await ensureBlockletRoutingForUpgrade(blocklet, context);
|
|
305
318
|
if (changed) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
);
|
|
310
|
-
logger.info('upgrade blocklet routing rules', { event: name, did: blocklet.meta.did, hash });
|
|
319
|
+
await handleBlockletRouting({
|
|
320
|
+
did: blocklet.meta.did,
|
|
321
|
+
message: 'Upgrade blocklet',
|
|
322
|
+
});
|
|
311
323
|
}
|
|
312
324
|
|
|
313
325
|
await teamAPI.refreshBlockletInterfacePermissions(blocklet.meta);
|
|
@@ -318,7 +330,7 @@ module.exports = ({
|
|
|
318
330
|
} catch (error) {
|
|
319
331
|
logger.error('upgrade blocklet routing rules error', { event: name, error });
|
|
320
332
|
|
|
321
|
-
rollbackBlockletSites({ blocklet, sites, backupFile,
|
|
333
|
+
rollbackBlockletSites({ blocklet, sites, backupFile, handleBlockletRouting, context })
|
|
322
334
|
.then(() => {
|
|
323
335
|
logger.info('rollback blocklet routing rules success', { event: name, did: blocklet.meta.did });
|
|
324
336
|
})
|
|
@@ -375,8 +387,11 @@ module.exports = ({
|
|
|
375
387
|
return;
|
|
376
388
|
}
|
|
377
389
|
|
|
378
|
-
if ([BlockletEvents.
|
|
379
|
-
await
|
|
390
|
+
if ([BlockletEvents.blueOrGreenStarted].includes(eventName)) {
|
|
391
|
+
await handleBlockletBlueOrGreenStarted(eventName, payload);
|
|
392
|
+
} else if ([BlockletEvents.added].includes(eventName)) {
|
|
393
|
+
// Non-blocking - don't await to avoid slowing down install flow
|
|
394
|
+
handleBlockletAdded(eventName, payload);
|
|
380
395
|
} else if ([BlockletEvents.installed].includes(eventName)) {
|
|
381
396
|
await handleBlockletInstall(eventName, payload);
|
|
382
397
|
|
|
@@ -425,20 +440,15 @@ module.exports = ({
|
|
|
425
440
|
}
|
|
426
441
|
}
|
|
427
442
|
} else if (BlockletEvents.appDidChanged === eventName) {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
);
|
|
432
|
-
|
|
433
|
-
logger.info('take snapshot after updated blocklet app', { event: eventName, did: blocklet.meta.did, hash });
|
|
443
|
+
await handleBlockletRouting({
|
|
444
|
+
did: blocklet.meta.did,
|
|
445
|
+
message: 'Update blocklet appDid',
|
|
446
|
+
});
|
|
434
447
|
} else if (BlockletEvents.spaceConnected === eventName) {
|
|
435
|
-
|
|
436
|
-
.
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
logger.error('Reload gateway failed on blocklet.connectedSpace', { error: err });
|
|
440
|
-
});
|
|
441
|
-
logger.info('Reload gateway after blocklet connected to space', { event: eventName, did: blocklet.appDid });
|
|
448
|
+
await handleBlockletRouting({
|
|
449
|
+
did: blocklet.meta.did,
|
|
450
|
+
message: 'Connect blocklet to DID Spaces',
|
|
451
|
+
});
|
|
442
452
|
} else if (BlockletEvents.backupProgress === eventName && payload?.completed) {
|
|
443
453
|
try {
|
|
444
454
|
const backupEndpoint = getBackupEndpoint(blocklet?.environments);
|
|
@@ -530,30 +540,22 @@ module.exports = ({
|
|
|
530
540
|
logger.error('monit runtime info failed', { eventName, error });
|
|
531
541
|
}
|
|
532
542
|
|
|
543
|
+
// Use state-only update for started/stopped - no need to send full document
|
|
533
544
|
if ([BlockletEvents.started, BlockletEvents.stopped].includes(eventName)) {
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
event: eventName,
|
|
547
|
-
error,
|
|
548
|
-
});
|
|
545
|
+
updateDidDocument({ did: blocklet.appPid, nodeInfo: await node.getNodeInfo(), teamManager, states })
|
|
546
|
+
.then(() => {
|
|
547
|
+
logger.info(`updated blocklet DID document on ${eventName}`, {
|
|
548
|
+
did: blocklet.meta.did,
|
|
549
|
+
event: eventName,
|
|
550
|
+
});
|
|
551
|
+
})
|
|
552
|
+
.catch((error) => {
|
|
553
|
+
logger.error(`update blocklet DID document failed on ${eventName}`, {
|
|
554
|
+
did: blocklet.meta.did,
|
|
555
|
+
event: eventName,
|
|
556
|
+
error,
|
|
549
557
|
});
|
|
550
|
-
} catch (error) {
|
|
551
|
-
logger.error('update blocklet DID document failed after state change', {
|
|
552
|
-
did: blocklet.meta.did,
|
|
553
|
-
event: eventName,
|
|
554
|
-
error,
|
|
555
558
|
});
|
|
556
|
-
}
|
|
557
559
|
}
|
|
558
560
|
}
|
|
559
561
|
|
|
@@ -683,7 +685,7 @@ module.exports = ({
|
|
|
683
685
|
BlockletEvents.nftConsumed,
|
|
684
686
|
|
|
685
687
|
BlockletEvents.configTheme,
|
|
686
|
-
BlockletEvents.
|
|
688
|
+
BlockletEvents.blueOrGreenStarted,
|
|
687
689
|
].forEach((eventName) => {
|
|
688
690
|
listen(blockletManager, eventName, handleBlockletEvent);
|
|
689
691
|
});
|
|
@@ -742,26 +744,25 @@ module.exports = ({
|
|
|
742
744
|
onEvent(EVENTS.NODE_UPDATED, { did: nodeInfo.did });
|
|
743
745
|
|
|
744
746
|
// We need update router on some fields change
|
|
745
|
-
const fields = ['enableWelcomePage'
|
|
747
|
+
const fields = ['enableWelcomePage'];
|
|
746
748
|
const shouldUpdateRouter = fields.some((x) => nodeInfo[x] !== oldInfo[x]);
|
|
747
749
|
if (shouldUpdateRouter) {
|
|
748
|
-
|
|
750
|
+
handleSystemRouting({ message: 'Server settings updated' }).catch((err) => {
|
|
749
751
|
logger.error('Handle routing failed on node.updated', { error: err });
|
|
750
752
|
});
|
|
751
753
|
}
|
|
752
754
|
});
|
|
753
755
|
|
|
754
756
|
listen(nodeState, EVENTS.NODE_MAINTAIN_PROGRESS, onEvent);
|
|
755
|
-
nodeState.on(EVENTS.RELOAD_GATEWAY, (
|
|
756
|
-
|
|
757
|
-
logger.error('Handle routing failed on
|
|
757
|
+
nodeState.on(EVENTS.RELOAD_GATEWAY, () => {
|
|
758
|
+
handleSystemRouting({ message: 'Reload gateway' }).catch((err) => {
|
|
759
|
+
logger.error('Handle routing failed on reload gateway', { error: err });
|
|
758
760
|
});
|
|
759
761
|
});
|
|
760
762
|
|
|
761
763
|
routerManager.on(EVENTS.UPDATE_DOMAIN_ALIAS, async (did) => {
|
|
762
764
|
if (did) {
|
|
763
|
-
|
|
764
|
-
updateDidDocument({ did, nodeInfo, teamManager, states })
|
|
765
|
+
updateDidDocument({ did, nodeInfo: await node.getNodeInfo(), teamManager, states })
|
|
765
766
|
.then(() => {
|
|
766
767
|
logger.info('Update did document successfully on update domain alias', { did });
|
|
767
768
|
})
|
|
@@ -794,6 +795,16 @@ module.exports = ({
|
|
|
794
795
|
|
|
795
796
|
listen(securityAPI, BlockletEvents.securityConfigUpdated, onEvent);
|
|
796
797
|
|
|
798
|
+
// Refresh router when security config changes to update static serving rules
|
|
799
|
+
// When access policy changes from/to PUBLIC, nginx config needs to be updated
|
|
800
|
+
listen(securityAPI, BlockletEvents.securityConfigUpdated, (eventName, data) => {
|
|
801
|
+
if (daemon) {
|
|
802
|
+
handleBlockletRouting({ did: data?.did, message: 'Security config changed' }).catch((err) => {
|
|
803
|
+
logger.error('Failed to refresh router after security config change', { error: err, did: data?.did });
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
});
|
|
807
|
+
|
|
797
808
|
Object.keys(TeamEvents).forEach((key) => {
|
|
798
809
|
listen(teamAPI, TeamEvents[key], onEvent);
|
|
799
810
|
});
|
|
@@ -827,7 +838,7 @@ module.exports = ({
|
|
|
827
838
|
if (daemon) {
|
|
828
839
|
const { handleEventBusEvent } = eventBusHandler({ states, teamManager, teamAPI });
|
|
829
840
|
eventHub.on(EVENT_BUS_EVENT, (data) => {
|
|
830
|
-
if (
|
|
841
|
+
if (isWorkerInstance()) {
|
|
831
842
|
return null;
|
|
832
843
|
}
|
|
833
844
|
return handleEventBusEvent(data);
|
package/lib/event/util.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const fs = require('fs');
|
|
3
3
|
const logger = require('@abtnode/logger')('@abtnode/core:event');
|
|
4
|
-
const { BLOCKLET_MODES } = require('@blocklet/constant');
|
|
5
4
|
|
|
6
5
|
const states = require('../states');
|
|
7
6
|
|
|
8
|
-
const routingSnapshotPrefix = (blocklet) => (blocklet.mode === BLOCKLET_MODES.DEVELOPMENT ? '[DEV] ' : '');
|
|
9
|
-
|
|
10
7
|
const backupBlockletSites = async (blocklet) => {
|
|
11
8
|
const sites = await states.site.getSitesByBlocklet(blocklet.meta.did);
|
|
12
9
|
let backupFile = null;
|
|
@@ -24,7 +21,7 @@ const backupBlockletSites = async (blocklet) => {
|
|
|
24
21
|
return { sites, backupFile };
|
|
25
22
|
};
|
|
26
23
|
|
|
27
|
-
const rollbackBlockletSites = async ({ blocklet, sites, backupFile,
|
|
24
|
+
const rollbackBlockletSites = async ({ blocklet, sites, backupFile, handleBlockletRouting }) => {
|
|
28
25
|
try {
|
|
29
26
|
let sitesToRestore = sites;
|
|
30
27
|
logger.info('rollback blocklet sites', { did: blocklet.meta.did, sites, backupFile });
|
|
@@ -41,15 +38,13 @@ const rollbackBlockletSites = async ({ blocklet, sites, backupFile, takeRoutingS
|
|
|
41
38
|
await Promise.all(promises);
|
|
42
39
|
logger.info('rollback blocklet sites rules success to database', { did: blocklet.meta.did, sites, backupFile });
|
|
43
40
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
context
|
|
50
|
-
);
|
|
41
|
+
// Trigger router reload after rollback
|
|
42
|
+
await handleBlockletRouting({
|
|
43
|
+
did: blocklet.meta.did,
|
|
44
|
+
message: 'Roll back sites rules',
|
|
45
|
+
});
|
|
51
46
|
|
|
52
|
-
logger.info('rollback blocklet sites success
|
|
47
|
+
logger.info('rollback blocklet sites success', { did: blocklet.meta.did });
|
|
53
48
|
} catch (error) {
|
|
54
49
|
logger.error('rollback blocklet sites error', { error, blocklet, sites, backupFile });
|
|
55
50
|
}
|
|
@@ -66,7 +61,6 @@ const cleanBlockletSitesBackup = (backupFile) => {
|
|
|
66
61
|
};
|
|
67
62
|
|
|
68
63
|
module.exports = {
|
|
69
|
-
routingSnapshotPrefix,
|
|
70
64
|
backupBlockletSites,
|
|
71
65
|
cleanBlockletSitesBackup,
|
|
72
66
|
rollbackBlockletSites,
|
package/lib/index.js
CHANGED
|
@@ -12,8 +12,7 @@ const { listProviders } = require('@abtnode/router-provider');
|
|
|
12
12
|
const { DEFAULT_CERTIFICATE_EMAIL, EVENTS } = require('@abtnode/constant');
|
|
13
13
|
const { CustomError } = require('@blocklet/error');
|
|
14
14
|
|
|
15
|
-
const {
|
|
16
|
-
const RoutingSnapshot = require('./states/routing-snapshot');
|
|
15
|
+
const { isWorkerInstance } = require('@abtnode/util/lib/pm2/is-instance-worker');
|
|
17
16
|
const BlockletManager = require('./blocklet/manager/disk');
|
|
18
17
|
const RouterManager = require('./router/manager');
|
|
19
18
|
const getRouterHelpers = require('./router/helper');
|
|
@@ -276,13 +275,6 @@ function ABTNode(options) {
|
|
|
276
275
|
|
|
277
276
|
// 4. init routing manager
|
|
278
277
|
const routerManager = new RouterManager({ certManager, dataDirs });
|
|
279
|
-
const routingSnapshot = new RoutingSnapshot({
|
|
280
|
-
baseDir: dataDirs.core,
|
|
281
|
-
getRoutingData: async () => {
|
|
282
|
-
const sites = await states.site.getSites();
|
|
283
|
-
return { sites };
|
|
284
|
-
},
|
|
285
|
-
});
|
|
286
278
|
|
|
287
279
|
const nodeAPI = new NodeAPI(states, options.nodeDid);
|
|
288
280
|
const passportAPI = new PassportAPI({ states, teamManager, nodeAPI, teamDid: options.nodeDid });
|
|
@@ -311,18 +303,17 @@ function ABTNode(options) {
|
|
|
311
303
|
|
|
312
304
|
const {
|
|
313
305
|
handleBlockletWafChange,
|
|
314
|
-
|
|
306
|
+
handleBlockletRouting,
|
|
307
|
+
handleSystemRouting,
|
|
308
|
+
handleAllRouting,
|
|
315
309
|
resetSiteByDid,
|
|
316
|
-
updateNodeRouting,
|
|
317
|
-
takeRoutingSnapshot,
|
|
318
310
|
getRoutingSites,
|
|
319
|
-
getSnapshotSites,
|
|
320
311
|
ensureDashboardRouting,
|
|
321
312
|
ensureBlockletRouting,
|
|
322
313
|
ensureBlockletRoutingForUpgrade,
|
|
323
314
|
removeBlockletRouting,
|
|
324
315
|
getCertificates,
|
|
325
|
-
|
|
316
|
+
getSitesFromState,
|
|
326
317
|
getRoutingCrons,
|
|
327
318
|
ensureWildcardCerts,
|
|
328
319
|
ensureServerlessCerts,
|
|
@@ -339,7 +330,6 @@ function ABTNode(options) {
|
|
|
339
330
|
getGatewayBlacklist,
|
|
340
331
|
} = getRouterHelpers({
|
|
341
332
|
dataDirs,
|
|
342
|
-
routingSnapshot,
|
|
343
333
|
routerManager,
|
|
344
334
|
blockletManager,
|
|
345
335
|
certManager,
|
|
@@ -351,7 +341,7 @@ function ABTNode(options) {
|
|
|
351
341
|
|
|
352
342
|
// Generate an on node ready callback
|
|
353
343
|
const onStatesReady = createStateReadyQueue({ states: states.allStates, options, dataDirs });
|
|
354
|
-
onStatesReady(createStateReadyHandler(
|
|
344
|
+
onStatesReady(createStateReadyHandler());
|
|
355
345
|
const domainStatus = new DomainStatus({ routerManager, states });
|
|
356
346
|
|
|
357
347
|
const isInitialized = async () => {
|
|
@@ -492,10 +482,9 @@ function ABTNode(options) {
|
|
|
492
482
|
cleanupDirtyMaintainState: states.node.cleanupDirtyMaintainState.bind(states.node),
|
|
493
483
|
updateNodeOwner: states.node.updateNodeOwner.bind(states.node),
|
|
494
484
|
updateNftHolder: states.node.updateNftHolder.bind(states.node),
|
|
495
|
-
updateNodeRouting,
|
|
496
485
|
isInitialized,
|
|
497
486
|
resetNode: (params, context) =>
|
|
498
|
-
resetNode({ params, context, blockletManager, routerManager,
|
|
487
|
+
resetNode({ params, context, blockletManager, routerManager, handleAllRouting, teamManager, certManager }),
|
|
499
488
|
updateNodeStatus: states.node.updateStatus.bind(states.node),
|
|
500
489
|
resetNodeStatus: states.node.resetStatus.bind(states.node),
|
|
501
490
|
|
|
@@ -727,10 +716,7 @@ function ABTNode(options) {
|
|
|
727
716
|
deleteRoutingRule,
|
|
728
717
|
getRoutingRuleById: states.site.getRuleById.bind(states.site),
|
|
729
718
|
getRoutingSites: (params, context) => getRoutingSites(params, context, { withDefaultCors: false }),
|
|
730
|
-
|
|
731
|
-
getSnapshotSites: (params, context) => getSnapshotSites(params, context, { withDefaultCors: false }),
|
|
732
|
-
takeRoutingSnapshot,
|
|
733
|
-
getSitesFromSnapshot,
|
|
719
|
+
getSitesFromState,
|
|
734
720
|
ensureDashboardRouting,
|
|
735
721
|
ensureWildcardCerts,
|
|
736
722
|
ensureServerlessCerts,
|
|
@@ -742,7 +728,10 @@ function ABTNode(options) {
|
|
|
742
728
|
|
|
743
729
|
getRoutingProviders: () => listProviders(dataDirs.router),
|
|
744
730
|
checkDomains: domainStatus.checkDomainsStatus.bind(domainStatus),
|
|
745
|
-
|
|
731
|
+
|
|
732
|
+
handleSystemRouting,
|
|
733
|
+
handleBlockletRouting,
|
|
734
|
+
handleAllRouting,
|
|
746
735
|
|
|
747
736
|
certManager,
|
|
748
737
|
updateCertificate: certManager.update.bind(certManager),
|
|
@@ -875,8 +864,8 @@ function ABTNode(options) {
|
|
|
875
864
|
ensureBlockletRouting,
|
|
876
865
|
ensureBlockletRoutingForUpgrade,
|
|
877
866
|
removeBlockletRouting,
|
|
878
|
-
|
|
879
|
-
|
|
867
|
+
handleBlockletRouting,
|
|
868
|
+
handleSystemRouting,
|
|
880
869
|
domainStatus,
|
|
881
870
|
teamAPI,
|
|
882
871
|
nodeAPI,
|
|
@@ -894,7 +883,7 @@ function ABTNode(options) {
|
|
|
894
883
|
const webhook = WebHook({ events, dataDirs, instance });
|
|
895
884
|
|
|
896
885
|
const initCron = async () => {
|
|
897
|
-
if (
|
|
886
|
+
if (isWorkerInstance()) {
|
|
898
887
|
return;
|
|
899
888
|
}
|
|
900
889
|
Cron.init({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { SLOT_FOR_IP_DNS_SITE } = require('@abtnode/constant');
|
|
2
2
|
|
|
3
|
-
module.exports = async ({ states,
|
|
3
|
+
module.exports = async ({ states, printInfo }) => {
|
|
4
4
|
printInfo('Migrate ip dns site for blocklet...');
|
|
5
5
|
|
|
6
6
|
const sites = await states.site.getSites();
|
|
@@ -24,11 +24,7 @@ module.exports = async ({ states, node, printInfo }) => {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
if (changed) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
dryRun: false,
|
|
30
|
-
handleRouting: false,
|
|
31
|
-
});
|
|
32
|
-
printInfo('Take routing snapshot');
|
|
27
|
+
// Note: Routing snapshots have been removed
|
|
28
|
+
printInfo('Migration completed (routing snapshots removed)');
|
|
33
29
|
}
|
|
34
30
|
};
|
|
@@ -57,7 +57,7 @@ const mergeSite = (newSite, oldSite) => {
|
|
|
57
57
|
});
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
-
module.exports = async ({ states,
|
|
60
|
+
module.exports = async ({ states, printInfo }) => {
|
|
61
61
|
printInfo('Migrate site to 2.0 version for router...\n');
|
|
62
62
|
|
|
63
63
|
const sites = await states.site.getSites();
|
|
@@ -175,11 +175,7 @@ module.exports = async ({ states, node, printInfo }) => {
|
|
|
175
175
|
printInfo(`Add site to db: ${site.domain}`);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
|
|
179
|
-
message: 'Migrate site to 2.0 version for router',
|
|
180
|
-
dryRun: false,
|
|
181
|
-
handleRouting: false,
|
|
182
|
-
});
|
|
178
|
+
// Note: Routing snapshots have been removed
|
|
183
179
|
printInfo('\n');
|
|
184
|
-
printInfo('
|
|
180
|
+
printInfo('Migration completed (routing snapshots removed)');
|
|
185
181
|
};
|
|
@@ -10,11 +10,17 @@ const { BlockletStatus } = require('@blocklet/constant');
|
|
|
10
10
|
const defaultLogger = require('@abtnode/logger')('blocklet-runtime-monitor');
|
|
11
11
|
|
|
12
12
|
const { Op } = require('sequelize');
|
|
13
|
-
const {
|
|
13
|
+
const { isWorkerInstance } = require('@abtnode/util/lib/pm2/is-instance-worker');
|
|
14
14
|
const { getRuntimeInfo } = require('../util/blocklet');
|
|
15
15
|
|
|
16
16
|
const insertThrottleMap = new Map();
|
|
17
17
|
|
|
18
|
+
const isRuntimeMonitorDisabled = () => {
|
|
19
|
+
const value = process.env.ABT_NODE_RUNTIME_MONITOR_DISABLED;
|
|
20
|
+
// Disabled when set to '1' or 'true', enabled when '0', 'false', or unset
|
|
21
|
+
return value === '1' || value === 'true';
|
|
22
|
+
};
|
|
23
|
+
|
|
18
24
|
class BlockletRuntimeMonitor extends EventEmitter {
|
|
19
25
|
constructor({ states, logger = defaultLogger } = {}) {
|
|
20
26
|
super();
|
|
@@ -29,6 +35,10 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
async getHistory(blockletDid, hours = 1) {
|
|
38
|
+
if (isRuntimeMonitorDisabled()) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
|
|
32
42
|
const result = await this.states.runtimeInsight.model.findAll({
|
|
33
43
|
where: {
|
|
34
44
|
did: {
|
|
@@ -53,6 +63,10 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
53
63
|
* @memberof BlockletRuntimeMonitor
|
|
54
64
|
*/
|
|
55
65
|
getRuntimeInfo(blockletDid, componentId = 'app') {
|
|
66
|
+
if (isRuntimeMonitorDisabled()) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
56
70
|
if (!this.data[blockletDid]) {
|
|
57
71
|
return null;
|
|
58
72
|
}
|
|
@@ -65,11 +79,19 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
65
79
|
}
|
|
66
80
|
|
|
67
81
|
async monit(did) {
|
|
82
|
+
if (isRuntimeMonitorDisabled()) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
68
86
|
const blocklet = await this.states.blocklet.getBlocklet(did);
|
|
69
87
|
await this._monit(blocklet);
|
|
70
88
|
}
|
|
71
89
|
|
|
72
90
|
async _monit(blocklet, { addToHistory } = {}) {
|
|
91
|
+
if (isRuntimeMonitorDisabled()) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
73
95
|
const {
|
|
74
96
|
meta: { did: blockletDid },
|
|
75
97
|
status,
|
|
@@ -160,6 +182,10 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
160
182
|
}
|
|
161
183
|
|
|
162
184
|
async monitAll() {
|
|
185
|
+
if (isRuntimeMonitorDisabled()) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
|
|
163
189
|
if (this.inProgress) {
|
|
164
190
|
this.logger.debug('monitoring is in progress');
|
|
165
191
|
return;
|
|
@@ -198,11 +224,16 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
198
224
|
}
|
|
199
225
|
|
|
200
226
|
async getBlockletRuntimeInfo(blockletDid) {
|
|
201
|
-
|
|
202
|
-
|
|
227
|
+
if (isRuntimeMonitorDisabled()) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
203
230
|
|
|
204
|
-
const
|
|
231
|
+
const blocklet = await this.states.blocklet.getBlocklet(blockletDid);
|
|
232
|
+
if (!blocklet) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
205
235
|
|
|
236
|
+
const info = this.getRuntimeInfo(blockletDid);
|
|
206
237
|
if (blocklet && !info) {
|
|
207
238
|
await this._monit(blocklet, { addToHistory: false }).catch((err) => {
|
|
208
239
|
this.logger.error('failed to get blocklet runtime info', { error: err });
|
|
@@ -217,7 +248,7 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
217
248
|
}
|
|
218
249
|
|
|
219
250
|
_push(blockletDid, value) {
|
|
220
|
-
if (
|
|
251
|
+
if (isWorkerInstance()) {
|
|
221
252
|
return Promise.resolve();
|
|
222
253
|
}
|
|
223
254
|
|
|
@@ -246,3 +277,4 @@ class BlockletRuntimeMonitor extends EventEmitter {
|
|
|
246
277
|
}
|
|
247
278
|
|
|
248
279
|
module.exports.BlockletRuntimeMonitor = BlockletRuntimeMonitor;
|
|
280
|
+
module.exports.isRuntimeMonitorDisabled = isRuntimeMonitorDisabled;
|