@abtnode/core 1.16.13-beta-90ded76f → 1.16.13-beta-ef672597

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.
@@ -458,10 +458,37 @@ class BlockletManager extends BaseBlockletManager {
458
458
  return { did, isInstalled: !!blocklet, isRunning };
459
459
  }
460
460
 
461
- async start({ did, throwOnError, checkHealthImmediately = false, e2eMode = false, componentDids }, context) {
461
+ async start(
462
+ { did, throwOnError, checkHealthImmediately = false, e2eMode = false, componentDids: inputComponentDids, atomic },
463
+ context
464
+ ) {
465
+ const blocklet = await this.ensureBlocklet(did, { e2eMode });
466
+
467
+ if (atomic || !blocklet.structVersion) {
468
+ return this._start(
469
+ { did, throwOnError, checkHealthImmediately, e2eMode, componentDids: inputComponentDids },
470
+ context
471
+ );
472
+ }
473
+
474
+ const componentDids = inputComponentDids?.length ? inputComponentDids : blocklet.children.map((x) => x.meta.did);
475
+
476
+ const tasks = componentDids.map((componentDid) =>
477
+ this._start({ did, throwOnError, checkHealthImmediately, e2eMode, componentDids: [componentDid] }, context)
478
+ );
479
+
480
+ return Promise.any(tasks).catch((err) => {
481
+ throw new Error(err.errors.join(', '));
482
+ });
483
+ }
484
+
485
+ async _start(
486
+ { blocklet: inputBlocklet, did, throwOnError, checkHealthImmediately = false, e2eMode = false, componentDids },
487
+ context
488
+ ) {
462
489
  logger.info('start blocklet', { did, componentDids, throwOnError, checkHealthImmediately, e2eMode });
463
490
  // should check blocklet integrity
464
- const blocklet1 = await this.ensureBlocklet(did, { e2eMode });
491
+ const blocklet1 = inputBlocklet || (await this.ensureBlocklet(did, { e2eMode }));
465
492
 
466
493
  await this.checkControllerStatus(blocklet1, 'start');
467
494
 
@@ -485,9 +512,9 @@ class BlockletManager extends BaseBlockletManager {
485
512
  // blocklet may be manually stopped durning starting
486
513
  // so error message would not be sent if blocklet is stopped
487
514
  // so we need update status first
488
- await states.blocklet.setBlockletStatus(did, BlockletStatus.starting, { componentDids });
515
+ const doc1 = await states.blocklet.setBlockletStatus(did, BlockletStatus.starting, { componentDids });
489
516
  blocklet1.status = BlockletStatus.starting;
490
- this.emit(BlockletEvents.statusChange, blocklet1);
517
+ this.emit(BlockletEvents.statusChange, doc1);
491
518
 
492
519
  if (blocklet1.mode === BLOCKLET_MODES.DEVELOPMENT) {
493
520
  const { logsDir } = blocklet1.env;
@@ -569,6 +596,7 @@ class BlockletManager extends BaseBlockletManager {
569
596
  await this.deleteProcess({ did, componentDids });
570
597
  const res = await states.blocklet.setBlockletStatus(did, BlockletStatus.error, { componentDids });
571
598
  this.emit(BlockletEvents.startFailed, { ...res, error: { message: error.message } });
599
+ this.emit(BlockletEvents.statusChange, { ...res, error: { message: error.message } });
572
600
 
573
601
  if (throwOnError) {
574
602
  throw new Error(description);
@@ -585,9 +613,9 @@ class BlockletManager extends BaseBlockletManager {
585
613
  const { processId } = blocklet.env;
586
614
 
587
615
  if (updateStatus) {
588
- await states.blocklet.setBlockletStatus(did, BlockletStatus.stopping, { componentDids });
616
+ const doc = await states.blocklet.setBlockletStatus(did, BlockletStatus.stopping, { componentDids });
589
617
  blocklet.status = BlockletStatus.stopping;
590
- this.emit(BlockletEvents.statusChange, blocklet);
618
+ this.emit(BlockletEvents.statusChange, doc);
591
619
  }
592
620
 
593
621
  try {
@@ -1994,6 +2022,7 @@ class BlockletManager extends BaseBlockletManager {
1994
2022
  components: getComponentsInternalInfo(res),
1995
2023
  });
1996
2024
 
2025
+ this.emit(BlockletEvents.statusChange, res);
1997
2026
  this.emit(BlockletEvents.started, res);
1998
2027
  logger.info('blocklet healthy', { did, name, time: Date.now() - startedAt });
1999
2028
  } catch (error) {
@@ -2006,7 +2035,7 @@ class BlockletManager extends BaseBlockletManager {
2006
2035
  logger.error('check blocklet if started failed', { did, name, context, timeout, error });
2007
2036
 
2008
2037
  await this.deleteProcess({ did, componentDids }, context);
2009
- await states.blocklet.setBlockletStatus(did, BlockletStatus.error, { componentDids });
2038
+ const doc = await states.blocklet.setBlockletStatus(did, BlockletStatus.error, { componentDids });
2010
2039
 
2011
2040
  this._createNotification(did, {
2012
2041
  title: 'Blocklet Start Failed',
@@ -2017,6 +2046,7 @@ class BlockletManager extends BaseBlockletManager {
2017
2046
  });
2018
2047
 
2019
2048
  this.emit(BlockletEvents.startFailed, { meta, error });
2049
+ this.emit(BlockletEvents.statusChange, { ...doc, error });
2020
2050
 
2021
2051
  if (throwOnError) {
2022
2052
  throw error;
@@ -25,6 +25,7 @@ const { BaseRestore } = require('./base');
25
25
  const { BlockletExtrasRestore } = require('./blocklet-extras');
26
26
  const { BlockletRestore } = require('./blocklet');
27
27
  const { BlockletsRestore } = require('./blocklets');
28
+ const states = require('../../../states');
28
29
 
29
30
  class SpacesRestore extends BaseRestore {
30
31
  /**
@@ -105,6 +106,11 @@ class SpacesRestore extends BaseRestore {
105
106
 
106
107
  async syncFromSpaces() {
107
108
  const { endpoint, wallet, delegation } = this.input;
109
+ /**
110
+ * @type {import('@abtnode/client').NodeState}
111
+ */
112
+ const node = await states.node.read();
113
+ const serverDid = node.did;
108
114
 
109
115
  const spaceClient = new SpaceClient({
110
116
  endpoint,
@@ -131,6 +137,7 @@ class SpacesRestore extends BaseRestore {
131
137
 
132
138
  userDid: this.input.userDid,
133
139
  referrer: this.input.referrer,
140
+ serverDid,
134
141
  })
135
142
  );
136
143
 
@@ -19,7 +19,7 @@ const downloadFile = require('@abtnode/util/lib/download-file');
19
19
  const { updateBlockletDocument } = require('@abtnode/util/lib/did-document');
20
20
  const getBlockletInfo = require('@blocklet/meta/lib/info');
21
21
  const { forEachBlockletSync } = require('@blocklet/meta/lib/util');
22
- const { processLogByDate } = require('@abtnode/insights');
22
+ const { processLogByDate } = require('@abtnode/analytics');
23
23
  const {
24
24
  DOMAIN_FOR_DEFAULT_SITE,
25
25
  DOMAIN_FOR_IP_SITE_REGEXP,
@@ -39,6 +39,7 @@ const {
39
39
  WELLKNOWN_ACME_CHALLENGE_PREFIX,
40
40
  WELLKNOWN_DID_RESOLVER_PREFIX,
41
41
  WELLKNOWN_PING_PREFIX,
42
+ WELLKNOWN_ANALYTICS_PREFIX,
42
43
  LOG_RETAIN_IN_DAYS,
43
44
  EVENTS,
44
45
  DEFAULT_IP_DOMAIN,
@@ -54,8 +55,9 @@ const {
54
55
  BLOCKLET_MODES,
55
56
  } = require('@blocklet/constant');
56
57
 
57
- // eslint-disable-next-line global-require
58
- const logger = require('@abtnode/logger')(`${require('../../package.json').name}:router:helper`);
58
+ const pkg = require('../../package.json');
59
+ // eslint-disable-next-line
60
+ const logger = require('@abtnode/logger')(`${pkg.name}:router:helper`);
59
61
  const {
60
62
  getProviderFromNodeInfo,
61
63
  getHttpsCertInfo,
@@ -79,6 +81,32 @@ const isServiceFeDevelopment = process.env.ABT_NODE_SERVICE_FE_PORT;
79
81
 
80
82
  const hasRuleByPrefix = (site, value) => site.rules.find((x) => x.isProtected && get(x, 'from.pathPrefix') === value);
81
83
 
84
+ const pingWellknownRule = {
85
+ isProtected: true,
86
+ from: { pathPrefix: WELLKNOWN_PING_PREFIX },
87
+ to: {
88
+ type: ROUTING_RULE_TYPES.DIRECT_RESPONSE,
89
+ response: {
90
+ status: 200,
91
+ contentType: 'application/javascript',
92
+ body: "'pong'",
93
+ },
94
+ },
95
+ };
96
+
97
+ const analyticsWellknownRule = {
98
+ isProtected: true,
99
+ from: { pathPrefix: WELLKNOWN_ANALYTICS_PREFIX },
100
+ to: {
101
+ type: ROUTING_RULE_TYPES.DIRECT_RESPONSE,
102
+ response: {
103
+ status: 200,
104
+ contentType: 'text/html',
105
+ body: pkg.version,
106
+ },
107
+ },
108
+ };
109
+
82
110
  /**
83
111
  * replace 888-888-888-888 with accessible ip for domain
84
112
  */
@@ -796,46 +824,12 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
796
824
  to: proxyTarget,
797
825
  };
798
826
 
799
- const pingWellknownRule = {
800
- isProtected: true,
801
- from: { pathPrefix: WELLKNOWN_PING_PREFIX },
802
- to: {
803
- type: ROUTING_RULE_TYPES.DIRECT_RESPONSE,
804
- response: {
805
- status: 200,
806
- contentType: 'application/javascript',
807
- body: "'pong'",
808
- },
809
- port: info.port,
810
- },
811
- };
812
-
813
827
  if (site) {
814
- const didResolverRuleUpdateRes = await upsertSiteRule(
815
- {
816
- site,
817
- rule: didResolverWellknownRule,
818
- },
819
- context
820
- );
821
-
822
- const acmeRuleUpdateRes = await upsertSiteRule(
823
- {
824
- site,
825
- rule: acmeChallengeWellknownRule,
826
- },
827
- context
828
- );
829
-
830
- const pingRuleRes = await upsertSiteRule(
831
- {
832
- site,
833
- rule: pingWellknownRule,
834
- },
835
- context
836
- );
837
-
838
- return didResolverRuleUpdateRes || acmeRuleUpdateRes || pingRuleRes;
828
+ const didResolverRuleUpdateRes = await upsertSiteRule({ site, rule: didResolverWellknownRule }, context);
829
+ const acmeRuleUpdateRes = await upsertSiteRule({ site, rule: acmeChallengeWellknownRule }, context);
830
+ const pingRuleRes = await upsertSiteRule({ site, rule: pingWellknownRule }, context);
831
+ const analyticsRuleRes = await upsertSiteRule({ site, rule: analyticsWellknownRule }, context);
832
+ return didResolverRuleUpdateRes || acmeRuleUpdateRes || pingRuleRes || analyticsRuleRes;
839
833
  }
840
834
 
841
835
  await routerManager.addRoutingSite(
@@ -844,7 +838,7 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
844
838
  domain: DOMAIN_FOR_INTERNAL_SITE,
845
839
  port: await getWellknownSitePort(),
846
840
  name: NAME_FOR_WELLKNOWN_SITE,
847
- rules: [didResolverWellknownRule, acmeChallengeWellknownRule, pingWellknownRule],
841
+ rules: [didResolverWellknownRule, acmeChallengeWellknownRule, pingWellknownRule, analyticsWellknownRule],
848
842
  isProtected: true,
849
843
  },
850
844
  skipCheckDynamicBlacklist: true,
@@ -911,13 +905,19 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
911
905
 
912
906
  try {
913
907
  const result = await siteState.update({ id: dashboardSite.id }, { $set: { domainAliases } });
914
-
915
908
  updatedResult.push(result);
916
909
  } catch (error) {
917
910
  logger.error('add dashboard domain rule failed', { error });
918
911
  console.error('Add dashboard domain rule failed:', error);
919
912
  }
920
913
 
914
+ try {
915
+ const result = await upsertSiteRule({ site: dashboardSite, rule: analyticsWellknownRule }, context);
916
+ updatedResult.push(result);
917
+ } catch (error) {
918
+ logger.error('add dashboard analytics rule failed', { error });
919
+ }
920
+
921
921
  const defaultRule = sites.find((x) => x.domain === DOMAIN_FOR_DEFAULT_SITE);
922
922
  if (!defaultRule) {
923
923
  try {
@@ -1293,7 +1293,9 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1293
1293
  }
1294
1294
 
1295
1295
  const groups = [];
1296
- const server = sites.find((x) => x.domainAliases.some((a) => a.value === DOMAIN_FOR_IP_SITE));
1296
+ const server = sites.find((x) =>
1297
+ x.rules.some((rule) => rule.to.type === ROUTING_RULE_TYPES.DAEMON && rule.to.did === info.did)
1298
+ );
1297
1299
  if (server) {
1298
1300
  groups.push({
1299
1301
  did: info.did,
@@ -1312,12 +1314,13 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1312
1314
  hosts: site.domainAliases.map((d) => d.value).filter(Boolean),
1313
1315
  });
1314
1316
  });
1317
+ logger.info('Prepare analyze router logs', groups);
1315
1318
 
1316
1319
  const logDir = providers[providerName].getLogDir();
1317
- const doAnalyze = async (date) => {
1318
- logger.info('Start analyze router logs', { date, groups, logDir });
1320
+ const doAnalyze = async (date, groupsRaw) => {
1321
+ logger.info('Start analyze router logs', { date });
1319
1322
  try {
1320
- let results = await processLogByDate(logDir, dataDirs.tmp, dataDirs.data, date, groups);
1323
+ let results = await processLogByDate(logDir, dataDirs.tmp, dataDirs.data, date, groupsRaw);
1321
1324
  logger.info('Done analyze router logs', { date, results });
1322
1325
 
1323
1326
  results = await Promise.all(
@@ -1328,7 +1331,6 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1328
1331
  );
1329
1332
  logger.info('Done insert insight results', { date, results });
1330
1333
  } catch (err) {
1331
- console.error(err);
1332
1334
  logger.error('Failed to analyze router logs', { date, error: err });
1333
1335
  }
1334
1336
  };
@@ -1337,13 +1339,13 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1337
1339
  if (fs.existsSync(analyzeLock)) {
1338
1340
  // FIXME: @wangshijun how do we support real time logs
1339
1341
  const date = dayjs().subtract(1, 'day').format('YYYY-MM-DD');
1340
- await doAnalyze(date);
1342
+ await doAnalyze(date, cloneDeep(groups));
1341
1343
  } else {
1342
1344
  fs.writeFileSync(analyzeLock, '1');
1343
1345
  for (let i = 1; i <= 30; i++) {
1344
1346
  const date = dayjs().subtract(i, 'day').format('YYYY-MM-DD');
1345
1347
  // eslint-disable-next-line no-await-in-loop
1346
- await doAnalyze(date);
1348
+ await doAnalyze(date, cloneDeep(groups));
1347
1349
  }
1348
1350
  }
1349
1351
  };
@@ -519,12 +519,16 @@ class BlockletState extends BaseState {
519
519
  const doc = await this.getBlocklet(did);
520
520
 
521
521
  if (doc.meta?.group === BlockletGroup.gateway && !doc.children?.length) {
522
- return this.updateBlocklet(did, { status });
522
+ const res = await this.updateBlocklet(did, { status });
523
+ statusLock.release();
524
+ return res;
523
525
  }
524
526
 
525
527
  // for backward compatibility
526
528
  if (!doc.structVersion && !doc.children?.length) {
527
- return this.updateBlocklet(did, { status });
529
+ const res = await this.updateBlocklet(did, { status });
530
+ statusLock.release();
531
+ return res;
528
532
  }
529
533
 
530
534
  // update children status
@@ -661,10 +665,10 @@ class BlockletState extends BaseState {
661
665
 
662
666
  _getStatusLock(did) {
663
667
  if (!this.statusLocks.has(did)) {
664
- this.statusLocks[did] = new Lock();
668
+ this.statusLocks.set(did, new Lock());
665
669
  }
666
670
 
667
- return this.statusLocks[did];
671
+ return this.statusLocks.get(did);
668
672
  }
669
673
 
670
674
  async _getOccupiedPorts() {
@@ -570,7 +570,7 @@ const startBlockletProcess = async (
570
570
  };
571
571
 
572
572
  const clusterMode = get(b.meta, 'capabilities.clusterMode', false);
573
- if (clusterMode && blocklet.mode !== BLOCKLET_MODES.DEVELOPMENT) {
573
+ if (clusterMode && b.mode !== BLOCKLET_MODES.DEVELOPMENT) {
574
574
  const clusterSize = Number(blocklet.configObj.BLOCKLET_CLUSTER_SIZE) || +process.env.ABT_NODE_MAX_CLUSTER_SIZE;
575
575
  options.execMode = 'cluster';
576
576
  options.mergeLogs = true;
@@ -63,7 +63,9 @@ async function getSpaceNameByEndpoint(endpoint, defaultValue = '') {
63
63
  timeout: 3000,
64
64
  });
65
65
 
66
- return headers['x-space-name'] ?? defaultValue;
66
+ const spaceName = headers['x-space-name'];
67
+
68
+ return spaceName ? decodeURIComponent(spaceName) : defaultValue;
67
69
  } catch (error) {
68
70
  console.error(error);
69
71
  return defaultValue;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.13-beta-90ded76f",
6
+ "version": "1.16.13-beta-ef672597",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,19 +19,19 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
- "@abtnode/auth": "1.16.13-beta-90ded76f",
23
- "@abtnode/certificate-manager": "1.16.13-beta-90ded76f",
24
- "@abtnode/constant": "1.16.13-beta-90ded76f",
25
- "@abtnode/cron": "1.16.13-beta-90ded76f",
26
- "@abtnode/insights": "1.16.13-beta-90ded76f",
27
- "@abtnode/logger": "1.16.13-beta-90ded76f",
28
- "@abtnode/models": "1.16.13-beta-90ded76f",
29
- "@abtnode/queue": "1.16.13-beta-90ded76f",
30
- "@abtnode/rbac": "1.16.13-beta-90ded76f",
31
- "@abtnode/router-provider": "1.16.13-beta-90ded76f",
32
- "@abtnode/static-server": "1.16.13-beta-90ded76f",
33
- "@abtnode/timemachine": "1.16.13-beta-90ded76f",
34
- "@abtnode/util": "1.16.13-beta-90ded76f",
22
+ "@abtnode/analytics": "1.16.13-beta-ef672597",
23
+ "@abtnode/auth": "1.16.13-beta-ef672597",
24
+ "@abtnode/certificate-manager": "1.16.13-beta-ef672597",
25
+ "@abtnode/constant": "1.16.13-beta-ef672597",
26
+ "@abtnode/cron": "1.16.13-beta-ef672597",
27
+ "@abtnode/logger": "1.16.13-beta-ef672597",
28
+ "@abtnode/models": "1.16.13-beta-ef672597",
29
+ "@abtnode/queue": "1.16.13-beta-ef672597",
30
+ "@abtnode/rbac": "1.16.13-beta-ef672597",
31
+ "@abtnode/router-provider": "1.16.13-beta-ef672597",
32
+ "@abtnode/static-server": "1.16.13-beta-ef672597",
33
+ "@abtnode/timemachine": "1.16.13-beta-ef672597",
34
+ "@abtnode/util": "1.16.13-beta-ef672597",
35
35
  "@arcblock/did": "1.18.84",
36
36
  "@arcblock/did-auth": "1.18.84",
37
37
  "@arcblock/did-ext": "^1.18.84",
@@ -42,11 +42,11 @@
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
43
  "@arcblock/validator": "^1.18.84",
44
44
  "@arcblock/vc": "1.18.84",
45
- "@blocklet/constant": "1.16.13-beta-90ded76f",
46
- "@blocklet/meta": "1.16.13-beta-90ded76f",
47
- "@blocklet/resolver": "1.16.13-beta-90ded76f",
48
- "@blocklet/sdk": "1.16.13-beta-90ded76f",
49
- "@did-space/client": "^0.2.117",
45
+ "@blocklet/constant": "1.16.13-beta-ef672597",
46
+ "@blocklet/meta": "1.16.13-beta-ef672597",
47
+ "@blocklet/resolver": "1.16.13-beta-ef672597",
48
+ "@blocklet/sdk": "1.16.13-beta-ef672597",
49
+ "@did-space/client": "^0.2.124",
50
50
  "@fidm/x509": "^1.2.1",
51
51
  "@ocap/mcrypto": "1.18.84",
52
52
  "@ocap/util": "1.18.84",
@@ -96,5 +96,5 @@
96
96
  "express": "^4.18.2",
97
97
  "jest": "^27.5.1"
98
98
  },
99
- "gitHead": "e6d4b88fe2cb45e00e5d745e1cd148dc76a019a4"
99
+ "gitHead": "ed5abea5072dee26860ed43139bfee17461b19a1"
100
100
  }