<!-- This file was generated by @travetto/doc and should not be modified directly -->
<!-- Please modify https://github.com/travetto/travetto/tree/main/module/rest-fastify/DOC.tsx and execute "npx trv doc" to rebuild -->
# Fastify REST Source

## Fastify provider for the travetto rest module.

**Install: @travetto/rest-fastify**
```bash
npm install @travetto/rest-fastify

# or

yarn add @travetto/rest-fastify
```

The module is an [fastify](https://www.fastify.io/) provider for the [RESTful API](https://github.com/travetto/travetto/tree/main/module/rest#readme "Declarative api for RESTful APIs with support for the dependency injection module.") module.  This module provides an implementation of [RestApplication](https://github.com/travetto/travetto/tree/main/module/rest/src/application/rest.ts#L19) for automatic injection in the default Rest server.

## Customizing Rest App

**Code: Customizing the Fastify App**
```typescript
import { FastifyPluginAsync } from 'fastify';

import { Injectable } from '@travetto/di';
import { FastifyRestServer } from '@travetto/rest-fastify';
import { TimeUtil } from '@travetto/runtime';

declare let rateLimit: (config: { windowMs: number, max: number }) => FastifyPluginAsync;

@Injectable({ primary: true })
class CustomRestServer extends FastifyRestServer {
  override async init() {
    const app = await super.init();
    const limiter = rateLimit({
      windowMs: TimeUtil.asMillis(15, 'm'), // 15 minutes
      max: 100 // limit each IP to 100 requests per windowMs
    });

    //  apply to all requests
    app.register(limiter);

    return app;
  }
}
```

## Default Middleware
When working with an [fastify](https://www.fastify.io/) applications, the module provides what is assumed to be a sufficient set of basic filters. Specifically:

**Code: Configured Middleware**
```typescript
const app = fastify(fastConf);
    app.register(compress);
    app.removeAllContentTypeParsers();
    app.addContentTypeParser(/^.*/, (req, body, done) => done(null, body));
```
