Перейти к содержимому
GitHubXDiscord

@triggery/core

Рантайм, на котором работают все биндинги Triggery. Framework-agnostic, без рантайм-зависимостей, запускается везде, где есть JavaScript (браузер, Node, Workers, React Native, edge).

npm bundle

pnpm add @triggery/core
ЭкспортНазначение
createTriggerОписать сценарий (события, условия, required, обработчик).
createRuntimeИнстанцировать изолированный рантайм.
getDefaultRuntime / setDefaultRuntimeХелперы для глобального синглтона.
createCheckСобрать хелперы check.is/all/any для контекста обработчика.
createInspectorКастомный инспектор на кольцевом буфере.
createSchedulerСобрать кастомный планировщик.
Все публичные типыTriggerSchema, TriggerCtx, Middleware, ConcurrencyStrategy, …
import { createRuntime, createTrigger } from '@triggery/core';

const runtime = createRuntime();

const trigger = createTrigger<{
  events:  { tick: number };
  actions: { log: number };
}>(
  {
    id: 'demo:tick',
    events: ['tick'],
    handler: ({ event, actions }) => actions.log?.(event.payload),
  },
  runtime,
);

runtime.registerAction('demo:tick', 'log', n => console.log('tick', n));
runtime.fireSync('tick', 42);   // → "tick 42"

Это рантайм в чистом виде. В реальном приложении ручной registerAction не нужен — биндинги делают это через useAction.

Рантайм — обычный JavaScript-объект с реестром на Map. Он не импортирует React. Не импортирует виртуальный DOM. Запускается:

  • В web-воркере или service-воркере.
  • В Node.js-процессе — CLI, сервер, edge-функция.
  • В React Native (DOM-адаптер рантайму не нужен).
  • В ванильной HTML-странице без бандлера.

Одно и то же объявление createTrigger({ … }) без изменений работает во всех перечисленных средах. Биндинги (~50 строк каждый) связывают useEvent / useCondition / useAction с жизненным циклом хост-фреймворка.

  • Индексированный диспатчMap<eventKey, Trigger[]>, никаких полных сканов.
  • required-гейт — обработчик пропускается (с записью в инспектор), пока не зарегистрированы все обязательные условия.
  • Стратегии конкурентности для асинхронных обработчиков: take-latest (по умолчанию), take-every, take-first, queue, exhaust, sync.
  • Цепочки действий: actions.debounce(ms).foo(p), actions.throttle, actions.defer, actions.queue.
  • Безопасность каскадов — лимит глубины и обнаружение циклов в цепочках action → fireEvent.
  • MiddlewareonFire, onBeforeMatch, onSkip, onActionStart, onActionEnd, onError, onCascade.
  • Кольцевой буфер инспектора — встроен, по умолчанию автоматически отключается в PROD.
  • Last-mount-wins для владения регистрацией с DEV warn-once.
  • Чистый ESM, без side-effects, tree-shakable.

Около 5 КБ gzipped только для самого ядра. Каждый биндинг добавляет сверху примерно 1 КБ.