@dino-dev/bridge-core-ts 0.0.4 → 0.0.5

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,24 @@
1
+ /**
2
+ * iframe 宿主模式:H5 被嵌在网页 iframe 里(如教研后台的实时预览)时,把父窗口当作原生容器。
3
+ *
4
+ * 触发条件:页面在 iframe 内,且 URL 带 `nl_host=iframe&nl_host_origin=<父窗口 origin>`。
5
+ * 父窗口 origin 由宿主显式声明:只向它发消息、只收它发来的消息,其它来源一律忽略。
6
+ *
7
+ * H5 业务代码无需改动:`bridge.whenReady()` / `bindRenderProtocol` / `bindAgentProtocol`
8
+ * 照常工作。原生模块在预览里不可用(`system` 除外),调用返回 `null` 并通知宿主记录。
9
+ *
10
+ * 线格式(postMessage,均带 `__nlBridge: 1`):
11
+ * - H5 → 宿主:`{ kind: 'send', type, action, payload }`
12
+ * - H5 → 宿主:`{ kind: 'module', namespace, method }`(预览里不可用的原生调用)
13
+ * - 宿主 → H5:`{ kind: 'message', type, action, payload }`
14
+ */
15
+ export declare const IFRAME_HOST_PARAM = "nl_host";
16
+ export declare const IFRAME_HOST_ORIGIN_PARAM = "nl_host_origin";
17
+ export declare const IFRAME_HOST_MARK = "__nlBridge";
18
+ /**
19
+ * 满足触发条件时安装 iframe 宿主桥;已在原生容器内或条件不满足时什么都不做。
20
+ *
21
+ * @returns 是否已安装
22
+ */
23
+ export declare function installIframeHostBridge(): boolean;
24
+ //# sourceMappingURL=iframe-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe-host.d.ts","sourceRoot":"","sources":["../../src/iframe-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,eAAO,MAAM,wBAAwB,mBAAmB,CAAC;AACzD,eAAO,MAAM,gBAAgB,eAAe,CAAC;AA4C7C;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAmGjD"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * iframe 宿主模式:H5 被嵌在网页 iframe 里(如教研后台的实时预览)时,把父窗口当作原生容器。
3
+ *
4
+ * 触发条件:页面在 iframe 内,且 URL 带 `nl_host=iframe&nl_host_origin=<父窗口 origin>`。
5
+ * 父窗口 origin 由宿主显式声明:只向它发消息、只收它发来的消息,其它来源一律忽略。
6
+ *
7
+ * H5 业务代码无需改动:`bridge.whenReady()` / `bindRenderProtocol` / `bindAgentProtocol`
8
+ * 照常工作。原生模块在预览里不可用(`system` 除外),调用返回 `null` 并通知宿主记录。
9
+ *
10
+ * 线格式(postMessage,均带 `__nlBridge: 1`):
11
+ * - H5 → 宿主:`{ kind: 'send', type, action, payload }`
12
+ * - H5 → 宿主:`{ kind: 'module', namespace, method }`(预览里不可用的原生调用)
13
+ * - 宿主 → H5:`{ kind: 'message', type, action, payload }`
14
+ */
15
+ export const IFRAME_HOST_PARAM = 'nl_host';
16
+ export const IFRAME_HOST_ORIGIN_PARAM = 'nl_host_origin';
17
+ export const IFRAME_HOST_MARK = '__nlBridge';
18
+ const DESIGN_LONG_SIDE = 812;
19
+ function isHostEnvelope(data) {
20
+ return (typeof data === 'object' &&
21
+ data !== null &&
22
+ data[IFRAME_HOST_MARK] === 1);
23
+ }
24
+ function resolveHostOrigin() {
25
+ if (!window.parent || window.parent === window || !window.location)
26
+ return null;
27
+ const params = new URLSearchParams(window.location.search);
28
+ if (params.get(IFRAME_HOST_PARAM) !== 'iframe')
29
+ return null;
30
+ const raw = params.get(IFRAME_HOST_ORIGIN_PARAM);
31
+ if (!raw)
32
+ return null;
33
+ try {
34
+ const origin = new URL(raw).origin;
35
+ return origin === 'null' ? null : origin;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ function currentAdaptation() {
42
+ const screenWidth = window.innerWidth;
43
+ const screenHeight = window.innerHeight;
44
+ return {
45
+ designLongSide: DESIGN_LONG_SIDE,
46
+ screenWidth,
47
+ screenHeight,
48
+ scale: Math.max(screenWidth, screenHeight) / DESIGN_LONG_SIDE,
49
+ safeArea: { top: 0, bottom: 0, left: 0, right: 0 },
50
+ };
51
+ }
52
+ /**
53
+ * 满足触发条件时安装 iframe 宿主桥;已在原生容器内或条件不满足时什么都不做。
54
+ *
55
+ * @returns 是否已安装
56
+ */
57
+ export function installIframeHostBridge() {
58
+ if (typeof window === 'undefined' || window.__FLUTTER_BRIDGE__)
59
+ return false;
60
+ const hostOrigin = resolveHostOrigin();
61
+ if (!hostOrigin)
62
+ return false;
63
+ const post = (kind, body) => {
64
+ window.parent.postMessage({ [IFRAME_HOST_MARK]: 1, kind, ...body }, hostOrigin);
65
+ };
66
+ const dispatch = (type, action, payload) => {
67
+ const message = {
68
+ type,
69
+ action,
70
+ payload,
71
+ timestamp: Date.now(),
72
+ };
73
+ window.dispatchEvent(new CustomEvent('flutterMessage', { detail: message }));
74
+ };
75
+ window.addEventListener('message', (event) => {
76
+ if (event.source !== window.parent || event.origin !== hostOrigin)
77
+ return;
78
+ const data = event.data;
79
+ if (!isHostEnvelope(data) || data.kind !== 'message')
80
+ return;
81
+ if (typeof data.type !== 'string' || typeof data.action !== 'string')
82
+ return;
83
+ const payload = typeof data.payload === 'object' && data.payload !== null
84
+ ? data.payload
85
+ : {};
86
+ dispatch(data.type, data.action, payload);
87
+ });
88
+ window.addEventListener('resize', () => {
89
+ dispatch('adaptation', 'changed', currentAdaptation());
90
+ });
91
+ const systemModule = {
92
+ isModuleAllowed: () => ({ allowed: false, namespace: '' }),
93
+ getAvailableModules: () => ({ modules: [] }),
94
+ getContainerInfo: () => ({
95
+ packageId: null,
96
+ registeredModules: [],
97
+ allowedModules: [],
98
+ adaptation: currentAdaptation(),
99
+ isIframeHost: true,
100
+ }),
101
+ };
102
+ const moduleProxy = (namespace) => new Proxy({}, {
103
+ // bridge.module() 用 `NativeModules[ns][method]` 做存在性判断,必须恒为真
104
+ has: () => true,
105
+ get: (_target, method) => {
106
+ if (typeof method !== 'string')
107
+ return undefined;
108
+ return async () => {
109
+ if (namespace === 'system' && method in systemModule) {
110
+ return systemModule[method]();
111
+ }
112
+ post('module', { namespace, method });
113
+ return null;
114
+ };
115
+ },
116
+ });
117
+ window.NativeModules = new Proxy({}, {
118
+ has: () => true,
119
+ get: (_target, namespace) => typeof namespace === 'string' ? moduleProxy(namespace) : undefined,
120
+ });
121
+ window.__FLUTTER_BRIDGE__ = {
122
+ send: async (type, action, payload) => {
123
+ post('send', { type, action, payload });
124
+ return null;
125
+ },
126
+ onMessage: (jsonString) => {
127
+ try {
128
+ const message = JSON.parse(jsonString);
129
+ dispatch(message.type, message.action, message.payload);
130
+ }
131
+ catch (e) {
132
+ console.error('[MRP Bridge] iframe 宿主消息解析失败:', e);
133
+ }
134
+ },
135
+ };
136
+ return true;
137
+ }
138
+ //# sourceMappingURL=iframe-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe-host.js","sourceRoot":"","sources":["../../src/iframe-host.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  export { bridge, MrpBridge } from './mrp-bridge';
11
11
  export type { BridgeMessage, MessageHandler, Unsubscribe } from './mrp-bridge';
12
+ export { IFRAME_HOST_MARK, IFRAME_HOST_ORIGIN_PARAM, IFRAME_HOST_PARAM, } from './iframe-host';
12
13
  export { getSystemModule } from './system-module';
13
14
  export type { SystemModule, ModuleAllowedResult, AvailableModulesResult, ContainerInfoResult, ArAdaptationInfo, SafeAreaInsets, } from './system-module';
14
15
  export { ar, getArScale, getSafeArea, initArAdaptation, onArAdaptationChange, } from './adaptation';
@@ -1 +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,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EACX,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACN,EAAE,EACF,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG1E,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,aAAa,GACb,MAAM,oBAAoB,CAAC"}
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,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EACX,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACN,EAAE,EACF,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG1E,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,aAAa,GACb,MAAM,oBAAoB,CAAC"}
package/dist/src/index.js CHANGED
@@ -9,6 +9,8 @@
9
9
  */
10
10
  // 核心 Bridge
11
11
  export { bridge, MrpBridge } from './mrp-bridge';
12
+ // iframe 宿主模式(网页内嵌预览)的契约常量
13
+ export { IFRAME_HOST_MARK, IFRAME_HOST_ORIGIN_PARAM, IFRAME_HOST_PARAM, } from './iframe-host';
12
14
  // 内置系统模块类型 + 工厂函数(容器核心契约)
13
15
  export { getSystemModule } from './system-module';
14
16
  // App/H5 统一屏幕适配
@@ -1 +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;AAGjD,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAUlD,gBAAgB;AAChB,OAAO,EACN,EAAE,EACF,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,cAAc,CAAC;AAGtB,yBAAyB;AACzB,cAAc,oBAAoB,CAAC;AAEnC,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,iBAAiB;AACjB,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GACd,MAAM,oBAAoB,CAAC"}
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;AAGjD,2BAA2B;AAC3B,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,eAAe,CAAC;AAEvB,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAUlD,gBAAgB;AAChB,OAAO,EACN,EAAE,EACF,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,cAAc,CAAC;AAGtB,yBAAyB;AACzB,cAAc,oBAAoB,CAAC;AAEnC,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,iBAAiB;AACjB,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GACd,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * 浏览器 Mock Bridge —— 让 H5 页面脱离 App 容器,在 Chrome 里直接开发调试。
3
+ *
4
+ * 不安装时,浏览器环境下 `whenReady()` 永不 resolve、所有原生调用静默返回 `null`,
5
+ * 页面会停在空状态且不报错。安装后即可拿到可控的假数据与事件。
6
+ *
7
+ * 仅供开发使用,请通过子路径引入,避免被打进生产包:
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * if (import.meta.env.DEV) {
12
+ * const { installMockBridge } = await import('@h5-container/bridge-core-ts/mock');
13
+ * installMockBridge({
14
+ * packageId: 'student_micro_pages',
15
+ * allowedModules: ['user', 'audio', 'navigation'],
16
+ * modules: {
17
+ * user: { getProfile: { userId: '1', nickname: '测试同学' } },
18
+ * audio: { play: async () => ({ ok: true }) },
19
+ * },
20
+ * });
21
+ * }
22
+ * ```
23
+ */
24
+ import type { ArAdaptationInfo } from './system-module';
25
+ /**
26
+ * 单个模块的 mock 实现。
27
+ *
28
+ * 值可以是函数(接收原始调用参数),也可以是静态数据(直接作为返回值)。
29
+ */
30
+ export type MockModuleImpl = Record<string, ((...args: any[]) => unknown | Promise<unknown>) | unknown>;
31
+ /** 一次原生调用的记录 */
32
+ export interface MockCallRecord {
33
+ namespace: string;
34
+ method: string;
35
+ args: unknown[];
36
+ result: unknown;
37
+ /** 未命中 mock 定义时为 true */
38
+ missing: boolean;
39
+ timestamp: number;
40
+ }
41
+ export interface MockBridgeConfig {
42
+ /** 容器信息里的包 ID */
43
+ packageId?: string;
44
+ /**
45
+ * 授权模块白名单。
46
+ *
47
+ * 传入后会像真实容器一样拦截越权调用并返回 `MODULE_ACCESS_DENIED`,
48
+ * 可在浏览器阶段提前发现 `package.meta.json` 的 `allowedModules` 漏配。
49
+ * 不传则不做权限校验。
50
+ */
51
+ allowedModules?: string[];
52
+ /** 容器已注册模块列表,默认与 allowedModules 一致 */
53
+ registeredModules?: string[];
54
+ /** 屏幕适配信息,缺省字段按当前窗口尺寸推算 */
55
+ adaptation?: Partial<ArAdaptationInfo>;
56
+ /** 注入到 getContainerInfo().auth,供 h5_app_http 读取 */
57
+ auth?: Record<string, unknown>;
58
+ /** 追加到 getContainerInfo() 的其他字段 */
59
+ containerInfoExtra?: Record<string, unknown>;
60
+ /** 各命名空间的 mock 实现 */
61
+ modules?: Record<string, MockModuleImpl>;
62
+ /** 处理 `bridge.send()`,返回值作为调用方收到的结果 */
63
+ onSend?: (type: string, action: string, payload: Record<string, unknown>) => unknown;
64
+ /** 是否打印调用日志,默认 true */
65
+ log?: boolean;
66
+ /** 窗口尺寸变化时自动重算并广播 adaptation,默认 true */
67
+ followWindowResize?: boolean;
68
+ }
69
+ /** 安装后返回的控制句柄 */
70
+ export interface MockBridgeHandle {
71
+ /** 模拟一条 Native → H5 消息 */
72
+ emit(type: string, action: string, payload?: Record<string, unknown>): void;
73
+ /** 更新屏幕适配信息并广播 `adaptation/changed` */
74
+ setAdaptation(patch: Partial<ArAdaptationInfo>): void;
75
+ /** 按时间顺序记录的原生调用 */
76
+ readonly calls: MockCallRecord[];
77
+ /** 打印所有未命中 mock 定义的调用,便于补齐 */
78
+ printMissing(): void;
79
+ /** 卸载 mock,恢复安装前的 window 状态 */
80
+ uninstall(): void;
81
+ }
82
+ declare global {
83
+ interface Window {
84
+ /** 已安装的 Mock Bridge 句柄,可在控制台直接操作 */
85
+ __MRP_MOCK__?: MockBridgeHandle;
86
+ }
87
+ }
88
+ /**
89
+ * 安装 Mock Bridge。
90
+ *
91
+ * 已经在真实容器中运行时会直接跳过,因此可以无条件调用。
92
+ */
93
+ export declare function installMockBridge(config?: MockBridgeConfig): MockBridgeHandle | null;
94
+ /**
95
+ * 仅在非容器环境安装 mock,在真机/App 中自动跳过。
96
+ *
97
+ * 等价于 `installMockBridge`,语义更明确,适合直接写在入口文件里。
98
+ */
99
+ export declare const setupDevBridge: typeof installMockBridge;
100
+ //# sourceMappingURL=mock-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-bridge.d.ts","sourceRoot":"","sources":["../../src/mock-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,iBAAiB,CAAC;AAMxE;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAClC,MAAM,EACN,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAC1D,CAAC;AAEF,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,2BAA2B;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,mCAAmC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,uCAAuC;IACvC,MAAM,CAAC,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC;IACb,uBAAuB;IACvB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,iBAAiB;AACjB,MAAM,WAAW,gBAAgB;IAChC,0BAA0B;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5E,uCAAuC;IACvC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACtD,mBAAmB;IACnB,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;IACjC,8BAA8B;IAC9B,YAAY,IAAI,IAAI,CAAC;IACrB,+BAA+B;IAC/B,SAAS,IAAI,IAAI,CAAC;CAClB;AAUD,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,oCAAoC;QACpC,YAAY,CAAC,EAAE,gBAAgB,CAAC;KAChC;CACD;AAuBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,GAAE,gBAAqB,GAC3B,gBAAgB,GAAG,IAAI,CAgPzB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,0BAAoB,CAAC"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * 浏览器 Mock Bridge —— 让 H5 页面脱离 App 容器,在 Chrome 里直接开发调试。
3
+ *
4
+ * 不安装时,浏览器环境下 `whenReady()` 永不 resolve、所有原生调用静默返回 `null`,
5
+ * 页面会停在空状态且不报错。安装后即可拿到可控的假数据与事件。
6
+ *
7
+ * 仅供开发使用,请通过子路径引入,避免被打进生产包:
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * if (import.meta.env.DEV) {
12
+ * const { installMockBridge } = await import('@h5-container/bridge-core-ts/mock');
13
+ * installMockBridge({
14
+ * packageId: 'student_micro_pages',
15
+ * allowedModules: ['user', 'audio', 'navigation'],
16
+ * modules: {
17
+ * user: { getProfile: { userId: '1', nickname: '测试同学' } },
18
+ * audio: { play: async () => ({ ok: true }) },
19
+ * },
20
+ * });
21
+ * }
22
+ * ```
23
+ */
24
+ import { bridge } from './mrp-bridge';
25
+ // ============================================================
26
+ // 内部状态
27
+ // ============================================================
28
+ const MOCK_FLAG = '__MRP_MOCK_BRIDGE__';
29
+ const DEFAULT_DESIGN_LONG_SIDE = 812;
30
+ const ZERO_SAFE_AREA = { top: 0, bottom: 0, left: 0, right: 0 };
31
+ function buildAdaptation(patch) {
32
+ const screenWidth = patch?.screenWidth ?? window.innerWidth;
33
+ const screenHeight = patch?.screenHeight ?? window.innerHeight;
34
+ const designLongSide = patch?.designLongSide ?? DEFAULT_DESIGN_LONG_SIDE;
35
+ const scale = patch?.scale ?? Math.max(screenWidth, screenHeight) / designLongSide;
36
+ return {
37
+ designLongSide,
38
+ screenWidth,
39
+ screenHeight,
40
+ scale,
41
+ safeArea: patch?.safeArea ?? ZERO_SAFE_AREA,
42
+ };
43
+ }
44
+ // ============================================================
45
+ // 安装
46
+ // ============================================================
47
+ /**
48
+ * 安装 Mock Bridge。
49
+ *
50
+ * 已经在真实容器中运行时会直接跳过,因此可以无条件调用。
51
+ */
52
+ export function installMockBridge(config = {}) {
53
+ const existing = window.__MRP_MOCK__;
54
+ if (existing) {
55
+ console.warn('[Mock Bridge] 已安装,忽略重复调用');
56
+ return existing;
57
+ }
58
+ if (window.__FLUTTER_BRIDGE__) {
59
+ console.info('[Mock Bridge] 检测到真实原生容器,跳过安装');
60
+ return null;
61
+ }
62
+ const log = config.log ?? true;
63
+ const calls = [];
64
+ let adaptation = buildAdaptation(config.adaptation);
65
+ const previousNativeModules = window.NativeModules;
66
+ const emit = (type, action, payload = {}) => {
67
+ const message = {
68
+ type,
69
+ action,
70
+ payload,
71
+ timestamp: Date.now(),
72
+ };
73
+ if (log) {
74
+ console.log(`[Mock Bridge] → H5 ${type}/${action}`, payload);
75
+ }
76
+ window.dispatchEvent(new CustomEvent('flutterMessage', { detail: message }));
77
+ };
78
+ // ---- system 模块:容器内置,始终可用 ----
79
+ const systemModule = {
80
+ isModuleAllowed: (params) => ({
81
+ allowed: isAllowed(params?.namespace),
82
+ namespace: params?.namespace,
83
+ }),
84
+ getAvailableModules: () => ({
85
+ modules: config.registeredModules ?? config.allowedModules ?? [],
86
+ }),
87
+ getContainerInfo: () => ({
88
+ packageId: config.packageId ?? 'mock_package',
89
+ registeredModules: config.registeredModules ?? config.allowedModules ?? [],
90
+ allowedModules: config.allowedModules ?? null,
91
+ adaptation,
92
+ auth: config.auth,
93
+ debugEnabled: true,
94
+ isMockBridge: true,
95
+ ...config.containerInfoExtra,
96
+ }),
97
+ };
98
+ function isAllowed(namespace) {
99
+ if (namespace === 'system')
100
+ return true;
101
+ if (!config.allowedModules)
102
+ return true;
103
+ return config.allowedModules.includes(namespace);
104
+ }
105
+ function resolveImpl(namespace, method) {
106
+ if (namespace === 'system')
107
+ return systemModule[method];
108
+ return config.modules?.[namespace]?.[method];
109
+ }
110
+ // ---- NativeModules 代理 ----
111
+ const moduleProxyCache = new Map();
112
+ function createModuleProxy(namespace) {
113
+ const cached = moduleProxyCache.get(namespace);
114
+ if (cached)
115
+ return cached;
116
+ const proxy = new Proxy({}, {
117
+ // module() 用 `NativeModules[ns][method]` 做存在性判断,必须恒为真
118
+ has: () => true,
119
+ get: (_target, method) => {
120
+ if (typeof method !== 'string')
121
+ return undefined;
122
+ return async (...args) => {
123
+ if (!isAllowed(namespace)) {
124
+ console.error(`[Mock Bridge] 模块 "${namespace}" 不在 allowedModules 中,` +
125
+ `调用 ${namespace}.${method} 被拒绝。` +
126
+ '请检查 package.meta.json 的 allowedModules。');
127
+ return {
128
+ __error__: 'MODULE_ACCESS_DENIED',
129
+ __message__: `Module "${namespace}" not allowed`,
130
+ };
131
+ }
132
+ const impl = resolveImpl(namespace, method);
133
+ const missing = impl === undefined;
134
+ const result = missing
135
+ ? null
136
+ : typeof impl === 'function'
137
+ ? await impl(...args)
138
+ : impl;
139
+ calls.push({
140
+ namespace,
141
+ method,
142
+ args,
143
+ result,
144
+ missing,
145
+ timestamp: Date.now(),
146
+ });
147
+ if (missing) {
148
+ console.warn(`[Mock Bridge] 未定义 ${namespace}.${method},返回 null。` +
149
+ `可在 installMockBridge 的 modules.${namespace}.${method} 中补充。`, { args });
150
+ }
151
+ else if (log) {
152
+ console.log(`[Mock Bridge] ${namespace}.${method}`, {
153
+ args,
154
+ result,
155
+ });
156
+ }
157
+ return result;
158
+ };
159
+ },
160
+ });
161
+ moduleProxyCache.set(namespace, proxy);
162
+ return proxy;
163
+ }
164
+ window.NativeModules = new Proxy({}, {
165
+ has: () => true,
166
+ get: (_target, namespace) => {
167
+ if (typeof namespace !== 'string')
168
+ return undefined;
169
+ return createModuleProxy(namespace);
170
+ },
171
+ });
172
+ // ---- __FLUTTER_BRIDGE__ ----
173
+ window.__FLUTTER_BRIDGE__ = {
174
+ send: async (type, action, payload) => {
175
+ const result = config.onSend?.(type, action, payload) ?? null;
176
+ if (log) {
177
+ console.log(`[Mock Bridge] H5 → ${type}/${action}`, payload);
178
+ }
179
+ return result;
180
+ },
181
+ onMessage: (jsonString) => {
182
+ try {
183
+ const message = JSON.parse(jsonString);
184
+ emit(message.type, message.action, message.payload);
185
+ }
186
+ catch (e) {
187
+ console.error('[Mock Bridge] onMessage 解析失败:', e);
188
+ }
189
+ },
190
+ };
191
+ window.__FLUTTER_BRIDGE__[MOCK_FLAG] = true;
192
+ // ---- 窗口尺寸联动 ----
193
+ const handleResize = () => {
194
+ adaptation = buildAdaptation({
195
+ ...config.adaptation,
196
+ screenWidth: window.innerWidth,
197
+ screenHeight: window.innerHeight,
198
+ scale: undefined,
199
+ });
200
+ emit('adaptation', 'changed', adaptation);
201
+ };
202
+ const followResize = config.followWindowResize ?? true;
203
+ if (followResize) {
204
+ window.addEventListener('resize', handleResize);
205
+ }
206
+ // ---- 句柄 ----
207
+ const handle = {
208
+ emit,
209
+ setAdaptation(patch) {
210
+ adaptation = buildAdaptation({ ...adaptation, ...patch });
211
+ emit('adaptation', 'changed', adaptation);
212
+ },
213
+ calls,
214
+ printMissing() {
215
+ const missing = calls.filter((c) => c.missing);
216
+ if (missing.length === 0) {
217
+ console.log('[Mock Bridge] 所有原生调用都已命中 mock 定义');
218
+ return;
219
+ }
220
+ console.table(missing.map((c) => ({
221
+ 调用: `${c.namespace}.${c.method}`,
222
+ 参数: JSON.stringify(c.args),
223
+ })));
224
+ },
225
+ uninstall() {
226
+ if (followResize) {
227
+ window.removeEventListener('resize', handleResize);
228
+ }
229
+ delete window.__FLUTTER_BRIDGE__;
230
+ window.NativeModules = previousNativeModules;
231
+ delete window.__MRP_MOCK__;
232
+ },
233
+ };
234
+ window.__MRP_MOCK__ = handle;
235
+ // 唤醒可能已结束的就绪轮询,让 whenReady() 立即 resolve
236
+ bridge.refreshReady();
237
+ console.info(`[Mock Bridge] 已安装(packageId=${config.packageId ?? 'mock_package'})。` +
238
+ '控制台可用 window.__MRP_MOCK__ 手工触发事件、查看调用记录。');
239
+ return handle;
240
+ }
241
+ /**
242
+ * 仅在非容器环境安装 mock,在真机/App 中自动跳过。
243
+ *
244
+ * 等价于 `installMockBridge`,语义更明确,适合直接写在入口文件里。
245
+ */
246
+ export const setupDevBridge = installMockBridge;
247
+ //# sourceMappingURL=mock-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-bridge.js","sourceRoot":"","sources":["../../src/mock-bridge.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,13 @@ declare global {
41
41
  NativeModules?: Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;
42
42
  }
43
43
  }
44
+ /** Bridge 就绪状态 */
45
+ export type BridgeReadyState = 'pending' | 'ready' | 'unavailable';
46
+ /** `whenReady()` 选项 */
47
+ export interface WhenReadyOptions {
48
+ /** 超时毫秒数,超时后 Promise 以错误 reject;不传则沿用「永不 reject」的旧行为 */
49
+ timeoutMs?: number;
50
+ }
44
51
  /**
45
52
  * Bridge SDK 主类。
46
53
  *
@@ -55,10 +62,25 @@ export declare class MrpBridge {
55
62
  private _readyPromiseResolve;
56
63
  private _readyPromise;
57
64
  private _retryCount;
65
+ private _readyState;
66
+ private _readyTimer;
58
67
  constructor();
59
68
  private _checkReady;
60
- /** 等待 Bridge 就绪 */
61
- whenReady(): Promise<void>;
69
+ /**
70
+ * 重新触发一次就绪检测。
71
+ *
72
+ * 供 Mock Bridge 在注入后立即生效使用;轮询已结束时也能重新唤醒。
73
+ */
74
+ refreshReady(): void;
75
+ /** 当前就绪状态:等待中 / 已就绪 / 判定为不在容器环境 */
76
+ get readyState(): BridgeReadyState;
77
+ /**
78
+ * 等待 Bridge 就绪。
79
+ *
80
+ * 默认沿用旧语义:未就绪时 Promise 一直挂起、不会 reject。
81
+ * 传入 `timeoutMs` 可在超时后 reject,便于页面给出明确的错误态。
82
+ */
83
+ whenReady(options?: WhenReadyOptions): Promise<void>;
62
84
  /** 是否在 Flutter WebView 容器中运行 */
63
85
  get isInContainer(): boolean;
64
86
  /**
@@ -102,7 +124,6 @@ export declare class MrpBridge {
102
124
  */
103
125
  module<T extends object = Record<string, (...args: any[]) => Promise<any>>>(namespace: string): T;
104
126
  }
105
- /** Bridge 单例实例 */
106
127
  export declare const bridge: MrpBridge;
107
128
  export default bridge;
108
129
  //# sourceMappingURL=mrp-bridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mrp-bridge.d.ts","sourceRoot":"","sources":["../../src/mrp-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,kBAAkB;AAClB,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,aAAa;AACb,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CACxD,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KACtB,IAAI,CAAC;AAEV,aAAa;AACb,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAMrC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,oBAAoB;QACpB,SAAS,EAAE,SAAS,CAAC;QACrB,2BAA2B;QAC3B,kBAAkB,CAAC,EAAE;YACnB,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;YACpB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;SACrC,CAAC;QACF,yBAAyB;QACzB,aAAa,CAAC,EAAE,MAAM,CACpB,MAAM,EACN,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CACzD,CAAC;KACH;CACF;AAsBD;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAK;;IA0BxB,OAAO,CAAC,WAAW;IAkBnB,mBAAmB;IACnB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,gCAAgC;IAChC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAID;;;;;OAKG;IACH,IAAI,CAAC,CAAC,GAAG,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,OAAO,CAAC,CAAC,CAAC;IASb,OAAO,CAAC,OAAO;IAaf;;;OAGG;IACH,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,WAAW;IASd;;;;OAIG;IACH,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,WAAW;IAmBd;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CACJ,CAAC,SAAS,MAAM,GAAG,MAAM,CACvB,MAAM,EACN,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CACjC,EACD,SAAS,EAAE,MAAM,GAAG,CAAC;CA8BxB;AAMD,kBAAkB;AAClB,eAAO,MAAM,MAAM,WAAkB,CAAC;AAKtC,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"mrp-bridge.d.ts","sourceRoot":"","sources":["../../src/mrp-bridge.ts"],"names":[],"mappings":"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"}