28. 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 = "pwamd"
24
25/**
26 * Archivos requeridos para que la aplicación funcione fuera de
27 * línea.
28 */
29const ARCHIVOS = [
30 "ayuda.html",
31 "botones.html",
32 "campos.html",
33 "favicon.ico",
34 "formulario.html",
35 "iconos.html",
36 "index.html",
37 "interruptor.html",
38 "navbar.html",
39 "navtab.html",
40 "navTabFixed.html",
41 "one-line.html",
42 "secundaria.html",
43 "segmentado.html",
44 "select.html",
45 "site.webmanifest",
46 "slider.html",
47 "tarjetas.html",
48 "three-line.html",
49 "two-line.html",
50 "css/estilos.css",
51 "css/tokens.css",
52 "css/transicion_completa.css",
53 "css/transicion_pestanas.css",
54 "img/Escultura_de_coyote.jpeg",
55 "img/icono2048.png",
56 "img/maskable_icon.png",
57 "img/maskable_icon_x128.png",
58 "img/maskable_icon_x192.png",
59 "img/maskable_icon_x384.png",
60 "img/maskable_icon_x48.png",
61 "img/maskable_icon_x512.png",
62 "img/maskable_icon_x72.png",
63 "img/maskable_icon_x96.png",
64 "img/pexels-craig-dennis-3701822.jpg",
65 "img/pexels-creative-workshop-3978352.jpg",
66 "img/pexels-erik-karits-3732453.jpg",
67 "img/pexels-esteban-arango-10226903.jpg",
68 "img/pexels-moises-patrício-10961948.jpg",
69 "img/pexels-ralph-2270848.jpg",
70 "img/pexels-rasmus-svinding-35435.jpg",
71 "img/pexels-steve-397857.jpg",
72 "img/pexels-vadim-b-141496.jpg",
73 "img/screenshot_horizontal.png",
74 "img/screenshot_vertical.png",
75 "js/configura.js",
76 "js/nav-bar.js",
77 "js/nav-drw.js",
78 "js/nav-tab-fixed.js",
79 "js/nav-tab-scrollable.js",
80 "js/registraServiceWorker.js",
81 "lib/css/colors.module.css",
82 "lib/css/elevation.css",
83 "lib/css/material-symbols-outlined.css",
84 "lib/css/md-cards.css",
85 "lib/css/md-fab-primary.css",
86 "lib/css/md-filled-button.css",
87 "lib/css/md-filled-text-field.css",
88 "lib/css/md-list.css",
89 "lib/css/md-menu.css",
90 "lib/css/md-navigation-bar.css",
91 "lib/css/md-outline-button.css",
92 "lib/css/md-ripple.css",
93 "lib/css/md-segmented-button.css",
94 "lib/css/md-slider-field.css",
95 "lib/css/md-standard-icon-button.css",
96 "lib/css/md-switch.css",
97 "lib/css/md-tab.css",
98 "lib/css/md-top-app-bar.css",
99 "lib/css/motion.css",
100 "lib/css/roboto.css",
101 "lib/css/shape.css",
102 "lib/css/state.css",
103 "lib/css/theme.dark.css",
104 "lib/css/theme.light.css",
105 "lib/css/typography.css",
106 "lib/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].codepoints",
107 "lib/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].ttf",
108 "lib/fonts/MaterialSymbolsOutlined[FILL,GRAD,opsz,wght].woff2",
109 "lib/fonts/roboto-v32-latin-regular.woff2",
110 "lib/js/abreElementoHtml.js",
111 "lib/js/cierraElementoHtmo.js",
112 "lib/js/exportaAHtml.js",
113 "lib/js/getAttribute.js",
114 "lib/js/htmlentities.js",
115 "lib/js/muestraError.js",
116 "lib/js/muestraTextoDeAyuda.js",
117 "lib/js/ProblemDetails.js",
118 "lib/js/querySelector.js",
119 "lib/js/resaltaSiEstasEn.js",
120 "lib/js/const/ES_APPLE.js",
121 "lib/js/custom/md-menu-button.js",
122 "lib/js/custom/md-options-menu.js",
123 "lib/js/custom/md-overflow-button.js",
124 "lib/js/custom/md-overflow-menu.js",
125 "lib/js/custom/md-select-menu.js",
126 "lib/js/custom/md-slider-field.js",
127 "lib/js/custom/md-top-app-bar.js",
128 "lib/js/custom/MdNavigationDrawer.js",
129 "ungap/custom-elements.js",
130 "/"
131]
132
133// Verifica si el código corre dentro de un service worker.
134if (self instanceof ServiceWorkerGlobalScope) {
135 // Evento al empezar a instalar el servide worker,
136 self.addEventListener("install",
137 (/** @type {ExtendableEvent} */ evt) => {
138 console.log("El service worker se está instalando.")
139 evt.waitUntil(llenaElCache())
140 })
141
142 // Evento al solicitar información a la red.
143 self.addEventListener("fetch", (/** @type {FetchEvent} */ evt) => {
144 if (evt.request.method === "GET") {
145 evt.respondWith(buscaLaRespuestaEnElCache(evt))
146 }
147 })
148
149 // Evento cuando el service worker se vuelve activo.
150 self.addEventListener("activate",
151 () => console.log("El service worker está activo."))
152}
153
154async function llenaElCache() {
155 console.log("Intentando cargar caché:", CACHE)
156 // Borra todos los cachés.
157 const keys = await caches.keys()
158 for (const key of keys) {
159 await caches.delete(key)
160 }
161 // Abre el caché de este service worker.
162 const cache = await caches.open(CACHE)
163 // Carga el listado de ARCHIVOS.
164 await cache.addAll(ARCHIVOS)
165 console.log("Cache cargado:", CACHE)
166 console.log("Versión:", VERSION)
167}
168
169/** @param {FetchEvent} evt */
170async function buscaLaRespuestaEnElCache(evt) {
171 // Abre el caché.
172 const cache = await caches.open(CACHE)
173 const request = evt.request
174 /* Busca la respuesta a la solicitud en el contenido del caché, sin
175 * tomar en cuenta la parte después del símbolo "?" en la URL. */
176 const response = await cache.match(request, { ignoreSearch: true })
177 if (response === undefined) {
178 /* Si no la encuentra, empieza a descargar de la red y devuelve
179 * la promesa. */
180 return fetch(request)
181 } else {
182 // Si la encuentra, devuelve la respuesta encontrada en el caché.
183 return response
184 }
185}
skip_previous skip_next