@abtnode/core 1.16.17-beta-2679e686 → 1.16.17-beta-3232a7af
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/router/manager.js +38 -6
- package/lib/states/node.js +1 -0
- package/lib/util/blocklet.js +2 -0
- package/lib/util/router.js +73 -0
- package/lib/validators/node.js +9 -0
- package/package.json +20 -20
package/lib/router/manager.js
CHANGED
|
@@ -18,6 +18,7 @@ const normalizePathPrefix = require('@abtnode/util/lib/normalize-path-prefix');
|
|
|
18
18
|
const logger = require('@abtnode/logger')('@abtnode/core:router:manager');
|
|
19
19
|
const { getProvider } = require('@abtnode/router-provider');
|
|
20
20
|
const checkDomainMatch = require('@abtnode/util/lib/check-domain-match');
|
|
21
|
+
const { isDidDomain } = require('@abtnode/util/lib/url-evaluation');
|
|
21
22
|
const {
|
|
22
23
|
DOMAIN_FOR_IP_SITE,
|
|
23
24
|
DOMAIN_FOR_DEFAULT_SITE,
|
|
@@ -44,6 +45,7 @@ const { findWebInterface } = require('../util/blocklet');
|
|
|
44
45
|
const { attachRuntimeDomainAliases, ensureLatestInfo } = require('./helper');
|
|
45
46
|
const Router = require('./index');
|
|
46
47
|
const states = require('../states');
|
|
48
|
+
const { getDidFromDomainGroupName, updateNFTDomainRecord, revokeAndDeleteNFTDomainRecord } = require('../util/router');
|
|
47
49
|
|
|
48
50
|
const checkPathPrefixInBlackList = (pathPrefix, extraBlackList = []) => {
|
|
49
51
|
const blacklist = [
|
|
@@ -184,7 +186,7 @@ class RouterManager extends EventEmitter {
|
|
|
184
186
|
return dbSite;
|
|
185
187
|
}
|
|
186
188
|
|
|
187
|
-
async addDomainAlias({ id, domainAlias: tmpAlias, force }, context = {}) {
|
|
189
|
+
async addDomainAlias({ id, domainAlias: tmpAlias, force, type, nftDid, chainHost }, context = {}) {
|
|
188
190
|
const domainAlias = await validateAddDomainAlias(tmpAlias, context);
|
|
189
191
|
const dbSite = await states.site.findOne({ id });
|
|
190
192
|
if (!dbSite) {
|
|
@@ -215,12 +217,26 @@ class RouterManager extends EventEmitter {
|
|
|
215
217
|
}
|
|
216
218
|
|
|
217
219
|
const doc = await states.site.findOne({ id });
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
const item = { value: domainAlias, isProtected: false };
|
|
221
|
+
if (type === 'nft-domain') {
|
|
222
|
+
item.type = type;
|
|
223
|
+
item.nftDid = nftDid;
|
|
224
|
+
item.chainHost = chainHost;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const updateResult = await states.site.update({ id }, { $set: { domainAliases: [...doc.domainAliases, item] } });
|
|
222
228
|
logger.debug('add domain alias update result', { id, updateResult, domainAlias });
|
|
223
229
|
|
|
230
|
+
if (type === 'nft-domain') {
|
|
231
|
+
const did = getDidFromDomainGroupName(doc.domain); // TODO: 是不是可靠?
|
|
232
|
+
const didDomain = doc.domainAliases.find((x) => isDidDomain(x.value));
|
|
233
|
+
const blocklet = await states.blocklet.getBlocklet(did);
|
|
234
|
+
const nodeInfo = await states.node.read();
|
|
235
|
+
|
|
236
|
+
await updateNFTDomainRecord({ name: domainAlias, value: didDomain.value, blocklet, nodeInfo });
|
|
237
|
+
logger.info('update nft domain record', { domain: domainAlias, didDomain: '', nftDid, id });
|
|
238
|
+
}
|
|
239
|
+
|
|
224
240
|
const newSite = await states.site.findOne({ id });
|
|
225
241
|
await attachRuntimeDomainAliases({ sites: newSite, context, node: states.node });
|
|
226
242
|
|
|
@@ -228,12 +244,16 @@ class RouterManager extends EventEmitter {
|
|
|
228
244
|
}
|
|
229
245
|
|
|
230
246
|
async deleteDomainAlias({ id, domainAlias: tmpAlias }, context = {}) {
|
|
231
|
-
|
|
247
|
+
let domainAlias = await validateAddDomainAlias(tmpAlias, context);
|
|
248
|
+
domainAlias = toLower(domainAlias);
|
|
249
|
+
|
|
232
250
|
const dbSite = await states.site.findOne({ id });
|
|
233
251
|
if (!dbSite) {
|
|
234
252
|
throw new Error(`site ${id} does not exist`);
|
|
235
253
|
}
|
|
236
254
|
|
|
255
|
+
const toDelete = dbSite.domainAliases.find((x) => toLower(x.value) === domainAlias);
|
|
256
|
+
|
|
237
257
|
dbSite.domainAliases = dbSite.domainAliases.filter((x) => {
|
|
238
258
|
if (typeof x === 'string') {
|
|
239
259
|
return toLower(x) !== domainAlias;
|
|
@@ -247,6 +267,18 @@ class RouterManager extends EventEmitter {
|
|
|
247
267
|
|
|
248
268
|
await attachRuntimeDomainAliases({ sites: dbSite, context, node: states.node });
|
|
249
269
|
|
|
270
|
+
if (toDelete?.type === 'nft-domain') {
|
|
271
|
+
const blockletDid = getDidFromDomainGroupName(dbSite.domain); // TODO: 是不是可靠?
|
|
272
|
+
const blocklet = await states.blocklet.getBlocklet(blockletDid);
|
|
273
|
+
const nodeInfo = await states.node.read();
|
|
274
|
+
|
|
275
|
+
revokeAndDeleteNFTDomainRecord({ name: domainAlias, blocklet, nodeInfo })
|
|
276
|
+
.then(() => logger.info('revoke and delete nft domain record', { domain: domainAlias, blockletDid, id }))
|
|
277
|
+
.catch((error) =>
|
|
278
|
+
logger.error('revoke and delete nft domain record failed', { error, domain: domainAlias, blockletDid, id })
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
250
282
|
return dbSite;
|
|
251
283
|
}
|
|
252
284
|
|
package/lib/states/node.js
CHANGED
package/lib/util/blocklet.js
CHANGED
|
@@ -274,6 +274,7 @@ const getAppSystemEnvironments = (blocklet, nodeInfo, dataDirs) => {
|
|
|
274
274
|
|
|
275
275
|
const { wallet } = result;
|
|
276
276
|
const appSk = toHex(wallet.secretKey);
|
|
277
|
+
const appPk = toHex(wallet.publicKey);
|
|
277
278
|
const appId = wallet.address;
|
|
278
279
|
const appName = title || name || result.name;
|
|
279
280
|
const appDescription = description || result.description;
|
|
@@ -302,6 +303,7 @@ const getAppSystemEnvironments = (blocklet, nodeInfo, dataDirs) => {
|
|
|
302
303
|
|
|
303
304
|
return {
|
|
304
305
|
BLOCKLET_DID: did, // BLOCKLET_DID is always same as BLOCKLET_APP_PID in structV2 application
|
|
306
|
+
BLOCKLET_APP_PK: appPk,
|
|
305
307
|
BLOCKLET_APP_SK: appSk,
|
|
306
308
|
BLOCKLET_APP_ID: appId,
|
|
307
309
|
BLOCKLET_APP_PSK: appPsk, // permanent sk even the blocklet has been migrated
|
package/lib/util/router.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
const { BLOCKLET_SITE_GROUP_SUFFIX } = require('@abtnode/constant');
|
|
2
|
+
const axios = require('@abtnode/util/lib/axios');
|
|
3
|
+
const getBlockletInfo = require('@blocklet/meta/lib/info');
|
|
4
|
+
const { stableStringify } = require('@arcblock/vc');
|
|
5
|
+
const { toBase58 } = require('@ocap/util');
|
|
6
|
+
const joinURL = require('url-join');
|
|
7
|
+
const logger = require('@abtnode/logger')('@abtnode/core:router:util');
|
|
2
8
|
|
|
3
9
|
const getBlockletDomainGroupName = (did) => `${did}${BLOCKLET_SITE_GROUP_SUFFIX}`;
|
|
4
10
|
|
|
@@ -7,7 +13,74 @@ const getDidFromDomainGroupName = (name) => {
|
|
|
7
13
|
return did;
|
|
8
14
|
};
|
|
9
15
|
|
|
16
|
+
const getNFTDomainHeaders = ({ wallet, payload }) => ({
|
|
17
|
+
'x-blocklet-sig': toBase58(wallet.sign(stableStringify(payload))),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const updateNFTDomainRecord = async ({ name, value, blocklet, nodeInfo }) => {
|
|
21
|
+
const { wallet } = getBlockletInfo(blocklet, nodeInfo.sk);
|
|
22
|
+
|
|
23
|
+
const payload = {
|
|
24
|
+
delegatee: wallet.address,
|
|
25
|
+
domain: name,
|
|
26
|
+
record: {
|
|
27
|
+
name,
|
|
28
|
+
type: 'CNAME',
|
|
29
|
+
value,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
try {
|
|
33
|
+
const { data } = await axios({
|
|
34
|
+
method: 'POST',
|
|
35
|
+
url: joinURL(nodeInfo.nftDomainUrl, '/api/domains'), // TODO: 替换为真实地址
|
|
36
|
+
data: payload,
|
|
37
|
+
headers: getNFTDomainHeaders({ wallet, payload }),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
return data;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
logger.error('updateNFTDomainRecord error', {
|
|
43
|
+
error,
|
|
44
|
+
name,
|
|
45
|
+
value,
|
|
46
|
+
delegatee: wallet.address,
|
|
47
|
+
appPid: blocklet.appPid,
|
|
48
|
+
resp: error.response?.data,
|
|
49
|
+
});
|
|
50
|
+
throw new Error('update nft domain record failed');
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const revokeAndDeleteNFTDomainRecord = async ({ name, blocklet, nodeInfo }) => {
|
|
55
|
+
const { wallet } = getBlockletInfo(blocklet, nodeInfo.sk);
|
|
56
|
+
|
|
57
|
+
const payload = {
|
|
58
|
+
delegatee: wallet.address,
|
|
59
|
+
domain: name,
|
|
60
|
+
};
|
|
61
|
+
try {
|
|
62
|
+
const { data } = await axios({
|
|
63
|
+
method: 'DELETE',
|
|
64
|
+
url: joinURL(nodeInfo.nftDomainUrl, '/api/domains'),
|
|
65
|
+
data: payload,
|
|
66
|
+
headers: getNFTDomainHeaders({ wallet, payload }),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return data;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
logger.error('revokeAndDeleteNFTDomainRecord error', {
|
|
72
|
+
error,
|
|
73
|
+
name,
|
|
74
|
+
appPid: blocklet.appPid,
|
|
75
|
+
resp: error.response?.data,
|
|
76
|
+
});
|
|
77
|
+
throw new Error('revoke nft domain record failed');
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
10
81
|
module.exports = {
|
|
11
82
|
getBlockletDomainGroupName,
|
|
12
83
|
getDidFromDomainGroupName,
|
|
84
|
+
updateNFTDomainRecord,
|
|
85
|
+
revokeAndDeleteNFTDomainRecord,
|
|
13
86
|
};
|
package/lib/validators/node.js
CHANGED
|
@@ -28,6 +28,15 @@ const nodeInfoSchema = Joi.object({
|
|
|
28
28
|
zh: { 'string.uriCustomScheme': 'Web Wallet 必须是合法的 URL' },
|
|
29
29
|
en: { 'string.uriCustomScheme': 'Web Wallet must be a valid URL' },
|
|
30
30
|
}),
|
|
31
|
+
nftDomainUrl: Joi.string()
|
|
32
|
+
.uri({ scheme: [/https?/] })
|
|
33
|
+
.label('web wallet url')
|
|
34
|
+
.allow('')
|
|
35
|
+
.optional()
|
|
36
|
+
.messages({
|
|
37
|
+
zh: { 'string.uriCustomScheme': 'NFT Domain 必须是合法的 URL' },
|
|
38
|
+
en: { 'string.uriCustomScheme': 'NFT Domain must be a valid URL' },
|
|
39
|
+
}),
|
|
31
40
|
autoUpgrade: Joi.boolean(),
|
|
32
41
|
enableWelcomePage: Joi.boolean(),
|
|
33
42
|
diskAlertThreshold: Joi.number()
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.17-beta-
|
|
6
|
+
"version": "1.16.17-beta-3232a7af",
|
|
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/analytics": "1.16.17-beta-
|
|
23
|
-
"@abtnode/auth": "1.16.17-beta-
|
|
24
|
-
"@abtnode/certificate-manager": "1.16.17-beta-
|
|
25
|
-
"@abtnode/constant": "1.16.17-beta-
|
|
26
|
-
"@abtnode/cron": "1.16.17-beta-
|
|
27
|
-
"@abtnode/logger": "1.16.17-beta-
|
|
28
|
-
"@abtnode/models": "1.16.17-beta-
|
|
29
|
-
"@abtnode/queue": "1.16.17-beta-
|
|
30
|
-
"@abtnode/rbac": "1.16.17-beta-
|
|
31
|
-
"@abtnode/router-provider": "1.16.17-beta-
|
|
32
|
-
"@abtnode/static-server": "1.16.17-beta-
|
|
33
|
-
"@abtnode/timemachine": "1.16.17-beta-
|
|
34
|
-
"@abtnode/util": "1.16.17-beta-
|
|
22
|
+
"@abtnode/analytics": "1.16.17-beta-3232a7af",
|
|
23
|
+
"@abtnode/auth": "1.16.17-beta-3232a7af",
|
|
24
|
+
"@abtnode/certificate-manager": "1.16.17-beta-3232a7af",
|
|
25
|
+
"@abtnode/constant": "1.16.17-beta-3232a7af",
|
|
26
|
+
"@abtnode/cron": "1.16.17-beta-3232a7af",
|
|
27
|
+
"@abtnode/logger": "1.16.17-beta-3232a7af",
|
|
28
|
+
"@abtnode/models": "1.16.17-beta-3232a7af",
|
|
29
|
+
"@abtnode/queue": "1.16.17-beta-3232a7af",
|
|
30
|
+
"@abtnode/rbac": "1.16.17-beta-3232a7af",
|
|
31
|
+
"@abtnode/router-provider": "1.16.17-beta-3232a7af",
|
|
32
|
+
"@abtnode/static-server": "1.16.17-beta-3232a7af",
|
|
33
|
+
"@abtnode/timemachine": "1.16.17-beta-3232a7af",
|
|
34
|
+
"@abtnode/util": "1.16.17-beta-3232a7af",
|
|
35
35
|
"@arcblock/did": "1.18.92",
|
|
36
36
|
"@arcblock/did-auth": "1.18.92",
|
|
37
37
|
"@arcblock/did-ext": "^1.18.92",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"@arcblock/pm2-events": "^0.0.5",
|
|
43
43
|
"@arcblock/validator": "^1.18.92",
|
|
44
44
|
"@arcblock/vc": "1.18.92",
|
|
45
|
-
"@blocklet/constant": "1.16.17-beta-
|
|
46
|
-
"@blocklet/env": "1.16.17-beta-
|
|
47
|
-
"@blocklet/meta": "1.16.17-beta-
|
|
48
|
-
"@blocklet/resolver": "1.16.17-beta-
|
|
49
|
-
"@blocklet/sdk": "1.16.17-beta-
|
|
45
|
+
"@blocklet/constant": "1.16.17-beta-3232a7af",
|
|
46
|
+
"@blocklet/env": "1.16.17-beta-3232a7af",
|
|
47
|
+
"@blocklet/meta": "1.16.17-beta-3232a7af",
|
|
48
|
+
"@blocklet/resolver": "1.16.17-beta-3232a7af",
|
|
49
|
+
"@blocklet/sdk": "1.16.17-beta-3232a7af",
|
|
50
50
|
"@did-space/client": "^0.3.11",
|
|
51
51
|
"@fidm/x509": "^1.2.1",
|
|
52
52
|
"@ocap/mcrypto": "1.18.92",
|
|
@@ -101,5 +101,5 @@
|
|
|
101
101
|
"jest": "^27.5.1",
|
|
102
102
|
"unzipper": "^0.10.11"
|
|
103
103
|
},
|
|
104
|
-
"gitHead": "
|
|
104
|
+
"gitHead": "af4067dd2e418c51a0ed96b1ee242ca812904056"
|
|
105
105
|
}
|