@dino-dev/bridge-core-ts 0.0.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.
Files changed (47) hide show
  1. package/README.md +145 -0
  2. package/dist/generated/ai_tutor.d.ts +63 -0
  3. package/dist/generated/ai_tutor.d.ts.map +1 -0
  4. package/dist/generated/ai_tutor.js +6 -0
  5. package/dist/generated/ai_tutor.js.map +1 -0
  6. package/dist/generated/audio.d.ts +29 -0
  7. package/dist/generated/audio.d.ts.map +1 -0
  8. package/dist/generated/audio.js +6 -0
  9. package/dist/generated/audio.js.map +1 -0
  10. package/dist/generated/device.d.ts +23 -0
  11. package/dist/generated/device.d.ts.map +1 -0
  12. package/dist/generated/device.js +6 -0
  13. package/dist/generated/device.js.map +1 -0
  14. package/dist/generated/index.d.ts +17 -0
  15. package/dist/generated/index.d.ts.map +1 -0
  16. package/dist/generated/index.js +25 -0
  17. package/dist/generated/index.js.map +1 -0
  18. package/dist/generated/user.d.ts +25 -0
  19. package/dist/generated/user.d.ts.map +1 -0
  20. package/dist/generated/user.js +6 -0
  21. package/dist/generated/user.js.map +1 -0
  22. package/dist/src/index.d.ts +17 -0
  23. package/dist/src/index.d.ts.map +1 -0
  24. package/dist/src/index.js +18 -0
  25. package/dist/src/index.js.map +1 -0
  26. package/dist/src/lifecycle.d.ts +85 -0
  27. package/dist/src/lifecycle.d.ts.map +1 -0
  28. package/dist/src/lifecycle.js +97 -0
  29. package/dist/src/lifecycle.js.map +1 -0
  30. package/dist/src/mrp-bridge.d.ts +108 -0
  31. package/dist/src/mrp-bridge.d.ts.map +1 -0
  32. package/dist/src/mrp-bridge.js +185 -0
  33. package/dist/src/mrp-bridge.js.map +1 -0
  34. package/dist/src/system-module.d.ts +59 -0
  35. package/dist/src/system-module.d.ts.map +1 -0
  36. package/dist/src/system-module.js +33 -0
  37. package/dist/src/system-module.js.map +1 -0
  38. package/generated/ai_tutor.ts +72 -0
  39. package/generated/audio.ts +35 -0
  40. package/generated/device.ts +28 -0
  41. package/generated/index.ts +40 -0
  42. package/generated/user.ts +30 -0
  43. package/package.json +44 -0
  44. package/src/index.ts +33 -0
  45. package/src/lifecycle.ts +127 -0
  46. package/src/mrp-bridge.ts +297 -0
  47. package/src/system-module.ts +77 -0
package/README.md ADDED
@@ -0,0 +1,145 @@
1
+ # Bridge Core TS
2
+
3
+ H5 端与 Flutter 容器通信的核心 TypeScript SDK(零框架依赖)。
4
+ 适用于 React / Vue / Svelte / Vanilla JS 等任何前端框架。
5
+
6
+ ## 文件说明
7
+
8
+ | 文件 | 用途 |
9
+ |------|------|
10
+ | `src/mrp-bridge.ts` | 核心 Bridge SDK(消息通信 + 模块代理) |
11
+ | `src/system-module.ts` | 内置系统模块类型定义 + `getSystemModule()` 工厂 |
12
+ | `src/index.ts` | 包入口,统一 re-export 所有 API |
13
+ | `generated/*_module.ts` | 各模块的 TypeScript 类型定义(由 build_runner 自动生成,纯类型) |
14
+ | `generated/index.ts` | 自动生成的模块类型 re-export + 工厂函数 |
15
+
16
+ > **设计原则**:消费者只需从 `@h5-container/bridge-core-ts` 导入,无需感知 `generated/` 目录。
17
+
18
+ ## 安装
19
+
20
+ 通过 pnpm workspace 依赖引用:
21
+
22
+ ```json
23
+ {
24
+ "dependencies": {
25
+ "@h5-container/bridge-core-ts": "workspace:*"
26
+ }
27
+ }
28
+ ```
29
+
30
+ ## 基础用法
31
+
32
+ ```ts
33
+ import { bridge, getAudio } from '@h5-container/bridge-core-ts';
34
+
35
+ // 发送消息到 Flutter(type 为自由字符串)
36
+ bridge.send('interaction', 'onFindTarget', { target: 'ladybug', position: { x: 100, y: 200 } });
37
+
38
+ // 调用原生模块(通过工厂函数,无需手动指定 namespace)
39
+ const audio = getAudio();
40
+ await audio.play({ soundId: 'success', volume: 0.8 });
41
+
42
+ // 监听 Flutter 发来的消息
43
+ const unsubscribe = bridge.on('ai', 'highlight', (msg) => {
44
+ console.log('AI 指令:', msg.payload);
45
+ });
46
+ // 不再需要时取消监听
47
+ unsubscribe();
48
+ ```
49
+
50
+ ## 在 React 中使用
51
+
52
+ SDK 本身不依赖 React,搭配 `useMemo` / `useEffect` 即可:
53
+
54
+ ```tsx
55
+ import { useMemo, useEffect, useCallback, useState } from 'react';
56
+ import { bridge, getAudio, getDevice } from '@h5-container/bridge-core-ts';
57
+
58
+ function FindBugGame({ bugs }) {
59
+ const audio = useMemo(() => getAudio(), []);
60
+ const device = useMemo(() => getDevice(), []);
61
+
62
+ // 监听 AI 指令(useEffect 自动清理)
63
+ const [aiState, setAiState] = useState('idle');
64
+ useEffect(() => {
65
+ return bridge.on('ai', null, (msg) => {
66
+ const s = (msg.payload as Record<string, unknown>)?.aiState as string;
67
+ if (s) setAiState(s);
68
+ });
69
+ }, []);
70
+
71
+ const handleClick = async (bugId: string) => {
72
+ bridge.send('interaction', 'onFindTarget', { target: bugId });
73
+ await audio.play({ soundId: 'success', volume: 0.8 });
74
+ await device.vibrate({ duration: 50 });
75
+ };
76
+
77
+ return <div>{/* ... */}</div>;
78
+ }
79
+ ```
80
+
81
+ ## 在 Vue 中使用
82
+
83
+ ```ts
84
+ import { bridge, getAudio } from '@h5-container/bridge-core-ts';
85
+
86
+ const audio = getAudio();
87
+
88
+ // 在 setup / onMounted 中使用
89
+ onMounted(() => {
90
+ const unsubscribe = bridge.on('ai', 'highlight', (msg) => {
91
+ console.log('AI 指令:', msg.payload);
92
+ });
93
+ onUnmounted(() => unsubscribe());
94
+ });
95
+
96
+ async function playSound() {
97
+ await audio.play({ soundId: 'success', volume: 0.8 });
98
+ }
99
+ ```
100
+
101
+ ## 原生模块调用
102
+
103
+ Flutter 宿主通过 `registerModule()` 注册的模块,前端通过工厂函数获取类型安全的代理:
104
+
105
+ ```ts
106
+ import { getAudio, getDevice, getUser } from '@h5-container/bridge-core-ts';
107
+
108
+ const audio = getAudio();
109
+ await audio.play({ soundId: 'success', volume: 0.8 });
110
+
111
+ const device = getDevice();
112
+ const info = await device.getDeviceInfo();
113
+
114
+ // 仅导入类型
115
+ import type { Audio, Device } from '@h5-container/bridge-core-ts';
116
+ ```
117
+
118
+ ## 内置系统模块
119
+
120
+ 容器自动注册的系统模块不受白名单限制,通过 `getSystemModule()` 访问:
121
+
122
+ ```ts
123
+ import { getSystemModule } from '@h5-container/bridge-core-ts';
124
+
125
+ const system = getSystemModule();
126
+ const { allowed } = await system.isModuleAllowed({ namespace: 'audio' });
127
+ const { modules } = await system.getAvailableModules();
128
+ const info = await system.getContainerInfo();
129
+ ```
130
+
131
+ ## 协议规范
132
+
133
+ 所有消息遵循统一格式(`type` 为自由字符串,由业务层约定):
134
+
135
+ ```json
136
+ {
137
+ "type": "<自定义类别>",
138
+ "action": "onFindTarget",
139
+ "payload": { "target": "ladybug" },
140
+ "messageId": "optional-uuid",
141
+ "timestamp": 1708588800000
142
+ }
143
+ ```
144
+
145
+ > SDK 不硬编码任何消息类别。`type` 和 `action` 完全由业务定义,SDK 只负责序列化传输。
@@ -0,0 +1,63 @@
1
+ /** AI Tutor 交互网关(宿主侧 AI 能力) */
2
+ export interface AiTutor {
3
+ /** 将用户在绘本中的交互事件发送给 AI Tutor */
4
+ sendInteraction(args: {
5
+ /** 动作名称 */
6
+ action: string;
7
+ /** 事件负载 */
8
+ payload?: Record<string, unknown> | null;
9
+ }): Promise<{
10
+ /** 是否成功 */
11
+ success: boolean;
12
+ }>;
13
+ /** 发送文本消息给 AI Tutor */
14
+ sendTextMessage(args: {
15
+ /** 文本内容 */
16
+ text: string;
17
+ }): Promise<{
18
+ /** 是否成功 */
19
+ success: boolean;
20
+ }>;
21
+ /** 将当前截图发送给 AI Tutor(多模态视觉输入) */
22
+ sendScreenshot(args: {
23
+ /** Base64 编码的图片数据 */
24
+ imageBase64: string;
25
+ }): Promise<{
26
+ /** 是否成功 */
27
+ success: boolean;
28
+ }>;
29
+ /** 通知 AI Tutor 当前绘本场景已切换 */
30
+ notifySceneChanged(args: {
31
+ /** 当前页码 */
32
+ pageIndex: number;
33
+ /** 场景标识符 */
34
+ sceneId?: string | null;
35
+ /** 场景标题 */
36
+ title?: string | null;
37
+ /** 附加元数据 */
38
+ metadata?: Record<string, unknown> | null;
39
+ }): Promise<{
40
+ /** 是否成功 */
41
+ success: boolean;
42
+ }>;
43
+ /** 请求开启/关闭学生麦克风进行语音输入 */
44
+ setMicEnabled(args: {
45
+ /** 是否开启麦克风 */
46
+ enabled: boolean;
47
+ }): Promise<{
48
+ /** 是否成功 */
49
+ success: boolean;
50
+ /** 当前麦克风状态 */
51
+ enabled: boolean;
52
+ }>;
53
+ /** 获取 AI Tutor 当前状态 */
54
+ getState(): Promise<{
55
+ /** 状态标识(idle / thinking / speaking / waitingForResponse / error) */
56
+ state: string;
57
+ /** 麦克风是否开启 */
58
+ micEnabled: boolean;
59
+ /** 当前场景上下文(可能为 null) */
60
+ currentScene: Record<string, unknown> | null;
61
+ }>;
62
+ }
63
+ //# sourceMappingURL=ai_tutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai_tutor.d.ts","sourceRoot":"","sources":["../../generated/ai_tutor.ts"],"names":[],"mappings":"AAKA,+BAA+B;AAC/B,MAAM,WAAW,OAAO;IACtB,+BAA+B;IAC/B,eAAe,CAAC,IAAI,EAAE;QACpB,WAAW;QACX,MAAM,EAAE,MAAM,CAAC;QACf,WAAW;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC1C,GAAG,OAAO,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IAEH,uBAAuB;IACvB,eAAe,CAAC,IAAI,EAAE;QACpB,WAAW;QACX,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IAEH,iCAAiC;IACjC,cAAc,CAAC,IAAI,EAAE;QACnB,qBAAqB;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IAEH,4BAA4B;IAC5B,kBAAkB,CAAC,IAAI,EAAE;QACvB,WAAW;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY;QACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,WAAW;QACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,YAAY;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC3C,GAAG,OAAO,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IAEH,yBAAyB;IACzB,aAAa,CAAC,IAAI,EAAE;QAClB,cAAc;QACd,OAAO,EAAE,OAAO,CAAC;KAClB,GAAG,OAAO,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc;QACd,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IAEH,uBAAuB;IACvB,QAAQ,IAAI,OAAO,CAAC;QAClB,oEAAoE;QACpE,KAAK,EAAE,MAAM,CAAC;QACd,cAAc;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,wBAAwB;QACxB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC9C,CAAC,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ // ============================================================
2
+ // 此文件由 h5_app_container_generator 自动生成,请勿手动修改。
3
+ // 运行 `dart run build_runner build` 重新生成。
4
+ // ============================================================
5
+ export {};
6
+ //# sourceMappingURL=ai_tutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai_tutor.js","sourceRoot":"","sources":["../../generated/ai_tutor.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+CAA+C;AAC/C,yCAAyC;AACzC,+DAA+D"}
@@ -0,0 +1,29 @@
1
+ /** 原生音频播放控制 */
2
+ export interface Audio {
3
+ /** 播放音效 */
4
+ play(args: {
5
+ /** 音效 ID */
6
+ soundId: string;
7
+ /** 音量 0.0~1.0 */
8
+ volume?: number;
9
+ }): Promise<{
10
+ /** 是否正在播放 */
11
+ playing: boolean;
12
+ /** 音效 ID */
13
+ soundId: string;
14
+ }>;
15
+ /** 停止当前播放 */
16
+ stop(): Promise<{
17
+ /** 是否成功 */
18
+ success: boolean;
19
+ }>;
20
+ /** 预加载音效到内存 */
21
+ preload(args: {
22
+ /** 音效 ID 列表 */
23
+ soundIds: string[];
24
+ }): Promise<{
25
+ /** 成功预加载的资源数量 */
26
+ preloaded: number;
27
+ }>;
28
+ }
29
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../generated/audio.ts"],"names":[],"mappings":"AAKA,eAAe;AACf,MAAM,WAAW,KAAK;IACpB,WAAW;IACX,IAAI,CAAC,IAAI,EAAE;QACT,YAAY;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QACV,aAAa;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY;QACZ,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IAEH,aAAa;IACb,IAAI,IAAI,OAAO,CAAC;QACd,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IAEH,eAAe;IACf,OAAO,CAAC,IAAI,EAAE;QACZ,eAAe;QACf,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,GAAG,OAAO,CAAC;QACV,iBAAiB;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ // ============================================================
2
+ // 此文件由 h5_app_container_generator 自动生成,请勿手动修改。
3
+ // 运行 `dart run build_runner build` 重新生成。
4
+ // ============================================================
5
+ export {};
6
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../generated/audio.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+CAA+C;AAC/C,yCAAyC;AACzC,+DAA+D"}
@@ -0,0 +1,23 @@
1
+ /** 设备能力调用 */
2
+ export interface Device {
3
+ /** 触发设备震动 */
4
+ vibrate(args: {
5
+ /** 震动时长(毫秒) */
6
+ duration?: number;
7
+ }): Promise<{
8
+ /** 是否成功 */
9
+ success: boolean;
10
+ }>;
11
+ /** 获取设备信息 */
12
+ getDeviceInfo(): Promise<{
13
+ /** 平台标识(ios / android) */
14
+ platform: string;
15
+ /** 系统版本号 */
16
+ version: string;
17
+ /** 屏幕宽度(逻辑像素) */
18
+ screenWidth: number;
19
+ /** 屏幕高度(逻辑像素) */
20
+ screenHeight: number;
21
+ }>;
22
+ }
23
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../generated/device.ts"],"names":[],"mappings":"AAKA,aAAa;AACb,MAAM,WAAW,MAAM;IACrB,aAAa;IACb,OAAO,CAAC,IAAI,EAAE;QACZ,eAAe;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IAEH,aAAa;IACb,aAAa,IAAI,OAAO,CAAC;QACvB,0BAA0B;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ // ============================================================
2
+ // 此文件由 h5_app_container_generator 自动生成,请勿手动修改。
3
+ // 运行 `dart run build_runner build` 重新生成。
4
+ // ============================================================
5
+ export {};
6
+ //# sourceMappingURL=device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../generated/device.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+CAA+C;AAC/C,yCAAyC;AACzC,+DAA+D"}
@@ -0,0 +1,17 @@
1
+ import type { AiTutor } from './ai_tutor';
2
+ import type { Audio } from './audio';
3
+ import type { Device } from './device';
4
+ import type { User } from './user';
5
+ export type { AiTutor } from './ai_tutor';
6
+ export type { Audio } from './audio';
7
+ export type { Device } from './device';
8
+ export type { User } from './user';
9
+ /** 获取 ai_tutor 的类型安全代理 */
10
+ export declare function getAiTutor(): AiTutor;
11
+ /** 获取 audio 的类型安全代理 */
12
+ export declare function getAudio(): Audio;
13
+ /** 获取 device 的类型安全代理 */
14
+ export declare function getDevice(): Device;
15
+ /** 获取 user 的类型安全代理 */
16
+ export declare function getUser(): User;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAMnC,0BAA0B;AAC1B,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,uBAAuB;AACvB,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AAED,wBAAwB;AACxB,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,sBAAsB;AACtB,wBAAgB,OAAO,IAAI,IAAI,CAE9B"}
@@ -0,0 +1,25 @@
1
+ // ============================================================
2
+ // 此文件由 h5_app_container_generator 自动生成,请勿手动修改。
3
+ // 运行 `dart run build_runner build` 重新生成。
4
+ // ============================================================
5
+ import { bridge } from '../src/mrp-bridge';
6
+ // ============================================================
7
+ // 工厂函数(适用于任何上下文)
8
+ // ============================================================
9
+ /** 获取 ai_tutor 的类型安全代理 */
10
+ export function getAiTutor() {
11
+ return bridge.module('ai_tutor');
12
+ }
13
+ /** 获取 audio 的类型安全代理 */
14
+ export function getAudio() {
15
+ return bridge.module('audio');
16
+ }
17
+ /** 获取 device 的类型安全代理 */
18
+ export function getDevice() {
19
+ return bridge.module('device');
20
+ }
21
+ /** 获取 user 的类型安全代理 */
22
+ export function getUser() {
23
+ return bridge.module('user');
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+CAA+C;AAC/C,yCAAyC;AACzC,+DAA+D;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAW3C,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAE/D,0BAA0B;AAC1B,MAAM,UAAU,UAAU;IACxB,OAAO,MAAM,CAAC,MAAM,CAAU,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAC,MAAM,CAAQ,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,MAAM,CAAS,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,OAAO;IACrB,OAAO,MAAM,CAAC,MAAM,CAAO,MAAM,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /** 用户信息与进度管理 */
2
+ export interface User {
3
+ /** 获取当前学生信息 */
4
+ getProfile(): Promise<{
5
+ /** 学生姓名 */
6
+ name: string;
7
+ /** 当前等级 */
8
+ level: number;
9
+ /** 头像 URL */
10
+ avatar: string;
11
+ /** 年龄 */
12
+ age: number;
13
+ }>;
14
+ /** 保存学习进度 */
15
+ saveProgress(args: {
16
+ /** 当前页码 */
17
+ pageIndex: number;
18
+ /** 得分 */
19
+ score: number;
20
+ }): Promise<{
21
+ /** 是否成功 */
22
+ success: boolean;
23
+ }>;
24
+ }
25
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../generated/user.ts"],"names":[],"mappings":"AAKA,gBAAgB;AAChB,MAAM,WAAW,IAAI;IACnB,eAAe;IACf,UAAU,IAAI,OAAO,CAAC;QACpB,WAAW;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW;QACX,KAAK,EAAE,MAAM,CAAC;QACd,aAAa;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS;QACT,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;IAEH,aAAa;IACb,YAAY,CAAC,IAAI,EAAE;QACjB,WAAW;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS;QACT,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QACV,WAAW;QACX,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ // ============================================================
2
+ // 此文件由 h5_app_container_generator 自动生成,请勿手动修改。
3
+ // 运行 `dart run build_runner build` 重新生成。
4
+ // ============================================================
5
+ export {};
6
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../generated/user.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+CAA+C;AAC/C,yCAAyC;AACzC,+DAA+D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @h5-container/bridge-core-ts
3
+ *
4
+ * H5 端与 Flutter 容器通信的核心 SDK(零框架依赖)。
5
+ * 提供 Bridge 消息通信 + 原生模块类型安全调用。
6
+ *
7
+ * 适用于 React / Vue / Svelte / Vanilla JS 等任何前端框架。
8
+ * 所有 API 从此入口统一导出,消费者无需感知内部目录结构。
9
+ */
10
+ export { bridge, MrpBridge } from './mrp-bridge';
11
+ export type { BridgeMessage, MessageHandler, Unsubscribe, } from './mrp-bridge';
12
+ export { getSystemModule } from './system-module';
13
+ export type { SystemModule, ModuleAllowedResult, AvailableModulesResult, ContainerInfoResult, } from './system-module';
14
+ export * from '../generated/index';
15
+ export { lifecycle } from './lifecycle';
16
+ export type { RouteChangedPayload, AppMountedPayload } from './lifecycle';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @h5-container/bridge-core-ts
3
+ *
4
+ * H5 端与 Flutter 容器通信的核心 SDK(零框架依赖)。
5
+ * 提供 Bridge 消息通信 + 原生模块类型安全调用。
6
+ *
7
+ * 适用于 React / Vue / Svelte / Vanilla JS 等任何前端框架。
8
+ * 所有 API 从此入口统一导出,消费者无需感知内部目录结构。
9
+ */
10
+ // 核心 Bridge
11
+ export { bridge, MrpBridge } from './mrp-bridge';
12
+ // 内置系统模块类型 + 工厂函数(容器核心契约)
13
+ export { getSystemModule } from './system-module';
14
+ // Generated 模块:类型 + 工厂函数
15
+ export * from '../generated/index';
16
+ // 生命周期上报工具
17
+ export { lifecycle } from './lifecycle';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY;AACZ,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOjD,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAQlD,yBAAyB;AACzB,cAAc,oBAAoB,CAAC;AAEnC,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * H5 容器生命周期上报工具。
3
+ *
4
+ * 提供类型安全的生命周期事件上报接口,H5 应用通过此模块通知
5
+ * Flutter 宿主当前的运行状态。
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { lifecycle } from '@h5-container/bridge-core-ts';
10
+ *
11
+ * // React
12
+ * useEffect(() => {
13
+ * lifecycle.appMounted({ route: location.pathname });
14
+ * return () => lifecycle.appDestroyed();
15
+ * }, []);
16
+ *
17
+ * // 路由跳转
18
+ * lifecycle.routeChanged({ from: '/home', to: '/game' });
19
+ *
20
+ * // 自定义事件
21
+ * lifecycle.custom('gameStarted', { level: 1 });
22
+ * ```
23
+ */
24
+ /** SPA 路由跳转事件的 payload */
25
+ export interface RouteChangedPayload {
26
+ /** 跳转前路由 */
27
+ from: string;
28
+ /** 跳转后路由 */
29
+ to: string;
30
+ }
31
+ /** appMounted 事件的 payload */
32
+ export interface AppMountedPayload {
33
+ /** 当前路由(可选) */
34
+ route?: string;
35
+ }
36
+ /**
37
+ * H5 容器生命周期上报 API。
38
+ *
39
+ * 调用这些方法通知宿主 Flutter 应用当前 H5 的运行状态。
40
+ * 宿主通过 `controller.onContainerEvent` 流接收事件。
41
+ */
42
+ export declare const lifecycle: {
43
+ /**
44
+ * 上报 H5 应用挂载完成。
45
+ *
46
+ * 建议在 React 根组件 `useEffect` 或 Vue `onMounted` 中调用。
47
+ */
48
+ readonly appMounted: (payload?: AppMountedPayload) => void;
49
+ /**
50
+ * 上报 H5 应用销毁。
51
+ *
52
+ * 建议在 React 根组件 `useEffect` 的 cleanup 或 Vue `onUnmounted` 中调用。
53
+ */
54
+ readonly appDestroyed: () => void;
55
+ /**
56
+ * 上报 SPA 内部路由跳转。
57
+ *
58
+ * 建议在路由守卫或 React Router 的 `useLocation` 变化时调用。
59
+ */
60
+ readonly routeChanged: (payload: RouteChangedPayload) => void;
61
+ /**
62
+ * 上报页面恢复可见(`visibilitychange: visible`)。
63
+ *
64
+ * 建议监听 `document.addEventListener('visibilitychange', ...)` 后调用。
65
+ */
66
+ readonly pageVisible: () => void;
67
+ /**
68
+ * 上报页面进入后台(`visibilitychange: hidden`)。
69
+ */
70
+ readonly pageHidden: () => void;
71
+ /**
72
+ * 上报自定义事件(业务自定义语义)。
73
+ *
74
+ * @param action 事件名称(宿主侧收到 `event.action` 即此值,type 为 `custom`)
75
+ * @param payload 事件数据
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * lifecycle.custom('gameStarted', { level: 1, mode: 'easy' });
80
+ * lifecycle.custom('scoreUpdated', { score: 200 });
81
+ * ```
82
+ */
83
+ readonly custom: (action: string, payload?: Record<string, unknown>) => void;
84
+ };
85
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,0BAA0B;AAC1B,MAAM,WAAW,mBAAmB;IAClC,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD;;;;;GAKG;AACH,eAAO,MAAM,SAAS;IACpB;;;;OAIG;oCACkB,iBAAiB,KAAG,IAAI;IAI7C;;;;OAIG;iCACa,IAAI;IAIpB;;;;OAIG;qCACmB,mBAAmB,KAAG,IAAI;IAIhD;;;;OAIG;gCACY,IAAI;IAInB;;OAEG;+BACW,IAAI;IAIlB;;;;;;;;;;;OAWG;8BACY,MAAM,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAAI;CAGvD,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * H5 容器生命周期上报工具。
3
+ *
4
+ * 提供类型安全的生命周期事件上报接口,H5 应用通过此模块通知
5
+ * Flutter 宿主当前的运行状态。
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { lifecycle } from '@h5-container/bridge-core-ts';
10
+ *
11
+ * // React
12
+ * useEffect(() => {
13
+ * lifecycle.appMounted({ route: location.pathname });
14
+ * return () => lifecycle.appDestroyed();
15
+ * }, []);
16
+ *
17
+ * // 路由跳转
18
+ * lifecycle.routeChanged({ from: '/home', to: '/game' });
19
+ *
20
+ * // 自定义事件
21
+ * lifecycle.custom('gameStarted', { level: 1 });
22
+ * ```
23
+ */
24
+ // ============================================================
25
+ // 工具函数
26
+ // ============================================================
27
+ /** 底层上报函数,通过 Bridge 发送 lifecycle 类型消息。 */
28
+ function report(action, payload = {}) {
29
+ if (window.__FLUTTER_BRIDGE__) {
30
+ window.__FLUTTER_BRIDGE__.send('lifecycle', action, payload);
31
+ }
32
+ }
33
+ // ============================================================
34
+ // 生命周期对象(命名空间风格,方便 tree-shaking)
35
+ // ============================================================
36
+ /**
37
+ * H5 容器生命周期上报 API。
38
+ *
39
+ * 调用这些方法通知宿主 Flutter 应用当前 H5 的运行状态。
40
+ * 宿主通过 `controller.onContainerEvent` 流接收事件。
41
+ */
42
+ export const lifecycle = {
43
+ /**
44
+ * 上报 H5 应用挂载完成。
45
+ *
46
+ * 建议在 React 根组件 `useEffect` 或 Vue `onMounted` 中调用。
47
+ */
48
+ appMounted(payload) {
49
+ report('appMounted', payload ?? {});
50
+ },
51
+ /**
52
+ * 上报 H5 应用销毁。
53
+ *
54
+ * 建议在 React 根组件 `useEffect` 的 cleanup 或 Vue `onUnmounted` 中调用。
55
+ */
56
+ appDestroyed() {
57
+ report('appDestroyed');
58
+ },
59
+ /**
60
+ * 上报 SPA 内部路由跳转。
61
+ *
62
+ * 建议在路由守卫或 React Router 的 `useLocation` 变化时调用。
63
+ */
64
+ routeChanged(payload) {
65
+ report('routeChanged', payload);
66
+ },
67
+ /**
68
+ * 上报页面恢复可见(`visibilitychange: visible`)。
69
+ *
70
+ * 建议监听 `document.addEventListener('visibilitychange', ...)` 后调用。
71
+ */
72
+ pageVisible() {
73
+ report('pageVisible');
74
+ },
75
+ /**
76
+ * 上报页面进入后台(`visibilitychange: hidden`)。
77
+ */
78
+ pageHidden() {
79
+ report('pageHidden');
80
+ },
81
+ /**
82
+ * 上报自定义事件(业务自定义语义)。
83
+ *
84
+ * @param action 事件名称(宿主侧收到 `event.action` 即此值,type 为 `custom`)
85
+ * @param payload 事件数据
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * lifecycle.custom('gameStarted', { level: 1, mode: 'easy' });
90
+ * lifecycle.custom('scoreUpdated', { score: 200 });
91
+ * ```
92
+ */
93
+ custom(action, payload) {
94
+ report(action, payload ?? {});
95
+ },
96
+ };
97
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAoBH,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAE/D,0CAA0C;AAC1C,SAAS,MAAM,CAAC,MAAc,EAAE,UAAkB,EAAE;IAClD,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAC5B,WAAW,EACX,MAAM,EACN,OAAkC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,iCAAiC;AACjC,+DAA+D;AAE/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;;;;OAIG;IACH,UAAU,CAAC,OAA2B;QACpC,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,MAAM,CAAC,cAAc,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,OAA4B;QACvC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,MAAM,CAAC,aAAa,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,MAAc,EAAE,OAAiC;QACtD,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;CACO,CAAC"}