/* eslint-disable @typescript-eslint/naming-convention */ import type { AnyObject } from 'brick-module'; import { MiniAppModule } from '../../../natives'; import { generateUUID } from '../../../utils/generateUUID'; export interface AppBridgeCompatCallbacks { onSuccess: (result: Result) => void; onError: (reason: unknown) => void; } type AppBridgeCallback = (...args: any[]) => void; type AppBridgeCallbackId = string; const INTERNAL__callbacks = new Map(); function invokeAppBridgeCallback(id: string, ...args: any[]): boolean { const callback = INTERNAL__callbacks.get(id); callback?.call(null, ...args); return Boolean(callback); } function invokeAppBridgeMethod( methodName: string, params: Params, callbacks: AppBridgeCompatCallbacks & Record ) { const { onSuccess, onError, ...appBridgeCallbacks } = callbacks; const { callbackMap, unregisterAll } = registerCallbacks(appBridgeCallbacks); const promise = MiniAppModule.postMessage(methodName, params, callbackMap) as Promise; void promise.then(onSuccess).catch(onError); return unregisterAll; } function registerCallbacks(callbacks: Record) { const callbackMap: Record = {}; for (const [callbackName, callback] of Object.entries(callbacks)) { const id = registerCallback(callback, callbackName); callbackMap[callbackName] = id; } const unregisterAll = () => { Object.values(callbackMap).forEach(unregisterCallback); }; return { callbackMap, unregisterAll }; } function registerCallback(callback: AppBridgeCallback, name = 'unnamed') { const uniqueId = generateUUID(); const callbackId = `${uniqueId}__${name}`; INTERNAL__callbacks.set(callbackId, callback); return callbackId; } function unregisterCallback(id: string) { INTERNAL__callbacks.delete(id); } function getCallbackIds() { return Array.from(INTERNAL__callbacks.keys()); } export const INTERNAL__appBridgeHandler = { invokeAppBridgeCallback, invokeAppBridgeMethod, registerCallback, unregisterCallback, getCallbackIds, };