33
44import type { WorkerMessage } from "./types" ;
55
6- declare const self : SharedWorkerGlobalScope ;
6+ interface PostMessageCapable {
7+ postMessage ( message : unknown , transfer ?: Transferable [ ] ) : void ;
8+ }
79
810export function encryptionWorkerFunction ( ) {
911 let cacheKey : Uint8Array | null = null ;
@@ -55,7 +57,7 @@ export function encryptionWorkerFunction() {
5557 return derivedKey ;
5658 }
5759
58- async function initializeKey ( port : MessagePort ) {
60+ async function initializeKey ( port : PostMessageCapable ) {
5961 if ( ! cacheKey ) {
6062 throw new Error ( "Cache key not provided for encryption worker" ) ;
6163 }
@@ -159,11 +161,15 @@ export function encryptionWorkerFunction() {
159161 }
160162 }
161163
162- function handleEncrypt ( requestId : string , value : string , port : MessagePort ) {
164+ function handleEncrypt (
165+ requestId : string ,
166+ value : string ,
167+ port : PostMessageCapable
168+ ) {
163169 enqueueTask ( async ( ) => {
164170 try {
165171 const encrypted = await encrypt ( value ) ;
166- if ( ! port ) throw new Error ( "MessagePort is not available" ) ;
172+ if ( ! port ) throw new Error ( "Worker is not available" ) ;
167173
168174 port . postMessage (
169175 {
@@ -188,12 +194,12 @@ export function encryptionWorkerFunction() {
188194 requestId : string ,
189195 iv : ArrayBuffer ,
190196 ciphertext : ArrayBuffer ,
191- port : MessagePort
197+ port : PostMessageCapable
192198 ) {
193199 enqueueTask ( async ( ) => {
194200 try {
195201 const decrypted = await decrypt ( iv , ciphertext ) ;
196- if ( ! port ) throw new Error ( "MessagePort is not available" ) ;
202+ if ( ! port ) throw new Error ( "Worker is not available" ) ;
197203
198204 port . postMessage ( {
199205 requestId,
@@ -211,9 +217,8 @@ export function encryptionWorkerFunction() {
211217 } ) ;
212218 }
213219
214- function onConnect ( e : MessageEvent ) {
215- const port = e . ports [ 0 ] ;
216- port . onmessage = ( event : MessageEvent < WorkerMessage > ) => {
220+ const processMessageFn =
221+ ( port : PostMessageCapable ) => ( event : MessageEvent < WorkerMessage > ) => {
217222 const { type, payload, requestId } = event . data ;
218223
219224 switch ( type ) {
@@ -256,8 +261,21 @@ export function encryptionWorkerFunction() {
256261 ) ;
257262 }
258263 } ;
259- port . start ( ) ;
264+
265+ const isSharedWorker = "SharedWorkerGlobalScope" in self ;
266+ const isWorker = "WorkerGlobalScope" in self ;
267+
268+ // SharedWorker
269+ if ( isSharedWorker && "onconnect" in self ) {
270+ self . onconnect = ( e : MessageEvent < WorkerMessage > ) => {
271+ const port = e . ports [ 0 ] ;
272+ port . onmessage = processMessageFn ( port ) ;
273+ port . start ( ) ;
274+ } ;
260275 }
261276
262- self . onconnect = onConnect ;
277+ // Worker
278+ else if ( isWorker && "onmessage" in self ) {
279+ self . onmessage = processMessageFn ( self ) ;
280+ }
263281}
0 commit comments