UNPKG

vite-plugin-sharedworker

Version:

Make SharedWorker works like Remote Procedure Call easily

68 lines (62 loc) 2.49 kB
'use strict'; const path = require('path'); const mlly = require('mlly'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; } const path__default = /*#__PURE__*/_interopDefaultCompat(path); function SharedWorker(options = {}) { const { include = [/\.sharedworker\.(js|ts)/] } = options ?? {}; const filter = (id) => { const text = id.replace(/\?[^=]+=[^=]+(&[^=]+=[^=]+)*$/, ""); for (const pat of include) { if (typeof pat === "string") { if (text.includes(pat)) { return true; } } else { if (pat.test(text)) { return true; } } } return false; }; return { name: "vite-plugin-sharedworker:client", enforce: "pre", transform(code, id) { if (filter(id)) { const isClient = !id.endsWith("worker_file"); const exports = mlly.findExports(code).filter((ex) => !!ex.name).filter((ex) => ex.name !== "dispatch" && ex.name !== "addMessageListener"); if (isClient) { const workerName = path__default.basename(id.split("?")[0]); return [ `// vite-plugin-sharedworker starts`, `import { defineClientFactory } from 'vite-plugin-sharedworker/runtime'`, `const __worker__ = new SharedWorker(new URL(${JSON.stringify( id )}, import.meta.url), { type: 'module', name: ${JSON.stringify(workerName)} });`, `const __factory__ = defineClientFactory(__worker__)`, `const client = __factory__.defineClient()`, `export const dispatch = client.dispatch`, `export const addMessageListener = client.addMessageListener`, `// vite-plugin-sharedworker ends`, ...exports.map( (ex) => `export const ${ex.name} = __factory__.defineFunction(${JSON.stringify(ex.name)})` ) ].join("\n"); } else { const imports = [ `// vite-plugin-sharedworker starts`, `import { defineSharedWorker } from 'vite-plugin-sharedworker/runtime'`, `const worker = defineSharedWorker(self, [${exports.map((ex) => ex.name).join(", ")}])`, `const client = { dispatch: undefined, addMessageListener: undefined }`, `// vite-plugin-sharedworker ends`, "" ]; return imports.join("\n") + "\n" + code; } } } }; } module.exports = SharedWorker;