Charles KWON OhJun b213f594aa feat(dispatch): file-name routing via auto-renamed Main symbols (AOT)
Lets app/api/foo.prg keep its idiomatic `FUNCTION Main()` shape while
multiple such files compile into one binary. fnode auto-renames each
library file's Main into a unique symbol derived from the basename:

  app/api/hello.prg       -> HELLO__MAIN
  app/api/admin-stats.prg -> ADMIN_STATS__MAIN  (hyphen -> underscore)

Three moving parts:

  cmd/fnode/main.go
    parseOne for every PRG, then rename Main on every file except
    the first (the entry). crossFile map updated so the analyzer
    treats the renamed symbol as declared.

  hbrtl_ext/dispatch/dispatch.go
    New HB_FUNC FNODE_CALL(cFuncName) that does VM.FindSymbol +
    PushSymbol/Function dance and discards the return value. Same
    pattern pgserver's callPRG helper uses internally.

  app/bridge_server.prg
    BridgeDispatch now derives the symbol name from hReq["path"]
    ( /api/foo[.prg] -> FOO__MAIN ), invokes FNODE_CALL, and
    maps "not found" errors to HTTP 404 (other errors -> 500).
    Hardcoded /api/hello and /api/echo handlers replaced by the
    path-driven model.

Verified end-to-end with app/api/hello.prg and app/api/admin-stats.prg:
  GET /api/hello.prg                  -> 200 + JSON from HELLO__MAIN
  GET /api/hello                      -> 200 (extension optional)
  GET /api/admin-stats.prg?from=2026  -> 200 from ADMIN_STATS__MAIN
                                          with query string echoed
  GET /api/nope                       -> 404 "function not found"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 11:16:44 +09:00

fivenode_go

FiveNode for Five — a Harbour-compatible web framework that compiles to a single Go binary. No Node.js, no FFI, no Apache. PRG sources go in, one executable comes out.

Successor to the koffi/N-API based fivenode framework, rebuilt on the Five Pure-Go runtime.

Status

Early bootstrap — Phase 1a in progress.

Architecture

Browser ──── HTTP/HTTPS ──── fivenode_go single binary
                              ├─ Five hbrt VM (PRG interpreter / compiled)
                              ├─ Five hbrtl (483 standard RTL functions)
                              ├─ hbrtl_ext/httpserver  — HTTP server RTL
                              ├─ hbrtl_ext/capi        — bridge_*.prg helpers
                              ├─ hbrtl_ext/pgrtl       — PostgreSQL client RTL
                              ├─ app/                  — bridge_*.prg + app PRG
                              └─ go:embed              — static assets

fnode build api/*.prg --extra-rtl=hbrtl_ext/... -o myapp produces a self-contained binary. No external dependencies beyond what the app code itself opens (e.g. a Postgres connection).

Build

go build -o fnode ./cmd/fnode
./fnode build app/hello.prg -o hello
./hello

License

Copyright (c) 2026 Charles KWON OhJun. All rights reserved.

Description
FiveNode for Five — Harbour PRG web framework as a single Go binary (no Node.js, no FFI)
Readme 139 KiB
Languages
xBase 44.2%
Go 35.8%
HTML 10.2%
CSS 8.1%
JavaScript 1.7%