HTTPバッチストリームリンク
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
unstable_httpBatchStreamLinkは終端リンクであり、個別のtRPC操作を配列としてまとめ、単一のtRPCプロシージャに送信する単一HTTPリクエストにバッチ処理します(httpBatchLinkと同等)。ただし、バッチ内のすべてのレスポンスが準備できるのを待たず、データが利用可能になるとすぐにレスポンスをストリーミングします。
新規APIのためunstable_プレフィックスを付けていますが、安全に利用できます!詳細はこちら
使用方法
使用方法とオプションはすべて
httpBatchLinkと同一です。
プロシージャ内からレスポンスヘッダー(Cookieを含む)を変更/設定する必要がある場合は、代わりにhttpBatchLinkを使用してください!これはunstable_httpBatchStreamLinkがストリーム開始後のヘッダー設定をサポートしていないためです。詳細
httpBatchStreamLinkをインポートしてlinks配列に追加する例:
client/index.tstsimport { createTRPCProxyClient, httpBatchStreamLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCProxyClient<AppRouter>({links: [httpBatchStreamLink({url: 'http://localhost:3000',}),],});
client/index.tstsimport { createTRPCProxyClient, httpBatchStreamLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCProxyClient<AppRouter>({links: [httpBatchStreamLink({url: 'http://localhost:3000',}),],});
その後、すべてのプロシージャをPromise.allで設定することでバッチ処理を活用できます。以下のコードは単一のHTTPリクエストを生成し、サーバー側では単一のデータベースクエリを実行します:
tsconst somePosts = await Promise.all([trpc.post.byId.query(1),trpc.post.byId.query(2),trpc.post.byId.query(3),]);
tsconst somePosts = await Promise.all([trpc.post.byId.query(1),trpc.post.byId.query(2),trpc.post.byId.query(3),]);
ストリーミングモード
⚠️ このリンクは不安定なため、将来変更される可能性があります。
リクエストをバッチ処理する際、通常のhttpBatchLinkはすべてのリクエストが完了するまでレスポンスを送信しません。レスポンスの準備が整い次第すぐに送信したい場合は、代わりにhttpBatchStreamLinkを使用できます。これは長時間実行されるリクエストに有効です。
client/index.tstsimport {createTRPCProxyClient,unstable_httpBatchStreamLink,} from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCProxyClient<AppRouter>({links: [unstable_httpBatchStreamLink({url: 'http://localhost:3000',}),],});
client/index.tstsimport {createTRPCProxyClient,unstable_httpBatchStreamLink,} from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCProxyClient<AppRouter>({links: [unstable_httpBatchStreamLink({url: 'http://localhost:3000',}),],});
通常のhttpBatchLinkと比較して、unstable_httpBatchStreamLinkは以下の動作をします:
-
Trpc-Batch-Mode: streamヘッダー付きでリクエストを送信する -
Transfer-Encoding: chunkedおよびVary: trpc-batch-modeヘッダー付きでレスポンスを送信する -
responseMetaに渡される引数オブジェクトからdataキーを削除する(ストリーミングレスポンスではヘッダーがデータ利用前に送信されるため)
互換性(クライアント側)
ブラウザ
ブラウザサポートはfetchのサポートと同一である必要があります。
Node.js / Deno
ブラウザ以外のランタイムでは、fetch実装がストリーミングをサポートしている必要があります。つまりawait fetch(...)で得られるレスポンスのbodyプロパティがReadableStream<Uint8Array> | NodeJS.ReadableStream型であることを意味し、以下いずれかの条件を満たします:
-
response.body.getReaderがReadableStreamDefaultReader<Uint8Array>オブジェクトを返す関数である -
または
response.bodyがUint8ArrayのBufferである
これにはundici、node-fetch、ネイティブNode.js fetch実装、WebAPI fetch実装(ブラウザ)のサポートが含まれます。
React Native
ストリームの受信にはTextDecoder APIが必要ですが、React Nativeでは利用できません。それでもストリーミングを有効化したい場合は、ポリフィルを使用してhttpBatchStreamLinkのオプションに渡せます:
tsunstable_httpBatchStreamLink({url: 'http://localhost:3000',textDecoder: new TextDecoder(),// ^? textDecoder: { decode: (input: Uint8Array) => string }});
tsunstable_httpBatchStreamLink({url: 'http://localhost:3000',textDecoder: new TextDecoder(),// ^? textDecoder: { decode: (input: Uint8Array) => string }});
互換性(サーバーサイド)
⚠️ AWS Lambdaでは
unstable_httpBatchStreamLinkはサポートされません(通常のhttpBatchLinkと同様に動作します)。有効化しても問題は発生しませんが、効果はありません。
⚠️ Cloudflare Workersでは、
ReadableStreamAPIを機能フラグstreams_enable_constructorsを通じて有効にする必要があります。
参考
このリンクのソースコードはGitHubで確認できます。