Japanese source
The original specification and guide are authored in Japanese. The Japanese route contains the same source text; this English route is a reading aid, not a separate translation or an implementation-availability claim.
Version-fixed Form specification
This version-fixed URL serves the Japanese normative source. Read the exact source. Publication does not imply Host or provider support.
ModuleWorker 0.3.0
このFormは、一つのJavaScript module Workerの同一性を表す。コード、変数、Bindingは WorkerVersion 0.5.0に置き、稼働中の版とHTTPトラフィックの配分は WorkerDeployment 0.4.0が決める。Workerを作っただけでは 実行コードも公開URLも生じない。HTTP endpoint、cron、queue consumerは別のFormによる添付である。 このResourceのCRUD、認可と管理Operationの再試行は Takoform Host API v2に従う。 実行時のfetch、queue、Actor、Workflowは別の通信・処理であり、管理用の Idempotency-KeyやOperation IDを引数に取らない。各実行操作の再試行は本Formと 参照先FormのInterface章が定める。 この版のForm URLは上記の完全な文字列で識別する。本文は仕様であって、いずれかのHostの 対応・稼働・公開を主張しない。
入力、状態、操作
specは必須の空オブジェクト {} だけである。既定値も秘密入力もない。未知のキー、 null、配列は拒否する。GETのspecも {} である。observedは未確認なら {}、確認済みなら activeDeploymentUid(有効なDeploymentがなければnull)とready(真偽値)を返す。 ready:trueは、選ばれたDeploymentとその版がこのFormの配信・実行条件を満たし、Hostが新しい イベントを受け付けられる状態を意味する。これは特定のHTTP要求の成功や外部到達性を保証しない。 observedAtとobservedGenerationは共通APIの時点を示す。outputは {} である。
- 作成は空のWorker同一性を確保する。作成成功はコードの評価やURLの割当を意味しない。
- 取得は管理記録と最後の観測を返す。GETごとの実行先再照会は要求しない。
- 更新は同じ空specの全体置換のみ受け付ける。新しいIdempotency-Keyによる同一specのPUTも 新しいOperationとgenerationを持つ。実行コードは更新せず、別のWorkerVersionとDeploymentで変える。
- 削除はそのWorkerへの生きたVersion、Deployment、ActorNamespace、DurableWorkflow、 service Binding、endpoint等の参照がある間、変更前に
409 dependency_conflictで拒否する。 参照がなくても未完了実行を停止・隔離できない間は完了にしない。成功はこのWorkerの同一性だけを 解放する。Binding先、外部サービス、他のWorker、独立した永続データを連鎖削除しない。
実行Interface: module Worker
HostがこのFormを対応表に載せるには、以下のABIとWorkerVersionのasset配信を 一体として実装する。コードを持つWorkerVersionではbundleが指す WorkerBundle 0.2.0のmain ES moduleを読み、 そのdefault exportはplain object、fetch、scheduled、queueは宣言されたものだけが callableなown propertyでなければならない。Versionが宣言していないhandlerや未exportの handlerを推測して呼ばない。bundleのない静的専用Versionではmoduleを読み込まず、 handlerやnamed class exportを実行しない。import可能なmedia typeは application/javascript+module、text/plain(UTF-8文字列)、 application/octet-stream(ArrayBuffer)、application/wasm(コンパイル済みModule)である。 source mapは補助物でありimport対象にしない。JSON moduleはこのABIにない。
Moduleの解決
WorkerBundleのmanifestはbundle rootからの正規化されたPOSIX相対pathを列挙し、 entrypointはそのうちJavaScript ES module一つを正確に指す。Hostはimport先を manifest内の完全なpath一致だけで探す。./と../で始まるspecifierはimport元の directoryからPOSIX segmentとして解決し、先頭/はbundle rootから解決する。 ..でroot外へ出るもの、空segment、backslash、query ?、fragment #、bare specifier(node:を含む)、HTTP(S)/data URL、import mapは認めない。percent escapeを URLとしてdecodeせず、文字列をそのままpathと比較する。.jsの補完やdirectoryの index推測、大文字小文字の正規化、外部取得はしない。相対specifierを正規化した結果が manifestの一つのimportable entryに一致しない場合はmodule_not_found、auxiliary source mapを指せばunsupported_media_typeである。
static import/export-fromとimport(specifier)は同じ解決規則を使う。staticな不一致・ syntax errorはVersionをReadyにする前に拒否する。dynamic importの値は実行時に検証し、 不一致ならそのPromiseを該当エラーでrejectする。循環するES module graphはECMAScriptの live binding/評価順に従い、循環だけを理由に拒否しない。Hostはbundle外のmoduleを 暗黙に補わない。text/plainは正しいUTF-8からdecodeした文字列、 application/octet-streamはそのbytesを持つArrayBuffer、application/wasmは compile済みWebAssembly.Moduleを、それぞれdefault exportのみのmoduleとして投影する。 WebAssemblyのinstantiateやimport objectはアプリが選び、Hostは自動実行しない。 不正UTF-8、invalid wasm、JavaScriptの構文・評価失敗はReady検証または実行失敗として 明示し、別media typeへfallbackしない。
呼出し形はfetch(request: Request, env, ctx): Response | Promise<Response>、 scheduled(event, env, ctx): void | Promise<void>、 queue(batch, env, ctx): void | Promise<void>である。eventはUTCのscheduledTime (Unixミリ秒)と一致した5-field cronを持つ。batchはbatchId(1〜256文字)、 queue名(対象Queue Resourceのnameそのまま。共通Host APIのResource名文法 [A-Za-z0-9][A-Za-z0-9._-]{0,127}に従う1〜128文字)、1〜100件の順序付きmessage列を持つ。各messageには安定した id(1〜256文字)、受理時の非負整数timestampMillis、body bytes、1から始まる整数 attemptsを含む。JavaScriptのbodyはUint8Arrayであり、JSONや文字列へ暗黙変換しない。 queueの明示的なack/retryと未settle時の扱いは AtLeastOnceQueue 0.2.0と QueueConsumer 0.3.0の章に従う。fetchのrequest/response bodyは streamとして扱い、Hostはhandler前に全文を文字列化しない。不正な戻り値または未捕捉例外は 機密を含まないHost生成のHTTP 500となる。scheduled/queueの未捕捉例外は失敗として観測し、 HTTP応答へ変換しない。ctx.waitUntil(promise)は同じinvocationの後続作業を登録し、 settlementまではisolateを回収しない。settlement済み応答は書き換えず、拒否は診断へ記録する。 失効したctxへの登録はcontext_expiredで失敗する。
queue handlerが受け取るbatchは次のJavaScript形を持つ。bodyは元のmessage bytesを copyしたUint8Arrayであり、metadataは上記の値域に従う。settlementはこのbatchだけで行い、 envのqueue producer Bindingにはこれらのmethodを出さない。
interface QueueBatch {
readonly batchId: string;
readonly queue: string;
readonly messages: readonly {
readonly id: string;
readonly timestampMillis: number;
readonly body: Uint8Array;
readonly attempts: number;
}[];
acknowledge(messageId: string): Promise<void>;
retry(messageId: string, delaySeconds?: number): Promise<void>;
acknowledgeAll(): Promise<void>;
retryAll(delaySeconds?: number): Promise<void>;
}messageIdはこのbatch内のID、delaySecondsは省略または0〜43200の整数で、省略時は ConsumerのretryDelaySecondsを使う。成功はdurableなsettlement確定を意味する。 失敗はError.nameがunknown_batch、unknown_message、already_settled、 backend_unavailableのいずれかである。acknowledgeAll/retryAllはbatch内の未settled分だけを 対象とし、既settledの結果を反転しない。通常returnでは残る未settled分をacknowledgeし、 throw/rejectでは残る未settled分をretryする。重複配送があるためhandlerの外部効果は idempotentに設計する。これは管理ResourceのOperation/Idempotency-Keyとは別である。
実行環境envのown enumerable keyは、Versionに宣言した非秘密vars、Hostが別経路で設定した requiredSensitiveVars、型付きBinding名の和に正確に一致する。重複名はVersion保存前に拒否する。 Host固有の追加globalやBindingはportableな契約にならない。最低限のglobalはRequest、 Response、Headers、URL、URLSearchParams、ReadableStream、TextEncoder、 TextDecoder、AbortController、AbortSignal、crypto、fetch、consoleと標準timerである。 外向きfetchはHostが持つ外部通信権限と制限に従い、BindingやForm URLから権限を得ない。
ActorNamespaceとDurableWorkflowのnamed classはdefault handlerとは別exportである。 そのconstructor、turn、永続状態、step/replayは各Formの Actor章とWorkflow章で定める。 同じWorkerの全weighted Versionは、参照中の全classを提供しなければReadyにならない。 単にWorkerを作成しただけでActor/Workflowの能力があると表示してはならない。
Workerへのservice Binding
WorkerVersion 0.5.0のserviceBindings[].resourceが このWorker UIDを参照すると、呼出し元のenv.NAMEは次を提供する。
interface WorkerService {
fetch(request: Request): Promise<Response>;
fetch(url: string, init?: RequestInit): Promise<Response>;
}このfetchはHost内の論理的なWorker UIDに届き、相手の現在有効なDeploymentが 選ぶVersionのHTTP経路(asset探索または宣言済みfetch handler)を、公開endpointと 同じWorkerVersionの配信規則で実行する。public endpoint、DNS名、公開HTTP routeは不要で、 URLのhost名は配送先の選択に使わない。RequestとResponseのbodyは双方streamし、配送前に 全文bufferしない。相手handlerの未捕捉例外は相手のHost生成500 ResponseとしてPromiseが resolveする。配送を開始できない場合だけError.name === "backend_unavailable"でrejectする。 相手が応答までに完了した副作用はその応答に先行する。service Bindingは相手のenv、 Host credential、認可された利用者identity、他のBindingを呼出し元へ渡さない。 Resource参照があること自体はHost管理操作の認可を与えない。WebSocket upgrade予約は Hostが元client requestに結び付けるため、このservice callで転送・作成できない。
参照と拡張
このFormの入力に参照やBindingはない。WorkerVersionなどはこのResourceのUIDを参照する。 UIDが違う同名Workerは別の同一性であり、参照を名前で再解決しない。将来の入力・runtime ABI・ observedの意味の変更には新しいForm URLを用い、このURLの空specに未知の入力を足さない。