@heybox/hb-sdk 0.1.2

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,465 @@
1
+ /** SDK 对外抛出的标准错误类型。 */
2
+ class HbMiniProgramSDKError extends Error {
3
+ /** 稳定错误码。 */
4
+ code;
5
+ /** 可选调试数据。 */
6
+ data;
7
+ constructor(error) {
8
+ super(error.message);
9
+ this.name = 'HbMiniProgramSDKError';
10
+ this.code = error.code;
11
+ this.data = error.data;
12
+ }
13
+ }
14
+ /** 创建 SDK 标准错误。 */
15
+ function createSDKError(code, message, data) {
16
+ return new HbMiniProgramSDKError({
17
+ code,
18
+ message,
19
+ data,
20
+ });
21
+ }
22
+
23
+ /** SDK 内部事件总线,负责管理沙盒生命周期与业务事件监听。 */
24
+ class MiniProgramEventBus {
25
+ eventHandlers = new Map();
26
+ /** 注册事件监听,并返回取消监听函数。 */
27
+ on(eventName, handler) {
28
+ const handlers = this.eventHandlers.get(eventName) || new Set();
29
+ handlers.add(handler);
30
+ this.eventHandlers.set(eventName, handlers);
31
+ return () => this.off(eventName, handler);
32
+ }
33
+ /** 移除事件监听。 */
34
+ off(eventName, handler) {
35
+ const handlers = this.eventHandlers.get(eventName);
36
+ if (!handlers) {
37
+ return;
38
+ }
39
+ handlers.delete(handler);
40
+ if (handlers.size === 0) {
41
+ this.eventHandlers.delete(eventName);
42
+ }
43
+ }
44
+ /** 派发事件。 */
45
+ emit(eventName, payload) {
46
+ const handlers = this.eventHandlers.get(eventName);
47
+ if (!handlers) {
48
+ return;
49
+ }
50
+ handlers.forEach((handler) => {
51
+ handler(payload);
52
+ });
53
+ }
54
+ }
55
+
56
+ /** 小程序沙盒通信命名空间,父容器与 iframe 内 SDK 必须保持一致。 */
57
+ const MINI_PROGRAM_MESSAGE_NAMESPACE = 'heybox:miniprogram';
58
+ /** 小程序沙盒通信协议版本。 */
59
+ const MINI_PROGRAM_MESSAGE_VERSION = 1;
60
+ /** 父容器注入到小程序 URL 上的通信 nonce 参数名。 */
61
+ const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
62
+ /** SDK 初始化时发给父容器的握手方法名。 */
63
+ const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
64
+
65
+ /** 获取浏览器全局 window。 */
66
+ function getGlobalWindow() {
67
+ return typeof window === 'undefined' ? undefined : window;
68
+ }
69
+ /** 获取父窗口;非 iframe 环境返回 null。 */
70
+ function getParentWindow(currentWindow) {
71
+ if (!currentWindow || currentWindow.parent === currentWindow) {
72
+ return null;
73
+ }
74
+ return currentWindow.parent;
75
+ }
76
+ /** 从父容器注入到 URL 的 query 中读取 bridge nonce。 */
77
+ function readBridgeNonce(currentWindow) {
78
+ const href = currentWindow?.location?.href;
79
+ if (!href) {
80
+ return '';
81
+ }
82
+ try {
83
+ return new URL(href).searchParams.get(MINI_PROGRAM_BRIDGE_NONCE_PARAM) || '';
84
+ }
85
+ catch {
86
+ return '';
87
+ }
88
+ }
89
+ /** 创建请求 ID。 */
90
+ function createMessageId() {
91
+ const cryptoApi = getGlobalWindow()?.crypto;
92
+ if (cryptoApi?.randomUUID) {
93
+ return cryptoApi.randomUUID();
94
+ }
95
+ return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;
96
+ }
97
+
98
+ /** 判断未知数据是否符合小程序 bridge 消息信封。 */
99
+ function isMiniProgramBridgeMessage(value) {
100
+ if (!value || typeof value !== 'object') {
101
+ return false;
102
+ }
103
+ const message = value;
104
+ return (message.namespace === MINI_PROGRAM_MESSAGE_NAMESPACE &&
105
+ message.version === MINI_PROGRAM_MESSAGE_VERSION &&
106
+ typeof message.nonce === 'string' &&
107
+ typeof message.type === 'string');
108
+ }
109
+
110
+ const DEFAULT_TIMEOUT = 10000;
111
+ /** 底层 bridge client,负责握手、请求响应、事件分发与超时清理。 */
112
+ class MiniProgramBridgeClient {
113
+ timeout;
114
+ selfWindow;
115
+ targetWindow;
116
+ nonce;
117
+ pendingRequests = new Map();
118
+ eventBus = new MiniProgramEventBus();
119
+ handleMessage;
120
+ started = false;
121
+ readySettled = false;
122
+ readyPromise;
123
+ resolveReady;
124
+ rejectReady;
125
+ readyTimer;
126
+ constructor(options = {}) {
127
+ this.timeout = options.timeout || DEFAULT_TIMEOUT;
128
+ this.selfWindow = options.selfWindow || getGlobalWindow();
129
+ this.targetWindow =
130
+ options.targetWindow === undefined ? getParentWindow(this.selfWindow) : options.targetWindow;
131
+ this.nonce = options.nonce || readBridgeNonce(this.selfWindow);
132
+ this.handleMessage = this.onMessage.bind(this);
133
+ this.readyPromise = new Promise((resolve, reject) => {
134
+ this.resolveReady = resolve;
135
+ this.rejectReady = reject;
136
+ });
137
+ this.readyPromise.catch(() => undefined);
138
+ }
139
+ /** 等待父容器握手完成。 */
140
+ ready() {
141
+ this.ensureStarted();
142
+ return this.readyPromise;
143
+ }
144
+ /** 注册小程序事件监听。 */
145
+ on(eventName, handler) {
146
+ this.ensureStarted();
147
+ return this.eventBus.on(eventName, handler);
148
+ }
149
+ /** 移除小程序事件监听。 */
150
+ off(eventName, handler) {
151
+ this.eventBus.off(eventName, handler);
152
+ }
153
+ /** 调用父容器开放能力。 */
154
+ async request(method, payload) {
155
+ await this.ready();
156
+ const id = createMessageId();
157
+ const message = {
158
+ namespace: MINI_PROGRAM_MESSAGE_NAMESPACE,
159
+ version: MINI_PROGRAM_MESSAGE_VERSION,
160
+ nonce: this.nonce,
161
+ type: 'request',
162
+ id,
163
+ method,
164
+ payload,
165
+ };
166
+ return new Promise((resolve, reject) => {
167
+ const timer = setTimeout(() => {
168
+ this.pendingRequests.delete(id);
169
+ reject(createSDKError('REQUEST_TIMEOUT', `${method} 调用超时`));
170
+ }, this.timeout);
171
+ this.pendingRequests.set(id, {
172
+ resolve: resolve,
173
+ reject,
174
+ timer,
175
+ });
176
+ try {
177
+ this.postMessage(message);
178
+ }
179
+ catch (error) {
180
+ clearTimeout(timer);
181
+ this.pendingRequests.delete(id);
182
+ reject(error);
183
+ }
184
+ });
185
+ }
186
+ /** 销毁 SDK 实例,并拒绝尚未完成的请求。 */
187
+ destroy() {
188
+ this.selfWindow?.removeEventListener('message', this.handleMessage);
189
+ this.clearReadyTimer();
190
+ this.rejectAllPending(createSDKError('SDK_DESTROYED', '小程序 SDK 已销毁'));
191
+ }
192
+ ensureStarted() {
193
+ if (this.started) {
194
+ return;
195
+ }
196
+ this.started = true;
197
+ if (!this.selfWindow || !this.targetWindow) {
198
+ this.failReady(createSDKError('NOT_IN_IFRAME', '当前页面不在小程序沙盒 iframe 中'));
199
+ return;
200
+ }
201
+ if (!this.nonce) {
202
+ this.failReady(createSDKError('MISSING_NONCE', '缺少小程序沙盒通信标识'));
203
+ return;
204
+ }
205
+ this.selfWindow.addEventListener('message', this.handleMessage);
206
+ this.readyTimer = setTimeout(() => {
207
+ this.failReady(createSDKError('READY_TIMEOUT', '小程序沙盒握手超时'));
208
+ }, this.timeout);
209
+ this.postMessage({
210
+ namespace: MINI_PROGRAM_MESSAGE_NAMESPACE,
211
+ version: MINI_PROGRAM_MESSAGE_VERSION,
212
+ nonce: this.nonce,
213
+ type: 'handshake',
214
+ id: createMessageId(),
215
+ method: SDK_HANDSHAKE_METHOD,
216
+ payload: {
217
+ href: this.selfWindow.location.href,
218
+ userAgent: this.selfWindow.navigator.userAgent,
219
+ },
220
+ });
221
+ }
222
+ onMessage(event) {
223
+ if (event.source && event.source !== this.targetWindow) {
224
+ return;
225
+ }
226
+ if (!isMiniProgramBridgeMessage(event.data) || event.data.nonce !== this.nonce) {
227
+ return;
228
+ }
229
+ if (event.data.type === 'event') {
230
+ this.handleEvent(event.data);
231
+ return;
232
+ }
233
+ if (event.data.type === 'response') {
234
+ this.handleResponse(event.data);
235
+ }
236
+ }
237
+ handleEvent(message) {
238
+ const eventName = message.method;
239
+ if (eventName === 'ready') {
240
+ this.resolveReadyOnce();
241
+ }
242
+ this.eventBus.emit(eventName, message.payload);
243
+ }
244
+ handleResponse(message) {
245
+ if (!message.id) {
246
+ return;
247
+ }
248
+ const pending = this.pendingRequests.get(message.id);
249
+ if (!pending) {
250
+ return;
251
+ }
252
+ clearTimeout(pending.timer);
253
+ this.pendingRequests.delete(message.id);
254
+ if (message.error) {
255
+ pending.reject(new HbMiniProgramSDKError(message.error));
256
+ return;
257
+ }
258
+ pending.resolve(message.payload);
259
+ }
260
+ postMessage(message) {
261
+ if (!this.targetWindow) {
262
+ throw createSDKError('NOT_IN_IFRAME', '当前页面不在小程序沙盒 iframe 中');
263
+ }
264
+ this.targetWindow.postMessage(message, '*');
265
+ }
266
+ resolveReadyOnce() {
267
+ if (this.readySettled) {
268
+ return;
269
+ }
270
+ this.readySettled = true;
271
+ this.clearReadyTimer();
272
+ this.resolveReady();
273
+ }
274
+ failReady(error) {
275
+ if (this.readySettled) {
276
+ return;
277
+ }
278
+ this.readySettled = true;
279
+ this.clearReadyTimer();
280
+ this.rejectReady(error);
281
+ }
282
+ clearReadyTimer() {
283
+ if (!this.readyTimer) {
284
+ return;
285
+ }
286
+ clearTimeout(this.readyTimer);
287
+ this.readyTimer = undefined;
288
+ }
289
+ rejectAllPending(error) {
290
+ this.pendingRequests.forEach((pending) => {
291
+ clearTimeout(pending.timer);
292
+ pending.reject(error);
293
+ });
294
+ this.pendingRequests.clear();
295
+ }
296
+ }
297
+
298
+ /** 截图分享能力方法名。 */
299
+ const SHARE_SCREENSHOT_METHOD = 'share.screenshot';
300
+ /** 截图并唤起分享。 */
301
+ function screenshot(requester, options) {
302
+ return requester.request(SHARE_SCREENSHOT_METHOD, options);
303
+ }
304
+
305
+ /** 展示分享面板能力方法名。 */
306
+ const SHARE_SHOW_SHARE_MENU_METHOD = 'share.showShareMenu';
307
+ /** 展示基础分享面板。 */
308
+ function showShareMenu(requester, options) {
309
+ return requester.request(SHARE_SHOW_SHARE_MENU_METHOD, options);
310
+ }
311
+
312
+ /** 创建分享模块。 */
313
+ function createShareModule(requester) {
314
+ return {
315
+ showShareMenu: options => showShareMenu(requester, options),
316
+ screenshot: options => screenshot(requester, options),
317
+ };
318
+ }
319
+
320
+ /** 用户信息能力方法名。 */
321
+ const USER_GET_INFO_METHOD = 'user.getInfo';
322
+ /**
323
+ * 获取当前访问小程序用户的公开基础资料。
324
+ *
325
+ * 该能力只返回 `heybox_id`、`nickname`、`avatar` 三个公开字段。
326
+ * 未登录时不会触发登录流程,直接返回 `{ isLogin: false, userInfo: null }`。
327
+ */
328
+ function getInfo(requester) {
329
+ return requester.request(USER_GET_INFO_METHOD);
330
+ }
331
+
332
+ /** 用户登录能力方法名。 */
333
+ const USER_LOGIN_METHOD = 'user.login';
334
+ /**
335
+ * 唤起黑盒登录流程,并在流程返回后刷新用户公开基础资料。
336
+ *
337
+ * 该能力不会向小程序暴露 token、cookie 或任何登录凭据。
338
+ */
339
+ function login(requester) {
340
+ return requester.request(USER_LOGIN_METHOD);
341
+ }
342
+
343
+ /** 创建用户模块。 */
344
+ function createUserModule(requester) {
345
+ return {
346
+ getInfo: () => getInfo(requester),
347
+ login: () => login(requester),
348
+ };
349
+ }
350
+
351
+ /** 系统窗口信息能力方法名。 */
352
+ const SYSTEM_GET_WINDOW_INFO_METHOD = 'system.getWindowInfo';
353
+ /**
354
+ * 获取当前小程序窗口信息。
355
+ */
356
+ function getWindowInfo(requester) {
357
+ return requester.request(SYSTEM_GET_WINDOW_INFO_METHOD);
358
+ }
359
+
360
+ /** 获取小程序隔离 storage 能力方法名。 */
361
+ const SYSTEM_GET_STORAGE_METHOD = 'system.getStorage';
362
+ /** 获取小程序隔离 storage。 */
363
+ function getStorage(requester, options) {
364
+ return requester.request(SYSTEM_GET_STORAGE_METHOD, options);
365
+ }
366
+
367
+ /** 写入小程序隔离 storage 能力方法名。 */
368
+ const SYSTEM_SET_STORAGE_METHOD = 'system.setStorage';
369
+ /** 写入小程序隔离 storage。 */
370
+ function setStorage(requester, options) {
371
+ return requester.request(SYSTEM_SET_STORAGE_METHOD, options);
372
+ }
373
+
374
+ /** 创建系统模块。 */
375
+ function createSystemModule(requester) {
376
+ return {
377
+ getWindowInfo: () => getWindowInfo(requester),
378
+ getStorage: options => getStorage(requester, options),
379
+ setStorage: options => setStorage(requester, options),
380
+ };
381
+ }
382
+
383
+ /** 外部小程序 SDK 实例。 */
384
+ class MiniProgramSDK {
385
+ client;
386
+ /** 用户相关开放能力。 */
387
+ user;
388
+ /** 分享相关开放能力。 */
389
+ share;
390
+ /** 系统相关开放能力。 */
391
+ system;
392
+ constructor(options) {
393
+ this.client = new MiniProgramBridgeClient(options);
394
+ this.user = createUserModule(this.client);
395
+ this.share = createShareModule(this.client);
396
+ this.system = createSystemModule(this.client);
397
+ }
398
+ /** 等待 SDK 与父容器完成握手。 */
399
+ ready() {
400
+ return this.client.ready();
401
+ }
402
+ /** 注册小程序生命周期或业务事件。 */
403
+ on(eventName, handler) {
404
+ return this.client.on(eventName, handler);
405
+ }
406
+ /** 移除小程序生命周期或业务事件。 */
407
+ off(eventName, handler) {
408
+ this.client.off(eventName, handler);
409
+ }
410
+ /** 销毁 SDK 实例。 */
411
+ destroy() {
412
+ this.client.destroy();
413
+ }
414
+ }
415
+ /** 创建独立 SDK 实例,主要用于测试或多实例场景。 */
416
+ function createMiniProgramSDK(options) {
417
+ return new MiniProgramSDK(options);
418
+ }
419
+
420
+ let defaultSDK = null;
421
+ function getDefaultSDK() {
422
+ if (!defaultSDK) {
423
+ defaultSDK = createMiniProgramSDK();
424
+ }
425
+ return defaultSDK;
426
+ }
427
+ /** 等待默认 SDK 实例与父容器完成握手。 */
428
+ function ready() {
429
+ return getDefaultSDK().ready();
430
+ }
431
+ /** 注册默认 SDK 实例的事件监听。 */
432
+ function on(eventName, handler) {
433
+ return getDefaultSDK().on(eventName, handler);
434
+ }
435
+ /** 移除默认 SDK 实例的事件监听。 */
436
+ function off(eventName, handler) {
437
+ getDefaultSDK().off(eventName, handler);
438
+ }
439
+ /** 默认 SDK 实例的用户模块。 */
440
+ const user = {
441
+ getInfo: () => getDefaultSDK().user.getInfo(),
442
+ login: () => getDefaultSDK().user.login(),
443
+ };
444
+ /** 默认 SDK 实例的分享模块。 */
445
+ const share = {
446
+ showShareMenu: options => getDefaultSDK().share.showShareMenu(options),
447
+ screenshot: options => getDefaultSDK().share.screenshot(options),
448
+ };
449
+ /** 默认 SDK 实例的系统模块。 */
450
+ const system = {
451
+ getWindowInfo: () => getDefaultSDK().system.getWindowInfo(),
452
+ getStorage: options => getDefaultSDK().system.getStorage(options),
453
+ setStorage: options => getDefaultSDK().system.setStorage(options),
454
+ };
455
+
456
+ const hbSDK = {
457
+ ready,
458
+ on,
459
+ off,
460
+ user,
461
+ share,
462
+ system,
463
+ };
464
+
465
+ export { HbMiniProgramSDKError, MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, MiniProgramSDK, SDK_HANDSHAKE_METHOD, SHARE_SCREENSHOT_METHOD, SHARE_SHOW_SHARE_MENU_METHOD, SYSTEM_GET_STORAGE_METHOD, SYSTEM_GET_WINDOW_INFO_METHOD, SYSTEM_SET_STORAGE_METHOD, USER_GET_INFO_METHOD, USER_LOGIN_METHOD, createMiniProgramSDK, createShareModule, createSystemModule, createUserModule, hbSDK as default, getInfo, getStorage, getWindowInfo, isMiniProgramBridgeMessage, login, off, on, ready, screenshot, setStorage, share, showShareMenu, system, user };
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@heybox/hb-sdk",
3
+ "version": "0.1.2",
4
+ "description": "",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./types/index.d.ts",
8
+ "heybox": "./src/index.ts",
9
+ "node": "./dist/index.cjs.js",
10
+ "browser": "./dist/index.esm.js",
11
+ "default": "./dist/index.esm.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "types"
17
+ ],
18
+ "keywords": [],
19
+ "author": "",
20
+ "license": "ISC",
21
+ "dependencies": {
22
+ "@heybox/utils": "^2.1.1"
23
+ },
24
+ "devDependencies": {
25
+ "@heybox/hb-types": "^1.0.1",
26
+ "@vitejs/plugin-vue2": "^2.3.3",
27
+ "@rollup/plugin-typescript": "^11.1.6",
28
+ "@types/node": "24.10.1",
29
+ "@vitest/coverage-v8": "^3.2.4",
30
+ "happy-dom": "^19.0.2",
31
+ "rimraf": "^5.0.5",
32
+ "rollup": "^4.52.4",
33
+ "typescript": "^5.9.3",
34
+ "vue": "2.7.16",
35
+ "vitest": "^3.2.4"
36
+ },
37
+ "publishConfig": {
38
+ "registry": "https://registry.npmjs.org/",
39
+ "access": "public"
40
+ },
41
+ "nx": {
42
+ "targets": {
43
+ "build:package": {
44
+ "inputs": [
45
+ "{projectRoot}/src/**/*"
46
+ ],
47
+ "outputs": [
48
+ "{workspaceRoot}/vue.config.js",
49
+ "{workspaceRoot}/vue2-plugin.js"
50
+ ],
51
+ "cache": true
52
+ }
53
+ },
54
+ "includedScripts": [
55
+ "build:package"
56
+ ]
57
+ },
58
+ "scripts": {
59
+ "dev": "vite",
60
+ "build:package": "nx exec -- sh -c \"pnpm run clean && pnpm run build:lib && pnpm run build:types\"",
61
+ "build:watch": "pnpm run build:lib -w & pnpm run build:types -w",
62
+ "build:lib": "rollup -c rollup.config.ts --configPlugin 'typescript={\"tsconfig\":\"tsconfig.build.json\"}'",
63
+ "build:types": "tsc -p tsconfig.dts.json",
64
+ "clean": "rimraf ./dist && rimraf ./types",
65
+ "test:unit": "NODE_OPTIONS='--conditions=heybox' vitest run",
66
+ "test:unit:coverage": "NODE_OPTIONS='--conditions=heybox' vitest run --coverage",
67
+ "test:watch": "NODE_OPTIONS='--conditions=heybox' vitest"
68
+ }
69
+ }
@@ -0,0 +1,53 @@
1
+ import type { MiniProgramEventHandler, MiniProgramEventName } from '../protocol/types';
2
+ /** 创建 SDK bridge client 的配置项。 */
3
+ export interface MiniProgramSDKOptions {
4
+ /** 请求与握手超时时间,单位毫秒。 */
5
+ timeout?: number;
6
+ /** 父容器注入的 bridge nonce;默认从 URL query 读取。 */
7
+ nonce?: string;
8
+ /** 当前 iframe 内的 window,测试环境可注入。 */
9
+ selfWindow?: Window;
10
+ /** 父窗口,测试环境可注入;显式传 null 可模拟非 iframe 环境。 */
11
+ targetWindow?: Window | null;
12
+ }
13
+ /** 模块 API 发起请求所需的最小能力。 */
14
+ export interface MiniProgramRequester {
15
+ /** 向父容器调用指定开放能力。 */
16
+ request<T>(method: string, payload?: unknown): Promise<T>;
17
+ }
18
+ /** 底层 bridge client,负责握手、请求响应、事件分发与超时清理。 */
19
+ export declare class MiniProgramBridgeClient implements MiniProgramRequester {
20
+ private readonly timeout;
21
+ private readonly selfWindow?;
22
+ private readonly targetWindow;
23
+ private readonly nonce;
24
+ private readonly pendingRequests;
25
+ private readonly eventBus;
26
+ private readonly handleMessage;
27
+ private started;
28
+ private readySettled;
29
+ private readyPromise;
30
+ private resolveReady;
31
+ private rejectReady;
32
+ private readyTimer?;
33
+ constructor(options?: MiniProgramSDKOptions);
34
+ /** 等待父容器握手完成。 */
35
+ ready(): Promise<void>;
36
+ /** 注册小程序事件监听。 */
37
+ on<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): () => void;
38
+ /** 移除小程序事件监听。 */
39
+ off<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): void;
40
+ /** 调用父容器开放能力。 */
41
+ request<T>(method: string, payload?: unknown): Promise<T>;
42
+ /** 销毁 SDK 实例,并拒绝尚未完成的请求。 */
43
+ destroy(): void;
44
+ private ensureStarted;
45
+ private onMessage;
46
+ private handleEvent;
47
+ private handleResponse;
48
+ private postMessage;
49
+ private resolveReadyOnce;
50
+ private failReady;
51
+ private clearReadyTimer;
52
+ private rejectAllPending;
53
+ }
@@ -0,0 +1,11 @@
1
+ import type { MiniProgramBridgeError } from '../protocol/types';
2
+ /** SDK 对外抛出的标准错误类型。 */
3
+ export declare class HbMiniProgramSDKError extends Error {
4
+ /** 稳定错误码。 */
5
+ code: string;
6
+ /** 可选调试数据。 */
7
+ data?: unknown;
8
+ constructor(error: MiniProgramBridgeError);
9
+ }
10
+ /** 创建 SDK 标准错误。 */
11
+ export declare function createSDKError(code: string, message: string, data?: unknown): HbMiniProgramSDKError;
@@ -0,0 +1,11 @@
1
+ import type { MiniProgramEventHandler, MiniProgramEventName } from '../protocol/types';
2
+ /** SDK 内部事件总线,负责管理沙盒生命周期与业务事件监听。 */
3
+ export declare class MiniProgramEventBus {
4
+ private readonly eventHandlers;
5
+ /** 注册事件监听,并返回取消监听函数。 */
6
+ on<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): () => void;
7
+ /** 移除事件监听。 */
8
+ off<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): void;
9
+ /** 派发事件。 */
10
+ emit(eventName: MiniProgramEventName, payload: unknown): void;
11
+ }
@@ -0,0 +1,26 @@
1
+ import { type MiniProgramSDKOptions } from './client';
2
+ import { type MiniProgramShareModule } from '../modules/share';
3
+ import { type MiniProgramUserModule } from '../modules/user';
4
+ import { type MiniProgramSystemModule } from '../modules/system';
5
+ import type { MiniProgramEventHandler, MiniProgramEventName } from '../protocol/types';
6
+ /** 外部小程序 SDK 实例。 */
7
+ export declare class MiniProgramSDK {
8
+ private readonly client;
9
+ /** 用户相关开放能力。 */
10
+ readonly user: MiniProgramUserModule;
11
+ /** 分享相关开放能力。 */
12
+ readonly share: MiniProgramShareModule;
13
+ /** 系统相关开放能力。 */
14
+ readonly system: MiniProgramSystemModule;
15
+ constructor(options?: MiniProgramSDKOptions);
16
+ /** 等待 SDK 与父容器完成握手。 */
17
+ ready(): Promise<void>;
18
+ /** 注册小程序生命周期或业务事件。 */
19
+ on<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): () => void;
20
+ /** 移除小程序生命周期或业务事件。 */
21
+ off<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): void;
22
+ /** 销毁 SDK 实例。 */
23
+ destroy(): void;
24
+ }
25
+ /** 创建独立 SDK 实例,主要用于测试或多实例场景。 */
26
+ export declare function createMiniProgramSDK(options?: MiniProgramSDKOptions): MiniProgramSDK;
@@ -0,0 +1,18 @@
1
+ import type { MiniProgramShareModule } from '../modules/share';
2
+ import type { MiniProgramUserModule } from '../modules/user';
3
+ import type { MiniProgramSystemModule } from '../modules/system';
4
+ import type { MiniProgramEventHandler, MiniProgramEventName } from '../protocol/types';
5
+ /** 等待默认 SDK 实例与父容器完成握手。 */
6
+ export declare function ready(): Promise<void>;
7
+ /** 注册默认 SDK 实例的事件监听。 */
8
+ export declare function on<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): () => void;
9
+ /** 移除默认 SDK 实例的事件监听。 */
10
+ export declare function off<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): void;
11
+ /** 默认 SDK 实例的用户模块。 */
12
+ export declare const user: MiniProgramUserModule;
13
+ /** 默认 SDK 实例的分享模块。 */
14
+ export declare const share: MiniProgramShareModule;
15
+ /** 默认 SDK 实例的系统模块。 */
16
+ export declare const system: MiniProgramSystemModule;
17
+ /** 重置默认 SDK 实例,仅用于测试。 */
18
+ export declare function resetDefaultSDKForTest(): void;
@@ -0,0 +1,8 @@
1
+ /** 获取浏览器全局 window。 */
2
+ export declare function getGlobalWindow(): Window | undefined;
3
+ /** 获取父窗口;非 iframe 环境返回 null。 */
4
+ export declare function getParentWindow(currentWindow?: Window): Window | null;
5
+ /** 从父容器注入到 URL 的 query 中读取 bridge nonce。 */
6
+ export declare function readBridgeNonce(currentWindow?: Window): string;
7
+ /** 创建请求 ID。 */
8
+ export declare function createMessageId(): string;
@@ -0,0 +1,20 @@
1
+ export { createMiniProgramSDK, MiniProgramSDK } from './core/sdk';
2
+ export { HbMiniProgramSDKError } from './core/errors';
3
+ export type { MiniProgramRequester, MiniProgramSDKOptions } from './core/client';
4
+ export { ready, on, off, user, share, system } from './core/singleton';
5
+ export { MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, SDK_HANDSHAKE_METHOD, } from './protocol/constants';
6
+ export { isMiniProgramBridgeMessage } from './protocol/guards';
7
+ export type { MiniProgramBridgeError, MiniProgramBridgeMessage, MiniProgramBridgeMessageType, MiniProgramEventHandler, MiniProgramEventName, MiniProgramEventPayloadMap, } from './protocol/types';
8
+ export * from './modules/user';
9
+ export * from './modules/share';
10
+ export * from './modules/system';
11
+ import { off, on, ready } from './core/singleton';
12
+ declare const hbSDK: {
13
+ ready: typeof ready;
14
+ on: typeof on;
15
+ off: typeof off;
16
+ user: import(".").MiniProgramUserModule;
17
+ share: import(".").MiniProgramShareModule;
18
+ system: import(".").MiniProgramSystemModule;
19
+ };
20
+ export default hbSDK;