@heybox/hb-sdk-protocol 0.7.5-alpha.0 → 0.8.0-alpha.10

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/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
- { method: AUTH_LOGIN_METHOD, module: 'auth', capability: AUTH_LOGIN_METHOD, permission: 'auth.login', risk: 'medium' },
30
- { method: USER_GET_INFO_METHOD, module: 'user', capability: USER_GET_INFO_METHOD, permission: 'user.getInfo', risk: 'medium' },
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
- permission: 'user.revokeAuthorization',
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
- permission: 'user.platformAccount.steam',
70
+ requirement: { kind: 'all', permissions: ['steamLibrary'] },
43
71
  risk: 'high',
44
72
  },
45
- { method: SHARE_COPY_LINK_METHOD, module: 'share', capability: SHARE_COPY_LINK_METHOD, permission: 'share.copyLink', risk: 'medium' },
46
- { method: SHARE_SHOW_SHARE_MENU_METHOD, module: 'share', capability: SHARE_SHOW_SHARE_MENU_METHOD, permission: 'share.basic', risk: 'low' },
47
- { method: SHARE_SCREENSHOT_METHOD, module: 'share', capability: SHARE_SCREENSHOT_METHOD, permission: 'share.screenshot', risk: 'medium' },
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
- permission: 'viewport.windowInfo',
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
- permission: 'viewport.navigationBarStyle',
105
+ requirement: { kind: 'none' },
60
106
  risk: 'low',
61
107
  },
62
- { method: STORAGE_GET_STORAGE_METHOD, module: 'storage', capability: STORAGE_GET_STORAGE_METHOD, permission: 'storage.read', risk: 'low' },
63
- { method: STORAGE_SET_STORAGE_METHOD, module: 'storage', capability: STORAGE_SET_STORAGE_METHOD, permission: 'storage.write', risk: 'medium' },
64
- { method: NETWORK_REQUEST_METHOD, module: 'network', capability: NETWORK_REQUEST_METHOD, permission: 'network.request', risk: 'high' },
65
- { method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, permission: 'ui.toast', risk: 'low' },
66
- { method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
67
- { method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
68
- { method: DEVICE_VIBRATE_METHOD, module: 'device', capability: DEVICE_VIBRATE_METHOD, permission: 'device.vibrate', risk: 'low' },
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
- permission: 'device.clipboard.write',
243
+ requirement: { kind: 'all', permissions: ['clipboard'] },
74
244
  risk: 'medium',
75
245
  },
76
- { method: NAVIGATION_CLOSE_METHOD, module: 'navigation', capability: NAVIGATION_CLOSE_METHOD, permission: 'navigation.close', risk: 'medium' },
77
- { method: NAVIGATION_RELOAD_METHOD, module: 'navigation', capability: NAVIGATION_RELOAD_METHOD, permission: 'navigation.reload', risk: 'medium' },
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
- permission: 'navigation.openAppPage',
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
- permission: 'cloud.leaderboard.write',
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
- permission: 'cloud.leaderboard.read',
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
- permission: 'cloud.leaderboard.currentUserEntry.read',
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
- permission: 'cloud.leaderboard.currentUserEntry.delete',
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
- permission: 'cloud.leaderboard.info.read',
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 || typeof value !== 'object')
302
+ if (!isRecord$1(value))
132
303
  return false;
133
- const message = value;
134
- return (message.namespace === MINI_PROGRAM_MESSAGE_NAMESPACE &&
135
- (message.version === 1 || message.version === 2) &&
136
- typeof message.nonce === 'string' &&
137
- typeof message.type === 'string');
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 MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
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 key = rawEntry.key.trim();
161
- if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord(rawEntry.config)) {
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
- if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
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: { useOfficialDomain: rawEntry.config.useOfficialDomain },
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;