Skip to content

Instantly share code, notes, and snippets.

@mike-at-redspace
Last active March 8, 2023 09:22
Show Gist options
  • Save mike-at-redspace/2402fca4f5623459b2becceb936381ff to your computer and use it in GitHub Desktop.
Save mike-at-redspace/2402fca4f5623459b2becceb936381ff to your computer and use it in GitHub Desktop.
Worker Threads in Node.js 18
const http = require('http');
const { Worker } = require('worker_threads');
const slowApiEndpoint = 'https://api.example.com/slow-endpoint';
http.createServer((req, res) => {
if (req.url === '/api-data') {
const worker = new Worker('./slow-api-worker.js');
worker.on('message', (data) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(data);
res.end();
});
worker.on('error', (err) => {
console.error(`Worker error: ${err}`);
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.write('500 Internal Server Error');
res.end();
});
worker.on('exit', (code) => {
console.log(`Worker exited with code ${code}`);
});
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.write('404 Not Found');
res.end();
}
}).listen(8080, () => {
console.log('Server listening on port 8080');
});
const { Worker } = require('worker_threads');
const https = require('https');
const slowApiEndpoint = 'https://api.example.com/slow-endpoint';
function makeSlowApiCall() {
return new Promise((resolve, reject) => {
https.get(slowApiEndpoint, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
resolve(data);
});
}).on('error', (err) => {
reject(err);
});
});
}
function makeApiCallAndSendResponse() {
makeSlowApiCall().then((data) => {
worker.postMessage(data);
}).catch((err) => {
console.error(`API call error: ${err}`);
worker.postMessage('500 Internal Server Error');
});
}
const worker = new Worker(() => {
makeApiCallAndSendResponse();
});
worker.on('error', (err) => {
console.error(`Worker error: ${err}`);
});
worker.on('exit', (code) => {
console.log(`Worker exited with code ${code}`);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment