@abtnode/core 1.16.6-beta-9e9fec72 → 1.16.6-beta-1fde60e3

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.
@@ -1,4 +1,5 @@
1
1
  const { BlockletStatus, BLOCKLET_MODES, fromBlockletStatus, BlockletSource } = require('@blocklet/constant');
2
+ const toDid = require('@blocklet/meta/lib/did');
2
3
 
3
4
  const logger = require('@abtnode/logger')('@abtnode/core:install-app-dev');
4
5
  const { ensureMeta, updateBlockletFallbackLogo, ensureAppLogo } = require('../../../util/blocklet');
@@ -12,7 +13,10 @@ const { ensureMeta, updateBlockletFallbackLogo, ensureAppLogo } = require('../..
12
13
  * @returns
13
14
  */
14
15
  const installApplicationFromDev = async ({ folder, meta, states, manager } = {}) => {
15
- const { did, version } = meta;
16
+ const { version } = meta;
17
+
18
+ const name = `${meta.name}-dev`;
19
+ const did = toDid(name);
16
20
 
17
21
  const exist = await states.blocklet.getBlocklet(did);
18
22
  if (exist) {
@@ -53,8 +57,8 @@ const installApplicationFromDev = async ({ folder, meta, states, manager } = {})
53
57
  // create app
54
58
  const added = await manager._addBlocklet({
55
59
  component,
56
- name: meta.name,
57
- did: meta.did,
60
+ name,
61
+ did,
58
62
  mode: BLOCKLET_MODES.DEVELOPMENT,
59
63
  });
60
64
  logger.info('add blocklet for dev', { did, version, meta });
@@ -16,7 +16,7 @@ const getTmpDir = require('@abtnode/util/lib/get-tmp-directory');
16
16
  const downloadFile = require('@abtnode/util/lib/download-file');
17
17
  const { updateBlockletDocument } = require('@abtnode/util/lib/did-document');
18
18
  const getBlockletInfo = require('@blocklet/meta/lib/info');
19
- const { forEachBlocklet } = require('@blocklet/meta/lib/util');
19
+ const { forEachBlockletSync } = require('@blocklet/meta/lib/util');
20
20
  const {
21
21
  DOMAIN_FOR_DEFAULT_SITE,
22
22
  DOMAIN_FOR_IP_SITE_REGEXP,
@@ -71,6 +71,8 @@ const { getBlockletKnownAs, getBlockletDidDomainList } = require('../util/blockl
71
71
 
72
72
  const isServiceFeDevelopment = process.env.ABT_NODE_SERVICE_FE_PORT;
73
73
 
74
+ const hasRuleByPrefix = (site, value) => site.rules.find((x) => x.isProtected && get(x, 'from.pathPrefix') === value);
75
+
74
76
  /**
75
77
  * replace 888-888-888-888 with accessible ip for domain
76
78
  */
@@ -399,6 +401,79 @@ const filterSitesForRemovedBlocklets = async (sites = [], blocklets) => {
399
401
  });
400
402
  };
401
403
 
404
+ /**
405
+ * Add system routing rules for blocklet in wellknown site
406
+ *
407
+ * @returns {boolean} if routing changed
408
+ */
409
+ const ensureBlockletWellknownRules = async (sites, blocklets) => {
410
+ /**
411
+ * 1. component blocklet 不允许有相同多的 wellknown
412
+ * 1. wellknown 可以访问的路由:
413
+ * /.well-known/xxx
414
+ * /{wellknown owner blocklet}/.well-known/xxx
415
+ */
416
+ const isWellknownInterface = (x) => x.type === BLOCKLET_INTERFACE_TYPE_WELLKNOWN;
417
+
418
+ const handler = ({ rules, site, blocklet, tmpInterface, mountPoint }) => {
419
+ let pathPrefix = normalizePathPrefix(tmpInterface.prefix);
420
+ if (!pathPrefix.startsWith(WELLKNOWN_PATH_PREFIX)) {
421
+ throw new Error(`Wellknown path prefix must start with: ${WELLKNOWN_PATH_PREFIX}`);
422
+ }
423
+
424
+ const tmpMountPoint = mountPoint || blocklet.mountPoint;
425
+ if (tmpMountPoint) {
426
+ pathPrefix = joinUrl(tmpMountPoint, pathPrefix);
427
+ }
428
+
429
+ const port = findInterfacePortByName(blocklet, tmpInterface.name);
430
+ const existedRule = hasRuleByPrefix(site, pathPrefix);
431
+ if (existedRule) {
432
+ return;
433
+ }
434
+
435
+ rules.push({
436
+ from: { pathPrefix },
437
+ to: {
438
+ did: blocklet.meta.did,
439
+ port,
440
+ targetPrefix: tmpMountPoint,
441
+ type: ROUTING_RULE_TYPES.GENERAL_PROXY,
442
+ interfaceName: tmpInterface.name,
443
+ },
444
+ isProtected: true,
445
+ });
446
+ };
447
+
448
+ return sites
449
+ .map((site) => {
450
+ if (!site.domain.endsWith(BLOCKLET_SITE_GROUP_SUFFIX)) {
451
+ return site;
452
+ }
453
+
454
+ const blocklet = blocklets.find((x) => x.meta.did === site.blockletDid);
455
+
456
+ const rules = [];
457
+
458
+ forEachBlockletSync(blocklet, (b) => {
459
+ (b.meta.interfaces || []).forEach((item) => {
460
+ if (isWellknownInterface(item)) {
461
+ handler({ rules, blocklet: b, tmpInterface: item, site });
462
+
463
+ // 在站点的根路由下挂载一个
464
+ if (b.mountPoint && b.mountPoint !== '/') {
465
+ handler({ rules, blocklet: b, tmpInterface: item, site, mountPoint: '/' });
466
+ }
467
+ }
468
+ });
469
+ });
470
+
471
+ site.rules = site.rules.concat(rules);
472
+ return site;
473
+ })
474
+ .filter(Boolean);
475
+ };
476
+
402
477
  const ensureBlockletCache = async (sites = [], blocklets) => {
403
478
  return sites
404
479
  .map((site) => {
@@ -456,6 +531,7 @@ const ensureLatestInfo = async (sites = [], { withDefaultCors = true } = {}) =>
456
531
  let result = await ensureLatestNodeInfo(sites, { withDefaultCors });
457
532
  result = await ensureBlockletDid(result);
458
533
  result = await filterSitesForRemovedBlocklets(sites, blocklets);
534
+ result = await ensureBlockletWellknownRules(result, blocklets);
459
535
  result = await ensureBlockletCache(result, blocklets);
460
536
  result = await ensureWellknownRule(result);
461
537
  result = await ensureCorsForWebWallet(result);
@@ -485,7 +561,6 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
485
561
  const notification = states.notification;
486
562
 
487
563
  // site level duplication detection
488
- const hasRuleByPrefix = (site, value) => site.rules.find((x) => x.isProtected && get(x, 'from.pathPrefix') === value);
489
564
 
490
565
  const downloadCert = async ({ domain, url }) => {
491
566
  const destFolder = getTmpDir(path.join(`certificate-${Date.now()}`));
@@ -794,7 +869,7 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
794
869
  *
795
870
  * @returns {boolean} if routing state db changed
796
871
  */
797
- const _ensureBlockletSites = async (blocklet, sites, nodeInfo, context = {}) => {
872
+ const _ensureBlockletSites = async (blocklet, nodeInfo, context = {}) => {
798
873
  const webInterface = (blocklet.meta.interfaces || []).find((x) => x.type === BLOCKLET_INTERFACE_TYPE_WEB);
799
874
  if (!webInterface) {
800
875
  return false;
@@ -884,97 +959,7 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
884
959
  return true;
885
960
  };
886
961
 
887
- /**
888
- * Add system routing rules for blocklet in wellknown site
889
- *
890
- * @returns {boolean} if routing changed
891
- */
892
- const _ensureBlockletRulesForWellknownSite = async (blocklet, sites, context = {}) => {
893
- const wellknownSite = sites.find((x) => x.name === NAME_FOR_WELLKNOWN_SITE);
894
- if (!wellknownSite) {
895
- return false;
896
- }
897
-
898
- /**
899
- * 1. component blocklet 不允许有相同多的 wellknown
900
- * 1. wellknown 可以访问的路由:
901
- * /.well-known/xxx
902
- * /{wellknown owner blocklet}/.well-known/xxx
903
- */
904
-
905
- const isWellknownInterface = (x) => x.type === BLOCKLET_INTERFACE_TYPE_WELLKNOWN;
906
-
907
- const handler = async (tmpBlocklet, tmpInterface, mountPoint) => {
908
- let pathPrefix = normalizePathPrefix(tmpInterface.prefix);
909
- if (!pathPrefix.startsWith(WELLKNOWN_PATH_PREFIX)) {
910
- throw new Error(`Wellknown path prefix must start with: ${WELLKNOWN_PATH_PREFIX}`);
911
- }
912
-
913
- const tmpMountPoint = mountPoint || tmpBlocklet.mountPoint;
914
- if (tmpMountPoint) {
915
- pathPrefix = joinUrl(tmpMountPoint, pathPrefix);
916
- }
917
-
918
- const port = findInterfacePortByName(tmpBlocklet, tmpInterface.name);
919
- const existedRule = hasRuleByPrefix(wellknownSite, pathPrefix);
920
-
921
- const rule = {
922
- from: { pathPrefix },
923
- to: {
924
- did: tmpBlocklet.meta.did,
925
- port,
926
- type: ROUTING_RULE_TYPES.GENERAL_PROXY,
927
- interfaceName: tmpInterface.name,
928
- },
929
- isProtected: true,
930
- };
931
-
932
- if (!existedRule) {
933
- await routerManager.addRoutingRule(
934
- { id: wellknownSite.id, rule, skipCheckDynamicBlacklist: true, formatPathPrefix: false },
935
- context
936
- );
937
- return true;
938
- }
939
-
940
- // 兼容代码,旧的 rule 没有 to.did 字段
941
- if (port !== existedRule.to.port || existedRule.to.did !== tmpBlocklet.meta.did) {
942
- existedRule.to = rule.to;
943
-
944
- await routerManager.updateRoutingRule(
945
- { id: wellknownSite.id, rule: existedRule, skipProtectedRuleChecking: true, formatPathPrefix: false },
946
- context
947
- );
948
-
949
- return true;
950
- }
951
-
952
- return false;
953
- };
954
-
955
- const tasks = [];
956
-
957
- forEachBlocklet(
958
- blocklet,
959
- (b) => {
960
- (b.meta.interfaces || []).forEach((item) => {
961
- if (isWellknownInterface(item)) {
962
- tasks.push(handler(b, item));
963
-
964
- if (!b.mountPoint || b.mountPoint !== '/') {
965
- tasks.push(handler(b, item, '/')); // 在站点的根路由下挂载一个
966
- }
967
- }
968
- });
969
- },
970
- { sync: true }
971
- );
972
-
973
- const changes = await Promise.all(tasks);
974
- return changes.some(Boolean);
975
- };
976
-
977
- const _removeBlockletSites = async (blocklet, nodeInfo, context = {}) => {
962
+ const _removeBlockletSites = async (blocklet, context = {}) => {
978
963
  let changed = false;
979
964
 
980
965
  const site = await states.site.findOne({ domain: `${blocklet.meta.did}${BLOCKLET_SITE_GROUP_SUFFIX}` });
@@ -1002,16 +987,7 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1002
987
  return false;
1003
988
  }
1004
989
 
1005
- const sites = await siteState.getSites();
1006
-
1007
- const tasks = [
1008
- _ensureBlockletRulesForWellknownSite(blocklet, sites, context),
1009
- _ensureBlockletSites(blocklet, sites, nodeInfo, context),
1010
- ];
1011
-
1012
- const changes = await Promise.all(tasks);
1013
-
1014
- return changes.some(Boolean);
990
+ return _ensureBlockletSites(blocklet, nodeInfo, context);
1015
991
  };
1016
992
 
1017
993
  /**
@@ -1105,12 +1081,10 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1105
1081
  * @returns {boolean} if routing changed
1106
1082
  */
1107
1083
  const removeBlockletRouting = async (blocklet, context = {}) => {
1108
- const nodeInfo = await nodeState.read();
1109
-
1110
1084
  const ruleChanged = await routerManager.deleteRoutingRulesItemByDid({ did: blocklet.meta.did }, context);
1111
1085
  let siteChanged;
1112
1086
  if (!context.keepRouting) {
1113
- siteChanged = await _removeBlockletSites(blocklet, nodeInfo, context);
1087
+ siteChanged = await _removeBlockletSites(blocklet, context);
1114
1088
  }
1115
1089
 
1116
1090
  return ruleChanged || siteChanged;
@@ -1468,3 +1442,4 @@ module.exports.ensureLatestNodeInfo = ensureLatestNodeInfo;
1468
1442
  module.exports.ensureLatestInterfaceInfo = ensureLatestInterfaceInfo;
1469
1443
  module.exports.ensureLatestInfo = ensureLatestInfo;
1470
1444
  module.exports.ensureWellknownRule = ensureWellknownRule;
1445
+ module.exports.ensureBlockletWellknownRules = ensureBlockletWellknownRules;
@@ -1,4 +1,3 @@
1
- const get = require('lodash/get');
2
1
  const logger = require('@abtnode/logger')('@abtnode/core:states:notification');
3
2
  const { EVENTS } = require('@abtnode/constant');
4
3
 
@@ -54,23 +53,12 @@ class NotificationState extends BaseState {
54
53
  });
55
54
  }
56
55
 
57
- async findPaginated({ receiver, sender, read, paging } = {}, context) {
56
+ async findPaginated({ read, paging } = {}) {
58
57
  const conditions = {};
59
- // eslint-disable-next-line no-param-reassign
60
- receiver = receiver || get(context, 'user.did');
61
- if (!receiver && !sender) {
62
- throw new Error('Receiver or sender is required to find notifications');
63
- }
64
58
 
65
59
  if (typeof read === 'boolean') {
66
60
  conditions.read = read;
67
61
  }
68
- if (sender) {
69
- conditions.sender = sender;
70
- }
71
- if (receiver) {
72
- conditions.receiver = receiver;
73
- }
74
62
 
75
63
  return this.paginate(conditions, { createdAt: -1 }, { ...paging, pageSize: 10 });
76
64
  }
@@ -438,9 +438,9 @@ class User extends BaseState {
438
438
  * @param {string} did user's did
439
439
  * @returns {BlockletUser}
440
440
  */
441
- async getUser(did, { enableConnectedAccout = false, enableNormalize = false, blockletSk } = {}) {
441
+ async getUser(did, { enableConnectedAccount = false, enableNormalize = false, blockletSk } = {}) {
442
442
  let user = await this.findOne({ did });
443
- if (enableConnectedAccout) {
443
+ if (enableConnectedAccount) {
444
444
  if (!user) {
445
445
  user = await this.findOne({
446
446
  'extraConfigs.connectedAccounts.did': did,
@@ -513,7 +513,7 @@ class User extends BaseState {
513
513
  let action = '';
514
514
  const now = new Date().toISOString();
515
515
  const oldUser = await this.getUser(user.did, {
516
- enableConnectedAccout: true,
516
+ enableConnectedAccount: true,
517
517
  });
518
518
  const cloneData = cloneDeep(user);
519
519
  const passports = upsertToPassports(
@@ -1407,7 +1407,13 @@ const getBlocklet = async ({
1407
1407
  // app settings
1408
1408
  const settings = await states.blockletExtras.getSettings(blocklet.meta.did);
1409
1409
  blocklet.trustedPassports = get(settings, 'trustedPassports') || [];
1410
- blocklet.trustedFactories = get(settings, 'trustedFactories') || [];
1410
+ blocklet.trustedFactories = (get(settings, 'trustedFactories') || []).map((x) => {
1411
+ if (!x.passport.ttlPolicy) {
1412
+ x.passport.ttlPolicy = 'never';
1413
+ x.passport.ttl = 0;
1414
+ }
1415
+ return x;
1416
+ });
1411
1417
  blocklet.enablePassportIssuance = get(settings, 'enablePassportIssuance', true);
1412
1418
  blocklet.settings = settings || {};
1413
1419
 
@@ -70,6 +70,7 @@ const ruleSchema = {
70
70
  .valid(...Object.keys(ROUTER_CACHE_GROUPS))
71
71
  .allow('')
72
72
  .default(''),
73
+ targetPrefix: Joi.string().trim().max(150), // path prefix of interface of target blocklet
73
74
  },
74
75
 
75
76
  // List of services that manipulate the request before the upstream blocklet
@@ -14,6 +14,7 @@ const trustedFactoriesSchema = Joi.array()
14
14
  remark: Joi.string().trim().required(),
15
15
  passport: Joi.object({
16
16
  role: Joi.string().required(),
17
+ ttlPolicy: Joi.string().valid('never', 'mint', 'exchange').required(),
17
18
  ttl: Joi.number().integer().min(0).default(0),
18
19
  }).required(),
19
20
  })
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.6-beta-9e9fec72",
6
+ "version": "1.16.6-beta-1fde60e3",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,18 +19,18 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "MIT",
21
21
  "dependencies": {
22
- "@abtnode/auth": "1.16.6-beta-9e9fec72",
23
- "@abtnode/certificate-manager": "1.16.6-beta-9e9fec72",
24
- "@abtnode/constant": "1.16.6-beta-9e9fec72",
25
- "@abtnode/cron": "1.16.6-beta-9e9fec72",
26
- "@abtnode/db": "1.16.6-beta-9e9fec72",
27
- "@abtnode/logger": "1.16.6-beta-9e9fec72",
28
- "@abtnode/queue": "1.16.6-beta-9e9fec72",
29
- "@abtnode/rbac": "1.16.6-beta-9e9fec72",
30
- "@abtnode/router-provider": "1.16.6-beta-9e9fec72",
31
- "@abtnode/static-server": "1.16.6-beta-9e9fec72",
32
- "@abtnode/timemachine": "1.16.6-beta-9e9fec72",
33
- "@abtnode/util": "1.16.6-beta-9e9fec72",
22
+ "@abtnode/auth": "1.16.6-beta-1fde60e3",
23
+ "@abtnode/certificate-manager": "1.16.6-beta-1fde60e3",
24
+ "@abtnode/constant": "1.16.6-beta-1fde60e3",
25
+ "@abtnode/cron": "1.16.6-beta-1fde60e3",
26
+ "@abtnode/db": "1.16.6-beta-1fde60e3",
27
+ "@abtnode/logger": "1.16.6-beta-1fde60e3",
28
+ "@abtnode/queue": "1.16.6-beta-1fde60e3",
29
+ "@abtnode/rbac": "1.16.6-beta-1fde60e3",
30
+ "@abtnode/router-provider": "1.16.6-beta-1fde60e3",
31
+ "@abtnode/static-server": "1.16.6-beta-1fde60e3",
32
+ "@abtnode/timemachine": "1.16.6-beta-1fde60e3",
33
+ "@abtnode/util": "1.16.6-beta-1fde60e3",
34
34
  "@arcblock/did": "1.18.75",
35
35
  "@arcblock/did-auth": "1.18.75",
36
36
  "@arcblock/did-ext": "^1.18.75",
@@ -40,12 +40,11 @@
40
40
  "@arcblock/jwt": "^1.18.75",
41
41
  "@arcblock/pm2-events": "^0.0.5",
42
42
  "@arcblock/vc": "1.18.75",
43
- "@blocklet/constant": "1.16.6-beta-9e9fec72",
44
- "@blocklet/meta": "1.16.6-beta-9e9fec72",
45
- "@blocklet/sdk": "1.16.6-beta-9e9fec72",
46
- "@did-space/client": "^0.2.80",
43
+ "@blocklet/constant": "1.16.6-beta-1fde60e3",
44
+ "@blocklet/meta": "1.16.6-beta-1fde60e3",
45
+ "@blocklet/sdk": "1.16.6-beta-1fde60e3",
46
+ "@did-space/client": "^0.2.83",
47
47
  "@fidm/x509": "^1.2.1",
48
- "@ocap/client": "1.18.75",
49
48
  "@ocap/mcrypto": "1.18.75",
50
49
  "@ocap/util": "1.18.75",
51
50
  "@ocap/wallet": "1.18.75",
@@ -66,18 +65,15 @@
66
65
  "get-port": "^5.1.1",
67
66
  "hasha": "^5.2.2",
68
67
  "is-base64": "^1.1.0",
69
- "is-ip": "^3.1.0",
70
68
  "is-url": "^1.2.4",
71
69
  "joi": "17.7.0",
72
70
  "js-yaml": "^4.1.0",
73
71
  "kill-port": "^2.0.1",
74
72
  "lodash": "^4.17.21",
75
- "lru-cache": "^6.0.0",
76
73
  "moment-timezone": "^0.5.37",
77
74
  "node-stream-zip": "^1.15.0",
78
75
  "p-limit": "^3.1.0",
79
76
  "p-retry": "4.6.1",
80
- "pm2": "^5.2.0",
81
77
  "semver": "^7.3.8",
82
78
  "shelljs": "^0.8.5",
83
79
  "ssri": "^8.0.1",
@@ -98,5 +94,5 @@
98
94
  "express": "^4.18.2",
99
95
  "jest": "^27.5.1"
100
96
  },
101
- "gitHead": "a30731223bc19231bac0dea7bd0d01a3bbf8e84c"
97
+ "gitHead": "be8d8eab7d210910e24dae3b389f2c70aa414a13"
102
98
  }