/*
Wombat.js client-side rewriting engine for web archive replay
Copyright (C) 2014-2025 Webrecorder Software, Rhizome, and Contributors. Released under the GNU Affero General Public License.

This file is part of wombat.js, see https://github.com/webrecorder/wombat.js for the full source
Wombat.js is part of the Webrecorder project (https://github.com/webrecorder)

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
function e(t){if(!(this instanceof e))return new e(t);this.info=t,this.initImportScriptsRewrite(),this.initHTTPOverrides(),this.initClientApisOverride(),this.initCacheApisOverride()}e.prototype.noRewrite=function(e){return!e||0===e.indexOf("blob:")||0===e.indexOf("javascript:")||0===e.indexOf("data:")||0===e.indexOf(this.info.prefix)},e.prototype.isRelURL=function(e){return 0===e.indexOf("/")||!e.startsWith("http:")&&!e.startsWith("https:")},e.prototype.maybeResolveURL=function(e,t){if(!t)return e;try{return new URL(e,t).href}catch(e){}return e},e.prototype.ensureURL=function(e,t){if(!e)return e;var r;switch(typeof e){case"string":r=e;break;case"object":r=e.toString();break;default:return null}return this.noRewrite(r)?null:this.isRelURL(r)?this.maybeResolveURL(r,t):0===r.indexOf(self.location.origin)?this.maybeResolveURL(r.slice(self.location.origin.length),t):r},e.prototype.rewriteURL=function(e){var t=this.ensureURL(e,this.info.originalURL);return t?this.info.prefixMod?this.info.prefixMod+t:t:e},e.prototype.rewriteClientWindowURL=function(e,t){var r=this.ensureURL(e,t?t.url:this.info.originalURL);return r?this.info.prefix?this.info.prefix+"mp_/"+r:r:e},e.prototype.rewriteWSURL=function(e){if(!e)return e;var t=typeof e,r=e;if("object"===t)r=e.toString();else if("string"!==t)return e;if(!r)return r;var i="https://",o=0===this.info.prefix.indexOf(i);return this.info.prefix.replace(o?i:"http://",o?"wss://":"ws://")+"ws_/"+r},e.prototype.rewriteArgs=function(e){for(var t=new Array(e.length),r=0;r<t.length;r++)t[r]=this.rewriteURL(e[r]);return t},e.prototype.rewriteFetchApi=function(e){var t=e;switch(typeof e){case"string":t=this.rewriteURL(e);break;case"object":if(e.url){var r=this.rewriteURL(e.url);r!==e.url&&(t=new Request(r,e))}else e.href&&(t=e.href)}return t},e.prototype.rewriteCacheApi=function(e){var t=e;return"string"==typeof e&&(t=this.rewriteURL(e)),t},e.prototype.initImportScriptsRewrite=function(){if(self.importScripts){var e=this,t=self.importScripts;self.importScripts=function(){var r=e.rewriteArgs(arguments);return t.apply(this,r)}}},e.prototype.initHTTPOverrides=function(){var e,t,r,i=this;if(self.XMLHttpRequest&&self.XMLHttpRequest.prototype&&self.XMLHttpRequest.prototype.open){var o=self.XMLHttpRequest.prototype.open;self.XMLHttpRequest.prototype.open=function(e,t,r,n,s){var p=i.rewriteURL(t),l=!0;null==r||r||(l=!1),o.call(this,e,p,l,n,s),-1===p.indexOf("data:")&&this.setRequestHeader("X-Pywb-Requested-With","XMLHttpRequest")}}if(null!=self.fetch){var n=self.fetch;self.fetch=function(e,t){var r=i.rewriteFetchApi(e),o=t||{};return o.credentials="include",n.call(this,r,o)}}if(self.Request&&self.Request.prototype){var s=self.Request;self.Request=(e=self.Request,function(t,r){var o=r||{},n=i.rewriteFetchApi(t);return o.credentials="include",new e(n,o)}),self.Request.prototype=s.prototype}if(self.Response&&self.Response.prototype){var p=self.Response.prototype.redirect;self.Response.prototype.redirect=function(e,t){var r=i.rewriteUrl(e);return p.call(this,r,t)}}if(self.EventSource&&self.EventSource.prototype){var l=self.EventSource;self.EventSource=(t=self.EventSource,function(e,r){var o=e;return null!=e&&(o=i.rewriteUrl(e)),new t(o,r)}),self.EventSource.prototype=l.prototype,Object.defineProperty(self.EventSource.prototype,"constructor",{value:self.EventSource})}if(self.WebSocket&&self.WebSocket.prototype){var f=self.WebSocket;self.WebSocket=(r=self.WebSocket,function(e,t){var o=e;return null!=e&&(o=i.rewriteWSURL(e)),new r(o,t)}),self.WebSocket.prototype=f.prototype,Object.defineProperty(self.WebSocket.prototype,"constructor",{value:self.WebSocket})}},e.prototype.initClientApisOverride=function(){var e=this;if(self.Clients&&self.Clients.prototype&&self.Clients.prototype.openWindow){var t=self.Clients.prototype.openWindow;self.Clients.prototype.openWindow=function(r){var i=e.rewriteClientWindowURL(r);return t.call(this,i)}}if(self.WindowClient&&self.WindowClient.prototype&&self.WindowClient.prototype.navigate){var r=self.WindowClient.prototype.navigate;self.WindowClient.prototype.navigate=function(t){var i=e.rewriteClientWindowURL(t,this);return r.call(this,i)}}},e.prototype.initCacheApisOverride=function(){var e=this;if(self.CacheStorage&&self.CacheStorage.prototype&&self.CacheStorage.prototype.match){var t=self.CacheStorage.prototype.match;self.CacheStorage.prototype.match=function(r,i){var o=e.rewriteCacheApi(r);return t.call(this,o,i)}}if(self.Cache&&self.Cache.prototype){if(self.Cache.prototype.match){var r=self.Cache.prototype.match;self.Cache.prototype.match=function(t,i){var o=e.rewriteCacheApi(t);return r.call(this,o,i)}}if(self.Cache.prototype.matchAll){var i=self.Cache.prototype.matchAll;self.Cache.prototype.matchAll=function(t,r){var o=e.rewriteCacheApi(t);return i.call(this,o,r)}}if(self.Cache.prototype.add){var o=self.Cache.prototype.add;self.Cache.prototype.add=function(t,r){var i=e.rewriteCacheApi(t);return o.call(this,i,r)}}if(self.Cache.prototype.addAll){var n=self.Cache.prototype.addAll;self.Cache.prototype.addAll=function(t){var r=t;if(Array.isArray(t)){r=new Array(t.length);for(var i=0;i<t.length;i++)r[i]=e.rewriteCacheApi(t[i])}return n.call(this,r)}}if(self.Cache.prototype.put){var s=self.Cache.prototype.put;self.Cache.prototype.put=function(t,r){var i=e.rewriteCacheApi(t);return s.call(this,i,r)}}if(self.Cache.prototype.delete){var p=self.Cache.prototype.delete;self.Cache.prototype.delete=function(t,r){var i=e.rewriteCacheApi(t);return p.call(this,i,r)}}if(self.Cache.prototype.keys){var l=self.Cache.prototype.keys;self.Cache.prototype.keys=function(t,r){var i=e.rewriteCacheApi(t);return l.call(this,i,r)}}}},self.WBWombat=e;
