react-native-webview-comlink
Version:
Add JavaScript interface for react-native-webview, based on Comlink
48 lines (47 loc) • 1.47 kB
JavaScript
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');
}