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.
Files changed (481) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +123 -0
  3. package/SOURCE.md +29 -0
  4. package/THIRD_PARTY_NOTICES.md +24 -0
  5. package/dist/assets/filters-Bu_3nHVy.bin +0 -0
  6. package/dist/assets/index-BdRlQ7d_.css +1 -0
  7. package/dist/assets/index-DcvPYWS3.js +3621 -0
  8. package/dist/assets/inject-BnVzMVpl.js +40 -0
  9. package/dist/assets/scramjet-C9HLwI-y.wasm +0 -0
  10. package/dist/defaultfavicon.png +0 -0
  11. package/dist/icon.png +0 -0
  12. package/dist/roxxie-icon.svg +12 -0
  13. package/embed.js +70 -0
  14. package/examples/single-page.html +25 -0
  15. package/package.json +42 -0
  16. package/runtime/controller.sw.js +273 -0
  17. package/runtime/index.html +18 -0
  18. package/runtime/localcontrollersw.js +7 -0
  19. package/runtime/roxxie-network.json +13 -0
  20. package/runtime/sw.js +6 -0
  21. package/scripts/build.mjs +344 -0
  22. package/scripts/smoke.mjs +123 -0
  23. package/scripts/verify.mjs +122 -0
  24. package/source/external/dreamlandjs/LICENSE +21 -0
  25. package/source/external/dreamlandjs/README.md +22 -0
  26. package/source/external/dreamlandjs/dist/core.d.ts +167 -0
  27. package/source/external/dreamlandjs/dist/core.js +2 -0
  28. package/source/external/dreamlandjs/dist/core.js.map +1 -0
  29. package/source/external/dreamlandjs/dist/core.size.html +4950 -0
  30. package/source/external/dreamlandjs/dist/js-runtime.d.ts +3 -0
  31. package/source/external/dreamlandjs/dist/js-runtime.js +2 -0
  32. package/source/external/dreamlandjs/dist/js-runtime.js.map +1 -0
  33. package/source/external/dreamlandjs/dist/jsx-runtime.d.ts +1 -0
  34. package/source/external/dreamlandjs/dist/jsx-runtime.js +2 -0
  35. package/source/external/dreamlandjs/dist/jsx-runtime.js.map +1 -0
  36. package/source/external/dreamlandjs/dist/motion.d.ts +19 -0
  37. package/source/external/dreamlandjs/dist/motion.js +2 -0
  38. package/source/external/dreamlandjs/dist/motion.js.map +1 -0
  39. package/source/external/dreamlandjs/dist/router.d.ts +48 -0
  40. package/source/external/dreamlandjs/dist/router.js +2 -0
  41. package/source/external/dreamlandjs/dist/router.js.map +1 -0
  42. package/source/external/dreamlandjs/dist/ssr.client.d.ts +3 -0
  43. package/source/external/dreamlandjs/dist/ssr.client.js +2 -0
  44. package/source/external/dreamlandjs/dist/ssr.client.js.map +1 -0
  45. package/source/external/dreamlandjs/dist/ssr.client.size.html +4950 -0
  46. package/source/external/dreamlandjs/dist/ssr.hybrid.d.ts +7 -0
  47. package/source/external/dreamlandjs/dist/ssr.hybrid.js +2 -0
  48. package/source/external/dreamlandjs/dist/ssr.hybrid.js.map +1 -0
  49. package/source/external/dreamlandjs/dist/ssr.hybrid.size.html +4950 -0
  50. package/source/external/dreamlandjs/dist/ssr.server.d.ts +11 -0
  51. package/source/external/dreamlandjs/dist/ssr.server.js +2373 -0
  52. package/source/external/dreamlandjs/dist/ssr.server.js.map +1 -0
  53. package/source/external/dreamlandjs/dist/types/core/consts.d.ts +16 -0
  54. package/source/external/dreamlandjs/dist/types/core/css/index.d.ts +11 -0
  55. package/source/external/dreamlandjs/dist/types/core/css/selectorParser.d.ts +50 -0
  56. package/source/external/dreamlandjs/dist/types/core/delegate.d.ts +10 -0
  57. package/source/external/dreamlandjs/dist/types/core/index.d.ts +9 -0
  58. package/source/external/dreamlandjs/dist/types/core/jsx/child.d.ts +2 -0
  59. package/source/external/dreamlandjs/dist/types/core/jsx/definitions.d.ts +76 -0
  60. package/source/external/dreamlandjs/dist/types/core/jsx/dom.d.ts +28 -0
  61. package/source/external/dreamlandjs/dist/types/core/jsx/index.d.ts +14 -0
  62. package/source/external/dreamlandjs/dist/types/core/state/index.d.ts +1 -0
  63. package/source/external/dreamlandjs/dist/types/core/state/pointers.d.ts +37 -0
  64. package/source/external/dreamlandjs/dist/types/core/state/state.d.ts +13 -0
  65. package/source/external/dreamlandjs/dist/types/core/state/use.d.ts +11 -0
  66. package/source/external/dreamlandjs/dist/types/core/utils.d.ts +4 -0
  67. package/source/external/dreamlandjs/dist/types/js-runtime/index.d.ts +1 -0
  68. package/source/external/dreamlandjs/dist/types/jsx-runtime/index.d.ts +2 -0
  69. package/source/external/dreamlandjs/dist/types/motion/index.d.ts +15 -0
  70. package/source/external/dreamlandjs/dist/types/router/index.d.ts +45 -0
  71. package/source/external/dreamlandjs/dist/types/ssr/client/index.d.ts +1 -0
  72. package/source/external/dreamlandjs/dist/types/ssr/common/consts.d.ts +4 -0
  73. package/source/external/dreamlandjs/dist/types/ssr/common/serialize.d.ts +4 -0
  74. package/source/external/dreamlandjs/dist/types/ssr/common/types.d.ts +21 -0
  75. package/source/external/dreamlandjs/dist/types/ssr/hybrid/index.d.ts +4 -0
  76. package/source/external/dreamlandjs/dist/types/ssr/server/index.d.ts +7 -0
  77. package/source/external/dreamlandjs/dist/types/ssr/server/vdom.d.ts +71 -0
  78. package/source/external/dreamlandjs/dist/types/util/index.d.ts +1 -0
  79. package/source/external/dreamlandjs/dist/types/util/store.d.ts +26 -0
  80. package/source/external/dreamlandjs/dist/types/vite/css-minifier.d.ts +7 -0
  81. package/source/external/dreamlandjs/dist/types/vite/index.d.ts +11 -0
  82. package/source/external/dreamlandjs/dist/util.d.ts +29 -0
  83. package/source/external/dreamlandjs/dist/util.js +2 -0
  84. package/source/external/dreamlandjs/dist/util.js.map +1 -0
  85. package/source/external/dreamlandjs/dist/vite.d.ts +19 -0
  86. package/source/external/dreamlandjs/dist/vite.js +2 -0
  87. package/source/external/dreamlandjs/dist/vite.js.map +1 -0
  88. package/source/external/dreamlandjs/package.json +101 -0
  89. package/source/external/dreamlandjs/rollup.config.ts +302 -0
  90. package/source/external/dreamlandjs/rollup.plugins.ts +1134 -0
  91. package/source/external/dreamlandjs/src/core/consts.d.ts +16 -0
  92. package/source/external/dreamlandjs/src/core/consts.js +18 -0
  93. package/source/external/dreamlandjs/src/core/css/index.ts +111 -0
  94. package/source/external/dreamlandjs/src/core/css/selectorParser.ts +313 -0
  95. package/source/external/dreamlandjs/src/core/delegate.ts +28 -0
  96. package/source/external/dreamlandjs/src/core/index.ts +31 -0
  97. package/source/external/dreamlandjs/src/core/jsx/child.ts +91 -0
  98. package/source/external/dreamlandjs/src/core/jsx/definitions.ts +125 -0
  99. package/source/external/dreamlandjs/src/core/jsx/dom.ts +49 -0
  100. package/source/external/dreamlandjs/src/core/jsx/index.ts +289 -0
  101. package/source/external/dreamlandjs/src/core/state/index.ts +1 -0
  102. package/source/external/dreamlandjs/src/core/state/pointers.ts +310 -0
  103. package/source/external/dreamlandjs/src/core/state/state.ts +112 -0
  104. package/source/external/dreamlandjs/src/core/state/use.ts +82 -0
  105. package/source/external/dreamlandjs/src/core/utils.ts +48 -0
  106. package/source/external/dreamlandjs/src/js-runtime/index.ts +4 -0
  107. package/source/external/dreamlandjs/src/jsx-runtime/index.ts +3 -0
  108. package/source/external/dreamlandjs/src/motion/index.ts +156 -0
  109. package/source/external/dreamlandjs/src/router/index.tsx +394 -0
  110. package/source/external/dreamlandjs/src/router/tsconfig.json +9 -0
  111. package/source/external/dreamlandjs/src/ssr/client/index.ts +193 -0
  112. package/source/external/dreamlandjs/src/ssr/common/consts.ts +5 -0
  113. package/source/external/dreamlandjs/src/ssr/common/serialize.ts +115 -0
  114. package/source/external/dreamlandjs/src/ssr/common/types.ts +28 -0
  115. package/source/external/dreamlandjs/src/ssr/hybrid/index.ts +144 -0
  116. package/source/external/dreamlandjs/src/ssr/server/index.ts +157 -0
  117. package/source/external/dreamlandjs/src/ssr/server/tsconfig.json +7 -0
  118. package/source/external/dreamlandjs/src/ssr/server/vdom.ts +285 -0
  119. package/source/external/dreamlandjs/src/util/index.ts +10 -0
  120. package/source/external/dreamlandjs/src/util/store.ts +134 -0
  121. package/source/external/dreamlandjs/src/vite/css-minifier.ts +222 -0
  122. package/source/external/dreamlandjs/src/vite/index.ts +60 -0
  123. package/source/external/dreamlandjs/src/vite/tsconfig.json +7 -0
  124. package/source/external/dreamlandjs/tsconfig.json +15 -0
  125. package/source/package.json +48 -0
  126. package/source/packages/adrift-protocol/package.json +31 -0
  127. package/source/packages/adrift-protocol/src/index.ts +348 -0
  128. package/source/packages/adrift-protocol/tsconfig.json +18 -0
  129. package/source/packages/cdp/LICENSE +21 -0
  130. package/source/packages/cdp/README.md +47 -0
  131. package/source/packages/cdp/dist/chobitsu.js +2 -0
  132. package/source/packages/cdp/dist/chobitsu.js.map +1 -0
  133. package/source/packages/cdp/package.json +73 -0
  134. package/source/packages/cdp/script/build.js +15 -0
  135. package/source/packages/cdp/src/Chobitsu.ts +110 -0
  136. package/source/packages/cdp/src/domains/CSS.ts +378 -0
  137. package/source/packages/cdp/src/domains/CacheStorage.ts +8 -0
  138. package/source/packages/cdp/src/domains/DOM.ts +487 -0
  139. package/source/packages/cdp/src/domains/DOMDebugger.ts +109 -0
  140. package/source/packages/cdp/src/domains/DOMStorage.ts +122 -0
  141. package/source/packages/cdp/src/domains/Debugger.ts +25 -0
  142. package/source/packages/cdp/src/domains/IndexedDB.ts +207 -0
  143. package/source/packages/cdp/src/domains/Input.ts +177 -0
  144. package/source/packages/cdp/src/domains/Network.ts +251 -0
  145. package/source/packages/cdp/src/domains/Overlay.ts +230 -0
  146. package/source/packages/cdp/src/domains/Page.ts +296 -0
  147. package/source/packages/cdp/src/domains/Runtime.ts +273 -0
  148. package/source/packages/cdp/src/domains/Storage.ts +71 -0
  149. package/source/packages/cdp/src/index.d.ts +8 -0
  150. package/source/packages/cdp/src/index.ts +153 -0
  151. package/source/packages/cdp/src/lib/connector.ts +15 -0
  152. package/source/packages/cdp/src/lib/constants.ts +1 -0
  153. package/source/packages/cdp/src/lib/evaluate.ts +59 -0
  154. package/source/packages/cdp/src/lib/mutationObserver.ts +39 -0
  155. package/source/packages/cdp/src/lib/nodeManager.ts +142 -0
  156. package/source/packages/cdp/src/lib/objManager.ts +422 -0
  157. package/source/packages/cdp/src/lib/request.ts +313 -0
  158. package/source/packages/cdp/src/lib/resources.ts +59 -0
  159. package/source/packages/cdp/src/lib/scriptMananger.ts +62 -0
  160. package/source/packages/cdp/src/lib/stylesheet.ts +146 -0
  161. package/source/packages/cdp/src/lib/util.ts +105 -0
  162. package/source/packages/cdp/tsconfig.json +16 -0
  163. package/source/packages/cdp/webpack.config.js +48 -0
  164. package/source/packages/chrome/index.html +17 -0
  165. package/source/packages/chrome/package.json +41 -0
  166. package/source/packages/chrome/public/ROXXIE_NETWORK.md +22 -0
  167. package/source/packages/chrome/public/controller.sw.js +273 -0
  168. package/source/packages/chrome/public/defaultfavicon.png +0 -0
  169. package/source/packages/chrome/public/icon.png +0 -0
  170. package/source/packages/chrome/public/localcontrollersw.js +7 -0
  171. package/source/packages/chrome/public/roxxie-icon.svg +12 -0
  172. package/source/packages/chrome/public/roxxie-network.json +13 -0
  173. package/source/packages/chrome/public/sw.js +6 -0
  174. package/source/packages/chrome/src/App.tsx +269 -0
  175. package/source/packages/chrome/src/CDP.ts +285 -0
  176. package/source/packages/chrome/src/Tab/History.ts +186 -0
  177. package/source/packages/chrome/src/Tab/Tab.tsx +219 -0
  178. package/source/packages/chrome/src/Tab/screenshot.ts +66 -0
  179. package/source/packages/chrome/src/Tab/serialize.ts +221 -0
  180. package/source/packages/chrome/src/adblock/AdBlockPlugin.test.ts +159 -0
  181. package/source/packages/chrome/src/adblock/AdBlockPlugin.ts +232 -0
  182. package/source/packages/chrome/src/adblock/AdBlockService.test.ts +148 -0
  183. package/source/packages/chrome/src/adblock/AdBlockService.ts +166 -0
  184. package/source/packages/chrome/src/adblock/NOTICE.md +14 -0
  185. package/source/packages/chrome/src/adblock/assets/filters.bin +0 -0
  186. package/source/packages/chrome/src/adblock/index.ts +18 -0
  187. package/source/packages/chrome/src/assets/favicon.ts +4 -0
  188. package/source/packages/chrome/src/components/BookmarkPopup.tsx +101 -0
  189. package/source/packages/chrome/src/components/BookmarksStrip.tsx +150 -0
  190. package/source/packages/chrome/src/components/Button.tsx +99 -0
  191. package/source/packages/chrome/src/components/Checkbox.tsx +89 -0
  192. package/source/packages/chrome/src/components/DownloadsPopup.tsx +230 -0
  193. package/source/packages/chrome/src/components/Favicon.tsx +65 -0
  194. package/source/packages/chrome/src/components/Icon.tsx +29 -0
  195. package/source/packages/chrome/src/components/Input.tsx +82 -0
  196. package/source/packages/chrome/src/components/Menu.tsx +287 -0
  197. package/source/packages/chrome/src/components/Omnibar/BookmarkButton.tsx +73 -0
  198. package/source/packages/chrome/src/components/Omnibar/CircularProgress.tsx +83 -0
  199. package/source/packages/chrome/src/components/Omnibar/Omnibar.tsx +455 -0
  200. package/source/packages/chrome/src/components/Omnibar/OmnibarButton.tsx +48 -0
  201. package/source/packages/chrome/src/components/Omnibar/Omnibox.tsx +466 -0
  202. package/source/packages/chrome/src/components/Omnibar/SiteOptionsButton.tsx +52 -0
  203. package/source/packages/chrome/src/components/Omnibar/Suggestion.tsx +186 -0
  204. package/source/packages/chrome/src/components/Omnibar/UrlInput.tsx +198 -0
  205. package/source/packages/chrome/src/components/Omnibar/suggestions.ts +468 -0
  206. package/source/packages/chrome/src/components/Omnibar/utils.ts +11 -0
  207. package/source/packages/chrome/src/components/ReportBrokenSiteModal.tsx +279 -0
  208. package/source/packages/chrome/src/components/Shell.tsx +191 -0
  209. package/source/packages/chrome/src/components/SiteInformationPopup.tsx +96 -0
  210. package/source/packages/chrome/src/components/SmallIconButton.tsx +36 -0
  211. package/source/packages/chrome/src/components/StartScreen.tsx +386 -0
  212. package/source/packages/chrome/src/components/TabStrip/DragTab.tsx +546 -0
  213. package/source/packages/chrome/src/components/TabStrip/Sidebar.tsx +820 -0
  214. package/source/packages/chrome/src/components/TabStrip/TabHoverCard.tsx +87 -0
  215. package/source/packages/chrome/src/components/TabStrip/TabStrip.tsx +510 -0
  216. package/source/packages/chrome/src/components/TopSiteButton.tsx +234 -0
  217. package/source/packages/chrome/src/consts.ts +3 -0
  218. package/source/packages/chrome/src/icons.ts +70 -0
  219. package/source/packages/chrome/src/index.ts +168 -0
  220. package/source/packages/chrome/src/migrations/0-from-legacy.ts +6 -0
  221. package/source/packages/chrome/src/migrations/1-vertical-tab-settings.ts +15 -0
  222. package/source/packages/chrome/src/migrations/index.ts +42 -0
  223. package/source/packages/chrome/src/pages/AboutPage.tsx +37 -0
  224. package/source/packages/chrome/src/pages/DownloadsPage.tsx +133 -0
  225. package/source/packages/chrome/src/pages/HistoryPage.tsx +99 -0
  226. package/source/packages/chrome/src/pages/NewTabPage.tsx +264 -0
  227. package/source/packages/chrome/src/pages/PlaygroundPage.tsx +43 -0
  228. package/source/packages/chrome/src/pages/SettingsPage.tsx +1931 -0
  229. package/source/packages/chrome/src/proxy/Controller.ts +331 -0
  230. package/source/packages/chrome/src/proxy/ProxyFrame.ts +26 -0
  231. package/source/packages/chrome/src/proxy/cache.ts +487 -0
  232. package/source/packages/chrome/src/proxy/codec.ts +11 -0
  233. package/source/packages/chrome/src/proxy/contextitems.ts +180 -0
  234. package/source/packages/chrome/src/proxy/index.ts +5 -0
  235. package/source/packages/chrome/src/proxy/roxxie.ts +85 -0
  236. package/source/packages/chrome/src/proxy/scramjet.ts +642 -0
  237. package/source/packages/chrome/src/reset.css +124 -0
  238. package/source/packages/chrome/src/runtime-base.ts +16 -0
  239. package/source/packages/chrome/src/sentry.tsx +45 -0
  240. package/source/packages/chrome/src/services/DownloadsService.ts +136 -0
  241. package/source/packages/chrome/src/services/FaviconService.ts +161 -0
  242. package/source/packages/chrome/src/services/KVWrapper.ts +169 -0
  243. package/source/packages/chrome/src/services/ProfileService.ts +94 -0
  244. package/source/packages/chrome/src/services/Service.ts +10 -0
  245. package/source/packages/chrome/src/services/SettingsService.ts +108 -0
  246. package/source/packages/chrome/src/services/TabsService.ts +161 -0
  247. package/source/packages/chrome/src/startup.test.ts +129 -0
  248. package/source/packages/chrome/src/startup.ts +161 -0
  249. package/source/packages/chrome/src/style.css +229 -0
  250. package/source/packages/chrome/src/themes.ts +756 -0
  251. package/source/packages/chrome/src/util/StatefulClass.ts +31 -0
  252. package/source/packages/chrome/src/util/index.ts +74 -0
  253. package/source/packages/chrome/src/util/memoize.ts +13 -0
  254. package/source/packages/chrome/src/vite-env.d.ts +16 -0
  255. package/source/packages/chrome/tsconfig.json +30 -0
  256. package/source/packages/chrome/vite.config.ts +47 -0
  257. package/source/packages/inject/package.json +20 -0
  258. package/source/packages/inject/src/context.ts +194 -0
  259. package/source/packages/inject/src/emulators/alwaysLastBubble.ts +168 -0
  260. package/source/packages/inject/src/emulators/anchors.ts +55 -0
  261. package/source/packages/inject/src/emulators/contextmenu.ts +46 -0
  262. package/source/packages/inject/src/emulators/history.ts +51 -0
  263. package/source/packages/inject/src/emulators/titlewatcher.ts +42 -0
  264. package/source/packages/inject/src/emulators/windowopen.ts +134 -0
  265. package/source/packages/inject/src/errorpage/errorpage.css +234 -0
  266. package/source/packages/inject/src/errorpage/errorpage.html +29 -0
  267. package/source/packages/inject/src/errorpage/errorpage.ts +76 -0
  268. package/source/packages/inject/src/index.ts +62 -0
  269. package/source/packages/inject/src/transport.ts +97 -0
  270. package/source/packages/inject/src/types.d.ts +136 -0
  271. package/source/packages/roxxie-transport/package.json +36 -0
  272. package/source/packages/roxxie-transport/src/binary.ts +398 -0
  273. package/source/packages/roxxie-transport/src/config.ts +254 -0
  274. package/source/packages/roxxie-transport/src/connection.ts +767 -0
  275. package/source/packages/roxxie-transport/src/index.ts +5 -0
  276. package/source/packages/roxxie-transport/src/tracker.ts +651 -0
  277. package/source/packages/roxxie-transport/src/transport.ts +414 -0
  278. package/source/packages/roxxie-transport/tsconfig.json +18 -0
  279. package/source/packages/scramjet/packages/controller/package.json +37 -0
  280. package/source/packages/scramjet/packages/controller/src/index.ts +861 -0
  281. package/source/packages/scramjet/packages/controller/src/inject.ts +365 -0
  282. package/source/packages/scramjet/packages/controller/src/sw.ts +231 -0
  283. package/source/packages/scramjet/packages/controller/src/symbols.ts +1 -0
  284. package/source/packages/scramjet/packages/controller/src/types.d.ts +140 -0
  285. package/source/packages/scramjet/packages/controller/src/typesEntry.ts +6 -0
  286. package/source/packages/scramjet/packages/controller/src/version.ts +30 -0
  287. package/source/packages/scramjet/packages/controller/tsconfig.json +24 -0
  288. package/source/packages/scramjet/packages/core/dist/scramjet-external.mjs +57 -0
  289. package/source/packages/scramjet/packages/core/dist/scramjet.js +13599 -0
  290. package/source/packages/scramjet/packages/core/dist/scramjet.js.map +1 -0
  291. package/source/packages/scramjet/packages/core/dist/scramjet.mjs +13649 -0
  292. package/source/packages/scramjet/packages/core/dist/scramjet.mjs.map +1 -0
  293. package/source/packages/scramjet/packages/core/dist/scramjet.wasm +0 -0
  294. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js +13601 -0
  295. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js.map +1 -0
  296. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs +13651 -0
  297. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs.map +1 -0
  298. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js +23 -0
  299. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js.map +1 -0
  300. package/source/packages/scramjet/packages/core/dist/types/Tap.d.ts +39 -0
  301. package/source/packages/scramjet/packages/core/dist/types/client/client.d.ts +115 -0
  302. package/source/packages/scramjet/packages/core/dist/types/client/entry.d.ts +5 -0
  303. package/source/packages/scramjet/packages/core/dist/types/client/events.d.ts +10 -0
  304. package/source/packages/scramjet/packages/core/dist/types/client/helpers.d.ts +1 -0
  305. package/source/packages/scramjet/packages/core/dist/types/client/index.d.ts +7 -0
  306. package/source/packages/scramjet/packages/core/dist/types/client/location.d.ts +2 -0
  307. package/source/packages/scramjet/packages/core/dist/types/client/shared/eval.d.ts +3 -0
  308. package/source/packages/scramjet/packages/core/dist/types/client/shared/sourcemaps.d.ts +19 -0
  309. package/source/packages/scramjet/packages/core/dist/types/client/shared/wrap.d.ts +4 -0
  310. package/source/packages/scramjet/packages/core/dist/types/client/singletonbox.d.ts +18 -0
  311. package/source/packages/scramjet/packages/core/dist/types/fetch/body.d.ts +3 -0
  312. package/source/packages/scramjet/packages/core/dist/types/fetch/fetch.d.ts +7 -0
  313. package/source/packages/scramjet/packages/core/dist/types/fetch/headers.d.ts +19 -0
  314. package/source/packages/scramjet/packages/core/dist/types/fetch/index.d.ts +128 -0
  315. package/source/packages/scramjet/packages/core/dist/types/fetch/parse.d.ts +23 -0
  316. package/source/packages/scramjet/packages/core/dist/types/fetch/util.d.ts +7 -0
  317. package/source/packages/scramjet/packages/core/dist/types/index.d.ts +12 -0
  318. package/source/packages/scramjet/packages/core/dist/types/shared/cookie.d.ts +26 -0
  319. package/source/packages/scramjet/packages/core/dist/types/shared/headers.d.ts +13 -0
  320. package/source/packages/scramjet/packages/core/dist/types/shared/htmlRules.d.ts +6 -0
  321. package/source/packages/scramjet/packages/core/dist/types/shared/index.d.ts +50 -0
  322. package/source/packages/scramjet/packages/core/dist/types/shared/mime.d.ts +53 -0
  323. package/source/packages/scramjet/packages/core/dist/types/shared/refresh.d.ts +7 -0
  324. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/css.d.ts +4 -0
  325. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/html.d.ts +33 -0
  326. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/index.d.ts +6 -0
  327. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/js.d.ts +11 -0
  328. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/url.d.ts +24 -0
  329. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/wasm.d.ts +7 -0
  330. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/worker.d.ts +3 -0
  331. package/source/packages/scramjet/packages/core/dist/types/shared/set-cookie-parser.d.ts +20 -0
  332. package/source/packages/scramjet/packages/core/dist/types/shared/snapshot.d.ts +186 -0
  333. package/source/packages/scramjet/packages/core/dist/types/shared/sniffEncoding.d.ts +65 -0
  334. package/source/packages/scramjet/packages/core/dist/types/shared/util.d.ts +2 -0
  335. package/source/packages/scramjet/packages/core/dist/types/symbols.d.ts +6 -0
  336. package/source/packages/scramjet/packages/core/dist/types/types.d.ts +60 -0
  337. package/source/packages/scramjet/packages/core/dist/types/typesEntry.d.ts +5 -0
  338. package/source/packages/scramjet/packages/core/lib/index.cjs +7 -0
  339. package/source/packages/scramjet/packages/core/lib/index.d.ts +8 -0
  340. package/source/packages/scramjet/packages/core/package.json +69 -0
  341. package/source/packages/scramjet/packages/core/rewriter/Cargo.lock +1985 -0
  342. package/source/packages/scramjet/packages/core/rewriter/Cargo.toml +20 -0
  343. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/Cargo.toml +15 -0
  344. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/analyze.rs +1118 -0
  345. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/ast_table.rs +927 -0
  346. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/helper_index.rs +556 -0
  347. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/lib.rs +455 -0
  348. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/reachability.rs +85 -0
  349. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/templates.rs +192 -0
  350. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/witness.rs +597 -0
  351. package/source/packages/scramjet/packages/core/rewriter/js/Cargo.toml +18 -0
  352. package/source/packages/scramjet/packages/core/rewriter/js/src/cfg.rs +45 -0
  353. package/source/packages/scramjet/packages/core/rewriter/js/src/changes.rs +379 -0
  354. package/source/packages/scramjet/packages/core/rewriter/js/src/lib.rs +171 -0
  355. package/source/packages/scramjet/packages/core/rewriter/js/src/rewrite.rs +290 -0
  356. package/source/packages/scramjet/packages/core/rewriter/js/src/visitor.rs +967 -0
  357. package/source/packages/scramjet/packages/core/rewriter/native/Cargo.toml +22 -0
  358. package/source/packages/scramjet/packages/core/rewriter/native/src/main.rs +166 -0
  359. package/source/packages/scramjet/packages/core/rewriter/native/src/rewriter.rs +161 -0
  360. package/source/packages/scramjet/packages/core/rewriter/native/src/test_runner.rs +156 -0
  361. package/source/packages/scramjet/packages/core/rewriter/rust-toolchain.toml +5 -0
  362. package/source/packages/scramjet/packages/core/rewriter/rustfmt.toml +2 -0
  363. package/source/packages/scramjet/packages/core/rewriter/transform/Cargo.toml +16 -0
  364. package/source/packages/scramjet/packages/core/rewriter/transform/src/lib.rs +242 -0
  365. package/source/packages/scramjet/packages/core/rewriter/transform/src/transform.rs +123 -0
  366. package/source/packages/scramjet/packages/core/rewriter/wasm/Cargo.toml +22 -0
  367. package/source/packages/scramjet/packages/core/rewriter/wasm/build.sh +128 -0
  368. package/source/packages/scramjet/packages/core/rewriter/wasm/src/error.rs +56 -0
  369. package/source/packages/scramjet/packages/core/rewriter/wasm/src/jsr.rs +125 -0
  370. package/source/packages/scramjet/packages/core/rewriter/wasm/src/lib.rs +144 -0
  371. package/source/packages/scramjet/packages/core/src/Tap.ts +166 -0
  372. package/source/packages/scramjet/packages/core/src/client/client.ts +916 -0
  373. package/source/packages/scramjet/packages/core/src/client/dom/attr.ts +94 -0
  374. package/source/packages/scramjet/packages/core/src/client/dom/beacon.ts +11 -0
  375. package/source/packages/scramjet/packages/core/src/client/dom/cookie.ts +21 -0
  376. package/source/packages/scramjet/packages/core/src/client/dom/css.ts +106 -0
  377. package/source/packages/scramjet/packages/core/src/client/dom/document.ts +140 -0
  378. package/source/packages/scramjet/packages/core/src/client/dom/element.ts +783 -0
  379. package/source/packages/scramjet/packages/core/src/client/dom/fontface.ts +11 -0
  380. package/source/packages/scramjet/packages/core/src/client/dom/fragments.ts +32 -0
  381. package/source/packages/scramjet/packages/core/src/client/dom/history.ts +35 -0
  382. package/source/packages/scramjet/packages/core/src/client/dom/open.ts +59 -0
  383. package/source/packages/scramjet/packages/core/src/client/dom/origin.ts +13 -0
  384. package/source/packages/scramjet/packages/core/src/client/dom/performance.ts +50 -0
  385. package/source/packages/scramjet/packages/core/src/client/dom/protocol.ts +17 -0
  386. package/source/packages/scramjet/packages/core/src/client/dom/storage.ts +107 -0
  387. package/source/packages/scramjet/packages/core/src/client/entry.ts +12 -0
  388. package/source/packages/scramjet/packages/core/src/client/events.ts +10 -0
  389. package/source/packages/scramjet/packages/core/src/client/helpers.ts +7 -0
  390. package/source/packages/scramjet/packages/core/src/client/index.ts +7 -0
  391. package/source/packages/scramjet/packages/core/src/client/location.ts +139 -0
  392. package/source/packages/scramjet/packages/core/src/client/shared/antiantidebugger.ts +20 -0
  393. package/source/packages/scramjet/packages/core/src/client/shared/blob.ts +35 -0
  394. package/source/packages/scramjet/packages/core/src/client/shared/caches.ts +31 -0
  395. package/source/packages/scramjet/packages/core/src/client/shared/chrome.ts +90 -0
  396. package/source/packages/scramjet/packages/core/src/client/shared/err.ts +55 -0
  397. package/source/packages/scramjet/packages/core/src/client/shared/error.ts +42 -0
  398. package/source/packages/scramjet/packages/core/src/client/shared/eval.ts +40 -0
  399. package/source/packages/scramjet/packages/core/src/client/shared/event.ts +215 -0
  400. package/source/packages/scramjet/packages/core/src/client/shared/function.ts +59 -0
  401. package/source/packages/scramjet/packages/core/src/client/shared/import.ts +46 -0
  402. package/source/packages/scramjet/packages/core/src/client/shared/indexeddb.ts +18 -0
  403. package/source/packages/scramjet/packages/core/src/client/shared/opfs.ts +27 -0
  404. package/source/packages/scramjet/packages/core/src/client/shared/postmessage.ts +113 -0
  405. package/source/packages/scramjet/packages/core/src/client/shared/realm.ts +26 -0
  406. package/source/packages/scramjet/packages/core/src/client/shared/requests/eventsource.ts +17 -0
  407. package/source/packages/scramjet/packages/core/src/client/shared/requests/fetch.ts +67 -0
  408. package/source/packages/scramjet/packages/core/src/client/shared/requests/websocket.ts +389 -0
  409. package/source/packages/scramjet/packages/core/src/client/shared/requests/xmlhttprequest.ts +163 -0
  410. package/source/packages/scramjet/packages/core/src/client/shared/settimeout.ts +20 -0
  411. package/source/packages/scramjet/packages/core/src/client/shared/sourcemaps.ts +203 -0
  412. package/source/packages/scramjet/packages/core/src/client/shared/worker.ts +72 -0
  413. package/source/packages/scramjet/packages/core/src/client/shared/wrap.ts +197 -0
  414. package/source/packages/scramjet/packages/core/src/client/singletonbox.ts +52 -0
  415. package/source/packages/scramjet/packages/core/src/client/worker/importScripts.ts +13 -0
  416. package/source/packages/scramjet/packages/core/src/fetch/body.ts +93 -0
  417. package/source/packages/scramjet/packages/core/src/fetch/fetch.ts +323 -0
  418. package/source/packages/scramjet/packages/core/src/fetch/headers.ts +528 -0
  419. package/source/packages/scramjet/packages/core/src/fetch/index.ts +198 -0
  420. package/source/packages/scramjet/packages/core/src/fetch/parse.ts +149 -0
  421. package/source/packages/scramjet/packages/core/src/fetch/util.ts +81 -0
  422. package/source/packages/scramjet/packages/core/src/global.d.ts +32 -0
  423. package/source/packages/scramjet/packages/core/src/index.ts +78 -0
  424. package/source/packages/scramjet/packages/core/src/log.ts +117 -0
  425. package/source/packages/scramjet/packages/core/src/shared/cookie.ts +199 -0
  426. package/source/packages/scramjet/packages/core/src/shared/headers.ts +76 -0
  427. package/source/packages/scramjet/packages/core/src/shared/htmlRules.ts +154 -0
  428. package/source/packages/scramjet/packages/core/src/shared/index.ts +79 -0
  429. package/source/packages/scramjet/packages/core/src/shared/mime.ts +234 -0
  430. package/source/packages/scramjet/packages/core/src/shared/refresh.ts +164 -0
  431. package/source/packages/scramjet/packages/core/src/shared/rewriters/css.ts +67 -0
  432. package/source/packages/scramjet/packages/core/src/shared/rewriters/html.ts +603 -0
  433. package/source/packages/scramjet/packages/core/src/shared/rewriters/index.ts +6 -0
  434. package/source/packages/scramjet/packages/core/src/shared/rewriters/js.ts +158 -0
  435. package/source/packages/scramjet/packages/core/src/shared/rewriters/url.ts +248 -0
  436. package/source/packages/scramjet/packages/core/src/shared/rewriters/wasm.ts +58 -0
  437. package/source/packages/scramjet/packages/core/src/shared/rewriters/worker.ts +37 -0
  438. package/source/packages/scramjet/packages/core/src/shared/set-cookie-parser.ts +195 -0
  439. package/source/packages/scramjet/packages/core/src/shared/snapshot.ts +245 -0
  440. package/source/packages/scramjet/packages/core/src/shared/sniffEncoding.ts +1061 -0
  441. package/source/packages/scramjet/packages/core/src/shared/util.ts +35 -0
  442. package/source/packages/scramjet/packages/core/src/symbols.ts +9 -0
  443. package/source/packages/scramjet/packages/core/src/sync.ts +63 -0
  444. package/source/packages/scramjet/packages/core/src/types.ts +66 -0
  445. package/source/packages/scramjet/packages/core/src/typesEntry.ts +6 -0
  446. package/source/packages/scramjet/packages/core/tsconfig.json +21 -0
  447. package/source/packages/scramjet/packages/rpc/index.ts +100 -0
  448. package/source/packages/scramjet/packages/rpc/package.json +7 -0
  449. package/source/packages/scramjet/packages/utils/package.json +39 -0
  450. package/source/packages/scramjet/packages/utils/src/alwaysLastBubble.ts +172 -0
  451. package/source/packages/scramjet/packages/utils/src/catch-escaped-links.ts +34 -0
  452. package/source/packages/scramjet/packages/utils/src/event-handler-plugin.ts +86 -0
  453. package/source/packages/scramjet/packages/utils/src/global.d.ts +8 -0
  454. package/source/packages/scramjet/packages/utils/src/http-cache-plugin.ts +475 -0
  455. package/source/packages/scramjet/packages/utils/src/index.ts +26 -0
  456. package/source/packages/scramjet/packages/utils/src/link-handler-plugin.ts +75 -0
  457. package/source/packages/scramjet/packages/utils/src/typesEntry.ts +5 -0
  458. package/source/packages/scramjet/packages/utils/src/url-watcher.ts +37 -0
  459. package/source/packages/scramjet/packages/utils/src/version.ts +40 -0
  460. package/source/packages/scramjet/packages/utils/tsconfig.json +11 -0
  461. package/source/packages/scramjet/patches/htmlparser2@12.0.0.patch +124 -0
  462. package/source/packages/scramjet/rspack.config.ts +613 -0
  463. package/source/packages/scramjet/tsconfig.json +11 -0
  464. package/source/packages/tracker-protocol/package.json +31 -0
  465. package/source/packages/tracker-protocol/src/index.ts +745 -0
  466. package/source/packages/tracker-protocol/tsconfig.json +18 -0
  467. package/source/pnpm-lock.yaml +12018 -0
  468. package/source/pnpm-workspace.yaml +31 -0
  469. package/source/rspack.config.ts +103 -0
  470. package/source/scripts/update-adblock-assets.mjs +164 -0
  471. package/third_party/filter-lists/LICENSE-CC-BY-SA-3.0.txt +359 -0
  472. package/third_party/filter-lists/LICENSE-GPL-3.0.txt +674 -0
  473. package/third_party/filter-lists/LICENSE-MPL-2.0.txt +375 -0
  474. package/third_party/filter-lists/README.md +24 -0
  475. package/third_party/filter-lists/easylist.txt +83088 -0
  476. package/third_party/filter-lists/easyprivacy.txt +56361 -0
  477. package/third_party/filter-lists/manifest.json +56 -0
  478. package/third_party/filter-lists/ublock-filters.txt +10937 -0
  479. package/third_party/filter-lists/ublock-privacy.txt +3209 -0
  480. package/third_party/filter-lists/ublock-resources.json +1852 -0
  481. 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
+ }