1.0.1 • Published 8 months ago

fastify-uws v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

fastify-uws

fastify-uws

A performant HTTP and WebSocket server for Fastify with uWebSockets.

Installation

Install fastify-uws with your favorite package manager:

$ 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.

// app.ts
import fastify from 'fastify';
import { serverFactory } from 'fastify-uws'; // Import here

import 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;
};
// 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

// 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

// app.ts
import multipart from '@fastify/multipart';

app.register(multipart);
// 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(); // Buffer

    return reply.send({ message: 'ok' });
  });
}) as FastifyPluginAsyncTypebox;

Use WebSocket

Just a single line of change can speed up your WebSocket application in Fastify.

- import websocket from '@fastify/websocket';
+ import { websocket } from 'fastify-uws';
// app.ts
import { websocket } from 'fastify-uws';

app.register(websocket);
// 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

// app.ts
import { eventsource } from 'fastify-uws';

app.register(eventsource);
// 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

$ oha -c 500 -z 10s --no-tui http://0.0.0.0:3000/api/hello-world
VersionLanguageRouterRequests/sec
hyper1.4.1Rust56,175.6102
warp0.3.7Rust55,868.5861
axum0.7.7Rust54,588.2828
bun1.1.30TypeScript/Bun54,098.4841
graphul1.0.1Rust53,949.4400
poem3.1.0Rust53,849.0781
uws20.48.0JavaScript/Node52,802.8029
elysia1.1.17TypeScript/Bun52,257.3305
~ 5.5k ~
hyper-express6.17.2JavaScript/Node46,745.4887
hono4.6.3TypeScript/Bun46,685.6014
nhttp2.0.2TypeScript/Deno44,874.2535
deno2.0.0TypeScript/Deno44,753.8552
hono4.6.3TypeScript/Deno43,280.7544
~ 9.2k ~
h31.12.0TypeScript/Bun34,043.4693
fastify-uws1.0.0JavaScript/Node31,295.8715
polka1.0.0-next.28JavaScript/Node31,086.5543
oak17.0.0TypeScript/Deno30,730.7971
node20.18.0JavaScript/Node29,230.1719
oak17.0.0TypeScript/Bun27,449.3417
fastify5.0.0JavaScript/Node27,408.6679
hono4.6.3JavaScript/Node25,138.5659
~ 4.9k ~
h31.12.0JavaScript/Node20,193.2311
~ 9.2k ~
express4.21.0JavaScript/Node10,949.1532
1.0.1

8 months ago

1.0.0

9 months ago

0.9.0

10 months ago

0.8.1

11 months ago

0.8.0

12 months ago

0.7.1

1 year ago

0.7.0

1 year ago

0.6.1

1 year ago

0.6.0

1 year ago

0.5.0

1 year ago

0.4.0

1 year ago

0.3.0

1 year ago

0.2.1

2 years ago

0.2.0

2 years ago

0.1.0

2 years ago