RemixでRequestオブジェクトからクライアントのIPアドレスを抜き出すだけの関数

AI要約

Cloudflare Workers移行でremix-utilsが使えなくなったため、X-Forwarded-ForからIPアドレスを取得する関数を自作した話。crypto-jsのnode依存が原因。

最近はCloudflare Workersを触っている。Cloudflare Workersが動いているWorkd(“わーくでぃー”って読む)ランタイムではnode.jsに依存するAPIが利用できない*1ため、一部の関数/ライブラリが使えない。

Repositorygithub.comcloudflare/workerdThe JavaScript / Wasm runtime that powers Cloudflare Workers

今までアクセスしたユーザーのIPアドレスを書きだすにはremix-utilsのgetClientIPAddress(request:Request)関数を利用していたが、ランタイムをnodeからworkedに移行したためremix-utilsが使えなくなり、結果として別の手段を検討する必要が出てきた。理由としては、remix-utilsがcrypt-jsモジュールに依存し、crypto-jsモジュールはnode APIを利用するためである。

External Linkremix.runRemix Utils | Remix Resourcesremix.run

External Linknodejs.orgCrypto | Node.js v22.5.1 Documentationnodejs.org

実装を見ていたら結構簡単にできそうだったので、自分でサクッと書いてみた。

export async function getClientIPAddress(request:Request) {
    const headers = request.headers;
    const ipAddress = headers.get("X-Forwarded-For");
    return ipAddress;
}
import { getClientIPAddress } from '~/modules/session.server';

export async function action({ request } : ActionFunctionArgs) {
  const clientIPAddress = getClientIPAddress(request); 
  // 以下略
}

*1:wrangler.tomlに設定を書き足せば一部使えるが、完全ではない