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,5 @@
1
+ export * from "./binary.js";
2
+ export * from "./config.js";
3
+ export * from "./connection.js";
4
+ export * from "./tracker.js";
5
+ export * from "./transport.js";
@@ -0,0 +1,651 @@
1
+ import {
2
+ CONTROL_LIMITS,
3
+ TRACKER_PATHS,
4
+ TRACKER_WEBSOCKET_PROTOCOLS,
5
+ assertBrowserServerMessage,
6
+ decodeControlJSON,
7
+ encodeControlJSON,
8
+ type BrowserCandidatesRequest,
9
+ type BrowserClientMessage,
10
+ type BrowserServerMessage,
11
+ type BrowserSessionOffer,
12
+ type CandidateNode,
13
+ type WebRTCAnswer,
14
+ type WebRTCOffer,
15
+ } from "roxxie-transports-tracker-protocol";
16
+
17
+ import {
18
+ parseTrackerBaseUrl,
19
+ type ConnectionTimeouts,
20
+ type TrackerDefinition,
21
+ } from "./config.js";
22
+
23
+ export const MAX_PENDING_TRACKER_REQUESTS = 32;
24
+ const MAX_ICE_SERVERS_PER_NODE = 16;
25
+ const MAX_URLS_PER_ICE_SERVER = 8;
26
+ const MAX_ICE_URL_BYTES = 2_048;
27
+
28
+ interface PendingRequest {
29
+ expectedType: "browser.candidates.result" | "browser.session.answer";
30
+ nodeId?: string;
31
+ resolve: (message: BrowserServerMessage) => void;
32
+ reject: (error: unknown) => void;
33
+ timer: ReturnType<typeof setTimeout>;
34
+ removeAbort?: () => void;
35
+ }
36
+
37
+ export interface TrackerClientDependencies {
38
+ fetch: typeof fetch;
39
+ createWebSocket: (url: URL, protocols: string[]) => WebSocket;
40
+ }
41
+
42
+ export interface TrackerSignaling {
43
+ requestCandidates(signal?: AbortSignal): Promise<readonly CandidateNode[]>;
44
+ requestSession(
45
+ nodeId: string,
46
+ offer: WebRTCOffer,
47
+ signal?: AbortSignal
48
+ ): Promise<WebRTCAnswer>;
49
+ close(): void;
50
+ }
51
+
52
+ export class TrackerRequestError extends Error {
53
+ constructor(
54
+ message: string,
55
+ readonly code?: string
56
+ ) {
57
+ super(message);
58
+ this.name = "TrackerRequestError";
59
+ }
60
+ }
61
+
62
+ function asError(value: unknown, fallback: string): Error {
63
+ return value instanceof Error
64
+ ? value
65
+ : new Error(value === undefined ? fallback : String(value));
66
+ }
67
+
68
+ function abortError(signal?: AbortSignal): DOMException {
69
+ return new DOMException(
70
+ signal?.reason === undefined
71
+ ? "The tracker request was aborted"
72
+ : String(signal.reason),
73
+ "AbortError"
74
+ );
75
+ }
76
+
77
+ function isAborted(signal?: AbortSignal): boolean {
78
+ return signal?.aborted === true;
79
+ }
80
+
81
+ function requestId(): string {
82
+ return `browser-${crypto.randomUUID()}`;
83
+ }
84
+
85
+ function endpoint(base: URL, path: string): URL {
86
+ return new URL(path, base);
87
+ }
88
+
89
+ function websocketEndpoint(base: URL): URL {
90
+ const result = endpoint(base, TRACKER_PATHS.browserWebSocket);
91
+ result.protocol = result.protocol === "https:" ? "wss:" : "ws:";
92
+ return result;
93
+ }
94
+
95
+ async function messageData(value: unknown): Promise<string | ArrayBuffer> {
96
+ if (typeof value === "string") {
97
+ if (value.length > CONTROL_LIMITS.maxMessageBytes) {
98
+ throw new Error("Tracker WebSocket message is too large");
99
+ }
100
+ return value;
101
+ }
102
+ if (value instanceof ArrayBuffer) {
103
+ if (value.byteLength > CONTROL_LIMITS.maxMessageBytes) {
104
+ throw new Error("Tracker WebSocket message is too large");
105
+ }
106
+ return value;
107
+ }
108
+ if (ArrayBuffer.isView(value)) {
109
+ if (value.byteLength > CONTROL_LIMITS.maxMessageBytes) {
110
+ throw new Error("Tracker WebSocket message is too large");
111
+ }
112
+ return new Uint8Array(
113
+ value.buffer,
114
+ value.byteOffset,
115
+ value.byteLength
116
+ ).slice().buffer;
117
+ }
118
+ if (value instanceof Blob) {
119
+ if (value.size > CONTROL_LIMITS.maxMessageBytes) {
120
+ throw new Error("Tracker WebSocket message is too large");
121
+ }
122
+ return value.arrayBuffer();
123
+ }
124
+ throw new Error("Tracker sent an unsupported WebSocket message type");
125
+ }
126
+
127
+ async function boundedResponseBody(response: Response): Promise<ArrayBuffer> {
128
+ const contentLength = response.headers.get("content-length");
129
+ if (contentLength !== null) {
130
+ if (!/^\d+$/u.test(contentLength)) {
131
+ throw new Error("Tracker returned an invalid Content-Length");
132
+ }
133
+ if (Number(contentLength) > CONTROL_LIMITS.maxMessageBytes) {
134
+ throw new Error("Tracker HTTP response is too large");
135
+ }
136
+ }
137
+ if (response.body === null) return new ArrayBuffer(0);
138
+
139
+ const reader = response.body.getReader();
140
+ const chunks: Uint8Array[] = [];
141
+ let size = 0;
142
+ try {
143
+ for (;;) {
144
+ const { done, value } = await reader.read();
145
+ if (done) break;
146
+ size += value.byteLength;
147
+ if (size > CONTROL_LIMITS.maxMessageBytes) {
148
+ void reader
149
+ .cancel("Tracker HTTP response is too large")
150
+ .catch(() => undefined);
151
+ throw new Error("Tracker HTTP response is too large");
152
+ }
153
+ chunks.push(value);
154
+ }
155
+ } finally {
156
+ reader.releaseLock();
157
+ }
158
+ const result = new Uint8Array(size);
159
+ let offset = 0;
160
+ for (const chunk of chunks) {
161
+ result.set(chunk, offset);
162
+ offset += chunk.byteLength;
163
+ }
164
+ return result.buffer;
165
+ }
166
+
167
+ function validateCandidateIceServers(
168
+ candidates: readonly CandidateNode[]
169
+ ): void {
170
+ for (const candidate of candidates) {
171
+ if (candidate.iceServers.length > MAX_ICE_SERVERS_PER_NODE) {
172
+ throw new Error(`Node ${candidate.nodeId} returned too many ICE servers`);
173
+ }
174
+ for (const server of candidate.iceServers) {
175
+ if (server === null || typeof server !== "object") {
176
+ throw new Error(
177
+ `Node ${candidate.nodeId} returned an invalid ICE server`
178
+ );
179
+ }
180
+ if (server.username !== undefined || server.credential !== undefined) {
181
+ throw new Error(
182
+ `Node ${candidate.nodeId} returned credentialed ICE configuration; TURN relays are disabled`
183
+ );
184
+ }
185
+ const values =
186
+ typeof server.urls === "string" ? [server.urls] : server.urls;
187
+ if (
188
+ !Array.isArray(values) ||
189
+ values.length === 0 ||
190
+ values.length > MAX_URLS_PER_ICE_SERVER
191
+ ) {
192
+ throw new Error(`Node ${candidate.nodeId} returned invalid ICE URLs`);
193
+ }
194
+ for (const value of values) {
195
+ if (
196
+ typeof value !== "string" ||
197
+ value.length === 0 ||
198
+ new TextEncoder().encode(value).byteLength > MAX_ICE_URL_BYTES ||
199
+ !/^(?:stun|stuns):[^\s]+$/iu.test(value)
200
+ ) {
201
+ throw new Error(
202
+ `Node ${candidate.nodeId} returned a non-STUN ICE URL; TURN relays are disabled`
203
+ );
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+
210
+ export class RoxxieTrackerClient implements TrackerSignaling {
211
+ private readonly base: URL;
212
+ private readonly dependencies: TrackerClientDependencies;
213
+ private socket: WebSocket | undefined;
214
+ private socketPromise: Promise<WebSocket> | undefined;
215
+ private readonly pending = new Map<string, PendingRequest>();
216
+ private readonly httpControllers = new Set<AbortController>();
217
+ private messageQueue: Promise<void> = Promise.resolve();
218
+ private activeRequests = 0;
219
+ private closed = false;
220
+
221
+ constructor(
222
+ tracker: TrackerDefinition,
223
+ private readonly timeouts: ConnectionTimeouts,
224
+ dependencies: Partial<TrackerClientDependencies> = {}
225
+ ) {
226
+ this.base = parseTrackerBaseUrl(tracker.url);
227
+ this.dependencies = {
228
+ // Firefox and some Chromium builds require the native fetch receiver to
229
+ // be their global object. Keeping `fetch` directly on this dependency
230
+ // object and invoking it as a method changes that receiver and makes the
231
+ // HTTPS signaling fallback fail with "Illegal invocation".
232
+ fetch:
233
+ dependencies.fetch ?? ((input, init) => globalThis.fetch(input, init)),
234
+ createWebSocket:
235
+ dependencies.createWebSocket ??
236
+ ((url, protocols) => new WebSocket(url, protocols)),
237
+ };
238
+ }
239
+
240
+ async requestCandidates(
241
+ signal?: AbortSignal
242
+ ): Promise<readonly CandidateNode[]> {
243
+ return this.withRequestSlot(async () => {
244
+ const request: BrowserCandidatesRequest = {
245
+ type: "browser.candidates.request",
246
+ requestId: requestId(),
247
+ };
248
+ let response: BrowserServerMessage;
249
+ try {
250
+ response = await this.requestOverWebSocket(request, signal);
251
+ } catch (error) {
252
+ if (
253
+ this.closed ||
254
+ isAborted(signal) ||
255
+ error instanceof TrackerRequestError
256
+ ) {
257
+ throw error;
258
+ }
259
+ response = await this.requestOverHTTP(request, signal);
260
+ }
261
+ if (response.type !== "browser.candidates.result") {
262
+ throw new Error("Tracker returned the wrong candidate response type");
263
+ }
264
+ validateCandidateIceServers(response.candidates);
265
+ return response.candidates;
266
+ });
267
+ }
268
+
269
+ async requestSession(
270
+ nodeId: string,
271
+ offer: WebRTCOffer,
272
+ signal?: AbortSignal
273
+ ): Promise<WebRTCAnswer> {
274
+ return this.withRequestSlot(async () => {
275
+ const request: BrowserSessionOffer = {
276
+ type: "browser.session.offer",
277
+ requestId: requestId(),
278
+ nodeId,
279
+ offer,
280
+ };
281
+ let response: BrowserServerMessage;
282
+ try {
283
+ response = await this.requestOverWebSocket(request, signal);
284
+ } catch (error) {
285
+ if (
286
+ this.closed ||
287
+ isAborted(signal) ||
288
+ error instanceof TrackerRequestError
289
+ ) {
290
+ throw error;
291
+ }
292
+ response = await this.requestOverHTTP(request, signal);
293
+ }
294
+ if (
295
+ response.type !== "browser.session.answer" ||
296
+ response.nodeId !== nodeId
297
+ ) {
298
+ throw new Error("Tracker returned the wrong WebRTC session response");
299
+ }
300
+ return response.answer;
301
+ });
302
+ }
303
+
304
+ close(): void {
305
+ if (this.closed) return;
306
+ this.closed = true;
307
+ const error = new Error("Tracker client was closed");
308
+ this.rejectPending(error);
309
+ for (const controller of this.httpControllers) {
310
+ controller.abort("Tracker client was closed");
311
+ }
312
+ this.httpControllers.clear();
313
+ this.closeSocket(1000, "Client closed tracker signaling");
314
+ }
315
+
316
+ private async withRequestSlot<T>(operation: () => Promise<T>): Promise<T> {
317
+ if (this.activeRequests >= MAX_PENDING_TRACKER_REQUESTS) {
318
+ throw new TrackerRequestError(
319
+ `Tracker client allows at most ${MAX_PENDING_TRACKER_REQUESTS} concurrent requests`,
320
+ "CLIENT_CAPACITY"
321
+ );
322
+ }
323
+ this.activeRequests += 1;
324
+ try {
325
+ return await operation();
326
+ } finally {
327
+ this.activeRequests -= 1;
328
+ }
329
+ }
330
+
331
+ private async requestOverWebSocket(
332
+ request: BrowserClientMessage,
333
+ signal?: AbortSignal
334
+ ): Promise<BrowserServerMessage> {
335
+ if (isAborted(signal)) throw abortError(signal);
336
+ const socket = await this.ensureSocket();
337
+ if (isAborted(signal)) throw abortError(signal);
338
+
339
+ return new Promise<BrowserServerMessage>((resolve, reject) => {
340
+ const cleanup = () => {
341
+ const pending = this.pending.get(request.requestId);
342
+ if (pending === undefined) return;
343
+ clearTimeout(pending.timer);
344
+ pending.removeAbort?.();
345
+ this.pending.delete(request.requestId);
346
+ };
347
+ const settleReject = (error: unknown) => {
348
+ cleanup();
349
+ reject(error);
350
+ };
351
+ const timer = setTimeout(
352
+ () =>
353
+ settleReject(
354
+ new Error(
355
+ `Tracker WebSocket request timed out after ${this.timeouts.signalingMs} ms`
356
+ )
357
+ ),
358
+ this.timeouts.signalingMs
359
+ );
360
+ const pending: PendingRequest = {
361
+ expectedType:
362
+ request.type === "browser.candidates.request"
363
+ ? "browser.candidates.result"
364
+ : "browser.session.answer",
365
+ ...(request.type === "browser.session.offer"
366
+ ? { nodeId: request.nodeId }
367
+ : {}),
368
+ resolve: (message) => {
369
+ cleanup();
370
+ resolve(message);
371
+ },
372
+ reject: settleReject,
373
+ timer,
374
+ };
375
+ if (signal !== undefined) {
376
+ const onAbort = () => settleReject(abortError(signal));
377
+ signal.addEventListener("abort", onAbort, { once: true });
378
+ pending.removeAbort = () =>
379
+ signal.removeEventListener("abort", onAbort);
380
+ }
381
+ this.pending.set(request.requestId, pending);
382
+ try {
383
+ socket.send(encodeControlJSON(request));
384
+ } catch (error) {
385
+ settleReject(error);
386
+ }
387
+ });
388
+ }
389
+
390
+ private async requestOverHTTP(
391
+ request: BrowserClientMessage,
392
+ signal?: AbortSignal
393
+ ): Promise<BrowserServerMessage> {
394
+ if (this.closed) throw new Error("Tracker client is closed");
395
+ if (isAborted(signal)) throw abortError(signal);
396
+ const controller = new AbortController();
397
+ this.httpControllers.add(controller);
398
+ const onAbort = () => controller.abort(signal?.reason);
399
+ signal?.addEventListener("abort", onAbort, { once: true });
400
+ const timer = setTimeout(
401
+ () => controller.abort("Tracker request timed out"),
402
+ this.timeouts.signalingMs
403
+ );
404
+ try {
405
+ let url: URL;
406
+ let init: RequestInit;
407
+ if (request.type === "browser.candidates.request") {
408
+ url = endpoint(this.base, TRACKER_PATHS.browserCandidates);
409
+ url.searchParams.set("requestId", request.requestId);
410
+ init = {
411
+ method: "GET",
412
+ headers: { Accept: "application/json" },
413
+ };
414
+ } else {
415
+ url = endpoint(this.base, TRACKER_PATHS.browserSessions);
416
+ init = {
417
+ method: "POST",
418
+ headers: {
419
+ Accept: "application/json",
420
+ "Content-Type": "application/json",
421
+ },
422
+ body: encodeControlJSON(request),
423
+ };
424
+ }
425
+ let response: Response;
426
+ try {
427
+ response = await this.dependencies.fetch(url, {
428
+ ...init,
429
+ cache: "no-store",
430
+ credentials: "omit",
431
+ signal: controller.signal,
432
+ });
433
+ } catch (error) {
434
+ if (controller.signal.aborted) {
435
+ throw isAborted(signal)
436
+ ? abortError(signal)
437
+ : new Error(
438
+ `Tracker HTTP request timed out after ${this.timeouts.signalingMs} ms`,
439
+ { cause: error }
440
+ );
441
+ }
442
+ throw error;
443
+ }
444
+ const parsed = decodeControlJSON(await boundedResponseBody(response));
445
+ assertBrowserServerMessage(parsed);
446
+ this.validateResponse(request, parsed);
447
+ if (!response.ok && parsed.type !== "browser.error") {
448
+ throw new Error(`Tracker HTTP request failed (${response.status})`);
449
+ }
450
+ return this.unwrapError(parsed);
451
+ } finally {
452
+ clearTimeout(timer);
453
+ signal?.removeEventListener("abort", onAbort);
454
+ this.httpControllers.delete(controller);
455
+ }
456
+ }
457
+
458
+ private async ensureSocket(): Promise<WebSocket> {
459
+ if (this.closed) throw new Error("Tracker client is closed");
460
+ if (this.socket?.readyState === WebSocket.OPEN) return this.socket;
461
+ if (this.socketPromise !== undefined) return this.socketPromise;
462
+
463
+ const attempt = this.openSocket();
464
+ this.socketPromise = attempt;
465
+ try {
466
+ return await attempt;
467
+ } finally {
468
+ if (this.socketPromise === attempt) this.socketPromise = undefined;
469
+ }
470
+ }
471
+
472
+ private async openSocket(): Promise<WebSocket> {
473
+ const socket = this.dependencies.createWebSocket(
474
+ websocketEndpoint(this.base),
475
+ [TRACKER_WEBSOCKET_PROTOCOLS.browser]
476
+ );
477
+ this.socket = socket;
478
+ socket.binaryType = "arraybuffer";
479
+
480
+ try {
481
+ await new Promise<void>((resolve, reject) => {
482
+ let settled = false;
483
+ const cleanup = () => {
484
+ clearTimeout(timer);
485
+ socket.removeEventListener("open", onOpen);
486
+ socket.removeEventListener("error", onError);
487
+ socket.removeEventListener("close", onClose);
488
+ };
489
+ const settle = (error?: Error) => {
490
+ if (settled) return;
491
+ settled = true;
492
+ cleanup();
493
+ if (error === undefined) resolve();
494
+ else reject(error);
495
+ };
496
+ const onOpen = () => {
497
+ if (socket.protocol !== TRACKER_WEBSOCKET_PROTOCOLS.browser) {
498
+ settle(new Error("Tracker selected an invalid WebSocket protocol"));
499
+ this.closeSocket(1002, "Invalid tracker protocol");
500
+ return;
501
+ }
502
+ settle();
503
+ };
504
+ const onError = () => settle(new Error("Tracker WebSocket failed"));
505
+ const onClose = () =>
506
+ settle(new Error("Tracker WebSocket closed before opening"));
507
+ const timer = setTimeout(() => {
508
+ settle(
509
+ new Error(
510
+ `Tracker WebSocket connection timed out after ${this.timeouts.signalingMs} ms`
511
+ )
512
+ );
513
+ this.closeSocket(4000, "Tracker connection timed out");
514
+ }, this.timeouts.signalingMs);
515
+ socket.addEventListener("open", onOpen);
516
+ socket.addEventListener("error", onError);
517
+ socket.addEventListener("close", onClose);
518
+ });
519
+ } catch (error) {
520
+ if (this.socket === socket) {
521
+ this.closeSocket(4000, "Tracker connection failed");
522
+ }
523
+ throw error;
524
+ }
525
+
526
+ if (this.closed) {
527
+ this.closeSocket(1000, "Tracker client closed");
528
+ throw new Error("Tracker client is closed");
529
+ }
530
+ socket.addEventListener("message", (event) => {
531
+ if (this.socket !== socket) return;
532
+ this.messageQueue = this.messageQueue
533
+ .then(async () => {
534
+ const data = await messageData(event.data);
535
+ if (this.socket === socket) this.handleSocketMessage(data);
536
+ })
537
+ .catch((error: unknown) => {
538
+ if (this.socket === socket) {
539
+ this.failSocket(asError(error, "Invalid tracker message"));
540
+ }
541
+ });
542
+ });
543
+ socket.addEventListener("close", () => {
544
+ if (this.socket !== socket) return;
545
+ this.socket = undefined;
546
+ this.rejectPending(new Error("Tracker WebSocket closed"));
547
+ });
548
+ socket.addEventListener("error", () => {
549
+ if (this.socket !== socket) return;
550
+ this.failSocket(new Error("Tracker WebSocket error"));
551
+ });
552
+ return socket;
553
+ }
554
+
555
+ private handleSocketMessage(data: string | ArrayBuffer): void {
556
+ let parsed: BrowserServerMessage;
557
+ try {
558
+ const decoded = decodeControlJSON(data);
559
+ assertBrowserServerMessage(decoded);
560
+ parsed = decoded;
561
+ } catch (error) {
562
+ throw new TrackerRequestError(
563
+ `Tracker returned invalid signaling data: ${asError(error, "invalid response").message}`,
564
+ "INVALID_RESPONSE"
565
+ );
566
+ }
567
+ const pending = this.pending.get(parsed.requestId);
568
+ if (pending === undefined) return;
569
+ if (parsed.type === "browser.error") {
570
+ pending.reject(new TrackerRequestError(parsed.message, parsed.code));
571
+ return;
572
+ }
573
+ if (parsed.type !== pending.expectedType) {
574
+ pending.reject(
575
+ new TrackerRequestError(
576
+ "Tracker returned an unexpected response type",
577
+ "INVALID_RESPONSE"
578
+ )
579
+ );
580
+ return;
581
+ }
582
+ if (
583
+ parsed.type === "browser.session.answer" &&
584
+ pending.nodeId !== parsed.nodeId
585
+ ) {
586
+ pending.reject(
587
+ new TrackerRequestError(
588
+ "Tracker returned an answer for the wrong node",
589
+ "INVALID_RESPONSE"
590
+ )
591
+ );
592
+ return;
593
+ }
594
+ pending.resolve(parsed);
595
+ }
596
+
597
+ private validateResponse(
598
+ request: BrowserClientMessage,
599
+ response: BrowserServerMessage
600
+ ): void {
601
+ if (response.requestId !== request.requestId) {
602
+ throw new Error("Tracker returned a mismatched request ID");
603
+ }
604
+ if (response.type === "browser.error") return;
605
+ if (
606
+ request.type === "browser.candidates.request" &&
607
+ response.type !== "browser.candidates.result"
608
+ ) {
609
+ throw new Error("Tracker returned an unexpected candidate response");
610
+ }
611
+ if (
612
+ request.type === "browser.session.offer" &&
613
+ (response.type !== "browser.session.answer" ||
614
+ response.nodeId !== request.nodeId)
615
+ ) {
616
+ throw new Error("Tracker returned an unexpected session response");
617
+ }
618
+ }
619
+
620
+ private unwrapError(message: BrowserServerMessage): BrowserServerMessage {
621
+ if (message.type === "browser.error") {
622
+ throw new TrackerRequestError(message.message, message.code);
623
+ }
624
+ return message;
625
+ }
626
+
627
+ private failSocket(error: Error): void {
628
+ this.rejectPending(error);
629
+ this.closeSocket(4000, "Tracker signaling failed");
630
+ }
631
+
632
+ private rejectPending(error: Error): void {
633
+ for (const pending of [...this.pending.values()]) pending.reject(error);
634
+ }
635
+
636
+ private closeSocket(code: number, reason: string): void {
637
+ const socket = this.socket;
638
+ this.socket = undefined;
639
+ if (
640
+ socket !== undefined &&
641
+ (socket.readyState === WebSocket.OPEN ||
642
+ socket.readyState === WebSocket.CONNECTING)
643
+ ) {
644
+ try {
645
+ socket.close(code, reason.slice(0, 123));
646
+ } catch {
647
+ // The browser can reject close() while the constructor is still failing.
648
+ }
649
+ }
650
+ }
651
+ }