Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions src/guest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import {
removeEventListener,
} from "./helpers";
import { registerLocalMethods, registerRemoteMethods } from "./rpc";
import { actions, EventHandlers, events, Connection, Schema } from "./types";
import { actions, GuestConnectOptions, events, Connection, Schema } from "./types";

function connect(schema: Schema = {}, eventHandlers?: EventHandlers): Promise<Connection> {
function connect(schema: Schema = {}, options?: GuestConnectOptions): Promise<Connection> {
return new Promise(async (resolve) => {
const localMethods = extractMethods(schema);
const sendTo = getTargetHost();
const listenTo = self || window;
const sendTo = options?.hostTarget ?? getTargetHost();
const listenTo = options?.hostTarget ?? (self || window);

// on handshake response
async function handleHandshakeResponse(event: any) {
Expand All @@ -27,13 +27,13 @@ function connect(schema: Schema = {}, eventHandlers?: EventHandlers): Promise<Co
eventData.connectionID,
event,
listenTo,
sendTo,
sendTo
);

// register local methods, passing the remote object
const unregisterLocal = registerLocalMethods(localMethods, eventData.connectionID, listenTo, sendTo, remote);

await eventHandlers?.onConnectionSetup?.(remote);
await options?.onConnectionSetup?.(remote);

// send a HANDSHAKE REPLY to the host
const payload = {
Expand Down
8 changes: 5 additions & 3 deletions src/host.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,16 @@ function connect(guest: Guest, schema: Schema = {}): Promise<Connection> {

const guestIsWorker = isWorkerLike(guest);

const listenTo = guestIsWorker || isNodeEnv() ? (guest as Worker) : window;
const listenTo =
guestIsWorker || isNodeEnv() ? (guest as Worker) : guest instanceof SharedWorker ? guest.port : window;

return new Promise((resolve) => {
const connectionID = generateId();

// on handshake request
function handleHandshake(event: any) {
const sendTo = guestIsWorker || isNodeEnv() ? (guest as Worker) : event.source;
const sendTo =
guestIsWorker || isNodeEnv() ? (guest as Worker) : guest instanceof SharedWorker ? guest.port : event.source;

if (!guestIsWorker && !isNodeEnv() && !isValidTarget(guest, event)) return;

Expand All @@ -74,7 +76,7 @@ function connect(guest: Guest, schema: Schema = {}): Promise<Connection> {
connectionID,
event,
listenTo,
sendTo,
sendTo
);

// Now register local methods, passing the remote object
Expand Down
9 changes: 5 additions & 4 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,11 @@ export interface RPCResolvePayload {
connectionID: string;
}

export interface EventHandlers {
export type GuestConnectOptions = {
hostTarget?: Target;
onConnectionSetup: (remote: Schema) => Promise<void>;
}
};

export type Guest = WorkerLike | HTMLIFrameElement;
export type Target = Window | WorkerLike;
export type Environment = Window | WorkerLike;
export type Target = Window | WorkerLike | MessagePort;
export type Environment = Window | WorkerLike | MessagePort;
Loading