roxxie-proxy-u-prod 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +123 -0
- package/SOURCE.md +29 -0
- package/THIRD_PARTY_NOTICES.md +24 -0
- package/dist/assets/filters-Bu_3nHVy.bin +0 -0
- package/dist/assets/index-BdRlQ7d_.css +1 -0
- package/dist/assets/index-DcvPYWS3.js +3621 -0
- package/dist/assets/inject-BnVzMVpl.js +40 -0
- package/dist/assets/scramjet-C9HLwI-y.wasm +0 -0
- package/dist/defaultfavicon.png +0 -0
- package/dist/icon.png +0 -0
- package/dist/roxxie-icon.svg +12 -0
- package/embed.js +70 -0
- package/examples/single-page.html +25 -0
- package/package.json +42 -0
- package/runtime/controller.sw.js +273 -0
- package/runtime/index.html +18 -0
- package/runtime/localcontrollersw.js +7 -0
- package/runtime/roxxie-network.json +13 -0
- package/runtime/sw.js +6 -0
- package/scripts/build.mjs +344 -0
- package/scripts/smoke.mjs +123 -0
- package/scripts/verify.mjs +122 -0
- package/source/external/dreamlandjs/LICENSE +21 -0
- package/source/external/dreamlandjs/README.md +22 -0
- package/source/external/dreamlandjs/dist/core.d.ts +167 -0
- package/source/external/dreamlandjs/dist/core.js +2 -0
- package/source/external/dreamlandjs/dist/core.js.map +1 -0
- package/source/external/dreamlandjs/dist/core.size.html +4950 -0
- package/source/external/dreamlandjs/dist/js-runtime.d.ts +3 -0
- package/source/external/dreamlandjs/dist/js-runtime.js +2 -0
- package/source/external/dreamlandjs/dist/js-runtime.js.map +1 -0
- package/source/external/dreamlandjs/dist/jsx-runtime.d.ts +1 -0
- package/source/external/dreamlandjs/dist/jsx-runtime.js +2 -0
- package/source/external/dreamlandjs/dist/jsx-runtime.js.map +1 -0
- package/source/external/dreamlandjs/dist/motion.d.ts +19 -0
- package/source/external/dreamlandjs/dist/motion.js +2 -0
- package/source/external/dreamlandjs/dist/motion.js.map +1 -0
- package/source/external/dreamlandjs/dist/router.d.ts +48 -0
- package/source/external/dreamlandjs/dist/router.js +2 -0
- package/source/external/dreamlandjs/dist/router.js.map +1 -0
- package/source/external/dreamlandjs/dist/ssr.client.d.ts +3 -0
- package/source/external/dreamlandjs/dist/ssr.client.js +2 -0
- package/source/external/dreamlandjs/dist/ssr.client.js.map +1 -0
- package/source/external/dreamlandjs/dist/ssr.client.size.html +4950 -0
- package/source/external/dreamlandjs/dist/ssr.hybrid.d.ts +7 -0
- package/source/external/dreamlandjs/dist/ssr.hybrid.js +2 -0
- package/source/external/dreamlandjs/dist/ssr.hybrid.js.map +1 -0
- package/source/external/dreamlandjs/dist/ssr.hybrid.size.html +4950 -0
- package/source/external/dreamlandjs/dist/ssr.server.d.ts +11 -0
- package/source/external/dreamlandjs/dist/ssr.server.js +2373 -0
- package/source/external/dreamlandjs/dist/ssr.server.js.map +1 -0
- package/source/external/dreamlandjs/dist/types/core/consts.d.ts +16 -0
- package/source/external/dreamlandjs/dist/types/core/css/index.d.ts +11 -0
- package/source/external/dreamlandjs/dist/types/core/css/selectorParser.d.ts +50 -0
- package/source/external/dreamlandjs/dist/types/core/delegate.d.ts +10 -0
- package/source/external/dreamlandjs/dist/types/core/index.d.ts +9 -0
- package/source/external/dreamlandjs/dist/types/core/jsx/child.d.ts +2 -0
- package/source/external/dreamlandjs/dist/types/core/jsx/definitions.d.ts +76 -0
- package/source/external/dreamlandjs/dist/types/core/jsx/dom.d.ts +28 -0
- package/source/external/dreamlandjs/dist/types/core/jsx/index.d.ts +14 -0
- package/source/external/dreamlandjs/dist/types/core/state/index.d.ts +1 -0
- package/source/external/dreamlandjs/dist/types/core/state/pointers.d.ts +37 -0
- package/source/external/dreamlandjs/dist/types/core/state/state.d.ts +13 -0
- package/source/external/dreamlandjs/dist/types/core/state/use.d.ts +11 -0
- package/source/external/dreamlandjs/dist/types/core/utils.d.ts +4 -0
- package/source/external/dreamlandjs/dist/types/js-runtime/index.d.ts +1 -0
- package/source/external/dreamlandjs/dist/types/jsx-runtime/index.d.ts +2 -0
- package/source/external/dreamlandjs/dist/types/motion/index.d.ts +15 -0
- package/source/external/dreamlandjs/dist/types/router/index.d.ts +45 -0
- package/source/external/dreamlandjs/dist/types/ssr/client/index.d.ts +1 -0
- package/source/external/dreamlandjs/dist/types/ssr/common/consts.d.ts +4 -0
- package/source/external/dreamlandjs/dist/types/ssr/common/serialize.d.ts +4 -0
- package/source/external/dreamlandjs/dist/types/ssr/common/types.d.ts +21 -0
- package/source/external/dreamlandjs/dist/types/ssr/hybrid/index.d.ts +4 -0
- package/source/external/dreamlandjs/dist/types/ssr/server/index.d.ts +7 -0
- package/source/external/dreamlandjs/dist/types/ssr/server/vdom.d.ts +71 -0
- package/source/external/dreamlandjs/dist/types/util/index.d.ts +1 -0
- package/source/external/dreamlandjs/dist/types/util/store.d.ts +26 -0
- package/source/external/dreamlandjs/dist/types/vite/css-minifier.d.ts +7 -0
- package/source/external/dreamlandjs/dist/types/vite/index.d.ts +11 -0
- package/source/external/dreamlandjs/dist/util.d.ts +29 -0
- package/source/external/dreamlandjs/dist/util.js +2 -0
- package/source/external/dreamlandjs/dist/util.js.map +1 -0
- package/source/external/dreamlandjs/dist/vite.d.ts +19 -0
- package/source/external/dreamlandjs/dist/vite.js +2 -0
- package/source/external/dreamlandjs/dist/vite.js.map +1 -0
- package/source/external/dreamlandjs/package.json +101 -0
- package/source/external/dreamlandjs/rollup.config.ts +302 -0
- package/source/external/dreamlandjs/rollup.plugins.ts +1134 -0
- package/source/external/dreamlandjs/src/core/consts.d.ts +16 -0
- package/source/external/dreamlandjs/src/core/consts.js +18 -0
- package/source/external/dreamlandjs/src/core/css/index.ts +111 -0
- package/source/external/dreamlandjs/src/core/css/selectorParser.ts +313 -0
- package/source/external/dreamlandjs/src/core/delegate.ts +28 -0
- package/source/external/dreamlandjs/src/core/index.ts +31 -0
- package/source/external/dreamlandjs/src/core/jsx/child.ts +91 -0
- package/source/external/dreamlandjs/src/core/jsx/definitions.ts +125 -0
- package/source/external/dreamlandjs/src/core/jsx/dom.ts +49 -0
- package/source/external/dreamlandjs/src/core/jsx/index.ts +289 -0
- package/source/external/dreamlandjs/src/core/state/index.ts +1 -0
- package/source/external/dreamlandjs/src/core/state/pointers.ts +310 -0
- package/source/external/dreamlandjs/src/core/state/state.ts +112 -0
- package/source/external/dreamlandjs/src/core/state/use.ts +82 -0
- package/source/external/dreamlandjs/src/core/utils.ts +48 -0
- package/source/external/dreamlandjs/src/js-runtime/index.ts +4 -0
- package/source/external/dreamlandjs/src/jsx-runtime/index.ts +3 -0
- package/source/external/dreamlandjs/src/motion/index.ts +156 -0
- package/source/external/dreamlandjs/src/router/index.tsx +394 -0
- package/source/external/dreamlandjs/src/router/tsconfig.json +9 -0
- package/source/external/dreamlandjs/src/ssr/client/index.ts +193 -0
- package/source/external/dreamlandjs/src/ssr/common/consts.ts +5 -0
- package/source/external/dreamlandjs/src/ssr/common/serialize.ts +115 -0
- package/source/external/dreamlandjs/src/ssr/common/types.ts +28 -0
- package/source/external/dreamlandjs/src/ssr/hybrid/index.ts +144 -0
- package/source/external/dreamlandjs/src/ssr/server/index.ts +157 -0
- package/source/external/dreamlandjs/src/ssr/server/tsconfig.json +7 -0
- package/source/external/dreamlandjs/src/ssr/server/vdom.ts +285 -0
- package/source/external/dreamlandjs/src/util/index.ts +10 -0
- package/source/external/dreamlandjs/src/util/store.ts +134 -0
- package/source/external/dreamlandjs/src/vite/css-minifier.ts +222 -0
- package/source/external/dreamlandjs/src/vite/index.ts +60 -0
- package/source/external/dreamlandjs/src/vite/tsconfig.json +7 -0
- package/source/external/dreamlandjs/tsconfig.json +15 -0
- package/source/package.json +48 -0
- package/source/packages/adrift-protocol/package.json +31 -0
- package/source/packages/adrift-protocol/src/index.ts +348 -0
- package/source/packages/adrift-protocol/tsconfig.json +18 -0
- package/source/packages/cdp/LICENSE +21 -0
- package/source/packages/cdp/README.md +47 -0
- package/source/packages/cdp/dist/chobitsu.js +2 -0
- package/source/packages/cdp/dist/chobitsu.js.map +1 -0
- package/source/packages/cdp/package.json +73 -0
- package/source/packages/cdp/script/build.js +15 -0
- package/source/packages/cdp/src/Chobitsu.ts +110 -0
- package/source/packages/cdp/src/domains/CSS.ts +378 -0
- package/source/packages/cdp/src/domains/CacheStorage.ts +8 -0
- package/source/packages/cdp/src/domains/DOM.ts +487 -0
- package/source/packages/cdp/src/domains/DOMDebugger.ts +109 -0
- package/source/packages/cdp/src/domains/DOMStorage.ts +122 -0
- package/source/packages/cdp/src/domains/Debugger.ts +25 -0
- package/source/packages/cdp/src/domains/IndexedDB.ts +207 -0
- package/source/packages/cdp/src/domains/Input.ts +177 -0
- package/source/packages/cdp/src/domains/Network.ts +251 -0
- package/source/packages/cdp/src/domains/Overlay.ts +230 -0
- package/source/packages/cdp/src/domains/Page.ts +296 -0
- package/source/packages/cdp/src/domains/Runtime.ts +273 -0
- package/source/packages/cdp/src/domains/Storage.ts +71 -0
- package/source/packages/cdp/src/index.d.ts +8 -0
- package/source/packages/cdp/src/index.ts +153 -0
- package/source/packages/cdp/src/lib/connector.ts +15 -0
- package/source/packages/cdp/src/lib/constants.ts +1 -0
- package/source/packages/cdp/src/lib/evaluate.ts +59 -0
- package/source/packages/cdp/src/lib/mutationObserver.ts +39 -0
- package/source/packages/cdp/src/lib/nodeManager.ts +142 -0
- package/source/packages/cdp/src/lib/objManager.ts +422 -0
- package/source/packages/cdp/src/lib/request.ts +313 -0
- package/source/packages/cdp/src/lib/resources.ts +59 -0
- package/source/packages/cdp/src/lib/scriptMananger.ts +62 -0
- package/source/packages/cdp/src/lib/stylesheet.ts +146 -0
- package/source/packages/cdp/src/lib/util.ts +105 -0
- package/source/packages/cdp/tsconfig.json +16 -0
- package/source/packages/cdp/webpack.config.js +48 -0
- package/source/packages/chrome/index.html +17 -0
- package/source/packages/chrome/package.json +41 -0
- package/source/packages/chrome/public/ROXXIE_NETWORK.md +22 -0
- package/source/packages/chrome/public/controller.sw.js +273 -0
- package/source/packages/chrome/public/defaultfavicon.png +0 -0
- package/source/packages/chrome/public/icon.png +0 -0
- package/source/packages/chrome/public/localcontrollersw.js +7 -0
- package/source/packages/chrome/public/roxxie-icon.svg +12 -0
- package/source/packages/chrome/public/roxxie-network.json +13 -0
- package/source/packages/chrome/public/sw.js +6 -0
- package/source/packages/chrome/src/App.tsx +269 -0
- package/source/packages/chrome/src/CDP.ts +285 -0
- package/source/packages/chrome/src/Tab/History.ts +186 -0
- package/source/packages/chrome/src/Tab/Tab.tsx +219 -0
- package/source/packages/chrome/src/Tab/screenshot.ts +66 -0
- package/source/packages/chrome/src/Tab/serialize.ts +221 -0
- package/source/packages/chrome/src/adblock/AdBlockPlugin.test.ts +159 -0
- package/source/packages/chrome/src/adblock/AdBlockPlugin.ts +232 -0
- package/source/packages/chrome/src/adblock/AdBlockService.test.ts +148 -0
- package/source/packages/chrome/src/adblock/AdBlockService.ts +166 -0
- package/source/packages/chrome/src/adblock/NOTICE.md +14 -0
- package/source/packages/chrome/src/adblock/assets/filters.bin +0 -0
- package/source/packages/chrome/src/adblock/index.ts +18 -0
- package/source/packages/chrome/src/assets/favicon.ts +4 -0
- package/source/packages/chrome/src/components/BookmarkPopup.tsx +101 -0
- package/source/packages/chrome/src/components/BookmarksStrip.tsx +150 -0
- package/source/packages/chrome/src/components/Button.tsx +99 -0
- package/source/packages/chrome/src/components/Checkbox.tsx +89 -0
- package/source/packages/chrome/src/components/DownloadsPopup.tsx +230 -0
- package/source/packages/chrome/src/components/Favicon.tsx +65 -0
- package/source/packages/chrome/src/components/Icon.tsx +29 -0
- package/source/packages/chrome/src/components/Input.tsx +82 -0
- package/source/packages/chrome/src/components/Menu.tsx +287 -0
- package/source/packages/chrome/src/components/Omnibar/BookmarkButton.tsx +73 -0
- package/source/packages/chrome/src/components/Omnibar/CircularProgress.tsx +83 -0
- package/source/packages/chrome/src/components/Omnibar/Omnibar.tsx +455 -0
- package/source/packages/chrome/src/components/Omnibar/OmnibarButton.tsx +48 -0
- package/source/packages/chrome/src/components/Omnibar/Omnibox.tsx +466 -0
- package/source/packages/chrome/src/components/Omnibar/SiteOptionsButton.tsx +52 -0
- package/source/packages/chrome/src/components/Omnibar/Suggestion.tsx +186 -0
- package/source/packages/chrome/src/components/Omnibar/UrlInput.tsx +198 -0
- package/source/packages/chrome/src/components/Omnibar/suggestions.ts +468 -0
- package/source/packages/chrome/src/components/Omnibar/utils.ts +11 -0
- package/source/packages/chrome/src/components/ReportBrokenSiteModal.tsx +279 -0
- package/source/packages/chrome/src/components/Shell.tsx +191 -0
- package/source/packages/chrome/src/components/SiteInformationPopup.tsx +96 -0
- package/source/packages/chrome/src/components/SmallIconButton.tsx +36 -0
- package/source/packages/chrome/src/components/StartScreen.tsx +386 -0
- package/source/packages/chrome/src/components/TabStrip/DragTab.tsx +546 -0
- package/source/packages/chrome/src/components/TabStrip/Sidebar.tsx +820 -0
- package/source/packages/chrome/src/components/TabStrip/TabHoverCard.tsx +87 -0
- package/source/packages/chrome/src/components/TabStrip/TabStrip.tsx +510 -0
- package/source/packages/chrome/src/components/TopSiteButton.tsx +234 -0
- package/source/packages/chrome/src/consts.ts +3 -0
- package/source/packages/chrome/src/icons.ts +70 -0
- package/source/packages/chrome/src/index.ts +168 -0
- package/source/packages/chrome/src/migrations/0-from-legacy.ts +6 -0
- package/source/packages/chrome/src/migrations/1-vertical-tab-settings.ts +15 -0
- package/source/packages/chrome/src/migrations/index.ts +42 -0
- package/source/packages/chrome/src/pages/AboutPage.tsx +37 -0
- package/source/packages/chrome/src/pages/DownloadsPage.tsx +133 -0
- package/source/packages/chrome/src/pages/HistoryPage.tsx +99 -0
- package/source/packages/chrome/src/pages/NewTabPage.tsx +264 -0
- package/source/packages/chrome/src/pages/PlaygroundPage.tsx +43 -0
- package/source/packages/chrome/src/pages/SettingsPage.tsx +1931 -0
- package/source/packages/chrome/src/proxy/Controller.ts +331 -0
- package/source/packages/chrome/src/proxy/ProxyFrame.ts +26 -0
- package/source/packages/chrome/src/proxy/cache.ts +487 -0
- package/source/packages/chrome/src/proxy/codec.ts +11 -0
- package/source/packages/chrome/src/proxy/contextitems.ts +180 -0
- package/source/packages/chrome/src/proxy/index.ts +5 -0
- package/source/packages/chrome/src/proxy/roxxie.ts +85 -0
- package/source/packages/chrome/src/proxy/scramjet.ts +642 -0
- package/source/packages/chrome/src/reset.css +124 -0
- package/source/packages/chrome/src/runtime-base.ts +16 -0
- package/source/packages/chrome/src/sentry.tsx +45 -0
- package/source/packages/chrome/src/services/DownloadsService.ts +136 -0
- package/source/packages/chrome/src/services/FaviconService.ts +161 -0
- package/source/packages/chrome/src/services/KVWrapper.ts +169 -0
- package/source/packages/chrome/src/services/ProfileService.ts +94 -0
- package/source/packages/chrome/src/services/Service.ts +10 -0
- package/source/packages/chrome/src/services/SettingsService.ts +108 -0
- package/source/packages/chrome/src/services/TabsService.ts +161 -0
- package/source/packages/chrome/src/startup.test.ts +129 -0
- package/source/packages/chrome/src/startup.ts +161 -0
- package/source/packages/chrome/src/style.css +229 -0
- package/source/packages/chrome/src/themes.ts +756 -0
- package/source/packages/chrome/src/util/StatefulClass.ts +31 -0
- package/source/packages/chrome/src/util/index.ts +74 -0
- package/source/packages/chrome/src/util/memoize.ts +13 -0
- package/source/packages/chrome/src/vite-env.d.ts +16 -0
- package/source/packages/chrome/tsconfig.json +30 -0
- package/source/packages/chrome/vite.config.ts +47 -0
- package/source/packages/inject/package.json +20 -0
- package/source/packages/inject/src/context.ts +194 -0
- package/source/packages/inject/src/emulators/alwaysLastBubble.ts +168 -0
- package/source/packages/inject/src/emulators/anchors.ts +55 -0
- package/source/packages/inject/src/emulators/contextmenu.ts +46 -0
- package/source/packages/inject/src/emulators/history.ts +51 -0
- package/source/packages/inject/src/emulators/titlewatcher.ts +42 -0
- package/source/packages/inject/src/emulators/windowopen.ts +134 -0
- package/source/packages/inject/src/errorpage/errorpage.css +234 -0
- package/source/packages/inject/src/errorpage/errorpage.html +29 -0
- package/source/packages/inject/src/errorpage/errorpage.ts +76 -0
- package/source/packages/inject/src/index.ts +62 -0
- package/source/packages/inject/src/transport.ts +97 -0
- package/source/packages/inject/src/types.d.ts +136 -0
- package/source/packages/roxxie-transport/package.json +36 -0
- package/source/packages/roxxie-transport/src/binary.ts +398 -0
- package/source/packages/roxxie-transport/src/config.ts +254 -0
- package/source/packages/roxxie-transport/src/connection.ts +767 -0
- package/source/packages/roxxie-transport/src/index.ts +5 -0
- package/source/packages/roxxie-transport/src/tracker.ts +651 -0
- package/source/packages/roxxie-transport/src/transport.ts +414 -0
- package/source/packages/roxxie-transport/tsconfig.json +18 -0
- package/source/packages/scramjet/packages/controller/package.json +37 -0
- package/source/packages/scramjet/packages/controller/src/index.ts +861 -0
- package/source/packages/scramjet/packages/controller/src/inject.ts +365 -0
- package/source/packages/scramjet/packages/controller/src/sw.ts +231 -0
- package/source/packages/scramjet/packages/controller/src/symbols.ts +1 -0
- package/source/packages/scramjet/packages/controller/src/types.d.ts +140 -0
- package/source/packages/scramjet/packages/controller/src/typesEntry.ts +6 -0
- package/source/packages/scramjet/packages/controller/src/version.ts +30 -0
- package/source/packages/scramjet/packages/controller/tsconfig.json +24 -0
- package/source/packages/scramjet/packages/core/dist/scramjet-external.mjs +57 -0
- package/source/packages/scramjet/packages/core/dist/scramjet.js +13599 -0
- package/source/packages/scramjet/packages/core/dist/scramjet.js.map +1 -0
- package/source/packages/scramjet/packages/core/dist/scramjet.mjs +13649 -0
- package/source/packages/scramjet/packages/core/dist/scramjet.mjs.map +1 -0
- package/source/packages/scramjet/packages/core/dist/scramjet.wasm +0 -0
- package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js +13601 -0
- package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js.map +1 -0
- package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs +13651 -0
- package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs.map +1 -0
- package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js +23 -0
- package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js.map +1 -0
- package/source/packages/scramjet/packages/core/dist/types/Tap.d.ts +39 -0
- package/source/packages/scramjet/packages/core/dist/types/client/client.d.ts +115 -0
- package/source/packages/scramjet/packages/core/dist/types/client/entry.d.ts +5 -0
- package/source/packages/scramjet/packages/core/dist/types/client/events.d.ts +10 -0
- package/source/packages/scramjet/packages/core/dist/types/client/helpers.d.ts +1 -0
- package/source/packages/scramjet/packages/core/dist/types/client/index.d.ts +7 -0
- package/source/packages/scramjet/packages/core/dist/types/client/location.d.ts +2 -0
- package/source/packages/scramjet/packages/core/dist/types/client/shared/eval.d.ts +3 -0
- package/source/packages/scramjet/packages/core/dist/types/client/shared/sourcemaps.d.ts +19 -0
- package/source/packages/scramjet/packages/core/dist/types/client/shared/wrap.d.ts +4 -0
- package/source/packages/scramjet/packages/core/dist/types/client/singletonbox.d.ts +18 -0
- package/source/packages/scramjet/packages/core/dist/types/fetch/body.d.ts +3 -0
- package/source/packages/scramjet/packages/core/dist/types/fetch/fetch.d.ts +7 -0
- package/source/packages/scramjet/packages/core/dist/types/fetch/headers.d.ts +19 -0
- package/source/packages/scramjet/packages/core/dist/types/fetch/index.d.ts +128 -0
- package/source/packages/scramjet/packages/core/dist/types/fetch/parse.d.ts +23 -0
- package/source/packages/scramjet/packages/core/dist/types/fetch/util.d.ts +7 -0
- package/source/packages/scramjet/packages/core/dist/types/index.d.ts +12 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/cookie.d.ts +26 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/headers.d.ts +13 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/htmlRules.d.ts +6 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/index.d.ts +50 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/mime.d.ts +53 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/refresh.d.ts +7 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/css.d.ts +4 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/html.d.ts +33 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/index.d.ts +6 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/js.d.ts +11 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/url.d.ts +24 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/wasm.d.ts +7 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/worker.d.ts +3 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/set-cookie-parser.d.ts +20 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/snapshot.d.ts +186 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/sniffEncoding.d.ts +65 -0
- package/source/packages/scramjet/packages/core/dist/types/shared/util.d.ts +2 -0
- package/source/packages/scramjet/packages/core/dist/types/symbols.d.ts +6 -0
- package/source/packages/scramjet/packages/core/dist/types/types.d.ts +60 -0
- package/source/packages/scramjet/packages/core/dist/types/typesEntry.d.ts +5 -0
- package/source/packages/scramjet/packages/core/lib/index.cjs +7 -0
- package/source/packages/scramjet/packages/core/lib/index.d.ts +8 -0
- package/source/packages/scramjet/packages/core/package.json +69 -0
- package/source/packages/scramjet/packages/core/rewriter/Cargo.lock +1985 -0
- package/source/packages/scramjet/packages/core/rewriter/Cargo.toml +20 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/Cargo.toml +15 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/analyze.rs +1118 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/ast_table.rs +927 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/helper_index.rs +556 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/lib.rs +455 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/reachability.rs +85 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/templates.rs +192 -0
- package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/witness.rs +597 -0
- package/source/packages/scramjet/packages/core/rewriter/js/Cargo.toml +18 -0
- package/source/packages/scramjet/packages/core/rewriter/js/src/cfg.rs +45 -0
- package/source/packages/scramjet/packages/core/rewriter/js/src/changes.rs +379 -0
- package/source/packages/scramjet/packages/core/rewriter/js/src/lib.rs +171 -0
- package/source/packages/scramjet/packages/core/rewriter/js/src/rewrite.rs +290 -0
- package/source/packages/scramjet/packages/core/rewriter/js/src/visitor.rs +967 -0
- package/source/packages/scramjet/packages/core/rewriter/native/Cargo.toml +22 -0
- package/source/packages/scramjet/packages/core/rewriter/native/src/main.rs +166 -0
- package/source/packages/scramjet/packages/core/rewriter/native/src/rewriter.rs +161 -0
- package/source/packages/scramjet/packages/core/rewriter/native/src/test_runner.rs +156 -0
- package/source/packages/scramjet/packages/core/rewriter/rust-toolchain.toml +5 -0
- package/source/packages/scramjet/packages/core/rewriter/rustfmt.toml +2 -0
- package/source/packages/scramjet/packages/core/rewriter/transform/Cargo.toml +16 -0
- package/source/packages/scramjet/packages/core/rewriter/transform/src/lib.rs +242 -0
- package/source/packages/scramjet/packages/core/rewriter/transform/src/transform.rs +123 -0
- package/source/packages/scramjet/packages/core/rewriter/wasm/Cargo.toml +22 -0
- package/source/packages/scramjet/packages/core/rewriter/wasm/build.sh +128 -0
- package/source/packages/scramjet/packages/core/rewriter/wasm/src/error.rs +56 -0
- package/source/packages/scramjet/packages/core/rewriter/wasm/src/jsr.rs +125 -0
- package/source/packages/scramjet/packages/core/rewriter/wasm/src/lib.rs +144 -0
- package/source/packages/scramjet/packages/core/src/Tap.ts +166 -0
- package/source/packages/scramjet/packages/core/src/client/client.ts +916 -0
- package/source/packages/scramjet/packages/core/src/client/dom/attr.ts +94 -0
- package/source/packages/scramjet/packages/core/src/client/dom/beacon.ts +11 -0
- package/source/packages/scramjet/packages/core/src/client/dom/cookie.ts +21 -0
- package/source/packages/scramjet/packages/core/src/client/dom/css.ts +106 -0
- package/source/packages/scramjet/packages/core/src/client/dom/document.ts +140 -0
- package/source/packages/scramjet/packages/core/src/client/dom/element.ts +783 -0
- package/source/packages/scramjet/packages/core/src/client/dom/fontface.ts +11 -0
- package/source/packages/scramjet/packages/core/src/client/dom/fragments.ts +32 -0
- package/source/packages/scramjet/packages/core/src/client/dom/history.ts +35 -0
- package/source/packages/scramjet/packages/core/src/client/dom/open.ts +59 -0
- package/source/packages/scramjet/packages/core/src/client/dom/origin.ts +13 -0
- package/source/packages/scramjet/packages/core/src/client/dom/performance.ts +50 -0
- package/source/packages/scramjet/packages/core/src/client/dom/protocol.ts +17 -0
- package/source/packages/scramjet/packages/core/src/client/dom/storage.ts +107 -0
- package/source/packages/scramjet/packages/core/src/client/entry.ts +12 -0
- package/source/packages/scramjet/packages/core/src/client/events.ts +10 -0
- package/source/packages/scramjet/packages/core/src/client/helpers.ts +7 -0
- package/source/packages/scramjet/packages/core/src/client/index.ts +7 -0
- package/source/packages/scramjet/packages/core/src/client/location.ts +139 -0
- package/source/packages/scramjet/packages/core/src/client/shared/antiantidebugger.ts +20 -0
- package/source/packages/scramjet/packages/core/src/client/shared/blob.ts +35 -0
- package/source/packages/scramjet/packages/core/src/client/shared/caches.ts +31 -0
- package/source/packages/scramjet/packages/core/src/client/shared/chrome.ts +90 -0
- package/source/packages/scramjet/packages/core/src/client/shared/err.ts +55 -0
- package/source/packages/scramjet/packages/core/src/client/shared/error.ts +42 -0
- package/source/packages/scramjet/packages/core/src/client/shared/eval.ts +40 -0
- package/source/packages/scramjet/packages/core/src/client/shared/event.ts +215 -0
- package/source/packages/scramjet/packages/core/src/client/shared/function.ts +59 -0
- package/source/packages/scramjet/packages/core/src/client/shared/import.ts +46 -0
- package/source/packages/scramjet/packages/core/src/client/shared/indexeddb.ts +18 -0
- package/source/packages/scramjet/packages/core/src/client/shared/opfs.ts +27 -0
- package/source/packages/scramjet/packages/core/src/client/shared/postmessage.ts +113 -0
- package/source/packages/scramjet/packages/core/src/client/shared/realm.ts +26 -0
- package/source/packages/scramjet/packages/core/src/client/shared/requests/eventsource.ts +17 -0
- package/source/packages/scramjet/packages/core/src/client/shared/requests/fetch.ts +67 -0
- package/source/packages/scramjet/packages/core/src/client/shared/requests/websocket.ts +389 -0
- package/source/packages/scramjet/packages/core/src/client/shared/requests/xmlhttprequest.ts +163 -0
- package/source/packages/scramjet/packages/core/src/client/shared/settimeout.ts +20 -0
- package/source/packages/scramjet/packages/core/src/client/shared/sourcemaps.ts +203 -0
- package/source/packages/scramjet/packages/core/src/client/shared/worker.ts +72 -0
- package/source/packages/scramjet/packages/core/src/client/shared/wrap.ts +197 -0
- package/source/packages/scramjet/packages/core/src/client/singletonbox.ts +52 -0
- package/source/packages/scramjet/packages/core/src/client/worker/importScripts.ts +13 -0
- package/source/packages/scramjet/packages/core/src/fetch/body.ts +93 -0
- package/source/packages/scramjet/packages/core/src/fetch/fetch.ts +323 -0
- package/source/packages/scramjet/packages/core/src/fetch/headers.ts +528 -0
- package/source/packages/scramjet/packages/core/src/fetch/index.ts +198 -0
- package/source/packages/scramjet/packages/core/src/fetch/parse.ts +149 -0
- package/source/packages/scramjet/packages/core/src/fetch/util.ts +81 -0
- package/source/packages/scramjet/packages/core/src/global.d.ts +32 -0
- package/source/packages/scramjet/packages/core/src/index.ts +78 -0
- package/source/packages/scramjet/packages/core/src/log.ts +117 -0
- package/source/packages/scramjet/packages/core/src/shared/cookie.ts +199 -0
- package/source/packages/scramjet/packages/core/src/shared/headers.ts +76 -0
- package/source/packages/scramjet/packages/core/src/shared/htmlRules.ts +154 -0
- package/source/packages/scramjet/packages/core/src/shared/index.ts +79 -0
- package/source/packages/scramjet/packages/core/src/shared/mime.ts +234 -0
- package/source/packages/scramjet/packages/core/src/shared/refresh.ts +164 -0
- package/source/packages/scramjet/packages/core/src/shared/rewriters/css.ts +67 -0
- package/source/packages/scramjet/packages/core/src/shared/rewriters/html.ts +603 -0
- package/source/packages/scramjet/packages/core/src/shared/rewriters/index.ts +6 -0
- package/source/packages/scramjet/packages/core/src/shared/rewriters/js.ts +158 -0
- package/source/packages/scramjet/packages/core/src/shared/rewriters/url.ts +248 -0
- package/source/packages/scramjet/packages/core/src/shared/rewriters/wasm.ts +58 -0
- package/source/packages/scramjet/packages/core/src/shared/rewriters/worker.ts +37 -0
- package/source/packages/scramjet/packages/core/src/shared/set-cookie-parser.ts +195 -0
- package/source/packages/scramjet/packages/core/src/shared/snapshot.ts +245 -0
- package/source/packages/scramjet/packages/core/src/shared/sniffEncoding.ts +1061 -0
- package/source/packages/scramjet/packages/core/src/shared/util.ts +35 -0
- package/source/packages/scramjet/packages/core/src/symbols.ts +9 -0
- package/source/packages/scramjet/packages/core/src/sync.ts +63 -0
- package/source/packages/scramjet/packages/core/src/types.ts +66 -0
- package/source/packages/scramjet/packages/core/src/typesEntry.ts +6 -0
- package/source/packages/scramjet/packages/core/tsconfig.json +21 -0
- package/source/packages/scramjet/packages/rpc/index.ts +100 -0
- package/source/packages/scramjet/packages/rpc/package.json +7 -0
- package/source/packages/scramjet/packages/utils/package.json +39 -0
- package/source/packages/scramjet/packages/utils/src/alwaysLastBubble.ts +172 -0
- package/source/packages/scramjet/packages/utils/src/catch-escaped-links.ts +34 -0
- package/source/packages/scramjet/packages/utils/src/event-handler-plugin.ts +86 -0
- package/source/packages/scramjet/packages/utils/src/global.d.ts +8 -0
- package/source/packages/scramjet/packages/utils/src/http-cache-plugin.ts +475 -0
- package/source/packages/scramjet/packages/utils/src/index.ts +26 -0
- package/source/packages/scramjet/packages/utils/src/link-handler-plugin.ts +75 -0
- package/source/packages/scramjet/packages/utils/src/typesEntry.ts +5 -0
- package/source/packages/scramjet/packages/utils/src/url-watcher.ts +37 -0
- package/source/packages/scramjet/packages/utils/src/version.ts +40 -0
- package/source/packages/scramjet/packages/utils/tsconfig.json +11 -0
- package/source/packages/scramjet/patches/htmlparser2@12.0.0.patch +124 -0
- package/source/packages/scramjet/rspack.config.ts +613 -0
- package/source/packages/scramjet/tsconfig.json +11 -0
- package/source/packages/tracker-protocol/package.json +31 -0
- package/source/packages/tracker-protocol/src/index.ts +745 -0
- package/source/packages/tracker-protocol/tsconfig.json +18 -0
- package/source/pnpm-lock.yaml +12018 -0
- package/source/pnpm-workspace.yaml +31 -0
- package/source/rspack.config.ts +103 -0
- package/source/scripts/update-adblock-assets.mjs +164 -0
- package/third_party/filter-lists/LICENSE-CC-BY-SA-3.0.txt +359 -0
- package/third_party/filter-lists/LICENSE-GPL-3.0.txt +674 -0
- package/third_party/filter-lists/LICENSE-MPL-2.0.txt +375 -0
- package/third_party/filter-lists/README.md +24 -0
- package/third_party/filter-lists/easylist.txt +83088 -0
- package/third_party/filter-lists/easyprivacy.txt +56361 -0
- package/third_party/filter-lists/manifest.json +56 -0
- package/third_party/filter-lists/ublock-filters.txt +10937 -0
- package/third_party/filter-lists/ublock-privacy.txt +3209 -0
- package/third_party/filter-lists/ublock-resources.json +1852 -0
- package/third_party/filter-lists/ublock-unbreak.txt +6026 -0
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import {
|
|
2
|
+
rewriteUrl,
|
|
3
|
+
ScramjetContext,
|
|
4
|
+
ScramjetHeaders,
|
|
5
|
+
unrewriteUrl,
|
|
6
|
+
URLMeta,
|
|
7
|
+
} from "@/shared";
|
|
8
|
+
import {
|
|
9
|
+
ScramjetFetchHandler,
|
|
10
|
+
ScramjetFetchParsed,
|
|
11
|
+
ScramjetFetchRequest,
|
|
12
|
+
} from ".";
|
|
13
|
+
import { RawHeaders } from "@mercuryworkshop/proxy-transports";
|
|
14
|
+
import { _URL, _Set } from "@/shared/snapshot";
|
|
15
|
+
import { createReferrerString } from "./util";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Headers for security policy features that haven't been emulated yet
|
|
19
|
+
*/
|
|
20
|
+
const SEC_HEADERS = new _Set([
|
|
21
|
+
"cross-origin-embedder-policy",
|
|
22
|
+
"cross-origin-opener-policy",
|
|
23
|
+
"cross-origin-resource-policy",
|
|
24
|
+
"content-security-policy",
|
|
25
|
+
"content-security-policy-report-only",
|
|
26
|
+
"expect-ct",
|
|
27
|
+
"feature-policy",
|
|
28
|
+
"origin-isolation",
|
|
29
|
+
"strict-transport-security",
|
|
30
|
+
"upgrade-insecure-requests",
|
|
31
|
+
"x-content-type-options",
|
|
32
|
+
"x-download-options",
|
|
33
|
+
"x-frame-options",
|
|
34
|
+
"x-permitted-cross-domain-policies",
|
|
35
|
+
"x-powered-by",
|
|
36
|
+
"x-xss-protection",
|
|
37
|
+
// This needs to be emulated, but for right now it isn't that important of a feature to be worried about
|
|
38
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Clear-Site-Data
|
|
39
|
+
"clear-site-data",
|
|
40
|
+
]) as _Set<string>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Headers that are actually URLs that need to be rewritten
|
|
44
|
+
*/
|
|
45
|
+
const URL_HEADERS = new _Set([
|
|
46
|
+
"location",
|
|
47
|
+
"content-location",
|
|
48
|
+
"referer",
|
|
49
|
+
]) as _Set<string>;
|
|
50
|
+
|
|
51
|
+
function rewriteLinkHeader(
|
|
52
|
+
link: string,
|
|
53
|
+
context: ScramjetContext,
|
|
54
|
+
meta: URLMeta
|
|
55
|
+
) {
|
|
56
|
+
return link.replace(/<([^>]+)>/gi, (_match, p1) => {
|
|
57
|
+
return `<${rewriteUrl(p1, context, meta)}>`;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export async function rewriteResponseHeaders(
|
|
62
|
+
handler: ScramjetFetchHandler,
|
|
63
|
+
request: ScramjetFetchRequest,
|
|
64
|
+
parsed: ScramjetFetchParsed,
|
|
65
|
+
rawHeaders: RawHeaders
|
|
66
|
+
): Promise<ScramjetHeaders> {
|
|
67
|
+
const headers = ScramjetHeaders.fromRawHeaders(rawHeaders);
|
|
68
|
+
|
|
69
|
+
for (const cspHeader of SEC_HEADERS) {
|
|
70
|
+
headers.delete(cspHeader);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
for (const urlHeader of URL_HEADERS) {
|
|
74
|
+
if (headers.has(urlHeader)) {
|
|
75
|
+
const url = headers.get(urlHeader)!;
|
|
76
|
+
const rewrittenUrl = rewriteUrl(url, handler.context, parsed.meta);
|
|
77
|
+
headers.set(urlHeader, rewrittenUrl);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (headers.has("link")) {
|
|
82
|
+
const link = headers.get("link")!;
|
|
83
|
+
const rewritten = rewriteLinkHeader(link, handler.context, parsed.meta);
|
|
84
|
+
headers.set("link", rewritten);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (headers.get("accept") === "text/event-stream") {
|
|
88
|
+
headers.set("content-type", "text/event-stream");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// scramjet runtime can use features that permissions-policy blocks
|
|
92
|
+
headers.delete("permissions-policy");
|
|
93
|
+
|
|
94
|
+
// we handle this ourselves
|
|
95
|
+
headers.delete("set-cookie");
|
|
96
|
+
|
|
97
|
+
if (
|
|
98
|
+
handler.crossOriginIsolated &&
|
|
99
|
+
[
|
|
100
|
+
"document",
|
|
101
|
+
"iframe",
|
|
102
|
+
"worker",
|
|
103
|
+
"sharedworker",
|
|
104
|
+
"style",
|
|
105
|
+
"script",
|
|
106
|
+
].includes(parsed.destination)
|
|
107
|
+
) {
|
|
108
|
+
headers.set("Cross-Origin-Embedder-Policy", "require-corp");
|
|
109
|
+
headers.set("Cross-Origin-Opener-Policy", "same-origin");
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (parsed.destination === "document" || parsed.destination === "iframe") {
|
|
113
|
+
headers.set("Referrer-Policy", "unsafe-url");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return headers;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function rewriteRequestHeaders(
|
|
120
|
+
request: ScramjetFetchRequest,
|
|
121
|
+
handler: ScramjetFetchHandler,
|
|
122
|
+
parsed: ScramjetFetchParsed
|
|
123
|
+
): ScramjetHeaders {
|
|
124
|
+
const headers = request.initialHeaders.clone();
|
|
125
|
+
|
|
126
|
+
// avoid leaking the scramjet referer
|
|
127
|
+
headers.delete("Referer");
|
|
128
|
+
|
|
129
|
+
const rawOriginUrl =
|
|
130
|
+
parsed.referrerSourceUrl !== undefined
|
|
131
|
+
? parsed.referrerSourceUrl
|
|
132
|
+
: request.rawClientUrl ||
|
|
133
|
+
(request.rawReferrer ? new _URL(request.rawReferrer) : undefined);
|
|
134
|
+
const originUrl =
|
|
135
|
+
rawOriginUrl &&
|
|
136
|
+
rawOriginUrl.pathname.startsWith(handler.context.prefix.pathname)
|
|
137
|
+
? new _URL(unrewriteUrl(rawOriginUrl, handler.context))
|
|
138
|
+
: rawOriginUrl;
|
|
139
|
+
|
|
140
|
+
if (
|
|
141
|
+
rawOriginUrl &&
|
|
142
|
+
rawOriginUrl.pathname.startsWith(handler.context.prefix.pathname)
|
|
143
|
+
) {
|
|
144
|
+
headers.set("Origin", originUrl.origin);
|
|
145
|
+
|
|
146
|
+
const referer = createReferrerString(
|
|
147
|
+
originUrl,
|
|
148
|
+
parsed.url,
|
|
149
|
+
parsed.referrerPolicy ?? null
|
|
150
|
+
);
|
|
151
|
+
if (referer) headers.set("Referer", referer);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const sameSiteContext = computeSameSiteContext(request, parsed, originUrl);
|
|
155
|
+
const cookies = handler.context.cookieJar.getCookies(
|
|
156
|
+
parsed.url,
|
|
157
|
+
false,
|
|
158
|
+
sameSiteContext
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
if (cookies.length) {
|
|
162
|
+
headers.set("Cookie", cookies);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
applyFetchMetadataHeaders(headers, request, parsed, handler);
|
|
166
|
+
|
|
167
|
+
return headers;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Compute and attach the Sec-Fetch-* request metadata headers, per
|
|
172
|
+
* https://w3c.github.io/webappsec-fetch-metadata/.
|
|
173
|
+
*
|
|
174
|
+
* Browsers compute these based on the proxy URL space (page → service worker),
|
|
175
|
+
* which is meaningless to the destination. We strip those values and recompute
|
|
176
|
+
* based on the logical (unrewritten) URLs so that the destination sees
|
|
177
|
+
* realistic Sec-Fetch-Site / -Mode / -Dest / -User values.
|
|
178
|
+
*
|
|
179
|
+
* These headers are only attached when the destination URL is a "potentially
|
|
180
|
+
* trustworthy" URL — matching Chrome's behaviour of omitting them when sending
|
|
181
|
+
* to plain http:// non-loopback destinations.
|
|
182
|
+
*/
|
|
183
|
+
function applyFetchMetadataHeaders(
|
|
184
|
+
headers: ScramjetHeaders,
|
|
185
|
+
request: ScramjetFetchRequest,
|
|
186
|
+
parsed: ScramjetFetchParsed,
|
|
187
|
+
handler: ScramjetFetchHandler
|
|
188
|
+
) {
|
|
189
|
+
// Strip browser-attached Sec-Fetch-* (computed from the proxy URL space).
|
|
190
|
+
headers.delete("sec-fetch-site");
|
|
191
|
+
headers.delete("sec-fetch-mode");
|
|
192
|
+
headers.delete("sec-fetch-dest");
|
|
193
|
+
headers.delete("sec-fetch-user");
|
|
194
|
+
headers.delete("sec-fetch-storage-access");
|
|
195
|
+
|
|
196
|
+
if (!isPotentiallyTrustworthy(parsed.url)) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Determine the request initiator's origin. Unlike the Referer header,
|
|
201
|
+
// this never gets stripped by referrer policy: it's the page that actually
|
|
202
|
+
// initiated the chain. Prefer the propagated initiator origin for
|
|
203
|
+
// post-redirect requests; otherwise fall back to rawClientUrl/rawReferrer.
|
|
204
|
+
const initiatorUrl = resolveFetchInitiatorUrl(request, parsed, handler);
|
|
205
|
+
|
|
206
|
+
// Sec-Fetch-Site: relationship between request initiator's origin and the URL.
|
|
207
|
+
let site: "none" | "same-origin" | "same-site" | "cross-site";
|
|
208
|
+
if (!initiatorUrl) {
|
|
209
|
+
// No initiator (e.g., user typed URL, or browser-initiated request).
|
|
210
|
+
site = "none";
|
|
211
|
+
} else {
|
|
212
|
+
const immediate = computeFetchSite(initiatorUrl, parsed.url);
|
|
213
|
+
site = parsed.fetchSiteState
|
|
214
|
+
? worstFetchSite(parsed.fetchSiteState, immediate)
|
|
215
|
+
: immediate;
|
|
216
|
+
}
|
|
217
|
+
headers.set("Sec-Fetch-Site", site);
|
|
218
|
+
|
|
219
|
+
// Sec-Fetch-Mode: the request's mode. `event.request.mode` from the SW is
|
|
220
|
+
// computed against the proxy URL space (always same-origin to the page) so
|
|
221
|
+
// it's not safe to trust for fetch / Request API calls; we prefer the
|
|
222
|
+
// `sj$mode` value the client-side proxy stamped onto the URL when present
|
|
223
|
+
// and fall back to a destination-based default for everything else.
|
|
224
|
+
headers.set("Sec-Fetch-Mode", computeFetchMode(request, parsed));
|
|
225
|
+
|
|
226
|
+
if (parsed.destination === "iframe") {
|
|
227
|
+
if (!parsed.isIframe) {
|
|
228
|
+
// emulate a top-level navigation
|
|
229
|
+
headers.set("Sec-Fetch-Dest", "document");
|
|
230
|
+
} else {
|
|
231
|
+
headers.set("Sec-Fetch-Dest", "iframe");
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
headers.set("Sec-Fetch-Dest", parsed.destination || "empty");
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Sec-Fetch-User: sent as "?1" only on user-activated navigation requests
|
|
238
|
+
// (top-level documents, iframes, frames, and embedded objects). The browser
|
|
239
|
+
// already attaches this header to the page→SW request when the navigation
|
|
240
|
+
// originates from a user gesture, so we forward that signal for any
|
|
241
|
+
// navigation destination.
|
|
242
|
+
const isNavigationDestination =
|
|
243
|
+
parsed.destination === "document" ||
|
|
244
|
+
parsed.destination === "iframe" ||
|
|
245
|
+
parsed.destination === "frame" ||
|
|
246
|
+
parsed.destination === "embed" ||
|
|
247
|
+
parsed.destination === "object";
|
|
248
|
+
if (
|
|
249
|
+
isNavigationDestination &&
|
|
250
|
+
request.initialHeaders.get("sec-fetch-user") === "?1"
|
|
251
|
+
) {
|
|
252
|
+
headers.set("Sec-Fetch-User", "?1");
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Sec-Fetch-Storage-Access: per https://privacycg.github.io/storage-access-headers/.
|
|
256
|
+
// Sent on cross-site credentialed requests so the destination knows whether
|
|
257
|
+
// unpartitioned storage access has been granted. We never grant storage
|
|
258
|
+
// access through the proxy, so the value is always "none" when sent.
|
|
259
|
+
//
|
|
260
|
+
// `event.request.credentials` inside a service worker isn't reliable, so we
|
|
261
|
+
// rely on signals propagated from the page (the `sj$cred` URL param set by
|
|
262
|
+
// the client-side fetch proxy) plus destination-based defaults for request
|
|
263
|
+
// types that always include credentials.
|
|
264
|
+
if (site === "cross-site" && requestIncludesCredentials(request, parsed)) {
|
|
265
|
+
headers.set("Sec-Fetch-Storage-Access", "none");
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Whether this request will carry credentials to the destination. Used by
|
|
271
|
+
* Sec-Fetch-Storage-Access. The browser's `event.request.credentials` value
|
|
272
|
+
* can't be trusted in a service worker context, so we reconstruct the answer
|
|
273
|
+
* from:
|
|
274
|
+
*
|
|
275
|
+
* - the `sj$cred` URL parameter, set by the client-side fetch proxy when the
|
|
276
|
+
* page used `fetch(url, { credentials: "include" })`; and
|
|
277
|
+
* - destination-based defaults: most resource fetches (img, script, style,
|
|
278
|
+
* link, video, audio, track, document/iframe navigations, etc.) default to
|
|
279
|
+
* credentials mode "include" unless the page explicitly opts out via a
|
|
280
|
+
* `crossorigin` attribute we can't observe from here. fetch() / XHR
|
|
281
|
+
* default to "same-origin", so we treat them as non-credentialed unless
|
|
282
|
+
* `sj$cred` says otherwise.
|
|
283
|
+
*/
|
|
284
|
+
function requestIncludesCredentials(
|
|
285
|
+
request: ScramjetFetchRequest,
|
|
286
|
+
parsed: ScramjetFetchParsed
|
|
287
|
+
): boolean {
|
|
288
|
+
if (parsed.fetchCredentialsInclude) return true;
|
|
289
|
+
const dest = parsed.destination;
|
|
290
|
+
// fetch(): destination is "" (empty). XHR / report: destination is
|
|
291
|
+
// "report". Both default to credentials="same-origin", so cross-site
|
|
292
|
+
// requests don't include credentials unless the page explicitly opts in.
|
|
293
|
+
if (dest === "" || dest === "report") return false;
|
|
294
|
+
// ES modules (including module scripts and module-typed workers) default
|
|
295
|
+
// to credentials="same-origin", so cross-site fetches do not carry
|
|
296
|
+
// credentials.
|
|
297
|
+
if (parsed.isModule) return false;
|
|
298
|
+
// Other destinations (image, classic-script, style, audio, video, track,
|
|
299
|
+
// font, iframe, frame, document, embed, object, manifest, classic worker,
|
|
300
|
+
// sharedworker, serviceworker, ...) default to credentials="include".
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Determine the Sec-Fetch-Mode value for a request.
|
|
306
|
+
*
|
|
307
|
+
* The browser's `event.request.mode` reported in the SW is unsafe to trust
|
|
308
|
+
* for `fetch()` / `new Request()` calls — those compute mode against the
|
|
309
|
+
* request URL's relationship to the page, and scramjet has rewritten the URL
|
|
310
|
+
* to be same-origin to the page, so the SW always sees "same-origin"
|
|
311
|
+
* regardless of the page's actual `init.mode`. For HTML resource fetches
|
|
312
|
+
* (`<script crossorigin>`, `<img crossorigin>`, …) the mode is derived from
|
|
313
|
+
* the element's CORS attribute rather than URL origin, so the SW's reported
|
|
314
|
+
* mode IS reliable there.
|
|
315
|
+
*
|
|
316
|
+
* Resolution order:
|
|
317
|
+
* 1. `parsed.fetchMode` — set by the client-side fetch / Request proxy from
|
|
318
|
+
* `init.mode` (or fetch's "cors" default). Authoritative for
|
|
319
|
+
* page-initiated fetch / Request / XHR-style calls.
|
|
320
|
+
* 2. Top-level navigations: always "navigate".
|
|
321
|
+
* 3. Workers: classic → "same-origin", module → "cors".
|
|
322
|
+
* 4. Everything else: trust the SW's `request.mode` (it reflects the
|
|
323
|
+
* element's CORS attribute), falling back to "no-cors" if it's missing
|
|
324
|
+
* or implausible (e.g. "same-origin" / "navigate" leaking in from a
|
|
325
|
+
* proxy-URL computation).
|
|
326
|
+
*/
|
|
327
|
+
function computeFetchMode(
|
|
328
|
+
request: ScramjetFetchRequest,
|
|
329
|
+
parsed: ScramjetFetchParsed
|
|
330
|
+
): string {
|
|
331
|
+
if (parsed.fetchMode) return parsed.fetchMode;
|
|
332
|
+
const dest = parsed.destination;
|
|
333
|
+
if (
|
|
334
|
+
dest === "document" ||
|
|
335
|
+
dest === "iframe" ||
|
|
336
|
+
dest === "frame" ||
|
|
337
|
+
dest === "embed" ||
|
|
338
|
+
dest === "object"
|
|
339
|
+
) {
|
|
340
|
+
return "navigate";
|
|
341
|
+
}
|
|
342
|
+
if (dest === "worker" || dest === "sharedworker") {
|
|
343
|
+
// Classic workers default to same-origin; module workers default to cors.
|
|
344
|
+
return parsed.isModule ? "cors" : "same-origin";
|
|
345
|
+
}
|
|
346
|
+
// HTML element fetches: the browser's `request.mode` here reflects the
|
|
347
|
+
// element's CORS attribute (`<script crossorigin>` ⇒ "cors", plain
|
|
348
|
+
// `<script>` ⇒ "no-cors"), so trust it. Reject "same-origin"/"navigate"
|
|
349
|
+
// since those indicate the value came from URL-origin matching against
|
|
350
|
+
// scramjet's proxy origin and is meaningless to the destination.
|
|
351
|
+
if (request.mode === "cors" || request.mode === "no-cors") {
|
|
352
|
+
return request.mode;
|
|
353
|
+
}
|
|
354
|
+
return "no-cors";
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Resolve the unrewritten URL of the page (or worker) that initiated this
|
|
359
|
+
* request. Used by Sec-Fetch-Site, which always compares against the original
|
|
360
|
+
* initiator regardless of Referer policy.
|
|
361
|
+
*/
|
|
362
|
+
function resolveFetchInitiatorUrl(
|
|
363
|
+
request: ScramjetFetchRequest,
|
|
364
|
+
parsed: ScramjetFetchParsed,
|
|
365
|
+
handler: ScramjetFetchHandler
|
|
366
|
+
): URL | undefined {
|
|
367
|
+
// On any hop after the first, the propagated initiator origin is the
|
|
368
|
+
// authoritative source. rawReferrer may have been replaced with the
|
|
369
|
+
// previous hop's URL, and rawClientUrl is unset for top-level navigations.
|
|
370
|
+
if (parsed.fetchInitiatorOrigin) {
|
|
371
|
+
try {
|
|
372
|
+
return new _URL(parsed.fetchInitiatorOrigin);
|
|
373
|
+
} catch {
|
|
374
|
+
// fall through to the fallbacks below
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const candidate =
|
|
378
|
+
request.rawClientUrl ||
|
|
379
|
+
(request.rawReferrer ? new _URL(request.rawReferrer) : undefined);
|
|
380
|
+
if (!candidate) return undefined;
|
|
381
|
+
if (candidate.pathname.startsWith(handler.context.prefix.pathname)) {
|
|
382
|
+
return new _URL(unrewriteUrl(candidate, handler.context));
|
|
383
|
+
}
|
|
384
|
+
// The candidate URL is outside scramjet's logical space (e.g. the runway
|
|
385
|
+
// harness wrapper page, or a chrome:// page kicking off a navigation).
|
|
386
|
+
// There's no meaningful "initiator" in the proxied site's frame of
|
|
387
|
+
// reference, so treat it as a browser-initiated request — Sec-Fetch-Site
|
|
388
|
+
// will be "none".
|
|
389
|
+
return undefined;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Whether a URL is "potentially trustworthy" per
|
|
394
|
+
* https://w3c.github.io/webappsec-secure-contexts/#is-url-trustworthy.
|
|
395
|
+
*
|
|
396
|
+
* This is a slimmed-down implementation: HTTPS / WSS, file:, and the common
|
|
397
|
+
* loopback hostnames (localhost, *.localhost, 127.0.0.0/8, ::1) are treated as
|
|
398
|
+
* trustworthy. Everything else (including plain http:// to a real hostname) is
|
|
399
|
+
* not.
|
|
400
|
+
*/
|
|
401
|
+
function isPotentiallyTrustworthy(url: URL): boolean {
|
|
402
|
+
const protocol = url.protocol;
|
|
403
|
+
if (protocol === "https:" || protocol === "wss:" || protocol === "file:") {
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
if (protocol !== "http:" && protocol !== "ws:") {
|
|
407
|
+
// data:, blob:, etc. – defer to the caller; treated as not trustworthy
|
|
408
|
+
// for the purpose of attaching Sec-Fetch-* network headers.
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
return isLoopbackHost(url.hostname);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function isLoopbackHost(hostname: string): boolean {
|
|
415
|
+
if (hostname === "localhost" || hostname === "localhost.") return true;
|
|
416
|
+
if (hostname.endsWith(".localhost") || hostname.endsWith(".localhost.")) {
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
if (hostname === "[::1]" || hostname === "::1") return true;
|
|
420
|
+
// Match 127.0.0.0/8 (any 127.x.y.z address).
|
|
421
|
+
if (/^127\.(?:\d{1,3})\.(?:\d{1,3})\.(?:\d{1,3})$/.test(hostname)) {
|
|
422
|
+
return true;
|
|
423
|
+
}
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Compute the immediate Sec-Fetch-Site relation between an initiator origin and
|
|
429
|
+
* a destination URL.
|
|
430
|
+
*
|
|
431
|
+
* - "same-origin" if scheme + host + port match exactly.
|
|
432
|
+
* - "same-site" if scheme matches and the registrable domains match.
|
|
433
|
+
* - "cross-site" otherwise.
|
|
434
|
+
*/
|
|
435
|
+
export function computeFetchSite(
|
|
436
|
+
originUrl: URL,
|
|
437
|
+
destUrl: URL
|
|
438
|
+
): "same-origin" | "same-site" | "cross-site" {
|
|
439
|
+
if (
|
|
440
|
+
originUrl.protocol === destUrl.protocol &&
|
|
441
|
+
originUrl.host === destUrl.host
|
|
442
|
+
) {
|
|
443
|
+
return "same-origin";
|
|
444
|
+
}
|
|
445
|
+
if (
|
|
446
|
+
originUrl.protocol === destUrl.protocol &&
|
|
447
|
+
registrableDomain(originUrl.hostname) ===
|
|
448
|
+
registrableDomain(destUrl.hostname)
|
|
449
|
+
) {
|
|
450
|
+
return "same-site";
|
|
451
|
+
}
|
|
452
|
+
return "cross-site";
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Combine two Sec-Fetch-Site classifications, returning the "worst" (least
|
|
457
|
+
* trusted) of the two. Used when propagating state through redirect chains.
|
|
458
|
+
*/
|
|
459
|
+
export function worstFetchSite(
|
|
460
|
+
a: "none" | "same-origin" | "same-site" | "cross-site",
|
|
461
|
+
b: "none" | "same-origin" | "same-site" | "cross-site"
|
|
462
|
+
): "none" | "same-origin" | "same-site" | "cross-site" {
|
|
463
|
+
const order = { "cross-site": 0, "same-site": 1, "same-origin": 2, none: 3 };
|
|
464
|
+
return order[a] <= order[b] ? a : b;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Compute the SameSite enforcement context for a request.
|
|
469
|
+
*
|
|
470
|
+
* "strict" – same-site or no known origin (allow all cookies)
|
|
471
|
+
* "lax" – cross-site top-level GET/HEAD navigation (block Strict)
|
|
472
|
+
* "cross-site" – cross-site subresource or non-safe-method navigation (block Strict+Lax)
|
|
473
|
+
*/
|
|
474
|
+
function computeSameSiteContext(
|
|
475
|
+
request: ScramjetFetchRequest,
|
|
476
|
+
parsed: ScramjetFetchParsed,
|
|
477
|
+
rawOriginUrl: URL | undefined
|
|
478
|
+
): "strict" | "lax" | "cross-site" {
|
|
479
|
+
// If a redirect chain previously passed through a cross-site origin, the
|
|
480
|
+
// final request is always treated as cross-site regardless of its destination.
|
|
481
|
+
if (parsed.crossSiteRedirect) {
|
|
482
|
+
const isNavigation =
|
|
483
|
+
parsed.destination === "document" || parsed.destination === "iframe";
|
|
484
|
+
const isSafeMethod = request.method === "GET" || request.method === "HEAD";
|
|
485
|
+
return isNavigation && isSafeMethod ? "lax" : "cross-site";
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (!rawOriginUrl) return "strict";
|
|
489
|
+
|
|
490
|
+
const originSite = registrableDomain(rawOriginUrl.hostname);
|
|
491
|
+
const targetSite = registrableDomain(parsed.url.hostname);
|
|
492
|
+
|
|
493
|
+
// Same site → no SameSite restrictions
|
|
494
|
+
if (originSite === targetSite) return "strict";
|
|
495
|
+
|
|
496
|
+
// Cross-site request: check if it's a navigational GET/HEAD (lax) or subresource/POST (cross-site)
|
|
497
|
+
const isNavigation =
|
|
498
|
+
parsed.destination === "document" || parsed.destination === "iframe";
|
|
499
|
+
const isSafeMethod = request.method === "GET" || request.method === "HEAD";
|
|
500
|
+
|
|
501
|
+
if (isNavigation && isSafeMethod) return "lax";
|
|
502
|
+
return "cross-site";
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Compute the "registrable domain" (eTLD+1) of a hostname for same-site comparison.
|
|
507
|
+
* This is a simplified implementation that handles common test cases
|
|
508
|
+
* (localhost, IPs, and typical domain structures) without a full PSL lookup.
|
|
509
|
+
*/
|
|
510
|
+
function registrableDomain(hostname: string): string {
|
|
511
|
+
// IPv4 / IPv6: site = exact IP
|
|
512
|
+
if (/^[\d.]+$/.test(hostname) || hostname.includes(":")) return hostname;
|
|
513
|
+
|
|
514
|
+
const labels = hostname.split(".");
|
|
515
|
+
if (labels.length <= 1) return hostname; // bare hostname like "localhost"
|
|
516
|
+
|
|
517
|
+
// Strip a leading "www." for same-site comparison so that
|
|
518
|
+
// www.example.com and example.com are treated as the same site.
|
|
519
|
+
// More complex cases (e.g. s1.s2.example.co.uk) are not handled here
|
|
520
|
+
// but are uncommon in test environments.
|
|
521
|
+
if (labels[0] === "www") return labels.slice(1).join(".");
|
|
522
|
+
|
|
523
|
+
// For two-label hostnames like "example.com", use as-is
|
|
524
|
+
if (labels.length === 2) return hostname;
|
|
525
|
+
|
|
526
|
+
// For longer hostnames, use the last two labels as a rough eTLD+1
|
|
527
|
+
return labels.slice(-2).join(".");
|
|
528
|
+
}
|