@jshookmcp/jshook 0.2.9 → 0.3.1

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 (316) hide show
  1. package/README.md +25 -50
  2. package/README.zh.md +25 -48
  3. package/dist/AntiCheatDetector-CGVGNfy5.mjs +1 -0
  4. package/dist/CacheAdapters-CdAxBmVW.mjs +1 -0
  5. package/dist/CodeInjector-BlgyqTOk.mjs +1 -0
  6. package/dist/ConsoleMonitor-Dkqc0HNi.mjs +490 -0
  7. package/dist/DOMInspector-BYY_EJ0C.mjs +95 -0
  8. package/dist/DarwinAPI-DC4HGGLl.mjs +1 -0
  9. package/dist/DetailedDataManager-BniBJlVv.mjs +1 -0
  10. package/dist/EventBus-DgciURGg.mjs +1 -0
  11. package/dist/EvidenceGraphBridge-BIfgB7HP.mjs +1 -0
  12. package/dist/ExtensionManager-erMpqcLk.mjs +1 -0
  13. package/dist/FingerprintManager-N7BZqjxP.mjs +1 -0
  14. package/dist/HardwareBreakpoint-OcJqNFVc.mjs +1 -0
  15. package/dist/HeapAnalyzer-CqAxZzeS.mjs +1 -0
  16. package/dist/{HookGeneratorBuilders.core.generators.storage-CtcdK78Q.mjs → HookGeneratorBuilders.core.generators.storage-Bf1fbrNK.mjs} +66 -174
  17. package/dist/InstrumentationSession-DxXs0sCp.mjs +1 -0
  18. package/dist/MCPServer.search.handlers.domain-DVbWL1bT.mjs +1 -0
  19. package/dist/MemoryController-BaqstM5w.mjs +2 -0
  20. package/dist/MemoryScanSession-CaxAjZJf.mjs +1 -0
  21. package/dist/MemoryScanner-BLYnMJy6.mjs +1 -0
  22. package/dist/NativeMemoryManager.impl-CI554XbY.mjs +1 -0
  23. package/dist/NativeMemoryManager.utils-DM4NC3FE.mjs +1 -0
  24. package/dist/PEAnalyzer-DJyaJTQJ.mjs +1 -0
  25. package/dist/PageController-D9jVkH0i.mjs +1 -0
  26. package/dist/PointerChainEngine-5nF9eNlu.mjs +1 -0
  27. package/dist/PrerequisiteError-Bl3dK8XA.mjs +1 -0
  28. package/dist/ProcessRegistry-Hf12LlR9.mjs +1 -0
  29. package/dist/ResponseBuilder-B2lu4KEl.mjs +1 -0
  30. package/dist/ReverseEvidenceGraph-B931HeoW.mjs +2 -0
  31. package/dist/ScriptManager-fgqiALgj.mjs +7 -0
  32. package/dist/Speedhack-l6s8L2Qw.mjs +1 -0
  33. package/dist/StealthVerifier-Dhbj4B4P.mjs +1 -0
  34. package/dist/StructureAnalyzer-A-WamfYE.mjs +2 -0
  35. package/dist/ToolCatalog-D_IKl1Hu.mjs +1 -0
  36. package/dist/ToolError-DWU_z7gp.mjs +1 -0
  37. package/dist/ToolProbe-xsfALmN3.mjs +1 -0
  38. package/dist/ToolRegistry-B0Zs-phN.mjs +1 -0
  39. package/dist/ToolRouter.policy-CFHoN_Lw.mjs +4 -0
  40. package/dist/TraceRecorder-Dd8jLXpi.mjs +272 -0
  41. package/dist/VersionDetector-DMoUWyNm.mjs +9 -0
  42. package/dist/Win32API-Bhi5xFBe.mjs +1 -0
  43. package/dist/Win32Debug-CQteFL4F.mjs +1 -0
  44. package/dist/WorkflowEngine-CxEp2WXH.mjs +1 -0
  45. package/dist/analysis-BuR-NgX8.mjs +5 -0
  46. package/dist/{antidebug-CqDTB_uk.mjs → antidebug-BOTZH6-0.mjs} +8 -259
  47. package/dist/artifactRetention-NBdncOEW.mjs +1 -0
  48. package/dist/artifacts-B5xQuEa_.mjs +1 -0
  49. package/dist/authorization-schema-B40obG1A.mjs +1 -0
  50. package/dist/betterSqlite3-CGaxz4AX.mjs +1 -0
  51. package/dist/binary-instrument-Cf9qqLlM.mjs +7 -0
  52. package/dist/bind-helpers-BlAOQrFQ.mjs +1 -0
  53. package/dist/boringssl-inspector-BST5vtKx.mjs +2 -0
  54. package/dist/browser-C4Le3xqA.mjs +11 -0
  55. package/dist/capabilities-DbYCv-HF.mjs +1 -0
  56. package/dist/chunk-C_pMuVsO.mjs +1 -0
  57. package/dist/collector-CKO8RPK8.mjs +1 -0
  58. package/dist/concurrency-CcK46d0h.mjs +1 -0
  59. package/dist/constants-Cp6hBrrx.mjs +1 -0
  60. package/dist/coordination-BbijHEHH.mjs +1 -0
  61. package/dist/debugger-CRJq_krh.mjs +1 -0
  62. package/dist/definitions-BGobEDQa.mjs +1 -0
  63. package/dist/definitions-BGwNSkVm.mjs +1 -0
  64. package/dist/definitions-BbxOUiP-.mjs +1 -0
  65. package/dist/definitions-CCP9gphV.mjs +1 -0
  66. package/dist/definitions-CIO9O-Sw.mjs +1 -0
  67. package/dist/definitions-CYFbewnd.mjs +1 -0
  68. package/dist/definitions-CdWEuIkI.mjs +1 -0
  69. package/dist/definitions-CoQFbggH.mjs +1 -0
  70. package/dist/definitions-CuJRsJ6N.mjs +1 -0
  71. package/dist/definitions-DI9YXsJk.mjs +1 -0
  72. package/dist/definitions-DJklW2sS.mjs +1 -0
  73. package/dist/definitions-DZ8uKusP.mjs +1 -0
  74. package/dist/definitions-Dds_zrWx.mjs +1 -0
  75. package/dist/definitions-Dgrg7f3D.mjs +1 -0
  76. package/dist/definitions-DtE0XLrT.mjs +1 -0
  77. package/dist/definitions-LaYTuwQd.mjs +26 -0
  78. package/dist/definitions-NoVp_9Pm.mjs +1 -0
  79. package/dist/definitions-OvGsfxdt.mjs +1 -0
  80. package/dist/definitions-jXPaVy4P.mjs +1 -0
  81. package/dist/encoding-DGcr6Aj_.mjs +2 -0
  82. package/dist/ensure-browser-core-Buls24LQ.mjs +1 -0
  83. package/dist/evidence-graph-bridge-B0yhGPcs.mjs +1 -0
  84. package/dist/factory-Cx_1LorX.mjs +1 -0
  85. package/dist/flat-target-session-CO5g78k3.mjs +1 -0
  86. package/dist/formatAddress-C7j2fDlM.mjs +1 -0
  87. package/dist/graphql-HLf3MS8H.mjs +62 -0
  88. package/dist/handlers-BLMa4X7l.mjs +54 -0
  89. package/dist/handlers-BP12ZsWc.mjs +4 -0
  90. package/dist/handlers-BZoPla6E.mjs +1 -0
  91. package/dist/handlers-BggKiVx9.mjs +2 -0
  92. package/dist/handlers-D3iev8g1.mjs +1 -0
  93. package/dist/handlers-D49r1-1P.mjs +1 -0
  94. package/dist/handlers-DCE45Ww8.mjs +2 -0
  95. package/dist/handlers-DW5AbYs5.mjs +5 -0
  96. package/dist/handlers-De5u62Ga2.mjs +1 -0
  97. package/dist/handlers-DmQzIc44.mjs +31 -0
  98. package/dist/handlers-DnJRGp7t.mjs +302 -0
  99. package/dist/handlers-Dv_runVv.mjs +2 -0
  100. package/dist/handlers-S9Ws0IGy.mjs +2 -0
  101. package/dist/{handlers-Bl8zkwz1.mjs → handlers-pVNpaw4A.mjs} +144 -841
  102. package/dist/handlers.impl-CD2_kOcC.mjs +1 -0
  103. package/dist/hooks-DDKppogd.mjs +600 -0
  104. package/dist/index.mjs +12 -5225
  105. package/dist/logger-sBC6IdRT.mjs +1 -0
  106. package/dist/maintenance-CutEO84j.mjs +1 -0
  107. package/dist/manifest-BFGxlDRh.mjs +123 -0
  108. package/dist/manifest-BPuE6oH2.mjs +1 -0
  109. package/dist/manifest-BXry5N09.mjs +1 -0
  110. package/dist/manifest-BeP_zJGb2.mjs +1 -0
  111. package/dist/manifest-C0g67k6U.mjs +1 -0
  112. package/dist/manifest-C1nZkTkO.mjs +1 -0
  113. package/dist/manifest-C7qV1z7F.mjs +1 -0
  114. package/dist/manifest-CDeUZGUZ.mjs +1 -0
  115. package/dist/manifest-CDiCtaQT.mjs +1 -0
  116. package/dist/manifest-CFn0359q2.mjs +1 -0
  117. package/dist/manifest-CGq4NpqH2.mjs +1 -0
  118. package/dist/manifest-CJMGt7Qy.mjs +1 -0
  119. package/dist/manifest-CRIJq4Hs.mjs +1 -0
  120. package/dist/manifest-C_hEIjSx.mjs +1 -0
  121. package/dist/manifest-CeQmtQOY.mjs +1 -0
  122. package/dist/manifest-Cq0j7GZt.mjs +1 -0
  123. package/dist/manifest-CtPmHAdn.mjs +1 -0
  124. package/dist/manifest-Cx2IVMUY.mjs +1 -0
  125. package/dist/manifest-D16xPXro.mjs +1 -0
  126. package/dist/manifest-D44TaRJU.mjs +1 -0
  127. package/dist/manifest-D610kxZr.mjs +2 -0
  128. package/dist/manifest-DC-SMF6b.mjs +1 -0
  129. package/dist/manifest-DD3rtxvV.mjs +1 -0
  130. package/dist/manifest-DKUorv5M.mjs +1 -0
  131. package/dist/manifest-DMJlcsTR.mjs +1 -0
  132. package/dist/manifest-DWUUWBz0.mjs +1 -0
  133. package/dist/manifest-De-6Wf2R.mjs +1 -0
  134. package/dist/manifest-Dgh0uDW-.mjs +1 -0
  135. package/dist/manifest-Dm0o3i2U.mjs +1 -0
  136. package/dist/manifest-DsVh7Y4U.mjs +1 -0
  137. package/dist/manifest-DtEFSRaq.mjs +1 -0
  138. package/dist/manifest-H-EpAyZQ.mjs +1 -0
  139. package/dist/manifest-ais9Afrw.mjs +1 -0
  140. package/dist/manifest-tmb54wmA.mjs +1 -0
  141. package/dist/manifest-yu2xiQqe.mjs +1 -0
  142. package/dist/manifest-zrbrpKCC.mjs +1 -0
  143. package/dist/matchesWildcardPattern-BGqLSmEs.mjs +1 -0
  144. package/dist/modules-p-PUNv9r.mjs +332 -0
  145. package/dist/mojo-ipc-VGlv3Qyp.mjs +9 -0
  146. package/dist/network-BjZ1Y-GB.mjs +7 -0
  147. package/dist/outputPaths-BonGThuc.mjs +2 -0
  148. package/dist/parse-args-Cuk7-xUt.mjs +1 -0
  149. package/dist/platform-C446Lf97.mjs +93 -0
  150. package/dist/playwright-cdp-fallback-BwVR-_T3.mjs +1 -0
  151. package/dist/process-C9f2A5zk.mjs +962 -0
  152. package/dist/proxy-CvRepxgV.mjs +1 -0
  153. package/dist/registry-DUHIPE-v.mjs +1 -0
  154. package/dist/response-C7rKQst4.mjs +1 -0
  155. package/dist/search-defaults-D2bY-rzH.mjs +1 -0
  156. package/dist/server/plugin-api.mjs +1 -293
  157. package/dist/shared-state-board-Cyg-xh_k.mjs +1 -0
  158. package/dist/sourcemap-D6Q1UuAp.mjs +1 -0
  159. package/dist/ssrf-policy-T96MR3r6.mjs +1 -0
  160. package/dist/streaming-CTX58tbb.mjs +1 -0
  161. package/dist/tool-builder-CI9914Tf.mjs +1 -0
  162. package/dist/transform-Cv9P2vVD.mjs +103 -0
  163. package/dist/types-CuyefmGT.mjs +1 -0
  164. package/dist/types-DtThH00r.mjs +1 -0
  165. package/dist/wasm-DaJa8J0V.mjs +174 -0
  166. package/dist/webcrack-CsLLJIs9.mjs +46 -0
  167. package/dist/workflow-CYIXtrWD.mjs +101 -0
  168. package/package.json +12 -7
  169. package/dist/AntiCheatDetector-BNk-EoBt.mjs +0 -244
  170. package/dist/CacheAdapters-CDe5WPSV.mjs +0 -80
  171. package/dist/CodeInjector-Cq8q01kp.mjs +0 -150
  172. package/dist/ConsoleMonitor-CPVQW1Y-.mjs +0 -2201
  173. package/dist/DarwinAPI-BNPxu0RH.mjs +0 -363
  174. package/dist/DetailedDataManager-BQQcxh64.mjs +0 -217
  175. package/dist/EventBus-DgPmwpeu.mjs +0 -141
  176. package/dist/EvidenceGraphBridge-SFesNera.mjs +0 -153
  177. package/dist/ExtensionManager-CWYgw0YW.mjs +0 -714
  178. package/dist/FingerprintManager-gzWtkKuf.mjs +0 -96
  179. package/dist/HardwareBreakpoint-B9gZCdFP.mjs +0 -239
  180. package/dist/HeapAnalyzer-BLDH0dCv.mjs +0 -284
  181. package/dist/InstrumentationSession-CvPC7Jwy.mjs +0 -244
  182. package/dist/MemoryController-CbVdCIJF.mjs +0 -167
  183. package/dist/MemoryScanSession-BsDZbLYm.mjs +0 -278
  184. package/dist/MemoryScanner-Bcpml6II.mjs +0 -425
  185. package/dist/NativeMemoryManager.impl-dZtA1ZGn.mjs +0 -482
  186. package/dist/NativeMemoryManager.utils-B-FjA2mJ.mjs +0 -165
  187. package/dist/PEAnalyzer-D1lzJ_VG.mjs +0 -385
  188. package/dist/PageController-Bqm2kZ_X.mjs +0 -417
  189. package/dist/PointerChainEngine-BOhyVsjx.mjs +0 -322
  190. package/dist/PrerequisiteError-Dl33Svkz.mjs +0 -20
  191. package/dist/ResponseBuilder-D3iFYx2N.mjs +0 -143
  192. package/dist/ReverseEvidenceGraph-Dlsk94LC.mjs +0 -269
  193. package/dist/ScriptManager-aHHq0X7U.mjs +0 -3000
  194. package/dist/Speedhack-CqdIFlQl.mjs +0 -156
  195. package/dist/StealthVerifier-Bo4T3bz8.mjs +0 -135
  196. package/dist/StructureAnalyzer-DhFaPvRO.mjs +0 -426
  197. package/dist/ToolCatalog-C0JGZoOm.mjs +0 -582
  198. package/dist/ToolError-jh9whhMd.mjs +0 -15
  199. package/dist/ToolProbe-oC7aPrkv.mjs +0 -45
  200. package/dist/ToolRegistry-BjaF4oNz.mjs +0 -131
  201. package/dist/ToolRouter.policy-BWV67ZK-.mjs +0 -304
  202. package/dist/TraceRecorder-DgxyVbdQ.mjs +0 -519
  203. package/dist/VersionDetector-CwVLVdDM.mjs +0 -104
  204. package/dist/Win32API-CePkipZY.mjs +0 -340
  205. package/dist/Win32Debug-BvKs-gxc.mjs +0 -274
  206. package/dist/WorkflowEngine-CuvkZtWu.mjs +0 -598
  207. package/dist/analysis-CL9uACt9.mjs +0 -463
  208. package/dist/artifactRetention-CFEprwPw.mjs +0 -591
  209. package/dist/artifacts-Bk2-_uPq.mjs +0 -59
  210. package/dist/betterSqlite3-0pqusHHH.mjs +0 -74
  211. package/dist/binary-instrument-CXfpx6fT.mjs +0 -979
  212. package/dist/bind-helpers-xFfRF-qm.mjs +0 -22
  213. package/dist/boringssl-inspector-BH2D3VKc.mjs +0 -180
  214. package/dist/browser-BpOr5PEx.mjs +0 -4082
  215. package/dist/chunk-CjcI7cDX.mjs +0 -15
  216. package/dist/concurrency-Bt0yv1kJ.mjs +0 -41
  217. package/dist/constants-B0OANIBL.mjs +0 -519
  218. package/dist/coordination-qUbyF8KU.mjs +0 -259
  219. package/dist/debugger-gnKxRSN0.mjs +0 -1271
  220. package/dist/definitions-6M-eejaT.mjs +0 -53
  221. package/dist/definitions-B18eyf0B.mjs +0 -18
  222. package/dist/definitions-B3QdlrHv.mjs +0 -34
  223. package/dist/definitions-B4rAvHNZ.mjs +0 -63
  224. package/dist/definitions-BB_4jnmy.mjs +0 -37
  225. package/dist/definitions-BMfYXoNC.mjs +0 -43
  226. package/dist/definitions-Beid2EB3.mjs +0 -27
  227. package/dist/definitions-C1UvM5Iy.mjs +0 -126
  228. package/dist/definitions-CXEI7QC72.mjs +0 -216
  229. package/dist/definitions-C_4r7Fo-2.mjs +0 -14
  230. package/dist/definitions-CkFDALoa.mjs +0 -26
  231. package/dist/definitions-Cke7zEb8.mjs +0 -94
  232. package/dist/definitions-ClJLzsJQ.mjs +0 -25
  233. package/dist/definitions-Cq-zroAU.mjs +0 -28
  234. package/dist/definitions-Cy3Sl6gV.mjs +0 -34
  235. package/dist/definitions-D3VsGcvz.mjs +0 -47
  236. package/dist/definitions-DVGfrn7y.mjs +0 -96
  237. package/dist/definitions-LKpC3-nL.mjs +0 -9
  238. package/dist/definitions-bAhHQJq9.mjs +0 -359
  239. package/dist/encoding-Bvz5jLRv.mjs +0 -1065
  240. package/dist/evidence-graph-bridge-C_fv9PuC.mjs +0 -135
  241. package/dist/factory-DxlGh9Xf.mjs +0 -575
  242. package/dist/formatAddress-DVkj9kpI.mjs +0 -17
  243. package/dist/graphql-DYWzJ29s.mjs +0 -1026
  244. package/dist/handlers-9sAbfIg-.mjs +0 -2552
  245. package/dist/handlers-C67ktuRN.mjs +0 -710
  246. package/dist/handlers-C87g8oCe.mjs +0 -276
  247. package/dist/handlers-CTsDAO6p.mjs +0 -681
  248. package/dist/handlers-Cgyg6c0U.mjs +0 -645
  249. package/dist/handlers-D6j6yka7.mjs +0 -2124
  250. package/dist/handlers-DdFzXLvF.mjs +0 -446
  251. package/dist/handlers-DeLOCd5m.mjs +0 -799
  252. package/dist/handlers-DlCJN4Td.mjs +0 -757
  253. package/dist/handlers-DxGIq15_2.mjs +0 -917
  254. package/dist/handlers-U6L4xhuF.mjs +0 -585
  255. package/dist/handlers-tB9Mp9ZK.mjs +0 -84
  256. package/dist/handlers-tiy7EIBp.mjs +0 -572
  257. package/dist/handlers.impl-DS0d9fUw.mjs +0 -761
  258. package/dist/hooks-CzCWByww.mjs +0 -898
  259. package/dist/logger-Dh_xb7_2.mjs +0 -93
  260. package/dist/maintenance-P7ePRXQC.mjs +0 -830
  261. package/dist/manifest-2ToTpjv8.mjs +0 -106
  262. package/dist/manifest-3g71z6Bg.mjs +0 -79
  263. package/dist/manifest-82baTv4U.mjs +0 -45
  264. package/dist/manifest-B3QVVeBS.mjs +0 -82
  265. package/dist/manifest-BB2J8IMJ.mjs +0 -149
  266. package/dist/manifest-BKbgbSiY.mjs +0 -60
  267. package/dist/manifest-Bcf-TJzH.mjs +0 -848
  268. package/dist/manifest-BmtZzQiQ2.mjs +0 -45
  269. package/dist/manifest-Bnd7kqEY.mjs +0 -55
  270. package/dist/manifest-BqQX6OQC2.mjs +0 -65
  271. package/dist/manifest-BqrQ4Tpj.mjs +0 -81
  272. package/dist/manifest-Br4RPFt5.mjs +0 -370
  273. package/dist/manifest-C5qDjysN.mjs +0 -107
  274. package/dist/manifest-C9RT5nk32.mjs +0 -34
  275. package/dist/manifest-CAhOuvSl.mjs +0 -204
  276. package/dist/manifest-CBYWCUBJ.mjs +0 -51
  277. package/dist/manifest-CFADCRa1.mjs +0 -37
  278. package/dist/manifest-CQVhavRF.mjs +0 -114
  279. package/dist/manifest-CT7zZBV1.mjs +0 -48
  280. package/dist/manifest-CV12bcrF.mjs +0 -121
  281. package/dist/manifest-CXsRWjjI.mjs +0 -224
  282. package/dist/manifest-CZLUCfG02.mjs +0 -95
  283. package/dist/manifest-D6phHKFd.mjs +0 -131
  284. package/dist/manifest-DCyjf4n2.mjs +0 -294
  285. package/dist/manifest-DHsnKgP6.mjs +0 -60
  286. package/dist/manifest-Df_dliIe.mjs +0 -55
  287. package/dist/manifest-Dh8WBmEW.mjs +0 -129
  288. package/dist/manifest-DhKRAT8_.mjs +0 -92
  289. package/dist/manifest-DlpTj4ic2.mjs +0 -193
  290. package/dist/manifest-DrbmZcFl2.mjs +0 -253
  291. package/dist/manifest-DuwHjUa5.mjs +0 -70
  292. package/dist/manifest-DzwvxPJX.mjs +0 -38
  293. package/dist/manifest-NXctwWQq.mjs +0 -68
  294. package/dist/manifest-Sc_0JQ13.mjs +0 -418
  295. package/dist/manifest-gZ4s_UtG.mjs +0 -96
  296. package/dist/manifest-qSleDqdO.mjs +0 -1023
  297. package/dist/modules-C184v-S9.mjs +0 -11365
  298. package/dist/mojo-ipc-B_H61Afw.mjs +0 -525
  299. package/dist/network-671Cw6hV.mjs +0 -3346
  300. package/dist/outputPaths-B1uGmrWZ.mjs +0 -1145
  301. package/dist/parse-args-BlRjqlkL.mjs +0 -39
  302. package/dist/platform-WmNn8Sxb.mjs +0 -2070
  303. package/dist/process-QcbIy5Zq.mjs +0 -1401
  304. package/dist/proxy-DqNs0bAd.mjs +0 -170
  305. package/dist/registry-D-6e18lB.mjs +0 -34
  306. package/dist/response-BQVP-xUn.mjs +0 -28
  307. package/dist/shared-state-board-DV-dpHFJ.mjs +0 -586
  308. package/dist/sourcemap-Dq8ez8vS.mjs +0 -650
  309. package/dist/ssrf-policy-ZaUfvhq7.mjs +0 -166
  310. package/dist/streaming-BUQ0VJsg.mjs +0 -725
  311. package/dist/tool-builder-DCbIC5Eo.mjs +0 -186
  312. package/dist/transform-CiYJfNX0.mjs +0 -1007
  313. package/dist/types-Bx92KJfT.mjs +0 -4
  314. package/dist/types-CPhOReNX.mjs +0 -37
  315. package/dist/wasm-DQTnHDs4.mjs +0 -531
  316. package/dist/workflow-f3xJOcjx.mjs +0 -725
@@ -1,1065 +0,0 @@
1
- import { a as argString, n as argEnum, r as argNumber } from "./parse-args-BlRjqlkL.mjs";
2
- import "./definitions-D3VsGcvz.mjs";
3
- import { homedir, tmpdir } from "node:os";
4
- import { isAbsolute, resolve } from "node:path";
5
- import { readFile, realpath } from "node:fs/promises";
6
- //#region src/server/domains/encoding/encoding-protobuf.ts
7
- function parseProtobufMessage(buffer, depth, maxDepth) {
8
- const fields = [];
9
- let offset = 0;
10
- let fieldIndex = 0;
11
- while (offset < buffer.length) {
12
- const keyInfo = tryParseVarint(buffer, offset);
13
- if (keyInfo.error) return {
14
- fields,
15
- bytesConsumed: offset,
16
- error: keyInfo.error
17
- };
18
- const keyValue = keyInfo.value;
19
- offset = keyInfo.offset;
20
- const fieldNumber = Number(keyValue >> 3n);
21
- const wireType = Number(keyValue & 7n);
22
- if (fieldNumber <= 0) return {
23
- fields,
24
- bytesConsumed: offset,
25
- error: `Invalid field number ${fieldNumber} at offset ${offset}`
26
- };
27
- if (wireType === 0) {
28
- const varintInfo = tryParseVarint(buffer, offset);
29
- if (varintInfo.error) return {
30
- fields,
31
- bytesConsumed: offset,
32
- error: varintInfo.error
33
- };
34
- offset = varintInfo.offset;
35
- fields.push({
36
- index: fieldIndex,
37
- fieldNumber,
38
- wireType,
39
- wireTypeName: protobufWireTypeName(wireType),
40
- value: bigIntToSafeValue(varintInfo.value)
41
- });
42
- } else if (wireType === 1) {
43
- if (offset + 8 > buffer.length) return {
44
- fields,
45
- bytesConsumed: offset,
46
- error: `Unexpected EOF for fixed64 at offset ${offset}`
47
- };
48
- const raw = buffer.subarray(offset, offset + 8);
49
- const fixed64 = raw.readBigUInt64LE(0);
50
- offset += 8;
51
- fields.push({
52
- index: fieldIndex,
53
- fieldNumber,
54
- wireType,
55
- wireTypeName: protobufWireTypeName(wireType),
56
- value: {
57
- uint64: bigIntToSafeValue(fixed64),
58
- hex: raw.toString("hex")
59
- }
60
- });
61
- } else if (wireType === 2) {
62
- const lengthInfo = tryParseVarint(buffer, offset);
63
- if (lengthInfo.error) return {
64
- fields,
65
- bytesConsumed: offset,
66
- error: lengthInfo.error
67
- };
68
- offset = lengthInfo.offset;
69
- const lengthBigInt = lengthInfo.value;
70
- if (lengthBigInt > BigInt(Number.MAX_SAFE_INTEGER)) return {
71
- fields,
72
- bytesConsumed: offset,
73
- error: `Length-delimited field is too large at offset ${offset}`
74
- };
75
- const length = Number(lengthBigInt);
76
- if (length < 0 || offset + length > buffer.length) return {
77
- fields,
78
- bytesConsumed: offset,
79
- error: `Invalid length-delimited field length=${length} at offset ${offset}`
80
- };
81
- const payload = buffer.subarray(offset, offset + length);
82
- offset += length;
83
- fields.push({
84
- index: fieldIndex,
85
- fieldNumber,
86
- wireType,
87
- wireTypeName: protobufWireTypeName(wireType),
88
- value: decodeLengthDelimited(payload, depth, maxDepth)
89
- });
90
- } else if (wireType === 5) {
91
- if (offset + 4 > buffer.length) return {
92
- fields,
93
- bytesConsumed: offset,
94
- error: `Unexpected EOF for fixed32 at offset ${offset}`
95
- };
96
- const raw = buffer.subarray(offset, offset + 4);
97
- const fixed32 = raw.readUInt32LE(0);
98
- offset += 4;
99
- fields.push({
100
- index: fieldIndex,
101
- fieldNumber,
102
- wireType,
103
- wireTypeName: protobufWireTypeName(wireType),
104
- value: {
105
- uint32: fixed32,
106
- hex: raw.toString("hex")
107
- }
108
- });
109
- } else return {
110
- fields,
111
- bytesConsumed: offset,
112
- error: `Unsupported wire type ${wireType} at offset ${offset}`
113
- };
114
- fieldIndex += 1;
115
- }
116
- return {
117
- fields,
118
- bytesConsumed: offset
119
- };
120
- }
121
- function decodeLengthDelimited(payload, depth, maxDepth) {
122
- if (payload.length === 0) return {
123
- kind: "empty",
124
- length: 0
125
- };
126
- if (depth < maxDepth) {
127
- const nested = parseProtobufMessage(payload, depth + 1, maxDepth);
128
- if (!nested.error && nested.bytesConsumed === payload.length && nested.fields.length > 0) return {
129
- kind: "message",
130
- fields: nested.fields
131
- };
132
- }
133
- const text = toSafeUtf8$1(payload);
134
- if (text !== null && isMostlyPrintableText(text)) return {
135
- kind: "string",
136
- value: text
137
- };
138
- return {
139
- kind: "bytes",
140
- length: payload.length,
141
- hex: payload.toString("hex"),
142
- base64: payload.toString("base64")
143
- };
144
- }
145
- function tryParseVarint(buffer, startOffset) {
146
- let result = 0n;
147
- let shift = 0n;
148
- let offset = startOffset;
149
- for (let index = 0; index < 10; index += 1) {
150
- const current = buffer[offset];
151
- if (current === void 0) return { error: `Unexpected EOF while parsing varint at offset ${offset}` };
152
- const byte = BigInt(current);
153
- result |= (byte & 127n) << shift;
154
- offset += 1;
155
- if ((byte & 128n) === 0n) return {
156
- value: result,
157
- offset
158
- };
159
- shift += 7n;
160
- }
161
- return { error: `Varint exceeds 10 bytes at offset ${startOffset}` };
162
- }
163
- function protobufWireTypeName(wireType) {
164
- if (wireType === 0) return "varint";
165
- if (wireType === 1) return "fixed64";
166
- if (wireType === 2) return "length-delimited";
167
- if (wireType === 5) return "fixed32";
168
- return "unknown";
169
- }
170
- function bigIntToSafeValue(value) {
171
- const max = BigInt(Number.MAX_SAFE_INTEGER);
172
- const min = BigInt(Number.MIN_SAFE_INTEGER);
173
- if (value <= max && value >= min) return Number(value);
174
- return value.toString();
175
- }
176
- function toSafeUtf8$1(buffer) {
177
- const text = buffer.toString("utf8");
178
- if ((text.match(/\uFFFD/g) ?? []).length > 0) return null;
179
- return text;
180
- }
181
- function isMostlyPrintableText(text) {
182
- if (text.length === 0) return true;
183
- let printable = 0;
184
- for (const ch of text) {
185
- const code = ch.charCodeAt(0);
186
- if (code >= 32 && code <= 126 || code === 9 || code === 10 || code === 13) printable += 1;
187
- }
188
- return printable / text.length >= .85;
189
- }
190
- //#endregion
191
- //#region src/server/domains/encoding/encoding-msgpack.ts
192
- function decodeMsgPack(buffer) {
193
- const decoded = decodeMsgPackValue(buffer, 0, 0);
194
- if (decoded.offset !== buffer.length) throw new Error(`MessagePack decode ended early: consumed ${decoded.offset} of ${buffer.length} bytes`);
195
- return decoded.value;
196
- }
197
- function decodeMsgPackValue(buffer, startOffset, depth) {
198
- if (depth > 64) throw new Error("MessagePack decode depth exceeds safety limit");
199
- const prefix = buffer[startOffset];
200
- if (prefix === void 0) throw new Error(`Unexpected EOF at offset ${startOffset}`);
201
- let offset = startOffset + 1;
202
- if (prefix <= 127) return {
203
- value: prefix,
204
- offset
205
- };
206
- if (prefix >= 224) return {
207
- value: prefix - 256,
208
- offset
209
- };
210
- if (prefix >= 160 && prefix <= 191) {
211
- const length = prefix & 31;
212
- ensureRange(buffer, offset, length);
213
- return {
214
- value: buffer.subarray(offset, offset + length).toString("utf8"),
215
- offset: offset + length
216
- };
217
- }
218
- if (prefix >= 144 && prefix <= 159) {
219
- const length = prefix & 15;
220
- return decodeMsgPackArray(buffer, offset, length, depth + 1);
221
- }
222
- if (prefix >= 128 && prefix <= 143) {
223
- const length = prefix & 15;
224
- return decodeMsgPackMap(buffer, offset, length, depth + 1);
225
- }
226
- if (prefix === 192) return {
227
- value: null,
228
- offset
229
- };
230
- if (prefix === 194) return {
231
- value: false,
232
- offset
233
- };
234
- if (prefix === 195) return {
235
- value: true,
236
- offset
237
- };
238
- if (prefix === 204) {
239
- ensureRange(buffer, offset, 1);
240
- return {
241
- value: buffer.readUInt8(offset),
242
- offset: offset + 1
243
- };
244
- }
245
- if (prefix === 205) {
246
- ensureRange(buffer, offset, 2);
247
- return {
248
- value: buffer.readUInt16BE(offset),
249
- offset: offset + 2
250
- };
251
- }
252
- if (prefix === 206) {
253
- ensureRange(buffer, offset, 4);
254
- return {
255
- value: buffer.readUInt32BE(offset),
256
- offset: offset + 4
257
- };
258
- }
259
- if (prefix === 207) {
260
- ensureRange(buffer, offset, 8);
261
- return {
262
- value: bigIntToSafeValue(buffer.readBigUInt64BE(offset)),
263
- offset: offset + 8
264
- };
265
- }
266
- if (prefix === 208) {
267
- ensureRange(buffer, offset, 1);
268
- return {
269
- value: buffer.readInt8(offset),
270
- offset: offset + 1
271
- };
272
- }
273
- if (prefix === 209) {
274
- ensureRange(buffer, offset, 2);
275
- return {
276
- value: buffer.readInt16BE(offset),
277
- offset: offset + 2
278
- };
279
- }
280
- if (prefix === 210) {
281
- ensureRange(buffer, offset, 4);
282
- return {
283
- value: buffer.readInt32BE(offset),
284
- offset: offset + 4
285
- };
286
- }
287
- if (prefix === 211) {
288
- ensureRange(buffer, offset, 8);
289
- return {
290
- value: bigIntToSafeValue(buffer.readBigInt64BE(offset)),
291
- offset: offset + 8
292
- };
293
- }
294
- if (prefix === 202) {
295
- ensureRange(buffer, offset, 4);
296
- return {
297
- value: buffer.readFloatBE(offset),
298
- offset: offset + 4
299
- };
300
- }
301
- if (prefix === 203) {
302
- ensureRange(buffer, offset, 8);
303
- return {
304
- value: buffer.readDoubleBE(offset),
305
- offset: offset + 8
306
- };
307
- }
308
- if (prefix === 217) {
309
- ensureRange(buffer, offset, 1);
310
- const length = buffer.readUInt8(offset);
311
- offset += 1;
312
- ensureRange(buffer, offset, length);
313
- return {
314
- value: buffer.subarray(offset, offset + length).toString("utf8"),
315
- offset: offset + length
316
- };
317
- }
318
- if (prefix === 218) {
319
- ensureRange(buffer, offset, 2);
320
- const length = buffer.readUInt16BE(offset);
321
- offset += 2;
322
- ensureRange(buffer, offset, length);
323
- return {
324
- value: buffer.subarray(offset, offset + length).toString("utf8"),
325
- offset: offset + length
326
- };
327
- }
328
- if (prefix === 219) {
329
- ensureRange(buffer, offset, 4);
330
- const length = buffer.readUInt32BE(offset);
331
- offset += 4;
332
- ensureRange(buffer, offset, length);
333
- return {
334
- value: buffer.subarray(offset, offset + length).toString("utf8"),
335
- offset: offset + length
336
- };
337
- }
338
- if (prefix === 196) {
339
- ensureRange(buffer, offset, 1);
340
- const length = buffer.readUInt8(offset);
341
- offset += 1;
342
- ensureRange(buffer, offset, length);
343
- const payload = buffer.subarray(offset, offset + length);
344
- return {
345
- value: {
346
- type: "bytes",
347
- base64: payload.toString("base64"),
348
- hex: payload.toString("hex")
349
- },
350
- offset: offset + length
351
- };
352
- }
353
- if (prefix === 197) {
354
- ensureRange(buffer, offset, 2);
355
- const length = buffer.readUInt16BE(offset);
356
- offset += 2;
357
- ensureRange(buffer, offset, length);
358
- const payload = buffer.subarray(offset, offset + length);
359
- return {
360
- value: {
361
- type: "bytes",
362
- base64: payload.toString("base64"),
363
- hex: payload.toString("hex")
364
- },
365
- offset: offset + length
366
- };
367
- }
368
- if (prefix === 198) {
369
- ensureRange(buffer, offset, 4);
370
- const length = buffer.readUInt32BE(offset);
371
- offset += 4;
372
- ensureRange(buffer, offset, length);
373
- const payload = buffer.subarray(offset, offset + length);
374
- return {
375
- value: {
376
- type: "bytes",
377
- base64: payload.toString("base64"),
378
- hex: payload.toString("hex")
379
- },
380
- offset: offset + length
381
- };
382
- }
383
- if (prefix === 220) {
384
- ensureRange(buffer, offset, 2);
385
- const length = buffer.readUInt16BE(offset);
386
- offset += 2;
387
- return decodeMsgPackArray(buffer, offset, length, depth + 1);
388
- }
389
- if (prefix === 221) {
390
- ensureRange(buffer, offset, 4);
391
- const length = buffer.readUInt32BE(offset);
392
- offset += 4;
393
- return decodeMsgPackArray(buffer, offset, length, depth + 1);
394
- }
395
- if (prefix === 222) {
396
- ensureRange(buffer, offset, 2);
397
- const length = buffer.readUInt16BE(offset);
398
- offset += 2;
399
- return decodeMsgPackMap(buffer, offset, length, depth + 1);
400
- }
401
- if (prefix === 223) {
402
- ensureRange(buffer, offset, 4);
403
- const length = buffer.readUInt32BE(offset);
404
- offset += 4;
405
- return decodeMsgPackMap(buffer, offset, length, depth + 1);
406
- }
407
- if (prefix >= 212 && prefix <= 216) {
408
- const size = {
409
- 212: 1,
410
- 213: 2,
411
- 214: 4,
412
- 215: 8,
413
- 216: 16
414
- }[prefix];
415
- ensureRange(buffer, offset, 1 + size);
416
- const extType = buffer.readInt8(offset);
417
- const payload = buffer.subarray(offset + 1, offset + 1 + size);
418
- return {
419
- value: {
420
- type: "ext",
421
- extType,
422
- base64: payload.toString("base64"),
423
- hex: payload.toString("hex")
424
- },
425
- offset: offset + 1 + size
426
- };
427
- }
428
- if (prefix === 199 || prefix === 200 || prefix === 201) {
429
- const lengthBytes = prefix === 199 ? 1 : prefix === 200 ? 2 : 4;
430
- ensureRange(buffer, offset, lengthBytes);
431
- const length = lengthBytes === 1 ? buffer.readUInt8(offset) : lengthBytes === 2 ? buffer.readUInt16BE(offset) : buffer.readUInt32BE(offset);
432
- offset += lengthBytes;
433
- ensureRange(buffer, offset, 1 + length);
434
- const extType = buffer.readInt8(offset);
435
- const payload = buffer.subarray(offset + 1, offset + 1 + length);
436
- return {
437
- value: {
438
- type: "ext",
439
- extType,
440
- base64: payload.toString("base64"),
441
- hex: payload.toString("hex")
442
- },
443
- offset: offset + 1 + length
444
- };
445
- }
446
- throw new Error(`Unsupported MessagePack prefix 0x${prefix.toString(16)} at offset ${startOffset}`);
447
- }
448
- function decodeMsgPackArray(buffer, startOffset, length, depth) {
449
- let offset = startOffset;
450
- const values = [];
451
- for (let index = 0; index < length; index += 1) {
452
- const decoded = decodeMsgPackValue(buffer, offset, depth);
453
- values.push(decoded.value);
454
- offset = decoded.offset;
455
- }
456
- return {
457
- value: values,
458
- offset
459
- };
460
- }
461
- function decodeMsgPackMap(buffer, startOffset, length, depth) {
462
- let offset = startOffset;
463
- const mapValue = {};
464
- for (let index = 0; index < length; index += 1) {
465
- const keyDecoded = decodeMsgPackValue(buffer, offset, depth);
466
- offset = keyDecoded.offset;
467
- const valueDecoded = decodeMsgPackValue(buffer, offset, depth);
468
- offset = valueDecoded.offset;
469
- const key = msgPackMapKey(keyDecoded.value);
470
- mapValue[key] = valueDecoded.value;
471
- }
472
- return {
473
- value: mapValue,
474
- offset
475
- };
476
- }
477
- function msgPackMapKey(value) {
478
- if (typeof value === "string") return value;
479
- if (typeof value === "number") return String(value);
480
- if (typeof value === "boolean") return String(value);
481
- if (typeof value === "bigint") return value.toString();
482
- if (value === null) return "null";
483
- try {
484
- return JSON.stringify(value);
485
- } catch {
486
- return String(value);
487
- }
488
- }
489
- function ensureRange(buffer, offset, length) {
490
- if (offset < 0 || length < 0 || offset + length > buffer.length) throw new Error(`Unexpected EOF while reading ${length} bytes at offset ${offset}`);
491
- }
492
- //#endregion
493
- //#region src/server/domains/encoding/handlers/shared.ts
494
- /**
495
- * Encoding domain shared types, constants, and utility functions.
496
- * Extracted from EncodingHandlersBase.
497
- */
498
- const MAGIC_SIGNATURES = [
499
- {
500
- format: "png",
501
- bytes: [
502
- 137,
503
- 80,
504
- 78,
505
- 71
506
- ]
507
- },
508
- {
509
- format: "jpeg",
510
- bytes: [
511
- 255,
512
- 216,
513
- 255
514
- ]
515
- },
516
- {
517
- format: "gif",
518
- bytes: [
519
- 71,
520
- 73,
521
- 70
522
- ]
523
- },
524
- {
525
- format: "wasm",
526
- bytes: [
527
- 0,
528
- 97,
529
- 115,
530
- 109
531
- ]
532
- },
533
- {
534
- format: "zip/apk",
535
- bytes: [
536
- 80,
537
- 75,
538
- 3,
539
- 4
540
- ]
541
- },
542
- {
543
- format: "pdf",
544
- bytes: [
545
- 37,
546
- 80,
547
- 68,
548
- 70
549
- ]
550
- }
551
- ];
552
- const DETECT_SOURCE_SET = new Set([
553
- "base64",
554
- "hex",
555
- "file",
556
- "raw"
557
- ]);
558
- const ENTROPY_SOURCE_SET = new Set([
559
- "base64",
560
- "hex",
561
- "raw",
562
- "file"
563
- ]);
564
- const DECODE_ENCODING_SET = new Set([
565
- "base64",
566
- "hex",
567
- "url",
568
- "protobuf",
569
- "msgpack"
570
- ]);
571
- const OUTPUT_FORMAT_SET = new Set([
572
- "hex",
573
- "utf8",
574
- "json"
575
- ]);
576
- const INPUT_FORMAT_SET = new Set([
577
- "utf8",
578
- "hex",
579
- "json"
580
- ]);
581
- const OUTPUT_ENCODING_SET = new Set([
582
- "base64",
583
- "hex",
584
- "url"
585
- ]);
586
- function ok(payload) {
587
- return { content: [{
588
- type: "text",
589
- text: JSON.stringify(payload, null, 2)
590
- }] };
591
- }
592
- function fail(tool, error) {
593
- return ok({
594
- success: false,
595
- tool,
596
- error: error instanceof Error ? error.message : String(error)
597
- });
598
- }
599
- function decodeHexString(value) {
600
- const cleaned = value.trim().replace(/^0x/i, "").replace(/[\s:,-]/g, "");
601
- if (cleaned.length === 0) return Buffer.alloc(0);
602
- if (cleaned.length % 2 !== 0 || !/^[0-9a-fA-F]+$/.test(cleaned)) throw new Error("Invalid hex string");
603
- return Buffer.from(cleaned, "hex");
604
- }
605
- function decodeBase64String(value) {
606
- const cleaned = value.trim().replace(/\s+/g, "");
607
- if (cleaned.length === 0) return Buffer.alloc(0);
608
- if (!looksLikeBase64(cleaned)) throw new Error("Invalid base64 string");
609
- return Buffer.from(cleaned, "base64");
610
- }
611
- function decodeBinaryAuto(value) {
612
- const trimmed = value.trim();
613
- if (trimmed.length === 0) return Buffer.alloc(0);
614
- if (looksLikeHex(trimmed)) return decodeHexString(trimmed);
615
- if (looksLikeBase64(trimmed)) return decodeBase64String(trimmed);
616
- return Buffer.from(trimmed, "utf8");
617
- }
618
- function looksLikeHex(value) {
619
- const cleaned = value.trim().replace(/^0x/i, "").replace(/[\s:,-]/g, "");
620
- return cleaned.length > 0 && cleaned.length % 2 === 0 && /^[0-9a-fA-F]+$/.test(cleaned);
621
- }
622
- function looksLikeBase64(value) {
623
- const cleaned = value.trim().replace(/\s+/g, "");
624
- if (cleaned.length === 0 || cleaned.length % 4 !== 0) return false;
625
- if (!/^[A-Za-z0-9+/]*={0,2}$/.test(cleaned)) return false;
626
- try {
627
- const decoded = Buffer.from(cleaned, "base64");
628
- return cleaned.replace(/=+$/, "") === decoded.toString("base64").replace(/=+$/, "");
629
- } catch {
630
- return false;
631
- }
632
- }
633
- function looksLikeUrlEncoded(value) {
634
- return /%[0-9a-fA-F]{2}/.test(value) || /\+/.test(value);
635
- }
636
- function decodeUrl(value) {
637
- return decodeURIComponent(value.replace(/\+/g, "%20"));
638
- }
639
- function encodeUrlBytes(buffer) {
640
- let encoded = "";
641
- for (const value of buffer.values()) encoded += value >= 48 && value <= 57 || value >= 65 && value <= 90 || value >= 97 && value <= 122 || value === 45 || value === 46 || value === 95 || value === 126 ? String.fromCharCode(value) : `%${value.toString(16).toUpperCase().padStart(2, "0")}`;
642
- return encoded;
643
- }
644
- function toSafeUtf8(buffer) {
645
- const text = buffer.toString("utf8");
646
- if ((text.match(/\uFFFD/g) ?? []).length > 0) return null;
647
- return text;
648
- }
649
- function tryParseJson(text) {
650
- try {
651
- return JSON.parse(text);
652
- } catch {
653
- return null;
654
- }
655
- }
656
- function previewHex(buffer, maxBytes) {
657
- return Array.from(buffer.subarray(0, maxBytes).values()).map((v) => v.toString(16).padStart(2, "0")).join(" ");
658
- }
659
- function hexDump(buffer, bytesPerRow = 16) {
660
- const lines = [];
661
- for (let offset = 0; offset < buffer.length; offset += bytesPerRow) {
662
- const row = buffer.subarray(offset, offset + bytesPerRow);
663
- const hex = Array.from(row.values()).map((v) => v.toString(16).padStart(2, "0")).join(" ");
664
- const ascii = Array.from(row.values()).map((v) => v >= 32 && v <= 126 ? String.fromCharCode(v) : ".").join("");
665
- lines.push(`${offset.toString(16).padStart(8, "0")} ${hex.padEnd(47)} |${ascii}|`);
666
- }
667
- return lines.join("\n");
668
- }
669
- function renderDecodedOutput(params) {
670
- const { encoding, outputFormat, buffer, jsonValue } = params;
671
- if (outputFormat === "hex") return ok({
672
- success: true,
673
- encoding,
674
- outputFormat,
675
- byteLength: buffer.length,
676
- result: buffer.toString("hex"),
677
- hexDump: hexDump(buffer)
678
- });
679
- if (outputFormat === "utf8") return ok({
680
- success: true,
681
- encoding,
682
- outputFormat,
683
- byteLength: buffer.length,
684
- result: buffer.toString("utf8")
685
- });
686
- const utf8 = toSafeUtf8(buffer);
687
- const maybeJson = utf8 === null ? null : tryParseJson(utf8);
688
- return ok({
689
- success: true,
690
- encoding,
691
- outputFormat,
692
- byteLength: buffer.length,
693
- result: jsonValue ?? {
694
- parsedJson: maybeJson,
695
- utf8,
696
- hex: buffer.toString("hex")
697
- }
698
- });
699
- }
700
- async function resolveBufferBySource(options) {
701
- const { source, data, filePath, maxBytes } = options;
702
- if (source === "file") {
703
- if (!filePath) throw new Error("filePath is required when source=file");
704
- const real = await realpath(resolve(filePath));
705
- if (!(await Promise.all([
706
- tmpdir(),
707
- homedir(),
708
- process.cwd()
709
- ].map(async (p) => {
710
- const absolute = isAbsolute(p) ? p : resolve(p);
711
- try {
712
- return await realpath(absolute);
713
- } catch {
714
- return absolute;
715
- }
716
- }))).some((root) => real.startsWith(root))) throw new Error(`File access denied: path "${filePath}" is outside allowed directories`);
717
- const fileBuffer = await readFile(real);
718
- return typeof maxBytes === "number" ? fileBuffer.subarray(0, maxBytes) : fileBuffer;
719
- }
720
- if (source === "base64") {
721
- if (!data) throw new Error("data is required for base64 source");
722
- return decodeBase64String(data);
723
- }
724
- if (source === "hex") {
725
- if (!data) throw new Error("data is required for hex source");
726
- return decodeHexString(data);
727
- }
728
- return Buffer.from(data ?? "", "utf8");
729
- }
730
- async function resolveRequestBodyFromActivePage(collector, requestId) {
731
- try {
732
- const result = await (await collector.getActivePage()).evaluate((targetRequestId) => {
733
- const pickBody = (entry) => {
734
- if (!entry || typeof entry !== "object") return null;
735
- const record = entry;
736
- if (record.requestId !== targetRequestId) return null;
737
- if (typeof record.responseBody === "string") return {
738
- body: record.responseBody,
739
- base64Encoded: Boolean(record.base64Encoded)
740
- };
741
- if (typeof record.body === "string") return {
742
- body: record.body,
743
- base64Encoded: Boolean(record.base64Encoded)
744
- };
745
- const response = record.response;
746
- if (response && typeof response === "object") {
747
- const rr = response;
748
- if (typeof rr.body === "string") return {
749
- body: rr.body,
750
- base64Encoded: Boolean(rr.base64Encoded)
751
- };
752
- }
753
- return null;
754
- };
755
- const searchArray = (payload) => {
756
- if (!Array.isArray(payload)) return null;
757
- for (const item of payload) {
758
- const found = pickBody(item);
759
- if (found) return found;
760
- }
761
- return null;
762
- };
763
- const fromMemory = searchArray(window.__capturedAPIs);
764
- if (fromMemory) return fromMemory;
765
- try {
766
- const raw = window.localStorage.getItem("__capturedAPIs");
767
- if (!raw) return null;
768
- return searchArray(JSON.parse(raw));
769
- } catch {
770
- return null;
771
- }
772
- }, requestId);
773
- if (!result || typeof result !== "object") return null;
774
- const payload = result;
775
- if (typeof payload.body !== "string") return null;
776
- if (payload.base64Encoded) return Buffer.from(payload.body, "base64");
777
- const maybeBase64 = payload.body.trim();
778
- if (looksLikeBase64(maybeBase64)) return Buffer.from(maybeBase64, "base64");
779
- return Buffer.from(payload.body, "utf8");
780
- } catch {
781
- return null;
782
- }
783
- }
784
- function detectMagicFormats(buffer) {
785
- const matches = [];
786
- for (const signature of MAGIC_SIGNATURES) {
787
- if (buffer.length < signature.bytes.length) continue;
788
- let matched = true;
789
- for (let i = 0; i < signature.bytes.length; i += 1) if (buffer[i] !== signature.bytes[i]) {
790
- matched = false;
791
- break;
792
- }
793
- if (matched) matches.push(signature.format);
794
- }
795
- return matches;
796
- }
797
- function detectStructuredFormats(buffer) {
798
- const firstByte = buffer[0];
799
- if (firstByte === void 0) return [];
800
- const formats = /* @__PURE__ */ new Set();
801
- if ([
802
- 8,
803
- 16,
804
- 24,
805
- 32
806
- ].includes(firstByte)) formats.add("protobuf");
807
- if (firstByte >= 128 && firstByte <= 143 || firstByte >= 144 && firstByte <= 159 || firstByte >= 160 && firstByte <= 191) formats.add("messagepack");
808
- if (firstByte >= 160 && firstByte <= 191 || firstByte >= 128 && firstByte <= 159) formats.add("cbor");
809
- return Array.from(formats);
810
- }
811
- function detectEncodingSignals(source, data, buffer) {
812
- const encodings = /* @__PURE__ */ new Set();
813
- if (source === "base64" || data && looksLikeBase64(data.trim())) encodings.add("base64");
814
- if (source === "hex" || data && looksLikeHex(data)) encodings.add("hex");
815
- if (data && looksLikeUrlEncoded(data)) encodings.add("url-encoded");
816
- if (buffer.length >= 3) {
817
- const [a, b, c] = buffer;
818
- if (a === 239 && b === 187 && c === 191) encodings.add("utf8-bom");
819
- }
820
- return Array.from(encodings);
821
- }
822
- function calculateShannonEntropy(buffer) {
823
- if (buffer.length === 0) return 0;
824
- const freq = Array.from({ length: 256 }, () => 0);
825
- for (const value of buffer.values()) freq[value] += 1;
826
- let entropy = 0;
827
- for (const count of freq) {
828
- if (count === 0) continue;
829
- const p = count / buffer.length;
830
- entropy -= p * Math.log2(p);
831
- }
832
- return Number(entropy.toFixed(6));
833
- }
834
- function calculateByteFrequency(buffer) {
835
- if (buffer.length === 0) return [];
836
- const freq = Array.from({ length: 256 }, () => 0);
837
- for (const value of buffer.values()) freq[value] += 1;
838
- const entries = [];
839
- for (let v = 0; v < 256; v += 1) {
840
- const count = freq[v];
841
- if (count === 0) continue;
842
- entries.push({
843
- byte: `0x${v.toString(16).padStart(2, "0")}`,
844
- count,
845
- ratio: Number((count / buffer.length).toFixed(6))
846
- });
847
- }
848
- entries.sort((a, b) => b.count - a.count);
849
- return entries;
850
- }
851
- function calculateBlockEntropies(buffer, blockSize) {
852
- if (buffer.length === 0) return [];
853
- const blocks = [];
854
- let index = 0;
855
- for (let start = 0; start < buffer.length; start += blockSize) {
856
- const end = Math.min(start + blockSize, buffer.length);
857
- blocks.push({
858
- index,
859
- start,
860
- end,
861
- entropy: calculateShannonEntropy(buffer.subarray(start, end))
862
- });
863
- index += 1;
864
- }
865
- return blocks;
866
- }
867
- function assessEntropy(entropy, buffer) {
868
- const ratio = printableRatio(buffer);
869
- if (entropy < 3.8 && ratio > .85) return "plaintext";
870
- if (entropy < 5.8) return "encoded";
871
- if (entropy < 7.2) return "compressed";
872
- if (entropy < 7.8) return "encrypted";
873
- return "random";
874
- }
875
- function printableRatio(buffer) {
876
- if (buffer.length === 0) return 1;
877
- let printable = 0;
878
- for (const value of buffer.values()) if (value >= 32 && value <= 126 || value === 9 || value === 10 || value === 13) printable += 1;
879
- return printable / buffer.length;
880
- }
881
- //#endregion
882
- //#region src/server/domains/encoding/handlers.impl.core.runtime.ts
883
- var EncodingToolHandlers = class {
884
- collector;
885
- constructor(collector) {
886
- this.collector = collector;
887
- }
888
- async handleBinaryDetectFormat(args) {
889
- try {
890
- const source = argEnum(args, "source", DETECT_SOURCE_SET, "raw");
891
- const data = argString(args, "data");
892
- const filePath = argString(args, "filePath");
893
- const requestId = argString(args, "requestId");
894
- let buffer = null;
895
- let requestBodyUsed = false;
896
- if (source === "raw" && requestId) {
897
- buffer = await resolveRequestBodyFromActivePage(this.collector, requestId);
898
- requestBodyUsed = buffer !== null;
899
- }
900
- if (!buffer) {
901
- if (source !== "file" && !data) throw new Error("data is required for non-file source when requestId payload is unavailable");
902
- buffer = await resolveBufferBySource({
903
- source,
904
- data,
905
- filePath,
906
- maxBytes: source === "file" ? 512 : void 0
907
- });
908
- }
909
- const entropy = calculateShannonEntropy(buffer);
910
- return ok({
911
- success: true,
912
- source,
913
- requestId: requestId ?? null,
914
- requestBodyUsed,
915
- byteLength: buffer.length,
916
- previewHex: previewHex(buffer, 64),
917
- magicFormats: detectMagicFormats(buffer),
918
- structuredFormats: detectStructuredFormats(buffer),
919
- encodingSignals: detectEncodingSignals(source, data, buffer),
920
- entropy,
921
- assessment: assessEntropy(entropy, buffer),
922
- topBytes: calculateByteFrequency(buffer).slice(0, 8)
923
- });
924
- } catch (error) {
925
- return fail("binary_detect_format", error);
926
- }
927
- }
928
- async handleBinaryDecode(args) {
929
- try {
930
- const data = argString(args, "data", "");
931
- const encoding = argEnum(args, "encoding", DECODE_ENCODING_SET);
932
- const outputFormat = argEnum(args, "outputFormat", OUTPUT_FORMAT_SET, "hex");
933
- if (!data) throw new Error("data is required");
934
- if (!encoding) throw new Error("encoding is required");
935
- if (encoding === "url") {
936
- const decoded = decodeUrl(data);
937
- if (outputFormat === "hex") {
938
- const raw = Buffer.from(decoded, "utf8");
939
- return ok({
940
- success: true,
941
- encoding,
942
- outputFormat,
943
- byteLength: raw.length,
944
- result: raw.toString("hex"),
945
- hexDump: hexDump(raw)
946
- });
947
- }
948
- if (outputFormat === "utf8") return ok({
949
- success: true,
950
- encoding,
951
- outputFormat,
952
- result: decoded
953
- });
954
- return ok({
955
- success: true,
956
- encoding,
957
- outputFormat,
958
- result: tryParseJson(decoded) ?? { text: decoded }
959
- });
960
- }
961
- const rawBuffer = encoding === "base64" ? decodeBase64String(data) : encoding === "hex" ? decodeHexString(data) : decodeBinaryAuto(data);
962
- if (encoding === "protobuf") {
963
- const parsed = parseProtobufMessage(rawBuffer, 0, 5);
964
- return renderDecodedOutput({
965
- encoding,
966
- outputFormat,
967
- buffer: rawBuffer,
968
- jsonValue: {
969
- fields: parsed.fields,
970
- bytesConsumed: parsed.bytesConsumed,
971
- error: parsed.error ?? null
972
- }
973
- });
974
- }
975
- if (encoding === "msgpack") return renderDecodedOutput({
976
- encoding,
977
- outputFormat,
978
- buffer: rawBuffer,
979
- jsonValue: decodeMsgPack(rawBuffer)
980
- });
981
- return renderDecodedOutput({
982
- encoding,
983
- outputFormat,
984
- buffer: rawBuffer
985
- });
986
- } catch (error) {
987
- return fail("binary_decode", error);
988
- }
989
- }
990
- async handleBinaryEncode(args) {
991
- try {
992
- const data = argString(args, "data", "");
993
- const inputFormat = argEnum(args, "inputFormat", INPUT_FORMAT_SET, "utf8");
994
- const outputEncoding = argEnum(args, "outputEncoding", OUTPUT_ENCODING_SET, "base64");
995
- if (!data) throw new Error("data is required");
996
- let buffer;
997
- if (inputFormat === "utf8") buffer = Buffer.from(data, "utf8");
998
- else if (inputFormat === "hex") buffer = decodeHexString(data);
999
- else {
1000
- const parsed = JSON.parse(data);
1001
- buffer = Buffer.from(JSON.stringify(parsed), "utf8");
1002
- }
1003
- const output = outputEncoding === "base64" ? buffer.toString("base64") : outputEncoding === "hex" ? buffer.toString("hex") : encodeUrlBytes(buffer);
1004
- return ok({
1005
- success: true,
1006
- inputFormat,
1007
- outputEncoding,
1008
- byteLength: buffer.length,
1009
- output
1010
- });
1011
- } catch (error) {
1012
- return fail("binary_encode", error);
1013
- }
1014
- }
1015
- async handleBinaryEntropyAnalysis(args) {
1016
- try {
1017
- const source = argEnum(args, "source", ENTROPY_SOURCE_SET, "raw");
1018
- const data = argString(args, "data");
1019
- const filePath = argString(args, "filePath");
1020
- if (source !== "file" && !data) throw new Error("data is required for non-file source");
1021
- const blockSizeRaw = argNumber(args, "blockSize", 256);
1022
- const blockSize = Math.max(16, Math.min(8192, Math.trunc(blockSizeRaw || 256)));
1023
- const buffer = await resolveBufferBySource({
1024
- source,
1025
- data,
1026
- filePath
1027
- });
1028
- const overallEntropy = calculateShannonEntropy(buffer);
1029
- return ok({
1030
- success: true,
1031
- source,
1032
- byteLength: buffer.length,
1033
- blockSize,
1034
- overallEntropy,
1035
- blockEntropies: calculateBlockEntropies(buffer, blockSize),
1036
- byteFrequency: calculateByteFrequency(buffer).slice(0, 20),
1037
- assessment: assessEntropy(overallEntropy, buffer)
1038
- });
1039
- } catch (error) {
1040
- return fail("binary_entropy_analysis", error);
1041
- }
1042
- }
1043
- async handleProtobufDecodeRaw(args) {
1044
- try {
1045
- const data = argString(args, "data", "");
1046
- if (!data) throw new Error("data is required");
1047
- const maxDepthRaw = argNumber(args, "maxDepth", 5);
1048
- const maxDepth = Math.max(1, Math.min(20, Math.trunc(maxDepthRaw || 5)));
1049
- const buffer = decodeBase64String(data);
1050
- const parsed = parseProtobufMessage(buffer, 0, maxDepth);
1051
- return ok({
1052
- success: parsed.error === void 0,
1053
- byteLength: buffer.length,
1054
- maxDepth,
1055
- parsedBytes: parsed.bytesConsumed,
1056
- fields: parsed.fields,
1057
- error: parsed.error ?? null
1058
- });
1059
- } catch (error) {
1060
- return fail("protobuf_decode_raw", error);
1061
- }
1062
- }
1063
- };
1064
- //#endregion
1065
- export { EncodingToolHandlers };