@abtnode/blocklet-services 1.7.6 → 1.7.9
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/api/index.js +41 -1
- package/api/routes/blocklet.js +13 -7
- package/api/services/auth/connect/login.js +9 -5
- package/api/services/auth/connect/switch-passport.js +107 -0
- package/api/services/auth/connect/switch-profile.js +60 -0
- package/api/services/auth/index.js +5 -1
- package/api/services/notification/index.js +1 -8
- package/api/services/static.js +4 -1
- package/api/util/index.js +23 -7
- package/build/asset-manifest.json +28 -28
- package/build/favicon.ico +0 -0
- package/build/index.html +1 -1
- package/build/{precache-manifest.7864e16aa9e3670e8da93cadfab391ca.js → precache-manifest.6d3980942db17d0030ae86fe37ac56e9.js} +26 -26
- package/build/service-worker.js +1 -1
- package/build/static/js/0.b63c03e9.chunk.js +3 -0
- package/build/static/js/{0.369fac6d.chunk.js.LICENSE.txt → 0.b63c03e9.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/0.b63c03e9.chunk.js.map +1 -0
- package/build/static/js/1.20e8fca4.chunk.js +2 -0
- package/build/static/js/1.20e8fca4.chunk.js.map +1 -0
- package/build/static/js/10.0c4b966e.chunk.js +2 -0
- package/build/static/js/{10.1d68b28c.chunk.js.map → 10.0c4b966e.chunk.js.map} +1 -1
- package/build/static/js/4.fd2a994d.chunk.js +3 -0
- package/build/static/js/{4.d54aca38.chunk.js.LICENSE.txt → 4.fd2a994d.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/4.fd2a994d.chunk.js.map +1 -0
- package/build/static/js/5.574360ce.chunk.js +2 -0
- package/build/static/js/5.574360ce.chunk.js.map +1 -0
- package/build/static/js/6.5f3e2cbf.chunk.js +2 -0
- package/build/static/js/6.5f3e2cbf.chunk.js.map +1 -0
- package/build/static/js/7.701587af.chunk.js +2 -0
- package/build/static/js/7.701587af.chunk.js.map +1 -0
- package/build/static/js/8.4b52a96d.chunk.js +2 -0
- package/build/static/js/8.4b52a96d.chunk.js.map +1 -0
- package/build/static/js/9.6262e0c5.chunk.js +2 -0
- package/build/static/js/9.6262e0c5.chunk.js.map +1 -0
- package/build/static/js/main.4ae86267.chunk.js +2 -0
- package/build/static/js/main.4ae86267.chunk.js.map +1 -0
- package/build/static/js/runtime-main.3b7f6300.js +2 -0
- package/build/static/js/{runtime-main.e9032916.js.map → runtime-main.3b7f6300.js.map} +1 -1
- package/configs/auth.json +9 -4
- package/package.json +27 -27
- package/build/static/js/0.369fac6d.chunk.js +0 -3
- package/build/static/js/0.369fac6d.chunk.js.map +0 -1
- package/build/static/js/1.c0e3e4df.chunk.js +0 -2
- package/build/static/js/1.c0e3e4df.chunk.js.map +0 -1
- package/build/static/js/10.1d68b28c.chunk.js +0 -2
- package/build/static/js/4.d54aca38.chunk.js +0 -3
- package/build/static/js/4.d54aca38.chunk.js.map +0 -1
- package/build/static/js/5.e8b7573e.chunk.js +0 -2
- package/build/static/js/5.e8b7573e.chunk.js.map +0 -1
- package/build/static/js/6.fd72b935.chunk.js +0 -2
- package/build/static/js/6.fd72b935.chunk.js.map +0 -1
- package/build/static/js/7.b3383b4f.chunk.js +0 -2
- package/build/static/js/7.b3383b4f.chunk.js.map +0 -1
- package/build/static/js/8.6d6d04ee.chunk.js +0 -2
- package/build/static/js/8.6d6d04ee.chunk.js.map +0 -1
- package/build/static/js/9.7101b5fc.chunk.js +0 -2
- package/build/static/js/9.7101b5fc.chunk.js.map +0 -1
- package/build/static/js/main.7467feb3.chunk.js +0 -2
- package/build/static/js/main.7467feb3.chunk.js.map +0 -1
- package/build/static/js/runtime-main.e9032916.js +0 -2
package/api/index.js
CHANGED
|
@@ -76,7 +76,11 @@ module.exports = function createServer(node, serverOptions = {}) {
|
|
|
76
76
|
const notificationService = initNotification({ node, options });
|
|
77
77
|
|
|
78
78
|
// Proxy engine
|
|
79
|
-
const proxy = httpProxy.createProxyServer({
|
|
79
|
+
const proxy = httpProxy.createProxyServer({
|
|
80
|
+
timeout: 3600 * 1000,
|
|
81
|
+
proxyTimeout: 3600 * 1000,
|
|
82
|
+
});
|
|
83
|
+
|
|
80
84
|
proxy.safeWeb = (req, res, opts = {}) => {
|
|
81
85
|
proxy.web(req, res, opts, (error) => {
|
|
82
86
|
if (error) {
|
|
@@ -285,9 +289,45 @@ module.exports = function createServer(node, serverOptions = {}) {
|
|
|
285
289
|
wsRouter.use('**', async (req, socket, head) => {
|
|
286
290
|
const { target } = ensureProxyUrl(req);
|
|
287
291
|
if (target) {
|
|
292
|
+
let isOpen = false;
|
|
293
|
+
let timer;
|
|
294
|
+
let proxyReq;
|
|
295
|
+
|
|
296
|
+
const setProxyReq = (x) => {
|
|
297
|
+
proxyReq = x;
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
const setIsOpen = () => {
|
|
301
|
+
isOpen = true;
|
|
302
|
+
clearTimeout(timer);
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
proxy.once('open', setIsOpen);
|
|
306
|
+
proxy.once('proxyReqWs', setProxyReq);
|
|
307
|
+
|
|
308
|
+
timer = setTimeout(() => {
|
|
309
|
+
if (!isOpen) {
|
|
310
|
+
proxy.off('open', setIsOpen);
|
|
311
|
+
proxy.off('proxyReqWs', setProxyReq);
|
|
312
|
+
|
|
313
|
+
socket.write('HTTP/1.1 502 Proxy Timeout\r\n\r\n');
|
|
314
|
+
socket.destroy();
|
|
315
|
+
|
|
316
|
+
proxyReq?.destroy();
|
|
317
|
+
proxyReq = null;
|
|
318
|
+
}
|
|
319
|
+
}, 120 * 1000);
|
|
320
|
+
|
|
288
321
|
proxy.ws(req, socket, head, { target }, (error) => {
|
|
322
|
+
proxy.off('open', setIsOpen);
|
|
323
|
+
proxy.off('proxyReqWs', setProxyReq);
|
|
324
|
+
clearTimeout(timer);
|
|
325
|
+
proxyReq = null;
|
|
326
|
+
|
|
289
327
|
if (error) {
|
|
290
328
|
logger.error('socket proxy error', { from: req.url, to: target, error });
|
|
329
|
+
socket.write('HTTP/1.1 502 Proxy Error\r\n\r\n');
|
|
330
|
+
socket.destroy();
|
|
291
331
|
}
|
|
292
332
|
});
|
|
293
333
|
} else {
|
package/api/routes/blocklet.js
CHANGED
|
@@ -33,7 +33,7 @@ const prefix = WELLKNOWN_SERVICE_PATH_PREFIX;
|
|
|
33
33
|
module.exports = {
|
|
34
34
|
init(server, node) {
|
|
35
35
|
server.get(`${prefix}/blocklet/logo`, async (req, res) => {
|
|
36
|
-
const sendOptions = { maxAge: '
|
|
36
|
+
const sendOptions = { maxAge: '1y' };
|
|
37
37
|
|
|
38
38
|
try {
|
|
39
39
|
const blocklet = await req.getBlocklet();
|
|
@@ -48,10 +48,16 @@ module.exports = {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
if (blocklet && get(blocklet, 'env.dataDir')) {
|
|
51
|
-
const
|
|
51
|
+
const logoSvgFile = path.join(get(blocklet, 'env.dataDir'), 'logo.svg');
|
|
52
|
+
const logoPngFile = path.join(get(blocklet, 'env.dataDir'), 'logo.png');
|
|
52
53
|
|
|
53
|
-
if (fs.existsSync(
|
|
54
|
-
res.sendFile(
|
|
54
|
+
if (fs.existsSync(logoSvgFile)) {
|
|
55
|
+
res.sendFile(logoSvgFile, sendOptions);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (fs.existsSync(logoPngFile)) {
|
|
60
|
+
res.sendFile(logoPngFile, sendOptions);
|
|
55
61
|
return;
|
|
56
62
|
}
|
|
57
63
|
}
|
|
@@ -92,8 +98,6 @@ module.exports = {
|
|
|
92
98
|
});
|
|
93
99
|
|
|
94
100
|
if (fromSetup) {
|
|
95
|
-
await node.setBlockletInitialized({ did: blocklet.meta.did });
|
|
96
|
-
|
|
97
101
|
const { did: userDid, role } = req.user;
|
|
98
102
|
const { wallet, name, passportColor } = await req.getBlockletInfo();
|
|
99
103
|
const teamDid = blocklet.meta.did;
|
|
@@ -101,6 +105,8 @@ module.exports = {
|
|
|
101
105
|
const { pk, locale = 'en', extra = {} } = user;
|
|
102
106
|
const { baseUrl } = extra;
|
|
103
107
|
|
|
108
|
+
await node.setBlockletInitialized({ did: blocklet.meta.did, owner: { did: userDid, pk } });
|
|
109
|
+
|
|
104
110
|
// create vc
|
|
105
111
|
const vc = createPassportVC({
|
|
106
112
|
issuerName: name,
|
|
@@ -185,7 +191,7 @@ module.exports = {
|
|
|
185
191
|
PREFIXES.forEach((p) => {
|
|
186
192
|
// backward compatible
|
|
187
193
|
server.get(`${p}/blocklet/logo/:did`, async (req, res) => {
|
|
188
|
-
const sendOptions = { maxAge: '
|
|
194
|
+
const sendOptions = { maxAge: '1y' };
|
|
189
195
|
|
|
190
196
|
let blocklet = null;
|
|
191
197
|
try {
|
|
@@ -53,10 +53,6 @@ const isInvitedUserOnly = async (config, node, teamDid) => {
|
|
|
53
53
|
return [false, ROLES.GUEST];
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
if ([true, 'yes', 'not-first'].includes(config.invitedUserOnly)) {
|
|
57
|
-
return [true];
|
|
58
|
-
}
|
|
59
|
-
|
|
60
56
|
return [false, ROLES.GUEST];
|
|
61
57
|
};
|
|
62
58
|
|
|
@@ -124,7 +120,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
124
120
|
// Get passport
|
|
125
121
|
const trustedPassports = (blocklet.trustedPassports || []).map((x) => x.issuerDid);
|
|
126
122
|
const trustedIssuers = [teamAppDid, ...trustedPassports].filter(Boolean);
|
|
127
|
-
|
|
123
|
+
const { vc: inputVC } = await getVCFromClaims({
|
|
128
124
|
claims,
|
|
129
125
|
challenge,
|
|
130
126
|
trustedIssuers,
|
|
@@ -132,6 +128,8 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
132
128
|
locale,
|
|
133
129
|
});
|
|
134
130
|
|
|
131
|
+
let vc = inputVC;
|
|
132
|
+
|
|
135
133
|
const config = (await req.getServiceConfig(NODE_SERVICES.AUTH)) || {};
|
|
136
134
|
const [invitedUserOnly, defaultRole, issuePassport] = await isInvitedUserOnly(config, node, teamDid);
|
|
137
135
|
|
|
@@ -244,6 +242,12 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
244
242
|
await updateSession({ sessionToken }, true);
|
|
245
243
|
logger.info('login.success', { userDid, role });
|
|
246
244
|
|
|
245
|
+
// if user provides owner passport AND app does not have owner, set this user to owner
|
|
246
|
+
if (inputVC && role === ROLES.OWNER && !blocklet.settings?.owner) {
|
|
247
|
+
logger.info('Bind owner for blocklet', { teamDid, userDid });
|
|
248
|
+
await node.setBlockletInitialized({ did: teamDid, owner: { did: userDid, pk: userPk } });
|
|
249
|
+
}
|
|
250
|
+
|
|
247
251
|
// issue passport for the first login user in a invite-only team
|
|
248
252
|
if (issuePassport) {
|
|
249
253
|
return {
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const get = require('lodash/get');
|
|
2
|
+
const { messages, getVCFromClaims, getUser, validatePassportStatus } = require('@abtnode/auth/lib/auth');
|
|
3
|
+
const { ROLES, VC_TYPE_GENERAL_PASSPORT, VC_TYPE_NODE_PASSPORT } = require('@abtnode/constant');
|
|
4
|
+
const {
|
|
5
|
+
validatePassport,
|
|
6
|
+
isUserPassportRevoked,
|
|
7
|
+
getRoleFromLocalPassport,
|
|
8
|
+
getRoleFromExternalPassport,
|
|
9
|
+
createUserPassport,
|
|
10
|
+
} = require('@abtnode/auth/lib/passport');
|
|
11
|
+
|
|
12
|
+
const vcTypes = [VC_TYPE_GENERAL_PASSPORT, VC_TYPE_NODE_PASSPORT];
|
|
13
|
+
|
|
14
|
+
module.exports = function createRoutes(node, authenticator, createSessionToken) {
|
|
15
|
+
return {
|
|
16
|
+
action: 'switch-passport',
|
|
17
|
+
onConnect: async ({ req, userDid, extraParams: { locale, connectedDid } }) => {
|
|
18
|
+
if (userDid && connectedDid && userDid !== connectedDid) {
|
|
19
|
+
throw new Error(messages.userMismatch[locale]);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const { wallet, did: teamDid } = await req.getBlockletInfo();
|
|
23
|
+
const user = await getUser(node, teamDid, userDid);
|
|
24
|
+
|
|
25
|
+
if (!user) {
|
|
26
|
+
throw new Error(messages.userNotFound[locale]);
|
|
27
|
+
}
|
|
28
|
+
if (!user.approved) {
|
|
29
|
+
throw new Error(messages.notAuthorized[locale]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
verifiableCredential: async ({ context }) => {
|
|
34
|
+
const { request } = context;
|
|
35
|
+
const blocklet = await request.getBlocklet();
|
|
36
|
+
|
|
37
|
+
const trustedPassports = (blocklet.trustedPassports || []).map((x) => x.issuerDid);
|
|
38
|
+
const trustedIssuers = [wallet.address, ...trustedPassports].filter(Boolean);
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
description: messages.requestPassport[locale],
|
|
42
|
+
item: vcTypes,
|
|
43
|
+
trustedIssuers,
|
|
44
|
+
optional: false,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
onAuth: async ({ claims, challenge, userDid, updateSession, extraParams, req }) => {
|
|
51
|
+
const { locale } = extraParams;
|
|
52
|
+
const blocklet = await req.getBlocklet();
|
|
53
|
+
const { wallet, name, did: teamDid } = await req.getBlockletInfo();
|
|
54
|
+
|
|
55
|
+
// Validate user
|
|
56
|
+
const user = await getUser(node, teamDid, userDid);
|
|
57
|
+
if (!user) {
|
|
58
|
+
throw new Error(messages.userNotFound[locale]);
|
|
59
|
+
}
|
|
60
|
+
if (!user.approved) {
|
|
61
|
+
throw new Error(messages.notAuthorized[locale]);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Get passport
|
|
65
|
+
const trustedPassports = (blocklet.trustedPassports || []).map((x) => x.issuerDid);
|
|
66
|
+
const trustedIssuers = [wallet.address, ...trustedPassports].filter(Boolean);
|
|
67
|
+
const { vc } = await getVCFromClaims({ claims, challenge, trustedIssuers, vcTypes, locale });
|
|
68
|
+
|
|
69
|
+
// Get user passport from vc
|
|
70
|
+
let passport = createUserPassport(vc);
|
|
71
|
+
if (passport && isUserPassportRevoked(user, passport)) {
|
|
72
|
+
throw new Error(messages.passportRevoked[locale](name));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Get role
|
|
76
|
+
let role = ROLES.GUEST;
|
|
77
|
+
await validatePassport(get(vc, 'credentialSubject.passport'));
|
|
78
|
+
const issuerId = get(vc, 'issuer.id');
|
|
79
|
+
if (issuerId === wallet.address) {
|
|
80
|
+
role = getRoleFromLocalPassport(get(vc, 'credentialSubject.passport'));
|
|
81
|
+
} else {
|
|
82
|
+
// map external passport to local role
|
|
83
|
+
const { mappings = [] } = (blocklet.trustedPassports || []).find((x) => x.issuerDid === issuerId) || {};
|
|
84
|
+
role = await getRoleFromExternalPassport({
|
|
85
|
+
passport: get(vc, 'credentialSubject.passport'),
|
|
86
|
+
node,
|
|
87
|
+
teamDid,
|
|
88
|
+
locale,
|
|
89
|
+
mappings,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// check status of external passport if passport has an endpoint
|
|
93
|
+
const endpoint = get(vc, 'credentialStatus.id');
|
|
94
|
+
if (endpoint) {
|
|
95
|
+
await validatePassportStatus({ vcId: vc.id, endpoint, locale });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Recreate passport with correct role
|
|
100
|
+
passport = createUserPassport(vc, { role });
|
|
101
|
+
|
|
102
|
+
// Generate new session token that client can save to localStorage
|
|
103
|
+
const sessionToken = await createSessionToken(userDid, { passport, role });
|
|
104
|
+
await updateSession({ sessionToken }, true);
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const get = require('lodash/get');
|
|
2
|
+
const { messages, getUser } = require('@abtnode/auth/lib/auth');
|
|
3
|
+
const { NODE_SERVICES } = require('@abtnode/constant');
|
|
4
|
+
|
|
5
|
+
module.exports = function createRoutes(node) {
|
|
6
|
+
return {
|
|
7
|
+
action: 'switch-profile',
|
|
8
|
+
onConnect: async ({ req, userDid, extraParams: { locale, connectedDid } }) => {
|
|
9
|
+
if (userDid && connectedDid && userDid !== connectedDid) {
|
|
10
|
+
throw new Error(messages.userMismatch[locale]);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const config = await req.getServiceConfig(NODE_SERVICES.AUTH);
|
|
14
|
+
if (get(config, 'allowSwitchProfile', true) === false) {
|
|
15
|
+
throw new Error(messages.actionForbidden[locale]);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { did: teamDid } = await req.getBlockletInfo();
|
|
19
|
+
const user = await getUser(node, teamDid, userDid);
|
|
20
|
+
|
|
21
|
+
if (!user) {
|
|
22
|
+
throw new Error(messages.userNotFound[locale]);
|
|
23
|
+
}
|
|
24
|
+
if (!user.approved) {
|
|
25
|
+
throw new Error(messages.notAuthorized[locale]);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
profile: {
|
|
30
|
+
fields: get(config, 'profileFields') || ['fullName', 'avatar'],
|
|
31
|
+
description: messages.description[locale],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
onAuth: async ({ req, claims, userDid, extraParams: { locale } }) => {
|
|
37
|
+
const { did: teamDid } = await req.getBlockletInfo();
|
|
38
|
+
|
|
39
|
+
// check user approved
|
|
40
|
+
const user = await getUser(node, teamDid, userDid);
|
|
41
|
+
if (!user) {
|
|
42
|
+
throw new Error(messages.userNotFound[locale]);
|
|
43
|
+
}
|
|
44
|
+
if (!user.approved) {
|
|
45
|
+
throw new Error(messages.notAuthorized[locale]);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Update user
|
|
49
|
+
const profile = claims.find((x) => x.type === 'profile');
|
|
50
|
+
await node.updateUser({
|
|
51
|
+
teamDid,
|
|
52
|
+
user: {
|
|
53
|
+
...user,
|
|
54
|
+
...profile,
|
|
55
|
+
locale,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
};
|
|
@@ -17,6 +17,8 @@ const createIssuePassportAuth = require('./connect/issue-passport');
|
|
|
17
17
|
const createLostPassportListAuth = require('./connect/lost-passport-list');
|
|
18
18
|
const createLostPassportIssueAuth = require('./connect/lost-passport-issue');
|
|
19
19
|
const createSetupAuth = require('./connect/setup');
|
|
20
|
+
const createSwitchProfileAuth = require('./connect/switch-profile');
|
|
21
|
+
const createSwitchPassportAuth = require('./connect/switch-passport');
|
|
20
22
|
const createSessionRoutes = require('./session');
|
|
21
23
|
const createPassportRoutes = require('./passport');
|
|
22
24
|
const { getRedirectUrl } = require('../../util');
|
|
@@ -126,6 +128,8 @@ const init = ({ node, options }) => {
|
|
|
126
128
|
handler.attach(Object.assign({ app }, createLostPassportListAuth(node, authenticator, createSessionToken)));
|
|
127
129
|
handler.attach(Object.assign({ app }, createLostPassportIssueAuth(node, authenticator, createSessionToken)));
|
|
128
130
|
handler.attach(Object.assign({ app }, createSetupAuth(node, authenticator, createSessionToken)));
|
|
131
|
+
handler.attach(Object.assign({ app }, createSwitchProfileAuth(node, authenticator, createSessionToken)));
|
|
132
|
+
handler.attach(Object.assign({ app }, createSwitchPassportAuth(node, authenticator, createSessionToken)));
|
|
129
133
|
});
|
|
130
134
|
};
|
|
131
135
|
|
|
@@ -140,7 +144,7 @@ const init = ({ node, options }) => {
|
|
|
140
144
|
|
|
141
145
|
// ignore some dev path in dev mode
|
|
142
146
|
const blocklet = await req.getBlocklet();
|
|
143
|
-
const devUrls = ['/sockjs-node'];
|
|
147
|
+
const devUrls = ['/sockjs-node', '/ws'];
|
|
144
148
|
const mode = get(blocklet, 'mode');
|
|
145
149
|
if (mode === BLOCKLET_MODES.DEVELOPMENT && devUrls.includes(req.url)) {
|
|
146
150
|
next();
|
|
@@ -14,7 +14,6 @@ const { getTeamInfo } = require('@abtnode/auth/lib/auth');
|
|
|
14
14
|
const { NODE_MODES } = require('@abtnode/constant');
|
|
15
15
|
|
|
16
16
|
const states = require('../../state');
|
|
17
|
-
const { getBlockletLogo } = require('../../util');
|
|
18
17
|
const { PREFIXES } = require('../../util/constants');
|
|
19
18
|
|
|
20
19
|
const getDid = (jwt) => jwt.iss.replace(/^did:abt:/, '');
|
|
@@ -72,7 +71,7 @@ const onSendToUser = async (node, payload, wsServer) => {
|
|
|
72
71
|
throw err;
|
|
73
72
|
}
|
|
74
73
|
|
|
75
|
-
const { wallet, name
|
|
74
|
+
const { wallet, name } = senderInfo;
|
|
76
75
|
if (!JWT.verify(sender.token, wallet.publicKey)) {
|
|
77
76
|
throw new Error(`Invalid authentication token for sender blocklet: ${sender.did}`);
|
|
78
77
|
}
|
|
@@ -81,11 +80,6 @@ const onSendToUser = async (node, payload, wsServer) => {
|
|
|
81
80
|
throw new Error(`Invalid app did, expected: ${wallet.address}, actual: ${sender.appDid}`);
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
let blocklet;
|
|
85
|
-
if (senderType === 'blocklet') {
|
|
86
|
-
blocklet = await node.getBlocklet({ did: sender.did, attachRuntimeInfo: false });
|
|
87
|
-
}
|
|
88
|
-
|
|
89
83
|
// parse notifications
|
|
90
84
|
|
|
91
85
|
const notifications = [].concat(notification);
|
|
@@ -95,7 +89,6 @@ const onSendToUser = async (node, payload, wsServer) => {
|
|
|
95
89
|
x.sender = {
|
|
96
90
|
did: sender.appDid,
|
|
97
91
|
name,
|
|
98
|
-
icon: senderType === 'blocklet' ? getBlockletLogo({ blocklet }) : null, // deprecated: did wallet will find icon locally by sender appDid
|
|
99
92
|
};
|
|
100
93
|
x.createdAt = new Date();
|
|
101
94
|
});
|
package/api/services/static.js
CHANGED
|
@@ -15,7 +15,10 @@ const attachUtils = ({ req, res, proxy }) => {
|
|
|
15
15
|
target: `http://127.0.0.1:${process.env.ABT_NODE_SERVICE_FE_PORT}`,
|
|
16
16
|
});
|
|
17
17
|
} else {
|
|
18
|
-
res.sendFile(path.join(distDir, 'index.html')
|
|
18
|
+
res.sendFile(path.join(distDir, 'index.html'), {
|
|
19
|
+
lastModified: false,
|
|
20
|
+
etag: false,
|
|
21
|
+
});
|
|
19
22
|
}
|
|
20
23
|
};
|
|
21
24
|
|
package/api/util/index.js
CHANGED
|
@@ -3,29 +3,45 @@ const get = require('lodash/get');
|
|
|
3
3
|
const { ROLES } = require('@abtnode/constant');
|
|
4
4
|
const { BlockletSource, BLOCKLET_MODES } = require('@blocklet/meta/lib/constants');
|
|
5
5
|
const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
|
|
6
|
-
const { getBaseUrl } = require('@abtnode/router-adapter');
|
|
7
6
|
|
|
8
|
-
const
|
|
7
|
+
const getBaseUrl = (req) => {
|
|
8
|
+
if (req.headers['x-group-path-prefix']) {
|
|
9
|
+
return `/${req.headers['x-group-path-prefix']}/`.replace(/\/+/g, '/');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return '/';
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const getLogoFromLogoUrl = (blocklet, version) => {
|
|
9
16
|
try {
|
|
17
|
+
if (!blocklet.meta.logoUrl) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const url = `${blocklet.meta.logoUrl}?version=${version || ''}`;
|
|
22
|
+
|
|
10
23
|
if (blocklet.source === BlockletSource.registry) {
|
|
11
|
-
return new URL(
|
|
24
|
+
return new URL(url, blocklet.deployedFrom).href;
|
|
12
25
|
}
|
|
13
|
-
|
|
26
|
+
|
|
27
|
+
return url;
|
|
14
28
|
} catch (error) {
|
|
15
29
|
return null;
|
|
16
30
|
}
|
|
17
31
|
};
|
|
18
32
|
|
|
19
33
|
const getBlockletLogo = ({ baseUrl, blocklet }) => {
|
|
34
|
+
const version = get(blocklet, 'meta.version', '');
|
|
35
|
+
|
|
20
36
|
if (!baseUrl) {
|
|
21
|
-
return getLogoFromLogoUrl(blocklet);
|
|
37
|
+
return getLogoFromLogoUrl(blocklet, version);
|
|
22
38
|
}
|
|
23
39
|
|
|
24
40
|
if (get(blocklet, 'meta.logoUrl')) {
|
|
25
|
-
return getLogoFromLogoUrl(blocklet);
|
|
41
|
+
return getLogoFromLogoUrl(blocklet, version);
|
|
26
42
|
}
|
|
27
43
|
|
|
28
|
-
return `${baseUrl}/blocklet/logo`;
|
|
44
|
+
return `${baseUrl}/blocklet/logo?version=${version}`;
|
|
29
45
|
};
|
|
30
46
|
|
|
31
47
|
const shouldGotoStartPage = (req, blocklet) => {
|
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
|
-
"static/js/0.
|
|
4
|
-
"static/js/0.
|
|
5
|
-
"static/js/1.
|
|
6
|
-
"static/js/1.
|
|
7
|
-
"main.js": "/.blocklet/proxy/blocklet-service/static/js/main.
|
|
8
|
-
"main.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.
|
|
9
|
-
"runtime-main.js": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.
|
|
10
|
-
"runtime-main.js.map": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.
|
|
3
|
+
"static/js/0.b63c03e9.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/0.b63c03e9.chunk.js",
|
|
4
|
+
"static/js/0.b63c03e9.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/0.b63c03e9.chunk.js.map",
|
|
5
|
+
"static/js/1.20e8fca4.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/1.20e8fca4.chunk.js",
|
|
6
|
+
"static/js/1.20e8fca4.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/1.20e8fca4.chunk.js.map",
|
|
7
|
+
"main.js": "/.blocklet/proxy/blocklet-service/static/js/main.4ae86267.chunk.js",
|
|
8
|
+
"main.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.4ae86267.chunk.js.map",
|
|
9
|
+
"runtime-main.js": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.3b7f6300.js",
|
|
10
|
+
"runtime-main.js.map": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.3b7f6300.js.map",
|
|
11
11
|
"static/css/4.634341e0.chunk.css": "/.blocklet/proxy/blocklet-service/static/css/4.634341e0.chunk.css",
|
|
12
|
-
"static/js/4.
|
|
13
|
-
"static/js/4.
|
|
14
|
-
"static/js/5.
|
|
15
|
-
"static/js/5.
|
|
16
|
-
"static/js/6.
|
|
17
|
-
"static/js/6.
|
|
18
|
-
"static/js/7.
|
|
19
|
-
"static/js/7.
|
|
20
|
-
"static/js/8.
|
|
21
|
-
"static/js/8.
|
|
22
|
-
"static/js/9.
|
|
23
|
-
"static/js/9.
|
|
24
|
-
"static/js/10.
|
|
25
|
-
"static/js/10.
|
|
12
|
+
"static/js/4.fd2a994d.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/4.fd2a994d.chunk.js",
|
|
13
|
+
"static/js/4.fd2a994d.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/4.fd2a994d.chunk.js.map",
|
|
14
|
+
"static/js/5.574360ce.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/5.574360ce.chunk.js",
|
|
15
|
+
"static/js/5.574360ce.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/5.574360ce.chunk.js.map",
|
|
16
|
+
"static/js/6.5f3e2cbf.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/6.5f3e2cbf.chunk.js",
|
|
17
|
+
"static/js/6.5f3e2cbf.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/6.5f3e2cbf.chunk.js.map",
|
|
18
|
+
"static/js/7.701587af.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/7.701587af.chunk.js",
|
|
19
|
+
"static/js/7.701587af.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/7.701587af.chunk.js.map",
|
|
20
|
+
"static/js/8.4b52a96d.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/8.4b52a96d.chunk.js",
|
|
21
|
+
"static/js/8.4b52a96d.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/8.4b52a96d.chunk.js.map",
|
|
22
|
+
"static/js/9.6262e0c5.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/9.6262e0c5.chunk.js",
|
|
23
|
+
"static/js/9.6262e0c5.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/9.6262e0c5.chunk.js.map",
|
|
24
|
+
"static/js/10.0c4b966e.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/10.0c4b966e.chunk.js",
|
|
25
|
+
"static/js/10.0c4b966e.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/10.0c4b966e.chunk.js.map",
|
|
26
26
|
"index.html": "/.blocklet/proxy/blocklet-service/index.html",
|
|
27
|
-
"precache-manifest.
|
|
27
|
+
"precache-manifest.6d3980942db17d0030ae86fe37ac56e9.js": "/.blocklet/proxy/blocklet-service/precache-manifest.6d3980942db17d0030ae86fe37ac56e9.js",
|
|
28
28
|
"service-worker.js": "/.blocklet/proxy/blocklet-service/service-worker.js",
|
|
29
29
|
"static/css/4.634341e0.chunk.css.map": "/.blocklet/proxy/blocklet-service/static/css/4.634341e0.chunk.css.map",
|
|
30
|
-
"static/js/0.
|
|
31
|
-
"static/js/4.
|
|
30
|
+
"static/js/0.b63c03e9.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/0.b63c03e9.chunk.js.LICENSE.txt",
|
|
31
|
+
"static/js/4.fd2a994d.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/4.fd2a994d.chunk.js.LICENSE.txt",
|
|
32
32
|
"static/media/400.css": "/.blocklet/proxy/blocklet-service/static/media/ubuntu-mono-latin-ext-400-normal.84fa8bc1.woff2",
|
|
33
33
|
"static/media/700.css": "/.blocklet/proxy/blocklet-service/static/media/lato-latin-ext-700-normal.a48b0f04.woff2",
|
|
34
34
|
"static/media/500.css": "/.blocklet/proxy/blocklet-service/static/media/rubik-latin-ext-500-normal.21b63491.woff2",
|
|
35
35
|
"static/media/600.css": "/.blocklet/proxy/blocklet-service/static/media/rubik-latin-ext-600-normal.d0d90e83.woff2"
|
|
36
36
|
},
|
|
37
37
|
"entrypoints": [
|
|
38
|
-
"static/js/runtime-main.
|
|
38
|
+
"static/js/runtime-main.3b7f6300.js",
|
|
39
39
|
"static/css/4.634341e0.chunk.css",
|
|
40
|
-
"static/js/4.
|
|
41
|
-
"static/js/main.
|
|
40
|
+
"static/js/4.fd2a994d.chunk.js",
|
|
41
|
+
"static/js/main.4ae86267.chunk.js"
|
|
42
42
|
]
|
|
43
43
|
}
|
package/build/favicon.ico
CHANGED
|
Binary file
|
package/build/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="/.well-known/service/static/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src="/.well-known/service/api/env"></script><link href="/.blocklet/proxy/blocklet-service/static/css/4.634341e0.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,i
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="/.well-known/service/static/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src="/.well-known/service/api/env"></script><link href="/.blocklet/proxy/blocklet-service/static/css/4.634341e0.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,a,i=t[0],l=t[1],f=t[2],s=t[3]||[],d=0,h=[];d<i.length;d++)a=i[d],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&h.push(o[a][0]),o[a]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(t),u.push.apply(u,s);h.length;)h.shift()();return c.push.apply(c,f||[]),r()}function r(){for(var e,t=0;t<c.length;t++){for(var r=c[t],n=!0,l=1;l<r.length;l++){var f=r[l];0!==o[f]&&(n=!1)}n&&(c.splice(t--,1),e=i(i.s=r[0]))}return 0===c.length&&(u.forEach((function(e){if(void 0===o[e]){o[e]=null;var t=document.createElement("link");i.nc&&t.setAttribute("nonce",i.nc),t.rel="prefetch",t.as="script",t.href=a(e),document.head.appendChild(t)}})),u.length=0),e}var n={},o={3:0},c=[],u=[];function a(e){return i.p+"static/js/"+({}[e]||e)+"."+{0:"b63c03e9",1:"20e8fca4",5:"574360ce",6:"5f3e2cbf",7:"701587af",8:"4b52a96d",9:"6262e0c5",10:"0c4b966e"}[e]+".chunk.js"}function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var c,u=document.createElement("script");u.charset="utf-8",u.timeout=120,i.nc&&u.setAttribute("nonce",i.nc),u.src=a(e);var l=new Error;c=function(t){u.onerror=u.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;l.message="Loading chunk "+e+" failed.\n("+n+": "+c+")",l.name="ChunkLoadError",l.type=n,l.request=c,r[1](l)}o[e]=void 0}};var f=setTimeout((function(){c({type:"timeout",target:u})}),12e4);u.onerror=u.onload=c,document.head.appendChild(u)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/.blocklet/proxy/blocklet-service/",i.oe=function(e){throw console.error(e),e};var l=this["webpackJsonp@abtnode/blocklet-services"]=this["webpackJsonp@abtnode/blocklet-services"]||[],f=l.push.bind(l);l.push=t,l=l.slice();for(var s=0;s<l.length;s++)t(l[s]);var p=f;r()}([])</script><script src="/.blocklet/proxy/blocklet-service/static/js/4.fd2a994d.chunk.js"></script><script src="/.blocklet/proxy/blocklet-service/static/js/main.4ae86267.chunk.js"></script></body></html>
|
|
@@ -1,63 +1,63 @@
|
|
|
1
1
|
self.__precacheManifest = (self.__precacheManifest || []).concat([
|
|
2
2
|
{
|
|
3
|
-
"revision": "
|
|
3
|
+
"revision": "37244607de6f72e26ffe70a74693f3db",
|
|
4
4
|
"url": "/.blocklet/proxy/blocklet-service/index.html"
|
|
5
5
|
},
|
|
6
6
|
{
|
|
7
|
-
"revision": "
|
|
7
|
+
"revision": "a2ae4b8fec2e6395b2fe",
|
|
8
8
|
"url": "/.blocklet/proxy/blocklet-service/static/css/4.634341e0.chunk.css"
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
|
-
"revision": "
|
|
12
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/0.
|
|
11
|
+
"revision": "d26ff6b35970c71cad20",
|
|
12
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/0.b63c03e9.chunk.js"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"revision": "327dea51c54983f5708f4242bceacaed",
|
|
16
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/0.
|
|
16
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/0.b63c03e9.chunk.js.LICENSE.txt"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
|
-
"revision": "
|
|
20
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/1.
|
|
19
|
+
"revision": "ac088caed50ff246d009",
|
|
20
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/1.20e8fca4.chunk.js"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
|
-
"revision": "
|
|
24
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/10.
|
|
23
|
+
"revision": "c3dfab6fbc35271abb1c",
|
|
24
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/10.0c4b966e.chunk.js"
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
"revision": "
|
|
28
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/4.
|
|
27
|
+
"revision": "a2ae4b8fec2e6395b2fe",
|
|
28
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/4.fd2a994d.chunk.js"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"revision": "ff58a668e6d753fa035087a671c28199",
|
|
32
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/4.
|
|
32
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/4.fd2a994d.chunk.js.LICENSE.txt"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"revision": "
|
|
36
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/5.
|
|
35
|
+
"revision": "5cc6cf5b1f5f44eaee6f",
|
|
36
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/5.574360ce.chunk.js"
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
"revision": "
|
|
40
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/6.
|
|
39
|
+
"revision": "be433e004fe185586915",
|
|
40
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/6.5f3e2cbf.chunk.js"
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
|
-
"revision": "
|
|
44
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/7.
|
|
43
|
+
"revision": "9871a1217ccfe87cd2f8",
|
|
44
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/7.701587af.chunk.js"
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
|
-
"revision": "
|
|
48
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/8.
|
|
47
|
+
"revision": "1a99912fbcd9248629ec",
|
|
48
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/8.4b52a96d.chunk.js"
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
|
-
"revision": "
|
|
52
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/9.
|
|
51
|
+
"revision": "d3454de49f8842d441a3",
|
|
52
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/9.6262e0c5.chunk.js"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
"revision": "
|
|
56
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/main.
|
|
55
|
+
"revision": "3b825d7fb16ff8541bf7",
|
|
56
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/main.4ae86267.chunk.js"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
|
-
"revision": "
|
|
60
|
-
"url": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.
|
|
59
|
+
"revision": "c971562d345e14a37834",
|
|
60
|
+
"url": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.3b7f6300.js"
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
"revision": "a82dcb33d52ed6fa529e5ae8d5fda7f3",
|