@heybox/hb-sdk-protocol 0.8.1-alpha.8 → 0.8.1

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.
@@ -0,0 +1,479 @@
1
+ {
2
+ "schema": "heybox-mini-program-native-host",
3
+ "protocolVersion": 1,
4
+ "contractRevision": 1,
5
+ "chunkMaxBytes": 65536,
6
+ "operations": {
7
+ "system": [
8
+ "describe"
9
+ ],
10
+ "network": [
11
+ "open",
12
+ "read",
13
+ "release",
14
+ "transfer"
15
+ ],
16
+ "files": [
17
+ "create",
18
+ "remove",
19
+ "exists",
20
+ "openRead",
21
+ "openWrite",
22
+ "read",
23
+ "release",
24
+ "write",
25
+ "stat",
26
+ "list",
27
+ "pickFiles",
28
+ "pickDirectory",
29
+ "saveFile"
30
+ ]
31
+ },
32
+ "cases": [
33
+ {
34
+ "name": "system-describe",
35
+ "valid": true,
36
+ "request": {
37
+ "requestId": "req_describe",
38
+ "domain": "system",
39
+ "operation": "describe"
40
+ },
41
+ "messages": [
42
+ {
43
+ "requestId": "req_describe",
44
+ "type": "result",
45
+ "payload": {
46
+ "protocolVersion": 1,
47
+ "contractRevision": 1,
48
+ "operations": {
49
+ "system": [
50
+ "describe"
51
+ ],
52
+ "network": [
53
+ "open",
54
+ "read",
55
+ "release",
56
+ "transfer"
57
+ ],
58
+ "files": [
59
+ "create",
60
+ "remove",
61
+ "exists",
62
+ "openRead",
63
+ "openWrite",
64
+ "read",
65
+ "release",
66
+ "write",
67
+ "stat",
68
+ "list",
69
+ "pickFiles",
70
+ "pickDirectory",
71
+ "saveFile"
72
+ ]
73
+ }
74
+ }
75
+ }
76
+ ]
77
+ },
78
+ {
79
+ "name": "network-open",
80
+ "valid": true,
81
+ "request": {
82
+ "requestId": "req_open",
83
+ "domain": "network",
84
+ "operation": "open",
85
+ "payload": {
86
+ "purpose": "download",
87
+ "url": "https://cdn.example.test/file.zip",
88
+ "method": "GET",
89
+ "timeoutMs": 30000
90
+ }
91
+ },
92
+ "messages": [
93
+ {
94
+ "requestId": "req_open",
95
+ "type": "result",
96
+ "payload": {
97
+ "status": 200,
98
+ "statusText": "OK",
99
+ "headers": {
100
+ "content-length": [
101
+ "4"
102
+ ]
103
+ },
104
+ "resourceId": "resource_1"
105
+ }
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ "name": "network-read-chunk",
111
+ "valid": true,
112
+ "request": {
113
+ "requestId": "req_read",
114
+ "domain": "network",
115
+ "operation": "read",
116
+ "payload": {
117
+ "resourceId": "resource_1",
118
+ "maxBytes": 65536
119
+ }
120
+ },
121
+ "messages": [
122
+ {
123
+ "requestId": "req_read",
124
+ "type": "result",
125
+ "payload": {
126
+ "resourceId": "resource_1",
127
+ "data": "dGVzdA==",
128
+ "byteLength": 4,
129
+ "eof": true
130
+ }
131
+ }
132
+ ]
133
+ },
134
+ {
135
+ "name": "network-transfer-progress",
136
+ "valid": true,
137
+ "request": {
138
+ "requestId": "req_transfer",
139
+ "domain": "network",
140
+ "operation": "transfer",
141
+ "payload": {
142
+ "resourceId": "resource_1",
143
+ "target": {
144
+ "scope": "sandbox",
145
+ "kind": "file",
146
+ "relativePath": "downloads/file.zip"
147
+ },
148
+ "mode": "upsert",
149
+ "maxBytes": 2147483648,
150
+ "expectedBytes": 4
151
+ }
152
+ },
153
+ "messages": [
154
+ {
155
+ "requestId": "req_transfer",
156
+ "type": "progress",
157
+ "payload": {
158
+ "resourceId": "resource_1",
159
+ "loaded": 4
160
+ }
161
+ },
162
+ {
163
+ "requestId": "req_transfer",
164
+ "type": "result",
165
+ "payload": {
166
+ "committedBytes": 4
167
+ }
168
+ }
169
+ ]
170
+ },
171
+ {
172
+ "name": "files-open-read",
173
+ "valid": true,
174
+ "request": {
175
+ "requestId": "req_file_open",
176
+ "domain": "files",
177
+ "operation": "openRead",
178
+ "payload": {
179
+ "ref": {
180
+ "scope": "sandbox",
181
+ "kind": "file",
182
+ "relativePath": "data.bin"
183
+ },
184
+ "maxBytes": 8388608
185
+ }
186
+ },
187
+ "messages": [
188
+ {
189
+ "requestId": "req_file_open",
190
+ "type": "result",
191
+ "payload": {
192
+ "resourceId": "file_resource_1"
193
+ }
194
+ }
195
+ ]
196
+ },
197
+ {
198
+ "name": "files-create",
199
+ "valid": true,
200
+ "request": {
201
+ "requestId": "req_create",
202
+ "domain": "files",
203
+ "operation": "create",
204
+ "payload": {
205
+ "ref": {
206
+ "scope": "sandbox",
207
+ "kind": "file",
208
+ "relativePath": "data.bin"
209
+ },
210
+ "recursive": false,
211
+ "exclusive": true
212
+ }
213
+ },
214
+ "messages": [
215
+ {
216
+ "requestId": "req_create",
217
+ "type": "result"
218
+ }
219
+ ]
220
+ },
221
+ {
222
+ "name": "files-open-write",
223
+ "valid": true,
224
+ "request": {
225
+ "requestId": "req_write_open",
226
+ "domain": "files",
227
+ "operation": "openWrite",
228
+ "payload": {
229
+ "ref": {
230
+ "scope": "sandbox",
231
+ "kind": "file",
232
+ "relativePath": "data.bin"
233
+ },
234
+ "maxBytes": 8388608
235
+ }
236
+ },
237
+ "messages": [
238
+ {
239
+ "requestId": "req_write_open",
240
+ "type": "result",
241
+ "payload": {
242
+ "resourceId": "file_write_1"
243
+ }
244
+ }
245
+ ]
246
+ },
247
+ {
248
+ "name": "files-write-chunk",
249
+ "valid": true,
250
+ "request": {
251
+ "requestId": "req_write",
252
+ "domain": "files",
253
+ "operation": "write",
254
+ "payload": {
255
+ "resourceId": "file_write_1",
256
+ "data": "AAE=",
257
+ "byteLength": 2,
258
+ "eof": true
259
+ }
260
+ },
261
+ "messages": [
262
+ {
263
+ "requestId": "req_write",
264
+ "type": "result"
265
+ }
266
+ ]
267
+ },
268
+ {
269
+ "name": "files-list",
270
+ "valid": true,
271
+ "request": {
272
+ "requestId": "req_list",
273
+ "domain": "files",
274
+ "operation": "list",
275
+ "payload": {
276
+ "ref": {
277
+ "scope": "sandbox",
278
+ "kind": "directory",
279
+ "relativePath": ""
280
+ },
281
+ "limit": 1000
282
+ }
283
+ },
284
+ "messages": [
285
+ {
286
+ "requestId": "req_list",
287
+ "type": "result",
288
+ "payload": [
289
+ {
290
+ "kind": "file",
291
+ "mode": "readwrite",
292
+ "name": "data.bin",
293
+ "ref": {
294
+ "scope": "sandbox",
295
+ "kind": "file",
296
+ "relativePath": "data.bin"
297
+ }
298
+ }
299
+ ]
300
+ }
301
+ ]
302
+ },
303
+ {
304
+ "name": "files-read-chunk",
305
+ "valid": true,
306
+ "request": {
307
+ "requestId": "req_file_read",
308
+ "domain": "files",
309
+ "operation": "read",
310
+ "payload": {
311
+ "resourceId": "file_resource_1",
312
+ "maxBytes": 65536
313
+ }
314
+ },
315
+ "messages": [
316
+ {
317
+ "requestId": "req_file_read",
318
+ "type": "result",
319
+ "payload": {
320
+ "resourceId": "file_resource_1",
321
+ "data": "AAE=",
322
+ "byteLength": 2,
323
+ "eof": true
324
+ }
325
+ }
326
+ ]
327
+ },
328
+ {
329
+ "name": "cancel-race",
330
+ "valid": true,
331
+ "request": {
332
+ "requestId": "req_cancel",
333
+ "domain": "network",
334
+ "operation": "open",
335
+ "payload": {
336
+ "purpose": "request",
337
+ "url": "https://api.example.test/data",
338
+ "method": "GET",
339
+ "timeoutMs": 30000
340
+ }
341
+ },
342
+ "cancel": {
343
+ "type": "cancel",
344
+ "requestId": "req_cancel"
345
+ },
346
+ "messages": [
347
+ {
348
+ "requestId": "req_cancel",
349
+ "type": "error",
350
+ "error": {
351
+ "code": "REQUEST_FAILED",
352
+ "message": "请求已取消"
353
+ }
354
+ }
355
+ ]
356
+ },
357
+ {
358
+ "name": "unsupported-operation",
359
+ "valid": true,
360
+ "request": {
361
+ "requestId": "req_missing",
362
+ "domain": "files",
363
+ "operation": "unknown"
364
+ },
365
+ "messages": [
366
+ {
367
+ "requestId": "req_missing",
368
+ "type": "error",
369
+ "error": {
370
+ "code": "METHOD_FORBIDDEN",
371
+ "message": "当前客户端不支持该能力"
372
+ }
373
+ }
374
+ ]
375
+ },
376
+ {
377
+ "name": "invalid-shape",
378
+ "valid": false,
379
+ "request": {
380
+ "requestId": "",
381
+ "domain": "network",
382
+ "operation": "open"
383
+ }
384
+ },
385
+ {
386
+ "name": "oversized-chunk",
387
+ "valid": false,
388
+ "message": {
389
+ "requestId": "req_big",
390
+ "type": "result",
391
+ "payload": {
392
+ "resourceId": "resource_1",
393
+ "data": "",
394
+ "byteLength": 65537,
395
+ "eof": false
396
+ }
397
+ }
398
+ },
399
+ {
400
+ "name": "zero-nonterminal-chunk",
401
+ "valid": false,
402
+ "message": {
403
+ "requestId": "req_zero",
404
+ "type": "result",
405
+ "payload": {
406
+ "resourceId": "resource_1",
407
+ "data": "",
408
+ "byteLength": 0,
409
+ "eof": false
410
+ }
411
+ }
412
+ },
413
+ {
414
+ "name": "duplicate-terminal",
415
+ "valid": false,
416
+ "messages": [
417
+ {
418
+ "requestId": "req_dup",
419
+ "type": "result"
420
+ },
421
+ {
422
+ "requestId": "req_dup",
423
+ "type": "error",
424
+ "error": {
425
+ "code": "REQUEST_FAILED",
426
+ "message": "重复终态"
427
+ }
428
+ }
429
+ ]
430
+ },
431
+ {
432
+ "name": "late-progress",
433
+ "valid": false,
434
+ "messages": [
435
+ {
436
+ "requestId": "req_late",
437
+ "type": "result"
438
+ },
439
+ {
440
+ "requestId": "req_late",
441
+ "type": "progress",
442
+ "payload": {
443
+ "resourceId": "resource_1",
444
+ "loaded": 1
445
+ }
446
+ }
447
+ ]
448
+ },
449
+ {
450
+ "name": "cross-session-handle",
451
+ "valid": false,
452
+ "request": {
453
+ "requestId": "req_cross",
454
+ "domain": "files",
455
+ "operation": "stat",
456
+ "payload": {
457
+ "ref": {
458
+ "scope": "grant",
459
+ "id": "other_session_handle",
460
+ "kind": "file",
461
+ "relativePath": ""
462
+ }
463
+ }
464
+ }
465
+ },
466
+ {
467
+ "name": "redacted-error",
468
+ "valid": true,
469
+ "message": {
470
+ "requestId": "req_error",
471
+ "type": "error",
472
+ "error": {
473
+ "code": "FILE_ACCESS_DENIED",
474
+ "message": "文件访问被拒绝"
475
+ }
476
+ }
477
+ }
478
+ ]
479
+ }
@@ -0,0 +1,185 @@
1
+ {
2
+ "hash": "411af8cb9f6bffc9a10c7b1bdf8eda6f777d25e52e34b8b2e72eb9ab0b2ee095",
3
+ "permissions": [
4
+ {
5
+ "key": "userInfo",
6
+ "name": "用户信息",
7
+ "description": "登录小程序并读取当前用户的授权信息。",
8
+ "access": "declaration",
9
+ "risk": "medium",
10
+ "config": {},
11
+ "methods": [
12
+ "auth.login",
13
+ "user.getInfo"
14
+ ],
15
+ "conditions": [
16
+ "继续执行黑盒登录、用户授权和可信手势规则。"
17
+ ]
18
+ },
19
+ {
20
+ "key": "steamLibrary",
21
+ "name": "Steam 游戏库",
22
+ "description": "读取当前用户授权的 Steam 游戏库。",
23
+ "access": "declaration",
24
+ "risk": "high",
25
+ "config": {},
26
+ "methods": [
27
+ "user.getSteamGameList"
28
+ ],
29
+ "conditions": [
30
+ "继续执行账号绑定和数据可用性规则。"
31
+ ]
32
+ },
33
+ {
34
+ "key": "share",
35
+ "name": "分享",
36
+ "description": "使用小程序分享、分享菜单和截图能力。",
37
+ "access": "declaration",
38
+ "risk": "medium",
39
+ "config": {},
40
+ "methods": [
41
+ "share.copyLink",
42
+ "share.showShareMenu",
43
+ "share.screenshot"
44
+ ],
45
+ "conditions": [
46
+ "继续执行分享参数校验和 Host 支持检查。"
47
+ ]
48
+ },
49
+ {
50
+ "key": "storage",
51
+ "name": "键值存储",
52
+ "description": "读写按小程序隔离的简单键值数据。",
53
+ "access": "declaration",
54
+ "risk": "medium",
55
+ "config": {},
56
+ "methods": [
57
+ "storage.getStorage",
58
+ "storage.setStorage"
59
+ ],
60
+ "conditions": [
61
+ "仅用于简单键值存储,不包含文件系统。"
62
+ ]
63
+ },
64
+ {
65
+ "key": "filesystem",
66
+ "name": "文件系统",
67
+ "description": "访问小程序沙盒文件和用户选择的外部文件。",
68
+ "access": "declaration",
69
+ "risk": "high",
70
+ "config": {},
71
+ "methods": [
72
+ "network.download",
73
+ "files.pickFiles",
74
+ "files.pickDirectory",
75
+ "files.saveFile",
76
+ "file.create",
77
+ "file.remove",
78
+ "file.exists",
79
+ "file.readText",
80
+ "file.writeText",
81
+ "file.readBytes",
82
+ "file.writeBytes",
83
+ "file.stat",
84
+ "directory.create",
85
+ "directory.remove",
86
+ "directory.exists",
87
+ "directory.list"
88
+ ],
89
+ "conditions": [
90
+ "外部文件继续要求有效的用户选择、会话句柄和匹配的读写模式。"
91
+ ]
92
+ },
93
+ {
94
+ "key": "clipboard",
95
+ "name": "剪贴板",
96
+ "description": "向系统剪贴板写入文本。",
97
+ "access": "declaration",
98
+ "risk": "medium",
99
+ "config": {},
100
+ "methods": [
101
+ "device.setClipboard"
102
+ ],
103
+ "conditions": [
104
+ "继续执行文本长度和 Host 支持限制。"
105
+ ]
106
+ },
107
+ {
108
+ "key": "leaderboard",
109
+ "name": "排行榜",
110
+ "description": "读写小程序云排行榜。",
111
+ "access": "declaration",
112
+ "risk": "medium",
113
+ "config": {},
114
+ "methods": [
115
+ "cloud.leaderboard.submit",
116
+ "cloud.leaderboard.getList",
117
+ "cloud.leaderboard.getCurrentUserEntry",
118
+ "cloud.leaderboard.deleteCurrentUserEntry",
119
+ "cloud.leaderboard.getInfo"
120
+ ],
121
+ "conditions": [
122
+ "排行榜必须已创建,用户和资源规则保持不变。"
123
+ ]
124
+ },
125
+ {
126
+ "key": "network",
127
+ "name": "网络",
128
+ "description": "通过 network 模块请求或下载外部资源。",
129
+ "access": "platform-approval",
130
+ "risk": "high",
131
+ "config": {
132
+ "useOfficialDomain": {
133
+ "type": "boolean",
134
+ "required": false,
135
+ "default": false,
136
+ "description": "是否申请访问小黑盒官方域名。"
137
+ }
138
+ },
139
+ "methods": [
140
+ "network.request",
141
+ "network.download"
142
+ ],
143
+ "conditions": [
144
+ "声明后仍需平台批准,并继续执行网络安全策略。"
145
+ ]
146
+ },
147
+ {
148
+ "key": "companion",
149
+ "name": "桌面辅助应用",
150
+ "description": "下载、准备并运行随当前小程序版本发布的受管桌面程序。",
151
+ "access": "platform-approval",
152
+ "risk": "high",
153
+ "config": {},
154
+ "methods": [
155
+ "companion.getInfo",
156
+ "companion.getPreparationStatus",
157
+ "companion.prepare",
158
+ "companion.cancelPreparation",
159
+ "companion.getActiveSession",
160
+ "companion.launch",
161
+ "companion.session.write",
162
+ "companion.session.closeStdin",
163
+ "companion.session.terminate",
164
+ "companion.session.ackOutput",
165
+ "companion.openAttachment",
166
+ "companion.showNotification"
167
+ ],
168
+ "conditions": [
169
+ "声明后仍需平台批准,并继续执行可信用户手势、Host 能力和当前版本 Manifest 校验。"
170
+ ]
171
+ }
172
+ ],
173
+ "noDeclarationMethods": [
174
+ "user.revokeAuthorization",
175
+ "ui.showToast",
176
+ "ui.showLoading",
177
+ "ui.hideLoading",
178
+ "viewport.getWindowInfo",
179
+ "viewport.setNavigationBarStyle",
180
+ "device.vibrate",
181
+ "navigation.close",
182
+ "navigation.reload",
183
+ "navigation.openAppPage"
184
+ ]
185
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heybox/hb-sdk-protocol",
3
- "version": "0.8.1-alpha.8",
3
+ "version": "0.8.1",
4
4
  "description": "Heybox mini-program iframe bridge wire contracts.",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -14,6 +14,7 @@
14
14
  },
15
15
  "files": [
16
16
  "dist",
17
+ "generated",
17
18
  "types",
18
19
  "src",
19
20
  "README.md"
@@ -34,15 +35,18 @@
34
35
  "access": "public"
35
36
  },
36
37
  "scripts": {
38
+ "prebuild:package": "pnpm run check:native-host-contract",
37
39
  "build:package": "pnpm run clean && pnpm run build:lib && pnpm run build:types",
38
40
  "build:lib": "rollup -c rollup.config.ts --configPlugin 'typescript={\"tsconfig\":\"tsconfig.build.json\"}'",
39
41
  "build:types": "tsc -p tsconfig.dts.json",
40
42
  "test:types": "tsc -p tsconfig.dts.json --noEmit --pretty false",
41
43
  "clean": "rimraf ./dist && rimraf ./types",
42
44
  "check:boundary": "node scripts/check-boundary.cjs",
45
+ "gen:native-host-contract": "node scripts/generate-native-host-contract.mjs",
46
+ "check:native-host-contract": "node scripts/generate-native-host-contract.mjs --check",
43
47
  "gen:permission-catalog": "pnpm run build:lib && node scripts/generate-permission-catalog.mjs",
44
48
  "check:permission-catalog": "pnpm run build:lib && node scripts/generate-permission-catalog.mjs --check",
45
- "pretest:unit": "pnpm run build:types",
49
+ "pretest:unit": "pnpm run check:native-host-contract && pnpm run build:types",
46
50
  "test:unit": "NODE_OPTIONS='--conditions=heybox' vitest run",
47
51
  "test:watch": "NODE_OPTIONS='--conditions=heybox' vitest"
48
52
  }
@@ -164,7 +164,9 @@ export const COMPANION_SHOW_NOTIFICATION_METHOD = 'companion.showNotification' a
164
164
  export type MiniProgramAuthMethod = typeof AUTH_LOGIN_METHOD;
165
165
  export type MiniProgramUserMethod = typeof USER_GET_INFO_METHOD | typeof USER_REVOKE_AUTHORIZATION_METHOD | typeof USER_GET_STEAM_GAME_LIST_METHOD;
166
166
  export type MiniProgramShareMethod = typeof SHARE_COPY_LINK_METHOD | typeof SHARE_SHOW_SHARE_MENU_METHOD | typeof SHARE_SCREENSHOT_METHOD;
167
- export type MiniProgramViewportMethod = typeof VIEWPORT_GET_WINDOW_INFO_METHOD | typeof VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD;
167
+ export type MiniProgramViewportMethod =
168
+ | typeof VIEWPORT_GET_WINDOW_INFO_METHOD
169
+ | typeof VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD;
168
170
  export type MiniProgramStorageMethod = typeof STORAGE_GET_STORAGE_METHOD | typeof STORAGE_SET_STORAGE_METHOD;
169
171
  export type MiniProgramNetworkMethod = typeof NETWORK_REQUEST_METHOD | typeof NETWORK_DOWNLOAD_METHOD;
170
172
  export type MiniProgramFilesMethod = typeof FILES_PICK_FILES_METHOD | typeof FILES_PICK_DIRECTORY_METHOD | typeof FILES_SAVE_FILE_METHOD;