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,745 @@
1
+ /**
2
+ * Roxxie tracker control protocol. This protocol carries discovery, signaling,
3
+ * health, and enrollment data only. Proxy payload bytes are never valid here.
4
+ */
5
+ export const TRACKER_PROTOCOL_VERSION = "1.0";
6
+
7
+ export const TRACKER_PATHS = {
8
+ browserWebSocket: "/v1/browser",
9
+ nodeControlWebSocket: "/v1/nodes/control",
10
+ browserCandidates: "/v1/browser/candidates",
11
+ browserSessions: "/v1/browser/sessions",
12
+ health: "/healthz",
13
+ nodeUpdateManifest: "/v1/updates/node/latest",
14
+ nodeUpdatePublicKey: "/v1/updates/node/key",
15
+ } as const;
16
+
17
+ export const TRACKER_WEBSOCKET_PROTOCOLS = {
18
+ browser: "roxxie-tracker-browser-v1",
19
+ node: "roxxie-tracker-node-v1",
20
+ } as const;
21
+
22
+ export const CONTROL_LIMITS = {
23
+ maxMessageBytes: 256 * 1024,
24
+ maxNodeNameBytes: 128,
25
+ maxVersionBytes: 64,
26
+ maxErrorBytes: 512,
27
+ maxCandidatesReturned: 3,
28
+ maxIceCandidates: 256,
29
+ maxNodeSessions: 512,
30
+ } as const;
31
+
32
+ export type NodeLifecycleState =
33
+ | "validating"
34
+ | "pending"
35
+ | "approved"
36
+ | "rejected"
37
+ | "revoked";
38
+
39
+ export type NodeAvailability = "online" | "unhealthy" | "offline";
40
+ export type NodeCredentialKind = "enrollment" | "pending" | "approved";
41
+
42
+ export interface SessionDescriptionJSON {
43
+ type: "offer" | "answer" | "pranswer" | "rollback";
44
+ sdp?: string;
45
+ }
46
+
47
+ export interface IceCandidateJSON {
48
+ candidate: string;
49
+ sdpMid?: string | null;
50
+ sdpMLineIndex?: number | null;
51
+ usernameFragment?: string | null;
52
+ }
53
+
54
+ export interface RTCIceServerJSON {
55
+ urls: string | string[];
56
+ username?: string;
57
+ credential?: string;
58
+ }
59
+
60
+ export interface WebRTCOffer {
61
+ protocolVersion: string;
62
+ offer: SessionDescriptionJSON;
63
+ candidates: IceCandidateJSON[];
64
+ }
65
+
66
+ export interface WebRTCAnswer {
67
+ protocolVersion: string;
68
+ sessionId: string;
69
+ answer: SessionDescriptionJSON;
70
+ candidates: IceCandidateJSON[];
71
+ }
72
+
73
+ export interface NodeMetadata {
74
+ nodeId: string;
75
+ name: string;
76
+ packageVersion: string;
77
+ nodeVersion: string;
78
+ platform: string;
79
+ arch: string;
80
+ maxSessions: number;
81
+ protocolVersion: string;
82
+ }
83
+
84
+ export interface NodeMetrics {
85
+ activeSessions: number;
86
+ maxSessions: number;
87
+ uptimeSeconds: number;
88
+ }
89
+
90
+ export interface CandidateNode {
91
+ nodeId: string;
92
+ name: string;
93
+ activeSessions: number;
94
+ maxSessions: number;
95
+ utilization: number;
96
+ protocolVersion: string;
97
+ iceServers: RTCIceServerJSON[];
98
+ }
99
+
100
+ export interface BrowserCandidatesRequest {
101
+ type: "browser.candidates.request";
102
+ requestId: string;
103
+ }
104
+
105
+ export interface BrowserCandidatesResult {
106
+ type: "browser.candidates.result";
107
+ requestId: string;
108
+ candidates: CandidateNode[];
109
+ }
110
+
111
+ export interface BrowserSessionOffer {
112
+ type: "browser.session.offer";
113
+ requestId: string;
114
+ nodeId: string;
115
+ offer: WebRTCOffer;
116
+ }
117
+
118
+ export interface BrowserSessionAnswer {
119
+ type: "browser.session.answer";
120
+ requestId: string;
121
+ nodeId: string;
122
+ answer: WebRTCAnswer;
123
+ }
124
+
125
+ export interface BrowserError {
126
+ type: "browser.error";
127
+ requestId: string;
128
+ code:
129
+ | "BAD_REQUEST"
130
+ | "NODE_UNAVAILABLE"
131
+ | "NODE_CAPACITY"
132
+ | "SIGNAL_TIMEOUT"
133
+ | "INTERNAL";
134
+ message: string;
135
+ }
136
+
137
+ export type BrowserClientMessage =
138
+ | BrowserCandidatesRequest
139
+ | BrowserSessionOffer;
140
+ export type BrowserServerMessage =
141
+ | BrowserCandidatesResult
142
+ | BrowserSessionAnswer
143
+ | BrowserError;
144
+
145
+ export interface NodeHello {
146
+ type: "node.hello";
147
+ requestId: string;
148
+ trackerProtocolVersion: string;
149
+ credentialKind: NodeCredentialKind;
150
+ credential: string;
151
+ metadata: NodeMetadata;
152
+ }
153
+
154
+ export interface NodeWelcome {
155
+ type: "node.welcome";
156
+ requestId: string;
157
+ lifecycle: "validating" | "pending" | "approved";
158
+ credentialKind: "pending" | "approved";
159
+ credential?: string;
160
+ heartbeatIntervalMs: number;
161
+ }
162
+
163
+ export interface NodeHeartbeat {
164
+ type: "node.heartbeat";
165
+ requestId: string;
166
+ metrics: NodeMetrics;
167
+ }
168
+
169
+ export interface NodeHeartbeatAck {
170
+ type: "node.heartbeat.ack";
171
+ requestId: string;
172
+ nextHeartbeatMs: number;
173
+ }
174
+
175
+ /** Tracker -> node. The node creates an answer and hosts the proxy session. */
176
+ export interface NodeWebRTCOffer {
177
+ type: "node.webrtc.offer";
178
+ requestId: string;
179
+ purpose: "validation" | "browser";
180
+ offer: WebRTCOffer;
181
+ }
182
+
183
+ /** Node -> tracker. Correlates exactly with NodeWebRTCOffer.requestId. */
184
+ export interface NodeWebRTCAnswer {
185
+ type: "node.webrtc.answer";
186
+ requestId: string;
187
+ ok: boolean;
188
+ answer?: WebRTCAnswer;
189
+ error?: string;
190
+ }
191
+
192
+ export interface NodeCredentialRotated {
193
+ type: "node.credential.rotated";
194
+ requestId: string;
195
+ credential: string;
196
+ }
197
+
198
+ export interface NodeCredentialRotatedAck {
199
+ type: "node.credential.rotated.ack";
200
+ requestId: string;
201
+ }
202
+
203
+ export interface NodeStateChanged {
204
+ type: "node.state";
205
+ requestId: string;
206
+ lifecycle: "validating" | "pending" | "approved";
207
+ availability: NodeAvailability;
208
+ }
209
+
210
+ export interface NodeError {
211
+ type: "node.error";
212
+ requestId: string;
213
+ code:
214
+ | "BAD_REQUEST"
215
+ | "AUTH_FAILED"
216
+ | "NOT_APPROVED"
217
+ | "REJECTED"
218
+ | "REVOKED"
219
+ | "VERSION_MISMATCH"
220
+ | "INTERNAL";
221
+ message: string;
222
+ }
223
+
224
+ export type NodeClientMessage =
225
+ | NodeHello
226
+ | NodeHeartbeat
227
+ | NodeWebRTCAnswer
228
+ | NodeCredentialRotatedAck;
229
+ export type NodeServerMessage =
230
+ | NodeWelcome
231
+ | NodeHeartbeatAck
232
+ | NodeWebRTCOffer
233
+ | NodeCredentialRotated
234
+ | NodeStateChanged
235
+ | NodeError;
236
+
237
+ export interface SignedNodeUpdateManifest {
238
+ schemaVersion: 1;
239
+ packageName: "roxxie-transports-node";
240
+ version: string;
241
+ publishedAt: string;
242
+ expiresAt: string;
243
+ tarballUrl: string;
244
+ sha512: string;
245
+ minimumNodeVersion: string;
246
+ signatureAlgorithm: "Ed25519";
247
+ signature: string;
248
+ }
249
+
250
+ export type NodeUpdateManifestPayload = Omit<
251
+ SignedNodeUpdateManifest,
252
+ "signature"
253
+ >;
254
+
255
+ export class TrackerProtocolError extends Error {
256
+ constructor(message: string) {
257
+ super(message);
258
+ this.name = "TrackerProtocolError";
259
+ }
260
+ }
261
+
262
+ function objectValue(value: unknown, label: string): Record<string, unknown> {
263
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
264
+ throw new TrackerProtocolError(`${label} must be an object`);
265
+ }
266
+ return value as Record<string, unknown>;
267
+ }
268
+
269
+ function stringValue(
270
+ value: unknown,
271
+ label: string,
272
+ maximumBytes: number = CONTROL_LIMITS.maxErrorBytes
273
+ ): string {
274
+ if (
275
+ typeof value !== "string" ||
276
+ value.length === 0 ||
277
+ new TextEncoder().encode(value).byteLength > maximumBytes
278
+ ) {
279
+ throw new TrackerProtocolError(
280
+ `${label} must be a non-empty bounded string`
281
+ );
282
+ }
283
+ return value;
284
+ }
285
+
286
+ function requestId(value: unknown): string {
287
+ const result = stringValue(value, "requestId", 128);
288
+ if (!/^[A-Za-z0-9._:-]+$/u.test(result)) {
289
+ throw new TrackerProtocolError("requestId contains invalid characters");
290
+ }
291
+ return result;
292
+ }
293
+
294
+ function assertMessageBase(value: unknown): Record<string, unknown> {
295
+ const message = objectValue(value, "message");
296
+ stringValue(message.type, "type", 64);
297
+ requestId(message.requestId);
298
+ return message;
299
+ }
300
+
301
+ function assertNodeId(value: unknown, label = "nodeId"): string {
302
+ const id = stringValue(value, label, 64);
303
+ if (
304
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(
305
+ id
306
+ )
307
+ ) {
308
+ throw new TrackerProtocolError(`${label} must be an RFC 9562 UUID`);
309
+ }
310
+ return id;
311
+ }
312
+
313
+ function assertDescription(
314
+ value: unknown,
315
+ expectedType: "offer" | "answer",
316
+ label: string
317
+ ): void {
318
+ const description = objectValue(value, label);
319
+ if (description.type !== expectedType) {
320
+ throw new TrackerProtocolError(`${label} must have type ${expectedType}`);
321
+ }
322
+ stringValue(description.sdp, `${label}.sdp`, 1024 * 1024);
323
+ }
324
+
325
+ function assertIceCandidates(value: unknown, label: string): void {
326
+ if (!Array.isArray(value) || value.length > CONTROL_LIMITS.maxIceCandidates) {
327
+ throw new TrackerProtocolError(`${label} is invalid`);
328
+ }
329
+ for (const [index, entry] of value.entries()) {
330
+ const candidate = objectValue(entry, `${label}[${index}]`);
331
+ stringValue(candidate.candidate, `${label}[${index}].candidate`, 16 * 1024);
332
+ if (candidate.sdpMid !== undefined && candidate.sdpMid !== null) {
333
+ stringValue(candidate.sdpMid, `${label}[${index}].sdpMid`, 256);
334
+ }
335
+ if (
336
+ candidate.sdpMLineIndex !== undefined &&
337
+ candidate.sdpMLineIndex !== null &&
338
+ (!Number.isInteger(candidate.sdpMLineIndex) ||
339
+ (candidate.sdpMLineIndex as number) < 0 ||
340
+ (candidate.sdpMLineIndex as number) > 65_535)
341
+ ) {
342
+ throw new TrackerProtocolError(
343
+ `${label}[${index}].sdpMLineIndex is invalid`
344
+ );
345
+ }
346
+ if (
347
+ candidate.usernameFragment !== undefined &&
348
+ candidate.usernameFragment !== null
349
+ ) {
350
+ stringValue(
351
+ candidate.usernameFragment,
352
+ `${label}[${index}].usernameFragment`,
353
+ 256
354
+ );
355
+ }
356
+ }
357
+ }
358
+
359
+ function assertIceServers(value: unknown, label: string): void {
360
+ if (!Array.isArray(value) || value.length > 8)
361
+ throw new TrackerProtocolError(`${label} is invalid`);
362
+ for (const [index, entry] of value.entries()) {
363
+ const server = objectValue(entry, `${label}[${index}]`);
364
+ const urls = typeof server.urls === "string" ? [server.urls] : server.urls;
365
+ if (!Array.isArray(urls) || urls.length === 0 || urls.length > 8)
366
+ throw new TrackerProtocolError(`${label}[${index}].urls is invalid`);
367
+ for (const url of urls) {
368
+ if (
369
+ typeof url !== "string" ||
370
+ url.length > 2048 ||
371
+ !/^stuns?:[^\s]+$/iu.test(url)
372
+ ) {
373
+ throw new TrackerProtocolError(
374
+ `${label}[${index}] contains a non-STUN URL`
375
+ );
376
+ }
377
+ }
378
+ if (server.username !== undefined || server.credential !== undefined) {
379
+ throw new TrackerProtocolError(
380
+ `${label}[${index}] must not contain relay credentials`
381
+ );
382
+ }
383
+ }
384
+ }
385
+
386
+ function assertWebRTCOffer(value: unknown): asserts value is WebRTCOffer {
387
+ const offer = objectValue(value, "offer");
388
+ stringValue(offer.protocolVersion, "offer.protocolVersion", 32);
389
+ assertDescription(offer.offer, "offer", "offer.offer");
390
+ assertIceCandidates(offer.candidates, "offer.candidates");
391
+ }
392
+
393
+ export function assertWebRTCAnswer(
394
+ value: unknown
395
+ ): asserts value is WebRTCAnswer {
396
+ const answer = objectValue(value, "answer");
397
+ stringValue(answer.protocolVersion, "answer.protocolVersion", 32);
398
+ stringValue(answer.sessionId, "answer.sessionId", 128);
399
+ assertDescription(answer.answer, "answer", "answer.answer");
400
+ assertIceCandidates(answer.candidates, "answer.candidates");
401
+ }
402
+
403
+ export function assertBrowserClientMessage(
404
+ value: unknown
405
+ ): asserts value is BrowserClientMessage {
406
+ const message = assertMessageBase(value);
407
+ if (message.type === "browser.candidates.request") return;
408
+ if (message.type === "browser.session.offer") {
409
+ assertNodeId(message.nodeId);
410
+ assertWebRTCOffer(message.offer);
411
+ return;
412
+ }
413
+ throw new TrackerProtocolError("Unknown browser message type");
414
+ }
415
+
416
+ export function assertNodeClientMessage(
417
+ value: unknown
418
+ ): asserts value is NodeClientMessage {
419
+ const message = assertMessageBase(value);
420
+ switch (message.type) {
421
+ case "node.hello": {
422
+ if (message.trackerProtocolVersion !== TRACKER_PROTOCOL_VERSION) {
423
+ throw new TrackerProtocolError(
424
+ `Unsupported tracker protocol version; expected ${TRACKER_PROTOCOL_VERSION}`
425
+ );
426
+ }
427
+ if (
428
+ !(["enrollment", "pending", "approved"] as unknown[]).includes(
429
+ message.credentialKind
430
+ )
431
+ ) {
432
+ throw new TrackerProtocolError("credentialKind is invalid");
433
+ }
434
+ stringValue(message.credential, "credential", 512);
435
+ const metadata = objectValue(message.metadata, "metadata");
436
+ assertNodeId(metadata.nodeId, "metadata.nodeId");
437
+ stringValue(
438
+ metadata.name,
439
+ "metadata.name",
440
+ CONTROL_LIMITS.maxNodeNameBytes
441
+ );
442
+ for (const field of [
443
+ "packageVersion",
444
+ "nodeVersion",
445
+ "platform",
446
+ "arch",
447
+ "protocolVersion",
448
+ ] as const) {
449
+ stringValue(
450
+ metadata[field],
451
+ `metadata.${field}`,
452
+ CONTROL_LIMITS.maxVersionBytes
453
+ );
454
+ }
455
+ if (
456
+ !Number.isInteger(metadata.maxSessions) ||
457
+ (metadata.maxSessions as number) < 1 ||
458
+ (metadata.maxSessions as number) > CONTROL_LIMITS.maxNodeSessions
459
+ ) {
460
+ throw new TrackerProtocolError("metadata.maxSessions is invalid");
461
+ }
462
+ return;
463
+ }
464
+ case "node.heartbeat": {
465
+ const metrics = objectValue(message.metrics, "metrics");
466
+ for (const field of [
467
+ "activeSessions",
468
+ "maxSessions",
469
+ "uptimeSeconds",
470
+ ] as const) {
471
+ if (
472
+ !Number.isSafeInteger(metrics[field]) ||
473
+ (metrics[field] as number) < 0
474
+ ) {
475
+ throw new TrackerProtocolError(`metrics.${field} is invalid`);
476
+ }
477
+ }
478
+ if ((metrics.maxSessions as number) > CONTROL_LIMITS.maxNodeSessions) {
479
+ throw new TrackerProtocolError(
480
+ "maxSessions exceeds the network safety ceiling"
481
+ );
482
+ }
483
+ if ((metrics.maxSessions as number) < 1) {
484
+ throw new TrackerProtocolError("maxSessions must be at least one");
485
+ }
486
+ if (
487
+ (metrics.activeSessions as number) > (metrics.maxSessions as number)
488
+ ) {
489
+ throw new TrackerProtocolError("activeSessions exceeds maxSessions");
490
+ }
491
+ return;
492
+ }
493
+ case "node.webrtc.answer": {
494
+ if (typeof message.ok !== "boolean")
495
+ throw new TrackerProtocolError("ok must be boolean");
496
+ if (message.ok && message.answer === undefined)
497
+ throw new TrackerProtocolError("Successful answer is missing payload");
498
+ if (!message.ok && message.error === undefined)
499
+ throw new TrackerProtocolError("Failed answer is missing error");
500
+ if (message.ok) assertWebRTCAnswer(message.answer);
501
+ if (!message.ok) stringValue(message.error, "error");
502
+ return;
503
+ }
504
+ case "node.credential.rotated.ack":
505
+ return;
506
+ default:
507
+ throw new TrackerProtocolError("Unknown node message type");
508
+ }
509
+ }
510
+
511
+ export function assertNodeServerMessage(
512
+ value: unknown
513
+ ): asserts value is NodeServerMessage {
514
+ const message = assertMessageBase(value);
515
+ switch (message.type) {
516
+ case "node.welcome":
517
+ if (
518
+ !(["validating", "pending", "approved"] as unknown[]).includes(
519
+ message.lifecycle
520
+ )
521
+ ) {
522
+ throw new TrackerProtocolError("lifecycle is invalid");
523
+ }
524
+ if (
525
+ !(["pending", "approved"] as unknown[]).includes(message.credentialKind)
526
+ ) {
527
+ throw new TrackerProtocolError("credentialKind is invalid");
528
+ }
529
+ if (
530
+ (message.lifecycle === "approved") !==
531
+ (message.credentialKind === "approved")
532
+ ) {
533
+ throw new TrackerProtocolError(
534
+ "credentialKind does not match lifecycle"
535
+ );
536
+ }
537
+ if (message.credential !== undefined)
538
+ stringValue(message.credential, "credential", 512);
539
+ if (
540
+ !Number.isInteger(message.heartbeatIntervalMs) ||
541
+ (message.heartbeatIntervalMs as number) < 1_000
542
+ ) {
543
+ throw new TrackerProtocolError("heartbeatIntervalMs is invalid");
544
+ }
545
+ return;
546
+ case "node.heartbeat.ack":
547
+ if (
548
+ !Number.isInteger(message.nextHeartbeatMs) ||
549
+ (message.nextHeartbeatMs as number) < 1_000
550
+ ) {
551
+ throw new TrackerProtocolError("nextHeartbeatMs is invalid");
552
+ }
553
+ return;
554
+ case "node.webrtc.offer":
555
+ if (message.purpose !== "validation" && message.purpose !== "browser") {
556
+ throw new TrackerProtocolError("purpose is invalid");
557
+ }
558
+ assertWebRTCOffer(message.offer);
559
+ return;
560
+ case "node.credential.rotated":
561
+ stringValue(message.credential, "credential", 512);
562
+ return;
563
+ case "node.state":
564
+ if (
565
+ !(["validating", "pending", "approved"] as unknown[]).includes(
566
+ message.lifecycle
567
+ )
568
+ ) {
569
+ throw new TrackerProtocolError("lifecycle is invalid");
570
+ }
571
+ if (
572
+ !(["online", "unhealthy", "offline"] as unknown[]).includes(
573
+ message.availability
574
+ )
575
+ ) {
576
+ throw new TrackerProtocolError("availability is invalid");
577
+ }
578
+ return;
579
+ case "node.error":
580
+ if (
581
+ !(
582
+ [
583
+ "BAD_REQUEST",
584
+ "AUTH_FAILED",
585
+ "NOT_APPROVED",
586
+ "REJECTED",
587
+ "REVOKED",
588
+ "VERSION_MISMATCH",
589
+ "INTERNAL",
590
+ ] as unknown[]
591
+ ).includes(message.code)
592
+ ) {
593
+ throw new TrackerProtocolError("node error code is invalid");
594
+ }
595
+ stringValue(message.message, "message");
596
+ return;
597
+ default:
598
+ throw new TrackerProtocolError("Unknown tracker-to-node message type");
599
+ }
600
+ }
601
+
602
+ export function assertBrowserServerMessage(
603
+ value: unknown
604
+ ): asserts value is BrowserServerMessage {
605
+ const message = assertMessageBase(value);
606
+ switch (message.type) {
607
+ case "browser.candidates.result":
608
+ if (
609
+ !Array.isArray(message.candidates) ||
610
+ message.candidates.length > CONTROL_LIMITS.maxCandidatesReturned
611
+ ) {
612
+ throw new TrackerProtocolError("candidates is invalid");
613
+ }
614
+ for (const [index, raw] of (message.candidates as unknown[]).entries()) {
615
+ const candidate = objectValue(raw, `candidates[${index}]`);
616
+ assertNodeId(candidate.nodeId, `candidates[${index}].nodeId`);
617
+ stringValue(
618
+ candidate.name,
619
+ `candidates[${index}].name`,
620
+ CONTROL_LIMITS.maxNodeNameBytes
621
+ );
622
+ stringValue(
623
+ candidate.protocolVersion,
624
+ `candidates[${index}].protocolVersion`,
625
+ 32
626
+ );
627
+ for (const field of ["activeSessions", "maxSessions"] as const) {
628
+ if (
629
+ !Number.isSafeInteger(candidate[field]) ||
630
+ (candidate[field] as number) < (field === "maxSessions" ? 1 : 0)
631
+ ) {
632
+ throw new TrackerProtocolError(
633
+ `candidates[${index}].${field} is invalid`
634
+ );
635
+ }
636
+ }
637
+ if (
638
+ typeof candidate.utilization !== "number" ||
639
+ !Number.isFinite(candidate.utilization) ||
640
+ candidate.utilization < 0 ||
641
+ candidate.utilization > 1
642
+ ) {
643
+ throw new TrackerProtocolError(
644
+ `candidates[${index}].utilization is invalid`
645
+ );
646
+ }
647
+ assertIceServers(
648
+ candidate.iceServers,
649
+ `candidates[${index}].iceServers`
650
+ );
651
+ }
652
+ return;
653
+ case "browser.session.answer":
654
+ assertNodeId(message.nodeId);
655
+ assertWebRTCAnswer(message.answer);
656
+ return;
657
+ case "browser.error":
658
+ if (
659
+ !(
660
+ [
661
+ "BAD_REQUEST",
662
+ "NODE_UNAVAILABLE",
663
+ "NODE_CAPACITY",
664
+ "SIGNAL_TIMEOUT",
665
+ "INTERNAL",
666
+ ] as unknown[]
667
+ ).includes(message.code)
668
+ ) {
669
+ throw new TrackerProtocolError("browser error code is invalid");
670
+ }
671
+ stringValue(message.message, "message");
672
+ return;
673
+ default:
674
+ throw new TrackerProtocolError("Unknown tracker-to-browser message type");
675
+ }
676
+ }
677
+
678
+ /**
679
+ * Canonical bytes signed with Ed25519. Field order is explicit and independent
680
+ * of object insertion order in the caller.
681
+ */
682
+ export function manifestSigningPayload(
683
+ manifest: NodeUpdateManifestPayload
684
+ ): Uint8Array {
685
+ const canonical = {
686
+ schemaVersion: manifest.schemaVersion,
687
+ packageName: manifest.packageName,
688
+ version: manifest.version,
689
+ publishedAt: manifest.publishedAt,
690
+ expiresAt: manifest.expiresAt,
691
+ tarballUrl: manifest.tarballUrl,
692
+ sha512: manifest.sha512,
693
+ minimumNodeVersion: manifest.minimumNodeVersion,
694
+ signatureAlgorithm: manifest.signatureAlgorithm,
695
+ };
696
+ return new TextEncoder().encode(JSON.stringify(canonical));
697
+ }
698
+
699
+ function bytesOf(value: string | ArrayBuffer | ArrayBufferView): Uint8Array {
700
+ if (typeof value === "string") return new TextEncoder().encode(value);
701
+ if (ArrayBuffer.isView(value))
702
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
703
+ return new Uint8Array(value);
704
+ }
705
+
706
+ export function decodeControlJSON(
707
+ value: string | ArrayBuffer | ArrayBufferView
708
+ ): unknown {
709
+ const bytes = bytesOf(value);
710
+ if (bytes.byteLength > CONTROL_LIMITS.maxMessageBytes) {
711
+ throw new TrackerProtocolError("Control message is too large");
712
+ }
713
+ let text: string;
714
+ try {
715
+ text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
716
+ } catch {
717
+ throw new TrackerProtocolError("Control message is not valid UTF-8");
718
+ }
719
+ try {
720
+ return JSON.parse(text) as unknown;
721
+ } catch {
722
+ throw new TrackerProtocolError("Control message is not valid JSON");
723
+ }
724
+ }
725
+
726
+ export function encodeControlJSON(value: unknown): string {
727
+ const result = JSON.stringify(value);
728
+ if (
729
+ new TextEncoder().encode(result).byteLength > CONTROL_LIMITS.maxMessageBytes
730
+ ) {
731
+ throw new TrackerProtocolError("Control message is too large");
732
+ }
733
+ return result;
734
+ }
735
+
736
+ export function utilization(
737
+ activeSessions: number,
738
+ maxSessions: number
739
+ ): number {
740
+ if (!Number.isSafeInteger(activeSessions) || activeSessions < 0)
741
+ throw new TrackerProtocolError("activeSessions is invalid");
742
+ if (!Number.isSafeInteger(maxSessions) || maxSessions < 1)
743
+ throw new TrackerProtocolError("maxSessions is invalid");
744
+ return Math.min(1, activeSessions / maxSessions);
745
+ }