termdock 1.4.333 → 1.4.335

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 (348) hide show
  1. package/dist/client/assets/App-B1lqBSPB.js +187 -0
  2. package/dist/client/assets/App-B1lqBSPB.js.br +0 -0
  3. package/dist/client/assets/App-B1lqBSPB.js.gz +0 -0
  4. package/dist/client/assets/{ArchitecturePanel-wUD5cnJt.js → ArchitecturePanel-BOq2FG6t.js} +2 -2
  5. package/dist/client/assets/ArchitecturePanel-BOq2FG6t.js.br +0 -0
  6. package/dist/client/assets/ArchitecturePanel-BOq2FG6t.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-hcQbjKYa.js → ChangeWalkthroughPanel-CxqwQxYc.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-CxqwQxYc.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-CxqwQxYc.js.gz +0 -0
  10. package/dist/client/assets/{CollaborationMainWorkspace-B8gzInFt.js → CollaborationMainWorkspace-vvAVjIlQ.js} +1 -1
  11. package/dist/client/assets/CollaborationMainWorkspace-vvAVjIlQ.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-vvAVjIlQ.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-Bx6Z5gEL.js +2 -0
  14. package/dist/client/assets/{ComputerControlView-CdRq0If3.js → ComputerControlView-mR6vlp9k.js} +3 -3
  15. package/dist/client/assets/ComputerControlView-mR6vlp9k.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-mR6vlp9k.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-BP-NzeBu.js → DagPlayground-nUK9xIql.js} +1 -1
  18. package/dist/client/assets/DagPlayground-nUK9xIql.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-nUK9xIql.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-DOj35cPP.js → DiffLab-D6XhZtPW.js} +1 -1
  21. package/dist/client/assets/DiffLab-D6XhZtPW.js.br +0 -0
  22. package/dist/client/assets/DiffLab-D6XhZtPW.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-DFn5-T6o.js → DiffReview-BhyYqkD4.js} +1 -1
  24. package/dist/client/assets/DiffReview-BhyYqkD4.js.br +0 -0
  25. package/dist/client/assets/DiffReview-BhyYqkD4.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-DM5r4-If.js → DiffReviewLab-CvNWVrbl.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-CvNWVrbl.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-CvNWVrbl.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-DAE-aJq4.js → DiffViewer-BSbMa2mq.js} +1 -1
  30. package/dist/client/assets/DiffViewer-BSbMa2mq.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-BSbMa2mq.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-BxjQcgfQ.js → ModelPreview-B_VPlNYr.js} +1 -1
  33. package/dist/client/assets/ModelPreview-B_VPlNYr.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-B_VPlNYr.js.gz +0 -0
  35. package/dist/client/assets/{RightSidebar-DrOY_DSi.js → RightSidebar-Cakd9qUZ.js} +3 -3
  36. package/dist/client/assets/RightSidebar-Cakd9qUZ.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-Cakd9qUZ.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-OYrfBvYL.js → abnfDiagram-VCTEODGH-vWK7F-r_.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-vWK7F-r_.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-vWK7F-r_.js.gz +0 -0
  41. package/dist/client/assets/{app-2X5OnaRb.js → app-BZBIr89q.js} +3 -3
  42. package/dist/client/assets/app-BZBIr89q.js.br +0 -0
  43. package/dist/client/assets/app-BZBIr89q.js.gz +0 -0
  44. package/dist/client/assets/{arc-DTVord8M.js → arc-Bdjvby9b.js} +1 -1
  45. package/dist/client/assets/arc-Bdjvby9b.js.br +0 -0
  46. package/dist/client/assets/arc-Bdjvby9b.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DSEPJGQ_.js → architectureDiagram-5GKGNRK7-DTR5hJkG.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-DTR5hJkG.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-DTR5hJkG.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-BnDge6px.js → blockDiagram-I7D4REHJ-DPz3axsu.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-DPz3axsu.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-DPz3axsu.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-B8Q6-muZ.js → c4Diagram-7LVT6UL2-d5ZwPpcN.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-d5ZwPpcN.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-d5ZwPpcN.js.gz +0 -0
  56. package/dist/client/assets/channel-M_h_h55d.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-C4gPD79b.js → chunk-2Q5K7J3B-BpEmNpto.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-PDRbV2hO.js → chunk-5VM5RSS4-CXDCiEbN.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-DLipKTyV.js → chunk-F27PBJKO-C1L__gXc.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-C1L__gXc.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-C1L__gXc.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-Dn-yzcXt.js → chunk-IMKFNOWR-CX0r7pV5.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-CX0r7pV5.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-CX0r7pV5.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-Bt30SUG-.js → chunk-JWPE2WC7-DkbhnrKh.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-BjpzdmCq.js → chunk-POPQ4Y6H-CH-o5PVe.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-B3qpCqB4.js → chunk-SVP7TREG-C1x5c5cy.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-C1x5c5cy.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-C1x5c5cy.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-BpzSwag_.js → chunk-TICWLB2K-DAktkamN.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-DAktkamN.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-DAktkamN.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-BSUGdUwL.js → chunk-XXDRQBXY-emNetBN1.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-BVuw_2Ox.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BVuw_2Ox.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-C_hy0D3k.js → cose-bilkent-JH36ORCC-kBGroiho.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-kBGroiho.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-kBGroiho.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-DU_hzOOe.js → cynefin-OW5HDTMX-C0TjwB46.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-C0TjwB46.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-C0TjwB46.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-C9Y7eJR6.js → cynefinDiagram-5FMLGOSQ-CbLSUTuV.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CbLSUTuV.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CbLSUTuV.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-BCy-qZNp.js → dagre-GXQ25YYZ-BoznXKfa.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-BoznXKfa.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-BoznXKfa.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-Du6DHzLe.js → diagram-S7CK7UJ4-iY9ia7F5.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-iY9ia7F5.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-iY9ia7F5.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-BMdHl6um.js → diagram-UQ7AKVKN-DhnC8gBw.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-DhnC8gBw.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-DhnC8gBw.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-Cc-eKLTX.js → diagram-VSXAHHWV-JFg8cbqX.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-JFg8cbqX.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-JFg8cbqX.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-C2ltaAMA.js → diagram-VX7I27RA-dvyXUTpo.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-dvyXUTpo.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-dvyXUTpo.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-D6L3L6ZA.js → diagram-Z3DM3KII-DmjwsCUU.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-DmjwsCUU.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-DmjwsCUU.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-PMurylbI.js → ebnfDiagram-PWID7BFC-BxCdDL0c.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-BxCdDL0c.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-BxCdDL0c.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-BfRM9RA9.js → erDiagram-RLTQ6QDP-BWvvnoz1.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-BWvvnoz1.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-BWvvnoz1.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-Cayn9_Mi.js → flowDiagram-HODETNUW-CVU0l_6c.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-CVU0l_6c.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-CVU0l_6c.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-C1Zan8V1.js → ganttDiagram-EL5Y4UJY-CjO521RP.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CjO521RP.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CjO521RP.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-BfWA1vsn.js → gestureArbiter-D_fs_PXp.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-D_fs_PXp.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-D_fs_PXp.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BHRSzp_C.js → gitGraphDiagram-WWUBYQGX-DbxNhHiO.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DbxNhHiO.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DbxNhHiO.js.gz +0 -0
  121. package/dist/client/assets/{index-CRxcDATF.css → index-CLjn9_01.css} +1 -1
  122. package/dist/client/assets/index-CLjn9_01.css.br +0 -0
  123. package/dist/client/assets/{index-CRxcDATF.css.gz → index-CLjn9_01.css.gz} +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-Cg7_e-28.js → infoDiagram-27XIBGKW-DRcGAFqT.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DZoX8ZW3.js → ishikawaDiagram-5VMMS53U-BPbgDJUg.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPbgDJUg.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPbgDJUg.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-w-zGKB0e.js → journeyDiagram-3NMN7TZE-D1nSzyjD.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-D1nSzyjD.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-D1nSzyjD.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-BT3bId8R.js → kanban-definition-UXKFOSKX-CSCXZnir.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-CSCXZnir.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-CSCXZnir.js.gz +0 -0
  134. package/dist/client/assets/{layout-BBj8qCWw.js → layout-DTNe7C08.js} +1 -1
  135. package/dist/client/assets/layout-DTNe7C08.js.br +0 -0
  136. package/dist/client/assets/layout-DTNe7C08.js.gz +0 -0
  137. package/dist/client/assets/{linear-6QHorh4-.js → linear-DELStaU_.js} +1 -1
  138. package/dist/client/assets/linear-DELStaU_.js.br +0 -0
  139. package/dist/client/assets/linear-DELStaU_.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-BY5LA-EP.js → mermaid.core-D7uvx0E2.js} +5 -5
  141. package/dist/client/assets/mermaid.core-D7uvx0E2.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-D7uvx0E2.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-CGO2TDgU.js → mindmap-definition-YA3MSWOX-C_fF6Gnh.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-C_fF6Gnh.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-C_fF6Gnh.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-DLmrGhu3.js → passwordBootstrap-Co17Xh3M.js} +1 -1
  147. package/dist/client/assets/passwordBootstrap-Co17Xh3M.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-Co17Xh3M.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-D2vg4f0F.js → pegDiagram-XKGWAZYB-BFOfbHg1.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-BFOfbHg1.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-BFOfbHg1.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-Pb7pIdgU.js → pieDiagram-E7YTZNPT-BkLXgY2Y.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-BkLXgY2Y.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-BkLXgY2Y.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BFthChsi.js → quadrantDiagram-AXDQQJYC-DIF7ynjD.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DIF7ynjD.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DIF7ynjD.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-Cp5P_H68.js → railroadDiagram-O6MQD6OU-DGeuv8o1.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-DGeuv8o1.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-DGeuv8o1.js.gz +0 -0
  161. package/dist/client/assets/{rdpSession-Cf9nNJgW.js → rdpSession-DZCrSxpu.js} +1 -1
  162. package/dist/client/assets/rdpSession-DZCrSxpu.js.br +0 -0
  163. package/dist/client/assets/rdpSession-DZCrSxpu.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-CvDkgwa8.js → referenceLongPress-DrY73BHe.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-DrY73BHe.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-DrY73BHe.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-KJsyi-6j.js → requirementDiagram-BXWQKSXE-CoVdyMn3.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-CoVdyMn3.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-CoVdyMn3.js.gz +0 -0
  170. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-BKSkx212.js → sankeyDiagram-P5KCCOFB-BF-YvoEZ.js} +1 -1
  171. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BF-YvoEZ.js.br +0 -0
  172. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BF-YvoEZ.js.gz +0 -0
  173. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-0SsZnczo.js → sequenceDiagram-WJ2MYXX4-CMkePZOj.js} +1 -1
  174. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CMkePZOj.js.br +0 -0
  175. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CMkePZOj.js.gz +0 -0
  176. package/dist/client/assets/{sizeCapture-INFHLROL-Bp7NqW0I.js → sizeCapture-INFHLROL-C9N9vqvo.js} +1 -1
  177. package/dist/client/assets/sizeCapture-INFHLROL-C9N9vqvo.js.br +0 -0
  178. package/dist/client/assets/sizeCapture-INFHLROL-C9N9vqvo.js.gz +0 -0
  179. package/dist/client/assets/{sparkles-DF8Ly_Pm.js → sparkles-DQ-Y24Kv.js} +1 -1
  180. package/dist/client/assets/{stateDiagram-D77RDMKH-k6K6K7qR.js → stateDiagram-D77RDMKH-DFk62G9u.js} +1 -1
  181. package/dist/client/assets/stateDiagram-D77RDMKH-DFk62G9u.js.br +0 -0
  182. package/dist/client/assets/stateDiagram-D77RDMKH-DFk62G9u.js.gz +0 -0
  183. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Bnyl10vy.js +1 -0
  184. package/dist/client/assets/{swimlanes-42K2YHIH-DW25j_xy.js → swimlanes-42K2YHIH-CNpYAR3d.js} +1 -1
  185. package/dist/client/assets/swimlanes-42K2YHIH-CNpYAR3d.js.br +0 -0
  186. package/dist/client/assets/swimlanes-42K2YHIH-CNpYAR3d.js.gz +0 -0
  187. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BwjcVbFS.js +8 -0
  188. package/dist/client/assets/{timeline-definition-24CTP7MA-Cv0GyVjg.js → timeline-definition-24CTP7MA-BVEhKc3h.js} +1 -1
  189. package/dist/client/assets/timeline-definition-24CTP7MA-BVEhKc3h.js.br +0 -0
  190. package/dist/client/assets/timeline-definition-24CTP7MA-BVEhKc3h.js.gz +0 -0
  191. package/dist/client/assets/{triangle-alert-D2N-i46Z.js → triangle-alert-BIwj1bIH.js} +1 -1
  192. package/dist/client/assets/{vennDiagram-4TSXK5OY-D8CJkgWP.js → vennDiagram-4TSXK5OY-DqKMbCx0.js} +1 -1
  193. package/dist/client/assets/vennDiagram-4TSXK5OY-DqKMbCx0.js.br +0 -0
  194. package/dist/client/assets/vennDiagram-4TSXK5OY-DqKMbCx0.js.gz +0 -0
  195. package/dist/client/assets/{videoCompression-BI6dgfHK.js → videoCompression-DhppheEu.js} +1 -1
  196. package/dist/client/assets/videoCompression-DhppheEu.js.br +0 -0
  197. package/dist/client/assets/videoCompression-DhppheEu.js.gz +0 -0
  198. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-mpPlY61d.js → wardleyDiagram-VM6X3IG4-Bnhg0vB7.js} +1 -1
  199. package/dist/client/assets/wardleyDiagram-VM6X3IG4-Bnhg0vB7.js.br +0 -0
  200. package/dist/client/assets/wardleyDiagram-VM6X3IG4-Bnhg0vB7.js.gz +0 -0
  201. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DPuji2mx.js → xychartDiagram-S5SC5T6Z-BBRqvRXj.js} +1 -1
  202. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBRqvRXj.js.br +0 -0
  203. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBRqvRXj.js.gz +0 -0
  204. package/dist/client/index.html +2 -2
  205. package/dist/client/index.html.br +0 -0
  206. package/dist/client/index.html.gz +0 -0
  207. package/dist/client/sw.js +1 -1
  208. package/dist/client/sw.js.br +0 -0
  209. package/dist/client/sw.js.gz +0 -0
  210. package/dist/server/android/adb.js +6 -0
  211. package/dist/server/android/scrcpy.js +56 -16
  212. package/dist/server/android/scrcpyForward.js +83 -0
  213. package/dist/server/routes/android.js +5 -2
  214. package/package.json +1 -1
  215. package/runtime-manifest.json +3 -3
  216. package/scripts/android-bitrate/README.md +17 -2
  217. package/dist/client/assets/App-Da0MrSo9.js +0 -186
  218. package/dist/client/assets/App-Da0MrSo9.js.br +0 -0
  219. package/dist/client/assets/App-Da0MrSo9.js.gz +0 -0
  220. package/dist/client/assets/ArchitecturePanel-wUD5cnJt.js.br +0 -0
  221. package/dist/client/assets/ArchitecturePanel-wUD5cnJt.js.gz +0 -0
  222. package/dist/client/assets/ChangeWalkthroughPanel-hcQbjKYa.js.br +0 -0
  223. package/dist/client/assets/ChangeWalkthroughPanel-hcQbjKYa.js.gz +0 -0
  224. package/dist/client/assets/CollaborationMainWorkspace-B8gzInFt.js.br +0 -0
  225. package/dist/client/assets/CollaborationMainWorkspace-B8gzInFt.js.gz +0 -0
  226. package/dist/client/assets/CollaborationTaskContent-vbLH4pmA.js +0 -2
  227. package/dist/client/assets/ComputerControlView-CdRq0If3.js.br +0 -0
  228. package/dist/client/assets/ComputerControlView-CdRq0If3.js.gz +0 -0
  229. package/dist/client/assets/DagPlayground-BP-NzeBu.js.br +0 -0
  230. package/dist/client/assets/DagPlayground-BP-NzeBu.js.gz +0 -0
  231. package/dist/client/assets/DiffLab-DOj35cPP.js.br +0 -0
  232. package/dist/client/assets/DiffLab-DOj35cPP.js.gz +0 -0
  233. package/dist/client/assets/DiffReview-DFn5-T6o.js.br +0 -0
  234. package/dist/client/assets/DiffReview-DFn5-T6o.js.gz +0 -0
  235. package/dist/client/assets/DiffReviewLab-DM5r4-If.js.br +0 -0
  236. package/dist/client/assets/DiffReviewLab-DM5r4-If.js.gz +0 -0
  237. package/dist/client/assets/DiffViewer-DAE-aJq4.js.br +0 -0
  238. package/dist/client/assets/DiffViewer-DAE-aJq4.js.gz +0 -0
  239. package/dist/client/assets/ModelPreview-BxjQcgfQ.js.br +0 -0
  240. package/dist/client/assets/ModelPreview-BxjQcgfQ.js.gz +0 -0
  241. package/dist/client/assets/RightSidebar-DrOY_DSi.js.br +0 -0
  242. package/dist/client/assets/RightSidebar-DrOY_DSi.js.gz +0 -0
  243. package/dist/client/assets/abnfDiagram-VCTEODGH-OYrfBvYL.js.br +0 -0
  244. package/dist/client/assets/abnfDiagram-VCTEODGH-OYrfBvYL.js.gz +0 -0
  245. package/dist/client/assets/app-2X5OnaRb.js.br +0 -0
  246. package/dist/client/assets/app-2X5OnaRb.js.gz +0 -0
  247. package/dist/client/assets/arc-DTVord8M.js.br +0 -0
  248. package/dist/client/assets/arc-DTVord8M.js.gz +0 -0
  249. package/dist/client/assets/architectureDiagram-5GKGNRK7-DSEPJGQ_.js.br +0 -0
  250. package/dist/client/assets/architectureDiagram-5GKGNRK7-DSEPJGQ_.js.gz +0 -0
  251. package/dist/client/assets/blockDiagram-I7D4REHJ-BnDge6px.js.br +0 -0
  252. package/dist/client/assets/blockDiagram-I7D4REHJ-BnDge6px.js.gz +0 -0
  253. package/dist/client/assets/c4Diagram-7LVT6UL2-B8Q6-muZ.js.br +0 -0
  254. package/dist/client/assets/c4Diagram-7LVT6UL2-B8Q6-muZ.js.gz +0 -0
  255. package/dist/client/assets/channel-Dc3PG99d.js +0 -1
  256. package/dist/client/assets/chunk-F27PBJKO-DLipKTyV.js.br +0 -0
  257. package/dist/client/assets/chunk-F27PBJKO-DLipKTyV.js.gz +0 -0
  258. package/dist/client/assets/chunk-IMKFNOWR-Dn-yzcXt.js.br +0 -0
  259. package/dist/client/assets/chunk-IMKFNOWR-Dn-yzcXt.js.gz +0 -0
  260. package/dist/client/assets/chunk-SVP7TREG-B3qpCqB4.js.br +0 -0
  261. package/dist/client/assets/chunk-SVP7TREG-B3qpCqB4.js.gz +0 -0
  262. package/dist/client/assets/chunk-TICWLB2K-BpzSwag_.js.br +0 -0
  263. package/dist/client/assets/chunk-TICWLB2K-BpzSwag_.js.gz +0 -0
  264. package/dist/client/assets/classDiagram-ZZMXUADV-B3sYGvT0.js +0 -1
  265. package/dist/client/assets/classDiagram-v2-VYDZK3BY-B3sYGvT0.js +0 -1
  266. package/dist/client/assets/cose-bilkent-JH36ORCC-C_hy0D3k.js.br +0 -0
  267. package/dist/client/assets/cose-bilkent-JH36ORCC-C_hy0D3k.js.gz +0 -0
  268. package/dist/client/assets/cynefin-OW5HDTMX-DU_hzOOe.js.br +0 -0
  269. package/dist/client/assets/cynefin-OW5HDTMX-DU_hzOOe.js.gz +0 -0
  270. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C9Y7eJR6.js.br +0 -0
  271. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C9Y7eJR6.js.gz +0 -0
  272. package/dist/client/assets/dagre-GXQ25YYZ-BCy-qZNp.js.br +0 -0
  273. package/dist/client/assets/dagre-GXQ25YYZ-BCy-qZNp.js.gz +0 -0
  274. package/dist/client/assets/diagram-S7CK7UJ4-Du6DHzLe.js.br +0 -0
  275. package/dist/client/assets/diagram-S7CK7UJ4-Du6DHzLe.js.gz +0 -0
  276. package/dist/client/assets/diagram-UQ7AKVKN-BMdHl6um.js.br +0 -0
  277. package/dist/client/assets/diagram-UQ7AKVKN-BMdHl6um.js.gz +0 -0
  278. package/dist/client/assets/diagram-VSXAHHWV-Cc-eKLTX.js.br +0 -0
  279. package/dist/client/assets/diagram-VSXAHHWV-Cc-eKLTX.js.gz +0 -0
  280. package/dist/client/assets/diagram-VX7I27RA-C2ltaAMA.js.br +0 -0
  281. package/dist/client/assets/diagram-VX7I27RA-C2ltaAMA.js.gz +0 -0
  282. package/dist/client/assets/diagram-Z3DM3KII-D6L3L6ZA.js.br +0 -0
  283. package/dist/client/assets/diagram-Z3DM3KII-D6L3L6ZA.js.gz +0 -0
  284. package/dist/client/assets/ebnfDiagram-PWID7BFC-PMurylbI.js.br +0 -0
  285. package/dist/client/assets/ebnfDiagram-PWID7BFC-PMurylbI.js.gz +0 -0
  286. package/dist/client/assets/erDiagram-RLTQ6QDP-BfRM9RA9.js.br +0 -0
  287. package/dist/client/assets/erDiagram-RLTQ6QDP-BfRM9RA9.js.gz +0 -0
  288. package/dist/client/assets/flowDiagram-HODETNUW-Cayn9_Mi.js.br +0 -0
  289. package/dist/client/assets/flowDiagram-HODETNUW-Cayn9_Mi.js.gz +0 -0
  290. package/dist/client/assets/ganttDiagram-EL5Y4UJY-C1Zan8V1.js.br +0 -0
  291. package/dist/client/assets/ganttDiagram-EL5Y4UJY-C1Zan8V1.js.gz +0 -0
  292. package/dist/client/assets/gestureArbiter-BfWA1vsn.js.br +0 -0
  293. package/dist/client/assets/gestureArbiter-BfWA1vsn.js.gz +0 -0
  294. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BHRSzp_C.js.br +0 -0
  295. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BHRSzp_C.js.gz +0 -0
  296. package/dist/client/assets/index-CRxcDATF.css.br +0 -0
  297. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DZoX8ZW3.js.br +0 -0
  298. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DZoX8ZW3.js.gz +0 -0
  299. package/dist/client/assets/journeyDiagram-3NMN7TZE-w-zGKB0e.js.br +0 -0
  300. package/dist/client/assets/journeyDiagram-3NMN7TZE-w-zGKB0e.js.gz +0 -0
  301. package/dist/client/assets/kanban-definition-UXKFOSKX-BT3bId8R.js.br +0 -0
  302. package/dist/client/assets/kanban-definition-UXKFOSKX-BT3bId8R.js.gz +0 -0
  303. package/dist/client/assets/layout-BBj8qCWw.js.br +0 -0
  304. package/dist/client/assets/layout-BBj8qCWw.js.gz +0 -0
  305. package/dist/client/assets/linear-6QHorh4-.js.br +0 -0
  306. package/dist/client/assets/linear-6QHorh4-.js.gz +0 -0
  307. package/dist/client/assets/mermaid.core-BY5LA-EP.js.br +0 -0
  308. package/dist/client/assets/mermaid.core-BY5LA-EP.js.gz +0 -0
  309. package/dist/client/assets/mindmap-definition-YA3MSWOX-CGO2TDgU.js.br +0 -0
  310. package/dist/client/assets/mindmap-definition-YA3MSWOX-CGO2TDgU.js.gz +0 -0
  311. package/dist/client/assets/passwordBootstrap-DLmrGhu3.js.br +0 -0
  312. package/dist/client/assets/passwordBootstrap-DLmrGhu3.js.gz +0 -0
  313. package/dist/client/assets/pegDiagram-XKGWAZYB-D2vg4f0F.js.br +0 -0
  314. package/dist/client/assets/pegDiagram-XKGWAZYB-D2vg4f0F.js.gz +0 -0
  315. package/dist/client/assets/pieDiagram-E7YTZNPT-Pb7pIdgU.js.br +0 -0
  316. package/dist/client/assets/pieDiagram-E7YTZNPT-Pb7pIdgU.js.gz +0 -0
  317. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BFthChsi.js.br +0 -0
  318. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BFthChsi.js.gz +0 -0
  319. package/dist/client/assets/railroadDiagram-O6MQD6OU-Cp5P_H68.js.br +0 -0
  320. package/dist/client/assets/railroadDiagram-O6MQD6OU-Cp5P_H68.js.gz +0 -0
  321. package/dist/client/assets/rdpSession-Cf9nNJgW.js.br +0 -0
  322. package/dist/client/assets/rdpSession-Cf9nNJgW.js.gz +0 -0
  323. package/dist/client/assets/referenceLongPress-CvDkgwa8.js.br +0 -0
  324. package/dist/client/assets/referenceLongPress-CvDkgwa8.js.gz +0 -0
  325. package/dist/client/assets/requirementDiagram-BXWQKSXE-KJsyi-6j.js.br +0 -0
  326. package/dist/client/assets/requirementDiagram-BXWQKSXE-KJsyi-6j.js.gz +0 -0
  327. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BKSkx212.js.br +0 -0
  328. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BKSkx212.js.gz +0 -0
  329. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-0SsZnczo.js.br +0 -0
  330. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-0SsZnczo.js.gz +0 -0
  331. package/dist/client/assets/sizeCapture-INFHLROL-Bp7NqW0I.js.br +0 -0
  332. package/dist/client/assets/sizeCapture-INFHLROL-Bp7NqW0I.js.gz +0 -0
  333. package/dist/client/assets/stateDiagram-D77RDMKH-k6K6K7qR.js.br +0 -0
  334. package/dist/client/assets/stateDiagram-D77RDMKH-k6K6K7qR.js.gz +0 -0
  335. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DKA4E1S3.js +0 -1
  336. package/dist/client/assets/swimlanes-42K2YHIH-DW25j_xy.js.br +0 -0
  337. package/dist/client/assets/swimlanes-42K2YHIH-DW25j_xy.js.gz +0 -0
  338. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CR99uemP.js +0 -8
  339. package/dist/client/assets/timeline-definition-24CTP7MA-Cv0GyVjg.js.br +0 -0
  340. package/dist/client/assets/timeline-definition-24CTP7MA-Cv0GyVjg.js.gz +0 -0
  341. package/dist/client/assets/vennDiagram-4TSXK5OY-D8CJkgWP.js.br +0 -0
  342. package/dist/client/assets/vennDiagram-4TSXK5OY-D8CJkgWP.js.gz +0 -0
  343. package/dist/client/assets/videoCompression-BI6dgfHK.js.br +0 -0
  344. package/dist/client/assets/videoCompression-BI6dgfHK.js.gz +0 -0
  345. package/dist/client/assets/wardleyDiagram-VM6X3IG4-mpPlY61d.js.br +0 -0
  346. package/dist/client/assets/wardleyDiagram-VM6X3IG4-mpPlY61d.js.gz +0 -0
  347. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DPuji2mx.js.br +0 -0
  348. package/dist/client/assets/xychartDiagram-S5SC5T6Z-DPuji2mx.js.gz +0 -0
@@ -4,6 +4,7 @@ import net from 'node:net';
4
4
  import { delimiter, dirname, join } from 'node:path';
5
5
  import { randomInt } from 'node:crypto';
6
6
  import { adbSearchPath, resolveAdbBinary } from './adb.js';
7
+ import { connectScrcpyForward } from './scrcpyForward.js';
7
8
  import { LiveBitrateChannel, inspectLiveBitrate, resolveBundledPreviewServer, bitrateOverlayPath, bitrateOverlayRemote } from './liveBitrate.js';
8
9
  const DEVICE_NAME_LENGTH = 64;
9
10
  const VIDEO_HEADER_LENGTH = 12;
@@ -126,11 +127,15 @@ function runAdbCapture(args, timeout = 30_000) {
126
127
  function scidHex(scid) {
127
128
  return scid.toString(16).padStart(8, '0');
128
129
  }
129
- /** 单设备的一条 scrcpy 会话:推送 server → adb reverse → 启动 server → 解析 H.264/H.265 流。 */
130
+ /** 单设备的一条 scrcpy 会话:推送 server → ADB 隧道 → 启动 server → 解析视频流。 */
130
131
  export class ScrcpySession {
131
132
  serial;
132
133
  events;
133
134
  options;
135
+ // Network ADB can acknowledge reverse rules without carrying their data.
136
+ tunnelForward;
137
+ forwardPort = 0;
138
+ connectionAbort = new AbortController();
134
139
  scid = randomInt(1, 0x7fffffff);
135
140
  bitrateChannel = null;
136
141
  child = null;
@@ -148,11 +153,13 @@ export class ScrcpySession {
148
153
  started = false;
149
154
  deviceName = '';
150
155
  resolveHeader = null;
156
+ rejectHeader = null;
151
157
  logLines = [];
152
158
  constructor(serial, events, options = {}) {
153
159
  this.serial = serial;
154
160
  this.events = events;
155
161
  this.options = options;
162
+ this.tunnelForward = /[:.]/.test(serial);
156
163
  }
157
164
  get running() { return this.started && !this.stopped; }
158
165
  log(line) {
@@ -166,6 +173,7 @@ export class ScrcpySession {
166
173
  fail(error) {
167
174
  if (this.stopped)
168
175
  return;
176
+ this.rejectHeader?.(error);
169
177
  this.events.onError(error);
170
178
  void this.stop();
171
179
  }
@@ -178,14 +186,23 @@ export class ScrcpySession {
178
186
  this.protocol = Number.parseInt(version.split('.')[0] ?? '0', 10) >= 4 ? 'session' : 'legacy';
179
187
  const remoteJar = remoteJarPath(version);
180
188
  await runAdbCapture(['-s', this.serial, 'push', serverJar, remoteJar], 60_000);
181
- const server = net.createServer();
182
- this.server = server;
183
- server.on('connection', socket => this.acceptSocket(socket));
184
- await new Promise((resolve, reject) => {
185
- server.once('error', reject);
186
- server.listen(0, '127.0.0.1', () => { this.port = server.address().port; resolve(); });
187
- });
188
- await runAdbCapture(['-s', this.serial, 'reverse', `localabstract:scrcpy_${scidHex(this.scid)}`, `tcp:${this.port}`], 15_000);
189
+ if (this.tunnelForward) {
190
+ const assigned = await runAdbCapture(['-s', this.serial, 'forward', 'tcp:0', `localabstract:scrcpy_${scidHex(this.scid)}`], 15_000);
191
+ const port = Number(assigned);
192
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
193
+ throw new Error('SCRCPY_FORWARD_INVALID_PORT');
194
+ this.forwardPort = port;
195
+ }
196
+ else {
197
+ const server = net.createServer();
198
+ this.server = server;
199
+ server.on('connection', socket => this.acceptSocket(socket));
200
+ await new Promise((resolve, reject) => {
201
+ server.once('error', reject);
202
+ server.listen(0, '127.0.0.1', () => { this.port = server.address().port; resolve(); });
203
+ });
204
+ await runAdbCapture(['-s', this.serial, 'reverse', `localabstract:scrcpy_${scidHex(this.scid)}`, `tcp:${this.port}`], 15_000);
205
+ }
189
206
  let liveBitrate = false;
190
207
  let bitrateFailure = await inspectLiveBitrate(serverJar, version);
191
208
  let bitrateStage = 'BITRATE_LISTEN_FAILED';
@@ -218,6 +235,7 @@ export class ScrcpySession {
218
235
  if (this.stopped) {
219
236
  this.bitrateChannel?.close();
220
237
  this.server?.close();
238
+ await this.removeForward();
221
239
  await Promise.allSettled(['scrcpy_', 'termdock_bitrate_'].map(prefix => runAdbCapture(['-s', this.serial, 'reverse', '--remove', `localabstract:${prefix}${scidHex(this.scid)}`], 8000)));
222
240
  return;
223
241
  }
@@ -230,7 +248,7 @@ export class ScrcpySession {
230
248
  'log_level=info',
231
249
  'audio=false',
232
250
  'control=true',
233
- 'tunnel_forward=false',
251
+ `tunnel_forward=${this.tunnelForward}`,
234
252
  'power_on=true',
235
253
  'stay_awake=true',
236
254
  'clipboard_autosync=false',
@@ -239,14 +257,21 @@ export class ScrcpySession {
239
257
  ];
240
258
  if (this.options.maxFps && this.options.maxFps > 0)
241
259
  args.push(`max_fps=${this.options.maxFps}`);
260
+ const headerReady = this.waitForHeader();
261
+ // Handle early process exit even while forward is establishing its sockets.
262
+ void headerReady.catch(() => { });
242
263
  const child = spawn(adbBinary(), args, { stdio: ['ignore', 'pipe', 'pipe'], env: { ...process.env, PATH: adbSearchPath() } });
243
264
  this.child = child;
244
265
  child.stdout?.on('data', chunk => this.log(String(chunk).replace(/^\[server\]\s*/, '')));
245
266
  child.stderr?.on('data', chunk => this.log(String(chunk)));
246
267
  child.on('error', error => this.fail(error instanceof Error ? error : new Error('SCRCPY_SPAWN_FAILED')));
247
- child.on('close', () => { if (!this.stopped)
248
- this.fail(new Error(this.logLines.at(-1) || 'SCRCPY_SERVER_EXITED')); });
249
- await this.waitForHeader();
268
+ child.on('close', (code, signal) => {
269
+ if (!this.stopped)
270
+ this.fail(new Error(`SCRCPY_SERVER_EXITED: code=${code ?? 'null'} signal=${signal ?? 'none'}; tunnel=${this.tunnelForward ? 'forward' : 'reverse'}; video=${this.videoSocket ? 'connected' : 'not_connected'}\n${this.logLines.slice(-8).join('\n')}`));
271
+ });
272
+ await Promise.all([headerReady, this.tunnelForward
273
+ ? connectScrcpyForward(this.forwardPort, this.connectionAbort.signal, socket => this.acceptSocket(socket))
274
+ : Promise.resolve()]);
250
275
  }
251
276
  catch (error) {
252
277
  const normalized = error instanceof Error ? error : new Error('SCRCPY_START_FAILED');
@@ -257,8 +282,10 @@ export class ScrcpySession {
257
282
  }
258
283
  waitForHeader() {
259
284
  return new Promise((resolve, reject) => {
260
- const timer = setTimeout(() => { this.resolveHeader = null; reject(new Error('SCRCPY_CONNECT_TIMEOUT')); }, CONNECT_TIMEOUT_MS);
261
- this.resolveHeader = () => { clearTimeout(timer); this.resolveHeader = null; resolve(); };
285
+ const clear = () => { clearTimeout(timer); this.resolveHeader = null; this.rejectHeader = null; };
286
+ const timer = setTimeout(() => { clear(); reject(new Error('SCRCPY_CONNECT_TIMEOUT')); }, CONNECT_TIMEOUT_MS);
287
+ this.resolveHeader = () => { clear(); resolve(); };
288
+ this.rejectHeader = error => { clear(); reject(error); };
262
289
  });
263
290
  }
264
291
  acceptSocket(socket) {
@@ -268,7 +295,7 @@ export class ScrcpySession {
268
295
  socket.on('data', chunk => this.readVideo(chunk));
269
296
  socket.on('error', error => this.fail(error instanceof Error ? error : new Error('VIDEO_SOCKET_ERROR')));
270
297
  socket.on('close', () => { if (!this.stopped)
271
- this.fail(new Error(this.logLines.at(-1) || 'VIDEO_SOCKET_CLOSED')); });
298
+ this.fail(new Error(`VIDEO_SOCKET_CLOSED: tunnel=${this.tunnelForward ? 'forward' : 'reverse'}\n${this.logLines.slice(-8).join('\n')}`)); });
272
299
  return;
273
300
  }
274
301
  if (!this.controlSocket) {
@@ -416,10 +443,22 @@ export class ScrcpySession {
416
443
  setBitrate(value) {
417
444
  return this.bitrateChannel?.setBitrate(value) ?? Promise.resolve(false);
418
445
  }
446
+ async removeForward() {
447
+ const port = this.forwardPort;
448
+ this.forwardPort = 0;
449
+ if (port) {
450
+ try {
451
+ await runAdbCapture(['-s', this.serial, 'forward', '--remove', `tcp:${port}`], 8000);
452
+ }
453
+ catch { /* The device or ADB may already have removed this exact rule. */ }
454
+ }
455
+ }
419
456
  async stop() {
420
457
  if (this.stopped)
421
458
  return;
422
459
  this.stopped = true;
460
+ this.connectionAbort.abort();
461
+ this.rejectHeader?.(new Error('SCRCPY_SESSION_STOPPED'));
423
462
  activeSessions.delete(this);
424
463
  this.bitrateChannel?.close();
425
464
  const child = this.child;
@@ -445,6 +484,7 @@ export class ScrcpySession {
445
484
  }
446
485
  catch { /* ignore */ }
447
486
  }
487
+ await this.removeForward();
448
488
  try {
449
489
  await runAdbCapture(['-s', this.serial, 'reverse', '--remove', `localabstract:scrcpy_${scidHex(this.scid)}`], 8000);
450
490
  }
@@ -0,0 +1,83 @@
1
+ import net from 'node:net';
2
+ /** Wait for scrcpy's dummy byte: an ADB forward TCP accept alone does not
3
+ * prove the device-side localabstract listener has started yet. */
4
+ export async function connectScrcpyForward(port, signal, accept, timeoutMs = 12_000) {
5
+ const deadline = Date.now() + timeoutMs;
6
+ const open = (dummy) => new Promise((resolve, reject) => {
7
+ if (signal.aborted) {
8
+ reject(new Error('SCRCPY_SESSION_STOPPED'));
9
+ return;
10
+ }
11
+ const socket = net.connect({ host: '127.0.0.1', port });
12
+ const timer = setTimeout(() => fail(new Error('SCRCPY_FORWARD_CONNECT_TIMEOUT')), Math.min(500, Math.max(1, deadline - Date.now())));
13
+ const cleanup = () => {
14
+ clearTimeout(timer);
15
+ signal.removeEventListener('abort', abort);
16
+ socket.removeListener('error', fail);
17
+ socket.removeListener('close', closed);
18
+ socket.removeListener('data', data);
19
+ socket.removeListener('connect', connected);
20
+ };
21
+ const fail = (error) => { cleanup(); socket.destroy(); reject(error); };
22
+ const closed = () => fail(new Error('SCRCPY_FORWARD_CONNECTION_CLOSED'));
23
+ const abort = () => fail(new Error('SCRCPY_SESSION_STOPPED'));
24
+ const ready = () => { socket.pause(); cleanup(); resolve(socket); };
25
+ const connected = () => { if (!dummy)
26
+ ready(); };
27
+ const data = (chunk) => {
28
+ if (!chunk.length)
29
+ return;
30
+ if (chunk[0] !== 0) {
31
+ fail(new Error('SCRCPY_FORWARD_HANDSHAKE_INVALID'));
32
+ return;
33
+ }
34
+ socket.pause();
35
+ if (chunk.length > 1)
36
+ socket.unshift(chunk.subarray(1));
37
+ ready();
38
+ };
39
+ signal.addEventListener('abort', abort, { once: true });
40
+ socket.on('error', fail);
41
+ socket.on('close', closed);
42
+ socket.on('connect', connected);
43
+ if (dummy)
44
+ socket.on('data', data);
45
+ });
46
+ let video;
47
+ let control;
48
+ try {
49
+ while (!signal.aborted && Date.now() < deadline) {
50
+ try {
51
+ video = await open(true);
52
+ break;
53
+ }
54
+ catch (error) {
55
+ if (signal.aborted || Date.now() >= deadline)
56
+ throw error;
57
+ await new Promise(resolve => {
58
+ const done = () => { clearTimeout(timer); signal.removeEventListener('abort', done); resolve(); };
59
+ const timer = setTimeout(done, 100);
60
+ signal.addEventListener('abort', done, { once: true });
61
+ if (signal.aborted)
62
+ done();
63
+ });
64
+ }
65
+ }
66
+ if (!video || signal.aborted)
67
+ throw new Error(signal.aborted ? 'SCRCPY_SESSION_STOPPED' : 'SCRCPY_FORWARD_CONNECT_TIMEOUT');
68
+ // Install video error/close listeners before waiting for control.
69
+ accept(video);
70
+ control = await open(false);
71
+ if (signal.aborted)
72
+ throw new Error('SCRCPY_SESSION_STOPPED');
73
+ // Keep video paused until both sockets have listeners and definite roles.
74
+ accept(control);
75
+ video.resume();
76
+ control.resume();
77
+ }
78
+ catch (error) {
79
+ video?.destroy();
80
+ control?.destroy();
81
+ throw error;
82
+ }
83
+ }
@@ -162,14 +162,17 @@ export function handleAndroidWebSocket(socket, serial, _clientId, requested = {}
162
162
  const shutdown = (reason) => {
163
163
  if (closed)
164
164
  return;
165
+ // send() rejects closed sessions: deliver the cause before marking it closed.
166
+ if (reason) {
167
+ console.warn(`[android] session failed serial=${serial}: ${reason}`);
168
+ send({ type: 'error', message: reason });
169
+ }
165
170
  closed = true;
166
171
  clearInterval(flowTimer);
167
172
  if (statsTimer)
168
173
  clearInterval(statsTimer);
169
174
  if (DEBUG_ANDROID)
170
175
  console.log(`[android] session end serial=${serial} sent=${sent} acked=${acked} reason=${reason ?? 'ok'}`);
171
- if (reason)
172
- send({ type: 'error', message: reason });
173
176
  try {
174
177
  session?.stop();
175
178
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.333",
3
+ "version": "1.4.335",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.333",
4
+ "version": "1.4.335",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
8
  "dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
9
- "serverBundleHash": "sha256-3no4R3NbStrmDJJLVupnUBWo7XLepTMTQ6C+w+LDL6g=",
10
- "clientBundleHash": "sha256-gqWugg/ce7uDBMDWu7qHf22tZHe4d6gCfG3PUkKlSZA=",
9
+ "serverBundleHash": "sha256-oP7hnH+0kNAIOiaQqS+7gVZR8blwiKXULzIZ8eQYCOE=",
10
+ "clientBundleHash": "sha256-5AO8soGCDDxFlZjr8zTeNxVLFL4bw+MXYLTu2kdyLs0=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }
@@ -26,6 +26,14 @@ checksum before writing). Its source is https://github.com/Genymobile/scrcpy/tre
26
26
  An explicit TERMDOCK_SCRCPY_SERVER override is honored. Missing/invalid bundled
27
27
  assets fall back to the host server; unverified host builds then retain current
28
28
  quality with a diagnostic. Rejections and channel failures also preserve video.
29
+
30
+ Network ADB preview sessions use `adb forward` for video and control; USB
31
+ sessions retain `adb reverse`. The forward connector waits for the scrcpy dummy
32
+ byte before opening control and removes only its own allocated TCP rule on stop.
33
+ The optional bitrate channel still uses a separate reverse rule. If reverse rules
34
+ register but carry no data, its handshake times out with a diagnostic; preview
35
+ continues at the configured bitrate.
36
+
29
37
  Extend the allowlist only after verifying the CaptureReset ABI and real-device
30
38
  behavior. No global scrcpy installation is modified.
31
39
 
@@ -40,8 +48,15 @@ desktop runtime packager. Apache-2.0 license is included.
40
48
 
41
49
  Validation: Mi MIX 2S / Android 13 accepted 1.8 → 6 → 0.9 → 4 Mbps within
42
50
  one session, continuously producing frames, with one video header and one codec
43
- configuration packet. Other vendor encoders and macOS/iOS clients require real
44
- device verification.
51
+ configuration packet.
52
+
53
+ Mac server and iPhone preview rendering were also verified with network
54
+ PTP-AN00 / Android 16 and Pixel 9 / Android 15 using forward video. On those cloud
55
+ routes, reverse registration succeeded without carrying data: bitrate handshakes
56
+ timed out while preview stayed alive. Physical identity properties matched across
57
+ the PTP IPv4/IPv6 routes; option grouping and selected-route preservation are
58
+ covered by tests. These observations do not establish live bitrate support on
59
+ those devices or full native input/recording acceptance.
45
60
 
46
61
  Diagnostics distinguish version/build, missing/corrupt extension, ADB push/reverse,
47
62
  15s handshake timeout, 2.5s device ACK timeout, 4s client confirmation timeout,