このページは、2023 年より前の Cloudflare Workers の変更を記録します。最近の更新は、現行の changelog を参照してください。
- R2 バインディング API の条件付き
PUTリクエストを修正しました。
- Queues は、メッセージとして未定義の JavaScript 値を渡す
send()の呼び出しをサポートしなくなりました。
- DOMException コンストラクターを、標準仕様により近づけるよう更新しました。具体的には、message と name の引数に、文字列へ強制できる任意の JavaScript 値を渡せるようになりました(以前は、非文字列を渡すと例外になっていました)。
- R2 バインディング API を拡張し、マルチパートアップロードに対応しました。
- V8 の更新: 10.6 → 10.8
- R2Checksums に
toJSON()を実装し、JSON.stringify()で使えるようにしました。
- alarm の再試行上限は、当社側の過失によるエラーには適用されなくなりました。
- 新しい streams 実装を含む複数のフラグに、互換性日付を追加しました。
DurableObjectStorageに新しいメソッドsync()を追加しました。Worker が書き込み(allowUnconfirmedで行ったものも含む)のストレージ同期を待つ手段です。
- ES モジュール構文のスクリプトがトップレベルモジュールから配列型の値をエクスポートすると、アップロード API が
500エラー ↗ で拒否するバグを修正しました。 console.logが、Promise など一部のオブジェクトについて、より多くの情報を表示するようになりました。- Workers Runtime は、次のオープンソースコードからビルドされるようになりました: GitHub - cloudflare/workerd: The JavaScript / Wasm runtime that powers Cloudflare Workers ↗。
- R2 の
putバインディングオプションに、getと同様の条件付きアップロードを行うonlyIfフィールドを指定できるようになりました。 - R2 バインディングで、複数キーを一度に削除できるようになりました。
- R2 の
putオプションで SHA-1、SHA-256、SHA-384、SHA-512 チェックサムに対応しました。 - ユーザー指定のオブジェクトチェックサムが、R2 の
get/headバインディング応答で使えるようになりました。マルチパート以外でアップロードしたオブジェクトでは、既定で MD5 が含まれます。 - V8 を 10.6 に更新しました。
rangeヘッダーを持つHeadersオブジェクトを、getR2 バインディングのR2GetOptions内の range に使えるようになりました。getR2 バインディングのR2GetOptions内でonlyIfにヘッダーを使う場合、秒単位で正しく比較するようになりました。これにより、ブラウザーとの往復が正しくなります。加えて、手組み立てのオプションにsecondsGranularityを渡せば、Headers の外で同じ効果を指定できます。- @cloudflare/workers-types ↗ の
DurableObjectState.idの TypeScript 型を、常にDurableObjectIdになるよう修正しました。 - モジュールスクリプトの Worker アップロード時の検証エラーに、正しい行番号と列番号が含まれるようになりました。
- バグ修正: Chrome のデバッグツールによるプロファイリングとフレームグラフが、情報を正しく報告するようになりました。
- サービスのスケール問題により、Workers Usage Report と Workers Weekly Summary を無効にしました。
- グローバルネットワークプレビューモードの
wrangler devが、alarm のスケジュールに対応しました。 rangeオプション付きの R2 GET リクエストが、返された range をGetObjectのrangeパラメータに含むようになりました。- Web Cryptography API の一部のエラーメッセージに、より多くの情報が含まれるようになりました。
- V8 を 10.2 から 10.3 に更新しました。
- 古い
addEventListener構文を使う Worker スクリプトの Cron trigger イベントは、scheduledイベントのリスナーが登録されていない場合、失敗として扱われるようになりました。 - DO alarm を使うために、
durable_object_alarmsフラグを明示する必要がなくなりました。
- 外部から見える変更はありません。
- データに変換を行える標準の
TransformStreamインスタンスを作成できるようになりました。引数なしの既定のnew TransformStream()の動作が変わるため、有効化にはtransformstream_enable_standard_constructor互換性フラグが必要です。 - Quick Edit のプレビューが、正しい R2 バインディングを使うようになりました。
- V8 を 10.1 から 10.2 に更新しました。
- 静的メソッド
Response.json()で、JSON シリアライズしたペイロードの Response オブジェクトを初期化できます(whatwg/fetch #1392 ↗ を参照)。 - 投げられる R2 例外のメッセージ末尾に、括弧付きで
errorコードが付くようになりました。投げられたErrorオブジェクトに code プロパティを明示追加できるようになるまでの暫定対応です。
- R2 バインディング:
contentEncoding、contentLanguage、cacheControlが正しく描画されるようになりました。 - ReadableStream の
pipeToとpipeThroughが、AbortSignalによるキャンセルに対応しました。 alarm()ハンドラー未実装の DO でsetAlarm()を呼ぶと、黙って失敗せず例外を投げるようになりました。alarm()ハンドラーが未実装のときにgetAlarm()を呼ぶと、古いバージョンの DO クラスに alarm が設定されていても null を返します。実行は行われません。- R2: 追加の range に対するランタイム対応を改善しました。
- R2 バインディングが、
offsetと任意のlength、lengthと任意のoffset、またはsuffix(ファイルの末尾Nバイトを返す)を持つ range に対応しました。
- R2 バインディングが cache-control を content-language として保存し、cache-control を content-language として描画していた問題を修正しました。
- オプションなしの R2 バインディング list が、結果を返さないのではなく、既定の list 上限を使うよう修正しました。
- R2 からのエラーメッセージを正しく扱えず
internal errorが投げられていた問題を修正しました。存在しないキーに対する get が null ではなく例外を投げる動作も修正しました。R2Errorは当面削除し、将来の未定の時期に再導入します。 - R2 バインディング: onlyIf 条件が precondition failure または not modified になった場合、null ではなく本文なしのオブジェクトを返します。
- R2 バインディング: 実際には何にもつながっていなかったため、sha1 オプションを削除しました。md5 以外の追加チェックサムは未定です。
- Durable Object ストレージ API の
list()メソッドにstartAfterオプションを追加しました。
Response.redirect(url)が、URL パス内の連続するスラッシュをまとめなくなりました。- Date 向けに生成される型を修正しました。
- オプションなしの R2 バインディング list が、結果を返さないのではなく、既定の list 上限を使うよう修正しました。
- R2 バインディングが R2 からのエラーメッセージを正しく扱えず、internal error が投げられていた問題を修正しました。存在しないキーに対する 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-04-05(火)から既定で有効になり、Workers のminimal_subrequests互換性フラグ で説明しています。 - JavaScript 実装の ReadableStreams で
Responseを作るとき、Bodyミックスイン関数(例:await response.text())が実装されるようになりました。 IdentityTransformStreamは、バイトを変更せずに通す、バイト志向のTransformStream実装です。TransformStreamの読み取り側は BYOB 読み取りに対応します。IdentityTransformStreamは、現在の仕様非準拠のTransformStream実装と同じである点に注意してください。後者はまもなく WHATWG Stream Standard に合わせて更新されます。将来の破壊的変更を避けるため、現在のnew TransformStream()の利用はすべてnew IdentityTransformStream()に置き換えてください。
- 標準の ByteLengthQueuingStrategy ↗ と CountQueuingStrategy ↗ クラスが使えるようになりました。
capture_async_api_throwsフラグを設定すると、Promise を返す Cloudflare 固有および Web Platform 標準の組み込み API は、同期的にエラーを投げず、拒否された Promise を返すようになります。メモリ不足などの致命的エラーは例外です。- R2 の公開日描画を修正しました。
- R2 バケットバインディングの .get が contentRange にゴミを入れていた問題を修正しました。contentRange は意図どおり undefined になりました。
- JavaScript 実装の
ReadableStreamをnew Response()で使えるようになりました。
- Durable Object の単一キー
put()で、課金する書き込みユニット数を決めるときにキーサイズが計上されていなかったバグを修正しました。キーが大きく、書き込み合計サイズが次の課金単位しきい値 4096 バイトを超える場合、将来の書き込みは過去より 1 書き込みユニット多く課金されることがあります。複数キーのput()は、課金書き込みユニットの算出時にキーサイズを常に正しく計上していました。 CompressionStreamとDecompressionStreamの実装が使えるようになりました。
- 新しい
ReadableStream()コンストラクターで作った ReadableStreams の、初期の pipeTo / pipeThrough サポートが使えるようになりました。 global_navigator互換性フラグを設定すると、navigator.userAgentプロパティで、コードが Workers 環境内で動いているかを検出できます。- 新しい URL 実装で、
URLSearchParamの値を設定するときのバグを修正しました。 - モジュール構文を使うとき、グローバルの
addEventListenerと dispatchEvent API が使えるようになりました。 URLPatternの実装が使えるようになりました。
TextDecoderクラスが、WHATWG Encoding Standard で定義されたテキストエンコーディングの全範囲に対応しました。- グローバルの
fetch()と Durable Object のfetch()は、「Upgrade: websocket」ヘッダーなしのリクエストに対して WebSocket を受け取ると TypeError を投げるようになりました。 - Durable Objects のユーザーは、アカウント内のオブジェクト全体で既定で最大 50 GB までデータを保存できます。これまでどおり、それ以上が必要な場合は増量を依頼できます。
TextDecoderが Windows-1252 ラベル(別名 ASCII)に対応しました: Encoding API Encodings - Web APIs | MDN ↗。
- WebSocket のメッセージ送信が、I/O ゲートのブログ記事 ↗ で説明した Durable Object の出力ゲートを誤って守っていませんでした。このバグを修正したため、ストレージ書き込みが実際に成功していない限り、成功を前提に WebSocket がメッセージを送ることはなくなりました。
- Worker と Durable Object の両方を実装するスクリプトを新しいコードで再デプロイすると、Durable Objects への WebSocket が時折ハングするバグを修正しました。
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 オブジェクトにプロパティの getter / setter を付ける方法を正し、適切にサブクラス化できるようにします。
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もサポートします。setTimeout()のawait可能な代替として、WICG 標準化プロセス中 ↗ のscheduler.wait()API の初期サポートを追加しました。- キーが 10000 を超える Durable Objects の
deleteAllで、データ削除が不完全になったりハングしたりすることがあるバグを修正しました。
- Streams 仕様では、Promise を返すメソッドは同期エラーを投げてはなりません。Streams 実装をより仕様準拠にするため、多くの同期 throw を非同期の拒否に変換しています。
- 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コンストラクターに対応しました。- 非標準の
ReadableStreamBYOBReaderメソッド.readAtLeast(size, buffer)を追加しました。少なくともsizeバイトのバッファーを返すために使えます。bufferパラメータはArrayBufferViewである必要があります。動作は.read()と同じですが、少なくともsizeバイトを読み、EOF に達した場合のみそれより少なく返します。done = trueを得るには、最後にもう一度.readAtLeast()を呼ぶ必要があります。 - 互換性フラグ
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 Platform の
queueMicrotaskAPI が使えるようになりました。 new EventTarget()と、カスタムのEventTargetサブクラスを作成できるようになりました。- 一度だけ呼ばれるイベントハンドラーを登録する
onceオプションが、addEventTargetで使えるようになりました。 - HTML 仕様では、
addEventListenerに渡すリスナーは関数、またはhandleEventメンバー関数を持つオブジェクトのいずれかです。以前は関数のみでしたが、両方に対応しました。 Eventオブジェクトが、ほとんどの標準メソッドとプロパティに対応しました。- V8 を 9.3 から 9.4 に更新しました。
crypto.randomUUID()メソッドで、新しいランダムな version 4 UUID を生成できます。- Durable Objects が、コロケーション(colo)内でより均等にスケジュールされるようになりました。
- ユーザー向けの変更はありません。バグ修正と内部メンテナンスのみです。
- 一度に 16MB を超えるデータ(大きな
list()など)を読むときの Durable Objects のハングを修正しました。 - 新しい互換性フラグ
html_rewriter_treats_esi_include_as_void_tagを追加しました。HTMLRewriterが<esi:include>と<esi:comment>を void タグとして扱い、終了タグも入れ子コンテンツもないとみなします。新しい動作を有効にするには、Wrangler v1.19.0 以降を使い、wrangler.tomlでフラグを指定してください。詳細は Wrangler の互換性フラグノート ↗ を参照してください。
- パフォーマンスと安定性を改善しました。
- 1 回のリクエスト呼び出し内で、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()を使ってもクローンした本文の一方を読まない場合、devtools コンソールに警告を出します。この状況では、ランタイムがメッセージ本文全体をメモリにバッファーするため、性能が落ちます。例はこちら ↗ です。
- まったく同じイベントリスナーメソッドを同じイベント種別へ 2 回登録すると内部エラーになるバグを修正しました。
Headers、URLSearchParameters、FormDataの.forEach()メソッドに対応しました。
- WebCrypto: 非標準の Ed25519 操作(アルゴリズム NODE-ED25519、曲線名 NODE-ED25519)を実装しました。この Ed25519 実装は、ECDSA / ECDH との一貫性のため、秘密鍵の raw インポート / エクスポートを許可しない点で NodeJS と異なります。
今週の変更:
- V8 を 9.1 から 9.2 に更新しました。
wrangler tailが Durable Objects で動作するようになりました。長寿命 WebSocket のログは、WebSocket が閉じるまで表示されない点に注意してください。
今週の変更:
- V8 Sparkplug コンパイラーを有効にしました。
- コード更新後に既存リクエストを仕上げている Durable Objects は、永続ストレージ API から切断されます。1 つの Durable Object の永続ストレージにアクセスできるインスタンスは常に 1 つ、という不変条件を守るためです。
今週の変更:
- WebCrypto: ECDSA / ECDH 公開鍵の「raw」インポート / エクスポート形式に対応しました。
- モジュール構文で Workers を書くとき、
request.cfが欠けなくなりました。
今週の変更:
- 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」暗号化アルゴリズムの encrypt / decrypt 操作に対応しました。
- Durable Objects の CPU 時間上限は、リクエスト単位ではなくオブジェクト単位で適用されるようになりました。新しいリクエストが届くたびに、時間上限は 500ms まで「補充」されます。(無料の)ベータ期間が終わり Durable Objects が一般提供になったあと、これを 30 秒に引き上げます。
- Durable Object が CPU 時間上限を超えると、オブジェクト全体が破棄され再作成されます。以前は、同じオブジェクトをサブリクエストが使い続けられましたが、CPU 時間上限到達はオブジェクトを不整合な状態にしうるため危険でした。
- 長時間動く Durable Objects は、追加の WebSocket メッセージを受け取るたびにサブリクエスト枠が増えます。特定の WebSocket で長く開いたオブジェクトが、それ以上サブリクエストできなくなる問題を避けるためです。
- Durable Object のコードが更新されたとき、またはメモリ上限超過で isolate がリセットされたとき、そのオブジェクトを指すスタブはすべて無効になり、再作成が必要です。これは CPU 時間超過時や、ランダムなネットワークエラーでスタブが切断されたときと同じです。この動作は有用です。アプリは、同じスタブへ送った 2 つのメッセージが(届くなら)まったく同じライブインスタンスへ届くと仮定できます。この性質が不要なアプリは、リクエストごとにスタブを再作成してください。性能上のペナルティはありません。
- Durable Object の isolate がメモリ上限を超えると、呼び出し側には「internal error」ではなく、説明付きの例外が投げられるようになりました。
- Durable Object が CPU 時間上限を超えると、呼び出し側には「internal error」ではなく、説明付きの例外が投げられるようになりました。
wrangler tailが、CPU 時間超過例外を「internal error」ではなく説明付きメッセージで報告するようになりました。
3/26 の前回投稿以降の変更:
- Cron Triggers に、既存の CPU 時間上限に加えて 15 分のウォールタイム上限が付きました。(以前は上限がなく、I/O 待ちばかりの Cron trigger は永遠にハングしえました。)
- WebCrypto 実装が、HMAC と AES キーの JWK 形式でのインポート / エクスポートに対応しました。
- WebCrypto 実装が、CTR、CBC、KW モードの AES キー生成に対応しました。AES-CTR の encrypt / decrypt と AES-KW のキーラップ / アンラップは、後のリリースで入ります。
- 長さ 0 の入力に対する
crypto.subtle.encrypt()が、ときどき例外を投げるバグを修正しました。 - スクリプトアップロード時のエラーが、モジュールベースのスクリプトでも ReferenceError ではなく正しく報告されるようになりました。
- WebCrypto: ECDH のキー導出。
- WebCrypto: ECDH のキー生成とインポートに対応。
- WebCrypto: ECDSA のキー生成に対応。
- 長さ 0 の入力に対する
crypto.subtle.encrypt()が、ときどき例外を投げるバグを修正しました。 - WebCrypto API が投げる例外メッセージをいくらか改善しました。
- モジュール Workers で
waitUntilに対応しました。envのあとに追加引数ctxが渡り、waitUntilはctxのメソッドです。 - モジュールハンドラーの ctx 引数で
passThroughOnExceptionが使えるようになりました。 - Durable Objects の信頼性を改善しました。
- Durable Objects 永続ストレージ API の信頼性を改善しました。
ScheduledEvent.cronが、イベントのスケジュール元となった元の cron 文字列に設定されるようになりました。
今週の変更:
- Durable Objects への既存 WebSocket 接続は、コード更新時に強制切断されるようになりました。クライアントが新しいコードを動かすインスタンスへ接続するようにするためです。
今週の新機能:
- Workers Runtime 自体が、新バージョンや設定変更のデプロイでリロードするとき、トラフィック切り替え前に新しいランタイムインスタンスで高トラフィック Workers をプリロードするようになりました。アップグレードによるコールドスタートをユーザーが観測しないようにし、こうしたリロード時の過負荷で見られていた散発的な 503 エラーも解消します。
(ここ数週間はリリースノート未掲載でしたが、報告すべき新しいユーザー向け変更はありませんでした。)
今週の変更:
- ダッシュボードのプレビューモードで、起動時に失敗する Worker は 500 応答を返すようになりました。以前の既定パススルーでは、Worker の失敗に気づきにくくなっていました。
- Durable Object の ID が、コンストラクターで提供されるようになりました。コンストラクターの第 1 引数の
stateから、state.idとしてアクセスできます。
今週の新機能:
- V8 を 8.8 から 8.9 に更新しました。
fetch()中に、宛先サーバーが無効(解析不能)なヘッダーを返すなどの特定の HTTP プロトコルエラーを起こした場合、「internal error」ではなく、問題を説明する例外を投げるようになりました。
先週の新機能(投稿漏れ):
- Durable Objects で
waitUntil()に対応しました。Durable Object クラスのコンストラクターに渡される state オブジェクトのメソッドです。
過去 1 週間の新機能:
- プレビューサービスで devtools を使うとき、WebAssembly モジュール付きスクリプトがハングするバグを修正しました。
今週の変更:
- File と Blob API を実装しました。送信リクエストの FormData 構築時に使えます。ただし、既存のデプロイ済み Workers を壊さないため、受信リクエストの FormData は、ファイルメタデータがあっても当面は文字列のままです。将来修正する方法を検討します。
今週の変更:
- ユーザーから見える変更はありません。
それより前のリリースの変更:
- WebSocket の「error」イベント配信を修正しました。
- 書き込みがキューに残っているあいだに WritableStream がガベージコレクションされ、書き込みが失われる稀なバグを修正しました。
今週の変更:
- V8 のメジャー更新: 8.7.220.29 -> 8.8.278.8
今週の変更:
- 未発表の新機能。(続報をお待ちください。)
- 同時サブリクエストの新しい上限を適用しました(下記参照)。
- 安定性を改善しました。
同時サブリクエスト上限
このリリースから、Worker が同時に出せる送信 HTTP リクエスト数に上限を設けます。着信リクエストごとに、Worker は同時に最大 6 件の送信 fetch() リクエストを発行できます。
Worker のリクエストハンドラーが、以前の fetch の完了を待たずに(1 件の着信リクエストのために)fetch() を 7 回以上呼ぶと、7 件目以降は以前の fetch が終わるまで遅延されます。着信リクエストあたり最大 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 でも、大多数は各応答の返却直後に本文を読むか、本文を一切読みません。いずれの場合も意図どおり動きますが、7 件目以降の送信リクエストが遅延するため、少し遅くなることがあります。
デプロイ済み Workers のうちごく少数(合計約 20)は、6 件を超えるリクエストを同時に出し、すべての応答を待ってから本文を後で読みます。これを行う既知の Workers すべてについて、ゾーンを一時的に旧動作の対象外とし、継続して動くようにしています。ただし、新しい上限でも正しく動くよう、リクエスト本文を先に読むようコードを更新してもらうため、お客様へ個別に連絡します。
なぜこれを行ったのか
Cloudflare はオリジンサーバーと HTTP/2 ではなく HTTP/1.1 で通信します。HTTP/1.1 では、同時リクエストごとに別接続が必要です。そのため、多くのリクエストを同時に出す Workers は、オリジンへの過剰な接続を強いることがありました。場合によっては、オリジンサーバーまたは当社スタック内でリソース枯渇が起きていました。
そうした Workers の用途を調べると、調べたケースはすべて誤りか、不要でした。多くの場合、開発者はリクエストを出して応答を受け取りますが、気にしていたのは応答のステータスとヘッダーだけで本文ではありませんでした。そのため応答オブジェクトを本文を読まずに捨て、接続をリークしていました。別のケースでは、ループで過剰なリクエストを出すコードを、特に理由なく誤って書いていました。どちらのケースも、新しい動作では問題を起こさないはずです。
同時接続数の上限 6 は、Chrome がブラウザー内のウェブサイトに同じ上限を課していることに基づいて選びました。
今週の変更:
- Durable Objects ストレージ API が、プレフィックスによるキー一覧に対応しました。
- 1 リクエストが 1000 回を超える KV 操作を行ったときのエラーメッセージを改善し、グローバルレート制限ではなくリクエスト単位の上限に達したことが分かるようにしました。
wrangler devのプレビューが、Workers Unbound ベータのより長い CPU 上限など、既定以外のリソース上限を尊重するようになりました。- Worker 例外の行番号のオフバイワンを修正しました。
- Durable Object の
fetch()メソッドで投げられた例外が、呼び出し側へトンネルされるようになりました。 - 大きな Durable Object 応答本文が、Durable Object を無応答にするバグを修正しました。
過去 1 週間の変更:
ReadableStream.cancel()とReadableStream.getReader().cancel()が、Streams 仕様に合わせて、必須ではなく任意の引数を取るようになりました。- WASM モジュールが 128MB 超への成長を宣言したときに起きていたエラーを修正しました。代わりに、モジュールの実際のメモリ使用量を監視し、128MB を超えるとエラーを投げます。
今週の変更:
- V8 のメジャー更新: 8.6 -> 8.7
- 1 トランザクションで変更できる Durable Objects キーの最大数を 128 に制限しました。
先週も通常の週次リリースがありましたが:
- ユーザーから見える変更はありません。
今週の変更:
- 近日機能のための内部変更。
また、2020-09-08 リリースの投稿漏れと思われる変更:
- V8 のメジャー更新: 8.5 -> 8.6
先週の変更:
HTMLRewriter.transform()が誤って「The parser has stopped.」エラーを投げる回帰を修正しました。- 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型なのにContent-Typeヘッダーを上書きしたRequestまたはResponseを作ろうとすると、警告を出すようになりました。そうした本文は受信側で解析できません。
今週の新機能:
- Cache API 利用時に投げられ得た一部の「internal errors」が、人が読めるエラーメッセージで報告されるようになりました。たとえば、
caches.default.match("not a URL")は TypeError を投げます。
過去 2 週間の新機能:
- ダッシュボードのプレビューで、新しく起動した Worker の最初の数リクエストに対して CPU 時間制限が緩すぎたバグを修正しました。同じバグは本番にもありますが、本番での修正はライブサイトを壊す可能性があるため、より慎重です。プレビューで CPU 時間上限を超えるようになった場合、本番でも上限を超えており、最初の数リクエストだけ制限が緩いために動いて見える可能性が高いです。そうした Workers は本番でもいずれ失敗します(以前からそうでした)。デプロイ前にプレビューで直すのが最善です。
- V8 のメジャー更新: 8.0 -> 8.1
- 軽微なバグ修正。
過去数週間の変更:
- 同じアカウント内で名前の違う 2 つのスクリプトが同一内容で同じゾーンにデプロイされると、「同じ Worker」として扱われ、同じ isolate とグローバル変数を共有していたバグを修正しました。同じゾーンの 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) に変更しました。
- さらに多くの「internal errors」を、有用なユーザー向けエラーに変換しました。
- 安定性の改善とバグ修正。