@abtnode/core 1.7.5 → 1.7.8
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 +1 -4
- package/lib/blocklet/manager/disk.js +107 -9
- package/lib/event.js +2 -0
- package/lib/index.js +4 -0
- package/lib/migrations/1.0.21-update-config.js +1 -1
- package/lib/migrations/1.0.22-max-memory.js +1 -1
- package/lib/migrations/1.0.25.js +1 -1
- package/lib/migrations/1.0.32-update-config.js +1 -1
- package/lib/migrations/1.6.21-rename-ip-echo-domain.js +1 -1
- package/lib/migrations/1.6.4-security.js +1 -1
- package/lib/migrations/README.md +1 -1
- package/lib/router/helper.js +11 -0
- package/lib/states/blocklet.js +18 -1
- package/lib/util/blocklet.js +11 -6
- package/lib/util/get-domain-for-blocklet.js +1 -1
- package/package.json +23 -23
package/lib/api/team.js
CHANGED
|
@@ -211,7 +211,7 @@ class TeamAPI extends EventEmitter {
|
|
|
211
211
|
|
|
212
212
|
// Invite member
|
|
213
213
|
|
|
214
|
-
async createInvitation({ teamDid, role, remark
|
|
214
|
+
async createInvitation({ teamDid, role, remark }, context) {
|
|
215
215
|
await this.teamManager.checkEnablePassportIssuance(teamDid);
|
|
216
216
|
|
|
217
217
|
if (!role) {
|
|
@@ -242,7 +242,6 @@ class TeamAPI extends EventEmitter {
|
|
|
242
242
|
expireDate,
|
|
243
243
|
inviter: user,
|
|
244
244
|
teamDid,
|
|
245
|
-
interfaceName,
|
|
246
245
|
});
|
|
247
246
|
|
|
248
247
|
logger.info('Create invite member', { role, user, inviteId });
|
|
@@ -254,7 +253,6 @@ class TeamAPI extends EventEmitter {
|
|
|
254
253
|
expireDate: new Date(expireDate).toString(),
|
|
255
254
|
inviter: user,
|
|
256
255
|
teamDid,
|
|
257
|
-
interfaceName,
|
|
258
256
|
};
|
|
259
257
|
}
|
|
260
258
|
|
|
@@ -271,7 +269,6 @@ class TeamAPI extends EventEmitter {
|
|
|
271
269
|
expireDate: new Date(d.expireDate).toString(),
|
|
272
270
|
inviter: d.inviter,
|
|
273
271
|
teamDid: d.teamDid,
|
|
274
|
-
interfaceName: d.interfaceName,
|
|
275
272
|
}));
|
|
276
273
|
}
|
|
277
274
|
|
|
@@ -15,7 +15,7 @@ const { isValid: isValidDid } = require('@arcblock/did');
|
|
|
15
15
|
const { verifyPresentation } = require('@arcblock/vc');
|
|
16
16
|
const { toBase58, isHex } = require('@ocap/util');
|
|
17
17
|
const { fromSecretKey } = require('@ocap/wallet');
|
|
18
|
-
const {
|
|
18
|
+
const { toSvg: createDidLogo } =
|
|
19
19
|
process.env.NODE_ENV !== 'test' ? require('@arcblock/did-motif') : require('@arcblock/did-motif/dist/did-motif.cjs');
|
|
20
20
|
|
|
21
21
|
const logger = require('@abtnode/logger')('@abtnode/core:blocklet:manager');
|
|
@@ -104,6 +104,7 @@ const blockletPm2Events = require('./pm2-events');
|
|
|
104
104
|
const { getFactoryState } = require('../../util/chain');
|
|
105
105
|
const runMigrationScripts = require('../migration');
|
|
106
106
|
const hooks = require('../hooks');
|
|
107
|
+
const { formatName } = require('../../util/get-domain-for-blocklet');
|
|
107
108
|
|
|
108
109
|
const {
|
|
109
110
|
isInProgress,
|
|
@@ -279,9 +280,9 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
279
280
|
return this._installFromStore({ did, registry }, { ...context, blockletPurchaseVerified: true });
|
|
280
281
|
}
|
|
281
282
|
|
|
282
|
-
async start({ did, checkHealthImmediately = false,
|
|
283
|
+
async start({ did, throwOnError, checkHealthImmediately = false, e2eMode = false }, context) {
|
|
283
284
|
logger.info('start blocklet', { did });
|
|
284
|
-
const blocklet = await this.ensureBlocklet(did);
|
|
285
|
+
const blocklet = await this.ensureBlocklet(did, e2eMode);
|
|
285
286
|
|
|
286
287
|
try {
|
|
287
288
|
if (!hasRunnableComponent(blocklet)) {
|
|
@@ -319,6 +320,7 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
319
320
|
}),
|
|
320
321
|
nodeEnvironments,
|
|
321
322
|
nodeInfo: await states.node.read(),
|
|
323
|
+
e2eMode,
|
|
322
324
|
});
|
|
323
325
|
|
|
324
326
|
// check blocklet healthy
|
|
@@ -481,6 +483,40 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
481
483
|
}
|
|
482
484
|
}
|
|
483
485
|
|
|
486
|
+
async reset({ did }, context = {}) {
|
|
487
|
+
logger.info('reset blocklet', { did });
|
|
488
|
+
|
|
489
|
+
const blocklet = await this.ensureBlocklet(did);
|
|
490
|
+
|
|
491
|
+
if (isInProgress(blocklet.status)) {
|
|
492
|
+
throw new Error('Cannot reset when blocklet is in progress');
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
try {
|
|
496
|
+
await this.deleteProcess({ did }, context);
|
|
497
|
+
} catch {
|
|
498
|
+
// do nothing
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Cleanup disk storage
|
|
502
|
+
const { name } = blocklet.meta;
|
|
503
|
+
const dataDir = path.join(this.dataDirs.data, name);
|
|
504
|
+
const logsDir = path.join(this.dataDirs.logs, name);
|
|
505
|
+
const cacheDir = path.join(this.dataDirs.cache, name);
|
|
506
|
+
fs.removeSync(cacheDir);
|
|
507
|
+
fs.removeSync(dataDir);
|
|
508
|
+
fs.removeSync(logsDir);
|
|
509
|
+
|
|
510
|
+
// Reset config in db
|
|
511
|
+
await this._delExtras(did);
|
|
512
|
+
await this._setConfigs(did);
|
|
513
|
+
await this.updateBlockletEnvironment(did);
|
|
514
|
+
await this.resetSiteByDid(did, context);
|
|
515
|
+
|
|
516
|
+
logger.info('blocklet reset', { did });
|
|
517
|
+
return blocklet;
|
|
518
|
+
}
|
|
519
|
+
|
|
484
520
|
async deleteComponent({ did, rootDid }, context) {
|
|
485
521
|
logger.info('delete blocklet component', { did, rootDid });
|
|
486
522
|
|
|
@@ -928,14 +964,22 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
928
964
|
* After the dev function finished, the caller should send a BlockletEvents.deployed event to the daemon
|
|
929
965
|
* @returns {Object} blocklet
|
|
930
966
|
*/
|
|
931
|
-
async dev(folder) {
|
|
932
|
-
logger.info('dev
|
|
967
|
+
async dev(folder, { rootDid, mountPoint } = {}) {
|
|
968
|
+
logger.info('dev component', { folder, rootDid, mountPoint });
|
|
933
969
|
|
|
934
970
|
const meta = getBlockletMeta(folder);
|
|
935
971
|
if (meta.group !== 'static' && (!meta.scripts || !meta.scripts.dev)) {
|
|
936
972
|
throw new Error('Incorrect blocklet manifest: missing `scripts.dev` field');
|
|
937
973
|
}
|
|
938
974
|
|
|
975
|
+
if (rootDid) {
|
|
976
|
+
return this._devComponent({ folder, meta, rootDid, mountPoint });
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
return this._devBlocklet({ folder, meta });
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
async _devBlocklet({ folder, meta }) {
|
|
939
983
|
const { did, version } = meta;
|
|
940
984
|
|
|
941
985
|
const exist = await states.blocklet.getBlocklet(did);
|
|
@@ -985,10 +1029,63 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
985
1029
|
|
|
986
1030
|
const blocklet = await this.ensureBlocklet(did);
|
|
987
1031
|
|
|
1032
|
+
await fs.writeFile(path.join(blocklet.env.dataDir, 'logo.svg'), createDidLogo(blocklet.meta.did));
|
|
1033
|
+
|
|
988
1034
|
return blocklet;
|
|
989
1035
|
}
|
|
990
1036
|
|
|
991
|
-
async
|
|
1037
|
+
async _devComponent({ folder, meta, rootDid, mountPoint }) {
|
|
1038
|
+
const { did, version } = meta;
|
|
1039
|
+
|
|
1040
|
+
const existRoot = await states.blocklet.getBlocklet(rootDid);
|
|
1041
|
+
if (!existRoot) {
|
|
1042
|
+
throw new Error('Root blocklet does not exist');
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
const exist = existRoot.children.find((x) => x.meta.did === meta.did);
|
|
1046
|
+
if (exist) {
|
|
1047
|
+
if (exist.mode === BLOCKLET_MODES.PRODUCTION) {
|
|
1048
|
+
throw new Error('The blocklet component of production mode already exists, please remove it before developing');
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
const status = fromBlockletStatus(exist.status);
|
|
1052
|
+
if (['starting', 'running'].includes(status)) {
|
|
1053
|
+
throw new Error(`The blocklet component is already on ${status}, please stop it before developing`);
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
logger.info('remove blocklet component for dev', { did, version });
|
|
1057
|
+
|
|
1058
|
+
await this.deleteComponent({ did, rootDid });
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
const defaultPath = formatName(meta.name);
|
|
1062
|
+
const children = await parseChildren(existRoot.meta, {
|
|
1063
|
+
children: [
|
|
1064
|
+
{
|
|
1065
|
+
meta,
|
|
1066
|
+
mountPoint: mountPoint || `/${defaultPath}`,
|
|
1067
|
+
source: BlockletSource.local,
|
|
1068
|
+
deployedFrom: folder,
|
|
1069
|
+
status: BlockletStatus.installed,
|
|
1070
|
+
mode: BLOCKLET_MODES.DEVELOPMENT,
|
|
1071
|
+
},
|
|
1072
|
+
],
|
|
1073
|
+
dynamic: true,
|
|
1074
|
+
});
|
|
1075
|
+
await states.blocklet.addChildren(rootDid, children);
|
|
1076
|
+
|
|
1077
|
+
logger.info('add blocklet component for dev', { did, version, meta });
|
|
1078
|
+
|
|
1079
|
+
// Add environments
|
|
1080
|
+
await this._setConfigs(rootDid);
|
|
1081
|
+
await this.updateBlockletEnvironment(rootDid);
|
|
1082
|
+
|
|
1083
|
+
const rootBlocklet = await this.ensureBlocklet(rootDid);
|
|
1084
|
+
|
|
1085
|
+
return rootBlocklet;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
async ensureBlocklet(did, e2eMode = false) {
|
|
992
1089
|
if (!isValidDid(did)) {
|
|
993
1090
|
throw new Error(`Blocklet did is invalid: ${did}`);
|
|
994
1091
|
}
|
|
@@ -1006,6 +1103,7 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
1006
1103
|
...getBlockletDirs(blocklet, {
|
|
1007
1104
|
dataDirs: this.dataDirs,
|
|
1008
1105
|
ensure: true,
|
|
1106
|
+
e2eMode,
|
|
1009
1107
|
}),
|
|
1010
1108
|
};
|
|
1011
1109
|
|
|
@@ -1734,7 +1832,7 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
1734
1832
|
meta,
|
|
1735
1833
|
mountPoint,
|
|
1736
1834
|
source: BlockletSource.upload,
|
|
1737
|
-
deployedFrom: `Upload by ${context.user.
|
|
1835
|
+
deployedFrom: `Upload by ${context.user.fullName}`,
|
|
1738
1836
|
sourceUrl: '',
|
|
1739
1837
|
dynamic: true,
|
|
1740
1838
|
};
|
|
@@ -2216,7 +2314,7 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
2216
2314
|
blocklet = await this.ensureBlocklet(did);
|
|
2217
2315
|
logger.info('blocklet installed', { source, did: meta.did });
|
|
2218
2316
|
|
|
2219
|
-
await fs.writeFile(path.join(blocklet.env.dataDir, 'logo.
|
|
2317
|
+
await fs.writeFile(path.join(blocklet.env.dataDir, 'logo.svg'), createDidLogo(blocklet.meta.did));
|
|
2220
2318
|
|
|
2221
2319
|
this.emit(BlockletEvents.installed, { blocklet, context });
|
|
2222
2320
|
|
|
@@ -2344,7 +2442,7 @@ class BlockletManager extends BaseBlockletManager {
|
|
|
2344
2442
|
|
|
2345
2443
|
blocklet = await this.ensureBlocklet(did, context);
|
|
2346
2444
|
|
|
2347
|
-
await fs.writeFile(path.join(blocklet.env.dataDir, 'logo.
|
|
2445
|
+
await fs.writeFile(path.join(blocklet.env.dataDir, 'logo.svg'), createDidLogo(blocklet.meta.did));
|
|
2348
2446
|
|
|
2349
2447
|
this.refreshListCache();
|
|
2350
2448
|
|
package/lib/event.js
CHANGED
|
@@ -30,6 +30,8 @@ module.exports = ({
|
|
|
30
30
|
const nodeState = states.node;
|
|
31
31
|
|
|
32
32
|
const events = new EventEmitter();
|
|
33
|
+
events.setMaxListeners(0);
|
|
34
|
+
|
|
33
35
|
// HACK: do not emit any events from CLI
|
|
34
36
|
if (isCLI() && process.env.NODE_ENV !== 'test') {
|
|
35
37
|
events.emit = (name) => logger.debug('stopped core state event in CLI', name);
|
package/lib/index.js
CHANGED
|
@@ -133,11 +133,13 @@ function ABTNode(options) {
|
|
|
133
133
|
registry: blockletRegistry,
|
|
134
134
|
daemon: options.daemon,
|
|
135
135
|
});
|
|
136
|
+
blockletManager.setMaxListeners(0);
|
|
136
137
|
|
|
137
138
|
const {
|
|
138
139
|
handleRouting,
|
|
139
140
|
getRoutingRulesByDid,
|
|
140
141
|
getSiteByDid,
|
|
142
|
+
resetSiteByDid,
|
|
141
143
|
updateNodeRouting,
|
|
142
144
|
takeRoutingSnapshot,
|
|
143
145
|
getRoutingSites,
|
|
@@ -159,6 +161,7 @@ function ABTNode(options) {
|
|
|
159
161
|
|
|
160
162
|
blockletManager.getRoutingRulesByDid = getRoutingRulesByDid;
|
|
161
163
|
blockletManager.getSiteByDid = getSiteByDid;
|
|
164
|
+
blockletManager.resetSiteByDid = resetSiteByDid;
|
|
162
165
|
|
|
163
166
|
// Generate an on node ready callback
|
|
164
167
|
const onStatesReady = createStateReadyQueue({ states, options, dataDirs });
|
|
@@ -216,6 +219,7 @@ function ABTNode(options) {
|
|
|
216
219
|
updateChildBlocklets: blockletManager.updateChildren.bind(blockletManager),
|
|
217
220
|
getLatestBlockletVersion: blockletManager.getLatestBlockletVersion.bind(blockletManager),
|
|
218
221
|
getBlockletMetaFromUrl: blockletManager.getMetaFromUrl.bind(blockletManager),
|
|
222
|
+
resetBlocklet: blockletManager.reset.bind(blockletManager),
|
|
219
223
|
|
|
220
224
|
deleteBlockletProcess: blockletManager.deleteProcess.bind(blockletManager),
|
|
221
225
|
|
|
@@ -7,7 +7,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
|
|
|
7
7
|
printInfo('Try to update node config to 1.0.21...');
|
|
8
8
|
let changed = false;
|
|
9
9
|
|
|
10
|
-
const rawConfig = yaml.
|
|
10
|
+
const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
|
|
11
11
|
const info = await states.node.read();
|
|
12
12
|
|
|
13
13
|
const updates = [
|
|
@@ -13,7 +13,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
|
|
|
13
13
|
printInfo('Try to update node config to 1.0.22...');
|
|
14
14
|
let changed = false;
|
|
15
15
|
|
|
16
|
-
const rawConfig = yaml.
|
|
16
|
+
const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
|
|
17
17
|
const info = await states.node.read();
|
|
18
18
|
|
|
19
19
|
const updates = [
|
package/lib/migrations/1.0.25.js
CHANGED
|
@@ -10,7 +10,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
|
|
|
10
10
|
printInfo('Try to update node config to 1.0.25...');
|
|
11
11
|
let changed = false;
|
|
12
12
|
|
|
13
|
-
const rawConfig = yaml.
|
|
13
|
+
const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
|
|
14
14
|
const info = await states.node.read();
|
|
15
15
|
|
|
16
16
|
const updates = [
|
|
@@ -7,7 +7,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
|
|
|
7
7
|
printInfo('Try to update node config to 1.0.32...');
|
|
8
8
|
let changed = false;
|
|
9
9
|
|
|
10
|
-
const rawConfig = yaml.
|
|
10
|
+
const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
|
|
11
11
|
const info = await states.node.read();
|
|
12
12
|
|
|
13
13
|
const updates = [{ key: 'routing.https', value: true }];
|
|
@@ -22,7 +22,7 @@ module.exports = async ({ states, printInfo, configFile }) => {
|
|
|
22
22
|
await states.node.updateNodeInfo(info);
|
|
23
23
|
|
|
24
24
|
if (process.env.NODE_ENV !== 'development') {
|
|
25
|
-
let rawConfig = yaml.
|
|
25
|
+
let rawConfig = yaml.load(fs.readFileSync(configFile).toString());
|
|
26
26
|
set(rawConfig, 'node.routing.ipWildcardDomain', info.routing.ipWildcardDomain);
|
|
27
27
|
set(rawConfig, 'node.routing.wildcardCertHost', DEFAULT_WILDCARD_CERT_HOST);
|
|
28
28
|
set(rawConfig, 'node.didDomain', DEFAULT_DID_DOMAIN);
|
|
@@ -19,7 +19,7 @@ module.exports = async ({ states, configFile, dataDir }) => {
|
|
|
19
19
|
try {
|
|
20
20
|
fs.writeFileSync(file, crypto.randomBytes(32), { encoding: 'binary', mode: '0600' });
|
|
21
21
|
|
|
22
|
-
const config = yaml.
|
|
22
|
+
const config = yaml.load(fs.readFileSync(configFile).toString(), { json: true });
|
|
23
23
|
config.node.sk = security.encrypt(config.node.sk, config.node.did, fs.readFileSync(file));
|
|
24
24
|
fs.writeFileSync(configFile, yaml.dump(config));
|
|
25
25
|
await states.node.updateNodeInfo({ sk: config.node.sk });
|
package/lib/migrations/README.md
CHANGED
|
@@ -41,7 +41,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
|
|
|
41
41
|
printInfo('Try to update node config to 1.0.21...');
|
|
42
42
|
let changed = false;
|
|
43
43
|
|
|
44
|
-
const rawConfig = yaml.
|
|
44
|
+
const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
|
|
45
45
|
const info = await states.node.read();
|
|
46
46
|
|
|
47
47
|
const updates = [
|
package/lib/router/helper.js
CHANGED
|
@@ -1131,6 +1131,16 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
|
|
|
1131
1131
|
return (sites || []).find((x) => x.domain === domain);
|
|
1132
1132
|
}
|
|
1133
1133
|
|
|
1134
|
+
async function resetSiteByDid(did, { refreshRouterProvider = true } = {}) {
|
|
1135
|
+
const blocklet = await states.blocklet.getBlocklet(did);
|
|
1136
|
+
await removeBlockletRouting(blocklet);
|
|
1137
|
+
await ensureBlockletRouting(blocklet);
|
|
1138
|
+
if (refreshRouterProvider) {
|
|
1139
|
+
const hash = await takeRoutingSnapshot({ message: `Reset blocklet ${did}`, dryRun: false });
|
|
1140
|
+
logger.info('reset blocklet routing rules', { did, hash });
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1134
1144
|
const providers = {}; // we need to keep reference for different router instances
|
|
1135
1145
|
const handleRouting = async (nodeInfo) => {
|
|
1136
1146
|
const providerName = get(nodeInfo, 'routing.provider', null);
|
|
@@ -1382,6 +1392,7 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
|
|
|
1382
1392
|
handleRouting,
|
|
1383
1393
|
getRoutingRulesByDid,
|
|
1384
1394
|
getSiteByDid,
|
|
1395
|
+
resetSiteByDid,
|
|
1385
1396
|
updateNodeRouting,
|
|
1386
1397
|
takeRoutingSnapshot,
|
|
1387
1398
|
getRoutingSites,
|
package/lib/states/blocklet.js
CHANGED
|
@@ -66,6 +66,16 @@ const formatBlocklet = (blocklet, phase, dek) => {
|
|
|
66
66
|
return blocklet;
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
+
const fixChildren = (children) => {
|
|
70
|
+
if (!children) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
children.forEach((child) => {
|
|
75
|
+
child.mode = child.mode || BLOCKLET_MODES.PRODUCTION;
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
69
79
|
class BlockletState extends BaseState {
|
|
70
80
|
/**
|
|
71
81
|
* Creates an instance of BlockletState
|
|
@@ -163,6 +173,8 @@ class BlockletState extends BaseState {
|
|
|
163
173
|
defaultPort: getMaxPort(ports),
|
|
164
174
|
});
|
|
165
175
|
|
|
176
|
+
fixChildren(children);
|
|
177
|
+
|
|
166
178
|
// add to db
|
|
167
179
|
this.db.insert(
|
|
168
180
|
{
|
|
@@ -244,6 +256,8 @@ class BlockletState extends BaseState {
|
|
|
244
256
|
logger.info('Fill children ports when when upgrading blocklet', { name: doc.meta.name, did: doc.meta.did });
|
|
245
257
|
await this.fillChildrenPorts(children, { oldChildren: doc.children, defaultPort: getMaxPort(ports) });
|
|
246
258
|
|
|
259
|
+
fixChildren(children);
|
|
260
|
+
|
|
247
261
|
// add to db
|
|
248
262
|
const newDoc = await this.updateBlocklet(meta.did, {
|
|
249
263
|
meta: omit(sanitized, ['htmlAst']),
|
|
@@ -506,7 +520,7 @@ class BlockletState extends BaseState {
|
|
|
506
520
|
|
|
507
521
|
const newChildren = [...oldChildren];
|
|
508
522
|
for (const child of children) {
|
|
509
|
-
const { meta, mountPoint, sourceUrl = '', source = '', deployedFrom = '' } = child;
|
|
523
|
+
const { meta, mountPoint, sourceUrl = '', source = '', deployedFrom = '', mode } = child;
|
|
510
524
|
|
|
511
525
|
if (!mountPoint) {
|
|
512
526
|
throw new Error(`mountPoint is required when adding component ${getDisplayName(child, true)}`);
|
|
@@ -524,9 +538,12 @@ class BlockletState extends BaseState {
|
|
|
524
538
|
sourceUrl,
|
|
525
539
|
source,
|
|
526
540
|
deployedFrom,
|
|
541
|
+
mode,
|
|
527
542
|
dynamic: true,
|
|
528
543
|
status: BlockletStatus.added,
|
|
529
544
|
});
|
|
545
|
+
|
|
546
|
+
fixChildren(newChildren);
|
|
530
547
|
}
|
|
531
548
|
|
|
532
549
|
// use upgradeBlocklet to assign ports to children and write new data to db
|
package/lib/util/blocklet.js
CHANGED
|
@@ -104,7 +104,7 @@ const PRIVATE_NODE_ENVS = [
|
|
|
104
104
|
* appMain: app entry file or script (run appMain to start blocklet process)
|
|
105
105
|
* appCwd: cwd of appMain
|
|
106
106
|
*/
|
|
107
|
-
const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false } = {}) => {
|
|
107
|
+
const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false, e2eMode = false } = {}) => {
|
|
108
108
|
if (!rootBlocklet) {
|
|
109
109
|
// eslint-disable-next-line no-param-reassign
|
|
110
110
|
rootBlocklet = blocklet;
|
|
@@ -126,8 +126,13 @@ const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false } =
|
|
|
126
126
|
|
|
127
127
|
const { main, group } = blocklet.meta;
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
let startFromDevEntry = '';
|
|
130
|
+
if (blocklet.mode === BLOCKLET_MODES.DEVELOPMENT && blocklet.meta.scripts) {
|
|
131
|
+
startFromDevEntry = blocklet.meta.scripts.dev;
|
|
132
|
+
if (e2eMode && blocklet.meta.scripts.e2eDev) {
|
|
133
|
+
startFromDevEntry = blocklet.meta.scripts.e2eDev;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
131
136
|
|
|
132
137
|
if (!main && !startFromDevEntry && group !== BlockletGroup.gateway) {
|
|
133
138
|
throw new Error('Incorrect blocklet manifest: missing `main` field');
|
|
@@ -174,7 +179,7 @@ const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false } =
|
|
|
174
179
|
let appMain = null;
|
|
175
180
|
let appCwd = null;
|
|
176
181
|
if (startFromDevEntry) {
|
|
177
|
-
appMain =
|
|
182
|
+
appMain = startFromDevEntry;
|
|
178
183
|
appCwd = appDir;
|
|
179
184
|
} else if (group === 'dapp') {
|
|
180
185
|
appMain = getBlockletEngine(blocklet.meta).script || BLOCKLET_ENTRY_FILE;
|
|
@@ -414,7 +419,7 @@ const getBlockletMetaFromUrl = async (url) => {
|
|
|
414
419
|
* Start all precesses of a blocklet
|
|
415
420
|
* @param {*} blocklet should contain env props
|
|
416
421
|
*/
|
|
417
|
-
const startBlockletProcess = async (blocklet, { preStart = noop, nodeEnvironments, nodeInfo } = {}) => {
|
|
422
|
+
const startBlockletProcess = async (blocklet, { preStart = noop, nodeEnvironments, nodeInfo, e2eMode } = {}) => {
|
|
418
423
|
if (!blocklet) {
|
|
419
424
|
throw new Error('blocklet should not be empty');
|
|
420
425
|
}
|
|
@@ -463,7 +468,7 @@ const startBlockletProcess = async (blocklet, { preStart = noop, nodeEnvironment
|
|
|
463
468
|
}
|
|
464
469
|
|
|
465
470
|
if (b.mode === BLOCKLET_MODES.DEVELOPMENT) {
|
|
466
|
-
options.env.NODE_ENV = 'development';
|
|
471
|
+
options.env.NODE_ENV = e2eMode ? 'e2e' : 'development';
|
|
467
472
|
options.env.BROWSER = 'none';
|
|
468
473
|
options.env.PORT = options.env[BLOCKLET_DEFAULT_PORT_NAME];
|
|
469
474
|
options.script = appMain;
|
|
@@ -23,4 +23,4 @@ const getDidDomainForBlocklet = ({ name, daemonDid, didDomain }) => {
|
|
|
23
23
|
return `${prefix}-${daemonDid.toLowerCase()}.${didDomain}`;
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet };
|
|
26
|
+
module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet, formatName };
|
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.8",
|
|
7
7
|
"description": "",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"files": [
|
|
@@ -19,32 +19,32 @@
|
|
|
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.
|
|
34
|
-
"@arcblock/did-motif": "^1.1.
|
|
35
|
-
"@arcblock/event-hub": "1.
|
|
22
|
+
"@abtnode/certificate-manager": "1.7.8",
|
|
23
|
+
"@abtnode/constant": "1.7.8",
|
|
24
|
+
"@abtnode/cron": "1.7.8",
|
|
25
|
+
"@abtnode/db": "1.7.8",
|
|
26
|
+
"@abtnode/logger": "1.7.8",
|
|
27
|
+
"@abtnode/queue": "1.7.8",
|
|
28
|
+
"@abtnode/rbac": "1.7.8",
|
|
29
|
+
"@abtnode/router-provider": "1.7.8",
|
|
30
|
+
"@abtnode/static-server": "1.7.8",
|
|
31
|
+
"@abtnode/timemachine": "1.7.8",
|
|
32
|
+
"@abtnode/util": "1.7.8",
|
|
33
|
+
"@arcblock/did": "^1.16.3",
|
|
34
|
+
"@arcblock/did-motif": "^1.1.5",
|
|
35
|
+
"@arcblock/event-hub": "1.16.3",
|
|
36
36
|
"@arcblock/pm2-events": "^0.0.5",
|
|
37
|
-
"@arcblock/vc": "^1.
|
|
38
|
-
"@blocklet/meta": "1.7.
|
|
37
|
+
"@arcblock/vc": "^1.16.3",
|
|
38
|
+
"@blocklet/meta": "1.7.8",
|
|
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.
|
|
43
|
-
"@ocap/util": "^1.
|
|
44
|
-
"@ocap/wallet": "^1.
|
|
42
|
+
"@ocap/mcrypto": "^1.16.3",
|
|
43
|
+
"@ocap/util": "^1.16.3",
|
|
44
|
+
"@ocap/wallet": "^1.16.3",
|
|
45
45
|
"@slack/webhook": "^5.0.3",
|
|
46
46
|
"ajv": "^7.0.3",
|
|
47
|
-
"axios": "^0.
|
|
47
|
+
"axios": "^0.26.1",
|
|
48
48
|
"axon": "^2.0.3",
|
|
49
49
|
"chalk": "^4.0.0",
|
|
50
50
|
"deep-diff": "^1.0.2",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"is-ip": "^3.1.0",
|
|
57
57
|
"is-url": "^1.2.4",
|
|
58
58
|
"joi": "^17.6.0",
|
|
59
|
-
"js-yaml": "^
|
|
59
|
+
"js-yaml": "^4.1.0",
|
|
60
60
|
"lodash": "^4.17.21",
|
|
61
61
|
"lru-cache": "^6.0.0",
|
|
62
62
|
"pm2": "^5.1.2",
|
|
@@ -78,5 +78,5 @@
|
|
|
78
78
|
"express": "^4.17.1",
|
|
79
79
|
"jest": "^27.4.5"
|
|
80
80
|
},
|
|
81
|
-
"gitHead": "
|
|
81
|
+
"gitHead": "ae75dd20b4750a31dc53c88b75ed1d95c8f15397"
|
|
82
82
|
}
|