34
.
Available in Chrome 54+ | View on GitHub | Browse Samples
Third-party service providers can deploy foreign fetch service workers to intercept cross-origin requests from any client. For example, a web font provider might want to register a foreign fetch service worker to implement an advanced offline-first strategy for font requests, with a common cache shared amongst all its clients.
A new Link: rel="serviceworker"
response header facilitates
registering these third-party service workers.
Both foreign fetch itself and the Link: rel="serviceworker"
header are part of an
Origin Trial
starting with Chrome 54, and running through March 2017. To test out a foreign
fetch service worker without requiring the third-party service to sign up for
an origin trial token, you can enable
chrome://flags/#enable-experimental-web-platform-features
. (This
is not required to test the demo on this page, which makes a request against
a service that has a valid Origin Trial token.)
You can read about the new functionality in more detail in this post.
34
.
function updateRandom() {
fetch('https://foreign-fetch-demo.appspot.com/random')
.then(response => response.text())
.then(number => ChromeSamples.setStatus(`Your random number is ${number}`));
}
document.querySelector('#random').addEventListener('click', updateRandom);
updateRandom();
// This is the web server implementation for the "random number API".
// It is currently deployed to https://foreign-fetch-demo.appspot.com
const express = require('express');
const app = express();
const SW_JS_FILE = 'foreign-fetch-sw.js';
const MAX_RANDOM_NUMBER = 100;
app.use((req, res, next) => {
res.setHeader('Link', `</${SW_JS_FILE}>; rel="serviceworker"`);
res.setHeader('Access-Control-Allow-Origin', '*');
// To test locally against a service without an Origin Trial token, enable
// chrome://flags/#enable-experimental-web-platform-features
// on all of the Chrome clients used for testing.
// The deployment at https://foreign-fetch-demo.appspot.com has a
// token, so its foreign fetch service worker does not require the flag.
// res.setHeader('Origin-Trial', 'your-token-here');
return next();
});
app.get('/random', (req, res) => {
var randomNumber = Math.round(Math.random() * MAX_RANDOM_NUMBER);
res.send(String(randomNumber));
});
app.get(`/${SW_JS_FILE}`, (req, res) => {
res.sendFile(SW_JS_FILE, {root: '.'});
});
if (module === require.main) {
const server = app.listen(process.env.PORT || 8080, () => {
const port = server.address().port;
console.log(`Server listening on port ${port}`);
});
}
module.exports = app;
// This is deployed to https://foreign-fetch-demo.appspot.com/foreign-fetch-sw.js
self.addEventListener('install', event => {
event.registerForeignFetch({
scopes: ['/random'], // or self.registration.scope to handle everything
origins: ['*'] // or ['https://example.com'] to limit the remote origins
});
});
self.addEventListener('foreignfetch', event => {
event.respondWith(
fetch(event.request) // Try to make a network request
.catch(() => new Response('34')) // Offline? Your random number is 34!
.then(response => {
return {
response,
origin: event.origin // Make this a CORS response
};
})
);
});