@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.
Files changed (60) hide show
  1. package/api/index.js +41 -1
  2. package/api/routes/blocklet.js +13 -7
  3. package/api/services/auth/connect/login.js +9 -5
  4. package/api/services/auth/connect/switch-passport.js +107 -0
  5. package/api/services/auth/connect/switch-profile.js +60 -0
  6. package/api/services/auth/index.js +5 -1
  7. package/api/services/notification/index.js +1 -8
  8. package/api/services/static.js +4 -1
  9. package/api/util/index.js +23 -7
  10. package/build/asset-manifest.json +28 -28
  11. package/build/favicon.ico +0 -0
  12. package/build/index.html +1 -1
  13. package/build/{precache-manifest.7864e16aa9e3670e8da93cadfab391ca.js → precache-manifest.6d3980942db17d0030ae86fe37ac56e9.js} +26 -26
  14. package/build/service-worker.js +1 -1
  15. package/build/static/js/0.b63c03e9.chunk.js +3 -0
  16. package/build/static/js/{0.369fac6d.chunk.js.LICENSE.txt → 0.b63c03e9.chunk.js.LICENSE.txt} +0 -0
  17. package/build/static/js/0.b63c03e9.chunk.js.map +1 -0
  18. package/build/static/js/1.20e8fca4.chunk.js +2 -0
  19. package/build/static/js/1.20e8fca4.chunk.js.map +1 -0
  20. package/build/static/js/10.0c4b966e.chunk.js +2 -0
  21. package/build/static/js/{10.1d68b28c.chunk.js.map → 10.0c4b966e.chunk.js.map} +1 -1
  22. package/build/static/js/4.fd2a994d.chunk.js +3 -0
  23. package/build/static/js/{4.d54aca38.chunk.js.LICENSE.txt → 4.fd2a994d.chunk.js.LICENSE.txt} +0 -0
  24. package/build/static/js/4.fd2a994d.chunk.js.map +1 -0
  25. package/build/static/js/5.574360ce.chunk.js +2 -0
  26. package/build/static/js/5.574360ce.chunk.js.map +1 -0
  27. package/build/static/js/6.5f3e2cbf.chunk.js +2 -0
  28. package/build/static/js/6.5f3e2cbf.chunk.js.map +1 -0
  29. package/build/static/js/7.701587af.chunk.js +2 -0
  30. package/build/static/js/7.701587af.chunk.js.map +1 -0
  31. package/build/static/js/8.4b52a96d.chunk.js +2 -0
  32. package/build/static/js/8.4b52a96d.chunk.js.map +1 -0
  33. package/build/static/js/9.6262e0c5.chunk.js +2 -0
  34. package/build/static/js/9.6262e0c5.chunk.js.map +1 -0
  35. package/build/static/js/main.4ae86267.chunk.js +2 -0
  36. package/build/static/js/main.4ae86267.chunk.js.map +1 -0
  37. package/build/static/js/runtime-main.3b7f6300.js +2 -0
  38. package/build/static/js/{runtime-main.e9032916.js.map → runtime-main.3b7f6300.js.map} +1 -1
  39. package/configs/auth.json +9 -4
  40. package/package.json +27 -27
  41. package/build/static/js/0.369fac6d.chunk.js +0 -3
  42. package/build/static/js/0.369fac6d.chunk.js.map +0 -1
  43. package/build/static/js/1.c0e3e4df.chunk.js +0 -2
  44. package/build/static/js/1.c0e3e4df.chunk.js.map +0 -1
  45. package/build/static/js/10.1d68b28c.chunk.js +0 -2
  46. package/build/static/js/4.d54aca38.chunk.js +0 -3
  47. package/build/static/js/4.d54aca38.chunk.js.map +0 -1
  48. package/build/static/js/5.e8b7573e.chunk.js +0 -2
  49. package/build/static/js/5.e8b7573e.chunk.js.map +0 -1
  50. package/build/static/js/6.fd72b935.chunk.js +0 -2
  51. package/build/static/js/6.fd72b935.chunk.js.map +0 -1
  52. package/build/static/js/7.b3383b4f.chunk.js +0 -2
  53. package/build/static/js/7.b3383b4f.chunk.js.map +0 -1
  54. package/build/static/js/8.6d6d04ee.chunk.js +0 -2
  55. package/build/static/js/8.6d6d04ee.chunk.js.map +0 -1
  56. package/build/static/js/9.7101b5fc.chunk.js +0 -2
  57. package/build/static/js/9.7101b5fc.chunk.js.map +0 -1
  58. package/build/static/js/main.7467feb3.chunk.js +0 -2
  59. package/build/static/js/main.7467feb3.chunk.js.map +0 -1
  60. 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 {
@@ -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: '1d' };
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 logoFile = path.join(get(blocklet, 'env.dataDir'), 'logo.png');
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(logoFile)) {
54
- res.sendFile(logoFile, sendOptions);
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: '1d' };
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
- let { vc } = await getVCFromClaims({
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, type: senderType } = senderInfo;
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
  });
@@ -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 getLogoFromLogoUrl = (blocklet) => {
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(blocklet.meta.logoUrl, blocklet.deployedFrom).href;
24
+ return new URL(url, blocklet.deployedFrom).href;
12
25
  }
13
- return blocklet.meta.logoUrl || null;
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.369fac6d.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/0.369fac6d.chunk.js",
4
- "static/js/0.369fac6d.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/0.369fac6d.chunk.js.map",
5
- "static/js/1.c0e3e4df.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/1.c0e3e4df.chunk.js",
6
- "static/js/1.c0e3e4df.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/1.c0e3e4df.chunk.js.map",
7
- "main.js": "/.blocklet/proxy/blocklet-service/static/js/main.7467feb3.chunk.js",
8
- "main.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.7467feb3.chunk.js.map",
9
- "runtime-main.js": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.e9032916.js",
10
- "runtime-main.js.map": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.e9032916.js.map",
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.d54aca38.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/4.d54aca38.chunk.js",
13
- "static/js/4.d54aca38.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/4.d54aca38.chunk.js.map",
14
- "static/js/5.e8b7573e.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/5.e8b7573e.chunk.js",
15
- "static/js/5.e8b7573e.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/5.e8b7573e.chunk.js.map",
16
- "static/js/6.fd72b935.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/6.fd72b935.chunk.js",
17
- "static/js/6.fd72b935.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/6.fd72b935.chunk.js.map",
18
- "static/js/7.b3383b4f.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/7.b3383b4f.chunk.js",
19
- "static/js/7.b3383b4f.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/7.b3383b4f.chunk.js.map",
20
- "static/js/8.6d6d04ee.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/8.6d6d04ee.chunk.js",
21
- "static/js/8.6d6d04ee.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/8.6d6d04ee.chunk.js.map",
22
- "static/js/9.7101b5fc.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/9.7101b5fc.chunk.js",
23
- "static/js/9.7101b5fc.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/9.7101b5fc.chunk.js.map",
24
- "static/js/10.1d68b28c.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/10.1d68b28c.chunk.js",
25
- "static/js/10.1d68b28c.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/10.1d68b28c.chunk.js.map",
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.7864e16aa9e3670e8da93cadfab391ca.js": "/.blocklet/proxy/blocklet-service/precache-manifest.7864e16aa9e3670e8da93cadfab391ca.js",
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.369fac6d.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/0.369fac6d.chunk.js.LICENSE.txt",
31
- "static/js/4.d54aca38.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/4.d54aca38.chunk.js.LICENSE.txt",
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.e9032916.js",
38
+ "static/js/runtime-main.3b7f6300.js",
39
39
  "static/css/4.634341e0.chunk.css",
40
- "static/js/4.d54aca38.chunk.js",
41
- "static/js/main.7467feb3.chunk.js"
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,a=t[0],l=t[1],f=t[2],s=t[3]||[],d=0,b=[];d<a.length;d++)i=a[d],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&b.push(o[i][0]),o[i]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(t),u.push.apply(u,s);b.length;)b.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=a(a.s=r[0]))}return 0===c.length&&(u.forEach((function(e){if(void 0===o[e]){o[e]=null;var t=document.createElement("link");a.nc&&t.setAttribute("nonce",a.nc),t.rel="prefetch",t.as="script",t.href=i(e),document.head.appendChild(t)}})),u.length=0),e}var n={},o={3:0},c=[],u=[];function i(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"369fac6d",1:"c0e3e4df",5:"e8b7573e",6:"fd72b935",7:"b3383b4f",8:"6d6d04ee",9:"7101b5fc",10:"1d68b28c"}[e]+".chunk.js"}function a(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,a),r.l=!0,r.exports}a.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,a.nc&&u.setAttribute("nonce",a.nc),u.src=i(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)},a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/.blocklet/proxy/blocklet-service/",a.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.d54aca38.chunk.js"></script><script src="/.blocklet/proxy/blocklet-service/static/js/main.7467feb3.chunk.js"></script></body></html>
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": "6ddf6d0ba64b9232450bf980e7d1c44f",
3
+ "revision": "37244607de6f72e26ffe70a74693f3db",
4
4
  "url": "/.blocklet/proxy/blocklet-service/index.html"
5
5
  },
6
6
  {
7
- "revision": "0898e1f14f82fdde51a0",
7
+ "revision": "a2ae4b8fec2e6395b2fe",
8
8
  "url": "/.blocklet/proxy/blocklet-service/static/css/4.634341e0.chunk.css"
9
9
  },
10
10
  {
11
- "revision": "4ca866f845a7c9400e9c",
12
- "url": "/.blocklet/proxy/blocklet-service/static/js/0.369fac6d.chunk.js"
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.369fac6d.chunk.js.LICENSE.txt"
16
+ "url": "/.blocklet/proxy/blocklet-service/static/js/0.b63c03e9.chunk.js.LICENSE.txt"
17
17
  },
18
18
  {
19
- "revision": "8f5188685dce5f011a5f",
20
- "url": "/.blocklet/proxy/blocklet-service/static/js/1.c0e3e4df.chunk.js"
19
+ "revision": "ac088caed50ff246d009",
20
+ "url": "/.blocklet/proxy/blocklet-service/static/js/1.20e8fca4.chunk.js"
21
21
  },
22
22
  {
23
- "revision": "fce2fb45f474b0d22e4c",
24
- "url": "/.blocklet/proxy/blocklet-service/static/js/10.1d68b28c.chunk.js"
23
+ "revision": "c3dfab6fbc35271abb1c",
24
+ "url": "/.blocklet/proxy/blocklet-service/static/js/10.0c4b966e.chunk.js"
25
25
  },
26
26
  {
27
- "revision": "0898e1f14f82fdde51a0",
28
- "url": "/.blocklet/proxy/blocklet-service/static/js/4.d54aca38.chunk.js"
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.d54aca38.chunk.js.LICENSE.txt"
32
+ "url": "/.blocklet/proxy/blocklet-service/static/js/4.fd2a994d.chunk.js.LICENSE.txt"
33
33
  },
34
34
  {
35
- "revision": "280e7727284e4f491708",
36
- "url": "/.blocklet/proxy/blocklet-service/static/js/5.e8b7573e.chunk.js"
35
+ "revision": "5cc6cf5b1f5f44eaee6f",
36
+ "url": "/.blocklet/proxy/blocklet-service/static/js/5.574360ce.chunk.js"
37
37
  },
38
38
  {
39
- "revision": "a577696708502e41fa38",
40
- "url": "/.blocklet/proxy/blocklet-service/static/js/6.fd72b935.chunk.js"
39
+ "revision": "be433e004fe185586915",
40
+ "url": "/.blocklet/proxy/blocklet-service/static/js/6.5f3e2cbf.chunk.js"
41
41
  },
42
42
  {
43
- "revision": "aa904acd6b7426be4ff0",
44
- "url": "/.blocklet/proxy/blocklet-service/static/js/7.b3383b4f.chunk.js"
43
+ "revision": "9871a1217ccfe87cd2f8",
44
+ "url": "/.blocklet/proxy/blocklet-service/static/js/7.701587af.chunk.js"
45
45
  },
46
46
  {
47
- "revision": "8982022dbaa7c399eb5e",
48
- "url": "/.blocklet/proxy/blocklet-service/static/js/8.6d6d04ee.chunk.js"
47
+ "revision": "1a99912fbcd9248629ec",
48
+ "url": "/.blocklet/proxy/blocklet-service/static/js/8.4b52a96d.chunk.js"
49
49
  },
50
50
  {
51
- "revision": "963cf265c6439b03cda6",
52
- "url": "/.blocklet/proxy/blocklet-service/static/js/9.7101b5fc.chunk.js"
51
+ "revision": "d3454de49f8842d441a3",
52
+ "url": "/.blocklet/proxy/blocklet-service/static/js/9.6262e0c5.chunk.js"
53
53
  },
54
54
  {
55
- "revision": "3696eb61c1a670e41da3",
56
- "url": "/.blocklet/proxy/blocklet-service/static/js/main.7467feb3.chunk.js"
55
+ "revision": "3b825d7fb16ff8541bf7",
56
+ "url": "/.blocklet/proxy/blocklet-service/static/js/main.4ae86267.chunk.js"
57
57
  },
58
58
  {
59
- "revision": "2867bbafe47fa37d24ce",
60
- "url": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.e9032916.js"
59
+ "revision": "c971562d345e14a37834",
60
+ "url": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.3b7f6300.js"
61
61
  },
62
62
  {
63
63
  "revision": "a82dcb33d52ed6fa529e5ae8d5fda7f3",