🧊

GitHub Pagesでも`SharedArrayBuffer`を使いたい

というのも、簡単には使えないから・・・。

SharedArrayBuffer

SharedArrayBuffer - JavaScript | MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer

某Spectreの絡みでセキュリティ要件が厳しくなって、現世では簡単に使えなくなった。

  • httpsであることはもちろん
  • crossOriginIsolatedなドキュメントである

これらの条件が満たされていないと、SharedArrayBufferを使うことはできない。というか、条件未達の場合SharedArrayBufferがそもそもグローバルに存在しない。

COI: Cross-origin isolated

Window: crossOriginIsolated property - Web APIs | MDN https://developer.mozilla.org/en-US/docs/Web/API/Window/crossOriginIsolated

この条件を満たすためには、HTTPヘッダーを付けてそのドキュメントを配信する必要がある。

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp or credentialless

なので、CloudflareとかNetlifyとか、カスタムヘッダーを自由に付けられる環境なら、まあ大した問題にはならない。 そのまんま_headersに書いてそれを置けばいいので。

GitHub Pagesでは一手間いる

が、GitHub Pagesには、_headersみたいな特別なファイルも、そういうGUIもない。ずっとない。

HTTP Headers (e.g. Content-Security-Policy) on Pages · community · Discussion #54257 https://github.com/orgs/community/discussions/54257

どうする・・・?というところで、救世主としてのこのライブラリ。

gzuidhof/coi-serviceworker: Cross-origin isolation (COOP and COEP) through a service worker for situations in which you can’t control the headers (e.g. GH pages) https://github.com/gzuidhof/coi-serviceworker

使い方は簡単なので割愛するけど、要はServiceWorkerを経由させることで、COI関連のヘッダーを自分で付与してしまおうという、ややハック的なやつ。 (なのでもしかするとなんかハマって動かないパターンもあるかもしれない)

が、シンプルなユースケースでは、問題なく動いてるように見える。

ちなみにこのライブラリは、

  • 単一の.jsファイルになっていながら
  • script要素から読まれる使い方を想定しつつも
  • 自身をServiceWorkerとしてregister()させる

みたいな書き方を実現してて、なかなか興味深かった。

ここでoxc-parserをGitHub Pagesで使うために利用してる。

https://leaysgur.github.io/js-multi-ast-viewer

localhostでの開発の場合は、Viteで簡単にヘッダー追加できるのでそっちで。