FastAPI + pluggy extension reactor for modular SaaS applications
Project description
☰ 🚀 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/reactordatalayer_reactor/: Python package sourceexamples/frontend/: frontend-only React + Primer UI demoexamples/frontend-backend/: combined React + Python demo
TypeScript Package: @datalayer/reactor
Design
The TypeScript runtime implements:
defineExtensionandconfigExtensiondependencies,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,untrackednamedSignals,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 lifecycleReactorSlot: render plugin-provided components by named slotuseReactorPlatform: 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 /pluginsPOST /plugins/{plugin_name}/togglePOST /tenants/plugins/{plugin_name}/toggleGET /tenants/{tenant_id}/featuresGET /tenants/{tenant_id}/routesGET /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
Release history Release notifications | RSS feed
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file datalayer_reactor-0.1.0-py3-none-any.whl.
File metadata
- Download URL: datalayer_reactor-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0231b2f2ca32d1897be34ae436ebbfa2a19ba69ff50a523cab8a38eb35dd6dc1
|
|
| MD5 |
e5b46a048b5a54720c616043918e2f63
|
|
| BLAKE2b-256 |
38291ea2c252b2cd0e2e63c4c812214436c8e78b71d095ee90b8e68f9becf354
|