@abtnode/blocklet-services 1.16.19-beta-340de95d → 1.16.19-beta-7b2db880
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/libs/connect/session.js +17 -19
- package/api/libs/connect/v2.js +2 -5
- package/api/libs/image.js +64 -64
- package/api/libs/open-graph/emoji.js +2 -2
- package/api/libs/open-graph/index.js +1 -0
- package/api/routes/federated.js +108 -19
- package/api/routes/oauth.js +24 -27
- package/api/routes/user-session.js +5 -1
- package/api/routes/user.js +1 -0
- package/api/services/auth/connect/invite.js +8 -5
- package/api/util/federated.js +45 -0
- package/api/validators/login.js +1 -1
- package/build/asset-manifest.json +17 -17
- package/build/index.html +1 -1
- package/build/service-worker.js +1 -1
- package/build/static/js/4076.8055ce74.chunk.js +2 -0
- package/build/static/js/4461.f9a883d3.chunk.js +2 -0
- package/build/static/js/5468.21a861b9.chunk.js +2 -0
- package/build/static/js/5547.42b98889.chunk.js +3 -0
- package/build/static/js/{8181.6c2a7dcb.chunk.js → 8181.bc510ea3.chunk.js} +2 -2
- package/build/static/js/8622.6aa0a4d4.chunk.js +2 -0
- package/build/static/js/{8944.939de854.chunk.js → 8944.5b8c231c.chunk.js} +2 -2
- package/build/static/js/main.09227d84.js +3 -0
- package/package.json +24 -27
- package/build/static/js/4076.f5369a1d.chunk.js +0 -2
- package/build/static/js/4461.3cd698bf.chunk.js +0 -2
- package/build/static/js/5468.b54ce65b.chunk.js +0 -2
- package/build/static/js/5547.570ded36.chunk.js +0 -3
- package/build/static/js/8622.ebd44812.chunk.js +0 -2
- package/build/static/js/main.581a3a26.js +0 -3
- /package/build/static/js/{5547.570ded36.chunk.js.LICENSE.txt → 5547.42b98889.chunk.js.LICENSE.txt} +0 -0
- /package/build/static/js/{main.581a3a26.js.LICENSE.txt → main.09227d84.js.LICENSE.txt} +0 -0
|
@@ -7,6 +7,7 @@ const defaults = require('lodash/defaults');
|
|
|
7
7
|
const cloneDeep = require('lodash/cloneDeep');
|
|
8
8
|
const pLimit = require('p-limit');
|
|
9
9
|
const logger = require('@abtnode/logger')('blocklet-services:user-session');
|
|
10
|
+
const { getSourceProvider } = require('@blocklet/meta/lib/did-utils');
|
|
10
11
|
|
|
11
12
|
const ensureBlocklet = require('../middlewares/ensure-blocklet');
|
|
12
13
|
const { getUserAvatarUrl } = require('../util/federated');
|
|
@@ -103,6 +104,9 @@ module.exports = {
|
|
|
103
104
|
},
|
|
104
105
|
sites: [],
|
|
105
106
|
});
|
|
107
|
+
const sourceProvider = getSourceProvider(user);
|
|
108
|
+
|
|
109
|
+
const provider = sourceProvider || LOGIN_PROVIDER.WALLET;
|
|
106
110
|
|
|
107
111
|
const memberSite = federated.sites.find((item) => item.appPid === appPid);
|
|
108
112
|
const postUser = pick(user, ['did', 'pk', 'fullName', 'locale']);
|
|
@@ -121,7 +125,7 @@ module.exports = {
|
|
|
121
125
|
user: postUser,
|
|
122
126
|
passport: passportId ? { id: passportId } : undefined,
|
|
123
127
|
walletOS: 'web',
|
|
124
|
-
provider
|
|
128
|
+
provider,
|
|
125
129
|
},
|
|
126
130
|
site: memberSite,
|
|
127
131
|
});
|
package/api/routes/user.js
CHANGED
|
@@ -175,6 +175,7 @@ async function loginOAuth(
|
|
|
175
175
|
throw new ApiError(400, error.message);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
// FIXME: @zhanghan 如果有 sourceAppPid,则这里拿到的 userWallet 是不对的?
|
|
178
179
|
const userWallet = fromAppDid(id, blockletWallet.secretKey);
|
|
179
180
|
const userDid = userWallet.address;
|
|
180
181
|
const userPk = userWallet.publicKey;
|
|
@@ -13,6 +13,7 @@ const { LOGIN_PROVIDER } = require('@blocklet/constant');
|
|
|
13
13
|
const logger = require('@abtnode/logger')(require('../../../../package.json').name);
|
|
14
14
|
|
|
15
15
|
const { createTokenFn, getDidConnectVersion } = require('../../../util');
|
|
16
|
+
const { getUserWithinFederated } = require('../../../util/federated');
|
|
16
17
|
|
|
17
18
|
module.exports = function createRoutes(node, authenticator, createSessionToken) {
|
|
18
19
|
return {
|
|
@@ -65,7 +66,9 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
65
66
|
const statusEndpointBaseUrl = joinUrl(baseUrl, WELLKNOWN_SERVICE_PATH_PREFIX);
|
|
66
67
|
const endpoint = baseUrl;
|
|
67
68
|
|
|
68
|
-
|
|
69
|
+
await getUserWithinFederated({ sourceAppPid, teamDid, userDid, userPk }, { node, blocklet });
|
|
70
|
+
|
|
71
|
+
const { passport, response, role, profile, user } = await handleInvitationResponse({
|
|
69
72
|
req,
|
|
70
73
|
node,
|
|
71
74
|
nodeInfo,
|
|
@@ -85,7 +88,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
85
88
|
const createToken = createTokenFn(createSessionToken);
|
|
86
89
|
const sessionConfig = blocklet.settings?.session || {};
|
|
87
90
|
const { sessionToken, refreshToken } = createToken(
|
|
88
|
-
|
|
91
|
+
user.did,
|
|
89
92
|
{
|
|
90
93
|
secret,
|
|
91
94
|
passport,
|
|
@@ -102,7 +105,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
102
105
|
const userSessionDoc = await node.upsertUserSession({
|
|
103
106
|
teamDid,
|
|
104
107
|
visitorId,
|
|
105
|
-
userDid,
|
|
108
|
+
userDid: user.did,
|
|
106
109
|
appPid: teamDid,
|
|
107
110
|
passportId: response.data.id,
|
|
108
111
|
status: 'online',
|
|
@@ -111,7 +114,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
111
114
|
});
|
|
112
115
|
node.syncUserSession({
|
|
113
116
|
teamDid,
|
|
114
|
-
userDid,
|
|
117
|
+
userDid: user.did,
|
|
115
118
|
visitorId: userSessionDoc.visitorId,
|
|
116
119
|
passportId: passport?.id,
|
|
117
120
|
targetAppPid: sourceAppPid,
|
|
@@ -127,7 +130,7 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
|
|
|
127
130
|
true
|
|
128
131
|
);
|
|
129
132
|
await updateSession({ passportId: response.data.id });
|
|
130
|
-
logger.info('invite.success', { userDid });
|
|
133
|
+
logger.info('invite.success', { userDid: user.did });
|
|
131
134
|
|
|
132
135
|
return response;
|
|
133
136
|
},
|
package/api/util/federated.js
CHANGED
|
@@ -115,6 +115,50 @@ function shouldSyncFederated(sourceAppPid, blocklet) {
|
|
|
115
115
|
return false;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
+
async function getUserWithinFederated({ userDid, userPk, teamDid, sourceAppPid }, { node, blocklet }) {
|
|
119
|
+
let currentUser = await node.getUser({
|
|
120
|
+
teamDid,
|
|
121
|
+
user: {
|
|
122
|
+
did: userDid,
|
|
123
|
+
},
|
|
124
|
+
options: {
|
|
125
|
+
enableConnectedAccount: true,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
if (!currentUser && shouldSyncFederated(sourceAppPid, blocklet)) {
|
|
129
|
+
const masterSite = getFederatedMaster(blocklet);
|
|
130
|
+
const syncResults = await node.syncFederated({
|
|
131
|
+
did: teamDid,
|
|
132
|
+
data: {
|
|
133
|
+
users: [
|
|
134
|
+
{
|
|
135
|
+
did: userDid,
|
|
136
|
+
pk: userPk,
|
|
137
|
+
action: 'pullAccount',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
syncSites: [masterSite],
|
|
142
|
+
});
|
|
143
|
+
const resultItem = syncResults.find((x) => x.site.appPid === masterSite.appPid);
|
|
144
|
+
if (resultItem) {
|
|
145
|
+
const { result } = resultItem;
|
|
146
|
+
const [pullUser] = result?.users || [];
|
|
147
|
+
if (pullUser) {
|
|
148
|
+
pullUser.sourceAppPid = masterSite.appPid;
|
|
149
|
+
pullUser.connectedAccount = pullUser.connectedAccounts;
|
|
150
|
+
delete pullUser.connectedAccounts;
|
|
151
|
+
currentUser = await node.loginUser({
|
|
152
|
+
teamDid,
|
|
153
|
+
user: pullUser,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return currentUser;
|
|
160
|
+
}
|
|
161
|
+
|
|
118
162
|
module.exports = {
|
|
119
163
|
isMaster,
|
|
120
164
|
shouldSyncFederated,
|
|
@@ -124,4 +168,5 @@ module.exports = {
|
|
|
124
168
|
migrateAuth0,
|
|
125
169
|
getOAuthUserInfo,
|
|
126
170
|
loginByMember,
|
|
171
|
+
getUserWithinFederated,
|
|
127
172
|
};
|
package/api/validators/login.js
CHANGED
|
@@ -25,7 +25,7 @@ const loginUserWalletSchema = Joi.object({
|
|
|
25
25
|
nonce: Joi.string().required(),
|
|
26
26
|
visitorId: Joi.string().optional(),
|
|
27
27
|
passportId: Joi.string().optional(),
|
|
28
|
-
sourceAppPid: Joi.DID().trim().
|
|
28
|
+
sourceAppPid: Joi.DID().trim().empty(null),
|
|
29
29
|
locale: Joi.string().optional(),
|
|
30
30
|
}).empty(null);
|
|
31
31
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
3
|
"main.css": "/.well-known/service/static/static/css/main.7ea79dc8.css",
|
|
4
|
-
"main.js": "/.well-known/service/static/static/js/main.
|
|
4
|
+
"main.js": "/.well-known/service/static/static/js/main.09227d84.js",
|
|
5
5
|
"static/js/9314.f0add972.chunk.js": "/.well-known/service/static/static/js/9314.f0add972.chunk.js",
|
|
6
6
|
"static/js/6218.4f3036a7.chunk.js": "/.well-known/service/static/static/js/6218.4f3036a7.chunk.js",
|
|
7
|
-
"static/js/4076.
|
|
7
|
+
"static/js/4076.8055ce74.chunk.js": "/.well-known/service/static/static/js/4076.8055ce74.chunk.js",
|
|
8
8
|
"static/js/6658.98f9956d.chunk.js": "/.well-known/service/static/static/js/6658.98f9956d.chunk.js",
|
|
9
9
|
"static/js/3025.7c99c058.chunk.js": "/.well-known/service/static/static/js/3025.7c99c058.chunk.js",
|
|
10
10
|
"static/js/7858.52930f63.chunk.js": "/.well-known/service/static/static/js/7858.52930f63.chunk.js",
|
|
11
11
|
"static/js/4587.9a042d46.chunk.js": "/.well-known/service/static/static/js/4587.9a042d46.chunk.js",
|
|
12
12
|
"static/js/779.73350f02.chunk.js": "/.well-known/service/static/static/js/779.73350f02.chunk.js",
|
|
13
|
-
"static/js/8622.
|
|
13
|
+
"static/js/8622.6aa0a4d4.chunk.js": "/.well-known/service/static/static/js/8622.6aa0a4d4.chunk.js",
|
|
14
14
|
"static/js/1148.5ccba08e.chunk.js": "/.well-known/service/static/static/js/1148.5ccba08e.chunk.js",
|
|
15
|
-
"static/js/8944.
|
|
16
|
-
"static/js/5468.
|
|
15
|
+
"static/js/8944.5b8c231c.chunk.js": "/.well-known/service/static/static/js/8944.5b8c231c.chunk.js",
|
|
16
|
+
"static/js/5468.21a861b9.chunk.js": "/.well-known/service/static/static/js/5468.21a861b9.chunk.js",
|
|
17
17
|
"static/js/9982.4f1ebb7f.chunk.js": "/.well-known/service/static/static/js/9982.4f1ebb7f.chunk.js",
|
|
18
18
|
"static/js/1359.add26d23.chunk.js": "/.well-known/service/static/static/js/1359.add26d23.chunk.js",
|
|
19
19
|
"static/js/6637.b2e35031.chunk.js": "/.well-known/service/static/static/js/6637.b2e35031.chunk.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"static/js/4882.0435e418.chunk.js": "/.well-known/service/static/static/js/4882.0435e418.chunk.js",
|
|
22
22
|
"static/js/5434.523d071d.chunk.js": "/.well-known/service/static/static/js/5434.523d071d.chunk.js",
|
|
23
23
|
"static/css/5547.e016de4c.chunk.css": "/.well-known/service/static/static/css/5547.e016de4c.chunk.css",
|
|
24
|
-
"static/js/5547.
|
|
24
|
+
"static/js/5547.42b98889.chunk.js": "/.well-known/service/static/static/js/5547.42b98889.chunk.js",
|
|
25
25
|
"static/js/3033.9fe46d7f.chunk.js": "/.well-known/service/static/static/js/3033.9fe46d7f.chunk.js",
|
|
26
26
|
"static/js/3842.e1bb702b.chunk.js": "/.well-known/service/static/static/js/3842.e1bb702b.chunk.js",
|
|
27
27
|
"static/js/3131.99541aca.chunk.js": "/.well-known/service/static/static/js/3131.99541aca.chunk.js",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"static/js/3076.28658ffc.chunk.js": "/.well-known/service/static/static/js/3076.28658ffc.chunk.js",
|
|
44
44
|
"static/js/5569.e4bfe697.chunk.js": "/.well-known/service/static/static/js/5569.e4bfe697.chunk.js",
|
|
45
45
|
"static/js/2801.33d2f238.chunk.js": "/.well-known/service/static/static/js/2801.33d2f238.chunk.js",
|
|
46
|
-
"static/js/4461.
|
|
46
|
+
"static/js/4461.f9a883d3.chunk.js": "/.well-known/service/static/static/js/4461.f9a883d3.chunk.js",
|
|
47
47
|
"static/js/5509.a196d497.chunk.js": "/.well-known/service/static/static/js/5509.a196d497.chunk.js",
|
|
48
48
|
"static/js/5683.051a03c1.chunk.js": "/.well-known/service/static/static/js/5683.051a03c1.chunk.js",
|
|
49
49
|
"static/js/7006.bb90b167.chunk.js": "/.well-known/service/static/static/js/7006.bb90b167.chunk.js",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"static/js/9107.7f32925d.chunk.js": "/.well-known/service/static/static/js/9107.7f32925d.chunk.js",
|
|
93
93
|
"static/css/3154.e954fcda.chunk.css": "/.well-known/service/static/static/css/3154.e954fcda.chunk.css",
|
|
94
94
|
"static/js/8016.3ef64a2c.chunk.js": "/.well-known/service/static/static/js/8016.3ef64a2c.chunk.js",
|
|
95
|
-
"static/js/8181.
|
|
95
|
+
"static/js/8181.bc510ea3.chunk.js": "/.well-known/service/static/static/js/8181.bc510ea3.chunk.js",
|
|
96
96
|
"static/js/9657.b03b88e5.chunk.js": "/.well-known/service/static/static/js/9657.b03b88e5.chunk.js",
|
|
97
97
|
"static/js/468.bbc69bbf.chunk.js": "/.well-known/service/static/static/js/468.bbc69bbf.chunk.js",
|
|
98
98
|
"static/media/ubuntu-mono-all-400-normal.woff": "/.well-known/service/static/static/media/ubuntu-mono-all-400-normal.c879328bc62e9c68268f.woff",
|
|
@@ -119,19 +119,19 @@
|
|
|
119
119
|
"index.html": "/.well-known/service/static/index.html",
|
|
120
120
|
"static/media/space-connected.svg": "/.well-known/service/static/static/media/space-connected.9a4e18fd2bc7d065191b0d241a131c28.svg",
|
|
121
121
|
"main.7ea79dc8.css.map": "/.well-known/service/static/static/css/main.7ea79dc8.css.map",
|
|
122
|
-
"main.
|
|
122
|
+
"main.09227d84.js.map": "/.well-known/service/static/static/js/main.09227d84.js.map",
|
|
123
123
|
"9314.f0add972.chunk.js.map": "/.well-known/service/static/static/js/9314.f0add972.chunk.js.map",
|
|
124
124
|
"6218.4f3036a7.chunk.js.map": "/.well-known/service/static/static/js/6218.4f3036a7.chunk.js.map",
|
|
125
|
-
"4076.
|
|
125
|
+
"4076.8055ce74.chunk.js.map": "/.well-known/service/static/static/js/4076.8055ce74.chunk.js.map",
|
|
126
126
|
"6658.98f9956d.chunk.js.map": "/.well-known/service/static/static/js/6658.98f9956d.chunk.js.map",
|
|
127
127
|
"3025.7c99c058.chunk.js.map": "/.well-known/service/static/static/js/3025.7c99c058.chunk.js.map",
|
|
128
128
|
"7858.52930f63.chunk.js.map": "/.well-known/service/static/static/js/7858.52930f63.chunk.js.map",
|
|
129
129
|
"4587.9a042d46.chunk.js.map": "/.well-known/service/static/static/js/4587.9a042d46.chunk.js.map",
|
|
130
130
|
"779.73350f02.chunk.js.map": "/.well-known/service/static/static/js/779.73350f02.chunk.js.map",
|
|
131
|
-
"8622.
|
|
131
|
+
"8622.6aa0a4d4.chunk.js.map": "/.well-known/service/static/static/js/8622.6aa0a4d4.chunk.js.map",
|
|
132
132
|
"1148.5ccba08e.chunk.js.map": "/.well-known/service/static/static/js/1148.5ccba08e.chunk.js.map",
|
|
133
|
-
"8944.
|
|
134
|
-
"5468.
|
|
133
|
+
"8944.5b8c231c.chunk.js.map": "/.well-known/service/static/static/js/8944.5b8c231c.chunk.js.map",
|
|
134
|
+
"5468.21a861b9.chunk.js.map": "/.well-known/service/static/static/js/5468.21a861b9.chunk.js.map",
|
|
135
135
|
"9982.4f1ebb7f.chunk.js.map": "/.well-known/service/static/static/js/9982.4f1ebb7f.chunk.js.map",
|
|
136
136
|
"1359.add26d23.chunk.js.map": "/.well-known/service/static/static/js/1359.add26d23.chunk.js.map",
|
|
137
137
|
"6637.b2e35031.chunk.js.map": "/.well-known/service/static/static/js/6637.b2e35031.chunk.js.map",
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
"4882.0435e418.chunk.js.map": "/.well-known/service/static/static/js/4882.0435e418.chunk.js.map",
|
|
140
140
|
"5434.523d071d.chunk.js.map": "/.well-known/service/static/static/js/5434.523d071d.chunk.js.map",
|
|
141
141
|
"5547.e016de4c.chunk.css.map": "/.well-known/service/static/static/css/5547.e016de4c.chunk.css.map",
|
|
142
|
-
"5547.
|
|
142
|
+
"5547.42b98889.chunk.js.map": "/.well-known/service/static/static/js/5547.42b98889.chunk.js.map",
|
|
143
143
|
"3033.9fe46d7f.chunk.js.map": "/.well-known/service/static/static/js/3033.9fe46d7f.chunk.js.map",
|
|
144
144
|
"3842.e1bb702b.chunk.js.map": "/.well-known/service/static/static/js/3842.e1bb702b.chunk.js.map",
|
|
145
145
|
"3131.99541aca.chunk.js.map": "/.well-known/service/static/static/js/3131.99541aca.chunk.js.map",
|
|
@@ -161,7 +161,7 @@
|
|
|
161
161
|
"3076.28658ffc.chunk.js.map": "/.well-known/service/static/static/js/3076.28658ffc.chunk.js.map",
|
|
162
162
|
"5569.e4bfe697.chunk.js.map": "/.well-known/service/static/static/js/5569.e4bfe697.chunk.js.map",
|
|
163
163
|
"2801.33d2f238.chunk.js.map": "/.well-known/service/static/static/js/2801.33d2f238.chunk.js.map",
|
|
164
|
-
"4461.
|
|
164
|
+
"4461.f9a883d3.chunk.js.map": "/.well-known/service/static/static/js/4461.f9a883d3.chunk.js.map",
|
|
165
165
|
"5509.a196d497.chunk.js.map": "/.well-known/service/static/static/js/5509.a196d497.chunk.js.map",
|
|
166
166
|
"5683.051a03c1.chunk.js.map": "/.well-known/service/static/static/js/5683.051a03c1.chunk.js.map",
|
|
167
167
|
"7006.bb90b167.chunk.js.map": "/.well-known/service/static/static/js/7006.bb90b167.chunk.js.map",
|
|
@@ -210,12 +210,12 @@
|
|
|
210
210
|
"9107.7f32925d.chunk.js.map": "/.well-known/service/static/static/js/9107.7f32925d.chunk.js.map",
|
|
211
211
|
"3154.e954fcda.chunk.css.map": "/.well-known/service/static/static/css/3154.e954fcda.chunk.css.map",
|
|
212
212
|
"8016.3ef64a2c.chunk.js.map": "/.well-known/service/static/static/js/8016.3ef64a2c.chunk.js.map",
|
|
213
|
-
"8181.
|
|
213
|
+
"8181.bc510ea3.chunk.js.map": "/.well-known/service/static/static/js/8181.bc510ea3.chunk.js.map",
|
|
214
214
|
"9657.b03b88e5.chunk.js.map": "/.well-known/service/static/static/js/9657.b03b88e5.chunk.js.map",
|
|
215
215
|
"468.bbc69bbf.chunk.js.map": "/.well-known/service/static/static/js/468.bbc69bbf.chunk.js.map"
|
|
216
216
|
},
|
|
217
217
|
"entrypoints": [
|
|
218
218
|
"static/css/main.7ea79dc8.css",
|
|
219
|
-
"static/js/main.
|
|
219
|
+
"static/js/main.09227d84.js"
|
|
220
220
|
]
|
|
221
221
|
}
|
package/build/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico?imageFilter=resize&w=32"/><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><link rel="manifest" href="/.well-known/service/manifest.json"/><script src="/.well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.well-known/service/static/static/js/main.
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico?imageFilter=resize&w=32"/><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><link rel="manifest" href="/.well-known/service/manifest.json"/><script src="/.well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.well-known/service/static/static/js/main.09227d84.js"></script><link href="/.well-known/service/static/static/css/main.7ea79dc8.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|