API reference

Node.js と Bun のサーバー API

Node.js と Bun で Effront アプリケーションを実行する API のリファレンス。

@effront/server は Node.js と Bun 向けに、ネイティブ Effect HTTP ホストと静的ファイル配信を提供します。 インストールと起動ファイルは Node.js と Bun を参照してください。

effrontServer

@effront/server/vite の effrontServer(options?: EffrontServerOptions): Plugin は、Vite の開発・プレビューにネイティブハンドラーを接続し、別の本番起動用エントリーをビルドします。 effront() より後に登録する必要があります。

import { effront } from "@effront/vite";
import { effrontServer } from "@effront/server/vite";
import { defineConfig } from "vite-plus";

export default defineConfig({
  plugins: [effront(), effrontServer()],
});
オプション既定値エントリーの契約
rsc?: string./src/entry.rsc.tstoHttpEffect(application) などのネイティブ HTTP Effect を handler として名前付き export する
server?: string./src/entry.server.tsserve を起動する本番用コード

エントリーに空文字列を指定すると TypeError になります。 RSC エントリーは if (import.meta.hot) import.meta.hot.accept(); で HMR を受け入れます。

開発とプレビューは、Node 互換ミドルウェアを通じて Vite のリスナーを使い、本番起動用エントリーは使いません。 そのため serve のオプションでは Vite のポートやホスト名は変わりません。 本番で Bun を使う場合も @effect/platform-node が必要です。 Bun 固有の実行時動作を確認するには、Vite プレビューではなく、通常は bun dist/rsc/server.js でビルド済み本番エントリーを実行します。

serve

serve(handler, options) は、スコープで管理するサーバー Layer を返します。 handler は HttpServerResponse を返す Effect であり、Fetch 関数ではありません。 Layer.launch と対応するプラットフォーム Runtime で Layer を起動します。

ランタイムserve のインポート先Runtime
Node.js@effront/server/node@effect/platform-node の NodeRuntime.runMain
Bun@effront/server/bun@effect/platform-bun の BunRuntime.runMain
ServeOptions のフィールド契約
assets必須の AssetOptions。下記参照。
port省略可能な数値。既定値 3000。
hostname省略可能な文字列。既定値 127.0.0.1。

起動前に、残りのアプリケーションサービス Layer を提供します。 Node.js の起動例 を参照してください。 既定のアドレスはローカル接続だけを受け付けます。 0.0.0.0 などのアドレスは、他のマシンにもリスナーを公開します。 Bun のサーバーは、リクエスト本文に 10 MiB の上限も適用します。

withAssets

@effront/server/assets の withAssets(handler, options) は、静的ファイルを配信するハンドラーを構築します。 serve は assets オプションを使って、これを適用済みです。

AssetOptions のフィールド契約
client.root必須のブラウザー出力専用ディレクトリ
client.prefix/assets/ など、/ 以外の必須の絶対 URL 接頭辞
client.cacheControl省略可能なクライアント用 Cache-Control 値
public.root任意の public マウントを設定する場合に必須のディレクトリ。URL 接頭辞を追加せずに配信する
public.cacheControl省略可能な public 用 Cache-Control 値

どちらのキャッシュポリシーも、既定値は public, max-age=0, must-revalidate です。 public, max-age=31536000, immutable は、ハッシュ付きファイル名だけに使用してください。 接頭辞が /assets/ の場合、/assets/app.js は client.root 内の app.js を検索します。 Vite の出力や base を変更した場合、実際の出力ディレクトリと URL にマウント設定を合わせる必要があります。

リクエスト結果
クライアント接頭辞内の GET または HEADファイルレスポンス。ファイルがなければ 404
public ファイルに一致する GET または HEADファイルレスポンス
public に該当なし、またはその他のメソッドアプリケーションハンドラー
クライアント接頭辞外の Flight、Server Function、/_effront リクエストpublic の検索を省略し、アプリケーションハンドラー

ディレクトリの index や SPA フォールバックはありません。 それ以外のファイルシステム障害は型付き HTTP エラーとして残ります。 ルートディレクトリの確認は起動時ではなく、リクエスト時に行います。

既存の Effect HTTP サーバーでは、構築時に yield* withAssets(handler, options) でハンドラーを取得します。 外側の構築用 Effect をリクエストハンドラーとして渡さないでください。

段階成功エラー必要なサービス
構築リクエストハンドラー EffectPlatformErrorFileSystem.FileSystem、Path.Path
リクエストHttpServerResponse元のハンドラーのエラーと HttpServerError元の要件と HttpServerRequest

ホストはリクエスト Scope を所有し、レスポンス本文を消費またはキャンセルする必要があります。 MIME 型、weak ETag、条件付きリクエスト、Range は Effect 4.0.0-rc.116 に従います。

条件動作
HEAD または条件付き 304ファイルストリームを取得しない
満たせる単一バイト範囲206
複数範囲、未対応形式、不正な範囲Range を無視
ファイル末尾を超える10進数の開始位置JavaScript の安全な整数の範囲外でも 416
ファイル末尾を超える10進数の終了位置ファイル末尾まで切り詰めて 206
有効だが満たせない単一範囲Content-Range 付きの 416。アセットのキャッシュ・validator ヘッダーなし
If-Range無視
HEAD の Range無視する。本文なしでファイル全体のメタデータを返す

呼び出し側が提供する HttpPlatform や ETag サービスは、アセットレスポンスに影響しません。