Skip to content

eggjs/watcher

Folders and files

NameName
Last commit message
Last commit date

Latest commit

db82c4a · Jan 11, 2025

History

37 Commits
Dec 20, 2024
Jan 11, 2025
Jan 11, 2025
Jul 16, 2016
Dec 18, 2024
Dec 18, 2024
Jan 11, 2025
Sep 20, 2018
Dec 20, 2024
Jan 11, 2025
Dec 18, 2024

Repository files navigation

@eggjs/watcher

NPM version Node.js CI Test coverage Known Vulnerabilities npm download Node.js Version

File watcher plugin for egg

Usage

In worker process:

app.watcher.watch(path, listener)

Start watching file(s).

  • path(String|Array): file path(s)
  • listener(Function): file change callback

app.watcher.unwatch(path[, listener])

Stop watching file(s).

  • path(String|Array): file path(s)
  • listener(Function): file change callback

In agent process:

agent.watcher.watch(path, listener)

Start watching file(s).

  • path(String|Array): file path(s)
  • listener(Function): file change callback

agent.watcher.unwatch(path[, listener])

Stop watching file(s).

  • path(String|Array): file path(s)
  • listener(Function): file change callback

Watching mode

development Mode

There's a built-in development mode which works in local(env is local). Once files on disk is modified it will emit a change event immediately.

Customize Watching Mode

Say we want to build a custom event source plugin (package name: egg-watcher-custom, eggPlugin.name: watcherCustom).

Firstly define our custom event source like this:

// {plugin_root}/lib/custom_event_source.js
import { Base } from 'sdk-base';

export default class CustomEventSource extends Base {
  // `opts` comes from app.config[${eventSourceName}]
  // `eventSourceName` will be registered later in
  // `config.watcher.eventSources` as the key shown below
  constructor(opts) {
    super(opts);
    this.ready(true);
  }

  watch(path) {
    // replace this with your desired way of watching,
    // when aware of any change, emit a `change` event
    // with an info object containing `path` property
    // specifying the changed directory or file.
    this._h = setInterval(() => {
      this.emit('change', { path });
    }, 1000);
  }

  unwatch() {
    // replace this with your implementation
    if (this._h) {
      clearInterval(this._h);
    }
  }
}

Event source implementations varies according to your running environment. When working with vagrant, docker, samba or such other non-standard way of development, you should use a different watch API specific to what you are working with.

Then add your custom event source to config:

// config/config.default.js
import CustomEventSource from '../lib/custom_event_source';

export default {
  watcher: {
    eventSources: {
      custom: CustomEventSource,
    },
  },
};

Choose to use your custom watching mode in your desired env.

// config/config.${env}.js

export default {
  watcher: {
    type: 'custom',
  },

  // this will pass to your CustomEventSource constructor as opts
  watcherCustom: {
    // foo: 'bar',
  },
};

If possible, plugins named like egg-watcher-${customName}(egg-watcher-vagrant eg.) are recommended.

Questions & Suggestions

Please open an issue here.

License

MIT

Contributors

Contributors

Made with contributors-img.