diff --git a/src/guest.ts b/src/guest.ts index 3b95cce..194b7ef 100644 --- a/src/guest.ts +++ b/src/guest.ts @@ -1,6 +1,6 @@ import { extractMethods, isWorker } from "./helpers"; import { registerLocalMethods, registerRemoteMethods } from "./rpc"; -import { actions, events, IConnection, ISchema } from "./types"; +import { actions, EventHandlers, events, IConnection, ISchema } from "./types"; const REQUEST_INTERVAL = 10; const TIMEOUT_INTERVAL = 3000; @@ -8,12 +8,12 @@ const TIMEOUT_INTERVAL = 3000; let interval: any = null; let connected = false; -function connect(schema: ISchema = {}): Promise { +function connect(schema: ISchema = {}, eventHandlers?: EventHandlers): Promise { return new Promise((resolve, reject) => { const localMethods = extractMethods(schema); // on handshake response - function handleHandshakeResponse(event: any) { + async function handleHandshakeResponse(event: any) { if (event.data.action !== actions.HANDSHAKE_REPLY) return; // register local methods @@ -27,6 +27,8 @@ function connect(schema: ISchema = {}): Promise { event ); + await eventHandlers?.onConnectionSetup?.(remote); + // close the connection and all listeners when called const close = () => { self.removeEventListener(events.MESSAGE, handleHandshakeResponse); diff --git a/src/host.ts b/src/host.ts index 0102a6c..fcd69bd 100644 --- a/src/host.ts +++ b/src/host.ts @@ -70,6 +70,7 @@ function connect(guest: HTMLIFrameElement | Worker, schema: ISchema = {}): Promi listeners.removeEventListener(events.MESSAGE, handleHandshake); unregisterRemote(); unregisterLocal(); + if (guestIsWorker) (guest as Worker).terminate(); }; // resolve connection object diff --git a/src/types.ts b/src/types.ts index fab3433..ee4bb73 100644 --- a/src/types.ts +++ b/src/types.ts @@ -59,3 +59,7 @@ export interface IRPCResolvePayload { callName: string; connectionID: string; } + +export interface EventHandlers { + onConnectionSetup: (remote: ISchema) => Promise; +}