@fastify/send
Version:
Better streaming static file server with Range and conditional-GET support
168 lines (136 loc) • 5.52 kB
TypeScript
// Definitions by: Mike Jerred <https://github.com/MikeJerred>
// Piotr Błażejewicz <https://github.com/peterblazejewicz>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/// <reference types="node" />
import { Dirent } from 'node:fs'
import * as stream from 'node:stream'
/**
* Create a new SendStream for the given path to send to a res.
* The req is the Node.js HTTP request and the path is a urlencoded path to send (urlencoded, not the actual file-system path).
*/
declare function send (req: stream.Readable, path: string, options?: send.SendOptions): Promise<send.SendResult>
type Send = typeof send
declare class Mime {
constructor (typeMap: TypeMap, ...mimes: TypeMap[])
getType (path: string): string | null
getExtension (mime: string): string | null
define (typeMap: TypeMap, force?: boolean): void
}
interface TypeMap {
[key: string]: string[];
}
declare namespace send {
export const mime: Mime
export const isUtf8MimeType: (value: string) => boolean
export interface SendOptions {
/**
* Enable or disable accepting ranged requests, defaults to true.
* Disabling this will not send Accept-Ranges and ignore the contents of the Range request header.
*/
acceptRanges?: boolean | undefined;
/**
* Enable or disable setting Cache-Control response header, defaults to true.
* Disabling this will ignore the maxAge option.
*/
cacheControl?: boolean | undefined;
/**
* Enable or disable setting Content-Type response header, defaults to true.
*/
contentType?: boolean | undefined;
/**
* Set how "dotfiles" are treated when encountered.
* A dotfile is a file or directory that begins with a dot (".").
* Note this check is done on the path itself without checking if the path actually exists on the disk.
* If root is specified, only the dotfiles above the root are checked (i.e. the root itself can be within a dotfile when when set to "deny").
* 'allow' No special treatment for dotfiles.
* 'deny' Send a 403 for any request for a dotfile.
* 'ignore' Pretend like the dotfile does not exist and 404.
* The default value is similar to 'ignore', with the exception that this default will not ignore the files within a directory that begins with a dot, for backward-compatibility.
*/
dotfiles?: 'allow' | 'deny' | 'ignore' | undefined;
/**
* Byte offset at which the stream ends, defaults to the length of the file minus 1.
* The end is inclusive in the stream, meaning end: 3 will include the 4th byte in the stream.
*/
end?: number | undefined;
/**
* Enable or disable etag generation, defaults to true.
*/
etag?: boolean | undefined;
/**
* If a given file doesn't exist, try appending one of the given extensions, in the given order.
* By default, this is disabled (set to false).
* An example value that will serve extension-less HTML files: ['html', 'htm'].
* This is skipped if the requested file already has an extension.
*/
extensions?: string[] | string | boolean | undefined;
/**
* Enable or disable the immutable directive in the Cache-Control response header, defaults to false.
* If set to true, the maxAge option should also be specified to enable caching.
* The immutable directive will prevent supported clients from making conditional requests during the life of the maxAge option to check if the file has changed.
* @default false
*/
immutable?: boolean | undefined;
/**
* By default send supports "index.html" files, to disable this set false or to supply a new index pass a string or an array in preferred order.
*/
index?: string[] | string | boolean | undefined;
/**
* Enable or disable Last-Modified header, defaults to true.
* Uses the file system's last modified value.
*/
lastModified?: boolean | undefined;
/**
* Provide a max-age in milliseconds for http caching, defaults to 0.
* This can also be a string accepted by the ms module.
*/
maxAge?: string | number | undefined;
/**
* Limit max response content size when acceptRanges is true, defaults to the entire file size.
*/
maxContentRangeChunkSize?: number | undefined;
/**
* Serve files relative to path.
*/
root?: string | undefined;
/**
* Byte offset at which the stream starts, defaults to 0.
* The start is inclusive, meaning start: 2 will include the 3rd byte in the stream.
*/
start?: number | undefined;
/**
* Maximum number of bytes that the internal buffer will hold.
* If omitted, Node.js falls back to its built-in default.
*/
highWaterMark?: number | undefined;
}
export interface BaseSendResult {
statusCode: number
headers: Record<string, string>
stream: stream.Readable
}
export interface FileSendResult extends BaseSendResult {
type: 'file'
metadata: {
path: string
stat: Dirent
}
}
export interface DirectorySendResult extends BaseSendResult {
type: 'directory'
metadata: {
path: string
requestPath: string
}
}
export interface ErrorSendResult extends BaseSendResult {
type: 'error'
metadata: {
error: Error
}
}
export type SendResult = FileSendResult | DirectorySendResult | ErrorSendResult
export const send: Send
export { send as default }
}
export = send