+3
-0
| export declare function expose(apiHandlers: Record<string, Function>, originVertify?: (origin: string) => boolean): () => void; | ||
| export declare function callMethodResponseListener(e: any): void; | ||
| export declare function excute<T>(frameID: string, actionName: string, ...params: any): Promise<T>; | ||
| export declare function emitEvent(eventName: string, params: any): void; | ||
| export declare function addIframeEventListener(eventName: string, handler: (params: any) => void): () => void; |
+71
-30
| function response(id, data, error = "") { | ||
| window.parent.postMessage(JSON.stringify({ id, data, error }), "*"); | ||
| const resp = { id, data, errorMsg: error, eventType: EventType.callMethodResponse }; | ||
| try { | ||
| window.parent.postMessage(JSON.stringify(resp), "*"); | ||
| } | ||
| catch (e) { | ||
| return; | ||
| } | ||
| } | ||
@@ -18,6 +24,15 @@ function uuid() { | ||
| } | ||
| var EventType; | ||
| (function (EventType) { | ||
| EventType["callMethodRequest"] = "IFAPI_CALL_METHOD_REQUEST"; | ||
| EventType["callMethodResponse"] = "IFAPI_CALL_METHOD_RESPONSE"; | ||
| EventType["eventEmit"] = "IFAPI_EVENT_EMIT"; | ||
| })(EventType || (EventType = {})); | ||
| function isPromise(obj) { | ||
| return !!obj && typeof obj.then === "function"; | ||
| } | ||
| // 暴露API接口供业务系统调用 | ||
| export function expose(apiHandlers, originVertify) { | ||
| function listener(e) { | ||
| let data = {}; | ||
| let data = null; | ||
| try { | ||
@@ -27,5 +42,6 @@ data = JSON.parse(e.data); | ||
| catch (e) { | ||
| window.console.error(e); | ||
| return; | ||
| } | ||
| if (!data || !data.id || data.eventType !== EventType.callMethodRequest) | ||
| return; | ||
| const id = data.id; | ||
@@ -46,3 +62,3 @@ if (originVertify && !originVertify(e.origin)) { | ||
| const resp = handler(...data.params); | ||
| if (!resp || !resp.then) { | ||
| if (!resp || !isPromise(resp)) { | ||
| response(id, resp); | ||
@@ -58,2 +74,26 @@ return; | ||
| } | ||
| const callMethodResolveHandlers = new Map(); | ||
| export function callMethodResponseListener(e) { | ||
| let resp = null; | ||
| try { | ||
| resp = JSON.parse(e.data); | ||
| } | ||
| catch (e) { | ||
| return; | ||
| } | ||
| if (!resp || !resp.id || resp.eventType !== EventType.callMethodResponse) | ||
| return; | ||
| const handlers = callMethodResolveHandlers.get(resp.id); | ||
| if (!handlers) | ||
| return; | ||
| const { resolve, reject } = handlers; | ||
| if (resp.errorMsg) { | ||
| reject(resp.errorMsg); | ||
| } | ||
| else { | ||
| resolve(resp.data); | ||
| } | ||
| callMethodResolveHandlers.delete(resp.id); | ||
| } | ||
| window.addEventListener("message", callMethodResponseListener); | ||
| export function excute(frameID, actionName, ...params) { | ||
@@ -67,31 +107,32 @@ return new Promise((resolve, reject) => { | ||
| } | ||
| ; | ||
| const id = uuid(); | ||
| function listener(e) { | ||
| window.removeEventListener("message", listener); | ||
| let resp = {}; | ||
| try { | ||
| resp = JSON.parse(e.data); | ||
| } | ||
| catch (e) { | ||
| window.console.error(e); | ||
| return; | ||
| } | ||
| if (!resp.id || resp.id !== id) | ||
| return; | ||
| if (resp.error) { | ||
| reject(resp.error); | ||
| return; | ||
| } | ||
| let data = resp.data; | ||
| try { | ||
| data = JSON.parse(resp.data); | ||
| } | ||
| catch (e) { } | ||
| resolve(data); | ||
| } | ||
| window.addEventListener("message", listener); | ||
| const requestData = { id, actionName, params }; | ||
| callMethodResolveHandlers.set(id, { resolve, reject }); | ||
| const requestData = { id, actionName, params, eventType: EventType.callMethodRequest }; | ||
| (_a = frame.contentWindow) === null || _a === void 0 ? void 0 : _a.postMessage(JSON.stringify(requestData), frame.src); | ||
| }); | ||
| } | ||
| export function emitEvent(eventName, params) { | ||
| const event = { eventName, params, eventType: EventType.eventEmit }; | ||
| try { | ||
| window.parent.postMessage(JSON.stringify(event), "*"); | ||
| } | ||
| catch (error) { | ||
| return; | ||
| } | ||
| } | ||
| export function addIframeEventListener(eventName, handler) { | ||
| function listener(e) { | ||
| let req = null; | ||
| try { | ||
| req = JSON.parse(e.data); | ||
| } | ||
| catch (error) { | ||
| return; | ||
| } | ||
| if (!req || req.eventType !== EventType.eventEmit || req.eventName !== eventName) | ||
| return; | ||
| handler(req.params); | ||
| } | ||
| window.addEventListener("message", listener); | ||
| return () => window.removeEventListener("message", listener); | ||
| } |
+90
-27
| function response(id: string, data: any, error = "") { | ||
| window.parent.postMessage(JSON.stringify({ id, data, error }), "*"); | ||
| const resp: IframeResponse = { id, data, errorMsg: error, eventType: EventType.callMethodResponse }; | ||
| try { | ||
| window.parent.postMessage(JSON.stringify(resp), "*"); | ||
| } catch (e) { | ||
| return; | ||
| } | ||
| } | ||
@@ -20,12 +25,42 @@ | ||
| enum EventType { | ||
| callMethodRequest = "IFAPI_CALL_METHOD_REQUEST", | ||
| callMethodResponse = "IFAPI_CALL_METHOD_RESPONSE", | ||
| eventEmit = "IFAPI_EVENT_EMIT", | ||
| } | ||
| interface IframeRequest { | ||
| eventType: EventType.callMethodRequest; | ||
| id: string; | ||
| actionName: string; | ||
| params: Array<any>; | ||
| } | ||
| interface IframeResponse { | ||
| eventType: EventType.callMethodResponse; | ||
| id: string; | ||
| data: any; | ||
| errorMsg: string; | ||
| } | ||
| interface IframeEvent { | ||
| eventName: string; | ||
| eventType: EventType.eventEmit; | ||
| params: any; | ||
| } | ||
| function isPromise(obj: any) { | ||
| return !!obj && typeof obj.then === "function"; | ||
| } | ||
| // 暴露API接口供业务系统调用 | ||
| export function expose(apiHandlers: Record<string, Function>, originVertify?: (origin: string) => boolean) { | ||
| function listener(e: any) { | ||
| let data: any = {}; | ||
| let data: IframeRequest | null = null; | ||
| try { | ||
| data = JSON.parse(e.data); | ||
| } catch (e) { | ||
| window.console.error(e); | ||
| return; | ||
| } | ||
| if (!data || !data.id || data.eventType !== EventType.callMethodRequest) return; | ||
| const id = data.id; | ||
@@ -41,2 +76,3 @@ if (originVertify && !originVertify(e.origin)) { | ||
| } | ||
| const handler = apiHandlers[data.actionName]; | ||
@@ -47,4 +83,5 @@ if (!handler) { | ||
| } | ||
| const resp = handler(...data.params); | ||
| if (!resp || !resp.then) { | ||
| if (!resp || !isPromise(resp)) { | ||
| response(id, resp); | ||
@@ -61,3 +98,25 @@ return; | ||
| const callMethodResolveHandlers = new Map<string, { resolve: (value: any) => void; reject: (value: any) => void }>(); | ||
| export function callMethodResponseListener(e: any) { | ||
| let resp: IframeResponse | null = null; | ||
| try { | ||
| resp = JSON.parse(e.data); | ||
| } catch (e) { | ||
| return; | ||
| } | ||
| if (!resp || !resp.id || resp.eventType !== EventType.callMethodResponse) return; | ||
| const handlers = callMethodResolveHandlers.get(resp.id); | ||
| if (!handlers) return; | ||
| const { resolve, reject } = handlers; | ||
| if (resp.errorMsg) { | ||
| reject(resp.errorMsg); | ||
| } else { | ||
| resolve(resp.data); | ||
| } | ||
| callMethodResolveHandlers.delete(resp.id); | ||
| } | ||
| window.addEventListener("message", callMethodResponseListener); | ||
| export function excute<T>(frameID: string, actionName: string, ...params: any): Promise<T> { | ||
@@ -69,28 +128,32 @@ return new Promise((resolve, reject) => { | ||
| return; | ||
| }; | ||
| } | ||
| const id = uuid(); | ||
| function listener(e: any) { | ||
| window.removeEventListener("message", listener); | ||
| let resp: any = {}; | ||
| try { | ||
| resp = JSON.parse(e.data); | ||
| } catch (e) { | ||
| window.console.error(e); | ||
| return; | ||
| } | ||
| if (!resp.id || resp.id !== id) return; | ||
| if (resp.error) { | ||
| reject(resp.error); | ||
| return; | ||
| } | ||
| let data: any = resp.data; | ||
| try { | ||
| data = JSON.parse(resp.data); | ||
| } catch (e) {} | ||
| resolve(data); | ||
| } | ||
| window.addEventListener("message", listener); | ||
| const requestData = { id, actionName, params }; | ||
| callMethodResolveHandlers.set(id, { resolve, reject }); | ||
| const requestData: IframeRequest = { id, actionName, params, eventType: EventType.callMethodRequest }; | ||
| frame.contentWindow?.postMessage(JSON.stringify(requestData), frame.src); | ||
| }); | ||
| } | ||
| export function emitEvent(eventName: string, params: any) { | ||
| const event: IframeEvent = { eventName, params, eventType: EventType.eventEmit }; | ||
| try { | ||
| window.parent.postMessage(JSON.stringify(event), "*"); | ||
| } catch (error) { | ||
| return; | ||
| } | ||
| } | ||
| export function addIframeEventListener(eventName: string, handler: (params: any) => void): () => void { | ||
| function listener(e: any) { | ||
| let req: IframeEvent | null = null; | ||
| try { | ||
| req = JSON.parse(e.data); | ||
| } catch (error) { | ||
| return; | ||
| } | ||
| if (!req || req.eventType !== EventType.eventEmit || req.eventName !== eventName) return; | ||
| handler(req.params); | ||
| } | ||
| window.addEventListener("message", listener); | ||
| return () => window.removeEventListener("message", listener); | ||
| } |
+1
-1
| { | ||
| "name": "ifapi", | ||
| "version": "1.2.3", | ||
| "version": "2.0.0", | ||
| "type": "module", | ||
@@ -5,0 +5,0 @@ "main": "main.js", |
11656
41.96%276
53.33%