Skip to content

feat(realtime): add realtime command and handler scaffolding#555

Draft
ImriKochWix wants to merge 9 commits into
mainfrom
feat/realtime-handler
Draft

feat(realtime): add realtime command and handler scaffolding#555
ImriKochWix wants to merge 9 commits into
mainfrom
feat/realtime-handler

Conversation

@ImriKochWix

@ImriKochWix ImriKochWix commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Note

Description

This PR introduces a new realtime handler resource type to the Base44 CLI, letting developers create, manage, and deploy realtime (WebSocket-style) handlers from the terminal. Handlers live in a base44/realtime/ directory, are scaffolded with a typed RealtimeHandler base class, and deploy via a dedicated realtime-handlers API endpoint. Realtime handlers are wired into the unified deploy and types generate flows, and TypeScript types (including inbound/outbound message schemas) are auto-generated from each handler's schema.jsonc.

Related Issue

None

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactoring (no functional changes)
  • Other (please describe):

Changes Made

  • New realtime-handler core resource (core/resources/realtime-handler/): schema, config discovery (readAllRealtimeHandlers), API client (deploySingleRealtimeHandlerPUT /realtime-handlers/{name}), sequential deploy logic, and a Resource<RealtimeHandler> implementation.
  • New base44 realtime command group with new <HandlerName> (scaffolds a typed RealtimeHandler subclass under base44/realtime/) and deploy [names...] (deploys selected or all handlers with per-handler status reporting).
  • Unified deploy integration: realtime handlers are now read, counted in the deploy summary, included in hasResourcesToDeploy, and pushed in deployAll.
  • Project config: added realtimeDir (default realtime) to the config schema, ProjectData, and the config reader (including plugin/zero-config paths that default to empty arrays).
  • Type generation: emits RealtimeHandlerNameRegistry and RealtimeHandlerRegistry (typed inbound/outbound message shapes compiled from each handler's schema.jsonc); added SDK package-name detection (@base44/sdk vs @base44-preview/sdk) and an export {} module marker so the declare module augments rather than replaces the SDK package.
  • Tests & fixtures: extended the types generate spec and added a ChatRoom realtime handler fixture (entry.ts + schema.jsonc).

Testing

  • I have tested these changes locally
  • I have added/updated tests as needed
  • All tests pass (npm test)

Checklist

  • My code follows the project's style guidelines
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation (if applicable)
  • My changes generate no new warnings
  • I have updated docs/ (AGENTS.md) if I made architectural changes

Additional Notes

A new resource type was added without a corresponding topic guide in docs/; consider documenting the realtime handler resource and the base44 realtime command group to keep docs/ in sync with the architecture.


🤖 Generated by Claude | 2026-06-30 13:15 UTC | c9c117a

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

🚀 Package Preview Available!


Install this PR's preview build with npm:

npm i @base44-preview/cli@0.1.1-pr.555.c9c117a

Prefer not to change any import paths? Install using npm alias so your code still imports base44:

npm i "base44@npm:@base44-preview/cli@0.1.1-pr.555.c9c117a"

Or add it to your package.json dependencies:

{
  "dependencies": {
    "base44": "npm:@base44-preview/cli@0.1.1-pr.555.c9c117a"
  }
}

Preview published to npm registry — try new features instantly!

ImriKochWix and others added 8 commits June 30, 2026 13:54
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
new.ts used project.root but readAllRealtimeHandlers uses dirname(configPath),
causing handlers to be created at realtime/ instead of base44/realtime/.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
'base44' is the CLI package name and has no exported types.
@base44/sdk now exports RealtimeHandler and Conn for type-checking,
and the bundler rewrites the import to the CF shim at deploy time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- base44 types generate now includes realtime handlers in types.d.ts
- RealtimeHandlerNameRegistry: auto-registers handler names (no manual declare needed)
- RealtimeHandlerRegistry: compiled from schema.jsonc inbound/outbound JSON schemas
- Add schema.jsonc support to realtime-handler resource reader
- Update test fixture with ChatRoom schema and assertions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Detect @base44/sdk vs @base44-preview/sdk from project's package.json
  so declare module targets the correct package name
- Add export {} to generated types.d.ts to ensure module context,
  preventing ambient module from shadowing the SDK package types

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove unused RealtimeHandlerConfig type alias
- Replace [^]* regex with [\s\S]* (Biome noEmptyCharacterClassInRegex)
- Auto-format long lines per Biome formatter rules

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The dedicated endpoint calls ensure_cfw_backend and uses force_per_function
so the bundler runs applyRealtimeCompat instead of the per-app path.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant