Dev

createCac's building block: h3 + WebSocket RPC + the SPA at the resolved base path.

createCac's building block: h3 + WebSocket RPC + the SPA at the resolved base path.

import { createDevServer } from 'devframe/adapters/dev'
import myDevframe from './my-tool'

const handle = await createDevServer(myDevframe, {
  port: 7777,
  onReady: ({ origin }) => console.log(`Ready at ${origin}`),
})

// graceful shutdown: SIGINT, hot reload, test teardown
process.on('SIGINT', () => handle.close().then(() => process.exit(0)))

Returns a StartedServer: origin, port, h3 app, WS server, RPC group, close().

OptionDefaultDescription
hostdef.cli?.host ?? 'localhost'Bind host.
portresolved via resolveDevServerPortListen port.
flags{}To setup(ctx, { flags }).
distDirdef.clientAssets (falls back to deprecated def.cli?.distDir)SPA dist; unset = bridge mode.
basePathresolveBasePath(def, 'standalone')Mount override.
appfresh h3 appMount onto.
openBrowserresolves from flags.open / def.cli?.openfalse off; string opens a path.
wsdef.cli?.wsRPC WebSocket; see below.
onReadynoneWS-bind callback.

WebSocket endpoint

The RPC socket shares the HTTP port at __ws, advertised relative. Configure def.cli.ws:

FieldScenarioAdvertised websocket
routesame server, other route{ path: <route> }
portdifferent port{ port, path: <route> }
urlremote originURL verbatim

Precedence url > port > route; url keeps the socket local on route.

Port resolution

resolveDevServerPort(def, opts?) resolves a port before start.

import { resolveDevServerPort } from 'devframe/adapters/dev'

const port = await resolveDevServerPort(myDevframe, { host: '127.0.0.1' })
// honors def.cli?.port / portRange / random
OptionDefaultDescription
hostdef.cli?.host ?? 'localhost'Bind host (get-port-please detection).
defaultPortdef.cli?.port ?? 9999Preferred-port override.