Skip to content

Commit d88d198

Browse files
committed
add support for sharedworker
1 parent bb214f7 commit d88d198

3 files changed

Lines changed: 16 additions & 13 deletions

File tree

src/guest.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import {
77
removeEventListener,
88
} from "./helpers";
99
import { registerLocalMethods, registerRemoteMethods } from "./rpc";
10-
import { actions, EventHandlers, events, Connection, Schema } from "./types";
10+
import { actions, GuestConnectOptions, events, Connection, Schema } from "./types";
1111

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

1818
// on handshake response
1919
async function handleHandshakeResponse(event: any) {
@@ -27,13 +27,13 @@ function connect(schema: Schema = {}, eventHandlers?: EventHandlers): Promise<Co
2727
eventData.connectionID,
2828
event,
2929
listenTo,
30-
sendTo,
30+
sendTo
3131
);
3232

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

36-
await eventHandlers?.onConnectionSetup?.(remote);
36+
await options?.onConnectionSetup?.(remote);
3737

3838
// send a HANDSHAKE REPLY to the host
3939
const payload = {

src/host.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,16 @@ function connect(guest: Guest, schema: Schema = {}): Promise<Connection> {
4949

5050
const guestIsWorker = isWorkerLike(guest);
5151

52-
const listenTo = guestIsWorker || isNodeEnv() ? (guest as Worker) : window;
52+
const listenTo =
53+
guestIsWorker || isNodeEnv() ? (guest as Worker) : guest instanceof SharedWorker ? guest.port : window;
5354

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

5758
// on handshake request
5859
function handleHandshake(event: any) {
59-
const sendTo = guestIsWorker || isNodeEnv() ? (guest as Worker) : event.source;
60+
const sendTo =
61+
guestIsWorker || isNodeEnv() ? (guest as Worker) : guest instanceof SharedWorker ? guest.port : event.source;
6062

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

@@ -74,7 +76,7 @@ function connect(guest: Guest, schema: Schema = {}): Promise<Connection> {
7476
connectionID,
7577
event,
7678
listenTo,
77-
sendTo,
79+
sendTo
7880
);
7981

8082
// Now register local methods, passing the remote object

src/types.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,11 @@ export interface RPCResolvePayload {
6666
connectionID: string;
6767
}
6868

69-
export interface EventHandlers {
69+
export type GuestConnectOptions = {
70+
hostTarget?: Target;
7071
onConnectionSetup: (remote: Schema) => Promise<void>;
71-
}
72+
};
7273

7374
export type Guest = WorkerLike | HTMLIFrameElement;
74-
export type Target = Window | WorkerLike;
75-
export type Environment = Window | WorkerLike;
75+
export type Target = Window | WorkerLike | MessagePort;
76+
export type Environment = Window | WorkerLike | MessagePort;

0 commit comments

Comments
 (0)