UNPKG

4.01 kBTypeScriptView Raw
1import type { Dictionary } from '@crawlee/types';
2import type { CrawlingContext } from './crawlers/crawler_commons';
3import type { Awaitable } from './typedefs';
4import type { Request } from './request';
5import type { Except } from './except';
6export interface RouterHandler<Context extends CrawlingContext = CrawlingContext> extends Router<Context> {
7 (ctx: Context): Awaitable<void>;
8}
9declare type GetUserDataFromRequest<T> = T extends Request<infer Y> ? Y : never;
10/**
11 * Simple router that works based on request labels. This instance can then serve as a `requestHandler` of your crawler.
12 *
13 * ```ts
14 * import { Router, CheerioCrawler, CheerioCrawlingContext } from 'crawlee';
15 *
16 * const router = Router.create<CheerioCrawlingContext>();
17 *
18 * // we can also use factory methods for specific crawling contexts, the above equals to:
19 * // import { createCheerioRouter } from 'crawlee';
20 * // const router = createCheerioRouter();
21 *
22 * router.addHandler('label-a', async (ctx) => {
23 * ctx.log.info('...');
24 * });
25 * router.addDefaultHandler(async (ctx) => {
26 * ctx.log.info('...');
27 * });
28 *
29 * const crawler = new CheerioCrawler({
30 * requestHandler: router,
31 * });
32 * await crawler.run();
33 * ```
34 *
35 * Alternatively we can use the default router instance from crawler object:
36 *
37 * ```ts
38 * import { CheerioCrawler } from 'crawlee';
39 *
40 * const crawler = new CheerioCrawler();
41 *
42 * crawler.router.addHandler('label-a', async (ctx) => {
43 * ctx.log.info('...');
44 * });
45 * crawler.router.addDefaultHandler(async (ctx) => {
46 * ctx.log.info('...');
47 * });
48 *
49 * await crawler.run();
50 * ```
51 *
52 * Middlewares are also supported via the `router.use` method. There can be multiple
53 * middlewares for a single router, they will be executed sequentially in the same
54 * order as they were registered.
55 *
56 * ```ts
57 * crawler.router.use(async (ctx) => {
58 * ctx.log.info('...');
59 * });
60 */
61export declare class Router<Context extends CrawlingContext> {
62 private readonly routes;
63 private readonly middlewares;
64 /**
65 * use Router.create() instead!
66 * @ignore
67 */
68 protected constructor();
69 /**
70 * Registers new route handler for given label.
71 */
72 addHandler<UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(label: string | symbol, handler: (ctx: Except<Context, 'request'> & {
73 request: Request<UserData>;
74 }) => Awaitable<void>): void;
75 /**
76 * Registers default route handler.
77 */
78 addDefaultHandler<UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(handler: (ctx: Except<Context, 'request'> & {
79 request: Request<UserData>;
80 }) => Awaitable<void>): void;
81 /**
82 * Registers a middleware that will be fired before the matching route handler.
83 * Multiple middlewares can be registered, they will be fired in the same order.
84 */
85 use(middleware: (ctx: Context) => Awaitable<void>): void;
86 /**
87 * Returns route handler for given label. If no label is provided, the default request handler will be returned.
88 */
89 getHandler(label?: string | symbol): (ctx: Context) => Awaitable<void>;
90 /**
91 * Throws when the label already exists in our registry.
92 */
93 private validate;
94 /**
95 * Creates new router instance. This instance can then serve as a `requestHandler` of your crawler.
96 *
97 * ```ts
98 * import { Router, CheerioCrawler, CheerioCrawlingContext } from 'crawlee';
99 *
100 * const router = Router.create<CheerioCrawlingContext>();
101 * router.addHandler('label-a', async (ctx) => {
102 * ctx.log.info('...');
103 * });
104 * router.addDefaultHandler(async (ctx) => {
105 * ctx.log.info('...');
106 * });
107 *
108 * const crawler = new CheerioCrawler({
109 * requestHandler: router,
110 * });
111 * await crawler.run();
112 * ```
113 */
114 static create<Context extends CrawlingContext = CrawlingContext>(): RouterHandler<Context>;
115}
116export {};
117//# sourceMappingURL=router.d.ts.map
\No newline at end of file