Scoped WordPress instances to support multiple browser tabs #31
Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge. Suggestion cannot be applied right now. Please check back later.
What problem does this PR solve?
Adds support for running WASM WordPress in multiple browser tabs and solves #9.
All WordPress requests are routed through a single service worker shared between all browser tabs. The request lifecycle looks as follows:
It's a back-and-forth conversation between a specific browser tab and the service worker.
Unfortunately, Service workers communicate with tabs using a
BroadcastChannel
– it's a messaging strategy that routes every message to every listener. As a result, each WordPress request was rendered in every tab, often causing unexpected behaviors.How does this PR propose to solve it?
This PR introduces a concept of WordPress
scope
and enables the service worker to post BroadcastChannel messages scoped to specific listeners.Scoping a WordPress instance means installing it at a unique pathname starting with
/scope:<unique number>
. For example:/wp-login.php
would be available athttp://localhost:8778/wp-login.php
/wp-login.php
would be available athttp://localhost:8778/scope:96253/wp-login.php
The scope number is a random and unique number generated by a specific browser tab. The service worker is aware of this concept and will use any
/scope:
found in the request URL to tag all the relatedBroadcastChannel
communication. The WASM workers running in specific browser tabs will then ignore all theBroadcastChannel
communication with an unfamiliarscope
attached.Alternatives considered
scope
feature of ServiceWorker – it led to multiple worker registrations and was hard to reason about.sw.js?tab_id=432
orsw-1.js
– it led to the same problems as relying on thescope
feature.w87953.localhost
– it would require setting up a catch-all DNS domain to even use this project. That's a steep barrier of entry.How to test?
Run
npm run dev
and open the WASM WordPress page in a few different browser tabs. Log in, create pages, play with it, and confirm that each tab behaves as expected. Specifically:Follow-up work
sessionStorage
to preserve the scope across page reloads.