mirror of
https://github.com/sorenisanerd/gotty.git
synced 2024-11-09 23:34:26 +00:00
feat(zmodem): Allow file uploads/downloads
Using zmodem (rz and sz commands from lrzsz) you can now send and receive files.
This commit is contained in:
parent
163fd0537c
commit
782991c356
5
Makefile
5
Makefile
@ -2,6 +2,7 @@ OUTPUT_DIR = ./builds
|
|||||||
GIT_COMMIT = `git rev-parse HEAD | cut -c1-7`
|
GIT_COMMIT = `git rev-parse HEAD | cut -c1-7`
|
||||||
VERSION = $(shell git describe --tags)
|
VERSION = $(shell git describe --tags)
|
||||||
BUILD_OPTIONS = -ldflags "-X main.Version=$(VERSION)"
|
BUILD_OPTIONS = -ldflags "-X main.Version=$(VERSION)"
|
||||||
|
WEBPACK_MODE = production
|
||||||
|
|
||||||
gotty: main.go assets server/*.go webtty/*.go backend/*.go Makefile
|
gotty: main.go assets server/*.go webtty/*.go backend/*.go Makefile
|
||||||
go build ${BUILD_OPTIONS}
|
go build ${BUILD_OPTIONS}
|
||||||
@ -10,7 +11,7 @@ docker:
|
|||||||
docker build . -t gotty-bash:$(VERSION)
|
docker build . -t gotty-bash:$(VERSION)
|
||||||
|
|
||||||
.PHONY: all docker assets
|
.PHONY: all docker assets
|
||||||
assets: bindata/static/js/gotty.js bindata/static/index.html bindata/static/icon.svg bindata/static/favicon.ico bindata/static/css/index.css bindata/static/css/xterm.css bindata/static/css/xterm_customize.css bindata/static/manifest.json bindata/static/icon_192.png
|
assets: bindata/static/js/gotty.js.map bindata/static/js/gotty.js bindata/static/index.html bindata/static/icon.svg bindata/static/favicon.ico bindata/static/css/index.css bindata/static/css/xterm.css bindata/static/css/xterm_customize.css bindata/static/manifest.json bindata/static/icon_192.png
|
||||||
|
|
||||||
all: gotty
|
all: gotty
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ js/node_modules/xterm/dist/xterm.css:
|
|||||||
|
|
||||||
bindata/static/js/gotty.js: js/src/* | js/node_modules/webpack
|
bindata/static/js/gotty.js: js/src/* | js/node_modules/webpack
|
||||||
cd js && \
|
cd js && \
|
||||||
npx webpack
|
npx webpack --mode=$(WEBPACK_MODE)
|
||||||
|
|
||||||
js/node_modules/webpack:
|
js/node_modules/webpack:
|
||||||
cd js && \
|
cd js && \
|
||||||
|
@ -5,3 +5,16 @@ html, body, #terminal {
|
|||||||
padding: 0%;
|
padding: 0%;
|
||||||
margin: 0%;
|
margin: 0%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fileDialog {
|
||||||
|
position: fixed;
|
||||||
|
top: 40%;
|
||||||
|
left: 40%;
|
||||||
|
background-color: lightgray;
|
||||||
|
padding: 20px;
|
||||||
|
border: 10px;
|
||||||
|
border-color: red;
|
||||||
|
border-width: medium;
|
||||||
|
display: none;
|
||||||
|
z-index: 5;
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
@ -1,3 +1,211 @@
|
|||||||
|
/*!
|
||||||
|
* crc-32 (https://npmjs.com/package/crc-32)
|
||||||
|
* @license Apache-2.0
|
||||||
|
* @version 1.2.1
|
||||||
|
* ==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)
|
* xterm (https://npmjs.com/package/xterm)
|
||||||
* @license MIT
|
* @license MIT
|
||||||
@ -103,3 +311,213 @@
|
|||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
* THE SOFTWARE.
|
* 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 */
|
||||||
|
File diff suppressed because one or more lines are too long
72
js/package-lock.json
generated
72
js/package-lock.json
generated
@ -13,7 +13,8 @@
|
|||||||
"xterm": "^4.12.0",
|
"xterm": "^4.12.0",
|
||||||
"xterm-addon-fit": "^0.5.0",
|
"xterm-addon-fit": "^0.5.0",
|
||||||
"xterm-addon-web-links": "^0.4.0",
|
"xterm-addon-web-links": "^0.4.0",
|
||||||
"xterm-addon-webgl": "^0.10.0"
|
"xterm-addon-webgl": "^0.10.0",
|
||||||
|
"zmodem.js": "^0.1.10"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"license-loader": "^0.5.0",
|
"license-loader": "^0.5.0",
|
||||||
@ -429,6 +430,21 @@
|
|||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/crc-32": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==",
|
||||||
|
"dependencies": {
|
||||||
|
"exit-on-epipe": "~1.0.1",
|
||||||
|
"printj": "~1.3.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"crc32": "bin/crc32.njs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cross-spawn": {
|
"node_modules/cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||||
@ -615,6 +631,14 @@
|
|||||||
"url": "https://github.com/sindresorhus/execa?sponsor=1"
|
"url": "https://github.com/sindresorhus/execa?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/exit-on-epipe": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/fast-json-stable-stringify": {
|
"node_modules/fast-json-stable-stringify": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
@ -1217,6 +1241,17 @@
|
|||||||
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
|
||||||
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
|
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
|
||||||
},
|
},
|
||||||
|
"node_modules/printj": {
|
||||||
|
"version": "1.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz",
|
||||||
|
"integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg==",
|
||||||
|
"bin": {
|
||||||
|
"printj": "bin/printj.njs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/process-nextick-args": {
|
"node_modules/process-nextick-args": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||||
@ -1825,6 +1860,14 @@
|
|||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"node_modules/zmodem.js": {
|
||||||
|
"version": "0.1.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/zmodem.js/-/zmodem.js-0.1.10.tgz",
|
||||||
|
"integrity": "sha512-Z1DWngunZ/j3BmIzSJpFZVNV73iHkj89rxXX4IciJdU9ga3nZ7rJ5LkfjV/QDsKhc7bazDWTTJCLJ+iRXD82dw==",
|
||||||
|
"dependencies": {
|
||||||
|
"crc-32": "^1.1.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -2167,6 +2210,15 @@
|
|||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"crc-32": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==",
|
||||||
|
"requires": {
|
||||||
|
"exit-on-epipe": "~1.0.1",
|
||||||
|
"printj": "~1.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"cross-spawn": {
|
"cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||||
@ -2297,6 +2349,11 @@
|
|||||||
"strip-final-newline": "^2.0.0"
|
"strip-final-newline": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"exit-on-epipe": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
|
||||||
|
},
|
||||||
"fast-json-stable-stringify": {
|
"fast-json-stable-stringify": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
@ -2727,6 +2784,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
|
||||||
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
|
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
|
||||||
},
|
},
|
||||||
|
"printj": {
|
||||||
|
"version": "1.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/printj/-/printj-1.3.1.tgz",
|
||||||
|
"integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg=="
|
||||||
|
},
|
||||||
"process-nextick-args": {
|
"process-nextick-args": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||||
@ -3164,6 +3226,14 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
||||||
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
|
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
|
||||||
|
},
|
||||||
|
"zmodem.js": {
|
||||||
|
"version": "0.1.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/zmodem.js/-/zmodem.js-0.1.10.tgz",
|
||||||
|
"integrity": "sha512-Z1DWngunZ/j3BmIzSJpFZVNV73iHkj89rxXX4IciJdU9ga3nZ7rJ5LkfjV/QDsKhc7bazDWTTJCLJ+iRXD82dw==",
|
||||||
|
"requires": {
|
||||||
|
"crc-32": "^1.1.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
"xterm": "^4.12.0",
|
"xterm": "^4.12.0",
|
||||||
"xterm-addon-fit": "^0.5.0",
|
"xterm-addon-fit": "^0.5.0",
|
||||||
"xterm-addon-web-links": "^0.4.0",
|
"xterm-addon-web-links": "^0.4.0",
|
||||||
"xterm-addon-webgl": "^0.10.0"
|
"xterm-addon-webgl": "^0.10.0",
|
||||||
|
"zmodem.js": "^0.1.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
130
js/src/webtty.ts
130
js/src/webtty.ts
@ -1,3 +1,5 @@
|
|||||||
|
import * as Zmodem from 'zmodem.js/src/zmodem_browser';
|
||||||
|
|
||||||
export const protocols = ["webtty"];
|
export const protocols = ["webtty"];
|
||||||
|
|
||||||
export const msgInputUnknown = '0';
|
export const msgInputUnknown = '0';
|
||||||
@ -18,6 +20,7 @@ export interface Terminal {
|
|||||||
info(): { columns: number, rows: number };
|
info(): { columns: number, rows: number };
|
||||||
output(data: string): void;
|
output(data: string): void;
|
||||||
showMessage(message: string, timeout: number): void;
|
showMessage(message: string, timeout: number): void;
|
||||||
|
getMessage(): HTMLElement;
|
||||||
removeMessage(): void;
|
removeMessage(): void;
|
||||||
setWindowTitle(title: string): void;
|
setWindowTitle(title: string): void;
|
||||||
setPreferences(value: object): void;
|
setPreferences(value: object): void;
|
||||||
@ -46,10 +49,12 @@ export interface ConnectionFactory {
|
|||||||
export class WebTTY {
|
export class WebTTY {
|
||||||
term: Terminal;
|
term: Terminal;
|
||||||
connectionFactory: ConnectionFactory;
|
connectionFactory: ConnectionFactory;
|
||||||
|
connection: Connection;
|
||||||
args: string;
|
args: string;
|
||||||
authToken: string;
|
authToken: string;
|
||||||
reconnect: number;
|
reconnect: number;
|
||||||
bufSize: number;
|
bufSize: number;
|
||||||
|
sentry: Zmodem.Sentry;
|
||||||
|
|
||||||
constructor(term: Terminal, connectionFactory: ConnectionFactory, args: string, authToken: string) {
|
constructor(term: Terminal, connectionFactory: ConnectionFactory, args: string, authToken: string) {
|
||||||
this.term = term;
|
this.term = term;
|
||||||
@ -58,12 +63,126 @@ export class WebTTY {
|
|||||||
this.authToken = authToken;
|
this.authToken = authToken;
|
||||||
this.reconnect = -1;
|
this.reconnect = -1;
|
||||||
this.bufSize = 1024;
|
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 * effectiveBufferSize, Math.min((i + 1) * effectiveBufferSize, 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() {
|
open() {
|
||||||
let connection = this.connectionFactory.create();
|
let connection = this.connectionFactory.create();
|
||||||
let pingTimer: NodeJS.Timeout;
|
let pingTimer: NodeJS.Timeout;
|
||||||
let reconnectTimeout: NodeJS.Timeout;
|
let reconnectTimeout: NodeJS.Timeout;
|
||||||
|
this.connection = connection;
|
||||||
|
|
||||||
const setup = () => {
|
const setup = () => {
|
||||||
connection.onOpen(() => {
|
connection.onOpen(() => {
|
||||||
@ -93,14 +212,7 @@ export class WebTTY {
|
|||||||
|
|
||||||
this.term.onInput(
|
this.term.onInput(
|
||||||
(input: string) => {
|
(input: string) => {
|
||||||
// Leave room for message type id
|
this.sendInput(input);
|
||||||
let effectiveBufferSize = this.bufSize - 1;
|
|
||||||
|
|
||||||
// Split input into buffer sized chunks
|
|
||||||
for (let i = 0; i < Math.ceil(input.length/effectiveBufferSize); i++) {
|
|
||||||
let inputChunk = input.substring(i*effectiveBufferSize, Math.min((i+1)*effectiveBufferSize, input.length))
|
|
||||||
connection.send(msgInput + inputChunk);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -114,7 +226,7 @@ export class WebTTY {
|
|||||||
const payload = data.slice(1);
|
const payload = data.slice(1);
|
||||||
switch (data[0]) {
|
switch (data[0]) {
|
||||||
case msgOutput:
|
case msgOutput:
|
||||||
this.term.output(atob(payload));
|
this.sentry.consume(Uint8Array.from(atob(payload), c => c.charCodeAt(0)));
|
||||||
break;
|
break;
|
||||||
case msgPong:
|
case msgPong:
|
||||||
break;
|
break;
|
||||||
|
@ -43,11 +43,19 @@ export class Xterm {
|
|||||||
};
|
};
|
||||||
|
|
||||||
output(data: string) {
|
output(data: string) {
|
||||||
this.term.write(Uint8Array.from(data, c => c.charCodeAt(0)));
|
this.term.write(data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
getMessage(): HTMLElement {
|
||||||
|
return this.message;
|
||||||
|
}
|
||||||
|
|
||||||
showMessage(message: string, timeout: number) {
|
showMessage(message: string, timeout: number) {
|
||||||
this.message.textContent = message;
|
this.message.innerHTML = message;
|
||||||
|
this.showMessageElem(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
showMessageElem(timeout: number) {
|
||||||
this.elem.appendChild(this.message);
|
this.elem.appendChild(this.message);
|
||||||
|
|
||||||
if (this.messageTimer) {
|
if (this.messageTimer) {
|
||||||
|
@ -5,3 +5,16 @@ html, body, #terminal {
|
|||||||
padding: 0%;
|
padding: 0%;
|
||||||
margin: 0%;
|
margin: 0%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fileDialog {
|
||||||
|
position: fixed;
|
||||||
|
top: 40%;
|
||||||
|
left: 40%;
|
||||||
|
background-color: lightgray;
|
||||||
|
padding: 20px;
|
||||||
|
border: 10px;
|
||||||
|
border-color: red;
|
||||||
|
border-width: medium;
|
||||||
|
display: none;
|
||||||
|
z-index: 5;
|
||||||
|
}
|
@ -176,7 +176,13 @@ func (wt *WebTTY) handleMasterReadEvent(data []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := wt.slave.Write(data[1:])
|
var decodedBuffer = make([]byte, len(data))
|
||||||
|
n, err := base64.StdEncoding.Decode(decodedBuffer, data[1:])
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "failed to write received data to slave")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = wt.slave.Write(decodedBuffer[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to write received data to slave")
|
return errors.Wrapf(err, "failed to write received data to slave")
|
||||||
}
|
}
|
||||||
|
@ -98,8 +98,8 @@ func TestWriteFromFrontend(t *testing.T) {
|
|||||||
checkNextMsgType(t, mMaster.gottyToMasterReader, SetWindowTitle)
|
checkNextMsgType(t, mMaster.gottyToMasterReader, SetWindowTitle)
|
||||||
checkNextMsgType(t, mMaster.gottyToMasterReader, SetBufferSize)
|
checkNextMsgType(t, mMaster.gottyToMasterReader, SetBufferSize)
|
||||||
|
|
||||||
// simulate input from frontend...
|
// simulate input from frontend... ("hello" in base64)
|
||||||
message := []byte("1hello\n") // line buffered canonical mode
|
message := []byte("1aGVsbG8=\n") // line buffered canonical mode
|
||||||
mMaster.masterToGottyWriter.Write(message)
|
mMaster.masterToGottyWriter.Write(message)
|
||||||
|
|
||||||
// ...and make sure it makes it through to the slave intact
|
// ...and make sure it makes it through to the slave intact
|
||||||
@ -108,7 +108,7 @@ func TestWriteFromFrontend(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected error from Write(): %s", err)
|
t.Fatalf("Unexpected error from Write(): %s", err)
|
||||||
}
|
}
|
||||||
if !bytes.Equal(readBuf[:n], message[1:]) {
|
if !bytes.Equal(readBuf[:n], []byte("hello")) {
|
||||||
t.Fatalf("Unexpected message received: `%s`", readBuf[:n])
|
t.Fatalf("Unexpected message received: `%s`", readBuf[:n])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user