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

TriggerRuntimeProvider

Стабильный · с 0.1.0

React context-провайдер, инжектящий кастомный Runtime в дерево. Каждый вызов useEvent, useCondition, useAction и useInspectHistory внутри провайдера использует этот рантайм вместо глобального синглтона.

Используй его, когда нужна настоящая изоляция: параллельные тесты, микрофронтенды в одной вкладке, мульти-тенантные приложения, где у каждого тенанта свой граф триггеров.

import { TriggerRuntimeProvider } from '@triggery/react';
function TriggerRuntimeProvider(props: TriggerRuntimeProviderProps): JSX.Element;

type TriggerRuntimeProviderProps = {
  readonly runtime: Runtime;
  readonly children: ReactNode;
};
ПропТипОбязательныйОписание
runtimeRuntimeдаРантайм, который должны использовать потомки.
childrenReactNodeдаПоддерево, получающее рантайм.
import { createRuntime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { App } from './App';

const runtime = createRuntime();

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <TriggerRuntimeProvider runtime={runtime}>
      <App />
    </TriggerRuntimeProvider>
  </StrictMode>,
);
import { createRuntime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import { render } from '@testing-library/react';
import type { ReactNode } from 'react';

function renderWithRuntime(ui: ReactNode) {
  const runtime = createRuntime();
  const result = render(
    <TriggerRuntimeProvider runtime={runtime}>{ui}</TriggerRuntimeProvider>,
  );
  return { ...result, runtime };
}
import { createRuntime, type Runtime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import { useMemo, type ReactNode } from 'react';

const cache = new Map<string, Runtime>();

function getRuntime(tenantId: string) {
  let rt = cache.get(tenantId);
  if (!rt) {
    rt = createRuntime();
    cache.set(tenantId, rt);
  }
  return rt;
}

export function TenantBoundary({ tenantId, children }: { tenantId: string; children: ReactNode }) {
  const runtime = useMemo(() => getRuntime(tenantId), [tenantId]);
  return <TriggerRuntimeProvider runtime={runtime}>{children}</TriggerRuntimeProvider>;
}

Побеждает внутренний:

import { createRuntime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import type { ReactNode } from 'react';

const outer = createRuntime();
const inner = createRuntime();

function App({ children }: { children: ReactNode }) {
  return (
    <TriggerRuntimeProvider runtime={outer}>
      {/* Uses outer */}
      <TriggerRuntimeProvider runtime={inner}>
        {/* Uses inner */}
        {children}
      </TriggerRuntimeProvider>
    </TriggerRuntimeProvider>
  );
}