労働者 (歴史的)
このページは、2023年以前にCloudflare Workersに加えられた変更を追跡します。最近の更新については、現在の変更ログを参照してください。
- 条件付き
PUTリクエストがR2バインディングAPIで修正されました。
- キューは、未定義のJavaScript値をメッセージとして
send()で呼び出すことをサポートしなくなりました。
- DOMExceptionコンストラクタが標準仕様により適合するように更新されました。具体的には、メッセージと名前の引数は、今や文字列に強制変換可能な任意のJavaScript値を受け入れます(以前は、非文字列値を渡すとエラーが発生していました)。
- R2バインディングAPIが拡張され、マルチパートアップロードのサポートが追加されました。
- V8の更新: 10.6 → 10.8
- R2Checksumsの
toJSON()が実装され、JSON.stringify()で使用できるようになりました。
- アラームの再試行制限は、私たちのミスによるエラーには適用されなくなります。
- 新しいストリーム実装を含む複数のフラグの互換性日が追加されました。
DurableObjectStorageに新しいメソッドsync()が追加され、Workerがその書き込み(allowUnconfirmedで実行されたものを含む)がストレージと同期されるのを待つ方法を提供します。
- ESモジュール構文のスクリプトがトップレベルモジュールから配列型の値をエクスポートした場合、アップロードAPIが
500エラー ↗で拒否するバグが修正されました。 console.logは、Promisesなどの特定のオブジェクトに関するより多くの情報を表示するようになりました。- Workers Runtimeは、次のオープンソースコードから構築されました: GitHub - cloudflare/workerd: The JavaScript / Wasm runtime that powers Cloudflare Workers ↗。
- R2
putバインディングオプションに、条件付きアップロードを行うonlyIfフィールドが追加されました。 - R2バインディングで複数のキーを一度に削除できるようになりました。
- R2
putオプションにSHA-1、SHA-256、SHA-384、SHA-512チェックサムのサポートが追加されました。 - ユーザー指定のオブジェクトチェックサムは、R2
get/headバインディングの応答で利用可能になります。非マルチパートでアップロードされたオブジェクトには、デフォルトでMD5が含まれます。 - V8が10.6に更新されました。
rangeヘッダーを持つHeadersオブジェクトが、getR2バインディングのR2GetOptions内で範囲を指定するために使用できるようになりました。R2GetOptionsのonlyIfにヘッダーが使用される場合、正しく秒単位で比較されるようになりました。これにより、ブラウザとの正しい往復が可能になります。さらに、secondsGranularityは、同じ効果を得るために手動で構築されたオプションに渡すことができるオプションになりました。- @cloudflare/workers-types ↗の
DurableObjectState.idのTypeScript型が常にDurableObjectIdになるように修正されました。 - モジュールスクリプトのWorkerアップロード中の検証エラーには、正しい行番号と列番号が含まれるようになりました。
- バグ修正、Chromeのデバッグツールを介したプロファイリングツールとフレームグラフが正しく情報を報告するようになりました。
- Workers使用レポートとWorkers週間サマリーは、サービスのスケーリング問題により無効化されました。
- グローバルネットワークプレビューモードでの
wrangler devがアラームのスケジューリングをサポートするようになりました。 rangeオプションを使用して行われたR2 GETリクエストは、GetObjectのrangeパラメータに返された範囲を含むようになりました。- 一部のWeb Cryptography APIエラーメッセージには、より多くの情報が含まれるようになりました。
- V8が10.2から10.3に更新されました。
- 古い
addEventListener構文を使用しているWorkerスクリプトのCronトリガーイベントは、scheduledイベントのために登録されたイベントリスナーがない場合、失敗として扱われるようになりました。 durable_object_alarmsフラグは、DOアラームを使用するために明示的に提供する必要がなくなりました。
- 外部から見える変更はありません。
- 標準の
TransformStreamインスタンスを作成できるようになり、データに対して変換を行うことができます。これは、引数なしのデフォルトのnew TransformStream()の動作を変更するため、transformstream_enable_standard_constructor互換性フラグが必要です。 - クイックエディットのプレビューが正しいR2バインディングを正しく使用するようになりました。
- V8が10.1から10.2に更新されました。
- 静的
Response.json()メソッドを使用して、JSONシリアライズされたペイロードでResponseオブジェクトを初期化できます(whatwg/fetch #1392 ↗を参照)。 - R2でスローされる例外には、メッセージに
errorコードが括弧内に追加されるようになりました。これは、スローされたErrorオブジェクトにコードプロパティを明示的に追加できるようになるまでの一時的な措置です。
- R2バインディング:
contentEncoding、contentLanguage、およびcacheControlが正しくレンダリングされるようになりました。 - ReadableStreamの
pipeToおよびpipeThroughが、AbortSignalを使用してキャンセルをサポートするようになりました。 alarm()ハンドラーが実装されていないDOでsetAlarm()を呼び出すと、静かに失敗するのではなくエラーがスローされるようになりました。現在alarm()ハンドラーが実装されていない場合にgetAlarm()を呼び出すと、以前に古いバージョンのDOクラスでアラームが設定されていてもnullが返されます。- R2: 追加の範囲に対するランタイムサポートが向上しました。
- R2バインディングは、
offsetとオプションのlength、lengthとオプションのoffset、またはsuffix(ファイルの最後のNバイトを返す)を持つ範囲をサポートするようになりました。
- R2バインディングがcontent-languageの下でcache-controlを保存する問題を修正しました。
- R2バインディングがオプションなしでリストを作成する際に、結果を返さないのではなくデフォルトのリスト制限を使用するように修正しました。
- R2バインディングがR2からのエラーメッセージを正しく処理しなかったため、
internal errorがスローされる問題を修正しました。また、存在しないキーに対してgetが例外をスローするのではなくnullを返す動作を修正しました。R2Errorは当面の間削除され、将来的に再導入される予定です。 - R2バインディング: onlyIf条件が前提条件の失敗または変更されていない結果をもたらす場合、オブジェクトはボディなしで返され、nullは返されません。
- R2バインディング: sha1は実際には何にも接続されていなかったため、オプションから削除されました。md5を超える追加のチェックサムオプションについては未定です。
- Durable ObjectストレージAPIの
list()メソッドにstartAfterオプションが追加されました。
Response.redirect(url)は、URLのパスに現れる複数の連続スラッシュ文字を統合しなくなります。- Dateの生成された型を修正しました。
- R2バインディングがオプションなしでリストを作成する際に、結果を返さないのではなくデフォルトのリスト制限を使用するように修正しました。
- R2バインディングがR2からのエラーメッセージを正しく処理しなかったため、内部エラーがスローされる問題を修正しました。また、存在しないキーに対してgetが例外をスローするのではなくnullを返す動作を修正しました。
R2Errorは当面の間削除され、将来的に再導入される予定です。
- マイナーV8の更新: 10.0 → 10.1。
- R2パブリックベータバインディングは、互換性の日付やフラグに関係なくデフォルトです。内部ベータバインディングの顧客は、できるだけ早くパブリックベータバインディングに移行する必要があります。これがすぐに不可能な場合は、後方互換性フラグが利用可能です。しばらくの遅延の後、
r2_public_beta_bindings互換性フラグを持つ新しいスクリプトは、そのフラグが削除されるまで公開を受け付けなくなります。
- 大規模V8の更新: 9.9 → 10.0。
- パフォーマンスと安定性の改善。
- Web Cryptography APIの一部であるAES-GCM実装が、0長IVが許可されていないことを説明するより親しみやすいエラーを返すようになりました。
- R2エラー応答には、より良い詳細が含まれるようになりました。
- 新しい互換性フラグ
minimal_subrequestsが導入され、同ゾーンのfetch()呼び出しに意図せず適用されていたいくつかの機能が削除されます。このフラグは2022年4月5日火曜日にデフォルトで有効になり、Workersminimal_subrequests互換性フラグで説明されています。 - JavaScriptバックのReadableStreamsを使用して
Responseを作成する際に、Bodyミックスイン関数(例:await response.text())が実装されました。 IdentityTransformStreamは、バイト指向のTransformStream実装を作成し、バイトを変更せずにそのまま通過させます。TransformStreamの読み取り半分はBYOB読み取りをサポートします。IdentityTransformStreamは、現在の非仕様準拠のTransformStream実装と同一であることに注意することが重要です。これは、WHATWGストリーム標準に準拠するようにすぐに更新される予定です。new TransformStream()の現在のすべての使用は、将来的に潜在的な破壊的変更を避けるためにnew IdentityTransformStream()に置き換える必要があります。
- 標準のByteLengthQueuingStrategy ↗およびCountQueuingStrategy ↗クラスが利用可能になりました。
capture_async_api_throwsフラグが設定されている場合、Promiseを返すCloudflare固有の組み込みAPIおよびWebプラットフォーム標準APIは、もはや同期的にエラーをスローせず、代わりに拒否されたPromiseを返します。メモリ不足などの致命的なエラーには例外が与えられます。- R2公開日レンダリングの修正。
- R2バケットバインディングの.getが内容範囲を無効な値で埋める問題を修正しました。contentRangeは意図した通り未定義になります。
- JavaScriptバックの
ReadableStreamを使用する際に、それらのストリームをnew Response()で使用できるようになりました。
- Durable Objectの単一キー
put()に対して請求される書き込みユニット数を決定する際に、キーサイズがカウントされないバグが修正されました。これにより、キーが次の請求単位のしきい値である4096バイトを超える場合、将来の書き込みが過去の書き込みよりも1つの書き込みユニット多くなる可能性があります。マルチキーput()操作は、請求可能な書き込みユニットを決定する際に常にキーサイズを正しくカウントしていました。 CompressionStreamおよびDecompressionStreamの実装が利用可能になりました。
- 新しい
ReadableStream()コンストラクタを使用して構築されたReadableStreamsでの初期のpipeTo/pipeThroughサポートが利用可能になりました。 global_navigator互換性フラグが設定されている場合、navigator.userAgentプロパティを使用してコードがWorkers環境内で実行されているかどうかを検出できます。URLSearchParamの値を設定する際に新しいURL実装のバグが修正されました。- グローバル
addEventListenerおよびdispatchEvent APIがモジュール構文を使用する際に利用可能になりました。 URLPatternの実装が利用可能になりました。
TextDecoderクラスは、WHATWGエンコーディング標準で定義されたすべてのテキストエンコーディングをサポートするようになりました。- グローバル
fetch()およびDurable Objectfetch()は、“Upgrade: websocket”ヘッダーなしでリクエストに対してWebSocketを受け取った場合、TypeErrorをスローするようになりました。 - Durable Objectsユーザーは、デフォルトでアカウント内のオブジェクトに最大50GBのデータを保存できるようになりました。以前と同様に、それ以上のストレージが必要な場合は、増加のためにお問い合わせください。
TextDecoderはWindows-1252ラベル(別名ASCII)をサポートするようになりました: Encoding API Encodings - Web APIs | MDN ↗。
- WebSocketメッセージの送信が、I/Oゲートブログ投稿 ↗で説明されているように、Durable Object出力ゲートを誤って尊重しない問題が修正されました。このバグは修正され、WebSocketは、ストレージ書き込みが成功したという仮定の下でメッセージを送信することはなくなります。
- WebSocketsがDurable Objectsに接続されているときに、WorkerとDurable Objectの両方を実装するスクリプトが新しいコードで再デプロイされると、時折ハングする原因となるバグが修正されました。
crypto.getRandomValuesはBigInt64ArrayおよびBigUint64Arrayをサポートするようになりました。- 標準URL実装の新しい実装が利用可能になりました。仕様に準拠したURL API実装を有効にするには、
url_standard機能フラグを使用してください。
- ユーザーから見える変更はありません。
- V8が更新されました: 9.7 → 9.8。
HTMLRewriterは、開始タグだけでなく終了タグの検査と変更をサポートするようになりました。- 一時的なCPUオーバーロード状態を経験しているDurable Objectsが、進行中のリクエストが応答を返せなくなる(クライアント側から無限にハングしているように見える)バグが修正されました。
workers_api_getters_setters_on_prototype構成フラグは、WorkersがAPIオブジェクトにプロパティのゲッターとセッターを正しく添付できるように修正します。
ReadableStreamのインスタンスでの非同期反復(forおよびawaitを使用)が利用可能になりました。
- Durable Objectストレージの最大値サイズを32 KiBから128 KiBに引き上げました。
AbortSignal.timeout(delay)は、指定されたミリ秒数後にトリガーされるAbortSignalを返します。- 新しい
ReadableStreamおよび新しいWritableStreamコンストラクタのプレビュー実装が、streams_enable_constructorsフィーチャーフラグの背後で利用可能です。 crypto.DigestStreamは、ストリーミングデータからハッシュダイジェストを生成することをサポートする非標準のcrypto API拡張です。DigestStream自体は、書き込まれたデータを保持しないWritableStreamであり、データの流れが終了したときに自動的にダイジェストハッシュを生成します。crypto.subtle.digest()でサポートされているのと同じハッシュアルゴリズムがcrypto.DigestStreamでもサポートされています。scheduler.wait()APIの初期サポートを追加しました。これは、setTimeout()の代替としてawait可能な方法を提供します。WICG標準化プロセスを通過中です ↗。- 10000を超えるキーを含むDurable Objectsの
deleteAllのバグを修正しました。これにより、データの削除が不完全になったり、ハングすることがありました。
- Streams仕様では、Promiseを返すメソッドは同期エラーをスローしてはならないと要求しています。Streams実装を仕様により準拠させる努力の一環として、いくつかの同期スローを非同期拒否に変換しています。
- 大規模なV8アップデート: 9.6 → 9.7。詳細については、V8 release v9.7 · V8 ↗を参照してください。
- オーバーロード例外を受け取るDurable Objectスタブは、他の例外タイプの動作に合わせて永久に壊れます。
- プレビューサービスがLet’s Encrypt証明書が期限切れであると主張していた問題を修正しました。
structuredClone()↗がサポートされるようになりました。
AbortSignalオブジェクトにキャンセルの理由を示す新しいreasonプロパティが追加されました。理由は、AbortSignalがトリガーまたは作成されるときに指定できます。- 未処理の拒否警告がインスペクターコンソールに表示されます。
- V8 9.6にアップグレードしました。これにより、WebAssembly参照型のサポートが追加されました。詳細については、V8 release v9.6 · V8 ↗を参照してください。
- Streams: BYOBリーダーを使用する場合、提供されたTypedArrayの
ArrayBufferは、Streams仕様に従ってデタッチされるべきです。Workersは以前はそのルールを強制していなかったため、仕様に従うように変更すると既存のコードが壊れる可能性があるため、互換性フラグstreams_byob_reader_detaches_buffer ↗が導入され、2021-11-10にデフォルトで有効になります。ユーザーコードは、BYOBリーダーのread()メソッドに渡されたArrayBufferを再利用しようとするべきではありません。最近追加された拡張メソッドreadAtLeast()は常にArrayBufferをデタッチし、互換性フラグの設定に影響されません。
EventTarget.addEventListener()のsignalオプションのサポートが追加され、AbortSignalに応じてイベントリスナーを削除できるようになりました。unhandledrejectionおよびrejectionhandledイベントがサポートされるようになりました。ReadableStreamDefaultReaderおよびReadableStreamBYOBReaderコンストラクタがサポートされるようになりました。- 最低
sizeバイトを返すために使用できる非標準のReadableStreamBYOBReaderメソッド.readAtLeast(size, buffer)が追加されました。bufferパラメータはArrayBufferViewでなければなりません。動作は.read()と同じですが、少なくともsizeバイトが読み取られ、EOFに遭遇した場合のみ少なくなります。done = trueの値を取得するには、最終的に.readAtLeast()を1回呼び出す必要があります。 - 互換性フラグ
formdata_parser_supports_files、fetch_refuses_unknown_protocols、およびdurable_object_fetch_requires_full_urlは、それぞれ2021-11-03、2021-11-10、2021-11-10にデフォルトでオンにされる予定です。詳細については、Compatibility Datesを参照してください。
request.signalは常にAbortSignalを返します。- Cloudflare WorkersのChrome DevToolsプロファイリングとの統合が、行番号と経過時間をより正確に報告するようになりました。以前は、行番号が実際のコードよりも1行遅れて表示され、表示される時間は比例しているが実際の使用時間よりもはるかに長くなっていました。
- v8 9.5にアップグレードしました。詳細については、V8 release v9.5 · V8 ↗を参照してください。
AbortControllerおよびAbortSignalオブジェクトが利用可能になりました。- Webプラットフォームの
queueMicrotaskAPIが利用可能になりました。 - 新しい
EventTarget()を使用してカスタムEventTargetサブクラスを作成できるようになりました。 addEventTargetでonceオプションがサポートされ、1回だけ呼び出されるイベントハンドラを登録できるようになりました。- HTML仕様に従い、
addEventListener関数に渡されるリスナーは、関数またはhandleEventメンバー関数を持つオブジェクトのいずれかであることが許可されています。以前は、Workersは関数オプションのみをサポートしていましたが、現在は両方をサポートしています。 Eventオブジェクトは、ほとんどの標準メソッドとプロパティをサポートするようになりました。- V8が9.3から9.4に更新されました。
crypto.randomUUID()メソッドを使用して、新しいランダムバージョン4 UUIDを生成できます。- Durable Objectsは、コロケーション(colo)の周りでより均等にスケジュールされるようになりました。
- ユーザー向けの変更はありません。バグ修正と内部メンテナンスのみです。
- 16MBを超えるデータを一度に読み取るときにDurable Objectsでハングする問題を修正しました(例えば、大きな
list()操作で)。 HTMLRewriterが<esi:include>および<esi:comment>をvoidタグとして扱う新しい互換性フラグhtml_rewriter_treats_esi_include_as_void_tagが追加されました。これにより、これらは終了タグやネストされたコンテンツを持たないと見なされます。この新しい動作をワーカーに適用するには、Wrangler v1.19.0以上を使用し、wrangler.tomlにフラグを指定する必要があります。詳細については、Wrangler互換性フラグノート ↗を参照してください。
- パフォーマンスと安定性の向上。
- Workersは、単一のリクエスト呼び出し内からDurable Objectsに最大1000のサブリクエストを行えるようになりました。以前の制限は50でした。
- Durable Objectsの実装に大きな変更があり、詳細は今後のブログ投稿で説明される予定です。理論的には、これらの変更は既存のアプリに害を及ぼすことはなく、むしろ速くするはずです。異常を観察した場合は、アカウントチームに知らせるか、Workers Discord ↗で問題を報告してください。
- Durable Objectコンストラクタは、
fetch()呼び出しなどのI/Oを開始できるようになりました。 - リクエストや他のイベントの配信を遅延させるのに役立つDurable Objectsの
state.blockConcurrencyWhile()APIが追加されました。例えば、オブジェクトのコンストラクタでスタートアップ初期化を行うために使用できます。 - Durable Objectsでは、
storage.transaction()に渡されたコールバックが値を返すことができるようになり、その値はtransaction()呼び出しの戻り値として伝播されます。
- プレビューサービスは、スクリプトが
Response/Request.clone()を使用しているが、クローンされたボディの1つを読み取っていない場合、devtoolsコンソールに警告を表示します。このような状況では、ランタイムがメッセージボディ全体をメモリにバッファリングすることを強制し、パフォーマンスが低下します。ここに例があります ↗。
- 同じ正確なイベントリスナーメソッドを同じイベントタイプに2回登録すると、内部エラーが発生するバグを修正しました。
Headers、URLSearchParameters、およびFormDataの.forEach()メソッドのサポートを追加しました。
- WebCrypto: 非標準のEd25519操作(アルゴリズムNODE-ED25519、曲線名NODE-ED25519)を実装しました。Ed25519の実装は、NodeJSのものとは異なり、プライベートキーの生のインポート/エクスポートが禁止されています。これはECDSA/ECDHとの整合性を保つためです。
今週の変更:
- V8を9.1から9.2に更新しました。
wrangler tailがDurable Objectsで機能するようになりました。長寿命のWebSocketからのログは、WebSocketが閉じられるまで表示されません。
今週の変更:
- V8 Sparkplugコンパイラをオンにしました。
- コードが更新された後に既存のリクエストを終了しているDurable Objectインスタンスは、永続ストレージAPIから切断され、特定のDurable Objectに対して常に単一のインスタンスのみが永続ストレージにアクセスできるという不変性を維持します。
今週の変更:
- WebCrypto: ECDSA/ECDH公開鍵の「生」インポート/エクスポート形式をサポートするようになりました。
request.cfは、モジュール構文を使用してWorkersを書く際に欠落しなくなりました。
今週の変更:
- WebCrypto APIからのエラーメッセージを改善しました。
- V8を更新しました: 9.0 → 9.1
以前のリリースの変更:
- WebCrypto: RSA、ECDSA、ECDHのJWKエクスポートを実装しました。
- WebCrypto: RSA-OAEPのサポートを追加しました。
- WebCrypto: HKDFを実装しました。
- Durable Objectsで最近導入された逆時計のジャンプを修正しました。
WebCrypto.generateKey()がRSA-PSSアルゴリズムでキー対を生成するように求められた場合、代わりにRSASSA-PKCS1-v1_5アルゴリズムを使用してキー対を返すことがありました。キー構造は同じですが、署名アルゴリズムは異なり、したがって、キーを使用して生成された署名は、RSA-PSSの正しい実装によって受け入れられませんでした。これはかなり明白な問題ですが、誰もこれを報告していないため、現在、Workersでこの機能を使用している人はいないと推測しています。
今週の変更:
- WebCrypto: AESアルゴリズムのために
wrapKey()/unwrapKey()を実装しました。 WebSocket.close()の引数は、標準がそうするべきだと言っているように、オプションになりました。
今週の変更:
- WebCrypto APIで、AES-CTR暗号化アルゴリズムのために暗号化および復号化操作がサポートされるようになりました。
- Durable Objectsでは、CPU時間制限がリクエストレベルではなくオブジェクトレベルで強制されるようになりました。新しいリクエストが到着するたびに、時間制限は500msに「補充」されます。ベータ期間が終了し、Durable Objectsが一般に利用可能になると、これを30秒に増やします。
- Durable ObjectがCPU時間制限を超えた場合、オブジェクト全体が破棄され再作成されます。以前は、サブリクエストが同じオブジェクトを使用し続けることを許可していましたが、これは危険でした。CPU時間制限に達すると、オブジェクトが不整合な状態になる可能性があるからです。
- 長時間実行されるDurable Objectsには、追加のWebSocketメッセージが送信されると、より多くのサブリクエストクォータが与えられ、特定のWebSocketによってしばらく保持されている間に、長時間実行されるオブジェクトがこれ以上のサブリクエストを行えなくなる問題を回避します。
- Durable Objectのコードが更新されるか、メモリ制限を超えてアイソレートがリセットされると、オブジェクトを指すすべてのスタブが無効になり、再作成される必要があります。これは、CPU時間を超えたときや、ランダムなネットワークエラーによりスタブが切断されたときに発生することと一致しています。この動作は便利で、アプリは同じスタブに送信された2つのメッセージが、(もし配信される場合)正確に同じライブインスタンスに配信されると仮定できます。この特性を気にしないアプリは、すべてのリクエストに対してスタブを再作成する必要があります。これを行ってもパフォーマンスペナルティはありません。
- Durable Objectのアイソレートがメモリ制限を超えた場合、説明メッセージを持つ例外が呼び出し元にスローされるようになりました。「内部エラー」ではなく。
- Durable ObjectがCPU時間制限を超えた場合、説明メッセージを持つ例外が呼び出し元にスローされるようになりました。「内部エラー」ではなく。
wrangler tailは、CPU時間超過の例外を説明メッセージとともに報告するようになりました。「内部エラー」ではなく。
3/26の最後の投稿以降の変更:
- Cronトリガーには、既存のCPU時間制限に加えて15分の壁時間制限があります。(以前は制限がなかったため、I/Oを待つのにすべての時間を費やすcronトリガーが永遠にハングする可能性がありました。)
- WebCryptoの実装は、JWK形式でHMACおよびAESキーのインポートとエクスポートをサポートするようになりました。
- WebCryptoの実装は、CTR、CBC、およびKWモードのAESキー生成をサポートするようになりました。AES-CTRの暗号化/復号化およびAES-KWのキーラッピング/アンラッピングのサポートは、後のリリースで追加されます。
- ゼロ長の入力に対して
crypto.subtle.encrypt()を実行すると、例外がスローされるバグを修正しました。 - スクリプトのアップロード時のエラーは、モジュールベースのスクリプトに対して適切に報告されるようになり、ReferenceErrorとして表示されなくなりました。
- WebCrypto: ECDHのキー導出。
- WebCrypto: ECDHキー生成およびインポートのサポート。
- WebCrypto: ECDSAキー生成のサポート。
- ゼロ長の入力に対して
crypto.subtle.encrypt()を実行すると、例外がスローされるバグを修正しました。 - WebCrypto APIからスローされる例外メッセージを若干改善しました。
waitUntilは、モジュールWorkersに対してサポートされるようになりました。追加の引数ctxがenvの後に渡され、waitUntilはctxのメソッドです。passThroughOnExceptionは、モジュールハンドラのctx引数の下で利用可能になりました。- Durable Objectsの信頼性向上。
- Durable Objectsの永続ストレージAPIの信頼性向上。
ScheduledEvent.cronは、イベントがスケジュールされた元のcron文字列に設定されるようになりました。
今週の変更:
- Durable Objectsへの既存のWebSocket接続は、コードの更新時に強制的に切断され、クライアントが新しいコードを実行しているインスタンスに接続することを強制します。
今週の新機能:
- Workers Runtime自体が新しいバージョンや設定変更のデプロイにより再読み込みされる際、高トラフィックのWorkersを新しいインスタンスのランタイムに事前にロードします。これにより、ユーザーはアップグレードによるこれらのWorkersのコールドスタートを観察せず、また、以前に見られた503エラーの低い発生率も修正されます。
(ここ数週間、リリースノートは投稿されていないようですが、ユーザーに見える新しい変更はありませんでした。)
今週の変更:
- ダッシュボードのプレビューモードでは、起動中に失敗したWorkerはデフォルトのパススルー動作ではなく、500レスポンスを返すようになりました。これにより、Workerが失敗していることに気づきにくくなることがなくなります。
- Durable ObjectのIDがそのコンストラクタに提供されるようになりました。これは、
stateの最初の引数として提供されるもので、state.idとしてアクセスできます。
今週の新機能:
- V8が8.8から8.9に更新されました。
fetch()中に、宛先サーバーが無効な(解析不可能な)ヘッダーを返すなどの特定のHTTPプロトコルエラーを犯した場合、問題を説明する例外をスローするようになりました。「内部エラー」ではなくなりました。
先週の新機能(投稿し忘れ):
- Durable Objectsでの
waitUntil()のサポートが追加されました。これは、Durable Objectクラスのコンストラクタに渡される状態オブジェクトのメソッドです。
過去1週間の新機能:
- プレビュサービスでdevtoolsを使用しているときに、WebAssemblyモジュールを持つスクリプトがハングするバグが修正されました。
今週の変更:
- アウトゴーイングリクエストでFormDataを構築する際に使用できるFileおよびBlob APIが実装されました。残念ながら、現在のところ、受信リクエストからのFormDataは、ファイルメタデータが存在しても文字列を使用し続けます。これは、既存のデプロイされたWorkersを壊さないようにするためです。将来的にこれを修正する方法を見つけます。
今週の変更:
- ユーザーに見える変更はありません。
前回のリリースの変更:
- WebSocketの「エラー」イベントの配信が修正されました。
- WritableStreamが書き込みがキューに残っている状態でガベージコレクトされるという稀なバグが修正され、これにより書き込みが失われることがなくなりました。
今週の変更:
- V8の大規模な更新: 8.7.220.29 -> 8.8.278.8
今週の変更:
- 発表されていない新機能。(続報をお待ちください。)
- 同時サブリクエストの新しい制限が施行されました(以下を参照)。
- 安定性の向上。
同時サブリクエスト制限
このリリースから、Workerが同時に行うことができるアウトゴーイングHTTPリクエストの数に制限を設けます。各受信リクエストごとに、Workerは最大6つの同時アウトゴーイングfetch()リクエストを行うことができます。
Workerのリクエストハンドラーが、前のfetchが完了するのを待たずに(単一の受信リクエストのために)6回以上fetch()を呼び出そうとすると、6回目以降のfetchは前のfetchが完了するまで遅延します。Workerは引き続き、各受信リクエストごとに最大50のサブリクエストを行うことが許可されています。新しい制限は、同時に実行できる数にのみ適用されます。
自動デッドロック回避
私たちの実装は、fetchを遅延させることがWorkerをデッドロックさせるかどうかを自動的に検出し、最も最近使用されていないリクエストをキャンセルすることでデッドロックを防ぎます。たとえば、10のリクエストを開始し、レスポンスをすべて受け取るのを待っているWorkerを想像してください。fetchは、レスポンスボディが完全に消費されるまで完了とは見なされません(たとえば、response.text()やresponse.json()を呼び出すか、response.bodyから読み取ることによって)。したがって、このシナリオでは、最初の6つのリクエストが実行され、そのレスポンスオブジェクトが返されますが、残りの4つのリクエストは以前のレスポンスが消費されるまで開始されません。Workerが実際に以前のレスポンスボディを読み取らず、最後の4つのリクエストを待っている場合、Workers Runtimeは最初の4つのリクエストを自動的にキャンセルし、残りのリクエストが完了できるようにします。Workerが後でレスポンスボディを読み取ろうとすると、例外がスローされます。
ほとんどのWorkersは影響を受けません
大多数のWorkersは、各受信リクエストごとに6未満のアウトゴーイングリクエストを行います。このようなWorkersは、この変更の影響をまったく受けません。
1つの受信リクエストに対して6つ以上のアウトゴーイングリクエストを同時に行うWorkersの大多数は、各レスポンスが返されるとすぐにレスポンスボディを読み取るか、まったく読み取らないかのいずれかです。いずれの場合でも、これらのWorkersは意図した通りに動作しますが、6回目以降のアウトゴーイングリクエストが遅延するため、少し遅くなる可能性があります。
非常に少数のデプロイされたWorkers(約20件)は、6つ以上のリクエストを同時に行い、すべてのレスポンスが返されるのを待ってから後でレスポンスボディを読み取ります。これを行うすべての既知のWorkersについては、古い動作に一時的にグランドファーザー化されているため、あなたのWorkersは引き続き動作します。ただし、私たちはお客様と1対1でコミュニケーションを取り、リクエストボディを積極的に読み取るようにコードを更新するようにお願いする予定です。新しい制限の下で正しく動作するようにするためです。
なぜこれを行ったのか?
Cloudflareは、HTTP/1.1を使用してオリジンサーバーと通信します。HTTP/1.1では、各同時リクエストには別々の接続が必要です。したがって、多くのリクエストを同時に行うWorkersは、オリジンサーバーへの過剰な接続の作成を強制する可能性があります。場合によっては、これがオリジンサーバーまたは私たちのスタック内でリソース枯渇の問題を引き起こしました。
そのようなWorkersのユースケースを調査したところ、私たちが見たすべてのケースは間違いであるか、あるいは不必要であることが判明しました。多くの場合、開発者はリクエストを行い、レスポンスを受け取っていましたが、ボディではなくレスポンスのステータスとヘッダーだけを気にしていました。そのため、彼らはボディを読み取らずにレスポンスオブジェクトを破棄し、接続を漏らしていました。他のケースでは、開発者が単に無意味にループで過剰なリクエストを行うコードを書いてしまっただけでした。これらのケースは、今後の動作の下では問題を引き起こさないはずです。
私たちは、Chromeがブラウザ内のウェブサイトに対して同じ制限を施行しているという事実に基づいて、6つの同時接続の制限を選択しました。
今週の変更:
- Durable ObjectsストレージAPIがプレフィックスによるキーのリストをサポートするようになりました。
- 単一のリクエストが1000 KV操作を超えた場合に、リクエストごとの制限が達成されたことを明確にするために、エラーメッセージが改善されました。
wrangler devのプレビューは、Workers Unboundベータ版にいる場合のように、非デフォルトのリソース制限を尊重するようになりました。- Worker例外の行番号のオフバイワンが修正されました。
- Durable Objectの
fetch()メソッドでスローされた例外が、その呼び出し元にトンネルされるようになりました。 - 大きなDurable ObjectレスポンスボディがDurable Objectを応答しなくさせるバグが修正されました。
過去1週間の変更:
ReadableStream.cancel()およびReadableStream.getReader().cancel()が、必須ではなくオプションの引数を取るようになり、Streams仕様に準拠しました。- WASMモジュールが128MBを超えるサイズに成長したいと宣言した場合に発生するエラーが修正されました。代わりに、モジュールの実際のメモリ使用量が監視され、128MBを超えた場合にエラーがスローされます。
今週の変更:
- V8の大規模な更新: 8.6 -> 8.7
- 単一のトランザクションで変更できるDurable Objectsキーの最大数を128に制限しました。
先週の通常の週次リリースがありましたが:
- ユーザーに見える変更はありません。
今週の変更:
- 今後の機能をサポートするための内部変更。
また、2020-09-08リリースからの変更で、投稿し忘れたようです:
- V8の大規模な更新: 8.5 -> 8.6
先週の変更:
HTMLRewriter.transform()がスプリアスな「パーサーが停止しました。」エラーをスローする可能性がある回帰が修正されました。- V8が8.4から8.5にアップグレードされました。
今週の変更:
- HTMLRewriterの回帰が修正されました: https://github.com/cloudflare/lol-html/issues/50 ↗
fetch()またはnew Request()に渡される一般的なHTTPメソッド名が、Fetch API仕様に従って大文字小文字を区別しないようになりました。
先週の変更(…投稿し忘れ):
setTimeout/setIntervalが、コールバックに渡される追加の引数を取ることができるようになりました。これは仕様で要求されています。(この機能を使用する人は少ないですが、通常はラムダキャプチャを使用する方がはるかに簡単です。)
先々週の変更(…また…投稿し忘れ…本当にこのためのボットを作る必要があります):
- HTMLRewriterが
:nth-child、:first-child、:nth-of-type、および:first-of-typeセレクタをサポートするようになりました。
今週の変更:
- まだ発表されていない新機能のAPIが実装されました。
数週間のリリースノートを投稿し忘れたようです。リリースはいつも通り毎週行われていますが、「コミュニティに投稿する」ステップが自動化されていません… 4/2リリース:
- メモリ制限の施行における長いガベージコレクションの一時停止の原因が修正されました。
4/9リリース:
- 公開されている変更はありません。
4/16リリース:
- プレビューで、
FormDataタイプのボディを持つRequestまたはResponseを構築しようとしたときに、Content-Typeヘッダーがオーバーライドされている場合に警告をログに記録するようになりました。このようなボディは受信者によって解析できません。
今週の新機能:
- Cache APIを使用しているときにスローされる可能性のある「内部エラー」の一部が、人間に優しいエラーメッセージで報告されるようになりました。たとえば、
caches.default.match("not a URL")は、TypeErrorをスローします。
過去2週間の新機能:
- 新しく開始されたWorkerによって処理される最初の数リクエストに対してCPU時間制限が過度に寛容であったプレビュサービスのバグが修正されました。同じバグは実際には本番環境にも存在しますが、ライブサイトを壊す可能性があるため、そこを修正する際にはより慎重になります。プレビューでWorkerが現在CPU時間制限を超えている場合、それは本番環境でも制限を超えている可能性がありますが、最初の数リクエストに対して制限が緩すぎるために正常に動作しているように見えるだけです。そのようなWorkersは、本番環境でも最終的に失敗します(常にそうでした)ので、デプロイする前にプレビューで問題を修正するのが最善です。
- V8の大規模な更新: 8.0 -> 8.1
- 小さなバグ修正。
過去数週間の変更:
- 同じアカウント内で異なる名前のスクリプトが同一の内容を持ち、同じゾーンにデプロイされた場合、それらが「同じWorker」と見なされ、同じアイソレートとグローバル変数を共有するというバグが修正されました。これは同じゾーン内のWorkers間にのみ適用されるため、セキュリティの脅威ではありませんが、混乱を引き起こしました。現在、異なる名前のWorkerスクリプトは、同一の内容を持っていても決して同じWorkerとは見なされません。
- パフォーマンスと安定性の向上。
リリースノートを投稿してからしばらく経ちましたが、部分的には休日のためです。過去1ヶ月の新機能は以下の通りです:
- パフォーマンスと安定性の向上。
- HTTP/2でバーストトラフィックを処理する際に発生する稀な
daemonDownエラーの原因が排除されました。 - V8が7.9から8.0に更新されました。
今週の新機能:
- V8インスペクターに例外を報告する際に、正しい行番号と列番号をより頻繁に渡すようになりました。報告された行番号と列番号が間違っているケースも残っています。
- daemonDown (1105)エラーの重要な原因が修正されました。
過去数週間のランタイムリリースノート:
- 各リクエストごとの
Cache.put()制限を5GiBに増加しました。 - 各
Cache.put()制限を5GiBまたはゾーンの通常のキャッシュ制限のいずれか小さい方に増加しました。 - AES復号失敗を説明する役立つエラーメッセージが追加されました。
- 一部のオーバーロードエラーが誤ってdaemonDown (1105)エラーとして報告されていました。これらは、原因をよりよく説明するexceededCpu (1102)エラーに変更されました。
- より多くの「内部エラー」が有用なユーザー向けエラーに変換されました。
- 安定性の向上とバグ修正。