UNPKG

react-native-webview-comlink

Version:

Add JavaScript interface for react-native-webview, based on Comlink

48 lines (47 loc) 1.47 kB
import './polyfill'; import { MessageHub } from '../common/MessageHub'; import { createRemoteFunction } from '../common/message'; import { createLogger } from '../common/logger'; /** * create Javascript interface object * @param target */ function createInterface(name, target, os) { const logger = createLogger($LOG_ENABLED); logger(`${name} injected`); const hub = new MessageHub(name, window.ReactNativeWebView, logger); let initialized = false; const init = () => { if (initialized) { return; } initialized = true; const listener = (evt) => { const msg = evt.data; if (hub.canHandleMessage(msg)) { logger(`received message from native ${msg}`); hub.handleMessage(msg); } }; if (os === 'android') { document.addEventListener('message', listener); } else if (os === 'ios') { window.addEventListener('message', listener); } }; return Object.keys(target).reduce((obj, key) => { const remoteFunction = createRemoteFunction(target[key], 0, hub); obj[key] = (...args) => { init(); return remoteFunction(...args); }; return obj; }, {}); } /** * for native bundle to inject */ if (!window['$EXPOSED_NAME']) { window['$EXPOSED_NAME'] = createInterface('$EXPOSED_NAME', $EXPOSED_TARGET, '$PLATFORM_OS'); }