跳到正文

適用版本:Cowork 0.1.45 · 適用於所有 Cowork 使用者

檢視 Markdown

背景任務 ​

尚未發布

背景任務是在 Extension 開啟期間持續執行的函式,例如每 15 分鐘同步一次。它需要 dozin.capabilities 裡有 service。用 api.registerService(definition) 註冊它。

ServiceDefinition ​

欄位類型必填說明
idstring否預設為套件名稱。小寫字母、數字和連字元。每個 Extension 最多 8 個
namestring否顯示在 設定 › 擴充功能 裡,1–80 個字元;預設為 id
start'auto' | 'manual'否預設 manual。auto 會在 Extension 的 secrets 填好後隨它一起啟動。以使用者的選擇為準
restart{ policy?, maxRetries?, backoffSeconds? }否policy:never、on-failure(預設)或 always;maxRetries 0–100(預設 5);backoffSeconds 1–10 個等待時間,每個 1–3600 秒(預設 5、30、120)
stopTimeoutSecondsnumber否1–30,預設 10:停止 等待 run 回傳的時間
run(ctx)function是見下文

任何一個欄位無效,整個任務都會被拒絕(registerService 拋出 TypeError);不會替你修正任何內容。

run(ctx) 尚未發布 ​

任務本身。一直執行到 ctx.signal 觸發為止。

名稱類型說明
ctxServiceContext下面的欄位和函式

回傳 Promise<void>。回傳即結束這次執行。拋出錯誤算作失敗,並依 restart 重試。按下 停止 後,若 run 在 stopTimeoutSeconds 內沒有回傳,Extension 的程序會被重新啟動。

ServiceContext 欄位 ​

欄位類型說明
serviceIdstring任務的鍵:套件名稱,或 <package>.<id>
runIdstring這次執行
signalAbortSignal在 停止、重新啟動、關閉 Extension、解除安裝以及結束 Cowork 時觸發。每次請求前先檢查它
envReadonly<Record<string, string>>dozin.secrets 的值。缺少值的任務不會啟動,並顯示「缺少設定」
dataDirstringExtension 自己的資料資料夾,也是它的工作資料夾

ctx.status(text, level?, progress?) 尚未發布 ​

設定在 設定 › 擴充功能 裡任務下方顯示的那一行。

名稱類型必填說明
textstring是這一行內容;最多保留 300 個字元
level'info' | 'warn' | 'error'否預設 info
progress{ done: number, total: number }否以進度顯示

不回傳任何值。dozin.secrets 的值會被替換為 ***。不要放入個人資料:坐在這台電腦前的任何人都看得到這一行。

js
ctx.status('Synced 52 patients', 'info', { done: 52, total: 52 });

ctx.log(text) 尚未發布 ​

在 Extension 的日誌寫一行。dozin.secrets 的值會被替換為 ***。不回傳任何值。

js
ctx.log('round started');

ctx.readJson(rel) 尚未發布 ​

讀取 dataDir 內的一個 JSON 檔案。

名稱類型必填說明
relstring是相對於 dataDir 的路徑

回傳 Promise<unknown>:解析後的值,檔案不存在時為 undefined。路徑為空或在 dataDir 之外時以 PATH_OUTSIDE_DATA 拒絕;檔案不是有效的 JSON 時以解析錯誤拒絕。

ctx.writeJson(rel, value) 尚未發布 ​

寫入 dataDir 內的一個 JSON 檔案,一步完成替換,所以當機時絕不會留下寫了一半的檔案。

名稱類型必填說明
relstring是相對於 dataDir 的路徑
valueunknown是JSON.stringify 能接受的任何值

回傳 Promise<void>。路徑為空或在 dataDir 之外時以 PATH_OUTSIDE_DATA 拒絕。

一次執行結束後,它發出的 ctx.site 和 ctx.agent 呼叫會以 RUN_ENDED 拒絕。

示例 ​

js
export function activate(api) {
  api.registerService({
    id: 'sync', name: 'Sync', start: 'auto',
    async run(ctx) {
      while (!ctx.signal.aborted) {
        const state = (await ctx.readJson('state.json')) ?? { runs: 0 };
        state.runs += 1;
        await ctx.writeJson('state.json', state);
        ctx.status(`Run ${state.runs} done`);
        await new Promise((resolve) => setTimeout(resolve, 15 * 60 * 1000));
      }
    }
  });
}

相關 ​

適用於 Micromeet Cowork 0.1.41 · build 261111110020