diff --git a/src/index.ts b/src/index.ts index e740c82..6bed537 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,7 @@ export const SharedWorkerSupported = "SharedWorker" in globalThis; /** * A polyfill class for `SharedWorker`, it accepts a URL/string as well as any other options the spec. allows for `SharedWorker`. It supports all the same methods and properties as the original, except it adds compatibility methods and properties for older browsers that don't support `SharedWorker`, so, it can switch to normal `Workers` instead. */ -export class SharedWorkerPolyfill implements SharedWorker { +export class SharedWorkerPolyfill implements SharedWorker, EventTarget, AbstractWorker { /** * The actual worker that is used, depending on browser support it can be either a `SharedWorker` or a normal `Worker`. */ @@ -72,11 +72,11 @@ export class SharedWorkerPolyfill implements SharedWorker { /** * Clones message and transmits it to worker's global environment. transfer can be passed as a list of objects that are to be transferred rather than cloned. */ - public postMessage(message: any, transfer?: Transferable[]) { + public postMessage(message: any, transfer?: Transferable[] | StructuredSerializeOptions) { if (SharedWorkerSupported) { - return (this.ActualWorker as SharedWorker)?.port.postMessage(message, transfer); + return (this.ActualWorker as SharedWorker)?.port.postMessage(message, transfer as unknown); } else { - return (this.ActualWorker as Worker).postMessage(message, transfer); + return (this.ActualWorker as Worker).postMessage(message, transfer as unknown); } } @@ -119,7 +119,9 @@ export class SharedWorkerPolyfill implements SharedWorker { /** * Registers an event handler of a specific event type on the EventTarget */ - public addEventListener(type: K, listener: (this: SharedWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; + public addEventListener(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; + public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; + public addEventListener(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void { if (SharedWorkerSupported && type !== "error") { return (this.ActualWorker as SharedWorker)?.port.addEventListener(type, listener, options) @@ -131,8 +133,10 @@ export class SharedWorkerPolyfill implements SharedWorker { /** * Removes an event listener from the EventTarget. */ - public removeEventListener(type: K, listener: (this: Worker | SharedWorker, ev: WorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void; - public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) { + public removeEventListener(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void; + public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; + public removeEventListener(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | EventListenerOptions): void; + public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void { if (SharedWorkerSupported && type !== "error") { return (this.ActualWorker as SharedWorker)?.port.removeEventListener(type, listener, options) } else { @@ -148,4 +152,8 @@ export class SharedWorkerPolyfill implements SharedWorker { } } +new SharedWorkerPolyfill("").addEventListener("message", () => { + console.log("message"); +}); + export default SharedWorkerPolyfill; \ No newline at end of file