😀

🌟 22歳の大学生がAPIフレームワークを作ってみた話

に公開

副作用が見えないNext.js API Routes、300msのCold Start、グローバルミドルウェア…。

「これ、全部設計の失敗では…?」そんな疑問から、一人の大学生がOSSを暴発させました。


☕️ これは、はじめてのフレームワーク開発

少し自分の話をさせてください。

私は大学でTypeScriptやWeb開発を勉強しながら、Next.jsのAPI Routesに一緒になれない悩みを持っていました。

  • ルーティングがファイルシステムに分散
  • middlewareが全部globalでよく分からない
  • APIが悪くなってもスタックトレースの地獄

これ、誰が設計したんだ?…そう思った時、わたしは決めました。

「ないなら作ればいいじゃん」


✨ Tirneという挙動

そうして生まれたのが「Tirne」です。
名前はアングロサクソン語の「structure / strength」からとりました。

Tirne doesn’t just run your code. It structures it.

基本思想:

  • 路線もロジックも「振る舞いではなく構造」
  • middlewareは「明示的」であるべき
  • BunやCloudflare Workersで「サブms弁度」
  • TypeScriptの型が「振る舞いを定義する」

⚡️ ベンチマーク結果

メトリック Tirne (Bun) Next.js API
❄️ Cold Start 0.02ms 約200~300ms
⚡️ First Hit 0.79ms 20~30ms
押し払いRPS 90,000+ 8,000~10,000
平均レーテンシ <1ms 約15ms

ちなみに、これ「チューニング前」の値です。


🔑 Tirneのコードイメージ

📁 Hello API

import { Server } from "tirne";

const server = new Server([
  { method: "GET", path: "/health", handler: () => new Response("OK") }
]);

export default {
  fetch: (req: Request) => server.fetch(req),
};

🔐 Cookie & Auth

import { Server, json, setCookie, requireAuth } from "tirne";
import type { Route } from "tirne";

const routes: Route[] = [
  {
    method: "GET",
    path: "/login",
    handler: () => {
      const headers = new Headers();
      headers.append("Set-Cookie", setCookie("auth", "token", {
        httpOnly: true,
        path: "/",
        maxAge: 3600,
      }));
      return json({ message: "Logged in" }, 200, headers);
    },
  },
  {
    method: "GET",
    path: "/private",
    handler: () => json({ message: "Secret" }),
    middleware: [requireAuth],
  },
];

🌐 最後に

私はまだまだ学生で、Tirneも成長途中のプロダクトです。

もし、コンセプトや思想に革命を感じた方がいれば、GitHubでスターして頂けたら嬉しいです。

【外部リンク】

評価と感想、お待ちしております🌟

Discussion