@abtnode/blocklet-services 1.7.14 → 1.7.17

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 (57) hide show
  1. package/api/index.js +6 -3
  2. package/api/middlewares/check-blocklet.js +14 -0
  3. package/api/services/auth/connect/invite.js +1 -0
  4. package/api/services/auth/connect/issue-passport.js +2 -1
  5. package/api/services/auth/connect/login.js +30 -5
  6. package/api/services/auth/connect/switch-passport.js +10 -0
  7. package/api/services/auth/connect/switch-profile.js +11 -1
  8. package/api/util/index.js +45 -6
  9. package/build/asset-manifest.json +28 -28
  10. package/build/index.html +1 -1
  11. package/build/{precache-manifest.62677c47082207508be287829a517379.js → precache-manifest.c82f233909194dca95a9f73ae18caf89.js} +27 -27
  12. package/build/service-worker.js +1 -1
  13. package/build/static/js/0.65d89c48.chunk.js +3 -0
  14. package/build/static/js/{0.d567f606.chunk.js.LICENSE.txt → 0.65d89c48.chunk.js.LICENSE.txt} +0 -0
  15. package/build/static/js/0.65d89c48.chunk.js.map +1 -0
  16. package/build/static/js/1.45d34a8d.chunk.js +2 -0
  17. package/build/static/js/1.45d34a8d.chunk.js.map +1 -0
  18. package/build/static/js/10.d8b82f8d.chunk.js +2 -0
  19. package/build/static/js/10.d8b82f8d.chunk.js.map +1 -0
  20. package/build/static/js/4.7a36b2ba.chunk.js +3 -0
  21. package/build/static/js/{4.ec5cc748.chunk.js.LICENSE.txt → 4.7a36b2ba.chunk.js.LICENSE.txt} +31 -43
  22. package/build/static/js/4.7a36b2ba.chunk.js.map +1 -0
  23. package/build/static/js/5.3334eaed.chunk.js +2 -0
  24. package/build/static/js/5.3334eaed.chunk.js.map +1 -0
  25. package/build/static/js/6.fa05fa72.chunk.js +2 -0
  26. package/build/static/js/6.fa05fa72.chunk.js.map +1 -0
  27. package/build/static/js/7.f7f97288.chunk.js +2 -0
  28. package/build/static/js/7.f7f97288.chunk.js.map +1 -0
  29. package/build/static/js/8.018740e7.chunk.js +2 -0
  30. package/build/static/js/8.018740e7.chunk.js.map +1 -0
  31. package/build/static/js/9.bedec3ae.chunk.js +2 -0
  32. package/build/static/js/9.bedec3ae.chunk.js.map +1 -0
  33. package/build/static/js/main.e3089af8.chunk.js +2 -0
  34. package/build/static/js/main.e3089af8.chunk.js.map +1 -0
  35. package/build/static/js/{runtime-main.49dce7d3.js → runtime-main.fca72100.js} +2 -2
  36. package/build/static/js/{runtime-main.49dce7d3.js.map → runtime-main.fca72100.js.map} +1 -1
  37. package/package.json +32 -29
  38. package/build/static/js/0.d567f606.chunk.js +0 -3
  39. package/build/static/js/0.d567f606.chunk.js.map +0 -1
  40. package/build/static/js/1.ab9dcdd2.chunk.js +0 -2
  41. package/build/static/js/1.ab9dcdd2.chunk.js.map +0 -1
  42. package/build/static/js/10.605a889f.chunk.js +0 -2
  43. package/build/static/js/10.605a889f.chunk.js.map +0 -1
  44. package/build/static/js/4.ec5cc748.chunk.js +0 -3
  45. package/build/static/js/4.ec5cc748.chunk.js.map +0 -1
  46. package/build/static/js/5.20ba603f.chunk.js +0 -2
  47. package/build/static/js/5.20ba603f.chunk.js.map +0 -1
  48. package/build/static/js/6.f3503586.chunk.js +0 -2
  49. package/build/static/js/6.f3503586.chunk.js.map +0 -1
  50. package/build/static/js/7.9310535b.chunk.js +0 -2
  51. package/build/static/js/7.9310535b.chunk.js.map +0 -1
  52. package/build/static/js/8.ec34ae8e.chunk.js +0 -2
  53. package/build/static/js/8.ec34ae8e.chunk.js.map +0 -1
  54. package/build/static/js/9.0c82bd91.chunk.js +0 -2
  55. package/build/static/js/9.0c82bd91.chunk.js.map +0 -1
  56. package/build/static/js/main.f3a4f0ac.chunk.js +0 -2
  57. package/build/static/js/main.f3a4f0ac.chunk.js.map +0 -1
package/api/index.js CHANGED
@@ -32,6 +32,7 @@ const createBlockletRoutes = require('./routes/blocklet');
32
32
  const createDnsResolver = require('./routes/dns-resolver');
33
33
  const checkRunning = require('./middlewares/check-running');
34
34
  const checkAdminPermission = require('./middlewares/check-admin-permission');
35
+ const checkBlocklet = require('./middlewares/check-blocklet');
35
36
  const proxyToDaemon = require('./middlewares/proxy-to-daemon');
36
37
  const attachSharedUtils = require('./util/attach-shared-utils');
37
38
 
@@ -202,6 +203,8 @@ module.exports = function createServer(node, serverOptions = {}) {
202
203
  res.sendWebPage();
203
204
  });
204
205
 
206
+ server.use(checkBlocklet);
207
+
205
208
  // Middleware: check running
206
209
  // Request would not arrive here before blocklet is installed, because there is no config in router provider(nginx)
207
210
  server.use(checkRunning);
@@ -220,8 +223,8 @@ module.exports = function createServer(node, serverOptions = {}) {
220
223
  });
221
224
 
222
225
  // After all service middleware, we can now safely pass all traffic to blocklets
223
- server.use((req, res, next) => {
224
- const { target } = ensureProxyUrl(req);
226
+ server.use(async (req, res, next) => {
227
+ const { target } = await ensureProxyUrl(req);
225
228
 
226
229
  if (target) {
227
230
  proxy.safeWeb(req, res, {
@@ -287,7 +290,7 @@ module.exports = function createServer(node, serverOptions = {}) {
287
290
 
288
291
  // Final: directly proxy all websocket request to target blocklet
289
292
  wsRouter.use('**', async (req, socket, head) => {
290
- const { target } = ensureProxyUrl(req);
293
+ const { target } = await ensureProxyUrl(req);
291
294
  if (target) {
292
295
  let isOpen = false;
293
296
  let timer;
@@ -0,0 +1,14 @@
1
+ const logger = require('@abtnode/logger')(require('../../package.json').name);
2
+
3
+ module.exports = async (req, res, next) => {
4
+ const blocklet = await req.getBlocklet?.();
5
+
6
+ if (!blocklet) {
7
+ logger.error('blocklet not found', { url: req.url, method: req.method, headers: req.headers });
8
+ res.status(500).send('blocklet not found');
9
+ return;
10
+ }
11
+
12
+ req.blocklet = blocklet;
13
+ next();
14
+ };
@@ -74,6 +74,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
74
74
  // Generate new session token that client can save to localStorage
75
75
  const sessionToken = await createSessionToken(userDid, { passport, role });
76
76
  await updateSession({ sessionToken }, true);
77
+ await updateSession({ passportId: response.data.id });
77
78
  logger.info('invite.success', { userDid });
78
79
 
79
80
  return response;
@@ -38,7 +38,7 @@ module.exports = function createRoutes(node) {
38
38
  },
39
39
  },
40
40
 
41
- onAuth: async ({ userDid, userPk, claims, extraParams, req, baseUrl }) => {
41
+ onAuth: async ({ userDid, userPk, claims, extraParams, updateSession, req, baseUrl }) => {
42
42
  const { locale, id } = extraParams;
43
43
  const nodeInfo = await node.getNodeInfo();
44
44
  const teamDid = req.headers['x-blocklet-did'];
@@ -56,6 +56,7 @@ module.exports = function createRoutes(node) {
56
56
  locale,
57
57
  claims,
58
58
  statusEndpointBaseUrl,
59
+ updateSession,
59
60
  endpoint,
60
61
  });
61
62
  },
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable arrow-parens */
2
2
  const get = require('lodash/get');
3
3
  const joinUrl = require('url-join');
4
+ const formatContext = require('@abtnode/util/lib/format-context');
4
5
  const {
5
6
  messages,
6
7
  getVCFromClaims,
@@ -75,7 +76,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
75
76
  };
76
77
  },
77
78
 
78
- verifiableCredential: async ({ context, extraParams: { locale } }) => {
79
+ verifiableCredential: async ({ context, extraParams: { locale, passportId = '' } }) => {
79
80
  const { request, didwallet } = context;
80
81
  const { wallet, did: teamDid } = await request.getBlockletInfo();
81
82
 
@@ -87,12 +88,17 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
87
88
  const config = (await request.getServiceConfig(NODE_SERVICES.AUTH)) || {};
88
89
  const [invitedUserOnly] = await isInvitedUserOnly(config, node, teamDid);
89
90
 
90
- return {
91
+ const claim = {
91
92
  description: messages.requestPassport[locale],
92
93
  item: vcTypes,
93
94
  trustedIssuers,
94
95
  optional: !invitedUserOnly,
95
96
  };
97
+ if (passportId) {
98
+ claim.target = passportId;
99
+ }
100
+
101
+ return claim;
96
102
  },
97
103
  };
98
104
 
@@ -207,22 +213,32 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
207
213
 
208
214
  // Update profile
209
215
  try {
216
+ const passportForLog = passport || { name: 'Guest', role: 'guest' };
210
217
  if (user) {
211
218
  // Update user
212
- await node.updateUser({
219
+ const doc = await node.updateUser({
213
220
  teamDid,
214
221
  user: {
215
222
  did: userDid,
216
223
  pk: userPk,
217
224
  locale,
218
- passports: upsertToPassports(user.passports || [], passport),
225
+ passports: upsertToPassports(user.passports || [], passport).filter(Boolean),
219
226
  lastLoginAt: new Date().toISOString(),
220
227
  },
221
228
  });
229
+ await node.createAuditLog(
230
+ {
231
+ action: 'login',
232
+ args: { teamDid, userDid, passport: passportForLog },
233
+ context: formatContext(Object.assign(req, { user: doc })),
234
+ result: doc,
235
+ },
236
+ node
237
+ );
222
238
  } else {
223
239
  // Create user
224
240
  const profile = claims.find((x) => x.type === 'profile');
225
- await node.addUser({
241
+ const doc = await node.addUser({
226
242
  teamDid,
227
243
  user: {
228
244
  ...profile,
@@ -235,6 +251,15 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
235
251
  lastLoginAt: new Date().toISOString(),
236
252
  },
237
253
  });
254
+ await node.createAuditLog(
255
+ {
256
+ action: 'addUser',
257
+ args: { teamDid, userDid, reason: `first login as ${passportForLog.role}` },
258
+ context: formatContext(Object.assign(req, { user: doc })),
259
+ result: doc,
260
+ },
261
+ node
262
+ );
238
263
  }
239
264
 
240
265
  // Generate new session token that client can save to localStorage
@@ -1,4 +1,5 @@
1
1
  const get = require('lodash/get');
2
+ const formatContext = require('@abtnode/util/lib/format-context');
2
3
  const { messages, getVCFromClaims, getUser, validatePassportStatus } = require('@abtnode/auth/lib/auth');
3
4
  const { ROLES, VC_TYPE_GENERAL_PASSPORT, VC_TYPE_NODE_PASSPORT } = require('@abtnode/constant');
4
5
  const {
@@ -98,6 +99,15 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
98
99
 
99
100
  // Recreate passport with correct role
100
101
  passport = createUserPassport(vc, { role });
102
+ await node.createAuditLog(
103
+ {
104
+ action: 'switchPassport',
105
+ args: { teamDid, userDid, passport },
106
+ context: formatContext(Object.assign(req, { user })),
107
+ result: {},
108
+ },
109
+ node
110
+ );
101
111
 
102
112
  // Generate new session token that client can save to localStorage
103
113
  const sessionToken = await createSessionToken(userDid, { passport, role });
@@ -1,4 +1,5 @@
1
1
  const get = require('lodash/get');
2
+ const formatContext = require('@abtnode/util/lib/format-context');
2
3
  const { messages, getUser } = require('@abtnode/auth/lib/auth');
3
4
  const { NODE_SERVICES } = require('@abtnode/constant');
4
5
 
@@ -47,7 +48,7 @@ module.exports = function createRoutes(node) {
47
48
 
48
49
  // Update user
49
50
  const profile = claims.find((x) => x.type === 'profile');
50
- await node.updateUser({
51
+ const doc = await node.updateUser({
51
52
  teamDid,
52
53
  user: {
53
54
  ...user,
@@ -55,6 +56,15 @@ module.exports = function createRoutes(node) {
55
56
  locale,
56
57
  },
57
58
  });
59
+ await node.createAuditLog(
60
+ {
61
+ action: 'switchProfile',
62
+ args: { teamDid, userDid, profile },
63
+ context: formatContext(Object.assign(req, { user })),
64
+ result: doc,
65
+ },
66
+ node
67
+ );
58
68
  },
59
69
  };
60
70
  };
package/api/util/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  const joinUrl = require('url-join');
2
2
  const get = require('lodash/get');
3
3
  const { ROLES } = require('@abtnode/constant');
4
- const { BlockletSource, BLOCKLET_MODES } = require('@blocklet/meta/lib/constants');
4
+ const { BlockletSource, BLOCKLET_MODES, BlockletGroup } = require('@blocklet/meta/lib/constants');
5
+ const { findWebInterface } = require('@blocklet/meta/lib/util');
5
6
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
6
7
 
7
- const getBaseUrl = (req) => {
8
+ const getGroupPrefix = (req) => {
8
9
  if (req.headers['x-group-path-prefix']) {
9
10
  return `/${req.headers['x-group-path-prefix']}/`.replace(/\/+/g, '/');
10
11
  }
@@ -12,6 +13,14 @@ const getBaseUrl = (req) => {
12
13
  return '/';
13
14
  };
14
15
 
16
+ const getComponentPrefix = (req) => {
17
+ if (req.headers['x-path-prefix']) {
18
+ return `/${req.headers['x-path-prefix']}/`.replace(/\/+/g, '/');
19
+ }
20
+
21
+ return '/';
22
+ };
23
+
15
24
  const getLogoFromLogoUrl = (blocklet, version) => {
16
25
  try {
17
26
  if (!blocklet.meta.logoUrl) {
@@ -61,7 +70,33 @@ const shouldGotoStartPage = (req, blocklet) => {
61
70
  return false;
62
71
  };
63
72
 
64
- const ensureProxyUrl = (req) => {
73
+ const findRootWebPort = (blocklet) => {
74
+ if (!blocklet) {
75
+ return null;
76
+ }
77
+
78
+ if (blocklet.group !== BlockletGroup.gateway) {
79
+ // FIXME blocklet web port should be forced to BLOCKLET_PORT? (convention over configuration)
80
+ const webInterface = findWebInterface(blocklet);
81
+ return blocklet.ports[webInterface?.port || 'BLOCKLET_PORT'];
82
+ }
83
+
84
+ return findRootWebPort(blocklet.children[0]);
85
+ };
86
+
87
+ const ensureProxyUrl = async (req) => {
88
+ if (req.url.startsWith('/favicon')) {
89
+ // convert all faviconXXX to favicon to ensure file exists in root blocklet
90
+ req.url = '/favicon.ico';
91
+
92
+ const port = findRootWebPort(await req.getBlocklet());
93
+ if (port) {
94
+ return { target: `http://127.0.0.1:${port}` };
95
+ }
96
+
97
+ return { target: null };
98
+ }
99
+
65
100
  const target = req.headers['x-blocklet-url'];
66
101
 
67
102
  if (target) {
@@ -76,15 +111,18 @@ const ensureProxyUrl = (req) => {
76
111
  };
77
112
 
78
113
  const getRedirectUrl = ({ req, pagePath }) => {
79
- const baseUrl = getBaseUrl(req);
114
+ const groupPrefix = getGroupPrefix(req);
115
+ const componentPrefix = getComponentPrefix(req);
116
+ const redirectPrefix = groupPrefix === componentPrefix ? groupPrefix : componentPrefix;
117
+
80
118
  const redirectUrlObj = new URL(`http://localhost${req.url}`);
81
119
  // 重定向时考虑 serverUrl 查询参数的处理
82
120
  const serverUrl = redirectUrlObj.searchParams.get('serverUrl');
83
121
  redirectUrlObj.searchParams.delete('__start__');
84
122
  redirectUrlObj.searchParams.delete('serverUrl');
85
- const redirectUrl = `${baseUrl.replace(/\/+$/, '')}${redirectUrlObj.pathname}${redirectUrlObj.search}`;
123
+ const redirectUrl = `${redirectPrefix.replace(/\/+$/, '')}${redirectUrlObj.pathname}${redirectUrlObj.search}`;
86
124
 
87
- const url = new URL(`http://localhost${joinUrl(baseUrl, WELLKNOWN_SERVICE_PATH_PREFIX, pagePath || '/')}`);
125
+ const url = new URL(`http://localhost${joinUrl(groupPrefix, WELLKNOWN_SERVICE_PATH_PREFIX, pagePath || '/')}`);
88
126
  url.searchParams.set('redirect', redirectUrl);
89
127
 
90
128
  const locale = new URL(`http://localhost${req.url}`).searchParams.get('locale');
@@ -104,4 +142,5 @@ module.exports = {
104
142
  shouldGotoStartPage,
105
143
  ensureProxyUrl,
106
144
  getRedirectUrl,
145
+ findRootWebPort,
107
146
  };
@@ -1,41 +1,41 @@
1
1
  {
2
2
  "files": {
3
- "static/js/0.d567f606.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/0.d567f606.chunk.js",
4
- "static/js/0.d567f606.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/0.d567f606.chunk.js.map",
5
- "static/js/1.ab9dcdd2.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/1.ab9dcdd2.chunk.js",
6
- "static/js/1.ab9dcdd2.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/1.ab9dcdd2.chunk.js.map",
7
- "main.js": "/.blocklet/proxy/blocklet-service/static/js/main.f3a4f0ac.chunk.js",
8
- "main.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.f3a4f0ac.chunk.js.map",
9
- "runtime-main.js": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.49dce7d3.js",
10
- "runtime-main.js.map": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.49dce7d3.js.map",
3
+ "static/js/0.65d89c48.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/0.65d89c48.chunk.js",
4
+ "static/js/0.65d89c48.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/0.65d89c48.chunk.js.map",
5
+ "static/js/1.45d34a8d.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/1.45d34a8d.chunk.js",
6
+ "static/js/1.45d34a8d.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/1.45d34a8d.chunk.js.map",
7
+ "main.js": "/.blocklet/proxy/blocklet-service/static/js/main.e3089af8.chunk.js",
8
+ "main.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.e3089af8.chunk.js.map",
9
+ "runtime-main.js": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.fca72100.js",
10
+ "runtime-main.js.map": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.fca72100.js.map",
11
11
  "static/css/4.6e1172e8.chunk.css": "/.blocklet/proxy/blocklet-service/static/css/4.6e1172e8.chunk.css",
12
- "static/js/4.ec5cc748.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/4.ec5cc748.chunk.js",
13
- "static/js/4.ec5cc748.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/4.ec5cc748.chunk.js.map",
14
- "static/js/5.20ba603f.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/5.20ba603f.chunk.js",
15
- "static/js/5.20ba603f.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/5.20ba603f.chunk.js.map",
16
- "static/js/6.f3503586.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/6.f3503586.chunk.js",
17
- "static/js/6.f3503586.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/6.f3503586.chunk.js.map",
18
- "static/js/7.9310535b.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/7.9310535b.chunk.js",
19
- "static/js/7.9310535b.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/7.9310535b.chunk.js.map",
20
- "static/js/8.ec34ae8e.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/8.ec34ae8e.chunk.js",
21
- "static/js/8.ec34ae8e.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/8.ec34ae8e.chunk.js.map",
22
- "static/js/9.0c82bd91.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/9.0c82bd91.chunk.js",
23
- "static/js/9.0c82bd91.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/9.0c82bd91.chunk.js.map",
24
- "static/js/10.605a889f.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/10.605a889f.chunk.js",
25
- "static/js/10.605a889f.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/10.605a889f.chunk.js.map",
12
+ "static/js/4.7a36b2ba.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/4.7a36b2ba.chunk.js",
13
+ "static/js/4.7a36b2ba.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/4.7a36b2ba.chunk.js.map",
14
+ "static/js/5.3334eaed.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/5.3334eaed.chunk.js",
15
+ "static/js/5.3334eaed.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/5.3334eaed.chunk.js.map",
16
+ "static/js/6.fa05fa72.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/6.fa05fa72.chunk.js",
17
+ "static/js/6.fa05fa72.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/6.fa05fa72.chunk.js.map",
18
+ "static/js/7.f7f97288.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/7.f7f97288.chunk.js",
19
+ "static/js/7.f7f97288.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/7.f7f97288.chunk.js.map",
20
+ "static/js/8.018740e7.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/8.018740e7.chunk.js",
21
+ "static/js/8.018740e7.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/8.018740e7.chunk.js.map",
22
+ "static/js/9.bedec3ae.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/9.bedec3ae.chunk.js",
23
+ "static/js/9.bedec3ae.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/9.bedec3ae.chunk.js.map",
24
+ "static/js/10.d8b82f8d.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/10.d8b82f8d.chunk.js",
25
+ "static/js/10.d8b82f8d.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/10.d8b82f8d.chunk.js.map",
26
26
  "index.html": "/.blocklet/proxy/blocklet-service/index.html",
27
- "precache-manifest.62677c47082207508be287829a517379.js": "/.blocklet/proxy/blocklet-service/precache-manifest.62677c47082207508be287829a517379.js",
27
+ "precache-manifest.c82f233909194dca95a9f73ae18caf89.js": "/.blocklet/proxy/blocklet-service/precache-manifest.c82f233909194dca95a9f73ae18caf89.js",
28
28
  "service-worker.js": "/.blocklet/proxy/blocklet-service/service-worker.js",
29
29
  "static/css/4.6e1172e8.chunk.css.map": "/.blocklet/proxy/blocklet-service/static/css/4.6e1172e8.chunk.css.map",
30
- "static/js/0.d567f606.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/0.d567f606.chunk.js.LICENSE.txt",
31
- "static/js/4.ec5cc748.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/4.ec5cc748.chunk.js.LICENSE.txt",
30
+ "static/js/0.65d89c48.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/0.65d89c48.chunk.js.LICENSE.txt",
31
+ "static/js/4.7a36b2ba.chunk.js.LICENSE.txt": "/.blocklet/proxy/blocklet-service/static/js/4.7a36b2ba.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
  },
35
35
  "entrypoints": [
36
- "static/js/runtime-main.49dce7d3.js",
36
+ "static/js/runtime-main.fca72100.js",
37
37
  "static/css/4.6e1172e8.chunk.css",
38
- "static/js/4.ec5cc748.chunk.js",
39
- "static/js/main.f3a4f0ac.chunk.js"
38
+ "static/js/4.7a36b2ba.chunk.js",
39
+ "static/js/main.e3089af8.chunk.js"
40
40
  ]
41
41
  }
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.6e1172e8.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,u,i=t[0],l=t[1],f=t[2],s=t[3]||[],d=0,h=[];d<i.length;d++)u=i[d],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&h.push(o[u][0]),o[u]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(t),a.push.apply(a,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&&(a.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=u(e),document.head.appendChild(t)}})),a.length=0),e}var n={},o={3:0},c=[],a=[];function u(e){return i.p+"static/js/"+({}[e]||e)+"."+{0:"d567f606",1:"ab9dcdd2",5:"20ba603f",6:"f3503586",7:"9310535b",8:"ec34ae8e",9:"0c82bd91",10:"605a889f"}[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,a=document.createElement("script");a.charset="utf-8",a.timeout=120,i.nc&&a.setAttribute("nonce",i.nc),a.src=u(e);var l=new Error;c=function(t){a.onerror=a.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:a})}),12e4);a.onerror=a.onload=c,document.head.appendChild(a)}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.ec5cc748.chunk.js"></script><script src="/.blocklet/proxy/blocklet-service/static/js/main.f3a4f0ac.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.6e1172e8.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,u,i=t[0],l=t[1],f=t[2],s=t[3]||[],d=0,h=[];d<i.length;d++)u=i[d],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&h.push(o[u][0]),o[u]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(t),c.push.apply(c,s);h.length;)h.shift()();return a.push.apply(a,f||[]),r()}function r(){for(var e,t=0;t<a.length;t++){for(var r=a[t],n=!0,l=1;l<r.length;l++){var f=r[l];0!==o[f]&&(n=!1)}n&&(a.splice(t--,1),e=i(i.s=r[0]))}return 0===a.length&&(c.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=u(e),document.head.appendChild(t)}})),c.length=0),e}var n={},o={3:0},a=[],c=[];function u(e){return i.p+"static/js/"+({}[e]||e)+"."+{0:"65d89c48",1:"45d34a8d",5:"3334eaed",6:"fa05fa72",7:"f7f97288",8:"018740e7",9:"bedec3ae",10:"d8b82f8d"}[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 a,c=document.createElement("script");c.charset="utf-8",c.timeout=120,i.nc&&c.setAttribute("nonce",i.nc),c.src=u(e);var l=new Error;a=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;l.message="Loading chunk "+e+" failed.\n("+n+": "+a+")",l.name="ChunkLoadError",l.type=n,l.request=a,r[1](l)}o[e]=void 0}};var f=setTimeout((function(){a({type:"timeout",target:c})}),12e4);c.onerror=c.onload=a,document.head.appendChild(c)}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.7a36b2ba.chunk.js"></script><script src="/.blocklet/proxy/blocklet-service/static/js/main.e3089af8.chunk.js"></script></body></html>
@@ -1,63 +1,63 @@
1
1
  self.__precacheManifest = (self.__precacheManifest || []).concat([
2
2
  {
3
- "revision": "a2af109b17932d3a5cb484d80fb8e089",
3
+ "revision": "470af1f4ff7f79f931f8f58bd41dabb7",
4
4
  "url": "/.blocklet/proxy/blocklet-service/index.html"
5
5
  },
6
6
  {
7
- "revision": "9e010ad6ba6e808c4209",
7
+ "revision": "f9bb2bcad88c5191a52f",
8
8
  "url": "/.blocklet/proxy/blocklet-service/static/css/4.6e1172e8.chunk.css"
9
9
  },
10
10
  {
11
- "revision": "8d83b111c2f6c22b4104",
12
- "url": "/.blocklet/proxy/blocklet-service/static/js/0.d567f606.chunk.js"
11
+ "revision": "7d787db97e7cd423df8f",
12
+ "url": "/.blocklet/proxy/blocklet-service/static/js/0.65d89c48.chunk.js"
13
13
  },
14
14
  {
15
15
  "revision": "327dea51c54983f5708f4242bceacaed",
16
- "url": "/.blocklet/proxy/blocklet-service/static/js/0.d567f606.chunk.js.LICENSE.txt"
16
+ "url": "/.blocklet/proxy/blocklet-service/static/js/0.65d89c48.chunk.js.LICENSE.txt"
17
17
  },
18
18
  {
19
- "revision": "fa2b03656d939081dbab",
20
- "url": "/.blocklet/proxy/blocklet-service/static/js/1.ab9dcdd2.chunk.js"
19
+ "revision": "94e5489b380d0968dafb",
20
+ "url": "/.blocklet/proxy/blocklet-service/static/js/1.45d34a8d.chunk.js"
21
21
  },
22
22
  {
23
- "revision": "cc23f3e373157cfee5e7",
24
- "url": "/.blocklet/proxy/blocklet-service/static/js/10.605a889f.chunk.js"
23
+ "revision": "ec269872ca0eaffeb570",
24
+ "url": "/.blocklet/proxy/blocklet-service/static/js/10.d8b82f8d.chunk.js"
25
25
  },
26
26
  {
27
- "revision": "9e010ad6ba6e808c4209",
28
- "url": "/.blocklet/proxy/blocklet-service/static/js/4.ec5cc748.chunk.js"
27
+ "revision": "f9bb2bcad88c5191a52f",
28
+ "url": "/.blocklet/proxy/blocklet-service/static/js/4.7a36b2ba.chunk.js"
29
29
  },
30
30
  {
31
- "revision": "ff58a668e6d753fa035087a671c28199",
32
- "url": "/.blocklet/proxy/blocklet-service/static/js/4.ec5cc748.chunk.js.LICENSE.txt"
31
+ "revision": "f101b2fce3f1d0e331470363e3a5af12",
32
+ "url": "/.blocklet/proxy/blocklet-service/static/js/4.7a36b2ba.chunk.js.LICENSE.txt"
33
33
  },
34
34
  {
35
- "revision": "56183c63a0b499e87622",
36
- "url": "/.blocklet/proxy/blocklet-service/static/js/5.20ba603f.chunk.js"
35
+ "revision": "0b8622027516fe4a4665",
36
+ "url": "/.blocklet/proxy/blocklet-service/static/js/5.3334eaed.chunk.js"
37
37
  },
38
38
  {
39
- "revision": "e7c3ac5540644074e847",
40
- "url": "/.blocklet/proxy/blocklet-service/static/js/6.f3503586.chunk.js"
39
+ "revision": "e1466d0e7b1f55119a40",
40
+ "url": "/.blocklet/proxy/blocklet-service/static/js/6.fa05fa72.chunk.js"
41
41
  },
42
42
  {
43
- "revision": "f3508d38d29259201323",
44
- "url": "/.blocklet/proxy/blocklet-service/static/js/7.9310535b.chunk.js"
43
+ "revision": "11b983e64ce100eeee85",
44
+ "url": "/.blocklet/proxy/blocklet-service/static/js/7.f7f97288.chunk.js"
45
45
  },
46
46
  {
47
- "revision": "b975347c70c1c9cf3a19",
48
- "url": "/.blocklet/proxy/blocklet-service/static/js/8.ec34ae8e.chunk.js"
47
+ "revision": "5d86fb9a66b6962461df",
48
+ "url": "/.blocklet/proxy/blocklet-service/static/js/8.018740e7.chunk.js"
49
49
  },
50
50
  {
51
- "revision": "c4913f331bea9065ea2b",
52
- "url": "/.blocklet/proxy/blocklet-service/static/js/9.0c82bd91.chunk.js"
51
+ "revision": "7dd70563a52a7082ad33",
52
+ "url": "/.blocklet/proxy/blocklet-service/static/js/9.bedec3ae.chunk.js"
53
53
  },
54
54
  {
55
- "revision": "d1c361dfaa769857263a",
56
- "url": "/.blocklet/proxy/blocklet-service/static/js/main.f3a4f0ac.chunk.js"
55
+ "revision": "458e863e4281fe8bcf58",
56
+ "url": "/.blocklet/proxy/blocklet-service/static/js/main.e3089af8.chunk.js"
57
57
  },
58
58
  {
59
- "revision": "f1b0162f72cbaa438103",
60
- "url": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.49dce7d3.js"
59
+ "revision": "d74f5278b2f1e82441f2",
60
+ "url": "/.blocklet/proxy/blocklet-service/static/js/runtime-main.fca72100.js"
61
61
  },
62
62
  {
63
63
  "revision": "a82dcb33d52ed6fa529e5ae8d5fda7f3",
@@ -14,7 +14,7 @@
14
14
  importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
15
15
 
16
16
  importScripts(
17
- "/.blocklet/proxy/blocklet-service/precache-manifest.62677c47082207508be287829a517379.js"
17
+ "/.blocklet/proxy/blocklet-service/precache-manifest.c82f233909194dca95a9f73ae18caf89.js"
18
18
  );
19
19
 
20
20
  self.addEventListener('message', (event) => {