@triggery/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/check.ts","../src/cascadeContext.ts","../src/dispatch.ts","../src/inspector.ts","../src/scheduler.ts","../src/runtime.ts","../src/createTrigger.ts"],"names":["current","options"],"mappings":"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","file":"index.js","sourcesContent":["import type { CheckCtx } from './types.ts';\n\n/**\n * Builds the `check` helper bound to a specific conditions snapshot.\n *\n * `is`, `all` and `any` accept predicates over `NonNullable<C[K]>`: if a condition is\n * absent (`undefined` or `null`), the predicate is not invoked and the result is `false`\n * for that key.\n */\nexport function createCheck<C extends Record<string, unknown>>(conditions: C): CheckCtx<C> {\n return {\n is(key, predicate) {\n const value = conditions[key];\n if (value === undefined || value === null) return false;\n return predicate(value as NonNullable<C[typeof key]>);\n },\n all(map) {\n for (const key of Object.keys(map) as (keyof C)[]) {\n const predicate = (map as Record<keyof C, ((value: unknown) => boolean) | undefined>)[key];\n if (!predicate) continue;\n const value = conditions[key];\n if (value === undefined || value === null) return false;\n if (!predicate(value)) return false;\n }\n return true;\n },\n any(map) {\n for (const key of Object.keys(map) as (keyof C)[]) {\n const predicate = (map as Record<keyof C, ((value: unknown) => boolean) | undefined>)[key];\n if (!predicate) continue;\n const value = conditions[key];\n if (value === undefined || value === null) continue;\n if (predicate(value)) return true;\n }\n return false;\n },\n };\n}\n","/**\n * Module-level dispatch context for cascade tracking.\n *\n * When a handler (or any of its actions) synchronously calls `runtime.fire` or\n * `runtime.fireSync`, the runtime needs to know \"this fire happens INSIDE a\n * running trigger\" — that's a cascade, not a top-level emit. The current\n * dispatch context is set right before the handler runs and restored after it\n * returns (synchronously).\n *\n * Internally each context links to its parent (the trigger that fired the\n * cascade ancestor). Cycle detection walks the chain via `chainHas` — O(depth)\n * instead of allocating a new `Set` on every fire to mimic the same behaviour.\n *\n * V1 limitation: cascade tracking only follows the synchronous part of an\n * async handler. After the first `await`, the context is restored to the\n * caller's frame and any subsequent `fire` is treated as a fresh top-level\n * emit. This matches what's documented in `package README → cascade` and is\n * acknowledged in the brainstorm risk register (item #21).\n */\n\nexport type DispatchContext = {\n readonly runtimeId: string;\n readonly triggerId: string;\n readonly runId: string;\n readonly cascadeDepth: number;\n /** The parent context (the dispatch that called `fire` from inside a handler). */\n readonly parent: DispatchContext | null;\n};\n\nlet current: DispatchContext | null = null;\n\nexport function getCurrentDispatch(): DispatchContext | null {\n return current;\n}\n\n/**\n * Run `fn` with `ctx` as the active dispatch context. The previous context is\n * restored on return — works for sync execution and the synchronous prologue\n * of async handlers.\n */\nexport function withDispatch<T>(ctx: DispatchContext, fn: () => T): T {\n const prev = current;\n current = ctx;\n try {\n return fn();\n } finally {\n current = prev;\n }\n}\n\n/**\n * Walk the parent chain looking for a given trigger id. Used by the runtime\n * to detect cascade cycles without ever building a Set on the hot path.\n */\nexport function chainHas(ctx: DispatchContext | null | undefined, triggerId: string): boolean {\n let cur = ctx ?? null;\n while (cur) {\n if (cur.triggerId === triggerId) return true;\n cur = cur.parent;\n }\n return false;\n}\n","import { type DispatchContext, withDispatch } from './cascadeContext.ts';\nimport { createCheck } from './check.ts';\nimport type { InspectorImpl } from './inspector.ts';\nimport type {\n ActionContext,\n ConcurrencyStrategy,\n ConditionGetter,\n FireContext,\n InternalHandlerCtx,\n InternalTriggerConfig,\n Middleware,\n SkipContext,\n TriggerInspectSnapshot,\n UntypedActionFn,\n} from './types.ts';\n\nlet runIdCounter = 0;\nconst genRunId = () => `run_${(++runIdCounter).toString(36)}`;\n\n/**\n * Whether any middleware in the list cares about per-run / per-action timing.\n * Cached once at runtime construction — avoids one for-of per fire.\n */\nexport function needsTiming(middleware: readonly Middleware[]): boolean {\n for (const mw of middleware) {\n if (mw.onActionEnd || mw.onError || mw.onActionStart) return true;\n }\n return false;\n}\n\nconst nowMs = (): number => Date.now();\n\n/**\n * Timer state for the `debounce / throttle / defer` action wrappers.\n * Stored on `RegisteredTrigger.timers` so that calls survive across runs and\n * can be cancelled on dispose.\n */\nexport type TimerEntry =\n | { kind: 'debounce'; tid: ReturnType<typeof setTimeout> }\n | { kind: 'throttle'; lastFiredAt: number }\n | { kind: 'defer'; tid: ReturnType<typeof setTimeout> };\n\nexport type RegisteredTrigger = {\n readonly config: InternalTriggerConfig;\n /** Top-of-stack mirror of `conditionStacks` — kept in sync by runtime so dispatch reads a flat Map. */\n readonly conditions: Map<string, ConditionGetter>;\n /** Top-of-stack mirror of `actionStacks`. */\n readonly actions: Map<string, UntypedActionFn>;\n /** Full registration stacks (last-mount-wins, StrictMode-safe). @internal */\n readonly conditionStacks: Map<string, ConditionGetter[]>;\n readonly actionStacks: Map<string, UntypedActionFn[]>;\n enabled: boolean;\n /** Active runs. `take-latest` aborts all, `take-every`/`queue` keeps them. */\n readonly inFlight: Set<AbortController>;\n /** Tail promise for the `queue` strategy — every new run chains onto this. */\n queueTail: Promise<void>;\n /** Active debounce/throttle/defer timers, keyed by `${kind}:${action}:${ms|counter}`. */\n readonly timers: Map<string, TimerEntry>;\n /** Monotonic counter for unique `defer` timer keys. */\n deferCounter: number;\n};\n\ntype DispatchDeps = {\n trigger: RegisteredTrigger;\n fireCtx: FireContext;\n inspector: InspectorImpl;\n /**\n * Whether the runtime's inspector is active. When `false` we skip building\n * the per-run snapshot object, skip the executedActions / snapshotKeys\n * tracking, and avoid the `inspector.record(...)` call entirely.\n */\n inspectorEnabled: boolean;\n middleware: readonly Middleware[];\n /** Cached `middleware.length > 0` — saves a `.length` access per fire. */\n hasMiddleware: boolean;\n /** Cached `needsTiming(middleware)` — saves a per-fire for-of through middleware. */\n trackTiming: boolean;\n /** Runtime id — passed into the cascade context so cross-runtime fires don't get tagged as cascade. */\n runtimeId: string;\n};\n\n/**\n * Cancel and drop every pending timer for a trigger. Called on dispose so we\n * don't leak setTimeout handles or invoke handlers after the trigger is gone.\n */\nexport function cancelAllTimers(trigger: RegisteredTrigger): void {\n for (const entry of trigger.timers.values()) {\n if (entry.kind === 'debounce' || entry.kind === 'defer') {\n clearTimeout(entry.tid);\n }\n }\n trigger.timers.clear();\n}\n\n/**\n * Invoke a single action handler with middleware tracking. Used both for\n * inline calls during a run and for deferred (debounced / throttled / defer)\n * calls that fire outside the original run.\n */\nfunction invokeAction(\n handler: UntypedActionFn,\n ctx: ActionContext,\n middleware: readonly Middleware[],\n trackTiming: boolean,\n): void {\n const startedAt = trackTiming ? performance.now() : 0;\n for (const mw of middleware) mw.onActionStart?.(ctx);\n try {\n const result = handler(ctx.payload);\n if (result && typeof (result as Promise<unknown>).then === 'function') {\n (result as Promise<unknown>).then(\n (value) => {\n for (const mw of middleware) {\n mw.onActionEnd?.({\n ...ctx,\n durationMs: trackTiming ? performance.now() - startedAt : 0,\n result: value,\n });\n }\n },\n (error) => {\n for (const mw of middleware) mw.onError?.({ ...ctx, error });\n },\n );\n } else {\n for (const mw of middleware) {\n mw.onActionEnd?.({\n ...ctx,\n durationMs: trackTiming ? performance.now() - startedAt : 0,\n result,\n });\n }\n }\n } catch (error) {\n for (const mw of middleware) mw.onError?.({ ...ctx, error });\n }\n}\n\n/**\n * Public entry point. Runs the concurrency gate first (which can skip or queue\n * the run), then enters the actual handler in `runHandler`.\n */\nexport function executeTrigger(deps: DispatchDeps): void | Promise<void> {\n const { trigger } = deps;\n if (!trigger.enabled) return;\n\n const concurrency: ConcurrencyStrategy = trigger.config.concurrency ?? 'take-latest';\n\n if (concurrency === 'queue') {\n // Serialize subsequent runs onto the tail. The catch ensures one failing\n // handler doesn't poison the chain for later runs.\n trigger.queueTail = trigger.queueTail.then(() => runHandler(deps, concurrency)).catch(() => {});\n return;\n }\n\n return runHandler(deps, concurrency);\n}\n\n/** Shared empty array — reused by skip/short-circuit paths to avoid alloc. */\nconst EMPTY_STRING_ARRAY: readonly string[] = Object.freeze([]) as readonly string[];\n\nfunction runHandler(deps: DispatchDeps, concurrency: ConcurrencyStrategy): void | Promise<void> {\n const {\n trigger,\n fireCtx,\n inspector,\n inspectorEnabled,\n middleware,\n hasMiddleware,\n trackTiming,\n runtimeId,\n } = deps;\n if (!trigger.enabled) return;\n\n // ─── Middleware: onBeforeMatch ───────────────────────────────────────────\n // Fires once per (event, trigger) pair, before any concurrency/required\n // gate runs. Purely observational — middleware that wants to cancel should\n // do it from `onFire` instead.\n if (hasMiddleware) {\n const matchCtx = {\n triggerId: trigger.config.id,\n eventName: fireCtx.eventName,\n payload: fireCtx.payload,\n cascadeDepth: fireCtx.cascadeDepth,\n } as const;\n for (const mw of middleware) mw.onBeforeMatch?.(matchCtx);\n }\n\n // ─── Concurrency gate ────────────────────────────────────────────────────\n // take-first / exhaust: if anything is in flight, skip this run.\n if (concurrency === 'take-first' || concurrency === 'exhaust') {\n if (trigger.inFlight.size > 0) {\n const reason = `concurrency-${concurrency}`;\n if (hasMiddleware) {\n const skipCtx: SkipContext = {\n triggerId: trigger.config.id,\n eventName: fireCtx.eventName,\n reason,\n };\n for (const mw of middleware) mw.onSkip?.(skipCtx);\n }\n if (inspectorEnabled) {\n inspector.record({\n triggerId: trigger.config.id,\n runId: genRunId(),\n eventName: fireCtx.eventName,\n status: 'skipped',\n reason,\n durationMs: 0,\n executedActions: EMPTY_STRING_ARRAY,\n snapshotKeys: EMPTY_STRING_ARRAY,\n });\n }\n return;\n }\n }\n\n // take-latest: abort everything still in flight.\n if (concurrency === 'take-latest' && trigger.inFlight.size > 0) {\n for (const prev of trigger.inFlight) prev.abort('superseded-by-latest');\n trigger.inFlight.clear();\n }\n\n // ─── Run setup ──────────────────────────────────────────────────────────\n const runId = genRunId();\n // performance.now() is only needed when either the inspector wants a\n // durationMs or middleware observes per-action timing.\n const needDuration = inspectorEnabled || trackTiming;\n const startedAt = needDuration ? performance.now() : 0;\n\n // Required gate — every required condition must be registered. This check\n // hits `trigger.conditions` (the mirror Map) directly, not the lazy proxy,\n // so it stays cheap even when nothing else in the handler runs.\n const required = trigger.config.required;\n if (required.length > 0) {\n for (let i = 0; i < required.length; i++) {\n const requiredName = required[i] as string;\n if (!trigger.conditions.has(requiredName)) {\n const reason = `missing-required-condition:${requiredName}`;\n if (hasMiddleware) {\n const skipCtx: SkipContext = {\n triggerId: trigger.config.id,\n eventName: fireCtx.eventName,\n reason,\n };\n for (const mw of middleware) mw.onSkip?.(skipCtx);\n }\n if (inspectorEnabled) {\n inspector.record({\n triggerId: trigger.config.id,\n runId,\n eventName: fireCtx.eventName,\n status: 'skipped',\n reason,\n durationMs: needDuration ? performance.now() - startedAt : 0,\n executedActions: EMPTY_STRING_ARRAY,\n snapshotKeys: EMPTY_STRING_ARRAY,\n });\n }\n return;\n }\n }\n }\n\n // Snapshot bookkeeping — only allocated when the inspector wants them. When\n // the inspector is off we point both arrays at a shared frozen empty array\n // and gate every `push` behind `inspectorEnabled`. Saves two allocations and\n // all per-condition/per-action pushes on the hot path.\n const executedActions: string[] = inspectorEnabled ? [] : (EMPTY_STRING_ARRAY as string[]);\n const snapshotKeys: string[] = inspectorEnabled ? [] : (EMPTY_STRING_ARRAY as string[]);\n\n // Conditions snapshot — lazy proxy with a cache (consistency guarantee:\n // a handler reading the same condition twice in one run sees the same value).\n const snapshotCache = new Map<string, unknown>();\n const conditionsProxy = new Proxy({} as Record<string, unknown>, {\n get(_target, prop: string | symbol) {\n if (typeof prop !== 'string') return undefined;\n if (snapshotCache.has(prop)) return snapshotCache.get(prop);\n const getter = trigger.conditions.get(prop);\n if (!getter) {\n snapshotCache.set(prop, undefined);\n return undefined;\n }\n const value = getter();\n snapshotCache.set(prop, value);\n if (inspectorEnabled) snapshotKeys.push(prop);\n return value;\n },\n has(_target, prop) {\n return typeof prop === 'string' && trigger.conditions.has(prop);\n },\n ownKeys() {\n return Array.from(trigger.conditions.keys());\n },\n getOwnPropertyDescriptor() {\n return { enumerable: true, configurable: true };\n },\n });\n\n // ─── Action proxy + timing wrappers ──────────────────────────────────────\n const callActionImmediate = (name: string, payload: unknown): void => {\n const handler = trigger.actions.get(name);\n if (!handler) return;\n if (inspectorEnabled) executedActions.push(name);\n invokeAction(\n handler,\n { triggerId: trigger.config.id, runId, actionName: name, payload },\n middleware,\n trackTiming,\n );\n };\n\n /** Invocation triggered by a debounce/throttle/defer timer — late binding. */\n const callActionDeferred = (name: string, payload: unknown): void => {\n if (!trigger.enabled) return;\n const handler = trigger.actions.get(name);\n if (!handler) return;\n invokeAction(\n handler,\n { triggerId: trigger.config.id, runId, actionName: name, payload },\n middleware,\n trackTiming,\n );\n };\n\n const buildTimedProxy = (kind: 'debounce' | 'throttle' | 'defer', ms: number) =>\n new Proxy({} as Record<string, unknown>, {\n get(_target, prop: string | symbol) {\n if (typeof prop !== 'string') return undefined;\n if (!trigger.actions.has(prop)) return undefined;\n return (payload?: unknown) => {\n if (kind === 'debounce') {\n const key = `debounce:${prop}:${ms}`;\n const existing = trigger.timers.get(key);\n if (existing?.kind === 'debounce') clearTimeout(existing.tid);\n const tid = setTimeout(() => {\n trigger.timers.delete(key);\n callActionDeferred(prop, payload);\n }, ms);\n trigger.timers.set(key, { kind: 'debounce', tid });\n } else if (kind === 'throttle') {\n // Leading-edge throttle: fire immediately, then drop calls until\n // `ms` has elapsed. Trailing-edge variant lands in V1.1.\n const key = `throttle:${prop}:${ms}`;\n const existing = trigger.timers.get(key);\n const now = nowMs();\n if (existing?.kind === 'throttle' && now - existing.lastFiredAt < ms) return;\n trigger.timers.set(key, { kind: 'throttle', lastFiredAt: now });\n callActionDeferred(prop, payload);\n } else {\n const key = `defer:${prop}:${++trigger.deferCounter}`;\n const tid = setTimeout(() => {\n trigger.timers.delete(key);\n callActionDeferred(prop, payload);\n }, ms);\n trigger.timers.set(key, { kind: 'defer', tid });\n }\n };\n },\n has(_target, prop) {\n return typeof prop === 'string' && trigger.actions.has(prop);\n },\n });\n\n const actionsProxy = new Proxy({} as InternalHandlerCtx['actions'], {\n get(_target, prop: string | symbol) {\n if (prop === 'debounce') return (ms: number) => buildTimedProxy('debounce', ms);\n if (prop === 'throttle') return (ms: number) => buildTimedProxy('throttle', ms);\n if (prop === 'defer') return (ms: number) => buildTimedProxy('defer', ms);\n if (typeof prop !== 'string') return undefined;\n if (!trigger.actions.has(prop)) return undefined;\n return (payload: unknown) => callActionImmediate(prop, payload);\n },\n has(_target, prop) {\n return typeof prop === 'string' && trigger.actions.has(prop);\n },\n });\n\n // ─── Abort controller + handler ctx ──────────────────────────────────────\n const controller = new AbortController();\n trigger.inFlight.add(controller);\n\n const handlerCtx: InternalHandlerCtx = {\n event: { name: fireCtx.eventName, payload: fireCtx.payload },\n conditions: conditionsProxy,\n actions: actionsProxy,\n check: createCheck(conditionsProxy),\n meta: {\n runId,\n triggerId: trigger.config.id,\n scheduledAt: startedAt,\n cascadeDepth: fireCtx.cascadeDepth,\n ...(fireCtx.parentRunId !== undefined && { parentRunId: fireCtx.parentRunId }),\n ...(fireCtx.parentTriggerId !== undefined && { parentTriggerId: fireCtx.parentTriggerId }),\n },\n signal: controller.signal,\n };\n\n const finalize = (status: 'fired' | 'errored' | 'aborted', reason?: string) => {\n trigger.inFlight.delete(controller);\n if (!inspectorEnabled) return;\n // Build the snapshot without the `...(reason && {reason})` spread —\n // the spread allocates two intermediate objects per fire on the hot path.\n const snapshot: { -readonly [K in keyof TriggerInspectSnapshot]: TriggerInspectSnapshot[K] } = {\n triggerId: trigger.config.id,\n runId,\n eventName: fireCtx.eventName,\n status,\n durationMs: needDuration ? performance.now() - startedAt : 0,\n executedActions,\n snapshotKeys,\n };\n if (reason !== undefined) snapshot.reason = reason;\n inspector.record(snapshot);\n };\n\n // Invoke the handler. The synchronous prologue runs inside `withDispatch`,\n // so any `runtime.fire` called from it (or from sync actions) sees the\n // cascade context. The parent chain is a linked list — no Set allocation\n // per fire; cycle checks walk the chain.\n try {\n const result = withDispatch(\n {\n runtimeId,\n triggerId: trigger.config.id,\n runId,\n cascadeDepth: fireCtx.cascadeDepth,\n parent: (fireCtx.parentContext as DispatchContext | undefined) ?? null,\n },\n () => trigger.config.handler(handlerCtx),\n );\n if (result && typeof (result as Promise<void>).then === 'function') {\n return (result as Promise<void>).then(\n () => finalize('fired'),\n (error: unknown) => {\n if (controller.signal.aborted) {\n finalize('aborted', String(controller.signal.reason ?? 'aborted'));\n return;\n }\n // eslint-disable-next-line no-console -- last line of defence\n console.error(`[triggery] handler \"${trigger.config.id}\" failed:`, error);\n finalize('errored', String(error));\n },\n );\n }\n finalize('fired');\n } catch (error) {\n // eslint-disable-next-line no-console -- last line of defence\n console.error(`[triggery] handler \"${trigger.config.id}\" failed:`, error);\n finalize('errored', String(error));\n }\n return undefined;\n}\n","import type { TriggerInspectSnapshot } from './types.ts';\n\nexport type InspectorImpl = {\n record(snapshot: TriggerInspectSnapshot): void;\n getBuffer(): readonly TriggerInspectSnapshot[];\n getLastForTrigger(triggerId: string): TriggerInspectSnapshot | undefined;\n subscribe(listener: (snapshot: TriggerInspectSnapshot) => void): () => void;\n clear(): void;\n};\n\nconst EMPTY_BUFFER: readonly TriggerInspectSnapshot[] = Object.freeze(\n [] as readonly TriggerInspectSnapshot[],\n);\nconst NOOP_UNSUBSCRIBE = (): void => {};\nconst NOOP_INSPECTOR: InspectorImpl = {\n record() {},\n getBuffer() {\n return EMPTY_BUFFER;\n },\n getLastForTrigger() {\n return undefined;\n },\n subscribe() {\n return NOOP_UNSUBSCRIBE;\n },\n clear() {},\n};\n\n/**\n * No-op inspector — used when the runtime is configured with `inspector: false`\n * (or by the auto default in production). `record` does nothing, `subscribe`\n * returns a noop token whose callback will never fire, and `getBuffer` returns\n * a shared frozen empty array. Same shape as the real inspector so callers\n * don't need to branch.\n */\nexport function createNoopInspector(): InspectorImpl {\n return NOOP_INSPECTOR;\n}\n\n/**\n * Ring-buffer inspector. `record` is O(1) — writes into a fixed-size slot array\n * with a wrap-around index, no `unshift`/`shift` allocations. `getBuffer`\n * materializes a newest-first array on demand (rare relative to fires).\n */\nexport function createInspector(bufferSize: number): InspectorImpl {\n const size = Math.max(1, bufferSize);\n const slots: (TriggerInspectSnapshot | undefined)[] = new Array(size);\n let head = 0;\n let count = 0;\n const lastByTrigger = new Map<string, TriggerInspectSnapshot>();\n const listeners = new Set<(snapshot: TriggerInspectSnapshot) => void>();\n\n return {\n record(snapshot) {\n slots[head] = snapshot;\n head = head + 1 === size ? 0 : head + 1;\n if (count < size) count++;\n lastByTrigger.set(snapshot.triggerId, snapshot);\n if (listeners.size > 0) {\n for (const listener of listeners) {\n try {\n listener(snapshot);\n } catch {\n // Listeners must never bring down the runtime.\n }\n }\n }\n },\n getBuffer() {\n if (count === 0) return [];\n const out: TriggerInspectSnapshot[] = new Array(count);\n let idx = head === 0 ? size - 1 : head - 1;\n for (let i = 0; i < count; i++) {\n out[i] = slots[idx] as TriggerInspectSnapshot;\n idx = idx === 0 ? size - 1 : idx - 1;\n }\n return out;\n },\n getLastForTrigger(triggerId) {\n return lastByTrigger.get(triggerId);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n clear() {\n for (let i = 0; i < size; i++) slots[i] = undefined;\n head = 0;\n count = 0;\n lastByTrigger.clear();\n },\n };\n}\n","import type { SchedulerStrategy } from './types.ts';\n\nexport type Task = () => void;\n\nexport type SchedulerImpl = {\n enqueue(task: Task): void;\n /** Drain all pending tasks synchronously (for tests and `fireSync`). */\n flush(): void;\n};\n\nfunction createMicrotaskScheduler(): SchedulerImpl {\n let queue: Task[] = [];\n let scheduled = false;\n\n const flush = () => {\n scheduled = false;\n if (queue.length === 0) return;\n const tasks = queue;\n queue = [];\n for (const task of tasks) {\n try {\n task();\n } catch (error) {\n // Do not let one task take down the rest. Errors are surfaced via the inspector.\n // eslint-disable-next-line no-console -- last line of defence\n console.error('[triggery] scheduler task failed:', error);\n }\n }\n };\n\n return {\n enqueue(task) {\n queue.push(task);\n if (!scheduled) {\n scheduled = true;\n queueMicrotask(flush);\n }\n },\n flush,\n };\n}\n\nfunction createSyncScheduler(): SchedulerImpl {\n return {\n enqueue(task) {\n task();\n },\n flush() {\n // The sync scheduler keeps no queue.\n },\n };\n}\n\nexport function createScheduler(strategy: SchedulerStrategy): SchedulerImpl {\n return strategy === 'sync' ? createSyncScheduler() : createMicrotaskScheduler();\n}\n","import { chainHas, getCurrentDispatch } from './cascadeContext.ts';\nimport {\n cancelAllTimers,\n executeTrigger,\n needsTiming,\n type RegisteredTrigger,\n} from './dispatch.ts';\nimport { createInspector, createNoopInspector } from './inspector.ts';\nimport { createScheduler } from './scheduler.ts';\nimport type {\n CascadeContext,\n ConditionGetter,\n FireContext,\n InspectorOption,\n InternalTriggerConfig,\n RegisterScopeOptions,\n RegistrationToken,\n Runtime,\n RuntimeGraph,\n RuntimeOptions,\n Trigger,\n TriggerGraphNode,\n TriggerInspectSnapshot,\n TriggerSchema,\n UntypedActionFn,\n} from './types.ts';\n\nlet runtimeIdCounter = 0;\nconst genRuntimeId = () => `runtime_${(++runtimeIdCounter).toString(36)}`;\n\n/** Browser-safe DEV-mode detector. */\nconst isDev = (): boolean => {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\n return env !== 'production';\n};\n\n/**\n * Resolve the inspector option against the current environment.\n *\n * undefined → DEV on, PROD off (auto)\n * true → always on\n * false → always off\n * { dev?, prod? } → per-env override, unset fields fall back to auto\n */\nfunction resolveInspectorEnabled(option: InspectorOption | undefined): boolean {\n if (option === true) return true;\n if (option === false) return false;\n const dev = isDev();\n if (option === undefined) return dev;\n // Object form: explicit overrides per environment, with auto fallback.\n if (dev) return option.dev ?? true;\n return option.prod ?? false;\n}\n\nexport function createRuntime(options: RuntimeOptions = {}): Runtime {\n const id = genRuntimeId();\n const triggers = new Map<string, RegisteredTrigger>();\n const eventIndex = new Map<string, Set<RegisteredTrigger>>();\n const middleware = options.middleware ?? [];\n // Cached at construction — middleware is immutable for the runtime's lifetime,\n // so we avoid recomputing these flags on the dispatch hot path.\n const hasMiddleware = middleware.length > 0;\n const trackTiming = needsTiming(middleware);\n const maxCascadeDepth = options.maxCascadeDepth ?? 3;\n const inspectorEnabled = resolveInspectorEnabled(options.inspector);\n const inspector = inspectorEnabled\n ? createInspector(options.inspectorBufferSize ?? 50)\n : createNoopInspector();\n const microtaskScheduler = createScheduler('microtask');\n const syncScheduler = createScheduler('sync');\n\n /**\n * DEV-only memo of `(label:triggerId:name)` keys we've already warned about,\n * so the user sees one warning per collision rather than one per re-render.\n * StrictMode's mount → unmount → mount cycle empties the stack before the\n * second mount, so it doesn't trigger this warning.\n */\n const warnedCollisions = new Set<string>();\n\n const indexEvent = (eventName: string, trigger: RegisteredTrigger) => {\n let set = eventIndex.get(eventName);\n if (!set) {\n set = new Set();\n eventIndex.set(eventName, set);\n }\n set.add(trigger);\n };\n\n const deindexEvent = (eventName: string, trigger: RegisteredTrigger) => {\n const set = eventIndex.get(eventName);\n if (!set) return;\n set.delete(trigger);\n if (set.size === 0) eventIndex.delete(eventName);\n };\n\n // ─── triggers ──────────────────────────────────────────────────────────\n const registerTrigger = (config: InternalTriggerConfig): RegistrationToken => {\n if (triggers.has(config.id)) {\n // last-mount-wins: silently replace (warn-once is handled by the React bindings).\n const existing = triggers.get(config.id);\n if (existing) {\n for (const eventName of existing.config.events) deindexEvent(eventName, existing);\n cancelAllTimers(existing);\n for (const prev of existing.inFlight) prev.abort('trigger-replaced');\n existing.inFlight.clear();\n }\n }\n const registered: RegisteredTrigger = {\n config,\n conditions: new Map(),\n actions: new Map(),\n conditionStacks: new Map(),\n actionStacks: new Map(),\n enabled: true,\n inFlight: new Set(),\n queueTail: Promise.resolve(),\n timers: new Map(),\n deferCounter: 0,\n };\n triggers.set(config.id, registered);\n for (const eventName of config.events) indexEvent(eventName, registered);\n\n let unregistered = false;\n return {\n unregister() {\n if (unregistered) return;\n unregistered = true;\n const current = triggers.get(config.id);\n if (current !== registered) return;\n for (const eventName of registered.config.events) deindexEvent(eventName, registered);\n cancelAllTimers(registered);\n for (const ctl of registered.inFlight) ctl.abort('trigger-disposed');\n registered.inFlight.clear();\n triggers.delete(config.id);\n },\n };\n };\n\n // ─── conditions / actions ─────────────────────────────────────────────\n //\n // Conditions and actions are stored as stacks. The last registration wins\n // (top of stack), so React StrictMode double-mount, multiple providers and\n // overlapping registrations all behave deterministically.\n //\n // The Map<name, fn> on the trigger always mirrors the top of the stack so\n // that `dispatch.ts` stays simple (no stack inspection on the hot path).\n\n const registerStacked = (\n triggerId: string,\n name: string,\n fn: unknown,\n label: 'condition' | 'action',\n scope: string,\n ): RegistrationToken => {\n const trigger = triggers.get(triggerId);\n if (!trigger) {\n if (isDev()) {\n // eslint-disable-next-line no-console -- DEV warn\n console.warn(\n `[triggery] register${label === 'condition' ? 'Condition' : 'Action'}: trigger \"${triggerId}\" not found`,\n );\n }\n return { unregister() {} };\n }\n // Scope-match gate. A trigger declared with `scope: 'chat'` only sees\n // registrations made in scope `'chat'`; a global trigger (no scope) only\n // sees global registrations. Mismatches are silent no-ops at runtime, but\n // we warn-once in DEV so the user notices the wiring is off.\n if (trigger.config.scope !== scope) {\n if (isDev()) {\n const collisionKey = `scope-mismatch:${label}:${triggerId}:${scope}:${name}`;\n if (!warnedCollisions.has(collisionKey)) {\n warnedCollisions.add(collisionKey);\n // eslint-disable-next-line no-console -- DEV warn\n console.warn(\n `[triggery] register${label === 'condition' ? 'Condition' : 'Action'}: scope mismatch — ` +\n `trigger \"${triggerId}\" has scope \"${trigger.config.scope || '(global)'}\" but the ` +\n `registration came from scope \"${scope || '(global)'}\". The registration is ignored.`,\n );\n }\n }\n return { unregister() {} };\n }\n const stacks: Map<string, unknown[]> =\n label === 'condition'\n ? (trigger.conditionStacks as unknown as Map<string, unknown[]>)\n : (trigger.actionStacks as unknown as Map<string, unknown[]>);\n const mirror: Map<string, unknown> =\n label === 'condition'\n ? (trigger.conditions as unknown as Map<string, unknown>)\n : (trigger.actions as unknown as Map<string, unknown>);\n\n let stack = stacks.get(name);\n if (!stack) {\n stack = [];\n stacks.set(name, stack);\n }\n\n // DEV: warn-once per (label, triggerId, name) when a second live\n // registration arrives. Helps catch accidental multi-provider setups\n // (\"why does the trigger see value B, not A?\") without spamming the\n // console on every re-render or on StrictMode's mount-cycle.\n if (isDev() && stack.length > 0) {\n const collisionKey = `${label}:${triggerId}:${name}`;\n if (!warnedCollisions.has(collisionKey)) {\n warnedCollisions.add(collisionKey);\n // eslint-disable-next-line no-console -- DEV warn\n console.warn(\n `[triggery] multiple ${label} registrations for \"${name}\" on trigger \"${triggerId}\" — last-mount-wins. ` +\n 'To compose values from several sources, register through a single hook.',\n );\n }\n }\n\n stack.push(fn);\n mirror.set(name, fn);\n\n let unregistered = false;\n return {\n unregister() {\n if (unregistered) return;\n unregistered = true;\n const t = triggers.get(triggerId);\n if (!t) return;\n const liveStacks: Map<string, unknown[]> =\n label === 'condition'\n ? (t.conditionStacks as unknown as Map<string, unknown[]>)\n : (t.actionStacks as unknown as Map<string, unknown[]>);\n const liveMirror: Map<string, unknown> =\n label === 'condition'\n ? (t.conditions as unknown as Map<string, unknown>)\n : (t.actions as unknown as Map<string, unknown>);\n const liveStack = liveStacks.get(name);\n if (!liveStack) return;\n // Remove the most-recent occurrence of this fn (StrictMode-safe).\n for (let i = liveStack.length - 1; i >= 0; i--) {\n if (liveStack[i] === fn) {\n liveStack.splice(i, 1);\n break;\n }\n }\n if (liveStack.length === 0) {\n liveStacks.delete(name);\n liveMirror.delete(name);\n } else {\n liveMirror.set(name, liveStack[liveStack.length - 1]);\n }\n },\n };\n };\n\n const registerCondition = (\n triggerId: string,\n name: string,\n getter: ConditionGetter,\n options?: RegisterScopeOptions,\n ): RegistrationToken =>\n registerStacked(triggerId, name, getter, 'condition', options?.scope ?? '');\n\n const registerAction = (\n triggerId: string,\n name: string,\n handler: UntypedActionFn,\n options?: RegisterScopeOptions,\n ): RegistrationToken => registerStacked(triggerId, name, handler, 'action', options?.scope ?? '');\n\n // ─── cascade helpers ──────────────────────────────────────────────────\n const emitCascade = (info: CascadeContext) => {\n for (const mw of middleware) mw.onCascade?.(info);\n };\n\n /**\n * Build a FireContext, taking the current synchronous dispatch context into\n * account (so an action emitting a new event is tagged as a cascade rather\n * than as a top-level fire).\n *\n * Top-level fires leave `parentContext` undefined — keeps the empty-registry\n * hot path allocation-free. Cascade fires carry a linked-list reference to\n * the parent dispatch so the cycle check can walk the chain.\n */\n const buildFireContext = (eventName: string, payload: unknown): FireContext => {\n const parent = getCurrentDispatch();\n if (parent && parent.runtimeId === id) {\n return {\n eventName,\n payload,\n cascadeDepth: parent.cascadeDepth + 1,\n parentRunId: parent.runId,\n parentTriggerId: parent.triggerId,\n parentContext: parent,\n };\n }\n return { eventName, payload, cascadeDepth: 0 };\n };\n\n // ─── dispatch ──────────────────────────────────────────────────────────\n type DispatchOpts = { forceSync: boolean };\n\n const dispatch = (fireCtx: FireContext, opts: DispatchOpts) => {\n // Middleware onFire — gated by `hasMiddleware` so the empty-middleware path\n // skips even the for-of setup.\n if (hasMiddleware) {\n for (const mw of middleware) {\n const result = mw.onFire?.(fireCtx);\n if (result?.cancel) return;\n }\n }\n\n // Cascade depth gate. Top-level fires have depth=0, so this can only\n // trigger when a cascade has produced FireContext.cascadeDepth > max.\n if (fireCtx.cascadeDepth > maxCascadeDepth) {\n emitCascade({\n parentTriggerId: fireCtx.parentTriggerId ?? '',\n parentRunId: fireCtx.parentRunId ?? '',\n newEventName: fireCtx.eventName,\n cascadeDepth: fireCtx.cascadeDepth,\n kind: 'overflow',\n });\n return;\n }\n\n const set = eventIndex.get(fireCtx.eventName);\n if (!set || set.size === 0) return;\n\n // Snapshot the matching triggers at fire-time (registry changes during the\n // handler don't affect this run). For the common single-subscriber case we\n // skip the array allocation entirely.\n const triggersForEvent: readonly RegisteredTrigger[] =\n set.size === 1 ? [set.values().next().value as RegisteredTrigger] : Array.from(set);\n const parentCtx = fireCtx.parentContext;\n for (const trigger of triggersForEvent) {\n if (!trigger.enabled) continue;\n\n // Cycle detection: walk the parent chain looking for this trigger's id.\n // O(cascade-depth); cascade max is 3 by default so this is effectively O(1).\n if (parentCtx !== undefined && chainHas(parentCtx as never, trigger.config.id)) {\n emitCascade({\n parentTriggerId: fireCtx.parentTriggerId ?? '',\n parentRunId: fireCtx.parentRunId ?? '',\n newEventName: fireCtx.eventName,\n cascadeDepth: fireCtx.cascadeDepth,\n kind: 'cycle',\n });\n continue;\n }\n\n const run = () => {\n executeTrigger({\n trigger,\n fireCtx,\n inspector,\n inspectorEnabled,\n middleware,\n hasMiddleware,\n trackTiming,\n runtimeId: id,\n });\n };\n\n // `forceSync` skips the per-trigger scheduler choice (used by fireSync).\n if (opts.forceSync) {\n run();\n continue;\n }\n const scheduler = trigger.config.schedule === 'sync' ? syncScheduler : microtaskScheduler;\n scheduler.enqueue(run);\n }\n };\n\n const fire = (eventName: string, payload?: unknown): void => {\n dispatch(buildFireContext(eventName, payload), { forceSync: false });\n };\n\n const fireSync = (eventName: string, payload?: unknown): void => {\n dispatch(buildFireContext(eventName, payload), { forceSync: true });\n };\n\n // ─── subscribe / inspector ─────────────────────────────────────────────\n const subscribe = (listener: (snapshot: TriggerInspectSnapshot) => void): RegistrationToken => {\n const off = inspector.subscribe(listener);\n let unregistered = false;\n return {\n unregister() {\n if (unregistered) return;\n unregistered = true;\n off();\n },\n };\n };\n\n const getInspectorBuffer = () => inspector.getBuffer();\n\n const getTrigger = (triggerId: string): Trigger<TriggerSchema> | undefined => {\n const trigger = triggers.get(triggerId);\n if (!trigger) return undefined;\n return buildPublicTrigger(trigger, inspector);\n };\n\n const graph = (): RuntimeGraph => {\n const nodes: TriggerGraphNode[] = [];\n for (const t of triggers.values()) {\n nodes.push({\n id: t.config.id,\n scope: t.config.scope,\n events: t.config.events,\n required: t.config.required,\n schedule: t.config.schedule,\n concurrency: t.config.concurrency,\n enabled: t.enabled,\n });\n }\n const idx: Record<string, string[]> = {};\n for (const [eventName, triggerSet] of eventIndex) {\n idx[eventName] = Array.from(triggerSet).map((t) => t.config.id);\n }\n return { triggers: nodes, eventIndex: idx };\n };\n\n const dispose = () => {\n for (const trigger of triggers.values()) {\n for (const ctl of trigger.inFlight) ctl.abort('runtime-disposed');\n trigger.inFlight.clear();\n cancelAllTimers(trigger);\n trigger.enabled = false;\n }\n triggers.clear();\n eventIndex.clear();\n inspector.clear();\n };\n\n return {\n id,\n inspectorEnabled,\n registerTrigger,\n registerCondition,\n registerAction,\n fire,\n fireSync,\n subscribe,\n getInspectorBuffer,\n getTrigger,\n graph,\n dispose,\n };\n}\n\nfunction buildPublicTrigger(\n internal: RegisteredTrigger,\n inspector: { getLastForTrigger(id: string): TriggerInspectSnapshot | undefined },\n): Trigger<TriggerSchema> {\n return {\n id: internal.config.id,\n schedule: internal.config.schedule,\n enable() {\n internal.enabled = true;\n },\n disable() {\n internal.enabled = false;\n },\n isEnabled() {\n return internal.enabled;\n },\n namedHooks() {\n throw new Error('[triggery] namedHooks() can only be called on the original trigger object');\n },\n inspect() {\n return inspector.getLastForTrigger(internal.config.id);\n },\n dispose() {\n internal.enabled = false;\n for (const ctl of internal.inFlight) ctl.abort('disposed');\n internal.inFlight.clear();\n cancelAllTimers(internal);\n },\n };\n}\n\n// ─── default runtime (lazy) ────────────────────────────────────────────────\nlet _defaultRuntime: Runtime | undefined;\nexport function getDefaultRuntime(): Runtime {\n if (!_defaultRuntime) _defaultRuntime = createRuntime();\n return _defaultRuntime;\n}\nexport function setDefaultRuntime(runtime: Runtime): void {\n _defaultRuntime = runtime;\n}\n","import { getDefaultRuntime } from './runtime.ts';\nimport type {\n ConcurrencyStrategy,\n ConditionKey,\n EventKey,\n InternalHandlerCtx,\n InternalTriggerConfig,\n NamedHooks,\n Runtime,\n SchedulerStrategy,\n Trigger,\n TriggerHandler,\n TriggerSchema,\n} from './types.ts';\n\n/**\n * Public trigger configuration.\n *\n * @remarks\n * **V1 type limitation:** `required` is enforced at runtime only — it does not narrow\n * the types of `conditions.*` inside the handler. Every condition is `T | undefined` in\n * the handler (even when listed in `required`). Use an early return:\n * `if (!conditions.user) return;` — TS narrows `conditions.user` to `User` after that.\n *\n * Alternative: `check.is('user', (u) => u.isActive)` — typesafe predicate with NonNullable narrowing.\n *\n * **V1.1+** will introduce a builder API (`createTrigger<S>().require(['user']).handle(...)`)\n * that automatically narrows required conditions.\n */\nexport type CreateTriggerConfig<S extends TriggerSchema> = {\n readonly id: string;\n readonly events: readonly EventKey<S>[];\n /** Required condition keys. The trigger will not run unless all of them are registered. */\n readonly required?: readonly ConditionKey<S>[];\n readonly schedule?: SchedulerStrategy;\n /**\n * Concurrency strategy applied across handler runs (default: `'take-latest'`).\n *\n * - `take-latest` — new run aborts the previous (`signal.aborted` becomes true).\n * - `take-every` — every run proceeds independently, no aborts.\n * - `take-first` / `exhaust` — new runs are skipped while one is still in flight.\n * - `queue` — new runs wait for the previous to finish (serialized).\n * - `sync` — like `take-every`; provided as a documentation marker.\n */\n readonly concurrency?: ConcurrencyStrategy;\n readonly scope?: string;\n readonly handler: TriggerHandler<S, never>;\n};\n\n/**\n * Create a trigger and register it in a runtime (the default runtime if none is passed).\n *\n * @example\n * ```ts\n * const messageTrigger = createTrigger<{\n * events: { 'new-message': { author: string; text: string } };\n * conditions: { user: { id: string }; settings: { sound: boolean } };\n * actions: { showToast: { title: string }; playSound: void };\n * }>({\n * id: 'message-received',\n * events: ['new-message'],\n * required: ['user', 'settings'],\n * handler({ event, conditions, actions, check }) {\n * if (!conditions.user || !conditions.settings) return; // V1: manual narrowing\n * if (check.is('settings', (s) => s.sound)) actions.playSound?.();\n * actions.showToast?.({ title: event.payload.author });\n * },\n * });\n * ```\n */\nexport function createTrigger<S extends TriggerSchema>(\n config: CreateTriggerConfig<S>,\n runtime: Runtime = getDefaultRuntime(),\n): Trigger<S> {\n const internalHandler = (ctx: InternalHandlerCtx) =>\n config.handler(ctx as unknown as Parameters<typeof config.handler>[0]);\n\n const internalConfig: InternalTriggerConfig = {\n id: config.id,\n schedule: config.schedule ?? 'microtask',\n concurrency: config.concurrency ?? 'take-latest',\n required: (config.required ?? []) as readonly string[],\n events: config.events as readonly string[],\n scope: config.scope ?? '',\n handler: internalHandler,\n };\n\n const token = runtime.registerTrigger(internalConfig);\n\n return {\n id: config.id,\n schedule: internalConfig.schedule,\n enable() {\n runtime.getTrigger(config.id)?.enable();\n },\n disable() {\n runtime.getTrigger(config.id)?.disable();\n },\n isEnabled() {\n return runtime.getTrigger(config.id)?.isEnabled() ?? false;\n },\n inspect() {\n return runtime.getTrigger(config.id)?.inspect();\n },\n dispose() {\n token.unregister();\n },\n namedHooks(): NamedHooks<S> {\n return new Proxy({} as NamedHooks<S>, {\n get(_target, prop) {\n throw new Error(\n `[triggery] namedHooks().${String(prop)} requires @triggery/react. ` +\n `Use createNamedHooks(trigger) from '@triggery/react' instead.`,\n );\n },\n });\n },\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@triggery/core",
3
+ "version": "0.1.0",
4
+ "description": "Declarative business-logic orchestration for React — core runtime",
5
+ "license": "MIT",
6
+ "author": "Aleksey Skhomenko",
7
+ "homepage": "https://triggeryjs.github.io/triggery",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/triggeryjs/triggery.git",
11
+ "directory": "packages/core"
12
+ },
13
+ "bugs": "https://github.com/triggeryjs/triggery/issues",
14
+ "funding": [
15
+ {
16
+ "type": "patreon",
17
+ "url": "https://www.patreon.com/triggery"
18
+ },
19
+ {
20
+ "type": "boosty",
21
+ "url": "https://boosty.to/triggery"
22
+ }
23
+ ],
24
+ "keywords": [
25
+ "react",
26
+ "triggers",
27
+ "events",
28
+ "orchestration",
29
+ "business-logic",
30
+ "rule-engine",
31
+ "side-effects"
32
+ ],
33
+ "type": "module",
34
+ "main": "./dist/index.js",
35
+ "module": "./dist/index.js",
36
+ "types": "./dist/index.d.ts",
37
+ "exports": {
38
+ ".": {
39
+ "source": "./src/index.ts",
40
+ "types": "./dist/index.d.ts",
41
+ "import": "./dist/index.js",
42
+ "default": "./dist/index.js"
43
+ },
44
+ "./package.json": "./package.json"
45
+ },
46
+ "files": [
47
+ "dist",
48
+ "README.md",
49
+ "LICENSE",
50
+ "CHANGELOG.md"
51
+ ],
52
+ "sideEffects": false,
53
+ "publishConfig": {
54
+ "access": "public"
55
+ },
56
+ "devDependencies": {
57
+ "tsup": "^8.5.1",
58
+ "typescript": "^6.0.3",
59
+ "vitest": "^4.1.6"
60
+ },
61
+ "scripts": {
62
+ "build": "tsup",
63
+ "dev": "tsup --watch",
64
+ "test": "vitest run",
65
+ "test:watch": "vitest",
66
+ "test:coverage": "vitest run --coverage",
67
+ "clean": "rm -rf dist *.tsbuildinfo"
68
+ }
69
+ }