Pular para o conteúdo

Começar

Este guia coloca o runtime rodando localmente e serve um app minúsculo a partir de um worker. Você vai precisar do Bun 1.3+ instalado.

  1. Clone e instale:

    Terminal window
    git clone https://github.com/djalmajr/buntime.git
    cd buntime
    bun install
  2. Suba a stack de desenvolvimento completa — runtime, os plugins do núcleo e o painel do operador (cpanel) — a partir da raiz do repositório:

    Terminal window
    bun dev

    Isso roda o runtime com --watch. Use bun --watch, nunca bun --hot: o modo hot quebra timers/cron e vaza bindings de porta.

  3. Confirme que está no ar:

    Terminal window
    curl http://localhost:8000/api/health

Um “worker app” é apenas um diretório com um entrypoint. O runtime o descobre a partir dos diretórios listados em RUNTIME_WORKER_DIRS (estilo PATH, separados por :).

  1. Crie um diretório de app. O layout plano e versionado é o mais simples:

    • Directoryapps/
      • Directoryhello@1.0.0/
        • index.ts
        • manifest.yaml
  2. Escreva o entrypoint. Um worker exporta um objeto default — um handler fetch é a forma mais simples:

    // apps/hello@1.0.0/index.ts
    export default {
    fetch(req: Request) {
    const url = new URL(req.url);
    return Response.json({ hello: "world", path: url.pathname });
    },
    };
  3. (Opcional) Descreva como o worker roda. Sem manifest, os padrões se aplicam (descoberta efêmera, timeout de 30s):

    # apps/hello@1.0.0/manifest.yaml
    entrypoint: index.ts
    ttl: 0 # 0 = efêmero (criado por requisição); >0 mantém aquecido
    timeout: 30s
    maxRequests: 1000
  4. Aponte o runtime para o diretório e inicie:

    Terminal window
    RUNTIME_WORKER_DIRS=./apps bun --watch apps/runtime/src/index.ts
  5. Chame seu app. Um worker sem escopo chamado hello é servido em /hello/:

    Terminal window
    curl http://localhost:8000/hello/
    # {"hello":"world","path":"/"}

O campo ttl define a personalidade do worker:

Criado a cada requisição e descartado em seguida. Maior latência por requisição, custo zero em idle. Melhor para handlers stateless, estilo lambda. A concorrência é limitada por RUNTIME_EPHEMERAL_CONCURRENCY (padrão 2); o excedente entra em fila até RUNTIME_EPHEMERAL_QUEUE_LIMIT (padrão 100), depois retorna 503.

O export default de um worker pode ser um handler fetch, um objeto routes, ou você pode entregar um index.html para uma SPA estática:

export default {
fetch(req: Request) {
return new Response("ok");
},
};