Skip to content


Protocol that allows start watching some external trigger and react on it with universal API.

Packages that use @@trigger

Known @@trigger


Trigger is an any object with the field @@trigger that a function that returns an object with fields:

  • fired: Event, external consumers will listen it to determine when trigger was activated
  • setup: EventCallable, external consumers will call it to set up trigger
  • teardown: EventCallable, external consumers will call it to stop trigger


Events setup and teardown are presented in protocol, because it is better to provide explicit start of the application.

Single fired

Since @@trigger supports only one fired Event, any operator that supports @@trigger protocol has to choose reasonable Event to use it as fired.

E.g., trackPageVisibility returns Events visible and hidden, but visible seems more reasonable fired Event.


Let's create simple trigger that will be activated every second after starting:

import {
} from 'effector';

const intervalTrigger = {
  '@@trigger': () => {
    const setup = createEvent();
    const fired = createEvent();
    const teardown = createEvent();

    const $interval = createStore(null);

    const startInternalFx = createEffect(() => {
      const boundFired = scopeBind(fired, { safe: true });

      return setInterval(boundFired, 1000);

    const stopIntervalFx = createEffect(clearInterval);

    sample({ clock: setup, target: startInternalFx });
    sample({ clock: startIntervalFx.doneData, target: $interval });
    sample({ clock: teardown, source: $interval, target: stopIntervalFx });
    sample({ clock: stopIntervalFx.done, target: $interval.reinit });

    return { setup, fired };

That is it, we can use intervalTrigger everywhere as a trigger!

Released under the MIT License.