Deno.serveを読む
- publishedAt:
- 2025/10/05
- updatedAt:
- 2025/10/05
Intro
Andromeda.serveを作りたいので、参考としてDeno.serveを読んでいる。
1日の限られた時間で作業しているので、忘れてしまうことも多い。なので普段はしないのだが今回はメモにしてみた。それを少し整形してブログとして残しておく。
serve
リーディングしていくので、とりあえずapi名で検索してみる。Deno.serveとかでヒットすれば理想。
そして今回は実際にそれでヒットしてくれた。大体こう言う時ってDenoオブジェクトにあとでpushしていることが多いのでヒットしないと思ってたのでラッキー
ただこれ自体はserveメソッドではなさそう。
使用箇所を見れば、runかserveの時に実行されるようなことが書いてあるので、おそらくcliで呼び出される関数。
では本体はどこにあるかというと、少し下の行にserveメソッドらしきものがexportされている。
どうやらこれが実際のserve apiでありそう。
denoはjsで処理が書かれているから、核心をとっていきたい(似てる名前のinternal apiの可能性もなきにしもあらずなので)
docsにあるDeno.serveのinterfaceは、以下のようになっている
// Overload 1
serve(handler: ServeHandler<Deno.NetAddr>): HttpServer<Deno.NetAddr>
// Overload 2
serve(
options: ServeUnixOptions,
handler: ServeHandler<Deno.UnixAddr>,
): HttpServer<Deno.UnixAddr>
どうやら引数に渡すパターンによってOverloadができるそう。
それは内部的にはargs1がfunctionだったら〜みたいな処理でoptionだったりhandlerだったりで分けているので、これがserve本体であると納得して良さそうだとなる。
では次に実際にこのserveはどんなことをやっているのか。と言うことを知りたくなる。
http
これはなんとなく、op_http_serve_address_override
がになってそう。
これは実際にはこうなっている。どうやらこれはrustで書かれているよう。
これも実際に気になるところはparse_serve_address
なので、また検索する。
一旦tcpしか見ないし最初はそれしか対応しないつもりなので、そこまでしか見ない。
とりあえずネットワークの情報を整形していることがわかる。
とりあえずここまででネットワーク周りは終わりで、次にゆく。まだhandlerやoptionの扱いがわかっていない。
どうやらoptionとhandlerはそのまま最後にserveInner
という関数に渡している。
ここでも同様でunixなど他のものは無視をする。となるとこの関数は後半の方が気になる。
メインはここだ。serveHttpOnListenerでhandlerを渡していたりするので、ここを一旦読む。
なるほど、この関数次が重そうなのがなんとなく伝わる。
callback
mapToCallback
名前からわかる通りcallbackを扱う関数らしい。気になるのはRustでも処理を行なっているところ。
けど最終callbackを返してはいるので、次のメソッドでどう使うのか見てみよう。
serveHttpOn
ここもで最終callbackは呼び出されているだけではある。そしてwhile(true)
でループさせているので、ここでサーバーの起動も行なっているのだろう。
なんとなく、大きく該当処理の終わりはわかったので、深掘りしていく。
まず気になるのは、最後渡されているcontext
という値だ。しれっと登場している。
なんとなく、現状のサーバー状態を持つような値な気がする。
rust側の処理的にもそんな気はしている
where in serve in Deno
serveをDenoオブジェクトに代入しているところはどこだろう。
DenoオブジェクトはglobalThisに生えている。
❯ deno
Deno 2.4.3
exit using ctrl+d, ctrl+c, or close()
REPL is running with all permissions allowed.
To specify permissions, run `deno repl` with allow flags.
> console.log(globalThis.Deno)
{
internal: Symbol(Deno.internal),
Process: [class Process],
// ...etc
}
ので、globalThisにアサインしているところらへんを探せば良さそう。
finalDenoNsは何か
そしてdenoNsを見る
ここでserveを渡していることがわかった。
終わりに
とりあえず、Deno.serve
の初めから終わりまではわかった。ただ、
- 個々のメソッドの具体的な処理のされ方
- Andromedaへの流入
ここら辺は曖昧なので、まだもう少し追っていきたい。
Deno.serveを読む
- publishedAt:
- 2025/10/05
- updatedAt:
- 2025/10/05
0