Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/vanilla-icecream/fastify-uws
A performant HTTP and WebSocket server for Fastify with uWebSockets.
https://github.com/vanilla-icecream/fastify-uws
fastify uwebsockets uws
Last synced: about 1 month ago
JSON representation
A performant HTTP and WebSocket server for Fastify with uWebSockets.
- Host: GitHub
- URL: https://github.com/vanilla-icecream/fastify-uws
- Owner: Vanilla-IceCream
- License: mit
- Created: 2023-07-28T08:27:41.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-13T06:22:12.000Z (about 1 month ago)
- Last Synced: 2024-11-13T07:25:19.842Z (about 1 month ago)
- Topics: fastify, uwebsockets, uws
- Language: TypeScript
- Homepage:
- Size: 916 KB
- Stars: 18
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![fastify-uws](./.github/assets/logo.png)
# fastify-uws
A performant HTTP and WebSocket server for Fastify with [uWebSockets](https://github.com/uNetworking/uWebSockets.js).
## Installation
Install `fastify-uws` with your favorite package manager:
```sh
$ npm i fastify-uws
# or
$ yarn add fastify-uws
# or
$ pnpm i fastify-uws
# or
$ bun add fastify-uws
```## Supported
- `fastify` v5.x
- `@fastify/websocket` v11.x## Usage
Just two lines are needed to speed up your Fastify application.
```ts
// app.ts
import fastify from 'fastify';
import { serverFactory } from 'fastify-uws'; // Import hereimport router from '~/plugins/router';
export default () => {
const app = fastify({
logger: {
transport: {
target: '@fastify/one-line-logger',
},
},
serverFactory, // And use here
});app.register(router);
return app;
};
``````ts
// server.ts
import app from './app';const server = app();
const start = async () => {
try {
await server.listen({
host: '127.0.0.1',
port: 3000,
});
} catch (err) {
server.log.error(err);
process.exit(1);
}
};start();
```### Use [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
```ts
// src/routes/hello-http/+handler.ts
import type { FastifyPluginAsyncTypebox } from '@fastify/type-provider-typebox';
import { Type } from '@sinclair/typebox';export default (async (app) => {
app.get(
'',
{
schema: {
response: {
200: Type.Object({
message: Type.String(),
}),
},
},
},
async (req, reply) => {
return reply.send({
message: 'Hello, World!',
});
},
);
}) as FastifyPluginAsyncTypebox;
```#### With [FormData](https://developer.mozilla.org/en-US/docs/Web/API/FormData)
```ts
// app.ts
import multipart from '@fastify/multipart';app.register(multipart);
``````ts
// src/routes/hello-fd/+handler.ts
import type { FastifyPluginAsyncTypebox } from '@fastify/type-provider-typebox';
import fs from 'node:fs';
import { pipeline } from 'node:stream/promises';export default (async (app) => {
app.post('', async (req, reply) => {
const data = await req.file();data.file; // stream
data.fields; // other parsed parts
data.fieldname;
data.filename;
data.encoding;
data.mimetype;await pipeline(data.file, fs.createWriteStream(data.filename));
// or
// await data.toBuffer(); // Bufferreturn reply.send({ message: 'ok' });
});
}) as FastifyPluginAsyncTypebox;
```### Use [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket)
Just a single line of change can speed up your WebSocket application in Fastify.
```diff
- import websocket from '@fastify/websocket';
+ import { websocket } from 'fastify-uws';
``````ts
// app.ts
import { websocket } from 'fastify-uws';app.register(websocket);
``````ts
// src/routes/hello-ws/+handler.ts
import type { FastifyPluginAsyncTypebox } from '@fastify/type-provider-typebox';export default (async (app) => {
app.get('', { websocket: true }, (socket, request) => {
app.log.info('Client connected');socket.on('message', (message: MessageEvent) => {
console.log(`Client message: ${message}`);
socket.send('Hello from Fastify!');
});socket.on('close', () => {
app.log.info('Client disconnected');
});
});
}) as FastifyPluginAsyncTypebox;
```### Use [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource)
```ts
// app.ts
import { eventsource } from 'fastify-uws';app.register(eventsource);
``````ts
// src/routes/hello-sse/+handler.ts
import type { FastifyPluginAsyncTypebox } from '@fastify/type-provider-typebox';export default (async (app) => {
app.get('', (req, reply) => {
let index = 0;reply.sse({ id: String(index), data: `Some message ${index}` });
const interval = setInterval(() => {
index += 1;reply.sse({ id: String(index), data: `Some message ${index}` });
if (index === 10) {
clearInterval(interval);
}
}, 1000);req.raw.on('close', () => {
clearInterval(interval);
app.log.info('Client disconnected');
reply.sse({ event: 'close' });
});
});
}) as FastifyPluginAsyncTypebox;
```## Benchmarks
### [oha v1.4.5](https://github.com/hatoo/oha)
```sh
$ oha -c 500 -z 10s --no-tui http://0.0.0.0:3000/api/hello-world
```| | Version | Language | Router | Requests/sec |
| :------------ | ------------: | :-------------- | -----: | -----------: |
| hyper | 1.4.1 | Rust | ✗ | 56,175.6102 |
| warp | 0.3.7 | Rust | ✓ | 55,868.5861 |
| axum | 0.7.7 | Rust | ✓ | 54,588.2828 |
| bun | 1.1.30 | TypeScript/Bun | ✗ | 54,098.4841 |
| graphul | 1.0.1 | Rust | ✓ | 53,949.4400 |
| poem | 3.1.0 | Rust | ✓ | 53,849.0781 |
| uws | 20.48.0 | JavaScript/Node | ✗ | 52,802.8029 |
| elysia | 1.1.17 | TypeScript/Bun | ✓ | 52,257.3305 |
| | | | | ~ 5.5k ~ |
| hyper-express | 6.17.2 | JavaScript/Node | ✓ | 46,745.4887 |
| hono | 4.6.3 | TypeScript/Bun | ✓ | 46,685.6014 |
| nhttp | 2.0.2 | TypeScript/Deno | ✓ | 44,874.2535 |
| deno | 2.0.0 | TypeScript/Deno | ✗ | 44,753.8552 |
| hono | 4.6.3 | TypeScript/Deno | ✓ | 43,280.7544 |
| | | | | ~ 9.2k ~ |
| h3 | 1.12.0 | TypeScript/Bun | ✓ | 34,043.4693 |
| fastify-uws | 1.0.0 | JavaScript/Node | ✓ | 31,295.8715 |
| polka | 1.0.0-next.28 | JavaScript/Node | ✓ | 31,086.5543 |
| oak | 17.0.0 | TypeScript/Deno | ✓ | 30,730.7971 |
| node | 20.18.0 | JavaScript/Node | ✗ | 29,230.1719 |
| oak | 17.0.0 | TypeScript/Bun | ✓ | 27,449.3417 |
| fastify | 5.0.0 | JavaScript/Node | ✓ | 27,408.6679 |
| hono | 4.6.3 | JavaScript/Node | ✓ | 25,138.5659 |
| | | | | ~ 4.9k ~ |
| h3 | 1.12.0 | JavaScript/Node | ✓ | 20,193.2311 |
| | | | | ~ 9.2k ~ |
| express | 4.21.0 | JavaScript/Node | ✓ | 10,949.1532 |## Credits
This project is based on [`@geut/fastify-uws`](https://github.com/geut/fastify-uws) and is licensed under the MIT License.