核心概念
go-faas 如何儲存腳本、注入輸入、包裝語言並回傳結果。
腳本路徑與版本
- 每個腳本以邏輯
path字串識別(例如math/add)。 - path 不得包含
..。 - 儲存 key 使用 path 的 MD5,而非原始字串。
- 每次上傳以 Unix 時間戳建立版本,並更新 meta hash 的
latest。 POST /run/*path未帶version時執行最新版;?version=指定時間戳。
Run 與 Run-Now
| 模式 | 端點 | 持久化 | 典型用途 |
|---|---|---|---|
| 已存執行 | POST /run/*path |
從 Redis 載入 | 已部署函式 |
| 立即執行 | POST /run-now |
不寫入 Redis | 試驗、一次性 |
兩種模式在解析到程式碼後共用同一沙箱執行路徑。
Event 輸入模型
請求 body 的 input 是 JSON 字串。Handler 將其放入 stdin payload:
{"code": "...", "input": "{"a": 1}"}
Wrapper 解析 input 後提供:
| 全域變數 | 意義 |
|---|---|
event |
由 input 解析出的物件 |
input |
同一物件(別名) |
腳本通常以 return 回傳值;wrapper 將回傳值序列化為 JSON 寫到 stdout。
語言 Wrapper
| 語言 | Runtime | Wrapper | 說明 |
|---|---|---|---|
| Python | python3 |
internal/resource/wrapper.py |
使用者程式碼包在 __user_main__,讓頂層 return 可用;-u 關閉緩衝 |
| JavaScript | node |
internal/resource/wrapper.js |
提供 event / input |
| TypeScript | tsx |
internal/resource/wrapper.ts |
Linux bwrap 另綁定專案 node_modules(NODE_PATH) |
不支援的語言在 upload / run-now 以 HTTP 400 拒絕。
Body 大小限制
CODE_MAX_SIZE(預設 256KB)透過 http.MaxBytesReader 限制 run body。
型別化 JSON 回應
非串流模式會偵測 stdout 最後一筆合法 JSON 行:
type |
時機 |
|---|---|
string |
JSON 字串 |
number |
JSON 數字 |
json |
物件/陣列 |
text |
非 JSON 剩餘輸出 |
cleanOutput 會過濾 Node 警告噪音後再判斷型別。
SSE 串流
當 stream: true:
- 回應標頭改為
text/event-stream。 - 中間 stdout 行以
event: log送出(保留最後一行為 result)。 - 結束時送出
result或error,再 hijack 關閉連線。
逾時使用 TIMEOUT_SCRIPT 加上固定 Redis 緩衝作為 request context。