sw-worker es una librería que facilita la comunicación entre un cliente y un trabajador (worker) en entornos de navegador o extensiones. Proporciona una arquitectura modular y flexible para manejar rutas, solicitudes y respuestas.
Usa el siguiente comando para instalar la dependencia:
npm install sw-workerO si usas pnpm:
pnpm add sw-workerEl cliente (SWWorkerClient) permite realizar solicitudes al trabajador. Puedes inicializarlo con diferentes configuraciones dependiendo del entorno.
import { SWWorkerClient } from 'sw-worker/client';
const client = new SWWorkerClient({
runtime: 'browser',
url: new URL('./worker.js', import.meta.url),
});
// Realizar una solicitud GET
client.get('/ruta')
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => console.error('Error:', error))
.finally(() => console.log('Finalizado'));
// Realizar una solicitud POST
client.post('/ruta', { key: 'value' })
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => console.error('Error:', error))
.finally(() => console.log('Finalizado'));
// Terminar el worker cuando ya no sea necesario
client.terminate();El trabajador (SWWorker) permite definir rutas y manejar solicitudes desde el cliente.
import SWWorker from 'sw-worker/worker';
const worker = new SWWorker('browser');
// Definir rutas
worker.get('/ruta', (req, res) => {
res.send({ mensaje: 'Hola desde el worker' });
});
worker.post('/ruta', (req, res) => {
const { key } = req.body;
res.send({ mensaje: `Recibido: ${key}` });
});
// Escuchar solicitudes
worker.listen();El cliente y el trabajador también pueden ser utilizados en un entorno de extensión. A continuación, se muestra un ejemplo con rutas CRUD para /tabs y /bookmarks:
import { SWWorkerClient } from 'sw-worker/client';
const client = new SWWorkerClient({
runtime: 'extension',
});
// Obtener todas las pestañas
client.get('/tabs')
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => console.error('Error:', error))
.finally(() => console.log('Finalizado'));
// Crear un marcador
client.post('/bookmarks', { title: 'Nuevo Marcador', url: 'https://example.com' })
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => console.error('Error:', error))
.finally(() => console.log('Finalizado'));import SWWorker from 'sw-worker/worker';
const worker = new SWWorker('extension');
// Rutas para pestañas
worker.get('/tabs', async (req, res) => {
const tabs = await chrome.tabs.query({});
res.send({ tabs });
});
worker.post('/tabs', async (req, res) => {
const { url } = req.body;
const tab = await chrome.tabs.create({ url });
res.send({ tab });
});
// Rutas para marcadores
worker.get('/bookmarks', async (req, res) => {
const bookmarks = await chrome.bookmarks.getTree();
res.send({ bookmarks });
});
worker.post('/bookmarks', async (req, res) => {
const { title, url } = req.body;
const bookmark = await chrome.bookmarks.create({ title, url });
res.send({ bookmark });
});
// Escuchar solicitudes
worker.listen();La librería sigue una arquitectura modular:
sw-worker/
├── src/
│ ├── client/
│ │ └── index.ts
│ ├── worker/
│ │ └── index.ts
│ ├── managers/
│ │ ├── RequestHandler.ts
│ │ ├── ResponseManager.ts
│ │ └── RouteManager.ts
│ ├── types/
│ │ └── types.d.ts
│ └── utils/
│ └── pathUtils.ts
├── tests/
│ ├── client.test.ts
│ └── worker.test.ts
├── package.json
├── tsconfig.json
├── LICENSE
└── README.md
get(route: string, headers?: HeadersInit): Promise<ClientResponse>post(route: string, body?: StructuredCloneable, headers?: HeadersInit): Promise<ClientResponse>put(route: string, body?: StructuredCloneable, headers?: HeadersInit): Promise<ClientResponse>delete(route: string, body?: StructuredCloneable, headers?: HeadersInit): Promise<ClientResponse>terminate(): void
get(path: string, handler: Handler): voidpost(path: string, handler: Handler): voidput(path: string, handler: Handler): voiddelete(path: string, handler: Handler): voidroute(path: string, app: SWWorker): voidlisten(): void
¡Las contribuciones son bienvenidas! Si deseas colaborar, sigue estos pasos:
- Haz un fork del repositorio.
- Crea una rama para tu funcionalidad (
git checkout -b feature/nueva-funcionalidad). No envíes tus cambios a la ramamaster, utiliza la ramadevelop. - Realiza tus cambios y haz un commit (
git commit -m 'feat: agrega nueva funcionalidad'). - Sube tus cambios a tu rama (
git push origin feature/nueva-funcionalidad). - Abre un Pull Request en el repositorio principal.
Nota: El flujo de trabajo de GitHub Actions solo se ejecutará en la rama master.
Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.
Repositorio: sw-worker