import type { ChannelMessageEvent } from './channel' import { Channel } from './channel' import { JsonEncoder } from './encoder' export class WKWebViewChannel extends Channel { private bridgeName: string private encoder = new JsonEncoder() isConnected: boolean constructor(bridgeName = 'bridge') { super() this.bridgeName = bridgeName // window[bridgeName] = this // @ts-expect-error xxx const bridge = window.webkit?.messageHandlers[this.bridgeName] this.isConnected = bridge != null bridge.on('message', (message: ChannelMessageEvent) => { void this.emit('message', { ...message, data: this.encoder.decode(message?.data), }) }) bridge.on('messageerror', async (error: ChannelMessageEvent) => { await this.emit('messageerror', error) }) } postMessage(payload: any): void { const data = this.encoder.encode(payload) try { // @ts-expect-error xxx window.webkit?.messageHandlers[this.bridgeName].postMessage(data) } catch (err) { // log.info("wkwebview send", channel, data) // log.warn('Exception:', err) } } close() {} }