send-stream
Version:
Streaming file serving library with Range and conditional-GET support from file system or any streaming sources.
103 lines (102 loc) • 3.53 kB
TypeScript
/**
* Request headers
*/
export interface RequestHeaders {
[header: string]: string | string[] | undefined;
'accept-encoding'?: string | undefined;
'if-match'?: string | undefined;
'if-none-match'?: string | undefined;
'if-modified-since'?: string | undefined;
'if-unmodified-since'?: string | undefined;
'range'?: string | undefined;
'if-range'?: string | undefined;
}
/**
* Response headers
*/
export interface ResponseHeaders {
[header: string]: string | string[] | undefined;
'Content-Encoding'?: string | undefined;
'Last-Modified'?: string | undefined;
'Cache-Control'?: string | undefined;
'Content-Type'?: string | undefined;
'ETag'?: string | undefined;
'Accept-Ranges'?: string | undefined;
'Content-Range'?: string | undefined;
'Content-Length'?: string | undefined;
'Vary'?: string | undefined;
'Content-Disposition'?: string | undefined;
'Allow'?: string | undefined;
}
/**
* Range
*/
export declare class StreamRange {
readonly start: number;
readonly end: number;
/**
* StreamRange constructor
* @param start - start index
* @param end - end index
*/
constructor(start: number, end: number);
}
/**
* Uint8Array or StreamRange
*/
export type Uint8ArrayOrStreamRange = StreamRange | Uint8Array;
/**
* Random bytes function returing promise
*/
export declare const randomBytes: (size: number) => Promise<Buffer>;
/**
* Transform stats to etag
* @param size - file size
* @param mtimeMs - modification time in milliseconds
* @param contentEncoding - content encoding
* @param weak - generate weak etag
* @returns etag
*/
export declare function statsToEtag(size: number, mtimeMs: number, contentEncoding?: string, weak?: boolean): string;
/**
* Convert milliseconds to utc string
* @param timeMs - time in milliseconds
* @returns utc string
*/
export declare function millisecondsToUTCString(timeMs: number): string;
/**
* Check if range is fresh
* @param requestHeaders - request headers
* @param etag - etag response header
* @param lastModified - last modified response header
* @returns true if range fresh
*/
export declare function isRangeFresh(requestHeaders: RequestHeaders, etag: string | false, lastModified: string | false): boolean;
/**
* Format content-range header
* @param rangeType - type of range
* @param size - total size
* @param range - range to use (empty = *)
* @returns content-range header
*/
export declare function contentRange(rangeType: string, size: number, range?: StreamRange): string;
/**
* Get accepted content encodings
* @template T - encoding object type
* @param acceptEncoding - Accept-Encoding header value
* @param encodingPreferences - order of preference
* @param identityEncodingPreference - identity encoding preference
* @returns accepted content encodings
*/
export declare function acceptEncodings<T extends {
order: number;
}>(acceptEncoding: string | undefined, encodingPreferences: ReadonlyMap<string, T>, identityEncodingPreference: T): readonly (readonly [string, T])[];
/**
* Get fresh status (ETag, Last-Modified handling)
* @param isGetOrHead - http method is GET or HEAD
* @param requestHeaders - request headers
* @param etag - etag response header
* @param lastModified - last modified response header
* @returns status code
*/
export declare function getFreshStatus(isGetOrHead: boolean, requestHeaders: RequestHeaders, etag: string | false, lastModified: string | false): 412 | 304 | 200;