Source

plugin.ts

  1. import { Crawler } from "./crawler";
  2. import { Task } from "./index";
  3. export interface PriorityMap {
  4. before?: number;
  5. after?: number;
  6. finish?: number;
  7. onError?: number;
  8. }
  9. /**
  10. * Basic plugin structure.
  11. */
  12. export interface Plugin {
  13. /**
  14. * Identifier for the plugin.
  15. */
  16. name: string;
  17. /**
  18. * Plugin with higher priority will be executed first.
  19. */
  20. priority?: number;
  21. /**
  22. * Alternative setting for priorities.
  23. * ```js
  24. * {
  25. * before: 100,
  26. * after: 90,
  27. * onError: 40
  28. * }
  29. * ```
  30. */
  31. priorities?: PriorityMap;
  32. /**
  33. * Called before task's execution
  34. */
  35. before?: (task: Task, crawler: Crawler) => any;
  36. /**
  37. * Called after task's execution
  38. */
  39. after?: (task: Task, crawler: Crawler) => any;
  40. /**
  41. * Called when registered on the Crawler
  42. */
  43. start?: (crawler: Crawler) => any;
  44. /**
  45. * Called when all tasks are finished.
  46. */
  47. finish?: (crawler: Crawler) => any;
  48. /**
  49. * Called when an error is throwed during http request.
  50. */
  51. onError?: (error: Error, task: Task, crawler: Crawler) => any;
  52. }
  53. export interface PluginMap {
  54. [name: string]: Plugin;
  55. }
  56. export interface PluginActionMap {
  57. before: Array<Plugin>;
  58. after: Array<Plugin>;
  59. finish: Array<Plugin>;
  60. onError: Array<Plugin>;
  61. }
  62. function priorityOfPlugin(a: Plugin, pos: string) {
  63. return (a.priorities && a.priorities[pos]) || a.priority || 0;
  64. }
  65. export function cmpPlugin(a: Plugin, b: Plugin, pos: string) {
  66. let pa = priorityOfPlugin(a, pos);
  67. let pb = priorityOfPlugin(b, pos);
  68. return pa > pb ? -1 : pa < pb ? 1 : 0;
  69. }