lrzszã䜿çšããŠãã¡ã€ã«ãéåä¿¡ã§ããããã«ZModemããµããŒãããŸããïŒ ããã¯é¢çœããã§ããïŒ
ãããxterm.jsã§ã©ã®ããã«æ©èœãããã«ã€ããŠãããå°ã詳ããæããŠãã ããã
xterm.jsã䜿çšããŠbashïŒãã«æ©èœã®bashïŒã«æ¥ç¶ãããŠãŒã¶ãŒãbashãæäœã§ããããã«ããŸãã ãµããŒããŠãŒã¶ãŒã«rz / szã䜿çšããŠWeb端æ«ãããã¡ã€ã«ãã¢ããããŒã/ããŠã³ããŒãããŠãããããã®ã§ããã
SecureCRT / Xshellã䜿çšããŠãã·ã³ã®ã·ã§ã«ã«æ¥ç¶ãããšã rz
/ sz
ã³ãã³ãã䜿çšããŠãã¡ã€ã«ãã¢ããããŒã/ããŠã³ããŒãã§ããŸãã zterm.jsã䜿çšããŠãã·ã³ã®ã·ã§ã«ã«æ¥ç¶ãã rz
/ sz
ã³ãã³ãã§ãã¡ã€ã«ãã¢ããããŒã/ããŠã³ããŒãããã
Zmodemã¯ãPTYã·ã¹ãã ã®åºç€ãšãªãã·ãªã¢ã«ã©ã€ã³æœè±¡åã®ãããã³ã«æ©èœã§ãã ããã¯ãxterm.jsã®zssh
ãªã©ã®ããŒã«ã§ãã§ã«äœ¿çšã§ããŸãã xterm.jsèªäœã¯ãPTYã®ãã¹ã¿ãŒIOããã©ãŠã¶ãŒã«è»¢éããŠããã ãã§ãã å®éã«ã¯ãxterm.jsãµãŒããŒéšåããã¹ããããŠããã·ã¹ãã ã§æäœããŠããŸãã
ããã¯ãSecureCRTã®ããã«åããã·ã³ã§åäœããã¿ãŒããã«ãšãã¥ã¬ãŒã¿ãšã¯ãŸã£ããç°ãªããŸãã
ã ããåé¡ã¯-ã©ã®ãã·ã³ããã©ã®ãã·ã³ã«ç«¯æ«ãä»ããŠãã¡ã€ã«ã移åãããã§ããïŒ ïŒããŒã«ã«ãã·ã³ã«ã¯xterm.jsã®ãµãŒããŒéšåãžã®ã¿ãŒããã«ãã£ãã«ããªãããšãå¿ããªãã§ãã ããïŒã
| local machine |
| +----------------------------+ |
| | browser | |
| | +-------------------+ | | +---------------------------+ +------------------------+
| | | | | | | proxy | | |
| | | web terminal >-----------------------> server part of xterm.js >----------| romote machine terminal|
| | | | | | +---------------------------+ +------------------------+
| | | | | |
| | +-------------------+ | |
| +----------------------------+ |
+-----------------------------------+
ããŒã«ã«ãã·ã³ãããªã¢ãŒããã·ã³ã«ãã¡ã€ã«ã移åãããã®ã§ããã ãªã¢ãŒããã·ã³ã«ã¯å€éšIPããªããããããŒã«ã«ãã·ã³ããçŽæ¥ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã
ããŒã«ã«ãã·ã³ã«ã¯xterm.jsã®ãµãŒããŒéšåãžã®ã¿ãŒããã«ãã£ãã«ããªãããšãå¿ããªãã§ãã ãã
ããã«å¯Ÿããåé¿çã¯ãããŸããïŒ
ãããã·ããzsshïŒzmodemãµããŒãä»ãïŒãsftpããŸãã¯scpã䜿çšã§ããŸãã
誰ãããããå®è£ ããªãéãããã©ãŠã¶ã®Web端æ«ãããªã¢ãŒããã·ã³ã«ãã¡ã€ã«ãçŽæ¥ã¢ãã/ããŠã³ããŒãããæ¹æ³ã¯ãããŸããã ã¢ãã ãããã³ã«ã®1ã€ããã®ããã«äœ¿çšã§ããŸããïŒXModem JSå®è£ ããããŸãïŒããã©ãŠã¶ã®ãã¡ã€ã«ã·ã¹ãã ã¢ã¯ã»ã¹ãéåžžã«å¶éãããŠããããããã®æçšæ§ã«çåããããŸãã é£ããéšåã¯ã倧ããªãã¡ã€ã«ã®ãã©ãŠã¶ãŒãšã®ããŠã³ããŒãæäœãæäŸããããšã§ãïŒããŒã¿ã¯WebSocketãä»ããŠãã©ãŠã¶ãŒã«çŽæ¥å°éãããããJSã¯ä¿åã§ãããŸã§ãã¹ãŠã®ããŒã¿ãä¿æããå¿ èŠããããŸãïŒã
ãã1ã€ã®ã¢ãããŒãã¯ããµãŒããŒéšåãrz / szæ©èœã§æ¡åŒµããããããã©ãŠã¶ãŒã«ééçã«ãããããããšã§ãã ããã«ããããã©ãŠã¶ã®FSå¶éãåé¿ãããŸãããã¢ãã ãããã³ã«ã®ãrz \ rãåæåããã£ããããããã«ãå¥ã®ããŒãµãŒãã¿ãŒããã«ã¹ããªãŒã ã«ããã¯ããå¿ èŠããããŸãã
ç§ã¯JavaScriptã§ã®ZMODEMå®è£ ã«åãââçµãã§ãããxterm.jsãä»ããŠãã¡ã€ã«ãåæ¹åã«è»¢éããŠããŸãã
ãã©ãŠã¶ã¯ãåä¿¡æã«ãã¡ã€ã«å
šäœããããã¡ãªã³ã°ããå¿
èŠããããŸãã :(ãã ãããããå¯äžã®æ¬ ç¹ã§ãããéåžžã«å€§ããªãã¡ã€ã«ãéä¿¡ããªãéããæªãã¯ãããŸãããã¢ããããŒãã¯FileReaderãä»ããŠå®è¡ã§ããããŠã³ããŒãã¯<a>
èŠçŽ ã®ãdownloadãå±æ§ãä»ããŠè¡ãããŸãã
ç§ã¯ãŸã ããããã¹ãããŠææžåããŠããŸãããZMODEMçµ±åã¯xterm.jsã«èå³ãããæ©èœã§ããïŒ
@FGasper Nice :)ææã«
ã©ã€ãã©ãªèªäœã¯ãã©ãããã©ãŒã ã«äŸåããªããããã©ãã§ãæ©èœããã¯ãã§ãã ïŒããã¯ãªã³ãŠãããïŒ
@FGasperã¯ãã¡ããšèãããŸãðïŒ
ãã©ãŠã¶ã§åäœããå Žåã¯ãzmodemã¢ããªã³ãæ€èšã§ããŸãã
zmodemã䜿çšããããã®éåžžã®ãŠãŒã¹ã±ãŒã¹ã¯äœã§ããïŒ
ããã䜿çšããŠãã¿ãŒããã«ã»ãã·ã§ã³å ã§ã¯ãŒã¯ã¹ããŒã·ã§ã³ãšã®éã§ãã¡ã€ã«è»¢éãè¡ããŸãã ããã¯ããªããscp / sftpãŸãã¯äœãããå¿ èŠããªãããšãå¯èœã«ããŸãã
iTerm2ã®å Žåãšåæ§ïŒ
https://github.com/mmastrac/iterm2-zmodem
@parisk X / Y / Z-MODEMãããã³ã«ã䜿çšãããšã端æ«æ¥ç¶ããæªçšãããŠãå察åŽãšã®éã§çŽæ¥ãã¡ã€ã«ã転éã§ããŸãã ããã¯ãåäžã®ã¿ãŒããã«ã»ãã·ã§ã³ã®ã¿ãä»ããŠãµãŒããŒããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããå Žåã«éåžžã«åœ¹ç«ã¡ãŸãã POSIXã·ã¹ãã ã®å Žåããããå®çŸããããã®rz
/ sz
ããŒã«ããããŸãã
xterm.jsã«ãšã£ãŠã¯å®ç§ãªã¢ããªã³ã§ãããå¶éãããç°å¢ã®ãµãŒããŒç®¡çè ã«ãšã£ãŠxterm.jsã®æçšæ§ãé«ããŸãã ïŒ+1ïŒ
泚æïŒXMODEMãšYMODEMã¯ã©ã¡ããããã¡ã€ã«è»¢éã®æºåãã§ããŠãããšããå察åŽã«ãããã³ãããã衚瀺ããªããšããæ¬ ç¹ããããŸãã ïŒã¯ããã«åçŽãªã®ã§ãæ®å¿µã§ãïŒïŒ
ZMODEMã¯ãç£èŠå¯èœãªæ¬è³ªçã«ãããžãã¯ã¹ããªã³ã°ãã§ãããã®ãéä¿¡ããŸãã 次ã«ããŠãŒã¶ãŒã«ãZMODEMãæ€åºãããŸããã ãã¡ã€ã«è»¢éãç¶è¡ããŸããïŒã ãã®æç¹ã§ãå®è£ ã¯ã転éãããã¡ã€ã«ãæäŸããããéä¿¡è ãæäŸãããã¡ã€ã«ãåãå ¥ãã/ã¹ãããããæ段ãæäŸããŸãã
xterm.jsã®å Žåããã¡ã€ã«ãã¿ãŒããã«ã«ãã©ãã°ã¢ã³ãããããããã ãã§ããã§ããããããšãã°ããã¡ã€ã«ãçŸåšã®ã¿ãŒããã«ã·ã§ã«ãã¹ã«ä¿åããããšããŸãã ãã ããxterm.jsããªã¢ãŒãã·ã§ã«èªäœãå¶åŸ¡ã§ããããå°ãªããšãçŸåšã®äœæ¥ãã£ã¬ã¯ããªãä»»æã®æç¹ã§ååŸã§ããªãéãããããå®è¡ããã®ã¯éåžžã«å°é£ã§ãã åãããšãéæ¹åã«ãåœãŠã¯ãŸããŸã- ls
ãªã¹ãããªã¢ãŒããã¡ã€ã«ãåç
§ããŠãããšãããå Žåã¯ãã¿ãŒããã«ãããã©ãã°ã¢ã³ãããããã¢ãŠãããã®ãé©åã§ãã ãŸããã 倢ãèŠãŠããïŒãŠã£ã³ã¯ïŒ
Zmodemã»ãã·ã§ã³ãéå§ããããšããã©ãã°/ããããrz
ãå®è¡ã§ããªãçç±ãããããŸããã è€æ°ã®æ¹æ³ã§å®è£
ã§ããŸããããããã次ã®ããã«ãªããŸãã
1ïŒã³ã³ãœãŒã«ã«rz
ããŸãã
2ïŒãã¡ã€ã«ãã«ãã©ãã°ã¢ã³ãããããããŸãã
3ïŒè»¢éãéå§ããŸãã
質åïŒxterm.jsã¯ãŸã IEãµããŒãã«ã©ã®ããã«èšå®ãããŠããŸããïŒ
https://github.com/sourcelair/xterm.js/pull/938ãåå ã§ãv3ã§ã¯IEããµããŒããããªããªããŸãããéçºè ã¯ããšã«ãããªãã«ããå¿ èŠããããŸãã
ãã¢ããèŠãããããšæããŸãã
ç§ã¯èªåã®ã¿ãŒããã«ãµãŒããŒã«å¯ŸããŠãã¹ããè¡ã£ãŠããŸããããçãããæã£ãŠãããã®ã¯ãã¹ãŠããã©ã«ããšããŠäœ¿çšããããšæããŸãã
^^ããã§äœãã足ããŸãããïŒ npm install
ãšã©ãŒãçºçããŸããâŠ
felipe@Macintosh-4 18:00:56 ~/code/p5-Net-WebSocket/demo
> sudo npm install
npm ERR! install Couldn't read dependencies
npm ERR! Darwin 16.7.0
npm ERR! argv "/opt/local/bin/node" "/opt/local/bin/npm" "install"
npm ERR! node v8.3.0
npm ERR! npm v2.15.12
npm ERR! path /Users/felipe/package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno -2
npm ERR! syscall open
npm ERR! package.json ENOENT: no such file or directory, open '/Users/felipe/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.
npm ERR! Please include the following file with any support request:
npm ERR! /Users/felipe/code/p5-Net-WebSocket/demo/npm-debug.log
ãã¶ãããªãã¯git clone ...
ãå¿ããŸãããïŒ ãããŠããªãsudo
ïŒ
@FGasper
npm ERR! package.json ENOENT: no such file or directory, open '/Users/felipe/package.json'
ãªããžããªãã£ã¬ã¯ããªã§ã¯ãªããããŒã ãã£ã¬ã¯ããªã§npm install
ããŠããŸãã
node-ptyã«æååã§ã¯ãªããã€ããªãåºåãããæ¹æ³ã¯ãããŸããïŒ ZMODEMã¯ãã€ããªãããã³ã«ã§ããããã¢ã§ã¯ãã¹ãŠãUTF-8ã§ãããšèããŠããããã§ãã ç¹ã«ã0x8aãUTF-8 \ ufffdã«å€æããŠããããã§ãã
ããã¯ããå°ãè€éãããããŸãã-ç°¡åãªä¿®æ£ã®ããã«ãnode-ptyã®ãšã³ã³ãŒããŒãç¡å¹ã«ããããæååã¿ã€ãããbinaryãã«èšå®ããããšãã§ããŸãããããã¯xterm.jsãžã®WebSocket転éã«æãŸãããªã圱é¿ãäžããå¯èœæ§ããããŸãã ç§ãç¥ãéãããã§ãŒã³å
šäœnode-pty <---> websocket <---> xterm.js
ã¯ããã®å Žã§JSæååã«ãã³ãŒããããUTF-8ãã€ãã«äŸåããŠããŸãã ãã€ããªããŒã¿ãæµãã«ã¯ããã倧ããªããããå¿
èŠã«ãªãå ŽåããããŸãã
ãã®binary
æååã¿ã€ãã®èšå®ã¯ã©ãã«ãããŸããïŒ ïŒnode-ptyã«ã¯ãã®ãããªãã®ã¯ãããŸãããïŒïŒ
ç§ãç¥ãéããããŒã¿ã¯app.js
ã«å°éãããŸã§ã«ãã§ã«ç ŽæããŠãããããåäœã®å€æŽã¯node-ptyã§è¡ãå¿
èŠããããŸãã
ZMODEMã¯ããã¹ãŠã®é«ãããæåã7ããããŸã§ãšã¹ã±ãŒããããšã³ã³ãŒãã£ã³ã°ã詳ãã説æããŠããŸãããå®éã«ã¯å®è£ ãããŠããªãããã§ãâŠForsbergã¯ããã¹ãŠã®è¡ã8ãããã»ãŒãã«ãªã£ããããããããå¿ èŠãªããšèããŸããã :)
ctorãªãã·ã§ã³ã®{encoding: 'binary'}
ãŸãã¯ãªã³ã¶ãã©ã€ã§.setEncoding('binary')
ãè©Šãããšãã§ããŸãã
ææ°ã®node-ptyã§ã¯UTF8ã¢ãŒãã®èšå®ãŸãã¯éèšå®ãèš±å¯ãããŠããããã§ãâŠ
if (info[8]->ToBoolean()->Value()) {
#if defined(IUTF8)
term->c_iflag |= IUTF8;
#endif
}
https://github.com/Tyriar/node-pty/blob/master/src/unix/pty.cc
ããŒãâŠxterm.jsããã«ããnode-ptyïŒ0.4.1ïŒã¯ããªãå€ãâŠããããææ°ããŒãžã§ã³ã«ã¯ãã®ãã©ã°ãå«ãŸããŠããã§ãããã
.setEncoding('binary')
åŒã³åºãã¯æ©èœããŸããâŠãŸãã encoding:"binary"
ãpty.spawnïŒïŒã«æž¡ãããšãã§ããŸããã
termiosã®IUTF8ã¯å¥ã®ããšãè¡ããŸããããã«ãããptyããã€ã¹ã§ãã«ããã€ãUTF8æåãæ£ããåŠçã§ããŸãïŒè¡å¹
ãšæ¶å»çšïŒã
ããŒããé£ããæ¹æ³ãããããŸãã-ãšã³ã³ãŒããåé€ããŠã¿ãŠãã ããïŒ
delete ptyObj._socket._readableState.decoder;
delete ptyObj._socket._readableState.encoding;
ããã«ãããæååã®ä»£ããã«ãããã¡ãªããžã§ã¯ããæäŸãããŸãïŒxterm.jsã«åå²ãããå¯èœæ§ãæãé«ãïŒã
OKãnode-pty 0.6.4ã«ã¢ããã°ã¬ãŒããããšã³ã³ãŒãã£ã³ã°ãnull
èšå®ããããšã§ååŸããŸããã ïŒ _readableState
ãã®ã¯å¿
èŠãããŸããã§ãããïŒããã§ãã·ã§ã«ã»ãã·ã§ã³ã®æåã®è¡ãããã¹ããšããŠéä¿¡ããŸããããã以éã¯ãã¹ãŠãã€ããªãªã®ã§ããã£ãããã§ãã
ããã§ããã·ã§ã«ã»ãã·ã§ã³ã®æåã®è¡ãããã¹ããšããŠéä¿¡ããŸã...
{encoding: null}
ãšããŠã³ã³ã¹ãã©ã¯ã¿ãŒã«é©çšããŠãïŒ
ã¯ãã {encoding: null}
ãæåã®è¡ã¯ããã¹ããã¬ãŒã ãšããŠéä¿¡ãããŸãã
ç§ã¯ãããè©ŠããŠã¿ãã®ã«åççãªç¶æ ã ãšæããã®ã«ãããæã£ãŠããŸãã
1ïŒhttps://github.com/FGasper/xterm.js.gitããªã¢ãŒããšããŠèšå®ããŸãã
2ïŒãã®ã¬ãã®zmodem
ãã©ã³ãããã§ãã¯ããŠãã ããã
3ïŒ git submodule init; git submodule update
4ïŒ npm install
ïŒä»¥äžãåç
§ïŒ
5ïŒ npm start
ã次ã«ãã©ãŠã¶ã«localhost:3000
ãããŒãããŸãã ïŒChromeã¯ç§ããã¹ããããã®ã§ããïŒ
6ïŒ lrzsz
ã€ã³ã¹ããŒã«ãããŠãããã·ã³ã«SSHæ¥ç¶ããŸãã
7ïŒ rz
ãšå
¥åããã¯ãŒã¯ã¹ããŒã·ã§ã³ãããªã¢ãŒãã«1ã€ä»¥äžã®ãã¡ã€ã«ãéä¿¡ããŸãã
8ïŒ sz <filename1> <filename2> âŠ
ã¯ããã¡ã€ã«ããããã§ã¯ãŒã¯ã¹ããŒã·ã§ã³ã«éä¿¡ããŸãã
ïŒUIã¯èšèšäžæå°éã§ããããããããå®éã®ãå±éã§ããã«æŽç·ŽãããŸããïŒ
ã¹ããã4ã«é¢ããŠïŒã¯ãŒã¯ã¹ããŒã·ã§ã³ã§ä»ãã¹ããããšãã node-gyp
ããã±ãŒãžã®ããŒããã·ã§ã³ã®åé¡ãä¿®æ£ããå¿
èŠããããŸããã
ããŒã¹ããã£ãŒã ã®ããã«æ©èœããŸãïŒFirefoxã®ããã¹ããã¡ã€ã«ã§ãã¹ãæžã¿ïŒã
ã»ãã®å°ãã®ã³ã¡ã³ãïŒ
rz
ã¯äžæ¢ãããŸãããrz/sz
ã¯ãããã€ãã®å¥åŠãªã¹ããŒã¿ã¹çªå·ã端æ«ã«åºåããŸãã@jerch
1ïŒã¯ãã誀ã£ãŠinitã·ãŒã±ã³ã¹ãããªã¬ãŒããå¯èœæ§ããããŸãã ããããStartZMODEMsessionãããã³ããã®ç®çã§ãããŠãŒã¶ãŒã¯å¿ èŠã«å¿ããŠããã¯ã¢ãŠãã§ããŸãã
2ïŒä»ããä¿®æ£ããå¿ èŠããããŸãã
3ïŒã¢ããªã±ãŒã·ã§ã³ã¯ããã©ãŠã¶ã®FileReader APIãšåæããŠprogress
ã€ãã³ããåä¿¡ããŸãã Chromeã¯progress
ã³ã³ãã³ããæäŸããŠããããã§ã; ãã ããFirefoxã¯å®éã«ã¯ãããã®ã€ãã³ãã§ãã¡ã€ã«ã³ã³ãã³ããæäŸããŸããã Chromeã§é©åãªå€§ããã®ãã¡ã€ã«ãéä¿¡ãããšã次ã®ããã«è¡šç€ºãããŸãã
4ïŒã»ãã·ã§ã³éå§æã®å¥åŠãªæåã¯ãZMODEMã®receive-initã·ãŒã±ã³ã¹ã®å°å·å¯èœãªéšåã§ãïŒ **
+ ASCII CAN + B01
+10åã®16é²æå+ CR + 0x8a + XONã 圌ããç»é¢ã«è¡ãã®ã¯éãããšã«åæããŸãã ãã ããããã¯ç§ã䜿çšããZMODEMã«ç²Ÿéãã端æ«ã§ã¯ããªãæšæºçã§ãã ãããã®æåãåé€ããã®ã«ååãªBSæåã端æ«ã«éä¿¡ã§ãããšæããŸããïŒ
é²è¡äžã®è»¢éããã£ã³ã»ã«ããããã®ã³ã³ãããŒã«ãè¿œå ããå¿ èŠããããŸãã ç§ã¯ãŸã ãããåŠçããããã®æè¯ã®æ¹æ³ãæ¢ããŠããŸãã
é²è¡äžã®è»¢éããã£ã³ã»ã«ããããã®ã³ã³ãããŒã«ãè¿œå ããå¿ èŠããããŸãã ç§ã¯ãŸã ãããåŠçããããã®æè¯ã®æ¹æ³ãæ¢ããŠããŸãã
å€åããã¯ã¹ããã¯ããå©ãã«ãªããŸããïŒ
A ZFIN, ZABORT, or TIMEOUT terminates the session; a ZSKIP terminates the processing of
this file.
æœåšçã«ã ä»æ§ãåžžã«æã圹ç«ã€ãšã¯éããŸããã ããšãã°ãZSINITã®åŸã«éä¿¡ãããAttnã·ãŒã±ã³ã¹ã«ã€ããŠèšåããŠããŸãã ä»æ§ã¯ãéä¿¡è
ã«ããŒã¿éä¿¡ãäžæåæ¢ãããæ¹æ³ã瀺åããŠããããã§ãããå®éã«ã¯Attnã䜿çšããŠãããã®ã¯ãªãããã§ãã ESC8ãªãã·ã§ã³ã®å Žåãåæ§ã§ããå®éã«ã¯lrzsz
ã«å®è£
ãããŠãããããããäºå®äžã®ãªãã¡ã¬ã³ã¹å®è£
ã§ãããããESC8ã¯äœ¿çšã§ããŸãããããã¯ãtermiosIEXTENãã©ã°ã§ãã®åé¡ãããŸãåé¿ã§ããã®ã§æ®å¿µã§ãã
ç§ã¯ä»ãä»ã®ãããžã§ã¯ãã«å°ãæéãããã£ãŠããŸãããæ¥é±ã«æ»ã£ãŠããããšæã£ãŠããŸãã
xtermãã©ã°ã€ã³ã«ããããã«ããã®åœ¢ã«é¢ããŠ2ã»ã³ããè¿œå ããå ŽåïŒUIããŸã£ããè¿œå ããã«ãããŒãã¹ããªãŒã ãšåæ§ã«ã€ãã³ããä»ããŠç©äºããã£ã¹ãããããããšãææ¡ããŸãã äœãã®ãããªãã®
term.on('transfer', (transfer) => {
// accept or reject the transfer
transfer.accept();
// listen for progress
transfer.on('progress', ...);
// data chunks arrive
transfer.on('data', ...);
// transfer has finished
transfer.once('end', ...);
// cancel transfer
transfer.abort();
});
ãã®ããã«ããŠãã³ã³ã·ã¥ãŒããŒã¯ãã©ã°ã€ã³ã®äžã«ç¬èªã®UIãæ§ç¯ã§ããŸãã
@mofuxããã¯ç§ããããåæ§ã«æ©èœããããæ¹æ³ã§ãã ãã¢ã«å ¥ããUIã³ã³ããŒãã³ãã¯ãã³ã³ãããŒã«ã瀺ãããã ãã®ãã®ã§ãã
@FGasperãç²ãæ§
APIã䜿çšããæºåãã§ãããïŒhttps://github.com/tsl0922/ttyd/issues/37ïŒãttydã®ZModemãµããŒããè¿œå ããŸããäœæ¥ã«æè¬ããŸãã
https://www.npmjs.com/package/zmodem.js
zmodem.jsã®ã¢ã«ãã¡ãªãªãŒã¹ãäœæããŸããã ãããããxterm.jsã®ãã©ã°ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã確èªããŸãããzmodem.jsã確èªãããå Žåã¯ãé æ ®ãªã確èªããŠãã©ã®ããã«æ©èœãããããç¥ãããã ããã
åèãŸã§ã«ãZMODEMã¢ããªã³ãããŒãžãããŸããã
win7ã·ã¹ãã
$ npm run start-zmodem
> [email protected] start-zmodem E:\test\xterm\xterm.js
> node demo/zmodem/app
App listening to http://127.0.0.1:3100
ãªããã¡ã€ã«ãšã¯ã¹ãããŒã©ãŒãéãããšãã§ããªãã®ã§ããïŒ
æãåèã«ãªãã³ã¡ã³ã
xtermãã©ã°ã€ã³ã«ããããã«ããã®åœ¢ã«é¢ããŠ2ã»ã³ããè¿œå ããå ŽåïŒUIããŸã£ããè¿œå ããã«ãããŒãã¹ããªãŒã ãšåæ§ã«ã€ãã³ããä»ããŠç©äºããã£ã¹ãããããããšãææ¡ããŸãã äœãã®ãããªãã®
ãã®ããã«ããŠãã³ã³ã·ã¥ãŒããŒã¯ãã©ã°ã€ã³ã®äžã«ç¬èªã®UIãæ§ç¯ã§ããŸãã