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,97 @@
1
+ import type {
2
+ ProxyTransport,
3
+ TransferrableResponse,
4
+ RawHeaders,
5
+ WebSocketMessage,
6
+ } from "@mercuryworkshop/proxy-transports";
7
+ import type { RpcHelper } from "@mercuryworkshop/rpc";
8
+ import { ExecutionContextWrapper } from "./context";
9
+
10
+ const MessagePort_postMessage = MessagePort.prototype.postMessage;
11
+ const postMessage = (
12
+ port: MessagePort,
13
+ data: any,
14
+ transfer?: Transferable[]
15
+ ) => {
16
+ MessagePort_postMessage.call(port, data, transfer as any);
17
+ };
18
+
19
+ export class RemoteTransport implements ProxyTransport {
20
+ public ready = true;
21
+ async init() {}
22
+
23
+ constructor(public context: ExecutionContextWrapper) {}
24
+ connect(
25
+ url: URL,
26
+ protocols: string[],
27
+ requestHeaders: RawHeaders,
28
+ onopen: (protocol: string, extensions: string) => void,
29
+ onmessage: (data: Blob | ArrayBuffer | string) => void,
30
+ onclose: (code: number, reason: string) => void,
31
+ onerror: (error: string) => void
32
+ ): [
33
+ (data: Blob | ArrayBuffer | string) => void,
34
+ (code: number, reason: string) => void,
35
+ ] {
36
+ const channel = new MessageChannel();
37
+ const port = channel.port1;
38
+ console.warn("connecting");
39
+ this.context.rpc
40
+ .call(
41
+ "wsconnect",
42
+ {
43
+ url: url.href,
44
+ protocols,
45
+ requestHeaders,
46
+ port: channel.port2,
47
+ },
48
+ [channel.port2]
49
+ )
50
+ .then((response) => {
51
+ if (response.result === "success") {
52
+ onopen(response.protocol, response.extensions);
53
+ } else {
54
+ onerror(response.error);
55
+ }
56
+ });
57
+ port.onmessage = (ev) => {
58
+ const message = ev.data as WebSocketMessage;
59
+ if (message.type === "data") {
60
+ onmessage(message.data);
61
+ } else if (message.type === "close") {
62
+ onclose(message.code, message.reason);
63
+ }
64
+ };
65
+ port.onmessageerror = (ev) => {
66
+ console.error("onmessageerror (this should never happen!)", ev);
67
+ onerror("Message error in transport port");
68
+ };
69
+
70
+ return [
71
+ (data) => {
72
+ postMessage(
73
+ port,
74
+ {
75
+ type: "data",
76
+ data: data,
77
+ },
78
+ data instanceof ArrayBuffer ? [data] : []
79
+ );
80
+ },
81
+ (code) => {
82
+ postMessage(port, {
83
+ type: "close",
84
+ code: code,
85
+ });
86
+ },
87
+ ];
88
+ }
89
+
90
+ async request(
91
+ remote: URL,
92
+ method: string,
93
+ body: BodyInit | null,
94
+ headers: RawHeaders,
95
+ _signal: AbortSignal | undefined
96
+ ): Promise<TransferrableResponse> {}
97
+ }
@@ -0,0 +1,136 @@
1
+ import {
2
+ ScramjetInterface,
3
+ TrackedHistoryState,
4
+ } from "@mercuryworkshop/scramjet/bundled";
5
+ import type { RawHeaders } from "@mercuryworkshop/proxy-transports";
6
+ import type { ThemeDefinition } from "../../chrome/src/themes";
7
+ export type FrameSequence = number[];
8
+
9
+ export type Chromebound = {
10
+ wsconnect: [
11
+ {
12
+ url: string;
13
+ protocols: string[];
14
+ requestHeaders: RawHeaders;
15
+ port: MessagePort;
16
+ },
17
+ (
18
+ | {
19
+ result: "success";
20
+ protocol: string;
21
+ extensions: string;
22
+ }
23
+ | {
24
+ result: "failure";
25
+ error: string;
26
+ }
27
+ ),
28
+ ];
29
+ contextmenu: [
30
+ {
31
+ x: number;
32
+ y: number;
33
+ selection?: string;
34
+ image?: {
35
+ src: string;
36
+ width: number;
37
+ height: number;
38
+ };
39
+ anchor?: {
40
+ href: string;
41
+ };
42
+ video?: {
43
+ src: string;
44
+ width: number;
45
+ height: number;
46
+ };
47
+ },
48
+ ];
49
+ titlechange: [
50
+ {
51
+ title?: string;
52
+ icon?: string;
53
+ },
54
+ ];
55
+ load: [
56
+ {
57
+ url: string;
58
+ sequence: FrameSequence;
59
+ },
60
+ ];
61
+ registerFrameContext: [{ id: string }];
62
+ newtab: [
63
+ {
64
+ url: string;
65
+ },
66
+ {
67
+ sequence: FrameSequence;
68
+ },
69
+ ];
70
+ history_pushState: [
71
+ {
72
+ state: any;
73
+ title: string;
74
+ url: string;
75
+ },
76
+ ];
77
+ history_replaceState: [
78
+ {
79
+ state: any;
80
+ title: string;
81
+ url: string;
82
+ },
83
+ ];
84
+ history_go: [{ delta: number }];
85
+ /**
86
+ * Inject → chrome: a write to `document.cookie` (or equivalent) just landed
87
+ * in this frame. Chrome updates its shared cookieJar and fans the batch out
88
+ * to every other live frame context so their local jars stay in sync.
89
+ */
90
+ setCookies: [
91
+ {
92
+ cookies: { cookie: string; url: string }[];
93
+ },
94
+ ];
95
+ };
96
+
97
+ export type Framebound = {
98
+ navigate: [
99
+ {
100
+ url: string;
101
+ },
102
+ ];
103
+ popstate: [
104
+ {
105
+ state: any;
106
+ url: string;
107
+ title: string;
108
+ },
109
+ ];
110
+ fetchBlob: [
111
+ string,
112
+ {
113
+ body: ArrayBuffer;
114
+ contentType: string;
115
+ },
116
+ ];
117
+ setCookies: [
118
+ {
119
+ cookies: { cookie: string; url: string }[];
120
+ },
121
+ ];
122
+ updateTheme: [ThemeDefinition];
123
+ };
124
+
125
+ export type InjectScramjetInit = {
126
+ sequence: FrameSequence;
127
+ id: string;
128
+ config: any;
129
+ cookies: string;
130
+ getInjectScripts: ScramjetInterface["getInjectScripts"];
131
+ prefix: string;
132
+ codecEncode: ScramjetInterface["codecEncode"];
133
+ codecDecode: ScramjetInterface["codecDecode"];
134
+ initHeaders: RawHeaders;
135
+ history: TrackedHistoryState[];
136
+ };
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "roxxie-transports",
3
+ "version": "6.0.0",
4
+ "description": "Tracker-discovered WebRTC transport for Roxxie Proxy U",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/src/index.d.ts",
10
+ "import": "./dist/src/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist/src"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json",
18
+ "test": "npm run build && node --test dist/test/*.test.js"
19
+ },
20
+ "engines": {
21
+ "node": ">=20"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "license": "AGPL-3.0-only",
27
+ "dependencies": {
28
+ "@mercuryworkshop/proxy-transports": "catalog:",
29
+ "roxxie-transports-adrift-protocol": "workspace:*",
30
+ "roxxie-transports-tracker-protocol": "workspace:*"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^20.0.0",
34
+ "typescript": "~5.9.3"
35
+ }
36
+ }
@@ -0,0 +1,398 @@
1
+ import {
2
+ MAX_DATA_CHANNEL_MESSAGE_BYTES,
3
+ PROTOCOL_VERSION,
4
+ type BinaryTransport,
5
+ } from "roxxie-transports-adrift-protocol";
6
+ import type {
7
+ CandidateNode,
8
+ IceCandidateJSON,
9
+ RTCIceServerJSON,
10
+ SessionDescriptionJSON,
11
+ WebRTCOffer,
12
+ } from "roxxie-transports-tracker-protocol";
13
+
14
+ import type { ConnectionTimeouts } from "./config.js";
15
+ import type { TrackerSignaling } from "./tracker.js";
16
+
17
+ export const BINARY_TRANSPORT_BUFFER_HIGH_WATER_BYTES = 1024 * 1024;
18
+ export const BINARY_TRANSPORT_BUFFER_LOW_WATER_BYTES = 256 * 1024;
19
+
20
+ interface BufferedEventTarget extends EventTarget {
21
+ bufferedAmount: number;
22
+ bufferedAmountLowThreshold: number;
23
+ }
24
+
25
+ type DrainCancellation = (error: Error) => void;
26
+
27
+ function rejectPendingDrains(
28
+ pending: Set<DrainCancellation>,
29
+ error: Error
30
+ ): void {
31
+ for (const cancel of [...pending]) cancel(error);
32
+ }
33
+
34
+ function waitForBufferedAmountLowEvent(
35
+ target: BufferedEventTarget,
36
+ isOpen: () => boolean,
37
+ pending: Set<DrainCancellation>
38
+ ): Promise<void> {
39
+ return new Promise<void>((resolve, reject) => {
40
+ let settled = false;
41
+ const cleanup = () => {
42
+ target.removeEventListener("bufferedamountlow", onBufferedAmountLow);
43
+ target.removeEventListener("close", onClose);
44
+ target.removeEventListener("error", onError);
45
+ pending.delete(cancel);
46
+ };
47
+ const settle = (error?: Error) => {
48
+ if (settled) return;
49
+ settled = true;
50
+ cleanup();
51
+ if (error === undefined) resolve();
52
+ else reject(error);
53
+ };
54
+ const onBufferedAmountLow = () => settle();
55
+ const onClose = () =>
56
+ settle(new Error("WebRTC transport closed while buffering"));
57
+ const onError = () =>
58
+ settle(new Error("WebRTC transport error while buffering"));
59
+ const cancel: DrainCancellation = (error) => settle(error);
60
+
61
+ pending.add(cancel);
62
+ target.addEventListener("bufferedamountlow", onBufferedAmountLow);
63
+ target.addEventListener("close", onClose);
64
+ target.addEventListener("error", onError);
65
+ if (!isOpen()) onClose();
66
+ else if (target.bufferedAmount <= BINARY_TRANSPORT_BUFFER_LOW_WATER_BYTES) {
67
+ onBufferedAmountLow();
68
+ }
69
+ });
70
+ }
71
+
72
+ function errorMessage(error: unknown): string {
73
+ return error instanceof Error ? error.message : String(error);
74
+ }
75
+
76
+ function timeoutError(label: string, milliseconds: number): Error {
77
+ return new Error(`${label} timed out after ${milliseconds} ms`);
78
+ }
79
+
80
+ async function withTimeout<T>(
81
+ promise: Promise<T>,
82
+ milliseconds: number,
83
+ label: string,
84
+ onTimeout?: () => void
85
+ ): Promise<T> {
86
+ let timer: ReturnType<typeof setTimeout> | undefined;
87
+ const timeout = new Promise<never>((_resolve, reject) => {
88
+ timer = setTimeout(() => {
89
+ onTimeout?.();
90
+ reject(timeoutError(label, milliseconds));
91
+ }, milliseconds);
92
+ });
93
+ try {
94
+ return await Promise.race([promise, timeout]);
95
+ } finally {
96
+ if (timer !== undefined) clearTimeout(timer);
97
+ }
98
+ }
99
+
100
+ async function eventDataBuffer(value: unknown): Promise<ArrayBuffer> {
101
+ if (value instanceof ArrayBuffer) {
102
+ if (value.byteLength > MAX_DATA_CHANNEL_MESSAGE_BYTES) {
103
+ throw new Error("Proxy node exceeded the data-channel message limit");
104
+ }
105
+ return value;
106
+ }
107
+ if (ArrayBuffer.isView(value)) {
108
+ if (value.byteLength > MAX_DATA_CHANNEL_MESSAGE_BYTES) {
109
+ throw new Error("Proxy node exceeded the data-channel message limit");
110
+ }
111
+ return new Uint8Array(
112
+ value.buffer,
113
+ value.byteOffset,
114
+ value.byteLength
115
+ ).slice().buffer;
116
+ }
117
+ if (value instanceof Blob) {
118
+ if (value.size > MAX_DATA_CHANNEL_MESSAGE_BYTES) {
119
+ throw new Error("Proxy node exceeded the data-channel message limit");
120
+ }
121
+ const result = await value.arrayBuffer();
122
+ if (result.byteLength > MAX_DATA_CHANNEL_MESSAGE_BYTES) {
123
+ throw new Error("Proxy node exceeded the data-channel message limit");
124
+ }
125
+ return result;
126
+ }
127
+ throw new Error("Proxy node sent a non-binary data-channel message");
128
+ }
129
+
130
+ function descriptionJSON(
131
+ description: RTCSessionDescription | RTCSessionDescriptionInit
132
+ ): SessionDescriptionJSON {
133
+ return {
134
+ type: description.type,
135
+ ...(description.sdp === undefined || description.sdp === null
136
+ ? {}
137
+ : { sdp: description.sdp }),
138
+ };
139
+ }
140
+
141
+ function candidateJSON(candidate: RTCIceCandidate): IceCandidateJSON {
142
+ const json = candidate.toJSON();
143
+ return {
144
+ candidate: json.candidate ?? "",
145
+ sdpMid: json.sdpMid ?? null,
146
+ sdpMLineIndex: json.sdpMLineIndex ?? null,
147
+ usernameFragment: json.usernameFragment ?? null,
148
+ };
149
+ }
150
+
151
+ function rtcIceServer(server: RTCIceServerJSON): RTCIceServer {
152
+ return {
153
+ urls: server.urls,
154
+ ...(server.username === undefined ? {} : { username: server.username }),
155
+ ...(server.credential === undefined
156
+ ? {}
157
+ : { credential: server.credential }),
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Browser-to-node proxy payload transport. The tracker is used only to forward
163
+ * SDP/ICE signaling; every payload byte after open() travels on this channel.
164
+ */
165
+ export class WebRTCBinaryTransport implements BinaryTransport {
166
+ ondata: (data: ArrayBuffer) => void = () => undefined;
167
+ onopen?: () => void;
168
+ onclose?: (reason?: unknown) => void;
169
+
170
+ private peer: RTCPeerConnection | undefined;
171
+ private channel: RTCDataChannel | undefined;
172
+ private messageQueue: Promise<void> = Promise.resolve();
173
+ private readonly pendingDrains = new Set<DrainCancellation>();
174
+ private readonly abortController = new AbortController();
175
+ private closed = false;
176
+ private closeReported = false;
177
+
178
+ constructor(
179
+ readonly candidate: CandidateNode,
180
+ private readonly signaling: TrackerSignaling,
181
+ private readonly timeouts: ConnectionTimeouts
182
+ ) {}
183
+
184
+ async open(): Promise<void> {
185
+ if (this.peer !== undefined)
186
+ throw new Error("WebRTC transport is already open");
187
+ if (this.closed) throw new Error("WebRTC transport is closed");
188
+ if (this.candidate.protocolVersion !== PROTOCOL_VERSION) {
189
+ throw new Error(
190
+ `Node ${this.candidate.nodeId} uses protocol ${this.candidate.protocolVersion}; expected ${PROTOCOL_VERSION}`
191
+ );
192
+ }
193
+
194
+ const peer = new RTCPeerConnection({
195
+ iceServers: this.candidate.iceServers.map(rtcIceServer),
196
+ });
197
+ this.peer = peer;
198
+ const channel = peer.createDataChannel("host-server", { ordered: true });
199
+ this.channel = channel;
200
+ channel.binaryType = "arraybuffer";
201
+ channel.bufferedAmountLowThreshold =
202
+ BINARY_TRANSPORT_BUFFER_LOW_WATER_BYTES;
203
+ this.installRuntimeListeners(peer, channel);
204
+
205
+ const candidates: IceCandidateJSON[] = [];
206
+ peer.addEventListener("icecandidate", (event) => {
207
+ // Firefox emits an RTCIceCandidate with an empty candidate string at
208
+ // the end of a generation. It is a completion marker, not a candidate,
209
+ // and the signaling schema intentionally rejects it.
210
+ if (event.candidate !== null && event.candidate.candidate.length > 0) {
211
+ candidates.push(candidateJSON(event.candidate));
212
+ }
213
+ });
214
+
215
+ try {
216
+ const offer = await peer.createOffer();
217
+ await peer.setLocalDescription(offer);
218
+ await this.waitForIceGathering(peer);
219
+ if (peer.localDescription === null) {
220
+ throw new Error("Browser did not create a WebRTC local description");
221
+ }
222
+ if (
223
+ candidates.length === 0 &&
224
+ !/(?:^|\r?\n)a=candidate:/u.test(peer.localDescription.sdp)
225
+ ) {
226
+ throw new Error(
227
+ "Browser gathered no WebRTC ICE candidates. Direct node connections require WebRTC/UDP candidate access; check the browser WebRTC IP policy, VPN, firewall, and network settings"
228
+ );
229
+ }
230
+ const request: WebRTCOffer = {
231
+ protocolVersion: PROTOCOL_VERSION,
232
+ offer: descriptionJSON(peer.localDescription),
233
+ candidates,
234
+ };
235
+ const answer = await this.signaling.requestSession(
236
+ this.candidate.nodeId,
237
+ request,
238
+ this.abortController.signal
239
+ );
240
+ if (answer.protocolVersion !== PROTOCOL_VERSION) {
241
+ throw new Error(
242
+ `Node answered with protocol ${answer.protocolVersion}; expected ${PROTOCOL_VERSION}`
243
+ );
244
+ }
245
+ await peer.setRemoteDescription(answer.answer);
246
+ for (const candidate of answer.candidates) {
247
+ if (candidate.candidate.length > 0) {
248
+ await peer.addIceCandidate(candidate);
249
+ }
250
+ }
251
+ await withTimeout(
252
+ this.waitForChannelOpen(channel),
253
+ this.timeouts.webrtcMs,
254
+ "WebRTC connection",
255
+ () => this.abortController.abort("WebRTC connection timed out")
256
+ );
257
+ if (this.closed)
258
+ throw new Error("WebRTC transport was closed while opening");
259
+ } catch (error) {
260
+ this.close();
261
+ throw new Error(
262
+ `Unable to establish WebRTC transport: ${errorMessage(error)}`,
263
+ { cause: error }
264
+ );
265
+ }
266
+
267
+ this.onopen?.();
268
+ }
269
+
270
+ async send(data: ArrayBuffer): Promise<void> {
271
+ const channel = this.channel;
272
+ if (channel?.readyState !== "open" || this.closed) {
273
+ throw new Error("WebRTC transport is not open");
274
+ }
275
+ if (data.byteLength > MAX_DATA_CHANNEL_MESSAGE_BYTES) {
276
+ throw new Error("Proxy frame exceeds the data-channel message limit");
277
+ }
278
+ if (channel.bufferedAmount > BINARY_TRANSPORT_BUFFER_HIGH_WATER_BYTES) {
279
+ await waitForBufferedAmountLowEvent(
280
+ channel,
281
+ () => channel.readyState === "open" && !this.closed,
282
+ this.pendingDrains
283
+ );
284
+ }
285
+ if (channel.readyState !== "open" || this.closed) {
286
+ throw new Error("WebRTC transport closed while buffering");
287
+ }
288
+ channel.send(data);
289
+ }
290
+
291
+ close(): void {
292
+ if (this.closed) return;
293
+ this.closed = true;
294
+ this.abortController.abort("WebRTC transport closed");
295
+ rejectPendingDrains(
296
+ this.pendingDrains,
297
+ new Error("WebRTC transport closed while buffering")
298
+ );
299
+ if (this.channel?.readyState !== "closed") this.channel?.close();
300
+ this.peer?.close();
301
+ }
302
+
303
+ private installRuntimeListeners(
304
+ peer: RTCPeerConnection,
305
+ channel: RTCDataChannel
306
+ ): void {
307
+ channel.addEventListener("message", (event) => {
308
+ this.messageQueue = this.messageQueue
309
+ .then(async () => this.ondata(await eventDataBuffer(event.data)))
310
+ .catch((error: unknown) => {
311
+ this.reportClose(errorMessage(error));
312
+ });
313
+ });
314
+ channel.addEventListener("close", () => {
315
+ this.reportClose("WebRTC data channel closed");
316
+ });
317
+ channel.addEventListener("error", () => {
318
+ this.reportClose("WebRTC data channel error");
319
+ });
320
+ peer.addEventListener("connectionstatechange", () => {
321
+ if (peer.connectionState === "failed") {
322
+ this.reportClose("WebRTC peer connection failed");
323
+ }
324
+ });
325
+ }
326
+
327
+ private reportClose(message: string): void {
328
+ if (this.closed || this.closeReported) return;
329
+ this.closeReported = true;
330
+ rejectPendingDrains(this.pendingDrains, new Error(message));
331
+ this.onclose?.(new Error(message));
332
+ }
333
+
334
+ private async waitForIceGathering(peer: RTCPeerConnection): Promise<void> {
335
+ if (peer.iceGatheringState === "complete") return;
336
+ await new Promise<void>((resolve, reject) => {
337
+ const cleanup = () => {
338
+ clearTimeout(timer);
339
+ peer.removeEventListener("icegatheringstatechange", onState);
340
+ this.abortController.signal.removeEventListener("abort", onAbort);
341
+ };
342
+ const finish = () => {
343
+ cleanup();
344
+ resolve();
345
+ };
346
+ const onState = () => {
347
+ if (peer.iceGatheringState === "complete") finish();
348
+ };
349
+ const onAbort = () => {
350
+ cleanup();
351
+ reject(new Error("WebRTC transport closed during ICE gathering"));
352
+ };
353
+ // Continue with candidates gathered so far when the cap expires.
354
+ const timer = setTimeout(finish, this.timeouts.iceGatheringMs);
355
+ peer.addEventListener("icegatheringstatechange", onState);
356
+ this.abortController.signal.addEventListener("abort", onAbort, {
357
+ once: true,
358
+ });
359
+ });
360
+ }
361
+
362
+ private waitForChannelOpen(channel: RTCDataChannel): Promise<void> {
363
+ return new Promise<void>((resolve, reject) => {
364
+ if (channel.readyState === "open") {
365
+ resolve();
366
+ return;
367
+ }
368
+ const cleanup = () => {
369
+ channel.removeEventListener("open", onOpen);
370
+ channel.removeEventListener("error", onError);
371
+ channel.removeEventListener("close", onClose);
372
+ this.abortController.signal.removeEventListener("abort", onAbort);
373
+ };
374
+ const onOpen = () => {
375
+ cleanup();
376
+ resolve();
377
+ };
378
+ const onError = () => {
379
+ cleanup();
380
+ reject(new Error("WebRTC data channel failed"));
381
+ };
382
+ const onClose = () => {
383
+ cleanup();
384
+ reject(new Error("WebRTC data channel closed before opening"));
385
+ };
386
+ const onAbort = () => {
387
+ cleanup();
388
+ reject(new Error("WebRTC transport was closed while opening"));
389
+ };
390
+ channel.addEventListener("open", onOpen);
391
+ channel.addEventListener("error", onError);
392
+ channel.addEventListener("close", onClose);
393
+ this.abortController.signal.addEventListener("abort", onAbort, {
394
+ once: true,
395
+ });
396
+ });
397
+ }
398
+ }