one
Version:
One is a React framework for web, iOS, and Android apps.
37 lines (34 loc) • 1.62 kB
text/typescript
// native-to-js events for source-imported modules. generated subscription
// wrappers register the native closure through the module's own subscribe
// method, then listen on the module's channel. unsubscribing removes only
// the javascript listener; a stored native closure stays the author's
// lifecycle, like any other retained callback.
import { NativeEventEmitter, NativeModules } from 'react-native'
import { callNativeSource } from './index.native'
import type { NativeSourceStructs, NativeSourceWire } from './wire.native'
import { decodeNativeSourceCallback } from './wire.native'
const emitter = new NativeEventEmitter(NativeModules.OneNativeSourceEvents)
export function subscribeNativeSourceEvent(
module: string,
event: string,
listener: (...args: never[]) => void,
contractHash: string,
payloadWires: (NativeSourceWire | null)[],
structs: NativeSourceStructs
): () => void {
if (typeof listener !== 'function') {
throw new TypeError(`native event ${module}.${event} needs a listener function`)
}
const channel = `OneNativeSource.${module}.${event}`
const subscription = emitter.addListener(channel, (args: unknown[]) => {
listener(
...(decodeNativeSourceCallback(args, payloadWires, structs, event) as never[])
)
})
// listen first so nothing the subscription registers can be lost, then
// hand the native closure to the author's subscribe method. a rejected
// subscribe (a stale binary, an unlinked module) surfaces the same way
// any rejected native call does.
callNativeSource(module, event, [], contractHash)
return () => subscription.remove()
}