L. sw.js

1/* Este archivo debe estar colocado en la carpeta raíz del sitio.
2 *
3 * Cualquier cambio en el contenido de este archivo hace que el service
4 * worker se reinstale. */
5
6/**
7 * Cambia el número de la versión cuando cambia el contenido de los
8 * archivos.
9 *
10 * El número a la izquierda del punto (.), en este caso <q>1</q>, se
11 * conoce como número mayor y se cambia cuando se realizan
12 * modificaciones grandes o importantes.
13 *
14 * El número a la derecha del punto (.), en este caso <q>00</q>, se
15 * conoce como número menor y se cambia cuando se realizan
16 * modificaciones menores.
17 */
18const VERSION = "1.00"
19
20/**
21 * Nombre de la carpeta de caché.
22 */
23const CACHE = "sincro"
24
25/**
26 * Archivos requeridos para que la aplicación funcione fuera de línea.
27 */
28const ARCHIVOS = [
29 "agrega.html",
30 "index.html",
31 "modifica.html",
32 "render.js",
33 "error/eliminadoincorrecto.html",
34 "error/errorinterno.html",
35 "error/modificacionincorrecta.html",
36 "error/nojson.html",
37 "error/nombreincorrecto.html",
38 "error/uuidincorrecto.html",
39 "js/configura.js",
40 "js/bd/Bd.js",
41 "js/bd/pasatiempoAgrega.js",
42 "js/bd/pasatiempoBusca.js",
43 "js/bd/pasatiempoConsultaNoEliminados.js",
44 "js/bd/pasatiempoConsultaTodos.js",
45 "js/bd/pasatiempoElimina.js",
46 "js/bd/pasatiempoModifica.js",
47 "js/bd/pasatiemposReemplaza.js",
48 "js/modelo/leePasatiempo.js",
49 "js/modelo/Pasatiempo.js",
50 "js/modelo/validaQueTengaLasPropiedadesDePasatiempo.js",
51 "lib/js/bdConsulta.js",
52 "lib/js/bdEjecuta.js",
53 "lib/js/confirmaEliminar.js",
54 "lib/js/enviaJson.js",
55 "lib/js/invocaServicio.js",
56 "lib/js/JsonResponse.js",
57 "lib/js/muestraError.js",
58 "lib/js/muestraObjeto.js",
59 "lib/js/ProblemDetails.js",
60 "lib/js/registraServiceWorkerSiEsSoportado.js",
61 "/"
62]
63
64// Verifica si el código corre dentro de un service worker.
65if (self instanceof ServiceWorkerGlobalScope) {
66 // Evento al empezar a instalar el servide worker,
67 self.addEventListener("install",
68 (/** @type {ExtendableEvent} */ evt) => {
69 console.log("El service worker se está instalando.")
70 evt.waitUntil(llenaElCache())
71 })
72
73 // Evento al solicitar información a la red.
74 self.addEventListener("fetch", (/** @type {FetchEvent} */ evt) => {
75 if (evt.request.method === "GET") {
76 evt.respondWith(buscaLaRespuestaEnElCache(evt))
77 }
78 })
79
80 // Evento cuando el service worker se vuelve activo.
81 self.addEventListener("activate",
82 () => console.log("El service worker está activo."))
83}
84
85async function llenaElCache() {
86 console.log("Intentando cargar caché:", CACHE, ".")
87 // Borra todos los cachés.
88 const keys = await caches.keys()
89 for (const key of keys) {
90 await caches.delete(key)
91 }
92 // Abre el caché de este service worker.
93 const cache = await caches.open(CACHE)
94 // Carga el listado de ARCHIVOS.
95 await cache.addAll(ARCHIVOS)
96 console.log("Cache cargado:", CACHE, ".")
97 console.log("Versión:", VERSION, ".")
98}
99
100/** @param {FetchEvent} evt */
101async function buscaLaRespuestaEnElCache(evt) {
102 // Abre el caché.
103 const cache = await caches.open(CACHE)
104 const request = evt.request
105 /* Busca la respuesta a la solicitud en el contenido del caché, sin
106 * tomar en cuenta la parte después del símbolo "?" en la URL. */
107 const response = await cache.match(request, { ignoreSearch: true })
108 if (response === undefined) {
109 /* Si no la encuentra, empieza a descargar de la red y devuelve
110 * la promesa. */
111 return fetch(request)
112 } else {
113 // Si la encuentra, devuelve la respuesta encontrada en el caché.
114 return response
115 }
116}
skip_previous skip_next