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,487 @@
1
+ // HTTP cache plugin for ScramjetFetchHandler.
2
+ //
3
+ // Backported from packages/scramjet/packages/controller/src/cache.ts. The
4
+ // scramjet/controller version uses the `$scramjet.Plugin` global (because the
5
+ // controller package itself runs against the scramjet IIFE bundle); chrome
6
+ // imports through `@mercuryworkshop/scramjet/bundled` instead, so we pull
7
+ // `Plugin` and friends from there directly.
8
+ //
9
+ // Service-worker `fetch` ignores the browser's HTTP cache, so without this
10
+ // every navigation re-runs the full network fetch even for unchanged
11
+ // resources. This plugin caches the **upstream** response (the BareResponse
12
+ // as received from the network, BEFORE rewriteResponseHeaders / rewriteBody
13
+ // run). On a hit we hand that same untouched response to the pipeline, which
14
+ // then re-rewrites with the current Frame's prefix.
15
+ //
16
+ // Storing pre-rewrite means:
17
+ // - The cache is shared across Frames, Controllers, and page reloads --
18
+ // one Frame's hit serves another Frame's request because the stored
19
+ // bytes contain only the upstream's URLs, not any frame-bound prefix.
20
+ // - Redirect Location / Content-Location and Link headers come out of
21
+ // `rewriteResponseHeaders` correctly on each hit, because that runs
22
+ // on the cache-derived response just like a fresh one.
23
+ // - We don't skip the rewriter on hit; we only skip the network. That's
24
+ // where the win actually is for service-worker proxying.
25
+ //
26
+ // Implementation aims for RFC 9111 (HTTP caching) compliance for a
27
+ // PRIVATE cache (browser-local, single-user):
28
+ //
29
+ // - Only GET / HEAD are cached.
30
+ // - Cacheable status codes per RFC 9110 §15.1: 200 203 204 300 301 308
31
+ // 404 405 410 414 501. Other statuses pass through. 206 is omitted
32
+ // because the Cache API spec (Service Workers §cache-put) rejects
33
+ // partial responses outright.
34
+ // - `Cache-Control: no-store` and `Vary: *` opt out.
35
+ // - Freshness:
36
+ // 1. `Cache-Control: s-maxage` (private cache treats this same as
37
+ // max-age),
38
+ // 2. `Cache-Control: max-age`,
39
+ // 3. `Expires`,
40
+ // 4. heuristic 10% × (Date - Last-Modified) per RFC 9111 §4.2.2.
41
+ // - `Cache-Control: no-cache` / `Pragma: no-cache` / `Cache-Control:
42
+ // immutable` are honoured.
43
+ // - `Vary` is honoured by storing one entry per (URL × selected-headers)
44
+ // pair via the underlying Cache API's built-in matching.
45
+ //
46
+ // 304 revalidation isn't handled here yet -- stale entries fall through to
47
+ // a full refetch. Adding it cleanly requires a hook position that lets us
48
+ // substitute the cached body AFTER the network 304 arrives but BEFORE
49
+ // `rewriteBody` runs, without going through `rewriteBody` again. That can
50
+ // come later.
51
+
52
+ import {
53
+ Plugin,
54
+ type ScramjetFetchHandler,
55
+ type ScramjetFetchRequest,
56
+ type ScramjetHeaders,
57
+ } from "@mercuryworkshop/scramjet/bundled";
58
+ import { BareResponse } from "@mercuryworkshop/proxy-transports";
59
+
60
+ export const CACHE_NAME = "scramjet-http-cache-v2";
61
+
62
+ /** Header recording when this entry entered the cache (ms since epoch). */
63
+ const STORED_AT_HEADER = "x-sj-cached-at";
64
+
65
+ /**
66
+ * Status codes RFC 9110 §15.1 marks as "cacheable by default", minus 206:
67
+ * the Cache API rejects partial responses (cache.put throws TypeError on
68
+ * any non-200/non-OK response with a Content-Range), so storing them is a
69
+ * non-starter regardless of what HTTP allows.
70
+ */
71
+ const DEFAULT_CACHEABLE_STATUSES = new Set([
72
+ 200, 203, 204, 300, 301, 308, 404, 405, 410, 414, 501,
73
+ ]);
74
+
75
+ /**
76
+ * Statuses for which the Fetch spec forbids a body. The Response constructor
77
+ * throws TypeError if you pair any of these with a body -- even an empty
78
+ * string or 0-byte buffer.
79
+ */
80
+ const NULL_BODY_STATUSES = new Set([101, 103, 204, 205, 304]);
81
+
82
+ interface CacheControlDirectives {
83
+ "no-store"?: boolean;
84
+ "no-cache"?: boolean;
85
+ "must-revalidate"?: boolean;
86
+ "proxy-revalidate"?: boolean;
87
+ private?: boolean;
88
+ public?: boolean;
89
+ "max-age"?: number;
90
+ "s-maxage"?: number;
91
+ "stale-while-revalidate"?: number;
92
+ "stale-if-error"?: number;
93
+ immutable?: boolean;
94
+ }
95
+
96
+ function parseCacheControl(value: string | null): CacheControlDirectives {
97
+ const out: CacheControlDirectives = {};
98
+ if (!value) return out;
99
+ for (const raw of value.split(",")) {
100
+ const part = raw.trim();
101
+ if (!part) continue;
102
+ const eq = part.indexOf("=");
103
+ const name = (eq === -1 ? part : part.slice(0, eq))
104
+ .trim()
105
+ .toLowerCase() as keyof CacheControlDirectives;
106
+ if (eq === -1) {
107
+ (out as any)[name] = true;
108
+ continue;
109
+ }
110
+ let v = part.slice(eq + 1).trim();
111
+ if (v.startsWith('"') && v.endsWith('"')) v = v.slice(1, -1);
112
+ if (
113
+ name === "max-age" ||
114
+ name === "s-maxage" ||
115
+ name === "stale-while-revalidate" ||
116
+ name === "stale-if-error"
117
+ ) {
118
+ const n = parseInt(v, 10);
119
+ if (Number.isFinite(n) && n >= 0) (out as any)[name] = n;
120
+ } else {
121
+ (out as any)[name] = true;
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+
127
+ /**
128
+ * RFC 9111 §4.2.1 freshness lifetime calculation, simplified for a private
129
+ * cache (so s-maxage is treated identically to max-age).
130
+ */
131
+ function freshnessLifetimeSeconds(
132
+ headers: Headers,
133
+ cc: CacheControlDirectives,
134
+ dateMs: number
135
+ ): number | null {
136
+ if (cc["s-maxage"] !== undefined) return cc["s-maxage"];
137
+ if (cc["max-age"] !== undefined) return cc["max-age"];
138
+
139
+ const expires = headers.get("expires");
140
+ if (expires) {
141
+ const expMs = Date.parse(expires);
142
+ if (Number.isFinite(expMs)) {
143
+ return Math.max(0, (expMs - dateMs) / 1000);
144
+ }
145
+ }
146
+
147
+ const lastModified = headers.get("last-modified");
148
+ if (lastModified) {
149
+ const lmMs = Date.parse(lastModified);
150
+ if (Number.isFinite(lmMs) && lmMs <= dateMs) {
151
+ // RFC 9111 §4.2.2 heuristic: 10% of the time since Last-Modified.
152
+ return ((dateMs - lmMs) * 0.1) / 1000;
153
+ }
154
+ }
155
+
156
+ return null;
157
+ }
158
+
159
+ /** Current age (seconds) of a stored response per RFC 9111 §4.2.3. */
160
+ function currentAgeSeconds(headers: Headers, storedAtMs: number): number {
161
+ const ageHeader = headers.get("age");
162
+ const initialAge = ageHeader ? parseInt(ageHeader, 10) || 0 : 0;
163
+ const residentTime = (Date.now() - storedAtMs) / 1000;
164
+ return initialAge + residentTime;
165
+ }
166
+
167
+ function isCacheableMethod(method: string): boolean {
168
+ return method === "GET" || method === "HEAD";
169
+ }
170
+
171
+ /**
172
+ * Whether a response (status + Cache-Control + Vary) is allowed to be stored.
173
+ * RFC 9110 §15.1 + RFC 9111 §3. `headers` is the upstream's raw response
174
+ * headers, not yet through scramjet's response-header rewriter.
175
+ */
176
+ function responseIsStorable(
177
+ status: number,
178
+ headers: Headers,
179
+ method: string
180
+ ): boolean {
181
+ if (!isCacheableMethod(method)) return false;
182
+ if (!DEFAULT_CACHEABLE_STATUSES.has(status)) return false;
183
+
184
+ const cc = parseCacheControl(headers.get("cache-control"));
185
+ if (cc["no-store"]) return false;
186
+
187
+ // "Vary: *" means "never reusable".
188
+ const vary = headers.get("vary");
189
+ if (vary && vary.split(",").some((v) => v.trim() === "*")) return false;
190
+
191
+ return true;
192
+ }
193
+
194
+ /** Build a synthetic cache-key Request keyed by the *underlying* URL. */
195
+ function buildCacheKeyRequest(
196
+ parsedUrl: string,
197
+ headers: ScramjetHeaders
198
+ ): Request {
199
+ const native = new Headers();
200
+ for (const [k, v] of headers.toRawHeaders()) {
201
+ try {
202
+ native.append(k, v);
203
+ } catch {}
204
+ }
205
+ const cacheKeyUrl =
206
+ "https://sj-cache.invalid/" + encodeURIComponent(parsedUrl);
207
+ return new Request(cacheKeyUrl, { method: "GET", headers: native });
208
+ }
209
+
210
+ /** Rebuild a Headers object from the BareResponse's rawHeaders array. */
211
+ function nativeHeadersFromRaw(
212
+ raw: ReadonlyArray<readonly [string, string]>
213
+ ): Headers {
214
+ const h = new Headers();
215
+ for (const [k, v] of raw) {
216
+ try {
217
+ h.append(k, v);
218
+ } catch {
219
+ // some upstream headers (e.g. malformed Set-Cookie) are rejected
220
+ // by the native Headers; just drop them.
221
+ }
222
+ }
223
+ return h;
224
+ }
225
+
226
+ /** Strip our internal bookkeeping from a stored Response's headers. */
227
+ function strippedHeadersFromStored(stored: Response): Headers {
228
+ const out = new Headers();
229
+ for (const [k, v] of stored.headers.entries()) {
230
+ if (k.toLowerCase() === STORED_AT_HEADER) continue;
231
+ try {
232
+ out.append(k, v);
233
+ } catch {}
234
+ }
235
+ return out;
236
+ }
237
+
238
+ /**
239
+ * Turn an upstream BareResponse into a BareResponse that:
240
+ * - has the same headers/status/statusText
241
+ * - has its body replaced with a buffered ArrayBuffer (so the pipeline can
242
+ * read it again after we've consumed the original stream for the cache)
243
+ * Returns the buffered bytes too so the caller can hand them off elsewhere.
244
+ */
245
+ async function rebuildBareResponseWithBuffer(
246
+ bare: BareResponse
247
+ ): Promise<{ replacement: BareResponse; bodyBuffer: ArrayBuffer | null }> {
248
+ const status = bare.status;
249
+ const isNullBody = NULL_BODY_STATUSES.has(status);
250
+
251
+ const headers = nativeHeadersFromRaw(bare.rawHeaders);
252
+
253
+ if (isNullBody) {
254
+ return {
255
+ replacement: BareResponse.fromNativeResponse(
256
+ new Response(null, {
257
+ status,
258
+ statusText: bare.statusText,
259
+ headers,
260
+ })
261
+ ),
262
+ bodyBuffer: null,
263
+ };
264
+ }
265
+
266
+ const buf = await bare.arrayBuffer();
267
+ return {
268
+ replacement: BareResponse.fromNativeResponse(
269
+ new Response(buf, {
270
+ status,
271
+ statusText: bare.statusText,
272
+ headers,
273
+ })
274
+ ),
275
+ bodyBuffer: buf,
276
+ };
277
+ }
278
+
279
+ /**
280
+ * Build a `Response` to put in the Cache API. Tags it with our internal
281
+ * STORED_AT_HEADER so freshness can be computed on later lookups.
282
+ */
283
+ function buildStorableResponse(
284
+ body: ArrayBuffer | null,
285
+ status: number,
286
+ statusText: string,
287
+ rawHeaders: ReadonlyArray<readonly [string, string]>
288
+ ): Response {
289
+ const native = nativeHeadersFromRaw(rawHeaders);
290
+ native.set(STORED_AT_HEADER, String(Date.now()));
291
+ return new Response(NULL_BODY_STATUSES.has(status) ? null : body, {
292
+ status,
293
+ statusText,
294
+ headers: native,
295
+ });
296
+ }
297
+
298
+ export interface HttpCachePluginOptions {
299
+ /** Name of the underlying Cache API entry. Defaults to CACHE_NAME. */
300
+ cacheName?: string;
301
+ }
302
+
303
+ /**
304
+ * RFC-9111-ish HTTP cache for ScramjetFetchHandler. Subclasses
305
+ * `Plugin` (from scramjet/core) so it composes with the same hook plumbing
306
+ * every other scramjet plugin uses; `install(target)` wires it onto a
307
+ * Controller (or any object exposing a `fetchHandler`), and `bust()` drops
308
+ * the underlying `caches` entry.
309
+ *
310
+ * One instance can be installed onto multiple Controllers -- the WeakMap of
311
+ * "did this request come from cache?" book-keeping is per-instance, not
312
+ * per-Controller, so nothing leaks across installs.
313
+ */
314
+ export class HttpCachePlugin extends Plugin {
315
+ readonly cacheName: string;
316
+
317
+ private cachePromise: Promise<Cache> | null = null;
318
+ // Marks requests whose `earlyResponse` we sourced from the cache, so the
319
+ // preresponse hook below knows not to re-store them. WeakMap keys are
320
+ // the request objects so entries clean themselves up automatically.
321
+ private cameFromCache = new WeakMap<ScramjetFetchRequest, true>();
322
+
323
+ constructor(options: HttpCachePluginOptions = {}) {
324
+ super("scramjet-http-cache");
325
+ this.cacheName = options.cacheName ?? CACHE_NAME;
326
+ }
327
+
328
+ /** Lazy-open the underlying Cache. Memoized for the plugin's lifetime. */
329
+ private openCache(): Promise<Cache> {
330
+ if (!this.cachePromise) {
331
+ this.cachePromise = caches.open(this.cacheName);
332
+ }
333
+ return this.cachePromise;
334
+ }
335
+
336
+ /**
337
+ * Wire the cache up to a Controller (or anything exposing `fetchHandler`).
338
+ * Safe to call multiple times across different Controllers.
339
+ */
340
+ install(target: { fetchHandler: ScramjetFetchHandler }): void {
341
+ const hooks = target.fetchHandler.hooks.fetch;
342
+
343
+ // ----- request: cache lookup --------------------------------------
344
+ this.tap(hooks.request, async (ctx, props) => {
345
+ const req = ctx.request;
346
+ if (!isCacheableMethod(req.method)) return;
347
+ const reqCache = req.cache as string;
348
+ // Honour the request's own cache mode where it asks for fresh data.
349
+ if (reqCache === "no-store" || reqCache === "reload") return;
350
+ // Don't undo an earlyResponse another plugin already set.
351
+ if (props.earlyResponse) return;
352
+
353
+ const cache = await this.openCache();
354
+ const stored = await cache.match(
355
+ buildCacheKeyRequest(ctx.parsed.url.href, req.initialHeaders)
356
+ );
357
+ if (!stored) {
358
+ return;
359
+ }
360
+
361
+ const storedAt = parseInt(
362
+ stored.headers.get(STORED_AT_HEADER) ?? "0",
363
+ 10
364
+ );
365
+ const cc = parseCacheControl(stored.headers.get("cache-control"));
366
+
367
+ const pragmaNoCache = (stored.headers.get("pragma") ?? "")
368
+ .toLowerCase()
369
+ .includes("no-cache");
370
+ const mustRevalidateBeforeUse =
371
+ cc["no-cache"] === true || pragmaNoCache || reqCache === "no-cache";
372
+
373
+ const dateMs = (() => {
374
+ const d = stored.headers.get("date");
375
+ if (d) {
376
+ const v = Date.parse(d);
377
+ if (Number.isFinite(v)) return v;
378
+ }
379
+ return storedAt || Date.now();
380
+ })();
381
+
382
+ const lifetime = freshnessLifetimeSeconds(stored.headers, cc, dateMs);
383
+ const age = currentAgeSeconds(stored.headers, storedAt);
384
+ const fresh =
385
+ !mustRevalidateBeforeUse && lifetime !== null && age < lifetime;
386
+
387
+ // `immutable` short-circuits the freshness check (RFC 8246)
388
+ // provided the client hasn't asked for a forced revalidation.
389
+ const immutable =
390
+ cc.immutable === true &&
391
+ reqCache !== "no-cache" &&
392
+ reqCache !== "reload";
393
+
394
+ if (!fresh && !immutable) {
395
+ // Stale; fall through to the network. (TODO: 304 revalidation.)
396
+ return;
397
+ }
398
+
399
+ // Build a BareResponse around the stored bytes/headers and hand
400
+ // it to doNetworkFetch via earlyResponse. The pipeline will then
401
+ // run rewriteResponseHeaders/rewriteBody/etc. as if we'd just
402
+ // fetched it.
403
+ const headers = strippedHeadersFromStored(stored);
404
+ // Recompute Age the consumer sees so it isn't stuck at storage
405
+ // time.
406
+ if (storedAt) {
407
+ headers.set("age", String(Math.floor((Date.now() - storedAt) / 1000)));
408
+ }
409
+
410
+ const isNullBody = NULL_BODY_STATUSES.has(stored.status);
411
+ const earlyBody = isNullBody ? null : await stored.arrayBuffer();
412
+
413
+ const earlyResponse = BareResponse.fromNativeResponse(
414
+ new Response(earlyBody, {
415
+ status: stored.status,
416
+ statusText: stored.statusText,
417
+ headers,
418
+ })
419
+ );
420
+
421
+ this.cameFromCache.set(req, true);
422
+ props.earlyResponse = earlyResponse;
423
+ });
424
+
425
+ // ----- preresponse: cache store -----------------------------------
426
+ this.tap(hooks.preresponse, async (ctx, props) => {
427
+ const req = ctx.request;
428
+ // Skip if this body came back via cache.match -- restoring it
429
+ // would just rewrite the same bytes with a fresh STORED_AT_HEADER
430
+ // (resetting the freshness clock).
431
+ if (this.cameFromCache.has(req)) {
432
+ this.cameFromCache.delete(req);
433
+ return;
434
+ }
435
+
436
+ if ((req.cache as string) === "no-store") return;
437
+ if (!isCacheableMethod(req.method)) return;
438
+
439
+ const headers = nativeHeadersFromRaw(props.response.rawHeaders);
440
+ if (!responseIsStorable(props.response.status, headers, req.method))
441
+ return;
442
+
443
+ // Drain the stream once and rebuild the BareResponse around the
444
+ // buffered copy so the rest of doHandleFetch can still read it.
445
+ const { replacement, bodyBuffer } = await rebuildBareResponseWithBuffer(
446
+ props.response
447
+ );
448
+ props.response = replacement;
449
+
450
+ const cacheKey = buildCacheKeyRequest(
451
+ ctx.parsed.url.href,
452
+ req.initialHeaders
453
+ );
454
+ const toStore = buildStorableResponse(
455
+ bodyBuffer,
456
+ props.response.status,
457
+ props.response.statusText,
458
+ props.response.rawHeaders
459
+ );
460
+
461
+ try {
462
+ const cache = await this.openCache();
463
+ await cache.put(cacheKey, toStore);
464
+ } catch (err) {
465
+ // Cache.put can fail on opaque or oddly-headered responses;
466
+ // don't let a cache write failure break the actual fetch.
467
+ console.warn("[scramjet-http-cache] cache.put failed:", err);
468
+ }
469
+ });
470
+ }
471
+
472
+ /**
473
+ * Drop every entry in the HTTP cache. Returns whether the underlying
474
+ * Cache existed and was deleted.
475
+ */
476
+ async bust(): Promise<boolean> {
477
+ try {
478
+ // Drop the memoized handle too; the next install will re-open
479
+ // against a fresh empty cache.
480
+ this.cachePromise = null;
481
+ return await caches.delete(this.cacheName);
482
+ } catch (err) {
483
+ console.error("[scramjet-http-cache] bust failed:", err);
484
+ return false;
485
+ }
486
+ }
487
+ }
@@ -0,0 +1,11 @@
1
+ export const codecEncode = (url: string) => {
2
+ if (!url) return url;
3
+
4
+ return encodeURIComponent(url);
5
+ };
6
+
7
+ export const codecDecode = (url: string) => {
8
+ if (!url) return url;
9
+
10
+ return decodeURIComponent(url);
11
+ };
@@ -0,0 +1,180 @@
1
+ import { settingsService, tabsService } from "..";
2
+ import { AVAILABLE_SEARCH_ENGINES } from "@components/Omnibar/suggestions";
3
+ import type { Chromebound } from "../../../inject/src/types";
4
+ import {
5
+ iconAdd,
6
+ iconBack,
7
+ iconBookmark,
8
+ iconCopy,
9
+ iconForwards,
10
+ iconLink,
11
+ iconRefresh,
12
+ iconSave,
13
+ iconSearch,
14
+ } from "../icons";
15
+ import type { Tab } from "../Tab/Tab";
16
+
17
+ export function pageContextItems(
18
+ tab: Tab,
19
+ { selection, image, anchor }: Chromebound["contextmenu"][0]
20
+ ) {
21
+ if (selection && selection.toString().length > 0) {
22
+ return [
23
+ {
24
+ label: "Search",
25
+ icon: iconSearch,
26
+ action: () => {
27
+ const query = selection.toString();
28
+ if (query) {
29
+ tab.pushNavigate(
30
+ new URL(
31
+ AVAILABLE_SEARCH_ENGINES[
32
+ settingsService.settings.defaultSearchEngine
33
+ ].searchUrlBuilder(query)
34
+ )
35
+ );
36
+ }
37
+ },
38
+ },
39
+ {
40
+ label: "Copy",
41
+ icon: iconCopy,
42
+ action: () => {
43
+ navigator.clipboard.writeText(selection.toString());
44
+ },
45
+ },
46
+ // {
47
+ // label: "Inspect",
48
+ // action: () => {
49
+ // tab.devtoolsOpen = true;
50
+ // // if (e.target) requestInspectElement([e.target as HTMLElement, tab]);
51
+ // },
52
+ // icon: iconCode,
53
+ // },
54
+ ];
55
+ }
56
+
57
+ if (image) {
58
+ return [
59
+ {
60
+ label: "Open Image in New Tab",
61
+ action: () => {
62
+ // TODO: this is broken lol
63
+ if (image.src) {
64
+ let newTab = tabsService.newTab();
65
+ newTab.pushNavigate(new URL(image.src));
66
+ }
67
+ },
68
+ },
69
+ {
70
+ label: "Copy Image URL",
71
+ action: () => {
72
+ navigator.clipboard.writeText(image.src);
73
+ },
74
+ },
75
+ {
76
+ label: "Copy Image",
77
+ action: () => {
78
+ // copyImageToClipboard(target);
79
+ },
80
+ },
81
+ {
82
+ label: "Save Image As...",
83
+ action: () => {
84
+ // TODO
85
+ },
86
+ },
87
+ // {
88
+ // label: "Inspect",
89
+ // action: () => {
90
+ // tab.devtoolsOpen = true;
91
+ // // if (e.target) requestInspectElement([e.target as HTMLElement, tab]);
92
+ // },
93
+ // icon: iconCode,
94
+ // },
95
+ ];
96
+ } else if (anchor) {
97
+ return [
98
+ {
99
+ label: "Open Link",
100
+ action: () => {
101
+ if (anchor.href) {
102
+ tabsService.activetab.pushNavigate(new URL(anchor.href));
103
+ }
104
+ },
105
+ icon: iconLink,
106
+ },
107
+ {
108
+ label: "Open Link in New Tab",
109
+ action: () => {
110
+ if (anchor.href) {
111
+ tabsService.newTab(new URL(anchor.href));
112
+ }
113
+ },
114
+ icon: iconAdd,
115
+ },
116
+ {
117
+ label: "Copy Link Address",
118
+ action: () => {
119
+ navigator.clipboard.writeText(anchor.href);
120
+ },
121
+ icon: iconCopy,
122
+ },
123
+ {
124
+ label: "Save Link As...",
125
+ action: () => {
126
+ // TODO
127
+ },
128
+ icon: iconSave,
129
+ },
130
+ // {
131
+ // label: "Inspect",
132
+ // action: () => {
133
+ // tab.devtoolsOpen = true;
134
+ // // if (e.target) requestInspectElement([e.target as HTMLElement, tab]);
135
+ // },
136
+ // icon: iconCode,
137
+ // },
138
+ ];
139
+ }
140
+
141
+ return [
142
+ {
143
+ label: "Back",
144
+ action: () => {
145
+ tab.back();
146
+ },
147
+ icon: iconBack,
148
+ },
149
+ {
150
+ label: "Forward",
151
+ action: () => {
152
+ tab.forward();
153
+ },
154
+ icon: iconForwards,
155
+ },
156
+ {
157
+ label: "Reload",
158
+ action: () => {
159
+ tab.reload();
160
+ },
161
+ icon: iconRefresh,
162
+ },
163
+ {
164
+ label: "Bookmark",
165
+ action: () => {
166
+ // TODO:
167
+ console.log("Bookmarking", tab.title, tab.url);
168
+ },
169
+ icon: iconBookmark,
170
+ },
171
+ // {
172
+ // label: "Inspect",
173
+ // action: () => {
174
+ // tab.devtoolsOpen = true;
175
+ // // if (e.target) requestInspectElement([e.target as HTMLElement, tab]);
176
+ // },
177
+ // icon: iconCode,
178
+ // },
179
+ ];
180
+ }
@@ -0,0 +1,5 @@
1
+ import { runtimeAssetUrl } from "../runtime-base.ts";
2
+
3
+ export const basePrefix = runtimeAssetUrl("~/sj/").pathname;
4
+
5
+ export let isIsolated = import.meta.env.VITE_ISOLATION_ORIGIN !== "none";