Skip to main content

FastAPI + pluggy extension reactor for modular SaaS applications

Project description

Datalayer

Become a Sponsor

☰ 🚀 Reactor

Reactor provides two sibling packages in one repository, with no python/typescript subpackage folders:

  • datalayer_reactor (Python): FastAPI + pluggy plugin reactor for modular and SaaS-style extensibility.
  • @datalayer/reactor (TypeScript): Extension runtime with a framework-agnostic core and separate React integration.

Why Reactor

This project targets a full extension reactor, not only hook callbacks:

  • Platform architecture with lifecycle phases and dependency graph
  • Plugin marketplace metadata and discovery primitives
  • Third-party ecosystem support through explicit manifest contracts
  • Dynamic feature loading and runtime enable/disable
  • Modular app concerns: interdependencies, lifecycle management, compatibility checks
  • SaaS extensibility primitives: tenant-specific plugin activation, sandboxed execution, versioned compatibility

Repository Layout

  • src/: TypeScript package source for @datalayer/reactor
  • datalayer_reactor/: Python package source
  • examples/frontend/: frontend-only React + Primer UI demo
  • examples/frontend-backend/: combined React + Python demo

TypeScript Package: @datalayer/reactor

Design

The TypeScript runtime implements:

  • defineExtension and configExtension
  • dependencies, peerDependencies, conflictsWith
  • ordered phases: init -> build -> register -> afterRegistration
  • runtime lifecycle control: start, stop, enable, disable
  • signal primitives for reactive extension outputs:
    • signal, computed, effect, batch, untracked
    • namedSignals, watchedSignal

Core vs React split

  • Core runtime exports from @datalayer/reactor
  • React bindings export from @datalayer/reactor/react

React bindings include:

  • useReactor: register the reactor in the zustand store and manage its lifecycle
  • ReactorSlot: render plugin-provided components by named slot
  • useReactorPlatform: reactor access for runtime toggles

Build

npm install
npm run build

Minimal TypeScript usage

import { buildReactorFromExtensions, defineExtension } from '@datalayer/reactor';

const DemoExtension = defineExtension({
	name: '@demo/core',
	build() {
		return { message: 'hello' };
	},
});

const reactor = buildReactorFromExtensions([DemoExtension]);
reactor.start();

Python Package: datalayer_reactor

Capabilities

  • Pluggy-powered plugin registration (register_plugin)
  • Compatibility and dependency checks via PluginManifest
  • Runtime enable/disable globally and by tenant
  • Marketplace publication/listing (PluginMarketplace)
  • Sandboxed execution option for plugin calls
  • FastAPI control plane with plugin/tenant endpoints

Install and run

python -m venv .venv
source .venv/bin/activate
pip install -e .
python -m datalayer_reactor

API app endpoints

  • GET /plugins
  • POST /plugins/{plugin_name}/toggle
  • POST /tenants/plugins/{plugin_name}/toggle
  • GET /tenants/{tenant_id}/features
  • GET /tenants/{tenant_id}/routes
  • GET /marketplace

Minimal Python usage

from datalayer_reactor import PluginManifest, PluginCompatibility, PluginPlatform

reactor = PluginPlatform()
reactor.register_plugin(
		PluginManifest(
				name="greeting-plugin",
				version="1.0.0",
				compatibility=PluginCompatibility(api_version="v1"),
		),
		plugin_impl=object(),
)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

datalayer_reactor-0.1.0-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

File details

Details for the file datalayer_reactor-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for datalayer_reactor-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0231b2f2ca32d1897be34ae436ebbfa2a19ba69ff50a523cab8a38eb35dd6dc1
MD5 e5b46a048b5a54720c616043918e2f63
BLAKE2b-256 38291ea2c252b2cd0e2e63c4c812214436c8e78b71d095ee90b8e68f9becf354

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page