getWatcherManager.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const path = require("path");
  7. const DirectoryWatcher = require("./DirectoryWatcher");
  8. /** @typedef {import("./index").EventMap} EventMap */
  9. /** @typedef {import("./DirectoryWatcher").DirectoryWatcherOptions} DirectoryWatcherOptions */
  10. /** @typedef {import("./DirectoryWatcher").DirectoryWatcherEvents} DirectoryWatcherEvents */
  11. /** @typedef {import("./DirectoryWatcher").FileWatcherEvents} FileWatcherEvents */
  12. /**
  13. * @template {EventMap} T
  14. * @typedef {import("./DirectoryWatcher").Watcher<T>} Watcher
  15. */
  16. class WatcherManager {
  17. /**
  18. * @param {DirectoryWatcherOptions=} options options
  19. */
  20. constructor(options = {}) {
  21. this.options = options;
  22. /** @type {Map<string, DirectoryWatcher>} */
  23. this.directoryWatchers = new Map();
  24. }
  25. /**
  26. * @param {string} directory a directory
  27. * @returns {DirectoryWatcher} a directory watcher
  28. */
  29. getDirectoryWatcher(directory) {
  30. const watcher = this.directoryWatchers.get(directory);
  31. if (watcher === undefined) {
  32. const newWatcher = new DirectoryWatcher(this, directory, this.options);
  33. this.directoryWatchers.set(directory, newWatcher);
  34. newWatcher.on("closed", () => {
  35. this.directoryWatchers.delete(directory);
  36. });
  37. return newWatcher;
  38. }
  39. return watcher;
  40. }
  41. /**
  42. * @param {string} file file
  43. * @param {number=} startTime start time
  44. * @returns {Watcher<FileWatcherEvents> | null} watcher or null if file has no directory
  45. */
  46. watchFile(file, startTime) {
  47. const directory = path.dirname(file);
  48. if (directory === file) return null;
  49. return this.getDirectoryWatcher(directory).watch(file, startTime);
  50. }
  51. /**
  52. * @param {string} directory directory
  53. * @param {number=} startTime start time
  54. * @returns {Watcher<DirectoryWatcherEvents>} watcher
  55. */
  56. watchDirectory(directory, startTime) {
  57. return this.getDirectoryWatcher(directory).watch(directory, startTime);
  58. }
  59. }
  60. const watcherManagers = new WeakMap();
  61. /**
  62. * @param {DirectoryWatcherOptions} options options
  63. * @returns {WatcherManager} the watcher manager
  64. */
  65. module.exports = (options) => {
  66. const watcherManager = watcherManagers.get(options);
  67. if (watcherManager !== undefined) return watcherManager;
  68. const newWatcherManager = new WatcherManager(options);
  69. watcherManagers.set(options, newWatcherManager);
  70. return newWatcherManager;
  71. };
  72. module.exports.WatcherManager = WatcherManager;