v0.7.0

腳本執行環境

最後更新

各語言 wrapper 如何接收輸入、執行使用者程式碼並輸出結果。

輸入注入

Handler 把 {"code": ..., "input": ...} 以 JSON 寫入 wrapper 的 stdin。wrapper 將 input 字串解析為 JSON 物件,並同時以兩個全域變數提供:

全域變數 內容
event 解析後的 input;input 為空時為 {}
input 與 event 相同的物件

input 不是合法 JSON 時,wrapper 寫入 stderr 並以退出碼 1 結束。

各語言行為

語言 Runtime 執行方式 結果輸出
Python python3 -u 程式碼逐行縮排後包進 __user_main__(),讓頂層 return 可用 json.dumps(回傳值) 印到 stdout;無法序列化時不輸出
JavaScript node 包進 async function,以 vm.Script 在全域 context 執行;可用 await 回傳值非 undefined 時 JSON.stringify 印出
TypeScript tsx 先以 esbuild.transformSync(loader: ts、format: cjs、target: node18)轉譯,再同 JavaScript 執行 頂層 return 值或全域 result,JSON.stringify 印出

範例

total = sum(event["items"])
print("summing", len(event["items"]))
return {"total": total}
const res = await Promise.resolve(event.a * 2);
return { doubled: res };
interface User { name: string; age: number }
const adults = (event.users as User[]).filter(u => u.age >= 18);
return adults.map(u => u.name);

中間的 print/console.log 在非串流模式會被忽略(只取最後一行合法 JSON),在串流模式會成為 log 事件。

錯誤處理

相關頁面

EN