範本與原始碼下載
誰: 範本與 CLI 下載是任何部門成員;某個版本的原始碼是部門管理者。端點: GET /starters、GET /starters/cli.tgz、GET /starters/{starter_id}/{language}/source.zip、GET /starters/{starter_id}/{language}/department-worker.tar.gz,以及 GET /worker/versions/{version_id}/source。路徑相對於 {BASE}/private/module/edge-workers;每個呼叫都帶 Authorization: Bearer <jwt>(驗證與角色)。範本路由在你的部門還沒有 Worker 時就能用;下載版本原始碼則需要已有 Worker。
BASE=https://<backend-origin>/private/module/edge-workers
export JWT=<your TeamSync JWT> # JWT only: an API key is not accepted首次隨後端 v5.13.0(範本與 CLI 下載)與 v5.14.0(版本原始碼下載)發佈。
後端提供什麼
| 路由 | 回傳 | 下載檔名 |
|---|---|---|
GET /starters | 範本與 CLI 的 JSON 目錄,附大小與 SHA-256 摘要 | — |
GET /starters/cli.tgz | application/gzip:teamsync-worker CLI 的 npm tarball | cli.tgz |
GET /starters/{starter_id}/{language}/source.zip | application/zip:可編輯的範本專案 | <starter_id>-<language>.zip,例如 department-users-api-typescript.zip |
GET /starters/{starter_id}/{language}/department-worker.tar.gz | application/gzip:未修改範本、可直接上傳的壓縮檔 | department-worker.tar.gz |
任何部門成員都能呼叫:持有效 JWT、所屬部門存活的使用者,沒有角色門檻。API 金鑰不被接受(這些路由只讀取 Bearer JWT),服務帳號則以 403 拒絕,與所有 Edge Workers 路由相同。這些檔案在建置後端映像檔時產生,而且每個範本都先經過建置你的提交所用的同一個權威 builder 驗證,所以範本一定通過這個後端的 builder,CLI 也帶著這個後端的 builder 政策。因此目錄只會在後端重新部署時改變。
starter_id 是 department-users-api(唯一的範本),language 是 javascript 或 typescript。5.22.0 的後端兩種語言都提供。
範本目錄
curl -sS -H "Authorization: Bearer $JWT" "$BASE/starters"{
"builder_policy_version": "department-worker-project-v2.10",
"starters": [
{ "id": "department-users-api", "language": "javascript",
"title": "Department Users API",
"description": "A manifest-first, multi-operation department Worker example.",
"source_zip": { "size_bytes": N, "sha256": "…" },
"project_archive": { "size_bytes": N, "sha256": "…" } },
{ "id": "department-users-api", "language": "typescript", /* same shape */ }
],
"cli": { "version": "0.1.0", "size_bytes": N, "sha256": "…" }
}| 欄位 | 意義 |
|---|---|
builder_policy_version | 這個後端的 builder 政策(5.22.0 為 department-worker-project-v2.10)。各政策版本啟用什麼,見提交管線。 |
starters | 1 到 32 筆,先依 id、再依 language 排序。 |
starters[].title、.description | 分別為 1 到 128 與 1 到 2048 個字元;內容來自範本 manifest 的 api.title、api.description。 |
starters[].source_zip、.project_archive | 該路由實際送出的檔案的 size_bytes(1 到 67 108 864)與 sha256(64 個小寫十六進位字元)。 |
cli | version 是 CLI tarball 的套件版本(5.22.0 為 0.1.0);size_bytes 與 sha256 描述 cli.tgz。 |
伺服器不會送出大小或 SHA-256 與目錄不符的檔案,你也可以對自己下載的檔案做同樣檢查:sha256sum <file> 必須印出目錄中的 sha256(macOS:shasum -a 256 <file>)。
不用 CLI 就開始
編輯原始碼。 下載 zip,解壓縮到新的空目錄(zip 沒有最上層資料夾):
curl -sS -H "Authorization: Bearer $JWT" -o starter.zip \
"$BASE/starters/department-users-api/typescript/source.zip"
mkdir department-api && unzip starter.zip -d department-api一起編輯 teamsync.worker.json(manifest)與 src/。若要換成自己的模組名稱,請一次全部改掉:manifest 的 module.name、package.json 的 name,以及 package-lock.json 的根 name 與 packages[""].name。任何不一致都會被 builder 拒絕(project_identity_mismatch、package_lock_invalid;validate 會印出代碼),而 teamsync-worker init 建立骨架時會替你改寫。提交必須是確定性壓縮檔格式(提交版本):用 CLI 的 pack 產生(見下方「從你的後端取得 CLI」)。範本自帶的 README.zh-TW.md 還描述了一條網頁路線:在 部門 Worker 頁面下載範本、編輯後,把專案資料夾(或 .zip)拖進上傳對話框,由瀏覽器為你建立 department-worker.tar.gz。
原封不動上傳範本。 現成的壓縮檔在映像檔建置時已被這個後端的 builder 接受,所以可以照下載的樣子直接提交。這是看到一個可運作的 Worker 最快的方式:
curl -sS -H "Authorization: Bearer $JWT" -o department-worker.tar.gz \
"$BASE/starters/department-users-api/typescript/department-worker.tar.gz"
curl -sS -H "Authorization: Bearer $JWT" \
-F "project=@department-worker.tar.gz;type=application/gzip" \
"$BASE/worker/versions" # manager only → 201, a ready revision部署是另一個步驟(部署與輪詢)。
從你的後端取得 CLI
teamsync-worker 是私有套件 @teamsync/department-workers,不在公開的 npm registry 上。每個後端提供與自己 builder 相符的那一份:
curl -sS -H "Authorization: Bearer $JWT" -o cli.tgz "$BASE/starters/cli.tgz"
npm install --global ./cli.tgz
teamsync-worker --help- 需要 Node ≥ 22。npm 必須能連到 registry 或公司鏡像,因為安裝這個 tarball 會下載它的四個執行期依賴(
esbuild、miniflare、typescript-parser、zod)。 - 使用你要提交的那個後端提供的 CLI:這樣
validate跑的就是該後端伺服器端建置所用的同一個 builder 與 builder 政策(目錄把政策回報為builder_policy_version)。 - npm 接受任何
.tgz檔名;伺服器把下載檔名取為cli.tgz。 - 每個指令、旗標與結束行為:CLI 參考。
下載你部署過的內容
GET /worker/versions/{version_id}/source 會逐位元組回傳你部門 Worker 某個版本所儲存的 department-worker.tar.gz。
curl -sS -H "Authorization: Bearer $JWT" -o department-worker.tar.gz \
"$BASE/worker/versions/<version_id>/source"
sha256sum department-worker.tar.gz # must equal project_digest of that version- 誰: 部門管理者。能透過
GET /worker/versions/{version_id}讀取版本的成員,不能下載它的原始碼。 - 哪些版本: 你部門 Worker 的任何版本,只要該列儲存了壓縮檔,不論狀態,已被取代的也可以。其他部門或公司的版本,回應與不存在的 id 完全相同。
- 完整性: 送出之前,後端會讀取該物件(最多 2 MiB,即專案壓縮檔上限),並以版本的
project_digest檢查它的 SHA-256。project_digest欄位在版本的回應中(GET /worker/versions、GET /worker/versions/{version_id}),所以你也能核對自己的副本。 - 回應: 200,
Content-Type: application/gzip、Content-Disposition: attachment; filename="department-worker.tar.gz"、Cache-Control: private, no-store。 - 重新提交或編輯: 這個檔案是提交格式,所以能原封不動送到
POST /worker/versions(得到新的修訂版,絕不覆寫)。要編輯就用tar -xzf解到空目錄。壓縮檔只含pack會出貨的內容:teamsync.worker.json、package.json、package-lock.json、tsconfig.json與src/**。CLI 的validate、test、pack還需要README.md、.teamsyncignore與非空的tests/,所以先從範本的source.zip複製過來。 - 稽核: 下載不會被記成稽核事實;伺服器只寫一行日誌,內含公司、部門、使用者與版本 id。
各個檔案的內容
| 檔案 | 內容 | 特性 |
|---|---|---|
source.zip | 整個範本目錄:teamsync.worker.json、package.json、package-lock.json、tsconfig.json、src/(handler、zod schema、src/data/user-reference.json;TypeScript 為 index.ts、types.ts、user-schema.ts、users.ts,JavaScript 為 index.js、user-schema.js、users.js)、tests/(worker.test.ts 或 worker.test.js)、README.md、README.zh-TW.md、.gitignore、.npmignore、.teamsyncignore | 項目依路徑排序且不壓縮(stored),時間戳一律 1980-01-01 00:00,mode 0644,沒有目錄項目。不含 node_modules/、.teamsync/ 與作業系統垃圾檔。 |
department-worker.tar.gz | teamsync-worker pack 對未修改範本寫出的內容:teamsync.worker.json、package.json、package-lock.json、tsconfig.json、src/** | 確定性格式,≤ 2 MiB;POST /worker/versions 可原樣接受。 |
cli.tgz | @teamsync/department-workers 的 npm pack tarball:build.mjs、dependency-catalog.mjs、migration-runtime.mjs、runtime-template.mjs、starter-pack.mjs、teamsync-worker.mjs,以及兩個範本 | 5.22.0 為版本 0.1.0。不含 deploy-platform.mjs、Wrangler 設定或 dispatcher 原始碼。 |
範本是五個操作的 users CRUD(listUsers、createUser、getUser、updateUser、deleteUser),示範 handler 契約、zod 驗證、靜態 JSON 資料、游標分頁與儲存介面。
錯誤
| 路由 | 狀態 | detail | 原因 |
|---|---|---|---|
/starters* | 403 | 端點列出的成員關卡訊息 | 不是所屬部門存活的有效 JWT 使用者(服務帳號、沒有存活部門) |
/starters* | 404 | Edge Worker starter not found | starter_id 或 language 不在上述清單內,或該組合不在目錄中。絕不是 422;清單外的值由路由在驗證執行之前就回應。 |
/starters* | 503 | Edge Worker starter catalog is unavailable | 目錄檔遺失、無法讀取或內容無效 |
/starters/cli.tgz、source.zip、department-worker.tar.gz | 503 | Edge Worker starter artifact is unavailable | 檔案遺失、不是範本目錄內的一般檔案,或大小或 SHA-256 與目錄不符 |
/worker/versions/{version_id}/source | 403 | Insufficient permissions. 或成員關卡訊息 | 呼叫者不是部門管理者 |
| 同上 | 404 | Department Worker not found | 部門沒有 Worker、id 不存在,或版本屬於其他部門或公司(三者同一個回應) |
| 同上 | 404 | {"code": "edge_worker_version_source_unavailable", "message": "This version has no stored source archive"} | 該版本列沒有儲存壓縮檔 |
| 同上 | 422 | 驗證清單 | version_id 不是 UUID |
| 同上 | 500 | {"code": "edge_worker_source_integrity_failed", "message": "The stored source archive failed its integrity check"} | 物件的 SHA-256 與 project_digest 不符,或該列已損毀(物件 key 不在你的部門之下,或摘要不是 64 個小寫十六進位字元)。損毀的列在任何儲存讀取之前就被拒絕。 |
| 同上 | 503 | {"code": "edge_worker_artifact_unavailable", "message": "Edge Worker artifact storage is unavailable"} | 無法讀取 artifact store(未設定、物件遺失,或超過 2 MiB) |
帶代碼的 detail 物件是 {code, message};其他列是純字串(錯誤)。端點總覽:端點。
操作者備註
範本檔案放在 EDGE_WORKER_STARTERS_DIR 指定的目錄(預設 /opt/teamsync/edge-worker-starters,API 行程啟動時讀取)。映像檔建置時會把 catalog.json、cli.tgz,以及每個範本的 <starter_id>/<language>/source.zip 與 <starter_id>/<language>/department-worker.tar.gz 放進去;若權威 builder 拒絕某個範本,建置就會失敗。每個請求都會重新讀取並重新驗證 catalog.json,也會重新檢查它要送出的檔案,所以自訂映像檔必須保留該目錄(或把這個變數指向一份副本),否則 /starters* 路由會回 503。見環境變數。