端點
一切的 base 前綴:{BASE}/private/module/edge-workers。這個 router 刻意掛在一般 private router 之外:一般 private 通道也接受 x-api-key,Edge Workers 只收 JWT(只帶 API key 的請求會拿到 418,見驗證)。光有有效 JWT 還不夠:呼叫者必須是存活的真人使用者,所以服務帳號的 JWT 在每一條路由都會被 403 拒絕(成員路由回 Service accounts cannot invoke Edge Workers;管理者與公司管理者路由上,它的角色 0 已先過不了角色門檻,回 Insufficient permissions.)。以下路徑省略前綴。
OpenAPI tags:每個 sub-router 一個 Module: Edge Workers - <Resource> tag(Worker、Access Policy、API Key、Runtime Config、Operation Settings、Secrets、Versions、Deployments、OpenAPI、Starters、Service Accounts、Company Operations);十條 invoke 路由是隱藏的(include_in_schema=False)。截至後端 5.22.0:文件化操作共 43 條 — 主 router 25 條、starter 路由 4 條、服務帳號路由 14 條(部門範圍 7 條 + 同樣 7 條鏡像在 /company/departments/{department_id} 之下)。
權限關卡(細節見驗證):
- 成員 = 任何有存活所屬部門的 JWT 使用者;
- 管理者 = JWT 角色 ≥
CAN_MANAGE_DEPARTMENT(預設 2),且作用於自己的部門; - 管理者 + 設定鎖 = 管理者,再取得部門的操作設定鎖(與部署請求、服務帳號重設/刪除共用):已被持有 → 409
{"code": "deployment_in_progress", "message": "Another Worker settings mutation or deployment is in progress"},鎖儲存無法使用 → 503Operation-settings mutation lock is unavailable; - 公司管理者 = JWT 角色 ≥
CAN_MANAGE_COMPANY(預設 3)。
在這些關卡之前,共用的 JWT dependency 會先回應:沒有 token、token 無法解碼,或非 JWT 憑證(例如 x-api-key,一律不讀取)→ 418 Could not validate credentials;JWT 對應的使用者不存在 → 404 User not found;帳號狀態 → 451 Account expired、401 Account not verified yet、409 Account disabled、410 Account deleted。接著成員與管理者關卡以 403 拒絕:服務帳號(Service accounts cannot invoke Edge Workers)、從資料庫重新讀取後已不存活的使用者(A live Edge Worker user is required)、缺少或已失效的部門(A department identity is required for Edge Workers、A live department identity is required for Edge Workers);管理者關卡另有 Insufficient permissions.。模組的 403 Edge Workers require TeamSync JWT authentication 只是防禦性檢查,已發布的 JWT-only dependency 不會走到它。
指向 Worker 的 Durable Object 的路由還會解析是哪個位置在服務這個 Worker。若該紀錄不一致,它們回 503 Department Worker serving target is unavailable(存取政策與操作設定路由、執行期設定的讀取、機密清單與機密寫入、OpenAPI 文件、部署中的操作設定暫存,以及 invoke 路由);後端根本沒有這個 Worker 已驗證的位置時,有稽核的控制變更與部署路由回 409 worker_serving_target_unavailable。平台維運者搬移該 Worker 期間,部署回 409 worker_migration_in_progress(Worker 已持有逐操作設定或請求帶有 operation_settings 時,則是 503 Department Worker control change is unavailable),有稽核的控制變更回 503 Department Worker control change is unavailable;搬移短暫暫停的期間,必須先讀取 Worker 狀態的呼叫 — 讀取、操作設定與金鑰、寫入機密,以及部署 — 則改回各自慣用的修訂版過期 409(錯誤、搬移 Worker)。
Worker
| Method + path | 用途 | 權限 | 回應 |
|---|---|---|---|
GET /worker | 讀取單例 Worker + 已部署修訂版指標 | 成員 | EdgeWorkerView |
部門還沒有 Worker 時 404 Department Worker not found。
存取政策(前綴 /worker/access-policy)
| Method + path | 用途 | 權限 | 請求 → 回應 |
|---|---|---|---|
GET /worker/access-policy | 讀取現行 Worker 層級准入政策 | 管理者 | — → EdgeWorkerAccessPolicyView |
PUT /worker/access-policy | 替換模式 + IP 允許清單(CAS) | 管理者 | EdgeWorkerAccessPolicyUpdate → EdgeWorkerAccessPolicyView |
POST /worker/access-policy/api-key | 輪替 Worker 層級 API 金鑰(僅限舊版 release) | 管理者 | EdgeWorkerAccessPolicyKeyMutationRequest → EdgeWorkerApiKeyRotationResponse |
DELETE /worker/access-policy/api-key | 撤銷 Worker 層級 API 金鑰(冪等,所有 release 皆可) | 管理者 | EdgeWorkerAccessPolicyKeyMutationRequest → EdgeWorkerApiKeyRevocationResponse |
- 四條都要求 Worker 已部署且 active:否則 409
Department Worker must be deployed and active。 - CAS:請求帶
base_revision;過期 → 409Access policy revision is stale。後端驗證 provider 回傳恰為base_revision + 1(撤銷 no-op:+0、revoked: false)— provider 回應漂移是 503,不是 409。 - 輪替只回傳一次明文金鑰:
tsw_+ 43 個 url-safe 字元(共 47);只儲存 SHA-256 摘要 + 後四碼。header 名稱固定X-TeamSync-Worker-Key。 - live release 以 builder policy
department-worker-project-v2.8或更新版本建置時,或 Worker 一旦持有任何操作設定表,輪替會被拒絕:409{"code": "worker_wide_key_legacy_only", "message": "Rotate an operation key instead"}。請改用逐操作金鑰。撤銷在所有 release 上都仍可用。 - 讀取失敗:503
Department Worker public URL is unavailable、Department Worker access policy is unavailable、Deployed department Worker release is unavailable。變更操作另有 503Department Worker control change is unavailable(稽核意圖無法提交)與 503{"code": "worker_release_unavailable", "message": "Worker release changed; retry this request"}(已部署的 release 在後端讀取與呼叫之間變了)。 - 回應帶
Cache-Control: no-store+Pragma: no-cache。 - 超過 16 KiB → 413
Worker access policy request exceeds limit。
執行期設定(前綴 /worker/runtime-config)
| Method + path | 用途 | 權限 | 請求 → 回應 |
|---|---|---|---|
GET /worker/runtime-config | 讀取非機密執行期 JSON | 管理者 | — → EdgeWorkerRuntimeConfigView |
PUT /worker/runtime-config | 整體替換(CAS) | 管理者 | EdgeWorkerRuntimeConfigPutRequest → EdgeWorkerRuntimeConfigView |
DELETE /worker/runtime-config | 刪除(CAS,仍推進 revision) | 管理者 | EdgeWorkerRuntimeConfigDeleteRequest → EdgeWorkerRuntimeConfigView |
同樣的「已部署且 active」409 與 CAS 409(Runtime config revision is stale);後置驗證漂移(revision ≠ base+1,或 SHA-256 與後端自己的正規摘要不符)→ 503。讀取失敗 → 503 Department Worker runtime config is unavailable;變更操作另有 503 Department Worker control change is unavailable 與帶代碼的 503 worker_release_unavailable。超過 73 728 位元組 → 413。注意這裡兩個讀取都是管理者關卡,與 GET /worker 不同。
操作設定(前綴 /worker/operation-settings)
逐操作的入站存取與操作 API 金鑰,以及每個操作的服務帳號綁定。概念:逐操作存取;操作步驟:管理操作存取。
| Method + path | 用途 | 權限 | 請求 → 回應 |
|---|---|---|---|
GET /worker/operation-settings?version_id= | 讀取現行設定表,或預覽某個 ready/deployed 目標 release 會拿到的設定表 | 管理者 | 選填 version_id(ResourceId)→ EdgeWorkerOperationSettingsView |
PUT /worker/operation-settings | 整表替換(CAS) | 管理者 + 設定鎖 | EdgeWorkerOperationSettingsPutRequest → EdgeWorkerOperationSettingsView |
POST /worker/operation-settings/{operation_id}/api-key | 輪替單一操作的 API 金鑰 | 管理者 + 設定鎖 | 無 body → EdgeWorkerOperationApiKeyRotationResponse |
DELETE /worker/operation-settings/{operation_id}/api-key | 撤銷單一操作的 API 金鑰(冪等) | 管理者 + 設定鎖 | 無 body → EdgeWorkerOperationApiKeyRevocationResponse |
- Release 關卡。 live Worker 必須已部署且 active(409
Department Worker must be deployed and active;撤銷也接受paused),且其 release 以 builder policy ≥department-worker-project-v2.8建置,否則 409{"code": "operation_settings_require_supported_release", "message": "Re-upload and deploy this Worker with the operation-settings runtime policy before changing per-operation access"}。version_id若不是這個 Worker 的ready或deployed版本 → 404Department Worker not found;以低於 v2.8 建置者 → 409,代碼相同,message 為The selected release does not support operation settings。 - 狀態。
legacy(從未寫過設定表:每個操作都繼承 Worker 層級政策,revision 0)、pending(已有設定表,但沒有屬於這個 release 的;公開呼叫一律拒絕)、reconciled。對尚無設定表的目標做version_id預覽時,會顯示不帶設定部署時會沿用的內容,狀態仍回報為pending。 - PUT。
operations必須恰好列出 live manifest 的所有操作 id,否則 422{"loc": ["body", "operations"], "msg": "operation settings must list every manifest operation", "type": "operation_settings_incomplete"};access: null表示繼承 Worker 層級政策。base_revision必須等於設定表目前的revision,否則 409Operation-settings revision is stale;provider 回應不是base_revision + 1→ 503Department Worker operation settings are unavailable。既有的操作金鑰摘要與金鑰所有權一律跟著操作 id,不受請求內容影響。部門只要有任何部署票證不是completed/failed/cancelled(含uncertain)就拒絕:409{"code": "deployment_in_progress", "message": "Operation settings cannot change during a deployment"}。 - 服務帳號欄位(
default_service_account_id、operations[].service_account_id):省略 = 保留,null= 清除。指定的帳號不是本部門存活的服務帳號 → 422{"loc": [...], "msg": "service_account_id is not a live service account of this department", "type": "service_account_not_found"};live release 低於 v2.9 → 409{"code": "service_account_credentials_require_supported_release", "message": "The live release does not support service-account bindings; re-upload and deploy the project first"};HOST不是單純的 HTTPS origin → 503{"code": "api_base_unconfigured", "message": "This deployment's HOST is not a bare HTTPS origin"}。憑證會在設定表變更之前先送進 Worker:409{"code": "service_account_limit_exceeded", "message": "Worker service-account credential limit was reached"}、409Service-account credential delivery is stale、503Department Worker service-account credentials are unavailable、503{"code": "service_account_verifier_unavailable", "message": "Service-account credentials cannot be verified by this deployment"}。 - 輪替。 無 body,也沒有用戶端
base_revision。該操作必須存在於 live manifest(否則 404Department Worker not found),且 live 設定表必須是reconciled,否則 409{"code": "operation_settings_pending", "message": "Write operation settings before assigning an operation API key"}—legacy的 Worker 要先 PUT 一次設定表。部署進行中的 409 與 PUT 相同。明文金鑰(tsw_+ 43 個 url-safe 字元,共 47)只回傳一次;只儲存其 SHA-256 摘要與後四碼,且沒有任何管理回應會回傳操作金鑰的後四碼。輪替會讓 revision 加 1;provider 回應不符 → 503Department Worker operation key is unavailable。操作一旦擁有過金鑰,就不會再退回使用 Worker 層級金鑰。 - 撤銷。 無 body;Worker 為
paused時、部署進行中時也接受。該操作必須存在於 live manifest,或進行中部署的暫存目標 manifest(否則 404)。不是reconciled→ 409Operation settings are pending。會清除該操作在所有已儲存 release 世代中的金鑰;重複撤銷回傳revoked: false,revision 不前進。 - 四條共通:release 在呼叫途中變更時回帶代碼的 503
worker_release_unavailable,變更操作另有 503Department Worker control change is unavailable;PUT/POST/DELETE的 body 超過 65 536 B → 413Worker operation settings request exceeds limit;回應帶Cache-Control: no-store+Pragma: no-cache。
機密(前綴 /worker/secrets)
僅可寫入的具名值,handler 程式碼以 context.secrets.get(name) 讀取。概念:Worker 機密;操作步驟:管理機密。
| Method + path | 用途 | 權限 | 請求 → 回應 |
|---|---|---|---|
GET /worker/secrets | 列出機密名稱 + updated_at,依名稱遞增 — 絕不含值 | 管理者 | — → EdgeWorkerSecretsResponse |
PUT /worker/secrets/{name} | 建立或替換一個機密 | 管理者 | EdgeWorkerSecretPutRequest {value} → EdgeWorkerSecretPutResponse {name, updated_at} |
DELETE /worker/secrets/{name} | 刪除一個機密(冪等) | 管理者 | — → EdgeWorkerSecretDeleteResponse |
- 三條都要求 Worker 已部署且 active(409
Department Worker must be deployed and active)。GET需要 live release 以 builder policy ≥department-worker-project-v2.6建置,PUT需要 ≥ v2.7,否則 409{"code": "worker_secrets_unsupported", "message": "This deployed Worker release does not support Worker secrets; re-upload and deploy the project"}。DELETE在所有 release 上都可用:低於 v2.6 時回 200{"name": "<NAME>", "deleted": false}。 - 名稱:
^[A-Z][A-Z0-9_]{0,63}$。不符 pattern 是標準 422 清單;以TEAMSYNC_開頭的名稱 → 422Worker secret name is invalid or reserved(字串 detail)。 - 值:非空、不含 NUL、≤ 65 536 個 UTF-8 位元組。
PUT的 FastAPI 422 絕不回顯值:每個項目恰為{"loc": [...], "type": "<type>", "msg": "validation_error:<type>"}。 - 容量(寫入前檢查):已有 256 個時再新增名稱 → 409
{"code": "secret_limit_exceeded", "message": "The department Worker secret count limit is exhausted"};所有值合計超過 16 MiB → 413{"code": "secret_size_exceeded", "message": "Department Worker secret storage exceeds its total size limit"}。若 Worker 在競態中拒絕:409{"code": "secret_limit_exceeded", "message": "Worker secret limit was reached"}/413{"code": "secret_size_exceeded", "message": "Worker secret storage limit was reached"}。替換既有名稱不計入 256 的上限。 - 409
Worker secret mutation is stale(控制衝突);503Department Worker secrets are unavailable、Deployed department Worker release is unavailable、Department Worker control change is unavailable、帶代碼的worker_release_unavailable。值送出之後才發生的 503 不代表是否已寫入:重新列出並比對updated_at,或重送PUT。 - 沒有設定鎖,也不檢查部署是否進行中。變更不需重新部署,下一次呼叫即可看到。
PUT的 body 超過 409 600 B → 413Worker secret request exceeds limit。回應帶Cache-Control: no-store+Pragma: no-cache。
版本(前綴 /worker/versions)
| Method + path | 用途 | 權限 | 請求 → 回應 |
|---|---|---|---|
POST /worker/versions | 提交一個標準化 JS/TS 專案壓縮檔;建置 + 建立不可變 ready 修訂版 | 管理者 | multipart,恰好一個 part project → 201 EdgeWorkerSubmissionResponse |
GET /worker/versions?offset=&limit= | 分頁版本摘要(revision DESC),不含 inline SBOM/回執 | 成員 | offset 0–1 000 000(預設 0)、limit 1–200(預設 50)→ EdgeWorkerVersionsResponse |
GET /worker/versions/{version_id} | 單一版本,含型別化 sbom + build_receipt | 成員 | → EdgeWorkerVersionView |
GET /worker/versions/{version_id}/source | 下載單一版本已儲存的專案壓縮檔 | 管理者 | → 200 application/gzip 位元組 |
提交關卡依序:multipart 外層 ≤ 2 162 688 位元組(413 Worker submission request exceeds limit,在驗證之前即檢查);provider 已設定(503 Edge Worker provider is not configured);恰好一個 project part(422 project_multipart_invalid);檔名恰為 department-worker.tar.gz(422 project_archive_filename_invalid);content type 恰為 application/gzip(422 project_archive_content_type_invalid);壓縮檔 ≤ 2 MiB(413 project archive exceeds 2097152 bytes);gzip magic(422 project_archive_invalid);然後是 builder。builder 的任何拒絕都呈現為同一個 422 {"loc": ["body", "project"], "msg": "project failed the locked Worker build policy", "type": "project_invalid"};具體的拒絕代碼只在本機可見(teamsync-worker validate 會印出 authoritative builder rejected project: <code>)。建置出的 manifest 未通過後端的再驗證 → 422 type manifest_v2_invalid。builder 故障 → 503 {"code": "builder_unavailable", "message": "Department Worker builder is unavailable"}(builder 的失敗輸出無法解讀時代碼為 builder_invalid_output);建置證據無效 → 503 {"code": "builder_invalid_output", "message": "Department Worker builder returned invalid evidence"};artifact store 故障 → 503 Edge Worker artifact storage is unavailable。併發首次提交 → 409 a Worker already exists for this department。
原始碼下載
GET /worker/versions/{version_id}/source 回傳部門 Worker 任一版本所儲存的那份 department-worker.tar.gz,任何狀態皆可(含 superseded),回傳前會以版本的 project_digest 核對 SHA-256。能讀取版本的部門成員不能下載。壓縮檔就是提交格式,可原封不動再次提交(Starter 與原始碼)。
- 200 headers:
Content-Type: application/gzip、Content-Disposition: attachment; filename="department-worker.tar.gz"、Cache-Control: private, no-store。 - 404
Department Worker not found— 沒有 Worker、未知 id,或其他租戶的版本(同一種回應)。 - 404
{"code": "edge_worker_version_source_unavailable", "message": "This version has no stored source archive"}。 - 500
{"code": "edge_worker_source_integrity_failed", "message": "The stored source archive failed its integrity check"}— 儲存的資料列損壞,或位元組與project_digest不符。 - 503
{"code": "edge_worker_artifact_unavailable", "message": "Edge Worker artifact storage is unavailable"}— 任何 artifact store 錯誤。
部署(前綴 /worker/deployments)
| Method + path | 用途 | 權限 | 請求 → 回應 |
|---|---|---|---|
POST /worker/deployments | 為 ready 修訂版排入部署,並暫存其操作設定 | 管理者 + 設定鎖 | EdgeWorkerDeployRequest {version_id, base_revision, operation_settings?} → 202 EdgeWorkerDeploymentStatus |
GET /worker/deployments/{ticket_id} | 輪詢票證 | 成員 | → EdgeWorkerDeploymentStatus |
檢查順序:provider 已設定(503 Edge Worker provider is not configured)→ 完全相同的重試(同樣的 version_id、base_revision 與設定)回傳既有票證(202)→ 必須能驗證 Worker 的服務位置(409 worker_serving_target_unavailable)→ 設定鎖 → 其他任何未終結的票證(含 uncertain)→ 409 {"code": "deployment_in_progress", "message": "Operation settings cannot change during a deployment"}(即使沒送設定,措辭仍提到設定)→ 暫存操作設定 → 排入 outbox → 派送。
operation_settings只列出要變更的操作:列出的資料列會覆寫;兩個 release 都有而未列出的操作保留其完整 live 資料列(存取、金鑰、金鑰所有權、服務帳號綁定);目標 manifest 沒有的操作會被移除。不帶這個區塊時,既有的 live 設定表以同樣方式沿用。列出的 id 不在目標 manifest → 422{"loc": ["body", "operations"], "msg": "operation_id is not present in the target release manifest", "type": "operation_not_found"};operation_settings.base_revision≠ live revision → 409Operation-settings revision is stale。- 帶代碼的 409:
operation_settings_require_supported_release(Deploy the Worker once before adding operation settings·The live release does not support operation settings·The target release does not support operation settings— 最後一項即使沒帶設定也會出現:v2.8+ 的 release 上線後,就無法部署低於 v2.8 建置的 release)·{"code": "operation_settings_pending", "message": "Reconcile the live release before deploying settings"}·{"code": "operation_settings_dedupe_mismatch", "message": "Deployment settings differ from the existing ticket"}(完全相同的重試卻帶不同設定)·service_account_credentials_require_supported_release(The target release does not support service-account bindings; re-upload and deploy the project first·The live release does not support service-account bindings; re-upload and deploy the project first·Unbind every service account (PUT operation-settings) before deploying a release without service-account support)·service_account_limit_exceeded·{"code": "worker_serving_target_unavailable", "message": "Worker deployment target cannot be verified"}(後端無法驗證是哪個位置在服務 Worker 的現行 release;沒有排入任何工作)。 - outbox 的 409 字串:
Worker revision changed; refresh before deploying·Worker version cannot deploy from state '<state>'·uncertain deployment requires company reconciliation·Worker version was superseded; V2 rollback is not supported·Worker deployment sequence is exhausted·deployment intent already exists·worker_migration_in_progress(平台維運者正在搬移該 Worker)·Worker deployment target cannot be verified·Worker deployment target is unavailable(也包括所設定的預設位置無法使用的第一次部署)· 僅在競態時:a deployment is already active for this department Worker、operation-settings digest differs from the existing deployment。 - 422
service_account_not_found(同 PUT 操作設定)。503:{"code": "operation_settings_live_read_unavailable", "message": "Retry the deployment after the live settings read recovers"}·api_base_unconfigured·service_account_verifier_unavailable·Department Worker service-account credentials are unavailable·Department Worker serving target is unavailable·Deployment dispatch is unavailable(確定的派送拒絕)。 - 僅限地端:主機的維護或還原閘門關閉時 409
edge_workers_maintenance/edge_workers_restore_pending;主機執行被圍欄時請求仍會被接受(202),但票證維持pending並帶error_code: "edge_host_fenced",直到圍欄解除(地端)。 POST /worker/deployments沒有路由層級的 body 上限。輪詢語意與狀態字彙:版本與部署。
OpenAPI
| Method + path | 用途 | 權限 | 回應 |
|---|---|---|---|
GET /worker/openapi.json | 已部署修訂版的生成 OpenAPI 3.1.1 | 成員 | EdgeWorkerOpenApiDocument,ETag + Cache-Control: private, no-cache;If-None-Match → 304 |
draft/inactive 時 409 Department Worker must be deployed and active;沒有已部署版本時 404(未寫入文件但可觸及);完整性失敗 503 Deployed department Worker contract is unavailable;EDGE_WORKERS_GATEWAY_PUBLIC_URL 與 HOST 皆未設定時 Department Worker gateway URL is not configured(任何存取模式下都可能發生)。live release 以 builder policy ≥ v2.8 建置時,這條路由也會讀取操作設定表:讀取失敗時 503 Department Worker operation settings are unavailable 或帶代碼的 worker_release_unavailable。
存取政策與操作設定在每次請求都重新讀取,所以政策、操作設定或服務帳號綁定的變更不需重新部署,即可更新 servers[0].url、安全機制、逐操作的擴充欄位與 ETag。每份文件都帶根層擴充欄位 x-teamsync-operation-settings-state(低於 v2.8 的 release 為 legacy、revision 0)。狀態為 reconciled 時,每個操作都帶 x-teamsync-service-account(物件或 null),因此帳號 id 與使用者名稱對每位部門成員都可見;有自己的設定資料列、或曾經擁有金鑰的操作還會帶 x-teamsync-access-policy(含 source);其模式與 Worker 不同或 source 為 operation 時,另帶自己的 security(基礎 URL 與根層不同時再帶 servers)。components.securitySchemes 可同時包含 TeamSyncBearer 與 TeamSyncWorkerApiKey。欄位形狀:Schemas。
Starter(前綴 /starters)
| Method + path | 用途 | 權限 | 回應 |
|---|---|---|---|
GET /starters | Starter 目錄,含大小與 SHA-256 摘要 | 成員 | EdgeWorkerStarterCatalog |
GET /starters/cli.tgz | 後端鎖定版本的 teamsync-worker CLI,npm tarball 格式 | 成員 | 200 application/gzip,filename="cli.tgz" |
GET /starters/{starter_id}/{language}/source.zip | 可編輯的 starter 原始碼 | 成員 | 200 application/zip,filename="<starter_id>-<language>.zip" |
GET /starters/{starter_id}/{language}/department-worker.tar.gz | 可直接上傳的專案壓縮檔 | 成員 | 200 application/gzip,filename="department-worker.tar.gz" |
不需要已有 Worker。starter_id 為 department-users-api,language 為 javascript 或 typescript;其他值,或目錄裡沒有的組合 → 404 Edge Worker starter not found(不是 422)。目錄缺少或無效 → 503 Edge Worker starter catalog is unavailable;檔案大小或 SHA-256 與目錄不符 → 503 Edge Worker starter artifact is unavailable。下載只送 Content-Disposition 與 Content-Length(沒有快取 header);請以目錄的 size_bytes 與 sha256 核對。操作步驟:Starter 與原始碼。
服務帳號(前綴 /service-accounts)
部門擁有的身分,Worker 的 context.teamsync.authHeaders() 以它登入。概念:服務帳號;操作步驟:服務帳號流程。下表的 {id} 即 {service_account_id},是一個 ResourceId。
| Method + path | 用途 | 請求 → 回應 |
|---|---|---|
POST /service-accounts | 建立帳號(名稱自動產生:UTC 的 EdgeWorkerSA-YYYYMMDDTHHMMSSZ,撞名時加後綴 -2…-99) | 無 body → 201 ServiceAccountView |
GET /service-accounts?limit=&cursor= | 列出部門的帳號(created_at、id 遞增) | limit 1–100(預設 100)、cursor ^(?:[0-9]{1,7})?$ → ServiceAccountListResponse |
GET /service-accounts/{id} | 詳細資料:聊天室、綁定的操作、憑證是否存在 | → ServiceAccountDetail |
POST /service-accounts/{id}/credential/reset | 替換平台產生的憑證 | 無 body → ServiceAccountResetResponse |
DELETE /service-accounts/{id} | 刪除帳號;其綁定改為 fail closed(一律拒絕) | → ServiceAccountDeleteResponse |
PUT /service-accounts/{id}/chatrooms | 新增或移除聊天室成員資格 | ServiceAccountChatroomsRequest → ServiceAccountChatroomsResult |
GET /service-accounts/{id}/chatroom-candidates?limit=&cursor=&q= | 帳號可加入的聊天室,含 is_member | limit/cursor 同列表、q ≤ 128 字元 → ServiceAccountChatroomCandidates |
- 部門範圍:自己部門的管理者(七條路由全部,兩條
GET也是)。公司鏡像:同樣七條路由位於/company/departments/{department_id}/service-accounts…之下,供公司管理者使用;部門不存在、已刪除或屬於其他公司 → 404Department not found。 - 未知、已刪除、其他租戶或真人使用者的 id → 404
Service account not found(同一種回應);執行操作的管理者資料列已不存在 → 403A live manager identity is required。 - 建立:409
Service account name is unavailable(該 UTC 秒的 99 個名稱都已被占用)。列表與候選:cursor大於 1 000 000 → 422Invalid cursor。聊天室:add/remove各 ≤ 100 個 id 且不得重疊(否則 422,其msg含add and remove must be disjoint)。 - 詳細資料在 Worker 執行可持有憑證的 release 時會讀取 Worker:503
Department Worker service-account credentials are unavailable、Department Worker operation settings are unavailable、Deployed department Worker contract is unavailable。 - 重設:Worker 可持有憑證時會取得部門的設定鎖(被持有時 409 帶代碼的
deployment_in_progress,503Operation-settings mutation lock is unavailable);所有遞送問題都在 200 內以delivery: "failed"回報。刪除即使 Worker 清理失敗或延後,仍回 200。 - 詳細資料、重設、刪除、聊天室與候選路由送出
Cache-Control: no-store(沒有Pragma)。這些路由使用一般 router:沒有路由層級的 413。
Invoke(隱藏路由)
| Path | Methods | 權限 |
|---|---|---|
/worker/invoke | GET POST PUT PATCH DELETE | 成員 |
/worker/invoke/{path} | GET POST PUT PATCH DELETE | 成員 |
沒有 HEAD/OPTIONS。Worker 自己的回應會串流回來。存取政策與操作設定不適用於這條簽章通道。部門已刪除時,後端會先拒絕(403 A live department identity is required for Edge Workers);runtime 的 403 worker_retired 是 Worker 公開 URL 在退役後的回應。完整管線、圍欄與錯誤對映:呼叫流程與調度協定。
公司操作(前綴 /company/departments)
| Method + path | 用途 | 權限 | 回應 |
|---|---|---|---|
GET /company/departments?offset=&limit= | 存活部門清單總覽(name ASC、id ASC),含未設定的部門 | 公司管理者 | EdgeWorkerCompanyDepartmentsResponse |
GET /company/departments/{department_id} | 單一部門快照 | 公司管理者 | EdgeWorkerCompanyDepartmentDetail |
POST /company/departments/{department_id}/repairs | 調解 uncertain 部署 | 公司管理者 | 202 EdgeWorkerCompanyRepairResponse |
細節、健康推導與修復語意:公司管理員流程。修復的 409 字串:Repair parameters do not match the original request · Worker revision is stale; refresh department state · Deployment revision is stale; refresh department state · Only an uncertain deployment can be reconciled · Only an uncertain deployment version can be reconciled;僅限地端另有 edge_workers_maintenance/edge_workers_restore_pending。provider 未設定 → 503 Edge Worker provider is not configured。修復 body 超過 8 KiB → 413 Worker repair request exceeds limit。這個前綴下的服務帳號鏡像列在上方的服務帳號一節。
橫切行為
- 413 在驗證之前觸發,適用於模組的有界路由(存取政策、執行期設定、操作設定、機密
PUT、提交、修復)— 有界 route class 在 dependency 解析前檢查Content-Length並計數實際位元組。服務帳號與 starter 路由沒有路由層級的 413。 - 除了四條 starter 路由,每條路由都記載
422(EdgeWorkerValidationErrorResponse)與default消毒錯誤;沒有明確 model 的 ≥400 狀態預設為EdgeWorkerHttpErrorResponse({"detail": string})。許多路由的實際detail是string | {code, message}(存取政策、執行期設定、操作設定、機密、版本、部署、OpenAPI、服務帳號);生成的後端 OpenAPI 只在機密路由、提交的 503 與原始碼下載宣告這個聯集,所以請在每條路由都檢查detail的型別(錯誤)。 - 租戶錨定:每個讀寫都以 principal 的
company_id與department_id過濾;異租戶與不存在的資源回同一個 404。 - 公司管理者路由不執行服務帳號拒絕;服務帳號(角色 0)會在角色門檻被拒,回 403
Insufficient permissions.。