termdock 1.4.334 → 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.
- package/dist/client/assets/{App-CA8oXFgS.js → App-B1lqBSPB.js} +16 -16
- package/dist/client/assets/App-B1lqBSPB.js.br +0 -0
- package/dist/client/assets/App-B1lqBSPB.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-BkB57agj.js → ArchitecturePanel-BOq2FG6t.js} +2 -2
- package/dist/client/assets/ArchitecturePanel-BOq2FG6t.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-BOq2FG6t.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-vh6Z641M.js → ChangeWalkthroughPanel-CxqwQxYc.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-CxqwQxYc.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-CxqwQxYc.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-dTXq04jE.js → CollaborationMainWorkspace-vvAVjIlQ.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-vvAVjIlQ.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-vvAVjIlQ.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-Bx6Z5gEL.js +2 -0
- package/dist/client/assets/{ComputerControlView-Cmar8PMd.js → ComputerControlView-mR6vlp9k.js} +3 -3
- package/dist/client/assets/ComputerControlView-mR6vlp9k.js.br +0 -0
- package/dist/client/assets/ComputerControlView-mR6vlp9k.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-C-JZfG9-.js → DagPlayground-nUK9xIql.js} +1 -1
- package/dist/client/assets/DagPlayground-nUK9xIql.js.br +0 -0
- package/dist/client/assets/DagPlayground-nUK9xIql.js.gz +0 -0
- package/dist/client/assets/{DiffLab-rOEPk8iI.js → DiffLab-D6XhZtPW.js} +1 -1
- package/dist/client/assets/DiffLab-D6XhZtPW.js.br +0 -0
- package/dist/client/assets/DiffLab-D6XhZtPW.js.gz +0 -0
- package/dist/client/assets/{DiffReview-aIj4WHDS.js → DiffReview-BhyYqkD4.js} +1 -1
- package/dist/client/assets/DiffReview-BhyYqkD4.js.br +0 -0
- package/dist/client/assets/DiffReview-BhyYqkD4.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CU4vENL5.js → DiffReviewLab-CvNWVrbl.js} +1 -1
- package/dist/client/assets/DiffReviewLab-CvNWVrbl.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CvNWVrbl.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-SKlbS7b4.js → DiffViewer-BSbMa2mq.js} +1 -1
- package/dist/client/assets/DiffViewer-BSbMa2mq.js.br +0 -0
- package/dist/client/assets/DiffViewer-BSbMa2mq.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-mGhBeBla.js → ModelPreview-B_VPlNYr.js} +1 -1
- package/dist/client/assets/ModelPreview-B_VPlNYr.js.br +0 -0
- package/dist/client/assets/ModelPreview-B_VPlNYr.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-BtHbt-XD.js → RightSidebar-Cakd9qUZ.js} +3 -3
- package/dist/client/assets/RightSidebar-Cakd9qUZ.js.br +0 -0
- package/dist/client/assets/RightSidebar-Cakd9qUZ.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-BazK9AUo.js → abnfDiagram-VCTEODGH-vWK7F-r_.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-vWK7F-r_.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-vWK7F-r_.js.gz +0 -0
- package/dist/client/assets/{app-1SAb4dhI.js → app-BZBIr89q.js} +3 -3
- package/dist/client/assets/app-BZBIr89q.js.br +0 -0
- package/dist/client/assets/app-BZBIr89q.js.gz +0 -0
- package/dist/client/assets/{arc-DW2qA73J.js → arc-Bdjvby9b.js} +1 -1
- package/dist/client/assets/arc-Bdjvby9b.js.br +0 -0
- package/dist/client/assets/arc-Bdjvby9b.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-CVkFu36h.js → architectureDiagram-5GKGNRK7-DTR5hJkG.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DTR5hJkG.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DTR5hJkG.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-Cw0LbdUV.js → blockDiagram-I7D4REHJ-DPz3axsu.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-DPz3axsu.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DPz3axsu.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-D-7cVLVY.js → c4Diagram-7LVT6UL2-d5ZwPpcN.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-d5ZwPpcN.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-d5ZwPpcN.js.gz +0 -0
- package/dist/client/assets/channel-M_h_h55d.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-DHms9xFG.js → chunk-2Q5K7J3B-BpEmNpto.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-DT9NVgVz.js → chunk-5VM5RSS4-CXDCiEbN.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-BPQlePZ0.js → chunk-F27PBJKO-C1L__gXc.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-C1L__gXc.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-C1L__gXc.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-CYpkOg4N.js → chunk-IMKFNOWR-CX0r7pV5.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CX0r7pV5.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CX0r7pV5.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-BetVwCtg.js → chunk-JWPE2WC7-DkbhnrKh.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CHVqavTY.js → chunk-POPQ4Y6H-CH-o5PVe.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-TridS3zl.js → chunk-SVP7TREG-C1x5c5cy.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-C1x5c5cy.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-C1x5c5cy.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-CrSU9J1Y.js → chunk-TICWLB2K-DAktkamN.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-DAktkamN.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DAktkamN.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-DvrlcFpp.js → chunk-XXDRQBXY-emNetBN1.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BVuw_2Ox.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BVuw_2Ox.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-BPspdiZq.js → cose-bilkent-JH36ORCC-kBGroiho.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-kBGroiho.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-kBGroiho.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-CdZ2Ij-1.js → cynefin-OW5HDTMX-C0TjwB46.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-C0TjwB46.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-C0TjwB46.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CS4dSANt.js → cynefinDiagram-5FMLGOSQ-CbLSUTuV.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CbLSUTuV.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CbLSUTuV.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-jz406NVd.js → dagre-GXQ25YYZ-BoznXKfa.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-BoznXKfa.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BoznXKfa.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-BXz7D6hW.js → diagram-S7CK7UJ4-iY9ia7F5.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-iY9ia7F5.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-iY9ia7F5.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BtSwQGmR.js → diagram-UQ7AKVKN-DhnC8gBw.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-DhnC8gBw.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DhnC8gBw.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-B2lDfe93.js → diagram-VSXAHHWV-JFg8cbqX.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-JFg8cbqX.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-JFg8cbqX.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-QDrY0hNk.js → diagram-VX7I27RA-dvyXUTpo.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-dvyXUTpo.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-dvyXUTpo.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-D1AFu390.js → diagram-Z3DM3KII-DmjwsCUU.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DmjwsCUU.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DmjwsCUU.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-L5aoZUCG.js → ebnfDiagram-PWID7BFC-BxCdDL0c.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BxCdDL0c.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BxCdDL0c.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-CFUfoWVL.js → erDiagram-RLTQ6QDP-BWvvnoz1.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-BWvvnoz1.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BWvvnoz1.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-A-hvg2q9.js → flowDiagram-HODETNUW-CVU0l_6c.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-CVU0l_6c.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CVU0l_6c.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DSMsjMS7.js → ganttDiagram-EL5Y4UJY-CjO521RP.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CjO521RP.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CjO521RP.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-BvkspAa2.js → gestureArbiter-D_fs_PXp.js} +1 -1
- package/dist/client/assets/gestureArbiter-D_fs_PXp.js.br +0 -0
- package/dist/client/assets/gestureArbiter-D_fs_PXp.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BhpWzivx.js → gitGraphDiagram-WWUBYQGX-DbxNhHiO.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DbxNhHiO.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DbxNhHiO.js.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-a_A60wu0.js → infoDiagram-27XIBGKW-DRcGAFqT.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-zp9iSkhD.js → ishikawaDiagram-5VMMS53U-BPbgDJUg.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPbgDJUg.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPbgDJUg.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-CWIWv2zw.js → journeyDiagram-3NMN7TZE-D1nSzyjD.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-D1nSzyjD.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-D1nSzyjD.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-JzGKFo57.js → kanban-definition-UXKFOSKX-CSCXZnir.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-CSCXZnir.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CSCXZnir.js.gz +0 -0
- package/dist/client/assets/{layout-7Cq6z6dO.js → layout-DTNe7C08.js} +1 -1
- package/dist/client/assets/layout-DTNe7C08.js.br +0 -0
- package/dist/client/assets/layout-DTNe7C08.js.gz +0 -0
- package/dist/client/assets/{linear-CuFZW946.js → linear-DELStaU_.js} +1 -1
- package/dist/client/assets/linear-DELStaU_.js.br +0 -0
- package/dist/client/assets/linear-DELStaU_.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-DbR5q1bj.js → mermaid.core-D7uvx0E2.js} +5 -5
- package/dist/client/assets/mermaid.core-D7uvx0E2.js.br +0 -0
- package/dist/client/assets/mermaid.core-D7uvx0E2.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-DdzejTGB.js → mindmap-definition-YA3MSWOX-C_fF6Gnh.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C_fF6Gnh.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C_fF6Gnh.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-lisz9s1P.js → passwordBootstrap-Co17Xh3M.js} +1 -1
- package/dist/client/assets/passwordBootstrap-Co17Xh3M.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-Co17Xh3M.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-D720_LqX.js → pegDiagram-XKGWAZYB-BFOfbHg1.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-BFOfbHg1.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BFOfbHg1.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-zEDQIxrq.js → pieDiagram-E7YTZNPT-BkLXgY2Y.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-BkLXgY2Y.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BkLXgY2Y.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Cp0CVTM2.js → quadrantDiagram-AXDQQJYC-DIF7ynjD.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DIF7ynjD.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DIF7ynjD.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-DmEhvOdy.js → railroadDiagram-O6MQD6OU-DGeuv8o1.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DGeuv8o1.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DGeuv8o1.js.gz +0 -0
- package/dist/client/assets/{rdpSession-DQon3e98.js → rdpSession-DZCrSxpu.js} +1 -1
- package/dist/client/assets/rdpSession-DZCrSxpu.js.br +0 -0
- package/dist/client/assets/rdpSession-DZCrSxpu.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-DTjCnJH8.js → referenceLongPress-DrY73BHe.js} +1 -1
- package/dist/client/assets/referenceLongPress-DrY73BHe.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DrY73BHe.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BnMPYUjE.js → requirementDiagram-BXWQKSXE-CoVdyMn3.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CoVdyMn3.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CoVdyMn3.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-AvSI5iFI.js → sankeyDiagram-P5KCCOFB-BF-YvoEZ.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BF-YvoEZ.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BF-YvoEZ.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-DPXyiIKd.js → sequenceDiagram-WJ2MYXX4-CMkePZOj.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CMkePZOj.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CMkePZOj.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-CER_XOvb.js → sizeCapture-INFHLROL-C9N9vqvo.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-C9N9vqvo.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-C9N9vqvo.js.gz +0 -0
- package/dist/client/assets/{sparkles-CgwSF-UK.js → sparkles-DQ-Y24Kv.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-BdWVez-f.js → stateDiagram-D77RDMKH-DFk62G9u.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-DFk62G9u.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DFk62G9u.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Bnyl10vy.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-BJyO3_8y.js → swimlanes-42K2YHIH-CNpYAR3d.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-CNpYAR3d.js.br +0 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-BJyO3_8y.js.gz → swimlanes-42K2YHIH-CNpYAR3d.js.gz} +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BwjcVbFS.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-ocqFrNBu.js → timeline-definition-24CTP7MA-BVEhKc3h.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-BVEhKc3h.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BVEhKc3h.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-CNoodlX6.js → triangle-alert-BIwj1bIH.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DOaftoeV.js → vennDiagram-4TSXK5OY-DqKMbCx0.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DqKMbCx0.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DqKMbCx0.js.gz +0 -0
- package/dist/client/assets/{videoCompression-Cu21usMU.js → videoCompression-DhppheEu.js} +1 -1
- package/dist/client/assets/videoCompression-DhppheEu.js.br +0 -0
- package/dist/client/assets/videoCompression-DhppheEu.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-D__Jujiv.js → wardleyDiagram-VM6X3IG4-Bnhg0vB7.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-Bnhg0vB7.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-Bnhg0vB7.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-DU86_bqa.js → xychartDiagram-S5SC5T6Z-BBRqvRXj.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBRqvRXj.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBRqvRXj.js.gz +0 -0
- package/dist/client/index.html +1 -1
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/android/adb.js +6 -0
- package/dist/server/android/scrcpy.js +56 -16
- package/dist/server/android/scrcpyForward.js +83 -0
- package/dist/server/routes/android.js +5 -2
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/scripts/android-bitrate/README.md +17 -2
- package/dist/client/assets/App-CA8oXFgS.js.br +0 -0
- package/dist/client/assets/App-CA8oXFgS.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-BkB57agj.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-BkB57agj.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-vh6Z641M.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-vh6Z641M.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-dTXq04jE.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-dTXq04jE.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-vtFFtPjY.js +0 -2
- package/dist/client/assets/ComputerControlView-Cmar8PMd.js.br +0 -0
- package/dist/client/assets/ComputerControlView-Cmar8PMd.js.gz +0 -0
- package/dist/client/assets/DagPlayground-C-JZfG9-.js.br +0 -0
- package/dist/client/assets/DagPlayground-C-JZfG9-.js.gz +0 -0
- package/dist/client/assets/DiffLab-rOEPk8iI.js.br +0 -0
- package/dist/client/assets/DiffLab-rOEPk8iI.js.gz +0 -0
- package/dist/client/assets/DiffReview-aIj4WHDS.js.br +0 -0
- package/dist/client/assets/DiffReview-aIj4WHDS.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CU4vENL5.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CU4vENL5.js.gz +0 -0
- package/dist/client/assets/DiffViewer-SKlbS7b4.js.br +0 -0
- package/dist/client/assets/DiffViewer-SKlbS7b4.js.gz +0 -0
- package/dist/client/assets/ModelPreview-mGhBeBla.js.br +0 -0
- package/dist/client/assets/ModelPreview-mGhBeBla.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BtHbt-XD.js.br +0 -0
- package/dist/client/assets/RightSidebar-BtHbt-XD.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BazK9AUo.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BazK9AUo.js.gz +0 -0
- package/dist/client/assets/app-1SAb4dhI.js.br +0 -0
- package/dist/client/assets/app-1SAb4dhI.js.gz +0 -0
- package/dist/client/assets/arc-DW2qA73J.js.br +0 -0
- package/dist/client/assets/arc-DW2qA73J.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CVkFu36h.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CVkFu36h.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Cw0LbdUV.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Cw0LbdUV.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-D-7cVLVY.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-D-7cVLVY.js.gz +0 -0
- package/dist/client/assets/channel-B0ZO96Vf.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-BPQlePZ0.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BPQlePZ0.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CYpkOg4N.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CYpkOg4N.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-TridS3zl.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-TridS3zl.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CrSU9J1Y.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CrSU9J1Y.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DNgoON1D.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DNgoON1D.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-BPspdiZq.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-BPspdiZq.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CdZ2Ij-1.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CdZ2Ij-1.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CS4dSANt.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CS4dSANt.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-jz406NVd.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-jz406NVd.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BXz7D6hW.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BXz7D6hW.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BtSwQGmR.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BtSwQGmR.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-B2lDfe93.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-B2lDfe93.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-QDrY0hNk.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-QDrY0hNk.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-D1AFu390.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-D1AFu390.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-L5aoZUCG.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-L5aoZUCG.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CFUfoWVL.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CFUfoWVL.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-A-hvg2q9.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-A-hvg2q9.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DSMsjMS7.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DSMsjMS7.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-BvkspAa2.js.br +0 -0
- package/dist/client/assets/gestureArbiter-BvkspAa2.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BhpWzivx.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BhpWzivx.js.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-zp9iSkhD.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-zp9iSkhD.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CWIWv2zw.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CWIWv2zw.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-JzGKFo57.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-JzGKFo57.js.gz +0 -0
- package/dist/client/assets/layout-7Cq6z6dO.js.br +0 -0
- package/dist/client/assets/layout-7Cq6z6dO.js.gz +0 -0
- package/dist/client/assets/linear-CuFZW946.js.br +0 -0
- package/dist/client/assets/linear-CuFZW946.js.gz +0 -0
- package/dist/client/assets/mermaid.core-DbR5q1bj.js.br +0 -0
- package/dist/client/assets/mermaid.core-DbR5q1bj.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-DdzejTGB.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-DdzejTGB.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-lisz9s1P.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-lisz9s1P.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-D720_LqX.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-D720_LqX.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-zEDQIxrq.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-zEDQIxrq.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Cp0CVTM2.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Cp0CVTM2.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DmEhvOdy.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DmEhvOdy.js.gz +0 -0
- package/dist/client/assets/rdpSession-DQon3e98.js.br +0 -0
- package/dist/client/assets/rdpSession-DQon3e98.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-DTjCnJH8.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DTjCnJH8.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BnMPYUjE.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BnMPYUjE.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-AvSI5iFI.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-AvSI5iFI.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DPXyiIKd.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DPXyiIKd.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CER_XOvb.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CER_XOvb.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BdWVez-f.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BdWVez-f.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Bm_Va34_.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BJyO3_8y.js.br +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-C2fV7GHc.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-ocqFrNBu.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-ocqFrNBu.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DOaftoeV.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DOaftoeV.js.gz +0 -0
- package/dist/client/assets/videoCompression-Cu21usMU.js.br +0 -0
- package/dist/client/assets/videoCompression-Cu21usMU.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D__Jujiv.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-D__Jujiv.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DU86_bqa.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DU86_bqa.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 →
|
|
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
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
|
|
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
|
-
|
|
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', () => {
|
|
248
|
-
|
|
249
|
-
|
|
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
|
|
261
|
-
|
|
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.
|
|
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
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
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-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
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.
|
|
44
|
-
|
|
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,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{bA as r}from"./app-1SAb4dhI.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-BtHbt-XD.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-CA8oXFgS.js";import"./gestureArbiter-BvkspAa2.js";import"./triangle-alert-CNoodlX6.js";import"./referenceLongPress-DTjCnJH8.js";import"./DiffReview-aIj4WHDS.js";import"./sparkles-CgwSF-UK.js";import"./DiffViewer-SKlbS7b4.js";import"./ChangeWalkthroughPanel-vh6Z641M.js";function g({content:o}){const e=m.useMemo(()=>n(o.split(`
|
|
2
|
-
`),null,null),[o]);return r.jsx("div",{className:"min-w-0 space-y-3 break-words text-sm leading-6 text-foreground [&_h1]:text-lg [&_h2]:text-base [&_h3]:text-sm [&_pre]:max-w-full [&_table]:text-xs",children:e.map((t,i)=>r.jsx("div",{className:"min-w-0",children:typeof t.content=="function"?t.content(null):t.content},i))})}export{g as default};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as a,C as n}from"./mermaid.core-DbR5q1bj.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as t,C as e}from"./chunk-TICWLB2K-CrSU9J1Y.js";import{d as i}from"./mermaid.core-DbR5q1bj.js";import"./chunk-5VM5RSS4-DT9NVgVz.js";import"./chunk-XXDRQBXY-DvrlcFpp.js";import"./chunk-POPQ4Y6H-CHVqavTY.js";import"./chunk-F27PBJKO-BPQlePZ0.js";import"./purify.es-4eNOHKSq.js";import"./app-1SAb4dhI.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as t,C as e}from"./chunk-TICWLB2K-CrSU9J1Y.js";import{d as i}from"./mermaid.core-DbR5q1bj.js";import"./chunk-5VM5RSS4-DT9NVgVz.js";import"./chunk-XXDRQBXY-DvrlcFpp.js";import"./chunk-POPQ4Y6H-CHVqavTY.js";import"./chunk-F27PBJKO-BPQlePZ0.js";import"./purify.es-4eNOHKSq.js";import"./app-1SAb4dhI.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|