mirror of
https://github.com/sorenisanerd/gotty.git
synced 2024-11-23 12:54:24 +00:00
Use bootstrap components for up- and downloads
This commit is contained in:
parent
736ad294e7
commit
7f05f2fe17
2
LICENSE
2
LICENSE
@ -1,7 +1,7 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2015-2017 Iwasaki Yudai
|
Copyright (c) 2015-2017 Iwasaki Yudai
|
||||||
Copyright (c) 2021 Søren L. Hansen
|
Copyright (c) 2021-2022 Søren L. Hansen
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -6,15 +6,8 @@ html, body, #terminal {
|
|||||||
margin: 0%;
|
margin: 0%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fileDialog {
|
.progress .progress-bar {
|
||||||
position: fixed;
|
transition: unset;
|
||||||
top: 40%;
|
transition-duration: 0.1s;
|
||||||
left: 40%;
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
background-color: lightgray;
|
|
||||||
padding: 20px;
|
|
||||||
border: 10px;
|
|
||||||
border-color: red;
|
|
||||||
border-width: medium;
|
|
||||||
display: none;
|
|
||||||
z-index: 5;
|
|
||||||
}
|
}
|
@ -133,7 +133,8 @@
|
|||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.xterm.xterm-cursor-pointer {
|
.xterm.xterm-cursor-pointer,
|
||||||
|
.xterm .xterm-cursor-pointer {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,3 +169,12 @@
|
|||||||
.xterm-underline {
|
.xterm-underline {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xterm-strikethrough {
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xterm-screen .xterm-decoration-container .xterm-decoration {
|
||||||
|
z-index: 6;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
@ -1,18 +1,22 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
|
<head>
|
||||||
<title>{{ .title }}</title>
|
<title>{{ .title }}</title>
|
||||||
<link rel="manifest" href="manifest.json">
|
<link rel="manifest" href="manifest.json" crossorigin="use-credentials">
|
||||||
<link rel="icon" href="favicon.ico">
|
<link rel="icon" href="favicon.ico">
|
||||||
<link rel="icon" href="icon.svg" type="image/svg+xml">
|
<link rel="icon" href="icon.svg" type="image/svg+xml">
|
||||||
<link rel="stylesheet" href="./css/index.css" />
|
<link rel="stylesheet" href="./css/index.css" />
|
||||||
<link rel="stylesheet" href="./css/xterm.css" />
|
<link rel="stylesheet" href="./css/xterm.css" />
|
||||||
<link rel="stylesheet" href="./css/xterm_customize.css" />
|
<link rel="stylesheet" href="./css/xterm_customize.css" />
|
||||||
</head>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<body>
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
<div id="terminal"></div>
|
<div id="terminal"></div>
|
||||||
<script src="./auth_token.js"></script>
|
<script src="./auth_token.js"></script>
|
||||||
<script src="./config.js"></script>
|
<script src="./config.js"></script>
|
||||||
<script src="./js/gotty.js"></script>
|
<script src="./js/gotty.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
File diff suppressed because one or more lines are too long
@ -1,523 +1,7 @@
|
|||||||
/*!
|
/*!
|
||||||
* crc-32 (https://npmjs.com/package/crc-32)
|
* Bootstrap v5.1.3 (https://getbootstrap.com/)
|
||||||
* @license Apache-2.0
|
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
||||||
* @version 1.2.1
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
* ==crc-32/LICENSE==
|
|
||||||
* Apache License
|
|
||||||
* Version 2.0, January 2004
|
|
||||||
* http://www.apache.org/licenses/
|
|
||||||
*
|
|
||||||
* TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
*
|
|
||||||
* 1. Definitions.
|
|
||||||
*
|
|
||||||
* "License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
* and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
*
|
|
||||||
* "Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
* the copyright owner that is granting the License.
|
|
||||||
*
|
|
||||||
* "Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
* other entities that control, are controlled by, or are under common
|
|
||||||
* control with that entity. For the purposes of this definition,
|
|
||||||
* "control" means (i) the power, direct or indirect, to cause the
|
|
||||||
* direction or management of such entity, whether by contract or
|
|
||||||
* otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
* outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
*
|
|
||||||
* "You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
* exercising permissions granted by this License.
|
|
||||||
*
|
|
||||||
* "Source" form shall mean the preferred form for making modifications,
|
|
||||||
* including but not limited to software source code, documentation
|
|
||||||
* source, and configuration files.
|
|
||||||
*
|
|
||||||
* "Object" form shall mean any form resulting from mechanical
|
|
||||||
* transformation or translation of a Source form, including but
|
|
||||||
* not limited to compiled object code, generated documentation,
|
|
||||||
* and conversions to other media types.
|
|
||||||
*
|
|
||||||
* "Work" shall mean the work of authorship, whether in Source or
|
|
||||||
* Object form, made available under the License, as indicated by a
|
|
||||||
* copyright notice that is included in or attached to the work
|
|
||||||
* (an example is provided in the Appendix below).
|
|
||||||
*
|
|
||||||
* "Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
* form, that is based on (or derived from) the Work and for which the
|
|
||||||
* editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
* represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
* of this License, Derivative Works shall not include works that remain
|
|
||||||
* separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
* the Work and Derivative Works thereof.
|
|
||||||
*
|
|
||||||
* "Contribution" shall mean any work of authorship, including
|
|
||||||
* the original version of the Work and any modifications or additions
|
|
||||||
* to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
* submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
* or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
* the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
* means any form of electronic, verbal, or written communication sent
|
|
||||||
* to the Licensor or its representatives, including but not limited to
|
|
||||||
* communication on electronic mailing lists, source code control systems,
|
|
||||||
* and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
* Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
* excluding communication that is conspicuously marked or otherwise
|
|
||||||
* designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
*
|
|
||||||
* "Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
* on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
* subsequently incorporated within the Work.
|
|
||||||
*
|
|
||||||
* 2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
* this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
* worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
* copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
* publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
* Work and such Derivative Works in Source or Object form.
|
|
||||||
*
|
|
||||||
* 3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
* this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
* worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
* (except as stated in this section) patent license to make, have made,
|
|
||||||
* use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
* where such license applies only to those patent claims licensable
|
|
||||||
* by such Contributor that are necessarily infringed by their
|
|
||||||
* Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
* with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
* institute patent litigation against any entity (including a
|
|
||||||
* cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
* or a Contribution incorporated within the Work constitutes direct
|
|
||||||
* or contributory patent infringement, then any patent licenses
|
|
||||||
* granted to You under this License for that Work shall terminate
|
|
||||||
* as of the date such litigation is filed.
|
|
||||||
*
|
|
||||||
* 4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
* Work or Derivative Works thereof in any medium, with or without
|
|
||||||
* modifications, and in Source or Object form, provided that You
|
|
||||||
* meet the following conditions:
|
|
||||||
*
|
|
||||||
* (a) You must give any other recipients of the Work or
|
|
||||||
* Derivative Works a copy of this License; and
|
|
||||||
*
|
|
||||||
* (b) You must cause any modified files to carry prominent notices
|
|
||||||
* stating that You changed the files; and
|
|
||||||
*
|
|
||||||
* (c) You must retain, in the Source form of any Derivative Works
|
|
||||||
* that You distribute, all copyright, patent, trademark, and
|
|
||||||
* attribution notices from the Source form of the Work,
|
|
||||||
* excluding those notices that do not pertain to any part of
|
|
||||||
* the Derivative Works; and
|
|
||||||
*
|
|
||||||
* (d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
* distribution, then any Derivative Works that You distribute must
|
|
||||||
* include a readable copy of the attribution notices contained
|
|
||||||
* within such NOTICE file, excluding those notices that do not
|
|
||||||
* pertain to any part of the Derivative Works, in at least one
|
|
||||||
* of the following places: within a NOTICE text file distributed
|
|
||||||
* as part of the Derivative Works; within the Source form or
|
|
||||||
* documentation, if provided along with the Derivative Works; or,
|
|
||||||
* within a display generated by the Derivative Works, if and
|
|
||||||
* wherever such third-party notices normally appear. The contents
|
|
||||||
* of the NOTICE file are for informational purposes only and
|
|
||||||
* do not modify the License. You may add Your own attribution
|
|
||||||
* notices within Derivative Works that You distribute, alongside
|
|
||||||
* or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
* that such additional attribution notices cannot be construed
|
|
||||||
* as modifying the License.
|
|
||||||
*
|
|
||||||
* You may add Your own copyright statement to Your modifications and
|
|
||||||
* may provide additional or different license terms and conditions
|
|
||||||
* for use, reproduction, or distribution of Your modifications, or
|
|
||||||
* for any such Derivative Works as a whole, provided Your use,
|
|
||||||
* reproduction, and distribution of the Work otherwise complies with
|
|
||||||
* the conditions stated in this License.
|
|
||||||
*
|
|
||||||
* 5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
* any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
* by You to the Licensor shall be under the terms and conditions of
|
|
||||||
* this License, without any additional terms or conditions.
|
|
||||||
* Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
* the terms of any separate license agreement you may have executed
|
|
||||||
* with Licensor regarding such Contributions.
|
|
||||||
*
|
|
||||||
* 6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
* names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
* except as required for reasonable and customary use in describing the
|
|
||||||
* origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
*
|
|
||||||
* 7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
* agreed to in writing, Licensor provides the Work (and each
|
|
||||||
* Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
* implied, including, without limitation, any warranties or conditions
|
|
||||||
* of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
* appropriateness of using or redistributing the Work and assume any
|
|
||||||
* risks associated with Your exercise of permissions under this License.
|
|
||||||
*
|
|
||||||
* 8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
* whether in tort (including negligence), contract, or otherwise,
|
|
||||||
* unless required by applicable law (such as deliberate and grossly
|
|
||||||
* negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
* liable to You for damages, including any direct, indirect, special,
|
|
||||||
* incidental, or consequential damages of any character arising as a
|
|
||||||
* result of this License or out of the use or inability to use the
|
|
||||||
* Work (including but not limited to damages for loss of goodwill,
|
|
||||||
* work stoppage, computer failure or malfunction, or any and all
|
|
||||||
* other commercial damages or losses), even if such Contributor
|
|
||||||
* has been advised of the possibility of such damages.
|
|
||||||
*
|
|
||||||
* 9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
* the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
* and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
* or other liability obligations and/or rights consistent with this
|
|
||||||
* License. However, in accepting such obligations, You may act only
|
|
||||||
* on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
* of any other Contributor, and only if You agree to indemnify,
|
|
||||||
* defend, and hold each Contributor harmless for any liability
|
|
||||||
* incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
* of your accepting any such warranty or additional liability.
|
|
||||||
*
|
|
||||||
* END OF TERMS AND CONDITIONS
|
|
||||||
*
|
|
||||||
* APPENDIX: How to apply the Apache License to your work.
|
|
||||||
*
|
|
||||||
* To apply the Apache License to your work, attach the following
|
|
||||||
* boilerplate notice, with the fields enclosed by brackets "{}"
|
|
||||||
* replaced with your own identifying information. (Don't include
|
|
||||||
* the brackets!) The text should be enclosed in the appropriate
|
|
||||||
* comment syntax for the file format. We also recommend that a
|
|
||||||
* file or class name and description of purpose be included on the
|
|
||||||
* same "printed page" as the copyright notice for easier
|
|
||||||
* identification within third-party archives.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2014-present SheetJS LLC
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* xterm (https://npmjs.com/package/xterm)
|
|
||||||
* @license MIT
|
|
||||||
* @version 4.12.0
|
|
||||||
* ==xterm/LICENSE==
|
|
||||||
* Copyright (c) 2017-2019, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
|
||||||
* Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com)
|
|
||||||
* Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/)
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* xterm-addon-fit (https://npmjs.com/package/xterm-addon-fit)
|
|
||||||
* @license MIT
|
|
||||||
* @version 0.5.0
|
|
||||||
* ==xterm-addon-fit/LICENSE==
|
|
||||||
* Copyright (c) 2019, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* xterm-addon-web-links (https://npmjs.com/package/xterm-addon-web-links)
|
|
||||||
* @license MIT
|
|
||||||
* @version 0.4.0
|
|
||||||
* ==xterm-addon-web-links/LICENSE==
|
|
||||||
* Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* xterm-addon-webgl (https://npmjs.com/package/xterm-addon-webgl)
|
|
||||||
* @license MIT
|
|
||||||
* @version 0.10.0
|
|
||||||
* ==xterm-addon-webgl/LICENSE==
|
|
||||||
* Copyright (c) 2018, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* zmodem.js (https://npmjs.com/package/zmodem.js)
|
|
||||||
* @license Apache-2.0
|
|
||||||
* @version 0.1.10
|
|
||||||
* ==zmodem.js/LICENSE==
|
|
||||||
* Apache License
|
|
||||||
* Version 2.0, January 2004
|
|
||||||
* http://www.apache.org/licenses/
|
|
||||||
*
|
|
||||||
* TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
*
|
|
||||||
* 1. Definitions.
|
|
||||||
*
|
|
||||||
* "License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
* and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
*
|
|
||||||
* "Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
* the copyright owner that is granting the License.
|
|
||||||
*
|
|
||||||
* "Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
* other entities that control, are controlled by, or are under common
|
|
||||||
* control with that entity. For the purposes of this definition,
|
|
||||||
* "control" means (i) the power, direct or indirect, to cause the
|
|
||||||
* direction or management of such entity, whether by contract or
|
|
||||||
* otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
* outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
*
|
|
||||||
* "You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
* exercising permissions granted by this License.
|
|
||||||
*
|
|
||||||
* "Source" form shall mean the preferred form for making modifications,
|
|
||||||
* including but not limited to software source code, documentation
|
|
||||||
* source, and configuration files.
|
|
||||||
*
|
|
||||||
* "Object" form shall mean any form resulting from mechanical
|
|
||||||
* transformation or translation of a Source form, including but
|
|
||||||
* not limited to compiled object code, generated documentation,
|
|
||||||
* and conversions to other media types.
|
|
||||||
*
|
|
||||||
* "Work" shall mean the work of authorship, whether in Source or
|
|
||||||
* Object form, made available under the License, as indicated by a
|
|
||||||
* copyright notice that is included in or attached to the work
|
|
||||||
* (an example is provided in the Appendix below).
|
|
||||||
*
|
|
||||||
* "Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
* form, that is based on (or derived from) the Work and for which the
|
|
||||||
* editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
* represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
* of this License, Derivative Works shall not include works that remain
|
|
||||||
* separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
* the Work and Derivative Works thereof.
|
|
||||||
*
|
|
||||||
* "Contribution" shall mean any work of authorship, including
|
|
||||||
* the original version of the Work and any modifications or additions
|
|
||||||
* to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
* submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
* or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
* the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
* means any form of electronic, verbal, or written communication sent
|
|
||||||
* to the Licensor or its representatives, including but not limited to
|
|
||||||
* communication on electronic mailing lists, source code control systems,
|
|
||||||
* and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
* Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
* excluding communication that is conspicuously marked or otherwise
|
|
||||||
* designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
*
|
|
||||||
* "Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
* on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
* subsequently incorporated within the Work.
|
|
||||||
*
|
|
||||||
* 2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
* this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
* worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
* copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
* publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
* Work and such Derivative Works in Source or Object form.
|
|
||||||
*
|
|
||||||
* 3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
* this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
* worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
* (except as stated in this section) patent license to make, have made,
|
|
||||||
* use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
* where such license applies only to those patent claims licensable
|
|
||||||
* by such Contributor that are necessarily infringed by their
|
|
||||||
* Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
* with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
* institute patent litigation against any entity (including a
|
|
||||||
* cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
* or a Contribution incorporated within the Work constitutes direct
|
|
||||||
* or contributory patent infringement, then any patent licenses
|
|
||||||
* granted to You under this License for that Work shall terminate
|
|
||||||
* as of the date such litigation is filed.
|
|
||||||
*
|
|
||||||
* 4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
* Work or Derivative Works thereof in any medium, with or without
|
|
||||||
* modifications, and in Source or Object form, provided that You
|
|
||||||
* meet the following conditions:
|
|
||||||
*
|
|
||||||
* (a) You must give any other recipients of the Work or
|
|
||||||
* Derivative Works a copy of this License; and
|
|
||||||
*
|
|
||||||
* (b) You must cause any modified files to carry prominent notices
|
|
||||||
* stating that You changed the files; and
|
|
||||||
*
|
|
||||||
* (c) You must retain, in the Source form of any Derivative Works
|
|
||||||
* that You distribute, all copyright, patent, trademark, and
|
|
||||||
* attribution notices from the Source form of the Work,
|
|
||||||
* excluding those notices that do not pertain to any part of
|
|
||||||
* the Derivative Works; and
|
|
||||||
*
|
|
||||||
* (d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
* distribution, then any Derivative Works that You distribute must
|
|
||||||
* include a readable copy of the attribution notices contained
|
|
||||||
* within such NOTICE file, excluding those notices that do not
|
|
||||||
* pertain to any part of the Derivative Works, in at least one
|
|
||||||
* of the following places: within a NOTICE text file distributed
|
|
||||||
* as part of the Derivative Works; within the Source form or
|
|
||||||
* documentation, if provided along with the Derivative Works; or,
|
|
||||||
* within a display generated by the Derivative Works, if and
|
|
||||||
* wherever such third-party notices normally appear. The contents
|
|
||||||
* of the NOTICE file are for informational purposes only and
|
|
||||||
* do not modify the License. You may add Your own attribution
|
|
||||||
* notices within Derivative Works that You distribute, alongside
|
|
||||||
* or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
* that such additional attribution notices cannot be construed
|
|
||||||
* as modifying the License.
|
|
||||||
*
|
|
||||||
* You may add Your own copyright statement to Your modifications and
|
|
||||||
* may provide additional or different license terms and conditions
|
|
||||||
* for use, reproduction, or distribution of Your modifications, or
|
|
||||||
* for any such Derivative Works as a whole, provided Your use,
|
|
||||||
* reproduction, and distribution of the Work otherwise complies with
|
|
||||||
* the conditions stated in this License.
|
|
||||||
*
|
|
||||||
* 5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
* any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
* by You to the Licensor shall be under the terms and conditions of
|
|
||||||
* this License, without any additional terms or conditions.
|
|
||||||
* Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
* the terms of any separate license agreement you may have executed
|
|
||||||
* with Licensor regarding such Contributions.
|
|
||||||
*
|
|
||||||
* 6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
* names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
* except as required for reasonable and customary use in describing the
|
|
||||||
* origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
*
|
|
||||||
* 7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
* agreed to in writing, Licensor provides the Work (and each
|
|
||||||
* Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
* implied, including, without limitation, any warranties or conditions
|
|
||||||
* of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
* appropriateness of using or redistributing the Work and assume any
|
|
||||||
* risks associated with Your exercise of permissions under this License.
|
|
||||||
*
|
|
||||||
* 8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
* whether in tort (including negligence), contract, or otherwise,
|
|
||||||
* unless required by applicable law (such as deliberate and grossly
|
|
||||||
* negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
* liable to You for damages, including any direct, indirect, special,
|
|
||||||
* incidental, or consequential damages of any character arising as a
|
|
||||||
* result of this License or out of the use or inability to use the
|
|
||||||
* Work (including but not limited to damages for loss of goodwill,
|
|
||||||
* work stoppage, computer failure or malfunction, or any and all
|
|
||||||
* other commercial damages or losses), even if such Contributor
|
|
||||||
* has been advised of the possibility of such damages.
|
|
||||||
*
|
|
||||||
* 9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
* the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
* and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
* or other liability obligations and/or rights consistent with this
|
|
||||||
* License. However, in accepting such obligations, You may act only
|
|
||||||
* on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
* of any other Contributor, and only if You agree to indemnify,
|
|
||||||
* defend, and hold each Contributor harmless for any liability
|
|
||||||
* incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
* of your accepting any such warranty or additional liability.
|
|
||||||
*
|
|
||||||
* END OF TERMS AND CONDITIONS
|
|
||||||
*
|
|
||||||
* APPENDIX: How to apply the Apache License to your work.
|
|
||||||
*
|
|
||||||
* To apply the Apache License to your work, attach the following
|
|
||||||
* boilerplate notice, with the fields enclosed by brackets "{}"
|
|
||||||
* replaced with your own identifying information. (Don't include
|
|
||||||
* the brackets!) The text should be enclosed in the appropriate
|
|
||||||
* comment syntax for the file format. We also recommend that a
|
|
||||||
* file or class name and description of purpose be included on the
|
|
||||||
* same "printed page" as the copyright notice for easier
|
|
||||||
* identification within third-party archives.
|
|
||||||
*
|
|
||||||
* Copyright {yyyy} {name of copyright owner}
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
/*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
||||||
|
File diff suppressed because one or more lines are too long
650
bindata/static/js/gotty.licenses.txt
Normal file
650
bindata/static/js/gotty.licenses.txt
Normal file
@ -0,0 +1,650 @@
|
|||||||
|
@popperjs/core
|
||||||
|
MIT
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2019 Federico Zivolo
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
bootstrap
|
||||||
|
MIT
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2011-2021 Twitter, Inc.
|
||||||
|
Copyright (c) 2011-2021 The Bootstrap Authors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
crc-32
|
||||||
|
Apache-2.0
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright (C) 2014-present SheetJS LLC
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
|
css-loader
|
||||||
|
MIT
|
||||||
|
Copyright JS Foundation and other contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
jsx-runtime
|
||||||
|
MIT
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015-present Jason Miller
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
preact
|
||||||
|
MIT
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015-present Jason Miller
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
style-loader
|
||||||
|
MIT
|
||||||
|
Copyright JS Foundation and other contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
xterm
|
||||||
|
MIT
|
||||||
|
Copyright (c) 2017-2019, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
||||||
|
Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com)
|
||||||
|
Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
xterm-addon-fit
|
||||||
|
MIT
|
||||||
|
Copyright (c) 2019, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
xterm-addon-web-links
|
||||||
|
MIT
|
||||||
|
Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
xterm-addon-webgl
|
||||||
|
MIT
|
||||||
|
Copyright (c) 2018, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
zmodem.js
|
||||||
|
Apache-2.0
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright {yyyy} {name of copyright owner}
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
6262
js/package-lock.json
generated
6262
js/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -3,14 +3,27 @@
|
|||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/bootstrap": "^5.1.9",
|
||||||
|
"compression-webpack-plugin": "^9.2.0",
|
||||||
"license-loader": "^0.5.0",
|
"license-loader": "^0.5.0",
|
||||||
|
"license-webpack-plugin": "^4.0.2",
|
||||||
|
"purgecss": "^4.1.3",
|
||||||
|
"sass": "^1.50.0",
|
||||||
|
"sass-loader": "^12.6.0",
|
||||||
|
"terser-webpack-plugin": "^5.3.1",
|
||||||
"ts-loader": "^8.3.0",
|
"ts-loader": "^8.3.0",
|
||||||
"typescript": "^4.3.2",
|
"typescript": "^4.3.2",
|
||||||
"webpack": "^5.38.1",
|
"webpack": "^5.72.0",
|
||||||
"webpack-cli": "^4.7.0"
|
"webpack-cli": "^4.7.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@popperjs/core": "^2.11.5",
|
||||||
|
"bootstrap": "^5.1.3",
|
||||||
"css-loader": "^5.2.6",
|
"css-loader": "^5.2.6",
|
||||||
|
"debounce": "^1.2.1",
|
||||||
|
"node-sass": "^7.0.1",
|
||||||
|
"preact": "^10.7.1",
|
||||||
|
"react-bootstrap": "^2.2.3",
|
||||||
"style-loader": "^2.0.0",
|
"style-loader": "^2.0.0",
|
||||||
"xterm": "^4.12.0",
|
"xterm": "^4.12.0",
|
||||||
"xterm-addon-fit": "^0.5.0",
|
"xterm-addon-fit": "^0.5.0",
|
||||||
|
64
js/src/MyModal.tsx
Normal file
64
js/src/MyModal.tsx
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import { createRef, Component, ComponentChildren } from "preact";
|
||||||
|
import { Modal } from "bootstrap";
|
||||||
|
import 'bootstrap/dist/css/bootstrap.min.css';
|
||||||
|
//import './bootstrap.scss';
|
||||||
|
|
||||||
|
interface ModalProps {
|
||||||
|
children: ComponentChildren;
|
||||||
|
buttons?: ComponentChildren;
|
||||||
|
title: string;
|
||||||
|
dismissHandler?: (hideModal?: () => void) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MyModal extends Component<ModalProps, {}> {
|
||||||
|
ref = createRef<HTMLDivElement>();
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
Modal.getOrCreateInstance(this.ref.current!).show();
|
||||||
|
this.ref.current?.addEventListener('hide.bs.modal', () => { this.props.dismissHandler && this.props.dismissHandler(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
hide(): void {
|
||||||
|
Modal.getOrCreateInstance(this.ref.current!).hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return <div class="modal fade" ref={this.ref} tabIndex={-1} aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">{this.props.title}</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
{this.props.children}
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
{this.props.buttons}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ButtonProps {
|
||||||
|
priority: "primary" | "secondary" | "danger"
|
||||||
|
clickHandler?: () => void
|
||||||
|
children: ComponentChildren
|
||||||
|
disabled?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Button(props:ButtonProps) {
|
||||||
|
let classes: string = "btn btn-" + props.priority
|
||||||
|
|
||||||
|
return <button type="button" disabled={props.disabled} class={classes} onClick={ () => { props.clickHandler ? props.clickHandler() : null; }}>{ props.children}</button>
|
||||||
|
}
|
27
js/src/bootstrap.scss
vendored
Normal file
27
js/src/bootstrap.scss
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*!
|
||||||
|
* Bootstrap v5.1.3 (https://getbootstrap.com/)
|
||||||
|
* Copyright 2011-2021 The Bootstrap Authors
|
||||||
|
* Copyright 2011-2021 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// scss-docs-start import-stack
|
||||||
|
// Configuration
|
||||||
|
@import "functions";
|
||||||
|
@import "variables";
|
||||||
|
@import "mixins";
|
||||||
|
@import "utilities";
|
||||||
|
|
||||||
|
// Layout & components
|
||||||
|
@import "root";
|
||||||
|
@import "reboot";
|
||||||
|
@import "type";
|
||||||
|
@import "images";
|
||||||
|
@import "containers";
|
||||||
|
@import "grid";
|
||||||
|
@import "buttons";
|
||||||
|
@import "transitions";
|
||||||
|
@import "progress";
|
||||||
|
@import "close";
|
||||||
|
@import "modal";
|
||||||
|
@import "spinners";
|
@ -1,4 +1,4 @@
|
|||||||
import { Xterm } from "./xterm";
|
import { OurXterm } from "./xterm";
|
||||||
import { Terminal, WebTTY, protocols } from "./webtty";
|
import { Terminal, WebTTY, protocols } from "./webtty";
|
||||||
import { ConnectionFactory } from "./websocket";
|
import { ConnectionFactory } from "./websocket";
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ const elem = document.getElementById("terminal")
|
|||||||
|
|
||||||
if (elem !== null) {
|
if (elem !== null) {
|
||||||
var term: Terminal;
|
var term: Terminal;
|
||||||
term = new Xterm(elem);
|
term = new OurXterm(elem);
|
||||||
|
|
||||||
const httpsEnabled = window.location.protocol == "https:";
|
const httpsEnabled = window.location.protocol == "https:";
|
||||||
const url = (httpsEnabled ? 'wss://' : 'ws://') + window.location.host + window.location.pathname + 'ws';
|
const url = (httpsEnabled ? 'wss://' : 'ws://') + window.location.host + window.location.pathname + 'ws';
|
||||||
@ -19,6 +19,9 @@ if (elem !== null) {
|
|||||||
const wt = new WebTTY(term, factory, args, gotty_auth_token);
|
const wt = new WebTTY(term, factory, args, gotty_auth_token);
|
||||||
const closer = wt.open();
|
const closer = wt.open();
|
||||||
|
|
||||||
|
// According to https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event
|
||||||
|
// this event is unreliable and in some cases (Firefox is mentioned), having an
|
||||||
|
// "unload" event handler can have unwanted side effects. Consider commenting it out.
|
||||||
window.addEventListener("unload", () => {
|
window.addEventListener("unload", () => {
|
||||||
closer();
|
closer();
|
||||||
term.close();
|
term.close();
|
||||||
|
@ -15,7 +15,6 @@ export class ConnectionFactory {
|
|||||||
export class Connection {
|
export class Connection {
|
||||||
bare: WebSocket;
|
bare: WebSocket;
|
||||||
|
|
||||||
|
|
||||||
constructor(url: string, protocols: string[]) {
|
constructor(url: string, protocols: string[]) {
|
||||||
this.bare = new WebSocket(url, protocols);
|
this.bare = new WebSocket(url, protocols);
|
||||||
}
|
}
|
||||||
|
277
js/src/webtty.ts
277
js/src/webtty.ts
@ -1,277 +0,0 @@
|
|||||||
import * as Zmodem from 'zmodem.js/src/zmodem_browser';
|
|
||||||
|
|
||||||
export const protocols = ["webtty"];
|
|
||||||
|
|
||||||
export const msgInputUnknown = '0';
|
|
||||||
export const msgInput = '1';
|
|
||||||
export const msgPing = '2';
|
|
||||||
export const msgResizeTerminal = '3';
|
|
||||||
|
|
||||||
export const msgUnknownOutput = '0';
|
|
||||||
export const msgOutput = '1';
|
|
||||||
export const msgPong = '2';
|
|
||||||
export const msgSetWindowTitle = '3';
|
|
||||||
export const msgSetPreferences = '4';
|
|
||||||
export const msgSetReconnect = '5';
|
|
||||||
export const msgSetBufferSize = '6';
|
|
||||||
|
|
||||||
|
|
||||||
export interface Terminal {
|
|
||||||
info(): { columns: number, rows: number };
|
|
||||||
output(data: string): void;
|
|
||||||
showMessage(message: string, timeout: number): void;
|
|
||||||
getMessage(): HTMLElement;
|
|
||||||
removeMessage(): void;
|
|
||||||
setWindowTitle(title: string): void;
|
|
||||||
setPreferences(value: object): void;
|
|
||||||
onInput(callback: (input: string) => void): void;
|
|
||||||
onResize(callback: (colmuns: number, rows: number) => void): void;
|
|
||||||
reset(): void;
|
|
||||||
deactivate(): void;
|
|
||||||
close(): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Connection {
|
|
||||||
open(): void;
|
|
||||||
close(): void;
|
|
||||||
send(data: string): void;
|
|
||||||
isOpen(): boolean;
|
|
||||||
onOpen(callback: () => void): void;
|
|
||||||
onReceive(callback: (data: string) => void): void;
|
|
||||||
onClose(callback: () => void): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ConnectionFactory {
|
|
||||||
create(): Connection;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export class WebTTY {
|
|
||||||
term: Terminal;
|
|
||||||
connectionFactory: ConnectionFactory;
|
|
||||||
connection: Connection;
|
|
||||||
args: string;
|
|
||||||
authToken: string;
|
|
||||||
reconnect: number;
|
|
||||||
bufSize: number;
|
|
||||||
sentry: Zmodem.Sentry;
|
|
||||||
|
|
||||||
constructor(term: Terminal, connectionFactory: ConnectionFactory, args: string, authToken: string) {
|
|
||||||
this.term = term;
|
|
||||||
this.connectionFactory = connectionFactory;
|
|
||||||
this.args = args;
|
|
||||||
this.authToken = authToken;
|
|
||||||
this.reconnect = -1;
|
|
||||||
this.bufSize = 1024;
|
|
||||||
|
|
||||||
this.sentry = new Zmodem.Sentry({
|
|
||||||
'to_terminal': (d: any) => this.term.output(d),
|
|
||||||
'on_detect': (detection: Zmodem.Detection) => this.zmodemDetect(detection),
|
|
||||||
'sender': (x: Uint8Array) => this.sendInput(x),
|
|
||||||
'on_retract': (x: any) => alert("never mind!"),
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
private zmodemDetect(detection: Zmodem.Detection) {
|
|
||||||
var zsession = detection.confirm();
|
|
||||||
|
|
||||||
if (zsession.type === "send") {
|
|
||||||
this.zmodemSend(zsession);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
zsession.on("offer", (xfer: any) => this.zmodemOffer(xfer));
|
|
||||||
zsession.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private zmodemSend(zsession: any) {
|
|
||||||
let dialog = this.getFileSendDialog();
|
|
||||||
dialog.style.display = 'block';
|
|
||||||
|
|
||||||
let selector = document.getElementById("sendFileSelector");
|
|
||||||
if (selector != null) {
|
|
||||||
selector.onchange = (event) => {
|
|
||||||
Zmodem.Browser.send_files(zsession, (event.target as HTMLInputElement).files)
|
|
||||||
.then(() => zsession.close())
|
|
||||||
.catch(e => console.log(e));
|
|
||||||
dialog.style.display = 'none';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private zmodemOffer(xfer: Zmodem.Offer) {
|
|
||||||
var dialog = this.getFileAcceptanceDialog();
|
|
||||||
dialog.style.display = 'block';
|
|
||||||
|
|
||||||
var filenameElem = document.getElementById("filename");
|
|
||||||
if (filenameElem != null) {
|
|
||||||
filenameElem.textContent = xfer.get_details().name;
|
|
||||||
}
|
|
||||||
var sizeElem = document.getElementById("filesize");
|
|
||||||
if (sizeElem != null) {
|
|
||||||
sizeElem.textContent = xfer.get_details().size;
|
|
||||||
}
|
|
||||||
var skipLink = document.getElementById("skipTransfer");
|
|
||||||
if (skipLink != null) {
|
|
||||||
skipLink.onclick = (ev) => {
|
|
||||||
xfer.skip();
|
|
||||||
dialog.style.display = 'none';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var acceptLink = document.getElementById("acceptTransfer");
|
|
||||||
if (acceptLink != null) {
|
|
||||||
acceptLink.onclick = (ev) => {
|
|
||||||
dialog.style.display = 'none';
|
|
||||||
xfer.accept().then((payloads: any) => {
|
|
||||||
//Now you need some mechanism to save the file.
|
|
||||||
//An example of how you can do this in a browser:
|
|
||||||
Zmodem.Browser.save_to_disk(
|
|
||||||
payloads,
|
|
||||||
xfer.get_details().name
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private sendInput(input: string | Uint8Array) {
|
|
||||||
let effectiveBufferSize = this.bufSize - 1;
|
|
||||||
let dataString: string
|
|
||||||
|
|
||||||
if (Array.isArray(input)) {
|
|
||||||
dataString = String.fromCharCode.apply(null, input);
|
|
||||||
} else {
|
|
||||||
dataString = (input as string);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Account for base64 encoding
|
|
||||||
let maxChunkSize = Math.floor(effectiveBufferSize / 4)*3;
|
|
||||||
|
|
||||||
for (let i = 0; i < Math.ceil(dataString.length / maxChunkSize); i++) {
|
|
||||||
let inputChunk = dataString.substring(i * maxChunkSize, Math.min((i + 1) * maxChunkSize, dataString.length))
|
|
||||||
this.connection.send(msgInput + btoa(inputChunk));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileAcceptanceDialog(): HTMLElement {
|
|
||||||
let dialog = document.getElementById("acceptFileDialog");
|
|
||||||
if (dialog == null) {
|
|
||||||
dialog = document.createElement("div");
|
|
||||||
dialog.id = 'acceptFileDialog';
|
|
||||||
dialog.className = 'fileDialog';
|
|
||||||
dialog.innerHTML = '<p>Incoming file transfer: <tt id="filename"></tt> (<span id="filesize"></span> bytes)</p><a id="acceptTransfer" href="#">Accept</a> <a id="skipTransfer" href="#">Decline</a>';
|
|
||||||
document.body.appendChild(dialog);
|
|
||||||
}
|
|
||||||
return dialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
getFileSendDialog(): HTMLElement {
|
|
||||||
let dialog = document.getElementById("sendFileDialog");
|
|
||||||
if (dialog == null) {
|
|
||||||
dialog = document.createElement("div");
|
|
||||||
dialog.id = 'sendFileDialog';
|
|
||||||
dialog.className = 'fileDialog';
|
|
||||||
dialog.innerHTML = '<p>Remote ready to receive files. <input id="sendFileSelector" class="file-input" type="file" multiple="" /></p>';
|
|
||||||
document.body.appendChild(dialog);
|
|
||||||
}
|
|
||||||
return dialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
open() {
|
|
||||||
let connection = this.connectionFactory.create();
|
|
||||||
let pingTimer: NodeJS.Timeout;
|
|
||||||
let reconnectTimeout: NodeJS.Timeout;
|
|
||||||
this.connection = connection;
|
|
||||||
|
|
||||||
const setup = () => {
|
|
||||||
connection.onOpen(() => {
|
|
||||||
const termInfo = this.term.info();
|
|
||||||
|
|
||||||
connection.send(JSON.stringify(
|
|
||||||
{
|
|
||||||
Arguments: this.args,
|
|
||||||
AuthToken: this.authToken,
|
|
||||||
}
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
const resizeHandler = (colmuns: number, rows: number) => {
|
|
||||||
connection.send(
|
|
||||||
msgResizeTerminal + JSON.stringify(
|
|
||||||
{
|
|
||||||
columns: colmuns,
|
|
||||||
rows: rows
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.term.onResize(resizeHandler);
|
|
||||||
resizeHandler(termInfo.columns, termInfo.rows);
|
|
||||||
|
|
||||||
// Set encoding to base64 (TODO: Fix this up)
|
|
||||||
connection.send("4base64");
|
|
||||||
|
|
||||||
this.term.onInput(
|
|
||||||
(input: string) => {
|
|
||||||
this.sendInput(input);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
pingTimer = setInterval(() => {
|
|
||||||
connection.send(msgPing)
|
|
||||||
}, 30 * 1000);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
connection.onReceive((data) => {
|
|
||||||
const payload = data.slice(1);
|
|
||||||
switch (data[0]) {
|
|
||||||
case msgOutput:
|
|
||||||
this.sentry.consume(Uint8Array.from(atob(payload), c => c.charCodeAt(0)));
|
|
||||||
break;
|
|
||||||
case msgPong:
|
|
||||||
break;
|
|
||||||
case msgSetWindowTitle:
|
|
||||||
this.term.setWindowTitle(payload);
|
|
||||||
break;
|
|
||||||
case msgSetPreferences:
|
|
||||||
const preferences = JSON.parse(payload);
|
|
||||||
this.term.setPreferences(preferences);
|
|
||||||
break;
|
|
||||||
case msgSetReconnect:
|
|
||||||
const autoReconnect = JSON.parse(payload);
|
|
||||||
console.log("Enabling reconnect: " + autoReconnect + " seconds")
|
|
||||||
this.reconnect = autoReconnect;
|
|
||||||
break;
|
|
||||||
case msgSetBufferSize:
|
|
||||||
const bufSize = JSON.parse(payload);
|
|
||||||
this.bufSize = bufSize;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
connection.onClose(() => {
|
|
||||||
clearInterval(pingTimer);
|
|
||||||
this.term.deactivate();
|
|
||||||
this.term.showMessage("Connection Closed", 0);
|
|
||||||
if (this.reconnect > 0) {
|
|
||||||
reconnectTimeout = setTimeout(() => {
|
|
||||||
connection = this.connectionFactory.create();
|
|
||||||
this.term.reset();
|
|
||||||
setup();
|
|
||||||
}, this.reconnect * 1000);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
connection.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
setup();
|
|
||||||
return () => {
|
|
||||||
clearTimeout(reconnectTimeout);
|
|
||||||
connection.close();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
270
js/src/webtty.tsx
Normal file
270
js/src/webtty.tsx
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
export const protocols = ["webtty"];
|
||||||
|
|
||||||
|
export const msgInputUnknown = '0';
|
||||||
|
export const msgInput = '1';
|
||||||
|
export const msgPing = '2';
|
||||||
|
export const msgResizeTerminal = '3';
|
||||||
|
export const msgSetEncoding = '4';
|
||||||
|
|
||||||
|
export const msgUnknownOutput = '0';
|
||||||
|
export const msgOutput = '1';
|
||||||
|
export const msgPong = '2';
|
||||||
|
export const msgSetWindowTitle = '3';
|
||||||
|
export const msgSetPreferences = '4';
|
||||||
|
export const msgSetReconnect = '5';
|
||||||
|
export const msgSetBufferSize = '6';
|
||||||
|
|
||||||
|
|
||||||
|
export interface Terminal {
|
||||||
|
/*
|
||||||
|
* Get dimensions of the terminal
|
||||||
|
*/
|
||||||
|
info(): { columns: number, rows: number };
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process output from the server side
|
||||||
|
*/
|
||||||
|
output(data: Uint8Array): void;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a message overlay on the terminal
|
||||||
|
*/
|
||||||
|
showMessage(message: string, timeout: number): void;
|
||||||
|
|
||||||
|
// Don't think we need this anymore
|
||||||
|
// getMessage(): HTMLElement;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove message shown by shoMessage. You only need to call
|
||||||
|
* this if you want to dismiss it sooner than the timeout.
|
||||||
|
*/
|
||||||
|
removeMessage(): void;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set window title
|
||||||
|
*/
|
||||||
|
setWindowTitle(title: string): void;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set preferences. TODO: Add typings
|
||||||
|
*/
|
||||||
|
setPreferences(value: object): void;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sets an input (e.g. user types something) handler
|
||||||
|
*/
|
||||||
|
onInput(callback: (input: string) => void): void;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sets a resize handler
|
||||||
|
*/
|
||||||
|
onResize(callback: (colmuns: number, rows: number) => void): void;
|
||||||
|
|
||||||
|
reset(): void;
|
||||||
|
deactivate(): void;
|
||||||
|
close(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Connection {
|
||||||
|
open(): void;
|
||||||
|
close(): void;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This takes fucking strings??
|
||||||
|
*/
|
||||||
|
send(s: string): void;
|
||||||
|
|
||||||
|
isOpen(): boolean;
|
||||||
|
onOpen(callback: () => void): void;
|
||||||
|
onReceive(callback: (data: string) => void): void;
|
||||||
|
onClose(callback: () => void): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ConnectionFactory {
|
||||||
|
create(): Connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class WebTTY {
|
||||||
|
/*
|
||||||
|
* A terminal instance that implements the Terminal interface.
|
||||||
|
* This made a lot of sense when we had both HTerm and xterm, but
|
||||||
|
* now I wonder if the abstraction makes sense. Keeping it for now,
|
||||||
|
* though.
|
||||||
|
*/
|
||||||
|
term: Terminal;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ConnectionFactory and connection instance. We pass the factory
|
||||||
|
* in instead of just a connection so that we can reconnect.
|
||||||
|
*/
|
||||||
|
connectionFactory: ConnectionFactory;
|
||||||
|
connection: Connection;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arguments passed in by the user. We forward them to the backend
|
||||||
|
* where they are appended to the command line.
|
||||||
|
*/
|
||||||
|
args: string;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An authentication token. The client gets this from `/auth_token.js`.
|
||||||
|
*/
|
||||||
|
authToken: string;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If connection is dropped, reconnect after `reconnect` seconds.
|
||||||
|
* -1 means do not reconnect.
|
||||||
|
*/
|
||||||
|
reconnect: number;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The server's buffer size. If a single message exceeds this size, it will
|
||||||
|
* be truncated on the server, so we track it here so that we can split messages
|
||||||
|
* into chunks small enough that we don't hurt the server's feelings.
|
||||||
|
*/
|
||||||
|
bufSize: number;
|
||||||
|
|
||||||
|
constructor(term: Terminal, connectionFactory: ConnectionFactory, args: string, authToken: string) {
|
||||||
|
this.term = term;
|
||||||
|
this.connectionFactory = connectionFactory;
|
||||||
|
this.args = args;
|
||||||
|
this.authToken = authToken;
|
||||||
|
this.reconnect = -1;
|
||||||
|
this.bufSize = 1024;
|
||||||
|
};
|
||||||
|
|
||||||
|
open() {
|
||||||
|
let connection = this.connectionFactory.create();
|
||||||
|
let pingTimer: NodeJS.Timeout;
|
||||||
|
let reconnectTimeout: NodeJS.Timeout;
|
||||||
|
this.connection = connection;
|
||||||
|
|
||||||
|
const setup = () => {
|
||||||
|
connection.onOpen(() => {
|
||||||
|
const termInfo = this.term.info();
|
||||||
|
|
||||||
|
this.initializeConnection(this.args, this.authToken);
|
||||||
|
|
||||||
|
this.term.onResize((columns: number, rows: number) => {
|
||||||
|
this.sendResizeTerminal(columns, rows);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.sendResizeTerminal(termInfo.columns, termInfo.rows);
|
||||||
|
|
||||||
|
this.sendSetEncoding("base64");
|
||||||
|
|
||||||
|
this.term.onInput(
|
||||||
|
(input: string | Uint8Array) => {
|
||||||
|
this.sendInput(input);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
pingTimer = setInterval(() => {
|
||||||
|
this.sendPing()
|
||||||
|
}, 30 * 1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.onReceive((data) => {
|
||||||
|
const payload = data.slice(1);
|
||||||
|
switch (data[0]) {
|
||||||
|
case msgOutput:
|
||||||
|
this.term.output(Uint8Array.from(atob(payload), c => c.charCodeAt(0)));
|
||||||
|
break;
|
||||||
|
case msgPong:
|
||||||
|
break;
|
||||||
|
case msgSetWindowTitle:
|
||||||
|
this.term.setWindowTitle(payload);
|
||||||
|
break;
|
||||||
|
case msgSetPreferences:
|
||||||
|
const preferences = JSON.parse(payload);
|
||||||
|
this.term.setPreferences(preferences);
|
||||||
|
break;
|
||||||
|
case msgSetReconnect:
|
||||||
|
const autoReconnect = JSON.parse(payload);
|
||||||
|
console.log("Enabling reconnect: " + autoReconnect + " seconds")
|
||||||
|
this.reconnect = autoReconnect;
|
||||||
|
break;
|
||||||
|
case msgSetBufferSize:
|
||||||
|
const bufSize = JSON.parse(payload);
|
||||||
|
this.bufSize = bufSize;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.onClose(() => {
|
||||||
|
clearInterval(pingTimer);
|
||||||
|
this.term.deactivate();
|
||||||
|
this.term.showMessage("Connection Closed", 0);
|
||||||
|
if (this.reconnect > 0) {
|
||||||
|
reconnectTimeout = setTimeout(() => {
|
||||||
|
connection = this.connectionFactory.create();
|
||||||
|
this.term.reset();
|
||||||
|
setup();
|
||||||
|
}, this.reconnect * 1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
setup();
|
||||||
|
return () => {
|
||||||
|
clearTimeout(reconnectTimeout);
|
||||||
|
connection.close();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private initializeConnection(args, authToken) {
|
||||||
|
this.connection.send(JSON.stringify(
|
||||||
|
{
|
||||||
|
Arguments: args,
|
||||||
|
AuthToken: authToken,
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sendInput sends data to the server. It accepts strings or Uint8Arrays.
|
||||||
|
* strings will be encoded as UTF-8. Uint8Arrays are passed along as-is.
|
||||||
|
*/
|
||||||
|
private sendInput(input: string | Uint8Array) {
|
||||||
|
let effectiveBufferSize = this.bufSize - 1;
|
||||||
|
let dataString: string;
|
||||||
|
|
||||||
|
if (typeof input === "string") {
|
||||||
|
dataString = input;
|
||||||
|
} else {
|
||||||
|
dataString = String.fromCharCode(...input)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Account for base64 encoding
|
||||||
|
let maxChunkSize = Math.floor(effectiveBufferSize / 4) * 3;
|
||||||
|
|
||||||
|
for (let i = 0; i < Math.ceil(dataString.length / maxChunkSize); i++) {
|
||||||
|
let inputChunk = dataString.substring(i * maxChunkSize, Math.min((i + 1) * maxChunkSize, dataString.length))
|
||||||
|
this.connection.send(msgInput + btoa(inputChunk));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private sendPing(): void {
|
||||||
|
this.connection.send(msgPing);
|
||||||
|
}
|
||||||
|
|
||||||
|
private sendResizeTerminal(colmuns: number, rows: number) {
|
||||||
|
this.connection.send(
|
||||||
|
msgResizeTerminal + JSON.stringify(
|
||||||
|
{
|
||||||
|
columns: colmuns,
|
||||||
|
rows: rows
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private sendSetEncoding(encoding: "base64" | "null") {
|
||||||
|
this.connection.send(msgSetEncoding + encoding)
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
@ -2,25 +2,40 @@ import { Terminal, IDisposable } from "xterm";
|
|||||||
import { FitAddon } from 'xterm-addon-fit';
|
import { FitAddon } from 'xterm-addon-fit';
|
||||||
import { WebLinksAddon } from 'xterm-addon-web-links';
|
import { WebLinksAddon } from 'xterm-addon-web-links';
|
||||||
import { WebglAddon } from 'xterm-addon-webgl';
|
import { WebglAddon } from 'xterm-addon-webgl';
|
||||||
|
import { ZModemAddon } from "./zmodem";
|
||||||
|
|
||||||
export class Xterm {
|
export class OurXterm {
|
||||||
|
// The HTMLElement that contains our terminal
|
||||||
elem: HTMLElement;
|
elem: HTMLElement;
|
||||||
|
|
||||||
|
// The xtermjs.XTerm
|
||||||
term: Terminal;
|
term: Terminal;
|
||||||
|
|
||||||
resizeListener: () => void;
|
resizeListener: () => void;
|
||||||
|
|
||||||
message: HTMLElement;
|
message: HTMLElement;
|
||||||
messageTimeout: number;
|
messageTimeout: number;
|
||||||
messageTimer: NodeJS.Timeout;
|
messageTimer: NodeJS.Timeout;
|
||||||
|
|
||||||
onResizeHandler: IDisposable;
|
onResizeHandler: IDisposable;
|
||||||
onDataHandler: IDisposable;
|
onDataHandler: IDisposable;
|
||||||
|
|
||||||
fitAddOn: FitAddon;
|
fitAddOn: FitAddon;
|
||||||
|
zmodemAddon: ZModemAddon;
|
||||||
|
toServer: (data: string | Uint8Array) => void;
|
||||||
|
encoder: TextEncoder
|
||||||
|
|
||||||
constructor(elem: HTMLElement) {
|
constructor(elem: HTMLElement) {
|
||||||
this.elem = elem;
|
this.elem = elem;
|
||||||
this.term = new Terminal();
|
this.term = new Terminal();
|
||||||
this.fitAddOn = new FitAddon();
|
this.fitAddOn = new FitAddon();
|
||||||
|
this.zmodemAddon = new ZModemAddon({
|
||||||
|
toTerminal: (x: Uint8Array) => this.term.write(x),
|
||||||
|
toServer: (x: Uint8Array) => this.sendInput(x)
|
||||||
|
});
|
||||||
this.term.loadAddon(new WebLinksAddon());
|
this.term.loadAddon(new WebLinksAddon());
|
||||||
this.term.loadAddon(this.fitAddOn);
|
this.term.loadAddon(this.fitAddOn);
|
||||||
|
this.term.loadAddon(this.zmodemAddon);
|
||||||
|
|
||||||
this.message = elem.ownerDocument.createElement("div");
|
this.message = elem.ownerDocument.createElement("div");
|
||||||
this.message.className = "xterm-overlay";
|
this.message.className = "xterm-overlay";
|
||||||
@ -35,6 +50,7 @@ export class Xterm {
|
|||||||
this.term.open(elem);
|
this.term.open(elem);
|
||||||
this.term.focus();
|
this.term.focus();
|
||||||
this.resizeListener();
|
this.resizeListener();
|
||||||
|
|
||||||
window.addEventListener("resize", () => { this.resizeListener(); });
|
window.addEventListener("resize", () => { this.resizeListener(); });
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -42,8 +58,9 @@ export class Xterm {
|
|||||||
return { columns: this.term.cols, rows: this.term.rows };
|
return { columns: this.term.cols, rows: this.term.rows };
|
||||||
};
|
};
|
||||||
|
|
||||||
output(data: string) {
|
// This gets called from the Websocket's onReceive handler
|
||||||
this.term.write(data);
|
output(data: Uint8Array) {
|
||||||
|
this.zmodemAddon.consume(data);
|
||||||
};
|
};
|
||||||
|
|
||||||
getMessage(): HTMLElement {
|
getMessage(): HTMLElement {
|
||||||
@ -63,7 +80,11 @@ export class Xterm {
|
|||||||
}
|
}
|
||||||
if (timeout > 0) {
|
if (timeout > 0) {
|
||||||
this.messageTimer = setTimeout(() => {
|
this.messageTimer = setTimeout(() => {
|
||||||
|
try {
|
||||||
this.elem.removeChild(this.message);
|
this.elem.removeChild(this.message);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
}, timeout);
|
}, timeout);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -90,11 +111,23 @@ export class Xterm {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
onInput(callback: (input: string) => void) {
|
sendInput(data: Uint8Array) {
|
||||||
this.onDataHandler = this.term.onData((data) => {
|
return this.toServer(data)
|
||||||
callback(data);
|
}
|
||||||
});
|
|
||||||
|
|
||||||
|
onInput(callback: (input: string) => void) {
|
||||||
|
this.encoder = new TextEncoder()
|
||||||
|
this.toServer = callback;
|
||||||
|
|
||||||
|
// I *think* we're ok like this, but if not, we can dispose
|
||||||
|
// of the previous handler and put the new one in place.
|
||||||
|
if (this.onDataHandler !== undefined) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.onDataHandler = this.term.onData((input) => {
|
||||||
|
this.toServer(this.encoder.encode(input));
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
onResize(callback: (colmuns: number, rows: number) => void) {
|
onResize(callback: (colmuns: number, rows: number) => void) {
|
||||||
@ -118,4 +151,16 @@ export class Xterm {
|
|||||||
window.removeEventListener("resize", this.resizeListener);
|
window.removeEventListener("resize", this.resizeListener);
|
||||||
this.term.dispose();
|
this.term.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
disableStdin(): void {
|
||||||
|
this.term.options.disableStdin = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
enableStdin(): void {
|
||||||
|
this.term.options.disableStdin = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
focus(): void {
|
||||||
|
this.term.focus();
|
||||||
|
}
|
||||||
}
|
}
|
245
js/src/zmodem.tsx
Normal file
245
js/src/zmodem.tsx
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
import { ITerminalAddon, Terminal } from "xterm";
|
||||||
|
import { Browser, Detection, Offer, Sentry, Session } from 'zmodem.js/src/zmodem_browser';
|
||||||
|
import { MyModal, Button } from "./MyModal";
|
||||||
|
import { Component, ComponentChildren, createRef, render } from "preact";
|
||||||
|
|
||||||
|
export class ZModemAddon implements ITerminalAddon {
|
||||||
|
term: Terminal;
|
||||||
|
elem: HTMLDivElement;
|
||||||
|
sentry: Sentry;
|
||||||
|
toTerminal: (data: Uint8Array) => void;
|
||||||
|
toServer: (data: Uint8Array) => void;
|
||||||
|
|
||||||
|
constructor(props: {
|
||||||
|
toTerminal: (data: Uint8Array) => void,
|
||||||
|
toServer: (data: Uint8Array) => void
|
||||||
|
}) {
|
||||||
|
this.createElement();
|
||||||
|
this.toTerminal = props.toTerminal;
|
||||||
|
this.toServer = props.toServer;
|
||||||
|
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private createElement() {
|
||||||
|
this.elem = document.createElement("div");
|
||||||
|
document.body.prepend(this.elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
consume(data: Uint8Array) {
|
||||||
|
this.sentry.consume(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
activate(terminal: Terminal): void {
|
||||||
|
this.term = terminal
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private init() {
|
||||||
|
render(<></>, this.elem);
|
||||||
|
|
||||||
|
this.sentry = new Sentry({
|
||||||
|
'to_terminal': (d: Uint8Array) => this.toTerminal(d),
|
||||||
|
'on_detect': (detection: Detection) => this.onDetect(detection),
|
||||||
|
'sender': (x: Uint8Array) => { this.toServer(x) },
|
||||||
|
'on_retract': () => this.reset(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private reset() {
|
||||||
|
this.init();
|
||||||
|
this.term.options.disableStdin = false;
|
||||||
|
this.term.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
private onDetect(detection: Detection) {
|
||||||
|
var zsession = detection.confirm();
|
||||||
|
|
||||||
|
this.term.options.disableStdin = true;
|
||||||
|
|
||||||
|
zsession.on('session_end', () => { this.reset() });
|
||||||
|
|
||||||
|
if (zsession.type === "send") {
|
||||||
|
this.send(zsession);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
zsession.on("offer", (xfer: any) => this.onOffer(xfer));
|
||||||
|
zsession.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private send(zsession: Session) {
|
||||||
|
render(<SendFileModal session={zsession} />, this.elem)
|
||||||
|
}
|
||||||
|
|
||||||
|
private onOffer(xfer: Offer) {
|
||||||
|
render(<ReceiveFileModal xfer={xfer} onFinish={() => this.reset()} />, this.elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Renders a bootstrap progress bar
|
||||||
|
function Progress(props: { min: number, max: number, now: number, children?: ComponentChildren }) {
|
||||||
|
let { min, max, now } = props;
|
||||||
|
let percentage = "0";
|
||||||
|
|
||||||
|
if ((typeof min === "number") &&
|
||||||
|
(typeof max === "number") &&
|
||||||
|
(typeof now === "number") &&
|
||||||
|
(min != max)) {
|
||||||
|
percentage = (100 * (now - min) / (max - min)).toFixed(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div class="progress">
|
||||||
|
<div class="progress-bar" role="progressbar" style={"width: " + percentage + "%"} aria-valuenow={now} aria-valuemin={min} aria-valuemax={max}>{props.children}</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ReceiveFileModalProps {
|
||||||
|
xfer: Offer;
|
||||||
|
onFinish?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ReceiveFileModalState {
|
||||||
|
state: "notstarted" | "started" | "skipped" | "done"
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ReceiveFileModal extends Component<ReceiveFileModalProps, ReceiveFileModalState> {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
this.setState({ state: "notstarted" })
|
||||||
|
}
|
||||||
|
|
||||||
|
accept() {
|
||||||
|
this.setState({ state: "started" });
|
||||||
|
|
||||||
|
let timerID = setInterval(
|
||||||
|
() => this.forceUpdate(),
|
||||||
|
100
|
||||||
|
);
|
||||||
|
|
||||||
|
this.props.xfer.accept().then((payloads: any) => {
|
||||||
|
// All done, so stop updating the progress bar
|
||||||
|
// and perform a final render.
|
||||||
|
clearInterval(timerID);
|
||||||
|
this.forceUpdate();
|
||||||
|
|
||||||
|
if (this.state.state != "skipped") {
|
||||||
|
Browser.save_to_disk(
|
||||||
|
payloads,
|
||||||
|
this.props.xfer.get_details().name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
this.setState({ state: "done" })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
finish() {
|
||||||
|
console.log('finished');
|
||||||
|
if (this.props.onFinish) this.props.onFinish();
|
||||||
|
}
|
||||||
|
|
||||||
|
progress() {
|
||||||
|
if (this.state.state !== "notstarted") {
|
||||||
|
return <Progress min={0} max={this.props.xfer.get_details().size} now={this.props.xfer.get_offset()} />
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
skip() {
|
||||||
|
this.props.xfer.skip()
|
||||||
|
this.setState({ state: "skipped" })
|
||||||
|
}
|
||||||
|
|
||||||
|
buttons() {
|
||||||
|
switch (this.state.state) {
|
||||||
|
case "notstarted":
|
||||||
|
return <>
|
||||||
|
<Button priority="primary" clickHandler={() => { this.accept(); }}>Accept</Button>
|
||||||
|
<Button priority="secondary" clickHandler={() => { this.skip(); }}>Decline</Button>
|
||||||
|
</>
|
||||||
|
case "started":
|
||||||
|
return <>
|
||||||
|
<Button priority="danger" clickHandler={() => { this.skip(); }}>Cancel</Button>
|
||||||
|
</>
|
||||||
|
case "skipped":
|
||||||
|
return <>
|
||||||
|
<Button priority="danger" disabled={true}>Skipping...</Button>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
if (this.state.state != "done")
|
||||||
|
return <MyModal title="Incoming file"
|
||||||
|
buttons={this.buttons()}>
|
||||||
|
Accept <code>{this.props.xfer.get_details().name}</code> ({this.props.xfer.get_details().size.toLocaleString(undefined, { maximumFractionDigits: 0 })} bytes)?
|
||||||
|
{this.progress()}
|
||||||
|
</MyModal>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export class SendFileModal extends Component<SendFileModalProps, SendFileModalState> {
|
||||||
|
filePickerRef = createRef<HTMLInputElement>();
|
||||||
|
|
||||||
|
constructor(props: SendFileModalProps) {
|
||||||
|
super(props)
|
||||||
|
this.setState({ state: "notstarted" })
|
||||||
|
}
|
||||||
|
|
||||||
|
buttons() {
|
||||||
|
switch (this.state.state) {
|
||||||
|
case "started":
|
||||||
|
return <>
|
||||||
|
<Button priority="primary" clickHandler={() => { this.send(); }} disabled={true}>
|
||||||
|
Sending...
|
||||||
|
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
case "notstarted":
|
||||||
|
return <>
|
||||||
|
<Button priority="primary" clickHandler={() => { this.send(); }}>Send</Button>
|
||||||
|
</>
|
||||||
|
default:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
send() {
|
||||||
|
Browser.send_files(this.props.session,
|
||||||
|
this.filePickerRef.current!.files, {
|
||||||
|
on_offer_response: (f, xfer) => { this.setState({ state: "started" }) },
|
||||||
|
}).then(() => {
|
||||||
|
this.setState({ state: "done" })
|
||||||
|
this.props.session.close()
|
||||||
|
if (this.props.onFinish !== undefined) {
|
||||||
|
this.props.onFinish();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(e => console.log(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
if (this.state.state != "done")
|
||||||
|
return <MyModal title="Send file(s)"
|
||||||
|
buttons={this.buttons()}>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="formFileMultiple" class="form-label">
|
||||||
|
Remote requested file transfer
|
||||||
|
</label>
|
||||||
|
<input ref={this.filePickerRef} class="form-control form-control-sm" type="file" id="formFileMultiple" multiple />
|
||||||
|
</div>
|
||||||
|
</MyModal>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SendFileModalProps {
|
||||||
|
onFinish?: () => void;
|
||||||
|
session: Session;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SendFileModalState {
|
||||||
|
state: "notstarted" | "started" | "done"
|
||||||
|
currentFile: any
|
||||||
|
}
|
@ -1,16 +1,18 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./dist/",
|
"outDir": "./dist/",
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
"jsxImportSource": "preact",
|
||||||
"strictNullChecks": true,
|
"strictNullChecks": true,
|
||||||
"noUnusedLocals" : true,
|
"noUnusedLocals" : true,
|
||||||
"noImplicitThis": true,
|
"noImplicitThis": true,
|
||||||
"alwaysStrict": true,
|
"alwaysStrict": true,
|
||||||
"outDir": "./dist/",
|
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"target": "es5",
|
"target": "esnext",
|
||||||
"module": "commonJS",
|
"module": "commonJS",
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
|
"types": ["preact", "node"],
|
||||||
"paths": {
|
"paths": {
|
||||||
"*": ["./typings/*"]
|
"*": ["./typings/*"]
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const TerserPlugin = require("terser-webpack-plugin");
|
||||||
|
const LicenseWebpackPlugin = require('license-webpack-plugin').LicenseWebpackPlugin;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
entry: "./src/main.ts",
|
entry: "./src/main.ts",
|
||||||
@ -12,6 +14,9 @@ module.exports = {
|
|||||||
resolve: {
|
resolve: {
|
||||||
extensions: [".ts", ".tsx", ".js"],
|
extensions: [".ts", ".tsx", ".js"],
|
||||||
},
|
},
|
||||||
|
plugins: [
|
||||||
|
new LicenseWebpackPlugin()
|
||||||
|
],
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
@ -24,10 +29,21 @@ module.exports = {
|
|||||||
use: ["style-loader", "css-loader"],
|
use: ["style-loader", "css-loader"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.js$/,
|
test: /\.scss$/i,
|
||||||
include: /node_modules/,
|
use: ["style-loader", "css-loader", {
|
||||||
loader: 'license-loader'
|
loader: "sass-loader",
|
||||||
|
options: {
|
||||||
|
sassOptions: {
|
||||||
|
includePaths: ["node_modules/bootstrap/scss"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
optimization: {
|
||||||
|
minimize: true,
|
||||||
|
minimizer: [new TerserPlugin()],
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
@ -6,15 +6,8 @@ html, body, #terminal {
|
|||||||
margin: 0%;
|
margin: 0%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fileDialog {
|
.progress .progress-bar {
|
||||||
position: fixed;
|
transition: unset;
|
||||||
top: 40%;
|
transition-duration: 0.1s;
|
||||||
left: 40%;
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
background-color: lightgray;
|
|
||||||
padding: 20px;
|
|
||||||
border: 10px;
|
|
||||||
border-color: red;
|
|
||||||
border-width: medium;
|
|
||||||
display: none;
|
|
||||||
z-index: 5;
|
|
||||||
}
|
}
|
@ -1,6 +1,7 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
|
<head>
|
||||||
<title>{{ .title }}</title>
|
<title>{{ .title }}</title>
|
||||||
<link rel="manifest" href="manifest.json" crossorigin="use-credentials">
|
<link rel="manifest" href="manifest.json" crossorigin="use-credentials">
|
||||||
<link rel="icon" href="favicon.ico">
|
<link rel="icon" href="favicon.ico">
|
||||||
@ -8,11 +9,14 @@
|
|||||||
<link rel="stylesheet" href="./css/index.css" />
|
<link rel="stylesheet" href="./css/index.css" />
|
||||||
<link rel="stylesheet" href="./css/xterm.css" />
|
<link rel="stylesheet" href="./css/xterm.css" />
|
||||||
<link rel="stylesheet" href="./css/xterm_customize.css" />
|
<link rel="stylesheet" href="./css/xterm_customize.css" />
|
||||||
</head>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<body>
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
<div id="terminal"></div>
|
<div id="terminal"></div>
|
||||||
<script src="./auth_token.js"></script>
|
<script src="./auth_token.js"></script>
|
||||||
<script src="./config.js"></script>
|
<script src="./config.js"></script>
|
||||||
<script src="./js/gotty.js"></script>
|
<script src="./js/gotty.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
Loading…
Reference in New Issue
Block a user