@ahnseungchan/webviewkit 1.2.0 → 1.3.0

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.
package/README.md CHANGED
@@ -81,13 +81,28 @@ import { StackDevRoadmap } from "@ahnseungchan/webviewkit";
81
81
  | `BackRouter` | 뒤로가기 버튼 |
82
82
  | `StackHeader` | 경로 표시 헤더 |
83
83
  | `StackDevRoadmap` | 스택 로드맵 오버레이 |
84
+ | `WebViewBridgeProvider` | RN/Flutter 브릿지 (protocol v1) |
85
+ | `getStackRouterBridge` | web → native 스택 호출 |
84
86
  | `STACK_TRANSITION_MS` | 전환 ms 상수 (`500`) |
85
87
  | `Direction`, `HistoryAction` | 타입·enum |
86
88
 
87
- ## 골디 앱 연동 참고
89
+ ## Native Bridge (1.3.0)
88
90
 
89
- B2C WebView에서는 앱 브릿지(`stackRouterBridge`)와 함께 쓰는 경우가 많습니다.
90
- 이 패키지는 **웹 단독 스택 UI**이며, RN 브릿지와는 별도 레이어입니다.
91
+ 하이브리드 앱에서 **웹 스택 UI**와 **네이티브(WebView) 스택**을 같은 프로토콜로 맞출 때 사용합니다.
92
+ React Native · Flutter · 브라우저 단독 모두 지원합니다.
93
+
94
+ ```tsx
95
+ import { WebViewBridgeProvider, getStackRouterBridge } from "@ahnseungchan/webviewkit";
96
+
97
+ // native → web: router handlers / web → native: bridge client
98
+ <WebViewBridgeProvider stack={{ push, replace, pop, reset }} />;
99
+
100
+ await getStackRouterBridge()?.push("/detail");
101
+ ```
102
+
103
+ - Flutter: `stackPush` / `stackPop` 등 레거시 핸들러 또는 JSON envelope
104
+ - React Native: `ReactNativeWebView.postMessage`
105
+ - 프로토콜 상세: [docs/native-bridge-protocol.md](../../docs/native-bridge-protocol.md)
91
106
 
92
107
  ## License
93
108
 
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from "react";
2
+ import { type InstallBridgeHostOptions, type StackRouterHostHandlers } from "./host";
3
+ import { type CreateStackRouterBridgeOptions } from "./stack-router-bridge";
4
+ export type WebViewBridgeProviderProps = {
5
+ children?: ReactNode;
6
+ /** Native → web stack handlers (e.g. Next.js `router.push`) */
7
+ stack?: StackRouterHostHandlers;
8
+ transport?: CreateStackRouterBridgeOptions;
9
+ /** Install `window.stackRouterBridge` for web → native */
10
+ enableOutboundBridge?: boolean;
11
+ hostOptions?: Omit<InstallBridgeHostOptions, "stack" | "exposeStackRouterBridge" | "legacyInboundHandlers">;
12
+ };
13
+ /**
14
+ * Mount once near the app root (Next.js `layout`, SPA `App`).
15
+ * Wires protocol ingress + optional legacy window stack handlers.
16
+ */
17
+ export declare function WebViewBridgeProvider({ children, stack, transport, enableOutboundBridge, hostOptions, }: WebViewBridgeProviderProps): import("@emotion/react/jsx-runtime").JSX.Element;
18
+ //# sourceMappingURL=WebViewBridgeProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewBridgeProvider.d.ts","sourceRoot":"","sources":["../../src/bridge/WebViewBridgeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC7B,MAAM,QAAQ,CAAC;AAChB,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,uBAAuB,CAAC;IAChC,SAAS,CAAC,EAAE,8BAA8B,CAAC;IAC3C,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,IAAI,CAChB,wBAAwB,EACxB,OAAO,GAAG,yBAAyB,GAAG,uBAAuB,CAC9D,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,QAAe,EACf,KAAK,EACL,SAAS,EACT,oBAA2B,EAC3B,WAAW,GACZ,EAAE,0BAA0B,oDAiB5B"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebViewBridgeProvider = WebViewBridgeProvider;
4
+ const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const host_1 = require("./host");
7
+ const stack_router_bridge_1 = require("./stack-router-bridge");
8
+ /**
9
+ * Mount once near the app root (Next.js `layout`, SPA `App`).
10
+ * Wires protocol ingress + optional legacy window stack handlers.
11
+ */
12
+ function WebViewBridgeProvider({ children = null, stack, transport, enableOutboundBridge = true, hostOptions, }) {
13
+ (0, react_1.useEffect)(() => {
14
+ const outbound = enableOutboundBridge
15
+ ? (0, stack_router_bridge_1.createStackRouterBridge)(transport)
16
+ : undefined;
17
+ const cleanup = (0, host_1.installBridgeHost)({
18
+ stack,
19
+ legacyInboundHandlers: Boolean(stack),
20
+ exposeStackRouterBridge: outbound !== null && outbound !== void 0 ? outbound : false,
21
+ ...hostOptions,
22
+ });
23
+ return cleanup;
24
+ }, [stack, enableOutboundBridge, transport, hostOptions]);
25
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children });
26
+ }
@@ -0,0 +1,20 @@
1
+ import { type BridgeTransportOptions } from "./transport";
2
+ import { detectBridgeHost } from "./detect-host";
3
+ import type { BridgeTransport } from "./transport";
4
+ import { type BridgeEnvelope, type StackMeta } from "./protocol";
5
+ export type WebViewBridgeClientOptions = BridgeTransportOptions & {
6
+ transport?: BridgeTransport;
7
+ };
8
+ export declare class WebViewBridgeClient {
9
+ readonly host: ReturnType<typeof detectBridgeHost>;
10
+ private readonly transport;
11
+ constructor(options?: WebViewBridgeClientOptions);
12
+ send(envelope: BridgeEnvelope): Promise<void>;
13
+ request<TPayload = unknown>(method: string, payload?: TPayload): Promise<BridgeEnvelope<TPayload>>;
14
+ stackPush(url: string, meta?: StackMeta): Promise<BridgeEnvelope>;
15
+ stackReplace(url: string, meta?: StackMeta): Promise<BridgeEnvelope>;
16
+ stackPop(): Promise<BridgeEnvelope>;
17
+ stackReset(url: string, meta?: StackMeta): Promise<BridgeEnvelope>;
18
+ }
19
+ export declare function createWebViewBridgeClient(options?: WebViewBridgeClientOptions): WebViewBridgeClient;
20
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bridge/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,SAAS,EAGf,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,GAAG;IAChE,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;gBAEhC,OAAO,GAAE,0BAA+B;IAM9C,IAAI,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,OAAO,CAAC,QAAQ,GAAG,OAAO,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAMpC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,SAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAOvE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,SAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAO1E,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAInC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,SAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;CAMzE;AAED,wBAAgB,yBAAyB,CACvC,OAAO,CAAC,EAAE,0BAA0B,GACnC,mBAAmB,CAErB"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebViewBridgeClient = void 0;
4
+ exports.createWebViewBridgeClient = createWebViewBridgeClient;
5
+ const transport_1 = require("./transport");
6
+ const detect_host_1 = require("./detect-host");
7
+ const protocol_1 = require("./protocol");
8
+ class WebViewBridgeClient {
9
+ constructor(options = {}) {
10
+ var _a, _b, _c;
11
+ this.host = (_b = (_a = options.transport) === null || _a === void 0 ? void 0 : _a.host) !== null && _b !== void 0 ? _b : (0, detect_host_1.detectBridgeHost)();
12
+ this.transport =
13
+ (_c = options.transport) !== null && _c !== void 0 ? _c : (0, transport_1.createBridgeTransport)(this.host, options);
14
+ }
15
+ async send(envelope) {
16
+ await this.transport.send(envelope);
17
+ }
18
+ async request(method, payload) {
19
+ const envelope = (0, protocol_1.createBridgeEnvelope)(method, payload);
20
+ await this.send(envelope);
21
+ return envelope;
22
+ }
23
+ stackPush(url, meta = null) {
24
+ return this.request(protocol_1.STACK_BRIDGE_METHODS.PUSH, {
25
+ url,
26
+ meta,
27
+ });
28
+ }
29
+ stackReplace(url, meta = null) {
30
+ return this.request(protocol_1.STACK_BRIDGE_METHODS.REPLACE, {
31
+ url,
32
+ meta,
33
+ });
34
+ }
35
+ stackPop() {
36
+ return this.request(protocol_1.STACK_BRIDGE_METHODS.POP);
37
+ }
38
+ stackReset(url, meta = null) {
39
+ return this.request(protocol_1.STACK_BRIDGE_METHODS.RESET, {
40
+ url,
41
+ meta,
42
+ });
43
+ }
44
+ }
45
+ exports.WebViewBridgeClient = WebViewBridgeClient;
46
+ function createWebViewBridgeClient(options) {
47
+ return new WebViewBridgeClient(options);
48
+ }
@@ -0,0 +1,4 @@
1
+ import type { BridgeHostKind } from "./protocol";
2
+ export declare function detectBridgeHost(): BridgeHostKind;
3
+ export declare function isNativeBridgeHost(host: BridgeHostKind): boolean;
4
+ //# sourceMappingURL=detect-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-host.d.ts","sourceRoot":"","sources":["../../src/bridge/detect-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,gBAAgB,IAAI,cAAc,CAYjD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAEhE"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectBridgeHost = detectBridgeHost;
4
+ exports.isNativeBridgeHost = isNativeBridgeHost;
5
+ function detectBridgeHost() {
6
+ var _a, _b;
7
+ if (typeof window === "undefined")
8
+ return "unknown";
9
+ if ((_a = window.ReactNativeWebView) === null || _a === void 0 ? void 0 : _a.postMessage) {
10
+ return "react-native";
11
+ }
12
+ if ((_b = window.flutter_inappwebview) === null || _b === void 0 ? void 0 : _b.callHandler) {
13
+ return "flutter";
14
+ }
15
+ return "browser";
16
+ }
17
+ function isNativeBridgeHost(host) {
18
+ return host === "react-native" || host === "flutter";
19
+ }
@@ -0,0 +1,31 @@
1
+ import { type BridgeEnvelope, type StackMeta } from "./protocol";
2
+ import type { StackRouterBridge } from "./stack-router-bridge";
3
+ export type StackRouterHostHandlers = {
4
+ push: (url: string, meta?: StackMeta) => boolean | Promise<boolean>;
5
+ replace: (url: string, meta?: StackMeta) => boolean | Promise<boolean>;
6
+ pop: () => boolean | Promise<boolean>;
7
+ reset: (url: string, meta?: StackMeta) => boolean | Promise<boolean>;
8
+ };
9
+ export type InstallBridgeHostOptions = {
10
+ /** Native → web stack navigation */
11
+ stack?: StackRouterHostHandlers;
12
+ /** Custom method handlers keyed by envelope `method` */
13
+ handlers?: Record<string, (payload: unknown, envelope: BridgeEnvelope) => boolean | Promise<boolean>>;
14
+ /** Called for every valid envelope after routing */
15
+ onMessage?: (envelope: BridgeEnvelope) => void;
16
+ /**
17
+ * Expose `window.stackRouterBridge` for imperative web→native calls.
18
+ * Requires `createStackRouterBridge()` to be set separately or via `stackRouterBridge` option.
19
+ */
20
+ exposeStackRouterBridge?: StackRouterBridge | boolean;
21
+ /**
22
+ * Register `window.stackPush` / `stackPop` for Flutter native→web.
23
+ */
24
+ legacyInboundHandlers?: boolean;
25
+ };
26
+ export declare function handleBridgeMessage(raw: string | unknown, options: InstallBridgeHostOptions): Promise<boolean>;
27
+ export type BridgeHostCleanup = () => void;
28
+ export declare function installBridgeHost(options: InstallBridgeHostOptions): BridgeHostCleanup;
29
+ /** Emit a protocol envelope from web (e.g. for tests or custom native listeners) */
30
+ export declare function emitBridgeEnvelope(method: string, payload?: unknown): BridgeEnvelope;
31
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/bridge/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,GAAG,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,oCAAoC;IACpC,KAAK,CAAC,EAAE,uBAAuB,CAAC;IAChC,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAC3E,CAAC;IACF,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC;IACtD;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAqCF,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GAAG,OAAO,EACrB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC;AAE3C,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,iBAAiB,CAsCnB;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,GAChB,cAAc,CAEhB"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleBridgeMessage = handleBridgeMessage;
4
+ exports.installBridgeHost = installBridgeHost;
5
+ exports.emitBridgeEnvelope = emitBridgeEnvelope;
6
+ const protocol_1 = require("./protocol");
7
+ async function dispatchEnvelope(envelope, options) {
8
+ var _a, _b, _c, _d, _e;
9
+ (_a = options.onMessage) === null || _a === void 0 ? void 0 : _a.call(options, envelope);
10
+ const custom = (_b = options.handlers) === null || _b === void 0 ? void 0 : _b[envelope.method];
11
+ if (custom) {
12
+ return Boolean(await custom(envelope.payload, envelope));
13
+ }
14
+ const stack = options.stack;
15
+ if (!stack)
16
+ return false;
17
+ const payload = envelope.payload;
18
+ switch (envelope.method) {
19
+ case protocol_1.STACK_BRIDGE_METHODS.PUSH:
20
+ if (!(payload === null || payload === void 0 ? void 0 : payload.url))
21
+ return false;
22
+ return Boolean(await stack.push(payload.url, (_c = payload.meta) !== null && _c !== void 0 ? _c : null));
23
+ case protocol_1.STACK_BRIDGE_METHODS.REPLACE:
24
+ if (!(payload === null || payload === void 0 ? void 0 : payload.url))
25
+ return false;
26
+ return Boolean(await stack.replace(payload.url, (_d = payload.meta) !== null && _d !== void 0 ? _d : null));
27
+ case protocol_1.STACK_BRIDGE_METHODS.POP:
28
+ return Boolean(await stack.pop());
29
+ case protocol_1.STACK_BRIDGE_METHODS.RESET:
30
+ if (!(payload === null || payload === void 0 ? void 0 : payload.url))
31
+ return false;
32
+ return Boolean(await stack.reset(payload.url, (_e = payload.meta) !== null && _e !== void 0 ? _e : null));
33
+ default:
34
+ return false;
35
+ }
36
+ }
37
+ function handleBridgeMessage(raw, options) {
38
+ const envelope = (0, protocol_1.parseBridgeMessage)(raw);
39
+ if (!envelope)
40
+ return Promise.resolve(false);
41
+ return dispatchEnvelope(envelope, options);
42
+ }
43
+ function installBridgeHost(options) {
44
+ if (typeof window === "undefined") {
45
+ return () => undefined;
46
+ }
47
+ const inbound = (raw) => {
48
+ void handleBridgeMessage(raw, options);
49
+ };
50
+ window.webviewkitBridge = { postMessage: inbound };
51
+ if (options.legacyInboundHandlers !== false && options.stack) {
52
+ const { stack } = options;
53
+ window.stackPush = (url, meta) => Promise.resolve(stack.push(url, meta !== null && meta !== void 0 ? meta : null)).then(Boolean);
54
+ window.stackReplace = (url, meta) => Promise.resolve(stack.replace(url, meta !== null && meta !== void 0 ? meta : null)).then(Boolean);
55
+ window.stackPop = () => Promise.resolve(stack.pop()).then(Boolean);
56
+ window.stackReset = (url, meta) => Promise.resolve(stack.reset(url, meta !== null && meta !== void 0 ? meta : null)).then(Boolean);
57
+ }
58
+ if (options.exposeStackRouterBridge) {
59
+ if (typeof options.exposeStackRouterBridge === "object") {
60
+ window.stackRouterBridge = options.exposeStackRouterBridge;
61
+ }
62
+ }
63
+ return () => {
64
+ delete window.webviewkitBridge;
65
+ delete window.stackPush;
66
+ delete window.stackReplace;
67
+ delete window.stackPop;
68
+ delete window.stackReset;
69
+ if (options.exposeStackRouterBridge) {
70
+ delete window.stackRouterBridge;
71
+ }
72
+ };
73
+ }
74
+ /** Emit a protocol envelope from web (e.g. for tests or custom native listeners) */
75
+ function emitBridgeEnvelope(method, payload) {
76
+ return (0, protocol_1.createBridgeEnvelope)(method, payload);
77
+ }
@@ -0,0 +1,10 @@
1
+ export { BRIDGE_PROTOCOL_VERSION, BRIDGE_NAMESPACE, STACK_BRIDGE_METHODS, FLUTTER_LEGACY_STACK_HANDLERS, FLUTTER_UNIFIED_HANDLER, RN_BRIDGE_HANDLER, createBridgeId, createBridgeEnvelope, isBridgeEnvelope, parseBridgeMessage, serializeBridgeMessage, } from "./protocol";
2
+ export type { BridgeHostKind, StackBridgeMethod, StackMeta, StackPushPayload, StackReplacePayload, StackResetPayload, BridgeEnvelope, BridgeErrorBody, } from "./protocol";
3
+ export { detectBridgeHost, isNativeBridgeHost } from "./detect-host";
4
+ export { createBridgeTransport, type BridgeTransport, type BridgeTransportOptions, } from "./transport";
5
+ export { WebViewBridgeClient, createWebViewBridgeClient, type WebViewBridgeClientOptions, } from "./client";
6
+ export { installBridgeHost, handleBridgeMessage, emitBridgeEnvelope, type InstallBridgeHostOptions, type StackRouterHostHandlers, type BridgeHostCleanup, } from "./host";
7
+ export { createStackRouterBridge, getStackRouterBridge, installStackRouterBridge, type StackRouterBridge, type CreateStackRouterBridgeOptions, } from "./stack-router-bridge";
8
+ export { WebViewBridgeProvider } from "./WebViewBridgeProvider";
9
+ export type { WebViewBridgeProviderProps } from "./WebViewBridgeProvider";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,6BAA6B,EAC7B,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,0BAA0B,GAChC,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,GACvB,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,8BAA8B,GACpC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebViewBridgeProvider = exports.installStackRouterBridge = exports.getStackRouterBridge = exports.createStackRouterBridge = exports.emitBridgeEnvelope = exports.handleBridgeMessage = exports.installBridgeHost = exports.createWebViewBridgeClient = exports.WebViewBridgeClient = exports.createBridgeTransport = exports.isNativeBridgeHost = exports.detectBridgeHost = exports.serializeBridgeMessage = exports.parseBridgeMessage = exports.isBridgeEnvelope = exports.createBridgeEnvelope = exports.createBridgeId = exports.RN_BRIDGE_HANDLER = exports.FLUTTER_UNIFIED_HANDLER = exports.FLUTTER_LEGACY_STACK_HANDLERS = exports.STACK_BRIDGE_METHODS = exports.BRIDGE_NAMESPACE = exports.BRIDGE_PROTOCOL_VERSION = void 0;
4
+ var protocol_1 = require("./protocol");
5
+ Object.defineProperty(exports, "BRIDGE_PROTOCOL_VERSION", { enumerable: true, get: function () { return protocol_1.BRIDGE_PROTOCOL_VERSION; } });
6
+ Object.defineProperty(exports, "BRIDGE_NAMESPACE", { enumerable: true, get: function () { return protocol_1.BRIDGE_NAMESPACE; } });
7
+ Object.defineProperty(exports, "STACK_BRIDGE_METHODS", { enumerable: true, get: function () { return protocol_1.STACK_BRIDGE_METHODS; } });
8
+ Object.defineProperty(exports, "FLUTTER_LEGACY_STACK_HANDLERS", { enumerable: true, get: function () { return protocol_1.FLUTTER_LEGACY_STACK_HANDLERS; } });
9
+ Object.defineProperty(exports, "FLUTTER_UNIFIED_HANDLER", { enumerable: true, get: function () { return protocol_1.FLUTTER_UNIFIED_HANDLER; } });
10
+ Object.defineProperty(exports, "RN_BRIDGE_HANDLER", { enumerable: true, get: function () { return protocol_1.RN_BRIDGE_HANDLER; } });
11
+ Object.defineProperty(exports, "createBridgeId", { enumerable: true, get: function () { return protocol_1.createBridgeId; } });
12
+ Object.defineProperty(exports, "createBridgeEnvelope", { enumerable: true, get: function () { return protocol_1.createBridgeEnvelope; } });
13
+ Object.defineProperty(exports, "isBridgeEnvelope", { enumerable: true, get: function () { return protocol_1.isBridgeEnvelope; } });
14
+ Object.defineProperty(exports, "parseBridgeMessage", { enumerable: true, get: function () { return protocol_1.parseBridgeMessage; } });
15
+ Object.defineProperty(exports, "serializeBridgeMessage", { enumerable: true, get: function () { return protocol_1.serializeBridgeMessage; } });
16
+ var detect_host_1 = require("./detect-host");
17
+ Object.defineProperty(exports, "detectBridgeHost", { enumerable: true, get: function () { return detect_host_1.detectBridgeHost; } });
18
+ Object.defineProperty(exports, "isNativeBridgeHost", { enumerable: true, get: function () { return detect_host_1.isNativeBridgeHost; } });
19
+ var transport_1 = require("./transport");
20
+ Object.defineProperty(exports, "createBridgeTransport", { enumerable: true, get: function () { return transport_1.createBridgeTransport; } });
21
+ var client_1 = require("./client");
22
+ Object.defineProperty(exports, "WebViewBridgeClient", { enumerable: true, get: function () { return client_1.WebViewBridgeClient; } });
23
+ Object.defineProperty(exports, "createWebViewBridgeClient", { enumerable: true, get: function () { return client_1.createWebViewBridgeClient; } });
24
+ var host_1 = require("./host");
25
+ Object.defineProperty(exports, "installBridgeHost", { enumerable: true, get: function () { return host_1.installBridgeHost; } });
26
+ Object.defineProperty(exports, "handleBridgeMessage", { enumerable: true, get: function () { return host_1.handleBridgeMessage; } });
27
+ Object.defineProperty(exports, "emitBridgeEnvelope", { enumerable: true, get: function () { return host_1.emitBridgeEnvelope; } });
28
+ var stack_router_bridge_1 = require("./stack-router-bridge");
29
+ Object.defineProperty(exports, "createStackRouterBridge", { enumerable: true, get: function () { return stack_router_bridge_1.createStackRouterBridge; } });
30
+ Object.defineProperty(exports, "getStackRouterBridge", { enumerable: true, get: function () { return stack_router_bridge_1.getStackRouterBridge; } });
31
+ Object.defineProperty(exports, "installStackRouterBridge", { enumerable: true, get: function () { return stack_router_bridge_1.installStackRouterBridge; } });
32
+ var WebViewBridgeProvider_1 = require("./WebViewBridgeProvider");
33
+ Object.defineProperty(exports, "WebViewBridgeProvider", { enumerable: true, get: function () { return WebViewBridgeProvider_1.WebViewBridgeProvider; } });
@@ -0,0 +1,51 @@
1
+ /** WebViewKit native bridge protocol (v1) */
2
+ export declare const BRIDGE_PROTOCOL_VERSION: 1;
3
+ export declare const BRIDGE_NAMESPACE: "webviewkit";
4
+ export type BridgeHostKind = "react-native" | "flutter" | "browser" | "unknown";
5
+ /** Stack navigation — maps to common `stackPush` / `stackPop` WebView handlers */
6
+ export declare const STACK_BRIDGE_METHODS: {
7
+ readonly PUSH: "stack.push";
8
+ readonly REPLACE: "stack.replace";
9
+ readonly POP: "stack.pop";
10
+ readonly RESET: "stack.reset";
11
+ };
12
+ export type StackBridgeMethod = (typeof STACK_BRIDGE_METHODS)[keyof typeof STACK_BRIDGE_METHODS];
13
+ export type StackMeta = Record<string, unknown> | null;
14
+ export type StackPushPayload = {
15
+ url: string;
16
+ meta?: StackMeta;
17
+ };
18
+ export type StackReplacePayload = StackPushPayload;
19
+ export type StackResetPayload = {
20
+ url: string;
21
+ meta?: StackMeta;
22
+ };
23
+ export type BridgeErrorBody = {
24
+ code: string;
25
+ message: string;
26
+ };
27
+ export type BridgeEnvelope<TPayload = unknown> = {
28
+ v: typeof BRIDGE_PROTOCOL_VERSION;
29
+ ns: typeof BRIDGE_NAMESPACE;
30
+ id: string;
31
+ method: string;
32
+ payload?: TPayload;
33
+ error?: BridgeErrorBody;
34
+ };
35
+ export declare function createBridgeId(): string;
36
+ export declare function createBridgeEnvelope<TPayload>(method: string, payload?: TPayload, id?: string): BridgeEnvelope<TPayload>;
37
+ export declare function isBridgeEnvelope(value: unknown): value is BridgeEnvelope;
38
+ export declare function parseBridgeMessage(raw: string | unknown): BridgeEnvelope | null;
39
+ export declare function serializeBridgeMessage(msg: BridgeEnvelope): string;
40
+ /** Flutter InAppWebView legacy handler names */
41
+ export declare const FLUTTER_LEGACY_STACK_HANDLERS: {
42
+ readonly push: "stackPush";
43
+ readonly replace: "stackReplace";
44
+ readonly pop: "stackPop";
45
+ readonly reset: "stackReset";
46
+ };
47
+ /** Unified handler name when native listens on one channel */
48
+ export declare const FLUTTER_UNIFIED_HANDLER = "webviewkitBridge";
49
+ /** React Native receives messages via this global handler name suggestion */
50
+ export declare const RN_BRIDGE_HANDLER = "webviewkitBridge";
51
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,eAAO,MAAM,uBAAuB,EAAG,CAAU,CAAC;AAClD,eAAO,MAAM,gBAAgB,EAAG,YAAqB,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhF,kFAAkF;AAClF,eAAO,MAAM,oBAAoB;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAC3B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEnE,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AACjE,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AACnD,MAAM,MAAM,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,cAAc,CAAC,QAAQ,GAAG,OAAO,IAAI;IAC/C,CAAC,EAAE,OAAO,uBAAuB,CAAC;IAClC,EAAE,EAAE,OAAO,gBAAgB,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAC3C,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,QAAQ,EAClB,EAAE,CAAC,EAAE,MAAM,GACV,cAAc,CAAC,QAAQ,CAAC,CAQ1B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CASxE;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,GAAG,OAAO,GACpB,cAAc,GAAG,IAAI,CAQvB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAElE;AAED,gDAAgD;AAChD,eAAO,MAAM,6BAA6B;;;;;CAKhC,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,qBAAqB,CAAC;AAE1D,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,qBAAqB,CAAC"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RN_BRIDGE_HANDLER = exports.FLUTTER_UNIFIED_HANDLER = exports.FLUTTER_LEGACY_STACK_HANDLERS = exports.STACK_BRIDGE_METHODS = exports.BRIDGE_NAMESPACE = exports.BRIDGE_PROTOCOL_VERSION = void 0;
4
+ exports.createBridgeId = createBridgeId;
5
+ exports.createBridgeEnvelope = createBridgeEnvelope;
6
+ exports.isBridgeEnvelope = isBridgeEnvelope;
7
+ exports.parseBridgeMessage = parseBridgeMessage;
8
+ exports.serializeBridgeMessage = serializeBridgeMessage;
9
+ /** WebViewKit native bridge protocol (v1) */
10
+ exports.BRIDGE_PROTOCOL_VERSION = 1;
11
+ exports.BRIDGE_NAMESPACE = "webviewkit";
12
+ /** Stack navigation — maps to common `stackPush` / `stackPop` WebView handlers */
13
+ exports.STACK_BRIDGE_METHODS = {
14
+ PUSH: "stack.push",
15
+ REPLACE: "stack.replace",
16
+ POP: "stack.pop",
17
+ RESET: "stack.reset",
18
+ };
19
+ function createBridgeId() {
20
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
21
+ return crypto.randomUUID();
22
+ }
23
+ return `wv-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
24
+ }
25
+ function createBridgeEnvelope(method, payload, id) {
26
+ return {
27
+ v: exports.BRIDGE_PROTOCOL_VERSION,
28
+ ns: exports.BRIDGE_NAMESPACE,
29
+ id: id !== null && id !== void 0 ? id : createBridgeId(),
30
+ method,
31
+ ...(payload !== undefined ? { payload } : {}),
32
+ };
33
+ }
34
+ function isBridgeEnvelope(value) {
35
+ if (!value || typeof value !== "object")
36
+ return false;
37
+ const o = value;
38
+ return (o.v === exports.BRIDGE_PROTOCOL_VERSION &&
39
+ o.ns === exports.BRIDGE_NAMESPACE &&
40
+ typeof o.id === "string" &&
41
+ typeof o.method === "string");
42
+ }
43
+ function parseBridgeMessage(raw) {
44
+ try {
45
+ const parsed = typeof raw === "string" ? JSON.parse(raw) : raw;
46
+ return isBridgeEnvelope(parsed) ? parsed : null;
47
+ }
48
+ catch (_a) {
49
+ return null;
50
+ }
51
+ }
52
+ function serializeBridgeMessage(msg) {
53
+ return JSON.stringify(msg);
54
+ }
55
+ /** Flutter InAppWebView legacy handler names */
56
+ exports.FLUTTER_LEGACY_STACK_HANDLERS = {
57
+ push: "stackPush",
58
+ replace: "stackReplace",
59
+ pop: "stackPop",
60
+ reset: "stackReset",
61
+ };
62
+ /** Unified handler name when native listens on one channel */
63
+ exports.FLUTTER_UNIFIED_HANDLER = "webviewkitBridge";
64
+ /** React Native receives messages via this global handler name suggestion */
65
+ exports.RN_BRIDGE_HANDLER = "webviewkitBridge";
@@ -0,0 +1,17 @@
1
+ import type { StackMeta } from "./protocol";
2
+ import type { BridgeTransportOptions } from "./transport";
3
+ export type StackRouterBridge = {
4
+ push: (url: string, meta?: StackMeta) => Promise<unknown>;
5
+ replace: (url: string, meta?: StackMeta) => Promise<unknown>;
6
+ pop: () => Promise<unknown>;
7
+ reset: (url: string) => Promise<unknown>;
8
+ };
9
+ export type CreateStackRouterBridgeOptions = BridgeTransportOptions;
10
+ /**
11
+ * Web → native stack navigation (Flutter `callHandler` / RN `postMessage`).
12
+ * Returns null in browser-only environments.
13
+ */
14
+ export declare function createStackRouterBridge(options?: CreateStackRouterBridgeOptions): StackRouterBridge | null;
15
+ export declare function getStackRouterBridge(): StackRouterBridge | null;
16
+ export declare function installStackRouterBridge(options?: CreateStackRouterBridgeOptions): StackRouterBridge | null;
17
+ //# sourceMappingURL=stack-router-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-router-bridge.d.ts","sourceRoot":"","sources":["../../src/bridge/stack-router-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,GAAG,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,CAAC,EAAE,8BAA8B,GACvC,iBAAiB,GAAG,IAAI,CAY1B;AAED,wBAAgB,oBAAoB,IAAI,iBAAiB,GAAG,IAAI,CAG/D;AAED,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,8BAA8B,GACvC,iBAAiB,GAAG,IAAI,CAO1B"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStackRouterBridge = createStackRouterBridge;
4
+ exports.getStackRouterBridge = getStackRouterBridge;
5
+ exports.installStackRouterBridge = installStackRouterBridge;
6
+ const client_1 = require("./client");
7
+ const detect_host_1 = require("./detect-host");
8
+ /**
9
+ * Web → native stack navigation (Flutter `callHandler` / RN `postMessage`).
10
+ * Returns null in browser-only environments.
11
+ */
12
+ function createStackRouterBridge(options) {
13
+ const host = (0, detect_host_1.detectBridgeHost)();
14
+ if (!(0, detect_host_1.isNativeBridgeHost)(host))
15
+ return null;
16
+ const client = (0, client_1.createWebViewBridgeClient)(options);
17
+ return {
18
+ push: (url, meta) => client.stackPush(url, meta !== null && meta !== void 0 ? meta : null),
19
+ replace: (url, meta) => client.stackReplace(url, meta !== null && meta !== void 0 ? meta : null),
20
+ pop: () => client.stackPop(),
21
+ reset: (url) => client.stackReset(url),
22
+ };
23
+ }
24
+ function getStackRouterBridge() {
25
+ var _a, _b;
26
+ if (typeof window === "undefined")
27
+ return null;
28
+ return (_b = (_a = window.stackRouterBridge) !== null && _a !== void 0 ? _a : createStackRouterBridge()) !== null && _b !== void 0 ? _b : null;
29
+ }
30
+ function installStackRouterBridge(options) {
31
+ if (typeof window === "undefined")
32
+ return null;
33
+ const bridge = createStackRouterBridge(options);
34
+ if (bridge) {
35
+ window.stackRouterBridge = bridge;
36
+ }
37
+ return bridge;
38
+ }
@@ -0,0 +1,11 @@
1
+ import type { BridgeEnvelope, BridgeHostKind } from "./protocol";
2
+ export type BridgeTransportOptions = {
3
+ /** Flutter: use stackPush/stackPop handlers (default true) */
4
+ flutterLegacyHandlers?: boolean;
5
+ };
6
+ export interface BridgeTransport {
7
+ readonly host: BridgeHostKind;
8
+ send(envelope: BridgeEnvelope): Promise<void>;
9
+ }
10
+ export declare function createBridgeTransport(host?: BridgeHostKind, options?: BridgeTransportOptions): BridgeTransport;
11
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/bridge/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQjE,MAAM,MAAM,sBAAsB,GAAG;IACnC,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,IAAI,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAoED,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,cAAmC,EACzC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAIjB"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBridgeTransport = createBridgeTransport;
4
+ const detect_host_1 = require("./detect-host");
5
+ const protocol_1 = require("./protocol");
6
+ function stackMethodToLegacyHandler(method) {
7
+ switch (method) {
8
+ case protocol_1.STACK_BRIDGE_METHODS.PUSH:
9
+ return protocol_1.FLUTTER_LEGACY_STACK_HANDLERS.push;
10
+ case protocol_1.STACK_BRIDGE_METHODS.REPLACE:
11
+ return protocol_1.FLUTTER_LEGACY_STACK_HANDLERS.replace;
12
+ case protocol_1.STACK_BRIDGE_METHODS.POP:
13
+ return protocol_1.FLUTTER_LEGACY_STACK_HANDLERS.pop;
14
+ case protocol_1.STACK_BRIDGE_METHODS.RESET:
15
+ return protocol_1.FLUTTER_LEGACY_STACK_HANDLERS.reset;
16
+ default:
17
+ return null;
18
+ }
19
+ }
20
+ function createReactNativeTransport() {
21
+ return {
22
+ host: "react-native",
23
+ async send(envelope) {
24
+ window.ReactNativeWebView.postMessage((0, protocol_1.serializeBridgeMessage)(envelope));
25
+ },
26
+ };
27
+ }
28
+ function createFlutterTransport(options) {
29
+ const useLegacy = options.flutterLegacyHandlers !== false;
30
+ return {
31
+ host: "flutter",
32
+ async send(envelope) {
33
+ var _a, _b;
34
+ const call = window.flutter_inappwebview.callHandler.bind(window.flutter_inappwebview);
35
+ if (useLegacy) {
36
+ const handler = stackMethodToLegacyHandler(envelope.method);
37
+ if (handler) {
38
+ const payload = envelope.payload;
39
+ if (envelope.method === protocol_1.STACK_BRIDGE_METHODS.POP) {
40
+ await call(handler);
41
+ return;
42
+ }
43
+ const url = (_a = payload === null || payload === void 0 ? void 0 : payload.url) !== null && _a !== void 0 ? _a : "";
44
+ const meta = payload && "meta" in payload ? (_b = payload.meta) !== null && _b !== void 0 ? _b : null : null;
45
+ await call(handler, url, meta);
46
+ return;
47
+ }
48
+ }
49
+ await call(protocol_1.FLUTTER_UNIFIED_HANDLER, (0, protocol_1.serializeBridgeMessage)(envelope));
50
+ },
51
+ };
52
+ }
53
+ const browserTransport = {
54
+ host: "browser",
55
+ async send() {
56
+ /* no native host — web-only */
57
+ },
58
+ };
59
+ function createBridgeTransport(host = (0, detect_host_1.detectBridgeHost)(), options = {}) {
60
+ if (host === "react-native")
61
+ return createReactNativeTransport();
62
+ if (host === "flutter")
63
+ return createFlutterTransport(options);
64
+ return browserTransport;
65
+ }
package/dist/index.d.ts CHANGED
@@ -6,4 +6,6 @@ export { default as StackRouterProvider, useStackRouter, } from "./stack-router/
6
6
  export { default as BackRouter } from "./stack-router/_components/back-router";
7
7
  export { default as StackHeader } from "./stack-router/_components/header";
8
8
  export { StackDevRoadmap } from "./stack-dev/stack-dev-roadmap";
9
+ export { BRIDGE_PROTOCOL_VERSION, BRIDGE_NAMESPACE, STACK_BRIDGE_METHODS, FLUTTER_LEGACY_STACK_HANDLERS, FLUTTER_UNIFIED_HANDLER, RN_BRIDGE_HANDLER, createBridgeId, createBridgeEnvelope, isBridgeEnvelope, parseBridgeMessage, serializeBridgeMessage, detectBridgeHost, isNativeBridgeHost, createBridgeTransport, WebViewBridgeClient, createWebViewBridgeClient, installBridgeHost, handleBridgeMessage, emitBridgeEnvelope, createStackRouterBridge, getStackRouterBridge, installStackRouterBridge, WebViewBridgeProvider, } from "./bridge";
10
+ export type { BridgeHostKind, StackBridgeMethod, StackMeta, StackPushPayload, StackReplacePayload, StackResetPayload, BridgeEnvelope, BridgeErrorBody, BridgeTransport, BridgeTransportOptions, WebViewBridgeClientOptions, InstallBridgeHostOptions, StackRouterHostHandlers, BridgeHostCleanup, StackRouterBridge, CreateStackRouterBridgeOptions, WebViewBridgeProviderProps, } from "./bridge";
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAClD,YAAY,EACV,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,OAAO,IAAI,mBAAmB,EAC9B,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAClD,YAAY,EACV,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,OAAO,IAAI,mBAAmB,EAC9B,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,6BAA6B,EAC7B,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.StackDevRoadmap = exports.StackHeader = exports.BackRouter = exports.useStackRouter = exports.StackRouterProvider = exports.history = exports.HistoryAction = exports.Direction = exports.STACK_TRANSITION_MS = void 0;
6
+ exports.WebViewBridgeProvider = exports.installStackRouterBridge = exports.getStackRouterBridge = exports.createStackRouterBridge = exports.emitBridgeEnvelope = exports.handleBridgeMessage = exports.installBridgeHost = exports.createWebViewBridgeClient = exports.WebViewBridgeClient = exports.createBridgeTransport = exports.isNativeBridgeHost = exports.detectBridgeHost = exports.serializeBridgeMessage = exports.parseBridgeMessage = exports.isBridgeEnvelope = exports.createBridgeEnvelope = exports.createBridgeId = exports.RN_BRIDGE_HANDLER = exports.FLUTTER_UNIFIED_HANDLER = exports.FLUTTER_LEGACY_STACK_HANDLERS = exports.STACK_BRIDGE_METHODS = exports.BRIDGE_NAMESPACE = exports.BRIDGE_PROTOCOL_VERSION = exports.StackDevRoadmap = exports.StackHeader = exports.BackRouter = exports.useStackRouter = exports.StackRouterProvider = exports.history = exports.HistoryAction = exports.Direction = exports.STACK_TRANSITION_MS = void 0;
7
7
  var constants_1 = require("./constants");
8
8
  Object.defineProperty(exports, "STACK_TRANSITION_MS", { enumerable: true, get: function () { return constants_1.STACK_TRANSITION_MS; } });
9
9
  var type_1 = require("./type");
@@ -20,3 +20,27 @@ var header_1 = require("./stack-router/_components/header");
20
20
  Object.defineProperty(exports, "StackHeader", { enumerable: true, get: function () { return __importDefault(header_1).default; } });
21
21
  var stack_dev_roadmap_1 = require("./stack-dev/stack-dev-roadmap");
22
22
  Object.defineProperty(exports, "StackDevRoadmap", { enumerable: true, get: function () { return stack_dev_roadmap_1.StackDevRoadmap; } });
23
+ var bridge_1 = require("./bridge");
24
+ Object.defineProperty(exports, "BRIDGE_PROTOCOL_VERSION", { enumerable: true, get: function () { return bridge_1.BRIDGE_PROTOCOL_VERSION; } });
25
+ Object.defineProperty(exports, "BRIDGE_NAMESPACE", { enumerable: true, get: function () { return bridge_1.BRIDGE_NAMESPACE; } });
26
+ Object.defineProperty(exports, "STACK_BRIDGE_METHODS", { enumerable: true, get: function () { return bridge_1.STACK_BRIDGE_METHODS; } });
27
+ Object.defineProperty(exports, "FLUTTER_LEGACY_STACK_HANDLERS", { enumerable: true, get: function () { return bridge_1.FLUTTER_LEGACY_STACK_HANDLERS; } });
28
+ Object.defineProperty(exports, "FLUTTER_UNIFIED_HANDLER", { enumerable: true, get: function () { return bridge_1.FLUTTER_UNIFIED_HANDLER; } });
29
+ Object.defineProperty(exports, "RN_BRIDGE_HANDLER", { enumerable: true, get: function () { return bridge_1.RN_BRIDGE_HANDLER; } });
30
+ Object.defineProperty(exports, "createBridgeId", { enumerable: true, get: function () { return bridge_1.createBridgeId; } });
31
+ Object.defineProperty(exports, "createBridgeEnvelope", { enumerable: true, get: function () { return bridge_1.createBridgeEnvelope; } });
32
+ Object.defineProperty(exports, "isBridgeEnvelope", { enumerable: true, get: function () { return bridge_1.isBridgeEnvelope; } });
33
+ Object.defineProperty(exports, "parseBridgeMessage", { enumerable: true, get: function () { return bridge_1.parseBridgeMessage; } });
34
+ Object.defineProperty(exports, "serializeBridgeMessage", { enumerable: true, get: function () { return bridge_1.serializeBridgeMessage; } });
35
+ Object.defineProperty(exports, "detectBridgeHost", { enumerable: true, get: function () { return bridge_1.detectBridgeHost; } });
36
+ Object.defineProperty(exports, "isNativeBridgeHost", { enumerable: true, get: function () { return bridge_1.isNativeBridgeHost; } });
37
+ Object.defineProperty(exports, "createBridgeTransport", { enumerable: true, get: function () { return bridge_1.createBridgeTransport; } });
38
+ Object.defineProperty(exports, "WebViewBridgeClient", { enumerable: true, get: function () { return bridge_1.WebViewBridgeClient; } });
39
+ Object.defineProperty(exports, "createWebViewBridgeClient", { enumerable: true, get: function () { return bridge_1.createWebViewBridgeClient; } });
40
+ Object.defineProperty(exports, "installBridgeHost", { enumerable: true, get: function () { return bridge_1.installBridgeHost; } });
41
+ Object.defineProperty(exports, "handleBridgeMessage", { enumerable: true, get: function () { return bridge_1.handleBridgeMessage; } });
42
+ Object.defineProperty(exports, "emitBridgeEnvelope", { enumerable: true, get: function () { return bridge_1.emitBridgeEnvelope; } });
43
+ Object.defineProperty(exports, "createStackRouterBridge", { enumerable: true, get: function () { return bridge_1.createStackRouterBridge; } });
44
+ Object.defineProperty(exports, "getStackRouterBridge", { enumerable: true, get: function () { return bridge_1.getStackRouterBridge; } });
45
+ Object.defineProperty(exports, "installStackRouterBridge", { enumerable: true, get: function () { return bridge_1.installStackRouterBridge; } });
46
+ Object.defineProperty(exports, "WebViewBridgeProvider", { enumerable: true, get: function () { return bridge_1.WebViewBridgeProvider; } });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ahnseungchan/webviewkit",
3
- "version": "1.2.0",
4
- "description": "Stack-based navigation for React WebView apps with dev stack roadmap",
3
+ "version": "1.3.0",
4
+ "description": "Stack navigation and native WebView bridge (RN/Flutter) for React hybrid apps",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": ["dist", "README.md"],