An HTTP & WebSocket server that is a little ray of sunshine.
npm install nodeshine
Or on Bun, you can use Bunshine directly.
Nodeshine adds compatibility layer under Bunshine so that it can run on Node.
Features that come with Bunshine:
- Use bare
Request
andResponse
objects - Support for routing
WebSocket
requests (Coming soon) - Support for Server Sent Events
- Support ranged file downloads (e.g. for video streaming)
- Be very lightweight
- Treat every handler like middleware
- Support async handlers
- Provide common middleware out of the box
- Built-in gzip compression
- Comprehensive unit tests
- Support for
X-HTTP-Method-Override
header
import { HttpRouter } from 'nodeshine';
const app = new HttpRouter();
app.get('/', c => {
return new Response('Hello at ' + c.url.pathname);
});
app.listen({ port: 3100 });
import { HttpRouter, redirect } from 'nodeshine';
const app = new HttpRouter();
app.patch('/users/:id', async c => {
await authorize(c.request.headers.get('Authorization'));
const data = await c.request.json();
const result = await updateUser(params.id, data);
if (result === 'not found') {
return c.json({ error: 'User not found' }, { status: 404 });
} else if (result === 'error') {
return c.json({ error: 'Error updating user' }, { status: 500 });
} else {
return c.json({ error: false });
}
});
app.on404(c => {
// called when no handlers match the requested path
return c.text('Page Not found', { status: 404 });
});
app.on500(c => {
// called when a handler throws an error
console.error('500', c.error);
return c.json({ error: 'Internal server error' }, { status: 500 });
});
app.listen({ port: 3100 });
function authorize(authHeader: string) {
if (!authHeader) {
throw redirect('/login');
} else if (!jwtVerify(authHeader)) {
throw redirect('/not-allowed');
}
}
- 🔲 Support for HTTPS
- 🔲 Support for Bunshine's socket handling
- 🔲 Support Bunshine's bin/serve.ts
- ✅ Get requester ip