@abtnode/core 1.17.7-beta-20251225-073259-cb6ecf68 → 1.17.7-beta-20251229-085620-84f09930
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 +150 -36
- 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 +18 -27
- package/lib/migrations/1.17.7-beta-2025122601-settings-authentication.js +19 -0
- 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/audit-log.js +6 -3
- 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 +71 -37
- 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 +35 -37
- 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 () => {
|
|
@@ -401,7 +391,9 @@ function ABTNode(options) {
|
|
|
401
391
|
deleteBlockletProcess: blockletManager.deleteProcess.bind(blockletManager),
|
|
402
392
|
configNavigations: blockletManager.configNavigations.bind(blockletManager),
|
|
403
393
|
configTheme: blockletManager.configTheme.bind(blockletManager),
|
|
404
|
-
|
|
394
|
+
configAuthentication: blockletManager.configAuthentication.bind(blockletManager),
|
|
395
|
+
migrateBlockletAuthentication: blockletManager.migrateBlockletAuthentication.bind(blockletManager),
|
|
396
|
+
configDidConnect: blockletManager.configDidConnect.bind(blockletManager),
|
|
405
397
|
joinFederatedLogin: blockletManager.joinFederatedLogin.bind(blockletManager),
|
|
406
398
|
quitFederatedLogin: blockletManager.quitFederatedLogin.bind(blockletManager),
|
|
407
399
|
disbandFederatedLogin: blockletManager.disbandFederatedLogin.bind(blockletManager),
|
|
@@ -490,10 +482,9 @@ function ABTNode(options) {
|
|
|
490
482
|
cleanupDirtyMaintainState: states.node.cleanupDirtyMaintainState.bind(states.node),
|
|
491
483
|
updateNodeOwner: states.node.updateNodeOwner.bind(states.node),
|
|
492
484
|
updateNftHolder: states.node.updateNftHolder.bind(states.node),
|
|
493
|
-
updateNodeRouting,
|
|
494
485
|
isInitialized,
|
|
495
486
|
resetNode: (params, context) =>
|
|
496
|
-
resetNode({ params, context, blockletManager, routerManager,
|
|
487
|
+
resetNode({ params, context, blockletManager, routerManager, handleAllRouting, teamManager, certManager }),
|
|
497
488
|
updateNodeStatus: states.node.updateStatus.bind(states.node),
|
|
498
489
|
resetNodeStatus: states.node.resetStatus.bind(states.node),
|
|
499
490
|
|
|
@@ -725,10 +716,7 @@ function ABTNode(options) {
|
|
|
725
716
|
deleteRoutingRule,
|
|
726
717
|
getRoutingRuleById: states.site.getRuleById.bind(states.site),
|
|
727
718
|
getRoutingSites: (params, context) => getRoutingSites(params, context, { withDefaultCors: false }),
|
|
728
|
-
|
|
729
|
-
getSnapshotSites: (params, context) => getSnapshotSites(params, context, { withDefaultCors: false }),
|
|
730
|
-
takeRoutingSnapshot,
|
|
731
|
-
getSitesFromSnapshot,
|
|
719
|
+
getSitesFromState,
|
|
732
720
|
ensureDashboardRouting,
|
|
733
721
|
ensureWildcardCerts,
|
|
734
722
|
ensureServerlessCerts,
|
|
@@ -740,7 +728,10 @@ function ABTNode(options) {
|
|
|
740
728
|
|
|
741
729
|
getRoutingProviders: () => listProviders(dataDirs.router),
|
|
742
730
|
checkDomains: domainStatus.checkDomainsStatus.bind(domainStatus),
|
|
743
|
-
|
|
731
|
+
|
|
732
|
+
handleSystemRouting,
|
|
733
|
+
handleBlockletRouting,
|
|
734
|
+
handleAllRouting,
|
|
744
735
|
|
|
745
736
|
certManager,
|
|
746
737
|
updateCertificate: certManager.update.bind(certManager),
|
|
@@ -873,8 +864,8 @@ function ABTNode(options) {
|
|
|
873
864
|
ensureBlockletRouting,
|
|
874
865
|
ensureBlockletRoutingForUpgrade,
|
|
875
866
|
removeBlockletRouting,
|
|
876
|
-
|
|
877
|
-
|
|
867
|
+
handleBlockletRouting,
|
|
868
|
+
handleSystemRouting,
|
|
878
869
|
domainStatus,
|
|
879
870
|
teamAPI,
|
|
880
871
|
nodeAPI,
|
|
@@ -892,7 +883,7 @@ function ABTNode(options) {
|
|
|
892
883
|
const webhook = WebHook({ events, dataDirs, instance });
|
|
893
884
|
|
|
894
885
|
const initCron = async () => {
|
|
895
|
-
if (
|
|
886
|
+
if (isWorkerInstance()) {
|
|
896
887
|
return;
|
|
897
888
|
}
|
|
898
889
|
Cron.init({
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const pAll = require('p-all');
|
|
2
|
+
|
|
3
|
+
module.exports = async ({ node, states, printInfo }) => {
|
|
4
|
+
printInfo('Try to update blocklet settings...');
|
|
5
|
+
const apps = await states.blocklet.find();
|
|
6
|
+
await pAll(
|
|
7
|
+
apps.map((app) => async () => {
|
|
8
|
+
const blockletDid = app.meta.did;
|
|
9
|
+
try {
|
|
10
|
+
await node.migrateBlockletAuthentication({ did: blockletDid });
|
|
11
|
+
} catch (err) {
|
|
12
|
+
console.error(`Failed to update blocklet settings: ${blockletDid}`);
|
|
13
|
+
throw err;
|
|
14
|
+
}
|
|
15
|
+
printInfo(`Blocklet settings updated: ${app.meta?.title}`);
|
|
16
|
+
}),
|
|
17
|
+
{ concurrency: 10 }
|
|
18
|
+
);
|
|
19
|
+
};
|
|
@@ -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
|
};
|