1/* eslint-disable */ 2/* tslint:disable */ 3 4/** 5 * Mock Service Worker. 6 * @see https://github.com/mswjs/msw 7 * - Please do NOT modify this file. 8 */ 9 10const PACKAGE_VERSION = '2.14.6' 11const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' 12const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') 13const activeClientIds = new Set() 14 15addEventListener('install', function () { 16 self.skipWaiting() 17}) 18 19addEventListener('activate', function (event) { 20 event.waitUntil(self.clients.claim()) 21}) 22 23addEventListener('message', async function (event) { 24 const clientId = Reflect.get(event.source || {}, 'id') 25 26 if (!clientId || !self.clients) { 27 return 28 } 29 30 const client = await self.clients.get(clientId) 31 32 if (!client) { 33 return 34 } 35 36 const allClients = await self.clients.matchAll({ 37 type: 'window', 38 }) 39 40 switch (event.data) { 41 case 'KEEPALIVE_REQUEST': { 42 sendToClient(client, { 43 type: 'KEEPALIVE_RESPONSE', 44 }) 45 break 46 } 47 48 case 'INTEGRITY_CHECK_REQUEST': { 49 sendToClient(client, { 50 type: 'INTEGRITY_CHECK_RESPONSE', 51 payload: { 52 packageVersion: PACKAGE_VERSION, 53 checksum: INTEGRITY_CHECKSUM, 54 }, 55 }) 56 break 57 } 58 59 case 'MOCK_ACTIVATE': { 60 activeClientIds.add(clientId) 61 62 sendToClient(client, { 63 type: 'MOCKING_ENABLED', 64 payload: { 65 client: { 66 id: client.id, 67 frameType: client.frameType, 68 }, 69 }, 70 }) 71 break 72 } 73 74 case 'CLIENT_CLOSED': { 75 activeClientIds.delete(clientId) 76 77 const remainingClients = allClients.filter((client) => { 78 return client.id !== clientId 79 }) 80 81 // Unregister itself when there are no more clients 82 if (remainingClients.length === 0) { 83 self.registration.unregister() 84 } 85 86 break 87 } 88 } 89}) 90 91addEventListener('fetch', function (event) { 92 const requestInterceptedAt = Date.now() 93 94 // Bypass navigation requests. 95 if (event.request.mode === 'navigate') { 96 return 97 } 98 99 // Opening the DevTools triggers the "only-if-cached" request 100 // that cannot be handled by the worker. Bypass such requests. 101 if ( 102 event.request.cache === 'only-if-cached' && 103 event.request.mode !== 'same-origin' 104 ) { 105 return 106 } 107 108 // Bypass all requests when there are no active clients. 109 // Prevents the self-unregistered worked from handling requests 110 // after it's been terminated (still remains active until the next reload). 111 if (activeClientIds.size === 0) { 112 return 113 } 114 115 const requestId = crypto.randomUUID() 116 event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) 117}) 118 119/** 120 * @param {FetchEvent} event 121 * @param {string} requestId 122 * @param {number} requestInterceptedAt 123 */ 124async function handleRequest(event, requestId, requestInterceptedAt) { 125 const client = await resolveMainClient(event) 126 const requestCloneForEvents = event.request.clone() 127 const response = await getResponse( 128 event, 129 client, 130 requestId, 131 requestInterceptedAt, 132 ) 133 134 // Send back the response clone for the "response:*" life-cycle events. 135 // Ensure MSW is active and ready to handle the message, otherwise 136 // this message will pend indefinitely. 137 if (client && activeClientIds.has(client.id)) { 138 const serializedRequest = await serializeRequest(requestCloneForEvents) 139 140 // Clone the response so both the client and the library could consume it. 141 const responseClone = response.clone() 142 143 sendToClient( 144 client, 145 { 146 type: 'RESPONSE', 147 payload: { 148 isMockedResponse: IS_MOCKED_RESPONSE in response, 149 request: { 150 id: requestId, 151 ...serializedRequest, 152 }, 153 response: { 154 type: responseClone.type, 155 status: responseClone.status, 156 statusText: responseClone.statusText, 157 headers: Object.fromEntries(responseClone.headers.entries()), 158 body: responseClone.body, 159 }, 160 }, 161 }, 162 responseClone.body ? [serializedRequest.body, responseClone.body] : [], 163 ) 164 } 165 166 return response 167} 168 169/** 170 * Resolve the main client for the given event. 171 * Client that issues a request doesn't necessarily equal the client 172 * that registered the worker. It's with the latter the worker should 173 * communicate with during the response resolving phase. 174 * @param {FetchEvent} event 175 * @returns {Promise<Client | undefined>} 176 */ 177async function resolveMainClient(event) { 178 const client = await self.clients.get(event.clientId) 179 180 if (activeClientIds.has(event.clientId)) { 181 return client 182 } 183 184 if (client?.frameType === 'top-level') { 185 return client 186 } 187 188 const allClients = await self.clients.matchAll({ 189 type: 'window', 190 }) 191 192 return allClients 193 .filter((client) => { 194 // Get only those clients that are currently visible. 195 return client.visibilityState === 'visible' 196 }) 197 .find((client) => { 198 // Find the client ID that's recorded in the 199 // set of clients that have registered the worker. 200 return activeClientIds.has(client.id) 201 }) 202} 203 204/** 205 * @param {FetchEvent} event 206 * @param {Client | undefined} client 207 * @param {string} requestId 208 * @param {number} requestInterceptedAt 209 * @returns {Promise<Response>} 210 */ 211async function getResponse(event, client, requestId, requestInterceptedAt) { 212 // Clone the request because it might've been already used 213 // (i.e. its body has been read and sent to the client). 214 const requestClone = event.request.clone() 215 216 function passthrough() { 217 // Cast the request headers to a new Headers instance 218 // so the headers can be manipulated with. 219 const headers = new Headers(requestClone.headers) 220 221 // Remove the "accept" header value that marked this request as passthrough. 222 // This prevents request alteration and also keeps it compliant with the 223 // user-defined CORS policies. 224 const acceptHeader = headers.get('accept') 225 if (acceptHeader) { 226 const values = acceptHeader.split(',').map((value) => value.trim()) 227 const filteredValues = values.filter( 228 (value) => value !== 'msw/passthrough', 229 ) 230 231 if (filteredValues.length > 0) { 232 headers.set('accept', filteredValues.join(', ')) 233 } else { 234 headers.delete('accept') 235 } 236 } 237 238 return fetch(requestClone, { headers }) 239 } 240 241 // Bypass mocking when the client is not active. 242 if (!client) { 243 return passthrough() 244 } 245 246 // Bypass initial page load requests (i.e. static assets). 247 // The absence of the immediate/parent client in the map of the active clients 248 // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet 249 // and is not ready to handle requests. 250 if (!activeClientIds.has(client.id)) { 251 return passthrough() 252 } 253 254 // Notify the client that a request has been intercepted. 255 const serializedRequest = await serializeRequest(event.request) 256 const clientMessage = await sendToClient( 257 client, 258 { 259 type: 'REQUEST', 260 payload: { 261 id: requestId, 262 interceptedAt: requestInterceptedAt, 263 ...serializedRequest, 264 }, 265 }, 266 [serializedRequest.body], 267 ) 268 269 switch (clientMessage.type) { 270 case 'MOCK_RESPONSE': { 271 return respondWithMock(clientMessage.data) 272 } 273 274 case 'PASSTHROUGH': { 275 return passthrough() 276 } 277 } 278 279 return passthrough() 280} 281 282/** 283 * @param {Client} client 284 * @param {any} message 285 * @param {Array<Transferable>} transferrables 286 * @returns {Promise<any>} 287 */ 288function sendToClient(client, message, transferrables = []) { 289 return new Promise((resolve, reject) => { 290 const channel = new MessageChannel() 291 292 channel.port1.onmessage = (event) => { 293 if (event.data && event.data.error) { 294 return reject(event.data.error) 295 } 296 297 resolve(event.data) 298 } 299 300 client.postMessage(message, [ 301 channel.port2,
302 ...transferrables.filter(Boolean), 303 ]) 304 }) 305} 306 307/** 308 * @param {Response} response 309 * @returns {Response} 310 */ 311function respondWithMock(response) { 312 // Setting response status code to 0 is a no-op. 313 // However, when responding with a "Response.error()", the produced Response 314 // instance will have status code set to 0. Since it's not possible to create 315 // a Response instance with status code 0, handle that use-case separately. 316 if (response.status === 0) { 317 return Response.error() 318 } 319 320 const mockedResponse = new Response(response.body, response) 321 322 Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { 323 value: true, 324 enumerable: true, 325 }) 326 327 return mockedResponse 328} 329 330/** 331 * @param {Request} request 332 */ 333async function serializeRequest(request) { 334 return { 335 url: request.url, 336 mode: request.mode, 337 method: request.method, 338 headers: Object.fromEntries(request.headers.entries()), 339 cache: request.cache, 340 credentials: request.credentials, 341 destination: request.destination, 342 integrity: request.integrity, 343 redirect: request.redirect, 344 referrer: request.referrer, 345 referrerPolicy: request.referrerPolicy, 346 body: await request.arrayBuffer(), 347 keepalive: request.keepalive, 348 } 349}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.