@abtnode/core 1.7.8 → 1.7.11
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/api/team.js +13 -0
- package/lib/blocklet/manager/disk.js +21 -13
- package/lib/blocklet/migration.js +8 -0
- package/lib/cert.js +14 -0
- package/lib/event.js +12 -0
- package/lib/index.js +3 -2
- package/lib/router/helper.js +0 -90
- package/lib/router/index.js +1 -1
- package/lib/router/manager.js +3 -3
- package/lib/team/manager.js +13 -0
- package/lib/util/blocklet.js +1 -2
- package/lib/util/index.js +2 -7
- package/package.json +20 -21
- package/lib/util/service.js +0 -81
package/lib/api/team.js
CHANGED
|
@@ -104,6 +104,19 @@ class TeamAPI extends EventEmitter {
|
|
|
104
104
|
return state.getUser(user.did);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
async getOwner({ teamDid }) {
|
|
108
|
+
const owner = await this.teamManager.getOwner(teamDid);
|
|
109
|
+
|
|
110
|
+
if (!owner) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const state = await this.getUserState(teamDid);
|
|
115
|
+
|
|
116
|
+
const full = await state.getUser(owner.did);
|
|
117
|
+
return full || owner;
|
|
118
|
+
}
|
|
119
|
+
|
|
107
120
|
async updateUser({ teamDid, user }) {
|
|
108
121
|
const state = await this.getUserState(teamDid);
|
|
109
122
|
|
|
@@ -114,6 +114,7 @@ const {
|
|
|
114
114
|
shouldUpdateBlockletStatus,
|
|
115
115
|
getBlockletMeta,
|
|
116
116
|
validateBlockletMeta,
|
|
117
|
+
validateOwner,
|
|
117
118
|
} = util;
|
|
118
119
|
|
|
119
120
|
const preDownloadLock = new Lock('pre-download-lock');
|
|
@@ -256,7 +257,7 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
256
257
|
}
|
|
257
258
|
|
|
258
259
|
const blocklet = await states.blocklet.getBlocklet(meta.did);
|
|
259
|
-
const isRunning = blocklet
|
|
260
|
+
const isRunning = blocklet ? blocklet.status === BlockletStatus.running : false;
|
|
260
261
|
|
|
261
262
|
return { meta, isFree, isInstalled: !!blocklet, isRunning };
|
|
262
263
|
}
|
|
@@ -626,7 +627,7 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
626
627
|
}
|
|
627
628
|
|
|
628
629
|
// eslint-disable-next-line no-unused-vars
|
|
629
|
-
async config({ did, childDid, configs: newConfigs }, context) {
|
|
630
|
+
async config({ did, childDid, configs: newConfigs, skipHook }, context) {
|
|
630
631
|
logger.info('config blocklet', { did });
|
|
631
632
|
if (!Array.isArray(newConfigs)) {
|
|
632
633
|
throw new Error('configs list is not an array');
|
|
@@ -693,15 +694,17 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
693
694
|
blocklet.configObj[x.key] = x.value;
|
|
694
695
|
}
|
|
695
696
|
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
697
|
+
if (!skipHook) {
|
|
698
|
+
// FIXME: we should also call preConfig for child blocklets
|
|
699
|
+
await hooks.preConfig(blocklet.env.appId, {
|
|
700
|
+
appDir: blocklet.env.appDir,
|
|
701
|
+
hooks: Object.assign(blocklet.meta.hooks || {}, blocklet.meta.scripts || {}),
|
|
702
|
+
exitOnError: true,
|
|
703
|
+
env: { ...getRuntimeEnvironments(blocklet, nodeEnvironments), ...blocklet.configObj },
|
|
704
|
+
did,
|
|
705
|
+
context,
|
|
706
|
+
});
|
|
707
|
+
}
|
|
705
708
|
|
|
706
709
|
// update db
|
|
707
710
|
const configs = childDid
|
|
@@ -1147,9 +1150,14 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
1147
1150
|
return blocklet;
|
|
1148
1151
|
}
|
|
1149
1152
|
|
|
1150
|
-
async setInitialized({ did }) {
|
|
1153
|
+
async setInitialized({ did, owner }) {
|
|
1154
|
+
if (!validateOwner(owner)) {
|
|
1155
|
+
throw new Error('Blocklet owner is invalid');
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1151
1158
|
const blocklet = await states.blocklet.getBlocklet(did);
|
|
1152
|
-
await states.blockletExtras.setSettings(blocklet.meta.did, { initialized: true });
|
|
1159
|
+
await states.blockletExtras.setSettings(blocklet.meta.did, { initialized: true, owner });
|
|
1160
|
+
logger.info('Blocklet initialized', { did, owner });
|
|
1153
1161
|
|
|
1154
1162
|
this.emit(BlockletEvents.updated, { meta: { did: blocklet.meta.did } });
|
|
1155
1163
|
|
|
@@ -21,6 +21,7 @@ async function runScripts({
|
|
|
21
21
|
printSuccess,
|
|
22
22
|
printError,
|
|
23
23
|
}) {
|
|
24
|
+
// 获取所有待执行的脚本
|
|
24
25
|
let scripts = [];
|
|
25
26
|
try {
|
|
26
27
|
scripts = await getScripts(scriptsDir);
|
|
@@ -37,13 +38,17 @@ async function runScripts({
|
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
printInfo('pending scripts', pendingScripts);
|
|
41
|
+
// 执行脚本前需要对数据库文件做一次备份
|
|
40
42
|
try {
|
|
41
43
|
await doBackup({ dbDir, backupDir, printInfo, printSuccess, printError });
|
|
42
44
|
} catch (err) {
|
|
43
45
|
printError(`Failed to backup state db due to ${err.message}, abort!`);
|
|
46
|
+
// 备份失败时,需要移除备份目录
|
|
47
|
+
fs.removeSync(backupDir);
|
|
44
48
|
throw err;
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
// 按照顺序依次执行 migration 脚本
|
|
47
52
|
for (let i = 0; i < pendingScripts.length; i++) {
|
|
48
53
|
const { script: scriptPath } = pendingScripts[i];
|
|
49
54
|
try {
|
|
@@ -59,7 +64,10 @@ async function runScripts({
|
|
|
59
64
|
|
|
60
65
|
try {
|
|
61
66
|
await doRestore({ dbDir, backupDir, printInfo, printSuccess, printError });
|
|
67
|
+
// 恢复备份成功时,需要移除备份目录
|
|
68
|
+
fs.removeSync(backupDir);
|
|
62
69
|
} catch (restoreErr) {
|
|
70
|
+
// 如果恢复备份失败,则保留备份目录,恢复数据
|
|
63
71
|
printError(`Failed to restore state db due to: ${restoreErr.message}`);
|
|
64
72
|
}
|
|
65
73
|
|
package/lib/cert.js
CHANGED
|
@@ -37,6 +37,16 @@ const onCertIssued = (cert) => {
|
|
|
37
37
|
});
|
|
38
38
|
};
|
|
39
39
|
|
|
40
|
+
const onCertIssueFailed = (cert) => {
|
|
41
|
+
states.notification.create({
|
|
42
|
+
title: 'Certificate Issue Failed',
|
|
43
|
+
description: `Failed to issue certificate for ${cert.domain}`,
|
|
44
|
+
severity: 'error',
|
|
45
|
+
entityType: 'certificate',
|
|
46
|
+
entityId: cert.id,
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
|
|
40
50
|
const getDomainFromInput = (input) => {
|
|
41
51
|
if (Object.prototype.toString.call(input) === '[object Object]') {
|
|
42
52
|
return input.domain;
|
|
@@ -58,6 +68,10 @@ class Cert extends EventEmitter {
|
|
|
58
68
|
|
|
59
69
|
this.manager.on('cert.expired', onCertExpired);
|
|
60
70
|
this.manager.on('cert.about_to_expire', onCertAboutExpire);
|
|
71
|
+
this.manager.on('cert.error', (cert) => {
|
|
72
|
+
this.emit('cert.error', cert);
|
|
73
|
+
onCertIssueFailed(cert);
|
|
74
|
+
});
|
|
61
75
|
}
|
|
62
76
|
|
|
63
77
|
start() {
|
package/lib/event.js
CHANGED
|
@@ -25,6 +25,7 @@ module.exports = ({
|
|
|
25
25
|
handleRouting,
|
|
26
26
|
domainStatus,
|
|
27
27
|
teamAPI,
|
|
28
|
+
certManager,
|
|
28
29
|
}) => {
|
|
29
30
|
const notificationState = states.notification;
|
|
30
31
|
const nodeState = states.node;
|
|
@@ -125,6 +126,14 @@ module.exports = ({
|
|
|
125
126
|
await teamAPI.refreshBlockletInterfacePermissions(blocklet.meta);
|
|
126
127
|
} catch (error) {
|
|
127
128
|
logger.error('upgrade blocklet routing rules error', { event: name, error });
|
|
129
|
+
notificationState.create({
|
|
130
|
+
title: 'Blocklet URL Mapping Error',
|
|
131
|
+
// eslint-disable-next-line max-len
|
|
132
|
+
description: `Failed to upgrade URL mapping for blocklet ${blocklet.meta.name}@${blocklet.meta.version}, due to: ${error.message}`,
|
|
133
|
+
entityType: 'blocklet',
|
|
134
|
+
entityId: blocklet.meta.did,
|
|
135
|
+
severity: 'error',
|
|
136
|
+
});
|
|
128
137
|
}
|
|
129
138
|
|
|
130
139
|
try {
|
|
@@ -222,5 +231,8 @@ module.exports = ({
|
|
|
222
231
|
events.handleServerEvent = handleServerEvent;
|
|
223
232
|
events.handleBlockletEvent = handleBlockletEvent;
|
|
224
233
|
|
|
234
|
+
certManager.on('cert.issued', (data) => onEvent(EVENTS.CERT_ISSUED, data));
|
|
235
|
+
certManager.on('cert.error', (data) => onEvent(EVENTS.CERT_ERROR, data));
|
|
236
|
+
|
|
225
237
|
return events;
|
|
226
238
|
};
|
package/lib/index.js
CHANGED
|
@@ -10,6 +10,7 @@ const {
|
|
|
10
10
|
fromBlockletSource,
|
|
11
11
|
toBlockletSource,
|
|
12
12
|
} = require('@blocklet/meta/lib/constants');
|
|
13
|
+
const { getServiceMetas } = require('@blocklet/meta/lib/service');
|
|
13
14
|
const { listProviders } = require('@abtnode/router-provider');
|
|
14
15
|
const { DEFAULT_CERTIFICATE_EMAIL, EVENTS } = require('@abtnode/constant');
|
|
15
16
|
|
|
@@ -29,7 +30,6 @@ const IP = require('./util/ip');
|
|
|
29
30
|
const DomainStatus = require('./util/domain-status');
|
|
30
31
|
const Upgrade = require('./util/upgrade');
|
|
31
32
|
const resetNode = require('./util/reset-node');
|
|
32
|
-
const { getServices } = require('./util/service');
|
|
33
33
|
const DiskMonitor = require('./util/disk-monitor');
|
|
34
34
|
const createQueue = require('./queue');
|
|
35
35
|
const createEvents = require('./event');
|
|
@@ -265,6 +265,7 @@ function ABTNode(options) {
|
|
|
265
265
|
getUsers: teamAPI.getUsers.bind(teamAPI),
|
|
266
266
|
getUsersCount: teamAPI.getUsersCount.bind(teamAPI),
|
|
267
267
|
getUser: teamAPI.getUser.bind(teamAPI),
|
|
268
|
+
getOwner: teamAPI.getOwner.bind(teamAPI),
|
|
268
269
|
getNodeUsers: () => teamAPI.getUsers({ teamDid: options.nodeDid }),
|
|
269
270
|
getNodeUser: (user) => teamAPI.getUser({ teamDid: options.nodeDid, user }),
|
|
270
271
|
addUser: teamAPI.addUser.bind(teamAPI),
|
|
@@ -376,7 +377,7 @@ function ABTNode(options) {
|
|
|
376
377
|
endSession: (params, context) => states.session.end(params.id, context),
|
|
377
378
|
|
|
378
379
|
// Services
|
|
379
|
-
getServices: (params, context) =>
|
|
380
|
+
getServices: (params, context) => getServiceMetas({ stringifySchema: true }, context),
|
|
380
381
|
|
|
381
382
|
// Utilities: moved here because some deps require native build
|
|
382
383
|
getSysInfo,
|
package/lib/router/helper.js
CHANGED
|
@@ -863,88 +863,6 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
|
|
|
863
863
|
return changes.some(Boolean);
|
|
864
864
|
};
|
|
865
865
|
|
|
866
|
-
/**
|
|
867
|
-
* Add system routing rules for blocklet in dashboard site
|
|
868
|
-
*
|
|
869
|
-
* @returns {boolean} if routing changed
|
|
870
|
-
* TODO: do we still need this?
|
|
871
|
-
*/
|
|
872
|
-
const _ensureBlockletRulesForDashboardSite = async (blocklet, sites, nodeInfo, context = {}) => {
|
|
873
|
-
// blocklet level duplication detection
|
|
874
|
-
const findRulesByInterface = (site, value) =>
|
|
875
|
-
site.rules.filter((x) => x.isProtected && x.to.did === blocklet.meta.did && get(x, 'to.interfaceName') === value);
|
|
876
|
-
|
|
877
|
-
const ipSite = sites.find((x) => x.domain === DOMAIN_FOR_IP_SITE);
|
|
878
|
-
if (!ipSite) {
|
|
879
|
-
logger.warn(`Routing rule for dashboard not found, abort on ensure rules for blocklet ${blocklet.meta.did}`);
|
|
880
|
-
return false;
|
|
881
|
-
}
|
|
882
|
-
|
|
883
|
-
// If we have rule for legacy path prefix, just return
|
|
884
|
-
const pathPrefixLegacy = normalizePathPrefix(`/${nodeInfo.routing.adminPath}/${blocklet.meta.name}`);
|
|
885
|
-
if (hasRuleByPrefix(ipSite, pathPrefixLegacy)) {
|
|
886
|
-
return false;
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
const removedRuleIds = [];
|
|
890
|
-
const changes = await Promise.all(
|
|
891
|
-
blocklet.meta.interfaces.map(async (x) => {
|
|
892
|
-
let changed = false; // if state db was mutated
|
|
893
|
-
let pathPrefix = '';
|
|
894
|
-
if (x.prefix === BLOCKLET_DYNAMIC_PATH_PREFIX) {
|
|
895
|
-
// pathPrefix for dynamic path: `/{adminPath}/{blockletName}/{interfaceName}`
|
|
896
|
-
pathPrefix = normalizePathPrefix(`/${pathPrefixLegacy}/${x.name}`);
|
|
897
|
-
} else {
|
|
898
|
-
// pathPrefix for fixed path: `/{interfacePrefix}`
|
|
899
|
-
pathPrefix = normalizePathPrefix(x.prefix);
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
// Remove if we have rule with same interface
|
|
903
|
-
const exists = findRulesByInterface(ipSite, x.name);
|
|
904
|
-
if (exists.length) {
|
|
905
|
-
// Note: we need to keep a list of removed rules since we might remove multiple rules in the loop
|
|
906
|
-
exists.forEach((e) => removedRuleIds.push(e.id));
|
|
907
|
-
await states.site.update(
|
|
908
|
-
{ _id: ipSite.id },
|
|
909
|
-
{ $set: { rules: ipSite.rules.filter((r) => removedRuleIds.includes(r.id) === false) } }
|
|
910
|
-
);
|
|
911
|
-
changed = true;
|
|
912
|
-
} else if (hasRuleByPrefix(ipSite, pathPrefix)) {
|
|
913
|
-
// Skip same pathPrefix rules
|
|
914
|
-
return changed;
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
// 不在 dashboard site 中添加 path 和 prefix 都是根路径(/) 的路由
|
|
918
|
-
if (x.path === '/' && x.prefix === '/') {
|
|
919
|
-
return changed;
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
await routerManager.addRoutingRule(
|
|
923
|
-
{
|
|
924
|
-
id: ipSite.id,
|
|
925
|
-
rule: {
|
|
926
|
-
from: { pathPrefix },
|
|
927
|
-
to: {
|
|
928
|
-
type: ROUTING_RULE_TYPES.BLOCKLET,
|
|
929
|
-
port: findInterfacePortByName(blocklet, x.name),
|
|
930
|
-
did: blocklet.meta.did, // root blocklet did
|
|
931
|
-
interfaceName: x.name, // root blocklet interface
|
|
932
|
-
},
|
|
933
|
-
isProtected: true,
|
|
934
|
-
},
|
|
935
|
-
skipCheckDynamicBlacklist: true,
|
|
936
|
-
},
|
|
937
|
-
context
|
|
938
|
-
);
|
|
939
|
-
changed = true;
|
|
940
|
-
|
|
941
|
-
return changed;
|
|
942
|
-
})
|
|
943
|
-
);
|
|
944
|
-
|
|
945
|
-
return changes.some(Boolean);
|
|
946
|
-
};
|
|
947
|
-
|
|
948
866
|
const _removeBlockletSites = async (blocklet, nodeInfo, context = {}) => {
|
|
949
867
|
let changed = false;
|
|
950
868
|
|
|
@@ -980,14 +898,6 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
|
|
|
980
898
|
_ensureBlockletSites(blocklet, sites, nodeInfo, context),
|
|
981
899
|
];
|
|
982
900
|
|
|
983
|
-
if (nodeInfo.mode === NODE_MODES.DEBUG || ['e2e', 'test'].includes(process.env.NODE_ENV)) {
|
|
984
|
-
logger.info('Add blocklet endpoint in dashboard site', {
|
|
985
|
-
nodeMode: nodeInfo.mode,
|
|
986
|
-
NODE_ENV: process.env.NODE_ENV,
|
|
987
|
-
});
|
|
988
|
-
tasks.push(_ensureBlockletRulesForDashboardSite(blocklet, sites, nodeInfo, context));
|
|
989
|
-
}
|
|
990
|
-
|
|
991
901
|
const changes = await Promise.all(tasks);
|
|
992
902
|
|
|
993
903
|
return changes.some(Boolean);
|
package/lib/router/index.js
CHANGED
|
@@ -110,7 +110,7 @@ class Router {
|
|
|
110
110
|
await this.provider.update({
|
|
111
111
|
routingTable: this.routingTable,
|
|
112
112
|
certificates,
|
|
113
|
-
|
|
113
|
+
commonHeaders: headers,
|
|
114
114
|
services,
|
|
115
115
|
nodeInfo: pick(nodeInfo, ['name', 'version', 'port', 'mode', 'enableWelcomePage', 'routing']),
|
|
116
116
|
});
|
package/lib/router/manager.js
CHANGED
|
@@ -222,7 +222,7 @@ class RouterManager extends EventEmitter {
|
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
// let custom domain in front of protected domain
|
|
225
|
-
const domainAliases = [{ value: domainAlias, isProtected: false }, ...dbSite.domainAliases];
|
|
225
|
+
const domainAliases = [{ value: domainAlias, isProtected: false }, ...(dbSite.domainAliases || [])];
|
|
226
226
|
|
|
227
227
|
const updateResult = await states.site.update({ _id: id }, { $set: { domainAliases } });
|
|
228
228
|
logger.debug('add domain alias update result', { id, updateResult, domainAlias });
|
|
@@ -420,7 +420,7 @@ class RouterManager extends EventEmitter {
|
|
|
420
420
|
}
|
|
421
421
|
|
|
422
422
|
async getMatchedCert(domain) {
|
|
423
|
-
const certs = await this.certManager.
|
|
423
|
+
const certs = await this.certManager.getAllNormal();
|
|
424
424
|
const matchedCert = certs.find((cert) => this.isCertMatchedDomain(cert, domain));
|
|
425
425
|
|
|
426
426
|
if (matchedCert) {
|
|
@@ -546,7 +546,7 @@ class RouterManager extends EventEmitter {
|
|
|
546
546
|
getRoutingParams: async () => ({
|
|
547
547
|
sites: await ensureLatestInfo(sites),
|
|
548
548
|
certificates,
|
|
549
|
-
|
|
549
|
+
commonHeaders: get(info, 'routing.headers', {}),
|
|
550
550
|
services: [], // TODO: do we need to add some item here?
|
|
551
551
|
nodeInfo: info,
|
|
552
552
|
}),
|
package/lib/team/manager.js
CHANGED
|
@@ -267,6 +267,19 @@ class TeamManager extends EventEmitter {
|
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
|
|
270
|
+
async getOwner(did) {
|
|
271
|
+
let owner;
|
|
272
|
+
if (this.isNodeTeam(did)) {
|
|
273
|
+
const nodeInfo = await this.states.node.read();
|
|
274
|
+
owner = get(nodeInfo, 'nodeOwner');
|
|
275
|
+
} else {
|
|
276
|
+
const settings = await this.states.blockletExtras.getSettings(did);
|
|
277
|
+
owner = get(settings, 'owner');
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return owner;
|
|
281
|
+
}
|
|
282
|
+
|
|
270
283
|
// =======
|
|
271
284
|
// Private
|
|
272
285
|
// =======
|
package/lib/util/blocklet.js
CHANGED
|
@@ -48,7 +48,6 @@ const { validate: validateEngine, get: getEngine } = require('../blocklet/manage
|
|
|
48
48
|
|
|
49
49
|
const isRequirementsSatisfied = require('./requirement');
|
|
50
50
|
const { getDidDomainForBlocklet } = require('./get-domain-for-blocklet');
|
|
51
|
-
const { getServices } = require('./service');
|
|
52
51
|
const {
|
|
53
52
|
isBeforeInstalled,
|
|
54
53
|
expandBundle,
|
|
@@ -1024,7 +1023,7 @@ const fixAndVerifyBlockletMeta = (meta, did) => {
|
|
|
1024
1023
|
}
|
|
1025
1024
|
|
|
1026
1025
|
// this step comes last because it has side effects: the meta is changed
|
|
1027
|
-
return fixAndValidateService(meta
|
|
1026
|
+
return fixAndValidateService(meta);
|
|
1028
1027
|
};
|
|
1029
1028
|
|
|
1030
1029
|
const getUpdateMetaList = (oldMetas = [], newMetas = []) => {
|
package/lib/util/index.js
CHANGED
|
@@ -35,7 +35,6 @@ const DEFAULT_WELLKNOWN_PORT = 8088;
|
|
|
35
35
|
|
|
36
36
|
const logger = require('@abtnode/logger')('@abtnode/core:util');
|
|
37
37
|
|
|
38
|
-
const { getServices } = require('./service');
|
|
39
38
|
const request = require('./request');
|
|
40
39
|
|
|
41
40
|
const validateOwner = (owner) => {
|
|
@@ -496,13 +495,9 @@ const lib = {
|
|
|
496
495
|
ensureDataDirs,
|
|
497
496
|
getDataDirs,
|
|
498
497
|
getBaseUrls,
|
|
499
|
-
getBlockletMeta:
|
|
500
|
-
parseBlockletMeta(dir, {
|
|
501
|
-
serviceMetas: getServices(),
|
|
502
|
-
...opts,
|
|
503
|
-
}),
|
|
498
|
+
getBlockletMeta: parseBlockletMeta,
|
|
504
499
|
validateBlockletMeta: (meta, opts = {}) => {
|
|
505
|
-
fixAndValidateService(meta
|
|
500
|
+
fixAndValidateService(meta);
|
|
506
501
|
return validateMeta(meta, opts);
|
|
507
502
|
},
|
|
508
503
|
getBlockletMetaByUrl,
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.7.
|
|
6
|
+
"version": "1.7.11",
|
|
7
7
|
"description": "",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"files": [
|
|
@@ -19,31 +19,30 @@
|
|
|
19
19
|
"author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
|
|
20
20
|
"license": "MIT",
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@abtnode/certificate-manager": "1.7.
|
|
23
|
-
"@abtnode/constant": "1.7.
|
|
24
|
-
"@abtnode/cron": "1.7.
|
|
25
|
-
"@abtnode/db": "1.7.
|
|
26
|
-
"@abtnode/logger": "1.7.
|
|
27
|
-
"@abtnode/queue": "1.7.
|
|
28
|
-
"@abtnode/rbac": "1.7.
|
|
29
|
-
"@abtnode/router-provider": "1.7.
|
|
30
|
-
"@abtnode/static-server": "1.7.
|
|
31
|
-
"@abtnode/timemachine": "1.7.
|
|
32
|
-
"@abtnode/util": "1.7.
|
|
33
|
-
"@arcblock/did": "^1.16.
|
|
22
|
+
"@abtnode/certificate-manager": "1.7.11",
|
|
23
|
+
"@abtnode/constant": "1.7.11",
|
|
24
|
+
"@abtnode/cron": "1.7.11",
|
|
25
|
+
"@abtnode/db": "1.7.11",
|
|
26
|
+
"@abtnode/logger": "1.7.11",
|
|
27
|
+
"@abtnode/queue": "1.7.11",
|
|
28
|
+
"@abtnode/rbac": "1.7.11",
|
|
29
|
+
"@abtnode/router-provider": "1.7.11",
|
|
30
|
+
"@abtnode/static-server": "1.7.11",
|
|
31
|
+
"@abtnode/timemachine": "1.7.11",
|
|
32
|
+
"@abtnode/util": "1.7.11",
|
|
33
|
+
"@arcblock/did": "^1.16.5",
|
|
34
34
|
"@arcblock/did-motif": "^1.1.5",
|
|
35
|
-
"@arcblock/event-hub": "1.16.
|
|
35
|
+
"@arcblock/event-hub": "1.16.5",
|
|
36
36
|
"@arcblock/pm2-events": "^0.0.5",
|
|
37
|
-
"@arcblock/vc": "^1.16.
|
|
38
|
-
"@blocklet/meta": "1.7.
|
|
37
|
+
"@arcblock/vc": "^1.16.5",
|
|
38
|
+
"@blocklet/meta": "1.7.11",
|
|
39
39
|
"@fidm/x509": "^1.2.1",
|
|
40
40
|
"@nedb/core": "^1.2.2",
|
|
41
41
|
"@nedb/multi": "^1.2.2",
|
|
42
|
-
"@ocap/mcrypto": "^1.16.
|
|
43
|
-
"@ocap/util": "^1.16.
|
|
44
|
-
"@ocap/wallet": "^1.16.
|
|
42
|
+
"@ocap/mcrypto": "^1.16.5",
|
|
43
|
+
"@ocap/util": "^1.16.5",
|
|
44
|
+
"@ocap/wallet": "^1.16.5",
|
|
45
45
|
"@slack/webhook": "^5.0.3",
|
|
46
|
-
"ajv": "^7.0.3",
|
|
47
46
|
"axios": "^0.26.1",
|
|
48
47
|
"axon": "^2.0.3",
|
|
49
48
|
"chalk": "^4.0.0",
|
|
@@ -78,5 +77,5 @@
|
|
|
78
77
|
"express": "^4.17.1",
|
|
79
78
|
"jest": "^27.4.5"
|
|
80
79
|
},
|
|
81
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "84e741e6b37e47d52bf834ce3ace8ed601d0896c"
|
|
82
81
|
}
|
package/lib/util/service.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
const fs = require('fs-extra');
|
|
2
|
-
const cloneDeep = require('lodash/cloneDeep');
|
|
3
|
-
const Ajv = require('ajv').default;
|
|
4
|
-
|
|
5
|
-
const { NODE_SERVICES } = require('@abtnode/constant');
|
|
6
|
-
|
|
7
|
-
const ajv = new Ajv({
|
|
8
|
-
useDefaults: true,
|
|
9
|
-
removeAdditional: 'all',
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
const SERVICES = {
|
|
13
|
-
AUTH: fs.readJSONSync(require.resolve('@abtnode/blocklet-services/configs/auth.json')),
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const getServices = ({ stringifySchema = false } = {}) => {
|
|
17
|
-
const list = Object.values(SERVICES).map((x) => {
|
|
18
|
-
const data = cloneDeep(x);
|
|
19
|
-
if (stringifySchema) {
|
|
20
|
-
data.schema = JSON.stringify(x.schema);
|
|
21
|
-
}
|
|
22
|
-
return data;
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
// backward compatible
|
|
26
|
-
const authService = cloneDeep(list.find((x) => x.name === NODE_SERVICES.AUTH));
|
|
27
|
-
authService.name = NODE_SERVICES.AUTH_SERVICE;
|
|
28
|
-
list.push(authService);
|
|
29
|
-
|
|
30
|
-
return list;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const getServiceMeta = (serviceName) => {
|
|
34
|
-
if (!serviceName) {
|
|
35
|
-
throw new Error('service name should not be empty');
|
|
36
|
-
}
|
|
37
|
-
const metas = getServices();
|
|
38
|
-
const meta = metas.find((x) => x.name === serviceName);
|
|
39
|
-
if (!meta) {
|
|
40
|
-
throw new Error(`service ${serviceName} does not exist`);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return meta;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const getServiceConfig = (service, customConfig) => {
|
|
47
|
-
const serviceMeta = typeof service === 'string' ? getServiceMeta(service) : service;
|
|
48
|
-
|
|
49
|
-
const validate = ajv.compile(serviceMeta.schema.JSONSchema);
|
|
50
|
-
|
|
51
|
-
const data = cloneDeep(customConfig || {});
|
|
52
|
-
// this method may have side effect thar will fill default value to customConfig
|
|
53
|
-
validate(data || {});
|
|
54
|
-
|
|
55
|
-
return data;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const getDefaultServiceConfig = (service) => {
|
|
59
|
-
const serviceMeta = typeof service === 'string' ? getServiceMeta(service) : service;
|
|
60
|
-
|
|
61
|
-
// parse empty custom config to get default config
|
|
62
|
-
return getServiceConfig(serviceMeta, {});
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const findService = (services, name) => {
|
|
66
|
-
const names = [name];
|
|
67
|
-
|
|
68
|
-
// backward compatible
|
|
69
|
-
if (name === NODE_SERVICES.AUTH) {
|
|
70
|
-
names.push(NODE_SERVICES.AUTH_SERVICE);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return (services || []).find((x) => names.includes(x.name));
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
module.exports = {
|
|
77
|
-
getServices,
|
|
78
|
-
getServiceConfig,
|
|
79
|
-
getDefaultServiceConfig,
|
|
80
|
-
findService,
|
|
81
|
-
};
|