[cacheable-request] Add types

This commit is contained in:
Dimitri Benin
2019-01-31 20:37:05 +01:00
parent 8216ccb289
commit b89eeef9de
4 changed files with 187 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
import * as http from 'http';
import * as https from 'https';
import CacheableRequest = require('cacheable-request');
import QuickLRU = require('quick-lru');
// You can do
let cacheableRequest = new CacheableRequest(http.request);
const cacheReq = cacheableRequest('http://example.com', res => {
res; // $ExpectType ServerResponse | ResponseLike
});
cacheReq.on('request', req => req.end());
cacheableRequest = new CacheableRequest(https.request);
cacheableRequest = new CacheableRequest(http.request, 'redis://user:pass@localhost:6379');
cacheableRequest = new CacheableRequest(http.request, new Map());
cacheableRequest = new CacheableRequest(http.request, new QuickLRU({ maxSize: 1000 }));
cacheableRequest('example.com', res => {
res; // $ExpectType ServerResponse | ResponseLike
})
.on('error', err => {
err; // $ExpectType RequestErrorCls | CacheErrorCls
})
.on('request', req => {
req.on('error', () => {});
req.end();
});

134
types/cacheable-request/index.d.ts vendored Normal file
View File

@@ -0,0 +1,134 @@
// Type definitions for cacheable-request 6.0
// Project: https://github.com/lukechilds/cacheable-request#readme
// Definitions by: BendingBender <https://github.com/BendingBender>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
/// <reference types="node" />
import { request, RequestOptions, ClientRequest, ServerResponse } from 'http';
import { URL } from 'url';
import { EventEmitter } from 'events';
import { Store } from 'keyv';
import { Options as CacheSemanticsOptions } from 'http-cache-semantics';
import ResponseLike = require('responselike');
export = CacheableRequest;
declare const CacheableRequest: CacheableRequest;
type RequestFn = typeof request;
interface CacheableRequest {
new (requestFn: RequestFn, storageAdapter?: string | Store<any>): (
opts: string | URL | (RequestOptions & CacheSemanticsOptions),
cb?: (response: ServerResponse | ResponseLike) => void
) => CacheableRequest.Emitter;
RequestError: typeof RequestErrorCls;
CacheError: typeof CacheErrorCls;
}
declare namespace CacheableRequest {
interface Options {
/**
* If the cache should be used. Setting this to `false` will completely bypass the cache for the current request.
* @default true
*/
cache?: boolean;
/**
* If set to `true` once a cached resource has expired it is deleted and will have to be re-requested.
*
* If set to `false`, after a cached resource's TTL expires it is kept in the cache and will be revalidated
* on the next request with `If-None-Match`/`If-Modified-Since` headers.
* @default false
*/
strictTtl?: boolean;
/**
* Limits TTL. The `number` represents milliseconds.
* @default undefined
*/
maxTtl?: number;
/**
* When set to `true`, if the DB connection fails we will automatically fallback to a network request.
* DB errors will still be emitted to notify you of the problem even though the request callback may succeed.
* @default false
*/
automaticFailover?: boolean;
/**
* Forces refreshing the cache. If the response could be retrieved from the cache, it will perform a
* new request and override the cache instead.
* @default false
*/
forceRefresh?: boolean;
}
interface Emitter extends EventEmitter {
addListener(event: 'request', listener: (request: ClientRequest) => void): this;
addListener(
event: 'response',
listener: (response: ServerResponse | ResponseLike) => void
): this;
addListener(event: 'error', listener: (error: RequestError | CacheError) => void): this;
on(event: 'request', listener: (request: ClientRequest) => void): this;
on(event: 'response', listener: (response: ServerResponse | ResponseLike) => void): this;
on(event: 'error', listener: (error: RequestError | CacheError) => void): this;
once(event: 'request', listener: (request: ClientRequest) => void): this;
once(event: 'response', listener: (response: ServerResponse | ResponseLike) => void): this;
once(event: 'error', listener: (error: RequestError | CacheError) => void): this;
prependListener(event: 'request', listener: (request: ClientRequest) => void): this;
prependListener(
event: 'response',
listener: (response: ServerResponse | ResponseLike) => void
): this;
prependListener(event: 'error', listener: (error: RequestError | CacheError) => void): this;
prependOnceListener(event: 'request', listener: (request: ClientRequest) => void): this;
prependOnceListener(
event: 'response',
listener: (response: ServerResponse | ResponseLike) => void
): this;
prependOnceListener(
event: 'error',
listener: (error: RequestError | CacheError) => void
): this;
removeListener(event: 'request', listener: (request: ClientRequest) => void): this;
removeListener(
event: 'response',
listener: (response: ServerResponse | ResponseLike) => void
): this;
removeListener(event: 'error', listener: (error: RequestError | CacheError) => void): this;
off(event: 'request', listener: (request: ClientRequest) => void): this;
off(event: 'response', listener: (response: ServerResponse | ResponseLike) => void): this;
off(event: 'error', listener: (error: RequestError | CacheError) => void): this;
removeAllListeners(event?: 'request' | 'response' | 'error'): this;
listeners(event: 'request'): Array<(request: ClientRequest) => void>;
listeners(event: 'response'): Array<(response: ServerResponse | ResponseLike) => void>;
listeners(event: 'error'): Array<(error: RequestError | CacheError) => void>;
rawListeners(event: 'request'): Array<(request: ClientRequest) => void>;
rawListeners(event: 'response'): Array<(response: ServerResponse | ResponseLike) => void>;
rawListeners(event: 'error'): Array<(error: RequestError | CacheError) => void>;
emit(event: 'request', request: ClientRequest): boolean;
emit(event: 'response', response: ServerResponse | ResponseLike): boolean;
emit(event: 'error', error: RequestError | CacheError): boolean;
eventNames(): Array<'request' | 'response' | 'error'>;
listenerCount(type: 'request' | 'response' | 'error'): number;
}
type RequestError = RequestErrorCls;
type CacheError = CacheErrorCls;
}
declare class RequestErrorCls extends Error {
readonly name: 'RequestError';
constructor(error: Error);
}
declare class CacheErrorCls extends Error {
readonly name: 'CacheError';
constructor(error: Error);
}

View File

@@ -0,0 +1,24 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6",
"dom"
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"cacheable-request-tests.ts"
]
}

View File

@@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }