@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.
Files changed (41) hide show
  1. package/lib/blocklet/manager/disk.js +150 -36
  2. package/lib/blocklet/manager/ensure-blocklet-running.js +1 -1
  3. package/lib/blocklet/manager/helper/blue-green-start-blocklet.js +1 -1
  4. package/lib/blocklet/manager/helper/install-application-from-general.js +2 -3
  5. package/lib/blocklet/manager/helper/install-component-from-url.js +7 -4
  6. package/lib/blocklet/migration-dist/migration.cjs +5 -4
  7. package/lib/blocklet/passport/index.js +10 -3
  8. package/lib/blocklet/project/index.js +7 -2
  9. package/lib/blocklet/security/index.js +2 -2
  10. package/lib/cert.js +6 -3
  11. package/lib/event/index.js +98 -87
  12. package/lib/event/util.js +7 -13
  13. package/lib/index.js +18 -27
  14. package/lib/migrations/1.17.7-beta-2025122601-settings-authentication.js +19 -0
  15. package/lib/migrations/1.5.0-site.js +3 -7
  16. package/lib/migrations/1.5.15-site.js +3 -7
  17. package/lib/monitor/blocklet-runtime-monitor.js +37 -5
  18. package/lib/monitor/node-runtime-monitor.js +4 -4
  19. package/lib/router/helper.js +525 -452
  20. package/lib/router/index.js +280 -104
  21. package/lib/router/manager.js +14 -28
  22. package/lib/states/audit-log.js +6 -3
  23. package/lib/states/blocklet-child.js +93 -1
  24. package/lib/states/blocklet-extras.js +1 -1
  25. package/lib/states/blocklet.js +429 -197
  26. package/lib/states/node.js +0 -10
  27. package/lib/states/site.js +87 -4
  28. package/lib/team/manager.js +2 -21
  29. package/lib/util/blocklet.js +71 -37
  30. package/lib/util/get-accessible-external-node-ip.js +21 -6
  31. package/lib/util/index.js +3 -3
  32. package/lib/util/ip.js +15 -1
  33. package/lib/util/launcher.js +11 -11
  34. package/lib/util/ready.js +2 -9
  35. package/lib/util/reset-node.js +6 -5
  36. package/lib/validators/router.js +0 -3
  37. package/lib/webhook/sender/api/index.js +5 -0
  38. package/package.json +35 -37
  39. package/lib/migrations/1.0.36-snapshot.js +0 -10
  40. package/lib/migrations/1.1.9-snapshot.js +0 -7
  41. package/lib/states/routing-snapshot.js +0 -146
@@ -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 { isInstanceWorker } = require('@abtnode/util/lib/pm2/is-instance-worker');
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
- takeRoutingSnapshot,
70
- handleRouting,
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 (isInstanceWorker()) {
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 (isInstanceWorker()) {
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 handleBlockletBlurOrGreenStarted = async (name, { blocklet, componentDids, context }) => {
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
- const hash = await takeRoutingSnapshot(
200
- {
201
- message: `${routingSnapshotPrefix(blocklet)}Blur or green start blocklet ${blocklet.meta.name}`,
202
- dryRun: false,
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
- const hash = await takeRoutingSnapshot(
229
- { message: `${routingSnapshotPrefix(blocklet)}Install blocklet ${blocklet.meta.name}`, dryRun: false },
230
- context
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
- const nodeInfo = await node.getNodeInfo();
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
- const hash = await takeRoutingSnapshot(
268
- { message: `${routingSnapshotPrefix(blocklet)}Remove blocklet ${blocklet.meta.name}`, dryRun: false },
269
- context
270
- );
271
- logger.info('remove blocklet routing rules', { event: name, did: blocklet.meta.did, hash });
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
- const hash = await takeRoutingSnapshot(
307
- { message: `${routingSnapshotPrefix(blocklet)}Upgrade blocklet ${blocklet.meta.name}`, dryRun: false },
308
- context
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, takeRoutingSnapshot, context })
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.blurOrGreenStarted].includes(eventName)) {
379
- await handleBlockletBlurOrGreenStarted(eventName, payload);
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
- const hash = await takeRoutingSnapshot(
429
- { message: `${routingSnapshotPrefix(blocklet)}Update blocklet ${blocklet.meta.name} app did`, dryRun: false },
430
- get(payload, 'context') || {}
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
- nodeState
436
- .read()
437
- .then((info) => handleRouting(info))
438
- .catch((err) => {
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
- try {
535
- const nodeInfo = await node.getNodeInfo();
536
- updateDidDocument({ did: blocklet.appPid, nodeInfo, teamManager, states })
537
- .then(() => {
538
- logger.info('updated blocklet DID document after state change', {
539
- did: blocklet.meta.did,
540
- event: eventName,
541
- });
542
- })
543
- .catch((error) => {
544
- logger.error('update blocklet DID document failed after state change', {
545
- did: blocklet.meta.did,
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.blurOrGreenStarted,
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', 'webWalletUrl', 'registerUrl'];
747
+ const fields = ['enableWelcomePage'];
746
748
  const shouldUpdateRouter = fields.some((x) => nodeInfo[x] !== oldInfo[x]);
747
749
  if (shouldUpdateRouter) {
748
- handleRouting(nodeInfo).catch((err) => {
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, (nodeInfo) => {
756
- handleRouting(nodeInfo).catch((err) => {
757
- logger.error('Handle routing failed on node.updated', { error: err });
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
- const nodeInfo = await node.getNodeInfo();
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 (isInstanceWorker()) {
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, takeRoutingSnapshot, context }) => {
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
- const hash = await takeRoutingSnapshot(
45
- {
46
- message: `${routingSnapshotPrefix(blocklet)}Roll back sites rules for blocklet ${blocklet.meta.name}`,
47
- dryRun: false,
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 to snapshot', { did: blocklet.meta.did, hash });
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 { isInstanceWorker } = require('@abtnode/util/lib/pm2/is-instance-worker');
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
- handleRouting,
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
- getSitesFromSnapshot,
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(routingSnapshot));
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
- configOAuth: blockletManager.configOAuth.bind(blockletManager),
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, takeRoutingSnapshot, teamManager, certManager }),
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
- getRoutingSnapshots: routingSnapshot.listSnapshots.bind(routingSnapshot),
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
- handleRouting,
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
- takeRoutingSnapshot,
877
- handleRouting,
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 (isInstanceWorker()) {
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, node, printInfo }) => {
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
- await node.takeRoutingSnapshot({
28
- message: 'Migrate ip dns site for blocklet',
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, node, printInfo }) => {
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
- await node.takeRoutingSnapshot({
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('Take routing snapshot');
180
+ printInfo('Migration completed (routing snapshots removed)');
185
181
  };