@heybox/hb-sdk-protocol 0.8.0-alpha → 0.8.0-alpha.12
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/README.md +3 -6
- package/dist/index.cjs.js +512 -37
- package/dist/index.esm.js +482 -38
- package/package.json +4 -1
- package/src/bridge.ts +21 -3
- package/src/capabilities.ts +294 -28
- package/src/constants.ts +1 -0
- package/src/guards.ts +161 -7
- package/src/index.ts +1 -0
- package/src/payloads.ts +174 -1
- package/src/permission-catalog.ts +168 -0
- package/src/permissions.ts +28 -10
- package/types/bridge.d.ts +19 -3
- package/types/capabilities.d.ts +291 -30
- package/types/constants.d.ts +1 -0
- package/types/guards.d.ts +11 -0
- package/types/index.d.ts +1 -0
- package/types/payloads.d.ts +144 -1
- package/types/permission-catalog.d.ts +108 -0
- package/types/permissions.d.ts +4 -3
package/dist/index.cjs.js
CHANGED
|
@@ -12,6 +12,22 @@ const VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD = 'viewport.setNavigationBarStyle
|
|
|
12
12
|
const STORAGE_GET_STORAGE_METHOD = 'storage.getStorage';
|
|
13
13
|
const STORAGE_SET_STORAGE_METHOD = 'storage.setStorage';
|
|
14
14
|
const NETWORK_REQUEST_METHOD = 'network.request';
|
|
15
|
+
const NETWORK_DOWNLOAD_METHOD = 'network.download';
|
|
16
|
+
const FILES_PICK_FILES_METHOD = 'files.pickFiles';
|
|
17
|
+
const FILES_PICK_DIRECTORY_METHOD = 'files.pickDirectory';
|
|
18
|
+
const FILES_SAVE_FILE_METHOD = 'files.saveFile';
|
|
19
|
+
const FILE_CREATE_METHOD = 'file.create';
|
|
20
|
+
const FILE_REMOVE_METHOD = 'file.remove';
|
|
21
|
+
const FILE_EXISTS_METHOD = 'file.exists';
|
|
22
|
+
const FILE_READ_TEXT_METHOD = 'file.readText';
|
|
23
|
+
const FILE_WRITE_TEXT_METHOD = 'file.writeText';
|
|
24
|
+
const FILE_READ_BYTES_METHOD = 'file.readBytes';
|
|
25
|
+
const FILE_WRITE_BYTES_METHOD = 'file.writeBytes';
|
|
26
|
+
const FILE_STAT_METHOD = 'file.stat';
|
|
27
|
+
const DIRECTORY_CREATE_METHOD = 'directory.create';
|
|
28
|
+
const DIRECTORY_REMOVE_METHOD = 'directory.remove';
|
|
29
|
+
const DIRECTORY_EXISTS_METHOD = 'directory.exists';
|
|
30
|
+
const DIRECTORY_LIST_METHOD = 'directory.list';
|
|
15
31
|
const UI_SHOW_TOAST_METHOD = 'ui.showToast';
|
|
16
32
|
const UI_SHOW_LOADING_METHOD = 'ui.showLoading';
|
|
17
33
|
const UI_HIDE_LOADING_METHOD = 'ui.hideLoading';
|
|
@@ -26,95 +42,249 @@ const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCu
|
|
|
26
42
|
const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
|
|
27
43
|
const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
|
|
28
44
|
const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
|
|
29
|
-
{
|
|
30
|
-
|
|
45
|
+
{
|
|
46
|
+
method: AUTH_LOGIN_METHOD,
|
|
47
|
+
module: 'auth',
|
|
48
|
+
capability: AUTH_LOGIN_METHOD,
|
|
49
|
+
requirement: { kind: 'all', permissions: ['userInfo'] },
|
|
50
|
+
risk: 'medium',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
method: USER_GET_INFO_METHOD,
|
|
54
|
+
module: 'user',
|
|
55
|
+
capability: USER_GET_INFO_METHOD,
|
|
56
|
+
requirement: { kind: 'all', permissions: ['userInfo'] },
|
|
57
|
+
risk: 'medium',
|
|
58
|
+
},
|
|
31
59
|
{
|
|
32
60
|
method: USER_REVOKE_AUTHORIZATION_METHOD,
|
|
33
61
|
module: 'user',
|
|
34
62
|
capability: USER_REVOKE_AUTHORIZATION_METHOD,
|
|
35
|
-
|
|
63
|
+
requirement: { kind: 'none' },
|
|
36
64
|
risk: 'high',
|
|
37
65
|
},
|
|
38
66
|
{
|
|
39
67
|
method: USER_GET_STEAM_GAME_LIST_METHOD,
|
|
40
68
|
module: 'user',
|
|
41
69
|
capability: USER_GET_STEAM_GAME_LIST_METHOD,
|
|
42
|
-
|
|
70
|
+
requirement: { kind: 'all', permissions: ['steamLibrary'] },
|
|
43
71
|
risk: 'high',
|
|
44
72
|
},
|
|
45
|
-
{
|
|
46
|
-
|
|
47
|
-
|
|
73
|
+
{
|
|
74
|
+
method: SHARE_COPY_LINK_METHOD,
|
|
75
|
+
module: 'share',
|
|
76
|
+
capability: SHARE_COPY_LINK_METHOD,
|
|
77
|
+
requirement: { kind: 'all', permissions: ['share'] },
|
|
78
|
+
risk: 'medium',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
method: SHARE_SHOW_SHARE_MENU_METHOD,
|
|
82
|
+
module: 'share',
|
|
83
|
+
capability: SHARE_SHOW_SHARE_MENU_METHOD,
|
|
84
|
+
requirement: { kind: 'all', permissions: ['share'] },
|
|
85
|
+
risk: 'low',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
method: SHARE_SCREENSHOT_METHOD,
|
|
89
|
+
module: 'share',
|
|
90
|
+
capability: SHARE_SCREENSHOT_METHOD,
|
|
91
|
+
requirement: { kind: 'all', permissions: ['share'] },
|
|
92
|
+
risk: 'medium',
|
|
93
|
+
},
|
|
48
94
|
{
|
|
49
95
|
method: VIEWPORT_GET_WINDOW_INFO_METHOD,
|
|
50
96
|
module: 'viewport',
|
|
51
97
|
capability: VIEWPORT_GET_WINDOW_INFO_METHOD,
|
|
52
|
-
|
|
98
|
+
requirement: { kind: 'none' },
|
|
53
99
|
risk: 'low',
|
|
54
100
|
},
|
|
55
101
|
{
|
|
56
102
|
method: VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD,
|
|
57
103
|
module: 'viewport',
|
|
58
104
|
capability: VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD,
|
|
59
|
-
|
|
105
|
+
requirement: { kind: 'none' },
|
|
60
106
|
risk: 'low',
|
|
61
107
|
},
|
|
62
|
-
{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
108
|
+
{
|
|
109
|
+
method: STORAGE_GET_STORAGE_METHOD,
|
|
110
|
+
module: 'storage',
|
|
111
|
+
capability: STORAGE_GET_STORAGE_METHOD,
|
|
112
|
+
requirement: { kind: 'all', permissions: ['storage'] },
|
|
113
|
+
risk: 'low',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
method: STORAGE_SET_STORAGE_METHOD,
|
|
117
|
+
module: 'storage',
|
|
118
|
+
capability: STORAGE_SET_STORAGE_METHOD,
|
|
119
|
+
requirement: { kind: 'all', permissions: ['storage'] },
|
|
120
|
+
risk: 'medium',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
method: NETWORK_REQUEST_METHOD,
|
|
124
|
+
module: 'network',
|
|
125
|
+
capability: NETWORK_REQUEST_METHOD,
|
|
126
|
+
requirement: { kind: 'all', permissions: ['network'] },
|
|
127
|
+
risk: 'high',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
method: NETWORK_DOWNLOAD_METHOD,
|
|
131
|
+
module: 'network',
|
|
132
|
+
capability: NETWORK_DOWNLOAD_METHOD,
|
|
133
|
+
requirement: { kind: 'all', permissions: ['network', 'filesystem'] },
|
|
134
|
+
risk: 'high',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
method: FILES_PICK_FILES_METHOD,
|
|
138
|
+
module: 'files',
|
|
139
|
+
capability: FILES_PICK_FILES_METHOD,
|
|
140
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
141
|
+
risk: 'high',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
method: FILES_PICK_DIRECTORY_METHOD,
|
|
145
|
+
module: 'files',
|
|
146
|
+
capability: FILES_PICK_DIRECTORY_METHOD,
|
|
147
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
148
|
+
risk: 'high',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
method: FILES_SAVE_FILE_METHOD,
|
|
152
|
+
module: 'files',
|
|
153
|
+
capability: FILES_SAVE_FILE_METHOD,
|
|
154
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
155
|
+
risk: 'high',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
method: FILE_CREATE_METHOD,
|
|
159
|
+
module: 'file',
|
|
160
|
+
capability: FILE_CREATE_METHOD,
|
|
161
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
162
|
+
risk: 'high',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
method: FILE_REMOVE_METHOD,
|
|
166
|
+
module: 'file',
|
|
167
|
+
capability: FILE_REMOVE_METHOD,
|
|
168
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
169
|
+
risk: 'high',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
method: FILE_EXISTS_METHOD,
|
|
173
|
+
module: 'file',
|
|
174
|
+
capability: FILE_EXISTS_METHOD,
|
|
175
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
176
|
+
risk: 'high',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
method: FILE_READ_TEXT_METHOD,
|
|
180
|
+
module: 'file',
|
|
181
|
+
capability: FILE_READ_TEXT_METHOD,
|
|
182
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
183
|
+
risk: 'high',
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
method: FILE_WRITE_TEXT_METHOD,
|
|
187
|
+
module: 'file',
|
|
188
|
+
capability: FILE_WRITE_TEXT_METHOD,
|
|
189
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
190
|
+
risk: 'high',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
method: FILE_READ_BYTES_METHOD,
|
|
194
|
+
module: 'file',
|
|
195
|
+
capability: FILE_READ_BYTES_METHOD,
|
|
196
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
197
|
+
risk: 'high',
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
method: FILE_WRITE_BYTES_METHOD,
|
|
201
|
+
module: 'file',
|
|
202
|
+
capability: FILE_WRITE_BYTES_METHOD,
|
|
203
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
204
|
+
risk: 'high',
|
|
205
|
+
},
|
|
206
|
+
{ method: FILE_STAT_METHOD, module: 'file', capability: FILE_STAT_METHOD, requirement: { kind: 'all', permissions: ['filesystem'] }, risk: 'high' },
|
|
207
|
+
{
|
|
208
|
+
method: DIRECTORY_CREATE_METHOD,
|
|
209
|
+
module: 'directory',
|
|
210
|
+
capability: DIRECTORY_CREATE_METHOD,
|
|
211
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
212
|
+
risk: 'high',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
method: DIRECTORY_REMOVE_METHOD,
|
|
216
|
+
module: 'directory',
|
|
217
|
+
capability: DIRECTORY_REMOVE_METHOD,
|
|
218
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
219
|
+
risk: 'high',
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
method: DIRECTORY_EXISTS_METHOD,
|
|
223
|
+
module: 'directory',
|
|
224
|
+
capability: DIRECTORY_EXISTS_METHOD,
|
|
225
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
226
|
+
risk: 'high',
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
method: DIRECTORY_LIST_METHOD,
|
|
230
|
+
module: 'directory',
|
|
231
|
+
capability: DIRECTORY_LIST_METHOD,
|
|
232
|
+
requirement: { kind: 'all', permissions: ['filesystem'] },
|
|
233
|
+
risk: 'high',
|
|
234
|
+
},
|
|
235
|
+
{ method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, requirement: { kind: 'none' }, risk: 'low' },
|
|
236
|
+
{ method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, requirement: { kind: 'none' }, risk: 'low' },
|
|
237
|
+
{ method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, requirement: { kind: 'none' }, risk: 'low' },
|
|
238
|
+
{ method: DEVICE_VIBRATE_METHOD, module: 'device', capability: DEVICE_VIBRATE_METHOD, requirement: { kind: 'none' }, risk: 'low' },
|
|
69
239
|
{
|
|
70
240
|
method: DEVICE_SET_CLIPBOARD_METHOD,
|
|
71
241
|
module: 'device',
|
|
72
242
|
capability: DEVICE_SET_CLIPBOARD_METHOD,
|
|
73
|
-
|
|
243
|
+
requirement: { kind: 'all', permissions: ['clipboard'] },
|
|
74
244
|
risk: 'medium',
|
|
75
245
|
},
|
|
76
|
-
{ method: NAVIGATION_CLOSE_METHOD, module: 'navigation', capability: NAVIGATION_CLOSE_METHOD,
|
|
77
|
-
{ method: NAVIGATION_RELOAD_METHOD, module: 'navigation', capability: NAVIGATION_RELOAD_METHOD,
|
|
246
|
+
{ method: NAVIGATION_CLOSE_METHOD, module: 'navigation', capability: NAVIGATION_CLOSE_METHOD, requirement: { kind: 'none' }, risk: 'medium' },
|
|
247
|
+
{ method: NAVIGATION_RELOAD_METHOD, module: 'navigation', capability: NAVIGATION_RELOAD_METHOD, requirement: { kind: 'none' }, risk: 'medium' },
|
|
78
248
|
{
|
|
79
249
|
method: NAVIGATION_OPEN_APP_PAGE_METHOD,
|
|
80
250
|
module: 'navigation',
|
|
81
251
|
capability: NAVIGATION_OPEN_APP_PAGE_METHOD,
|
|
82
|
-
|
|
252
|
+
requirement: { kind: 'none' },
|
|
83
253
|
risk: 'medium',
|
|
84
254
|
},
|
|
85
255
|
{
|
|
86
256
|
method: CLOUD_LEADERBOARD_SUBMIT_METHOD,
|
|
87
257
|
module: 'cloud',
|
|
88
258
|
capability: CLOUD_LEADERBOARD_SUBMIT_METHOD,
|
|
89
|
-
|
|
259
|
+
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
90
260
|
risk: 'medium',
|
|
91
261
|
},
|
|
92
262
|
{
|
|
93
263
|
method: CLOUD_LEADERBOARD_GET_LIST_METHOD,
|
|
94
264
|
module: 'cloud',
|
|
95
265
|
capability: CLOUD_LEADERBOARD_GET_LIST_METHOD,
|
|
96
|
-
|
|
266
|
+
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
97
267
|
risk: 'low',
|
|
98
268
|
},
|
|
99
269
|
{
|
|
100
270
|
method: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
|
|
101
271
|
module: 'cloud',
|
|
102
272
|
capability: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
|
|
103
|
-
|
|
273
|
+
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
104
274
|
risk: 'medium',
|
|
105
275
|
},
|
|
106
276
|
{
|
|
107
277
|
method: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
|
|
108
278
|
module: 'cloud',
|
|
109
279
|
capability: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
|
|
110
|
-
|
|
280
|
+
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
111
281
|
risk: 'medium',
|
|
112
282
|
},
|
|
113
283
|
{
|
|
114
284
|
method: CLOUD_LEADERBOARD_GET_INFO_METHOD,
|
|
115
285
|
module: 'cloud',
|
|
116
286
|
capability: CLOUD_LEADERBOARD_GET_INFO_METHOD,
|
|
117
|
-
|
|
287
|
+
requirement: { kind: 'all', permissions: ['leaderboard'] },
|
|
118
288
|
risk: 'low',
|
|
119
289
|
},
|
|
120
290
|
];
|
|
@@ -126,21 +296,279 @@ const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
|
|
|
126
296
|
const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
|
|
127
297
|
const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
|
|
128
298
|
const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
|
|
299
|
+
const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
|
|
129
300
|
|
|
130
301
|
function isMiniProgramBridgeMessage(value) {
|
|
131
|
-
if (!value
|
|
302
|
+
if (!isRecord$1(value))
|
|
132
303
|
return false;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
304
|
+
if (value.namespace !== MINI_PROGRAM_MESSAGE_NAMESPACE || (value.version !== 1 && value.version !== 2) || !isNonEmptyString(value.nonce)) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
if (value.type === 'handshake') {
|
|
308
|
+
return isNonEmptyString(value.id) && value.method === SDK_HANDSHAKE_METHOD && value.error === undefined && isSDKHandshakePayload(value.payload);
|
|
309
|
+
}
|
|
310
|
+
if (value.type === 'request') {
|
|
311
|
+
return isNonEmptyString(value.id) && isNonEmptyString(value.method) && value.error === undefined;
|
|
312
|
+
}
|
|
313
|
+
if (value.type === 'response') {
|
|
314
|
+
return (isNonEmptyString(value.id) &&
|
|
315
|
+
(value.method === undefined || isNonEmptyString(value.method)) &&
|
|
316
|
+
(value.error === undefined || isBridgeError(value.error)));
|
|
317
|
+
}
|
|
318
|
+
if (value.type === 'event') {
|
|
319
|
+
if (!isNonEmptyString(value.method) || value.error !== undefined)
|
|
320
|
+
return false;
|
|
321
|
+
if (value.method === MINI_PROGRAM_OPERATION_PROGRESS_METHOD) {
|
|
322
|
+
return value.version === 2 && isNonEmptyString(value.id) && isMiniProgramDownloadProgressPayload(value.payload);
|
|
323
|
+
}
|
|
324
|
+
return value.id === undefined || isNonEmptyString(value.id);
|
|
325
|
+
}
|
|
326
|
+
if (value.type === 'cancel') {
|
|
327
|
+
return (value.version === 2 && isNonEmptyString(value.id) && value.method === undefined && value.payload === undefined && value.error === undefined);
|
|
328
|
+
}
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
function isMiniProgramRelativePath(value) {
|
|
332
|
+
if (typeof value !== 'string' || !value || value.startsWith('/') || value.endsWith('/')) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
if (/[\\\u0000-\u001f\u007f]/.test(value))
|
|
336
|
+
return false;
|
|
337
|
+
return value.split('/').every((segment) => Boolean(segment) && segment !== '.' && segment !== '..');
|
|
338
|
+
}
|
|
339
|
+
function isMiniProgramPathRootRef(value) {
|
|
340
|
+
if (!isRecord$1(value))
|
|
341
|
+
return false;
|
|
342
|
+
if (value.kind === 'sandbox')
|
|
343
|
+
return hasOnlyKeys(value, ['kind']);
|
|
344
|
+
return value.kind === 'directory' && isNonEmptyString(value.handleId) && hasOnlyKeys(value, ['kind', 'handleId']);
|
|
345
|
+
}
|
|
346
|
+
function isMiniProgramFileRef(value) {
|
|
347
|
+
if (!isRecord$1(value) || value.kind !== 'file')
|
|
348
|
+
return false;
|
|
349
|
+
if (isNonEmptyString(value.handleId)) {
|
|
350
|
+
return hasOnlyKeys(value, ['kind', 'handleId']);
|
|
351
|
+
}
|
|
352
|
+
return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
|
|
353
|
+
}
|
|
354
|
+
function isMiniProgramDirectoryRef(value) {
|
|
355
|
+
if (!isRecord$1(value) || value.kind !== 'directory')
|
|
356
|
+
return false;
|
|
357
|
+
if (isNonEmptyString(value.handleId)) {
|
|
358
|
+
return hasOnlyKeys(value, ['kind', 'handleId']);
|
|
359
|
+
}
|
|
360
|
+
return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
|
|
361
|
+
}
|
|
362
|
+
function isMiniProgramFileDescriptor(value) {
|
|
363
|
+
return (isRecord$1(value) &&
|
|
364
|
+
value.kind === 'file' &&
|
|
365
|
+
isNonEmptyString(value.name) &&
|
|
366
|
+
isFileMode(value.mode) &&
|
|
367
|
+
isMiniProgramFileRef(value.ref) &&
|
|
368
|
+
hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
|
|
369
|
+
}
|
|
370
|
+
function isMiniProgramDirectoryDescriptor(value) {
|
|
371
|
+
return (isRecord$1(value) &&
|
|
372
|
+
value.kind === 'directory' &&
|
|
373
|
+
isNonEmptyString(value.name) &&
|
|
374
|
+
isFileMode(value.mode) &&
|
|
375
|
+
isMiniProgramDirectoryRef(value.ref) &&
|
|
376
|
+
hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
|
|
377
|
+
}
|
|
378
|
+
function isMiniProgramFileSystemEntityDescriptor(value) {
|
|
379
|
+
return isMiniProgramFileDescriptor(value) || isMiniProgramDirectoryDescriptor(value);
|
|
380
|
+
}
|
|
381
|
+
function isMiniProgramByteArray(value) {
|
|
382
|
+
return value instanceof Uint8Array && value.buffer instanceof ArrayBuffer;
|
|
383
|
+
}
|
|
384
|
+
function isMiniProgramFileStat(value) {
|
|
385
|
+
return (isRecord$1(value) &&
|
|
386
|
+
value.kind === 'file' &&
|
|
387
|
+
isNonNegativeSafeInteger(value.size) &&
|
|
388
|
+
(value.modifiedAt === undefined || isNonNegativeFiniteNumber(value.modifiedAt)) &&
|
|
389
|
+
(value.createdAt === undefined || isNonNegativeFiniteNumber(value.createdAt)) &&
|
|
390
|
+
hasOnlyKeys(value, ['kind', 'size', 'modifiedAt', 'createdAt']));
|
|
391
|
+
}
|
|
392
|
+
function isMiniProgramDownloadProgressPayload(value) {
|
|
393
|
+
if (!isRecord$1(value) ||
|
|
394
|
+
!isNonNegativeSafeInteger(value.loaded) ||
|
|
395
|
+
typeof value.lengthComputable !== 'boolean' ||
|
|
396
|
+
!hasOnlyKeys(value, ['loaded', 'total', 'lengthComputable'])) {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
if (!value.lengthComputable)
|
|
400
|
+
return value.total === undefined;
|
|
401
|
+
return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
|
|
402
|
+
}
|
|
403
|
+
function isSDKHandshakePayload(value) {
|
|
404
|
+
return isRecord$1(value) && isNonEmptyString(value.href) && typeof value.userAgent === 'string' && isNonEmptyString(value.sdkVersion);
|
|
405
|
+
}
|
|
406
|
+
function isBridgeError(value) {
|
|
407
|
+
return isRecord$1(value) && isNonEmptyString(value.code) && typeof value.message === 'string';
|
|
408
|
+
}
|
|
409
|
+
function isFileMode(value) {
|
|
410
|
+
return value === 'read' || value === 'readwrite';
|
|
411
|
+
}
|
|
412
|
+
function isNonNegativeSafeInteger(value) {
|
|
413
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
|
|
414
|
+
}
|
|
415
|
+
function isNonNegativeFiniteNumber(value) {
|
|
416
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0;
|
|
417
|
+
}
|
|
418
|
+
function isNonEmptyString(value) {
|
|
419
|
+
return typeof value === 'string' && value.length > 0;
|
|
420
|
+
}
|
|
421
|
+
function hasOnlyKeys(value, allowedKeys) {
|
|
422
|
+
const allowed = new Set(allowedKeys);
|
|
423
|
+
return Object.keys(value).every((key) => allowed.has(key));
|
|
424
|
+
}
|
|
425
|
+
function isRecord$1(value) {
|
|
426
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
138
427
|
}
|
|
139
428
|
|
|
140
429
|
/** 当前用户信息与登录能力支持的完整 scope 目录。 */
|
|
141
430
|
const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'];
|
|
142
431
|
|
|
143
|
-
const
|
|
432
|
+
const MINI_PROGRAM_PERMISSION_KEYS = [
|
|
433
|
+
'userInfo',
|
|
434
|
+
'steamLibrary',
|
|
435
|
+
'share',
|
|
436
|
+
'storage',
|
|
437
|
+
'filesystem',
|
|
438
|
+
'clipboard',
|
|
439
|
+
'leaderboard',
|
|
440
|
+
'network',
|
|
441
|
+
];
|
|
442
|
+
const MINI_PROGRAM_PERMISSION_CATALOG = [
|
|
443
|
+
{
|
|
444
|
+
key: 'userInfo',
|
|
445
|
+
name: '用户信息',
|
|
446
|
+
description: '登录小程序并读取当前用户的授权信息。',
|
|
447
|
+
access: 'declaration',
|
|
448
|
+
risk: 'medium',
|
|
449
|
+
config: {},
|
|
450
|
+
methods: ['auth.login', 'user.getInfo'],
|
|
451
|
+
conditions: ['继续执行黑盒登录、用户授权和可信手势规则。'],
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
key: 'steamLibrary',
|
|
455
|
+
name: 'Steam 游戏库',
|
|
456
|
+
description: '读取当前用户授权的 Steam 游戏库。',
|
|
457
|
+
access: 'declaration',
|
|
458
|
+
risk: 'high',
|
|
459
|
+
config: {},
|
|
460
|
+
methods: ['user.getSteamGameList'],
|
|
461
|
+
conditions: ['继续执行账号绑定和数据可用性规则。'],
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
key: 'share',
|
|
465
|
+
name: '分享',
|
|
466
|
+
description: '使用小程序分享、分享菜单和截图能力。',
|
|
467
|
+
access: 'declaration',
|
|
468
|
+
risk: 'medium',
|
|
469
|
+
config: {},
|
|
470
|
+
methods: ['share.copyLink', 'share.showShareMenu', 'share.screenshot'],
|
|
471
|
+
conditions: ['继续执行分享参数校验和 Host 支持检查。'],
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
key: 'storage',
|
|
475
|
+
name: '键值存储',
|
|
476
|
+
description: '读写按小程序隔离的简单键值数据。',
|
|
477
|
+
access: 'declaration',
|
|
478
|
+
risk: 'medium',
|
|
479
|
+
config: {},
|
|
480
|
+
methods: ['storage.getStorage', 'storage.setStorage'],
|
|
481
|
+
conditions: ['仅用于简单键值存储,不包含文件系统。'],
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
key: 'filesystem',
|
|
485
|
+
name: '文件系统',
|
|
486
|
+
description: '访问小程序沙盒文件和用户选择的外部文件。',
|
|
487
|
+
access: 'declaration',
|
|
488
|
+
risk: 'high',
|
|
489
|
+
config: {},
|
|
490
|
+
methods: [
|
|
491
|
+
'network.download',
|
|
492
|
+
'files.pickFiles',
|
|
493
|
+
'files.pickDirectory',
|
|
494
|
+
'files.saveFile',
|
|
495
|
+
'file.create',
|
|
496
|
+
'file.remove',
|
|
497
|
+
'file.exists',
|
|
498
|
+
'file.readText',
|
|
499
|
+
'file.writeText',
|
|
500
|
+
'file.readBytes',
|
|
501
|
+
'file.writeBytes',
|
|
502
|
+
'file.stat',
|
|
503
|
+
'directory.create',
|
|
504
|
+
'directory.remove',
|
|
505
|
+
'directory.exists',
|
|
506
|
+
'directory.list',
|
|
507
|
+
],
|
|
508
|
+
conditions: ['外部文件继续要求有效的用户选择、会话句柄和匹配的读写模式。'],
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
key: 'clipboard',
|
|
512
|
+
name: '剪贴板',
|
|
513
|
+
description: '向系统剪贴板写入文本。',
|
|
514
|
+
access: 'declaration',
|
|
515
|
+
risk: 'medium',
|
|
516
|
+
config: {},
|
|
517
|
+
methods: ['device.setClipboard'],
|
|
518
|
+
conditions: ['继续执行文本长度和 Host 支持限制。'],
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
key: 'leaderboard',
|
|
522
|
+
name: '排行榜',
|
|
523
|
+
description: '读写小程序云排行榜。',
|
|
524
|
+
access: 'declaration',
|
|
525
|
+
risk: 'medium',
|
|
526
|
+
config: {},
|
|
527
|
+
methods: [
|
|
528
|
+
'cloud.leaderboard.submit',
|
|
529
|
+
'cloud.leaderboard.getList',
|
|
530
|
+
'cloud.leaderboard.getCurrentUserEntry',
|
|
531
|
+
'cloud.leaderboard.deleteCurrentUserEntry',
|
|
532
|
+
'cloud.leaderboard.getInfo',
|
|
533
|
+
],
|
|
534
|
+
conditions: ['排行榜必须已创建,用户和资源规则保持不变。'],
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
key: 'network',
|
|
538
|
+
name: '网络',
|
|
539
|
+
description: '通过 network 模块请求或下载外部资源。',
|
|
540
|
+
access: 'platform-approval',
|
|
541
|
+
risk: 'high',
|
|
542
|
+
config: {
|
|
543
|
+
useOfficialDomain: {
|
|
544
|
+
type: 'boolean',
|
|
545
|
+
required: false,
|
|
546
|
+
default: false,
|
|
547
|
+
description: '是否申请访问小黑盒官方域名。',
|
|
548
|
+
},
|
|
549
|
+
},
|
|
550
|
+
methods: ['network.request', 'network.download'],
|
|
551
|
+
conditions: ['声明后仍需平台批准,并继续执行网络安全策略。'],
|
|
552
|
+
},
|
|
553
|
+
];
|
|
554
|
+
const MINI_PROGRAM_NO_DECLARATION_METHODS = [
|
|
555
|
+
'user.revokeAuthorization',
|
|
556
|
+
'ui.showToast',
|
|
557
|
+
'ui.showLoading',
|
|
558
|
+
'ui.hideLoading',
|
|
559
|
+
'viewport.getWindowInfo',
|
|
560
|
+
'viewport.setNavigationBarStyle',
|
|
561
|
+
'device.vibrate',
|
|
562
|
+
'navigation.close',
|
|
563
|
+
'navigation.reload',
|
|
564
|
+
'navigation.openAppPage',
|
|
565
|
+
];
|
|
566
|
+
const PERMISSION_KEY_SET = new Set(MINI_PROGRAM_PERMISSION_KEYS);
|
|
567
|
+
function isMiniProgramPermissionKey(key) {
|
|
568
|
+
return PERMISSION_KEY_SET.has(key);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(MINI_PROGRAM_PERMISSION_KEYS);
|
|
144
572
|
function isManagedMiniProgramRuntimePermissionKey(key) {
|
|
145
573
|
return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
|
|
146
574
|
}
|
|
@@ -157,20 +585,36 @@ function parseMiniProgramRuntimePermissions(snapshot) {
|
|
|
157
585
|
if (!isRecord(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
|
|
158
586
|
return { valid: false, permissions: {} };
|
|
159
587
|
}
|
|
160
|
-
const
|
|
161
|
-
|
|
588
|
+
const inputKey = rawEntry.key.trim();
|
|
589
|
+
const key = inputKey === 'network.request' ? 'network' : inputKey;
|
|
590
|
+
if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled')) {
|
|
162
591
|
return { valid: false, permissions: {} };
|
|
163
592
|
}
|
|
164
593
|
seenKeys.add(key);
|
|
165
|
-
if (!isManagedMiniProgramRuntimePermissionKey(key))
|
|
594
|
+
if (!isManagedMiniProgramRuntimePermissionKey(key)) {
|
|
595
|
+
if (!isRecord(rawEntry.config))
|
|
596
|
+
return { valid: false, permissions: {} };
|
|
597
|
+
continue;
|
|
598
|
+
}
|
|
599
|
+
if (key === 'network') {
|
|
600
|
+
const config = rawEntry.config;
|
|
601
|
+
if (!isRecord(config) || typeof config.useOfficialDomain !== 'boolean') {
|
|
602
|
+
return { valid: false, permissions: {} };
|
|
603
|
+
}
|
|
604
|
+
permissions[key] = {
|
|
605
|
+
key,
|
|
606
|
+
status: rawEntry.status,
|
|
607
|
+
config: { useOfficialDomain: config.useOfficialDomain },
|
|
608
|
+
};
|
|
166
609
|
continue;
|
|
167
|
-
|
|
610
|
+
}
|
|
611
|
+
if (rawEntry.config !== null && rawEntry.config !== undefined && (!isRecord(rawEntry.config) || Object.keys(rawEntry.config).length > 0)) {
|
|
168
612
|
return { valid: false, permissions: {} };
|
|
169
613
|
}
|
|
170
614
|
permissions[key] = {
|
|
171
615
|
key,
|
|
172
616
|
status: rawEntry.status,
|
|
173
|
-
config: {
|
|
617
|
+
config: {},
|
|
174
618
|
};
|
|
175
619
|
}
|
|
176
620
|
return { valid: true, permissions };
|
|
@@ -187,13 +631,33 @@ exports.CLOUD_LEADERBOARD_GET_LIST_METHOD = CLOUD_LEADERBOARD_GET_LIST_METHOD;
|
|
|
187
631
|
exports.CLOUD_LEADERBOARD_SUBMIT_METHOD = CLOUD_LEADERBOARD_SUBMIT_METHOD;
|
|
188
632
|
exports.DEVICE_SET_CLIPBOARD_METHOD = DEVICE_SET_CLIPBOARD_METHOD;
|
|
189
633
|
exports.DEVICE_VIBRATE_METHOD = DEVICE_VIBRATE_METHOD;
|
|
634
|
+
exports.DIRECTORY_CREATE_METHOD = DIRECTORY_CREATE_METHOD;
|
|
635
|
+
exports.DIRECTORY_EXISTS_METHOD = DIRECTORY_EXISTS_METHOD;
|
|
636
|
+
exports.DIRECTORY_LIST_METHOD = DIRECTORY_LIST_METHOD;
|
|
637
|
+
exports.DIRECTORY_REMOVE_METHOD = DIRECTORY_REMOVE_METHOD;
|
|
638
|
+
exports.FILES_PICK_DIRECTORY_METHOD = FILES_PICK_DIRECTORY_METHOD;
|
|
639
|
+
exports.FILES_PICK_FILES_METHOD = FILES_PICK_FILES_METHOD;
|
|
640
|
+
exports.FILES_SAVE_FILE_METHOD = FILES_SAVE_FILE_METHOD;
|
|
641
|
+
exports.FILE_CREATE_METHOD = FILE_CREATE_METHOD;
|
|
642
|
+
exports.FILE_EXISTS_METHOD = FILE_EXISTS_METHOD;
|
|
643
|
+
exports.FILE_READ_BYTES_METHOD = FILE_READ_BYTES_METHOD;
|
|
644
|
+
exports.FILE_READ_TEXT_METHOD = FILE_READ_TEXT_METHOD;
|
|
645
|
+
exports.FILE_REMOVE_METHOD = FILE_REMOVE_METHOD;
|
|
646
|
+
exports.FILE_STAT_METHOD = FILE_STAT_METHOD;
|
|
647
|
+
exports.FILE_WRITE_BYTES_METHOD = FILE_WRITE_BYTES_METHOD;
|
|
648
|
+
exports.FILE_WRITE_TEXT_METHOD = FILE_WRITE_TEXT_METHOD;
|
|
190
649
|
exports.MINI_PROGRAM_BRIDGE_NONCE_PARAM = MINI_PROGRAM_BRIDGE_NONCE_PARAM;
|
|
191
650
|
exports.MINI_PROGRAM_MESSAGE_NAMESPACE = MINI_PROGRAM_MESSAGE_NAMESPACE;
|
|
192
651
|
exports.MINI_PROGRAM_MESSAGE_VERSION = MINI_PROGRAM_MESSAGE_VERSION;
|
|
652
|
+
exports.MINI_PROGRAM_NO_DECLARATION_METHODS = MINI_PROGRAM_NO_DECLARATION_METHODS;
|
|
653
|
+
exports.MINI_PROGRAM_OPERATION_PROGRESS_METHOD = MINI_PROGRAM_OPERATION_PROGRESS_METHOD;
|
|
654
|
+
exports.MINI_PROGRAM_PERMISSION_CATALOG = MINI_PROGRAM_PERMISSION_CATALOG;
|
|
655
|
+
exports.MINI_PROGRAM_PERMISSION_KEYS = MINI_PROGRAM_PERMISSION_KEYS;
|
|
193
656
|
exports.MINI_PROGRAM_PROTOCOL_CAPABILITIES = MINI_PROGRAM_PROTOCOL_CAPABILITIES;
|
|
194
657
|
exports.NAVIGATION_CLOSE_METHOD = NAVIGATION_CLOSE_METHOD;
|
|
195
658
|
exports.NAVIGATION_OPEN_APP_PAGE_METHOD = NAVIGATION_OPEN_APP_PAGE_METHOD;
|
|
196
659
|
exports.NAVIGATION_RELOAD_METHOD = NAVIGATION_RELOAD_METHOD;
|
|
660
|
+
exports.NETWORK_DOWNLOAD_METHOD = NETWORK_DOWNLOAD_METHOD;
|
|
197
661
|
exports.NETWORK_REQUEST_METHOD = NETWORK_REQUEST_METHOD;
|
|
198
662
|
exports.RUNTIME_LOCATION_PROBE_METHOD = RUNTIME_LOCATION_PROBE_METHOD;
|
|
199
663
|
exports.SDK_CSP_VIOLATION_METHOD = SDK_CSP_VIOLATION_METHOD;
|
|
@@ -215,4 +679,15 @@ exports.VIEWPORT_GET_WINDOW_INFO_METHOD = VIEWPORT_GET_WINDOW_INFO_METHOD;
|
|
|
215
679
|
exports.VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD = VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD;
|
|
216
680
|
exports.isManagedMiniProgramRuntimePermissionKey = isManagedMiniProgramRuntimePermissionKey;
|
|
217
681
|
exports.isMiniProgramBridgeMessage = isMiniProgramBridgeMessage;
|
|
682
|
+
exports.isMiniProgramByteArray = isMiniProgramByteArray;
|
|
683
|
+
exports.isMiniProgramDirectoryDescriptor = isMiniProgramDirectoryDescriptor;
|
|
684
|
+
exports.isMiniProgramDirectoryRef = isMiniProgramDirectoryRef;
|
|
685
|
+
exports.isMiniProgramDownloadProgressPayload = isMiniProgramDownloadProgressPayload;
|
|
686
|
+
exports.isMiniProgramFileDescriptor = isMiniProgramFileDescriptor;
|
|
687
|
+
exports.isMiniProgramFileRef = isMiniProgramFileRef;
|
|
688
|
+
exports.isMiniProgramFileStat = isMiniProgramFileStat;
|
|
689
|
+
exports.isMiniProgramFileSystemEntityDescriptor = isMiniProgramFileSystemEntityDescriptor;
|
|
690
|
+
exports.isMiniProgramPathRootRef = isMiniProgramPathRootRef;
|
|
691
|
+
exports.isMiniProgramPermissionKey = isMiniProgramPermissionKey;
|
|
692
|
+
exports.isMiniProgramRelativePath = isMiniProgramRelativePath;
|
|
218
693
|
exports.parseMiniProgramRuntimePermissions = parseMiniProgramRuntimePermissions;
|