# 回應與 SSE

HakoRun 如何把函式輸出轉成 JSON 回應，以及串流模式的事件格式。

## 型別標註

非串流模式回傳 `{"data": ..., "type": ...}`。結果取自 stdout 由下往上第一行合法 JSON；沒有合法 JSON 時，取過濾掉 Node.js 警告（`Warning:`、`ExperimentalWarning` 等）後的全部輸出。

| `type` | 條件 | 範例 `data` |
|--------|------|-------------|
| `string` | JSON 字串 | `"done"` |
| `number` | JSON 數值 | `8` |
| `json` | JSON 物件、陣列、布林或 `null` | `{"sum": 30}` |
| `text` | 不是合法 JSON | `hello world` |

## SSE 事件

`stream: true` 時回應標頭為 `text/event-stream`，每則事件為一行 `data: <JSON>`：

```
data: {"event":"log","data":0,"type":"number"}

data: {"event":"result","data":"done","type":"string"}
```

| `event` | 送出時機 |
|---------|----------|
| `log` | stdout 每一行在下一行出現時送出 |
| `result` | 行程正常結束，內容為 stdout 最後一行 |
| `error` | stderr 有輸出、逾時、客戶端斷線或非零退出碼 |

每則事件的 `type` 依上表規則判斷；`result`／`error` 內的換行字元會被替換成空白。

## 結束與中止

- 送出 `result` 或 `error` 後，伺服器 hijack 並關閉連線。
- stderr 的第一行輸出即觸發終止，`error` 內容為 `stopped to run script: <該行>`。
- 客戶端斷線時，`error` 為 `stopped to run script: client disconnected`（客戶端不會收到）。

## 相關頁面

- [API 參考](/zh/api-reference)
- [腳本執行環境](/zh/script-runtime)
