You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
29 lines
907 B
29 lines
907 B
/** |
|
* Loads Web Worker that is compatible with cross-origin scripts for CDNs. |
|
* |
|
* Returns null if the environment doesn't support web workers. |
|
*/ |
|
export function loadWorker(url: string | URL, options: WorkerOptions = {}) { |
|
if (!('Worker' in window)) { |
|
return null; |
|
} |
|
|
|
try { |
|
// Check if the script origin and the window origin are the same. |
|
const scriptUrl = new URL(import.meta.url); |
|
if (location.origin === scriptUrl.origin) { |
|
// Not cross-origin, can just load normally. |
|
return new Worker(url, options); |
|
} |
|
} catch (err) { |
|
// In case the URL parsing fails. |
|
console.warn('Error instantiating Worker:', err); |
|
} |
|
|
|
// Import the worker script from a same-origin Blob. |
|
const contents = `import ${JSON.stringify(url)};`; |
|
const blob = URL.createObjectURL( |
|
new Blob([contents], { type: 'text/javascript' }), |
|
); |
|
return new Worker(blob, options); |
|
}
|
|
|