@heybox/hb-sdk-protocol 0.8.1-alpha.11 → 0.8.1-alpha.13

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.11",
3
+ "version": "0.8.1-alpha.13",
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
  }
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export * from './bridge';
2
2
  export * from './capabilities';
3
3
  export * from './constants';
4
4
  export * from './guards';
5
+ export * from './native-host';
5
6
  export * from './payloads';
6
7
  export * from './permission-catalog';
7
8
  export * from './permissions';