node-pty 1.2.0-beta.6 → 1.2.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +3 -5
  2. package/binding.gyp +20 -38
  3. package/lib/windowsPtyAgent.js +32 -95
  4. package/lib/windowsTerminal.js +1 -1
  5. package/package.json +6 -5
  6. package/prebuilds/darwin-arm64/pty.node +0 -0
  7. package/prebuilds/darwin-arm64/spawn-helper +0 -0
  8. package/prebuilds/darwin-x64/pty.node +0 -0
  9. package/prebuilds/darwin-x64/spawn-helper +0 -0
  10. package/prebuilds/win32-arm64/conpty.node +0 -0
  11. package/prebuilds/win32-arm64/conpty.pdb +0 -0
  12. package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  13. package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  14. package/prebuilds/win32-x64/conpty.node +0 -0
  15. package/prebuilds/win32-x64/conpty.pdb +0 -0
  16. package/prebuilds/win32-x64/conpty_console_list.node +0 -0
  17. package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  18. package/scripts/post-install.js +1 -5
  19. package/src/win/conpty.cc +1 -2
  20. package/typings/node-pty.d.ts +9 -8
  21. package/deps/.editorconfig +0 -2
  22. package/deps/winpty/.drone.yml +0 -17
  23. package/deps/winpty/.gitattributes +0 -19
  24. package/deps/winpty/LICENSE +0 -21
  25. package/deps/winpty/Makefile +0 -166
  26. package/deps/winpty/README.md +0 -151
  27. package/deps/winpty/RELEASES.md +0 -280
  28. package/deps/winpty/VERSION.txt +0 -1
  29. package/deps/winpty/configure +0 -167
  30. package/deps/winpty/misc/BufferResizeTests.cc +0 -90
  31. package/deps/winpty/misc/ChangeScreenBuffer.cc +0 -53
  32. package/deps/winpty/misc/ClearConsole.cc +0 -72
  33. package/deps/winpty/misc/ConinMode.cc +0 -117
  34. package/deps/winpty/misc/ConinMode.ps1 +0 -116
  35. package/deps/winpty/misc/ConoutMode.cc +0 -113
  36. package/deps/winpty/misc/DebugClient.py +0 -42
  37. package/deps/winpty/misc/DebugServer.py +0 -63
  38. package/deps/winpty/misc/DumpLines.py +0 -5
  39. package/deps/winpty/misc/EnableExtendedFlags.txt +0 -46
  40. package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +0 -528
  41. package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +0 -633
  42. package/deps/winpty/misc/Font-Report-June2016/CP932.txt +0 -630
  43. package/deps/winpty/misc/Font-Report-June2016/CP936.txt +0 -630
  44. package/deps/winpty/misc/Font-Report-June2016/CP949.txt +0 -630
  45. package/deps/winpty/misc/Font-Report-June2016/CP950.txt +0 -630
  46. package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +0 -16
  47. package/deps/winpty/misc/Font-Report-June2016/Results.txt +0 -4
  48. package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +0 -144
  49. package/deps/winpty/misc/FontSurvey.cc +0 -100
  50. package/deps/winpty/misc/FormatChar.h +0 -21
  51. package/deps/winpty/misc/FreezePerfTest.cc +0 -62
  52. package/deps/winpty/misc/GetCh.cc +0 -20
  53. package/deps/winpty/misc/GetConsolePos.cc +0 -41
  54. package/deps/winpty/misc/GetFont.cc +0 -261
  55. package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +0 -51
  56. package/deps/winpty/misc/IsNewConsole.cc +0 -87
  57. package/deps/winpty/misc/MouseInputNotes.txt +0 -90
  58. package/deps/winpty/misc/MoveConsoleWindow.cc +0 -34
  59. package/deps/winpty/misc/Notes.txt +0 -219
  60. package/deps/winpty/misc/OSVersion.cc +0 -27
  61. package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +0 -101
  62. package/deps/winpty/misc/ScreenBufferTest.cc +0 -671
  63. package/deps/winpty/misc/ScreenBufferTest2.cc +0 -151
  64. package/deps/winpty/misc/SelectAllTest.cc +0 -45
  65. package/deps/winpty/misc/SetBufferSize.cc +0 -32
  66. package/deps/winpty/misc/SetCursorPos.cc +0 -10
  67. package/deps/winpty/misc/SetFont.cc +0 -145
  68. package/deps/winpty/misc/SetWindowRect.cc +0 -36
  69. package/deps/winpty/misc/ShowArgv.cc +0 -12
  70. package/deps/winpty/misc/ShowConsoleInput.cc +0 -40
  71. package/deps/winpty/misc/Spew.py +0 -5
  72. package/deps/winpty/misc/TestUtil.cc +0 -172
  73. package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +0 -102
  74. package/deps/winpty/misc/UnicodeWideTest1.cc +0 -246
  75. package/deps/winpty/misc/UnicodeWideTest2.cc +0 -130
  76. package/deps/winpty/misc/UnixEcho.cc +0 -89
  77. package/deps/winpty/misc/Utf16Echo.cc +0 -46
  78. package/deps/winpty/misc/VeryLargeRead.cc +0 -122
  79. package/deps/winpty/misc/VkEscapeTest.cc +0 -56
  80. package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +0 -52
  81. package/deps/winpty/misc/Win10WrapTest1.cc +0 -57
  82. package/deps/winpty/misc/Win10WrapTest2.cc +0 -30
  83. package/deps/winpty/misc/Win32Echo1.cc +0 -26
  84. package/deps/winpty/misc/Win32Echo2.cc +0 -19
  85. package/deps/winpty/misc/Win32Test1.cc +0 -46
  86. package/deps/winpty/misc/Win32Test2.cc +0 -70
  87. package/deps/winpty/misc/Win32Test3.cc +0 -78
  88. package/deps/winpty/misc/Win32Write1.cc +0 -44
  89. package/deps/winpty/misc/WindowsBugCrashReader.cc +0 -27
  90. package/deps/winpty/misc/WriteConsole.cc +0 -106
  91. package/deps/winpty/misc/build32.sh +0 -9
  92. package/deps/winpty/misc/build64.sh +0 -9
  93. package/deps/winpty/misc/color-test.sh +0 -212
  94. package/deps/winpty/misc/font-notes.txt +0 -300
  95. package/deps/winpty/misc/winbug-15048.cc +0 -201
  96. package/deps/winpty/ship/build-pty4j-libpty.bat +0 -36
  97. package/deps/winpty/ship/common_ship.py +0 -53
  98. package/deps/winpty/ship/make_msvc_package.py +0 -165
  99. package/deps/winpty/ship/ship.py +0 -108
  100. package/deps/winpty/src/agent/Agent.cc +0 -613
  101. package/deps/winpty/src/agent/Agent.h +0 -103
  102. package/deps/winpty/src/agent/AgentCreateDesktop.cc +0 -84
  103. package/deps/winpty/src/agent/AgentCreateDesktop.h +0 -28
  104. package/deps/winpty/src/agent/ConsoleFont.cc +0 -632
  105. package/deps/winpty/src/agent/ConsoleFont.h +0 -28
  106. package/deps/winpty/src/agent/ConsoleInput.cc +0 -852
  107. package/deps/winpty/src/agent/ConsoleInput.h +0 -109
  108. package/deps/winpty/src/agent/ConsoleInputReencoding.cc +0 -121
  109. package/deps/winpty/src/agent/ConsoleInputReencoding.h +0 -36
  110. package/deps/winpty/src/agent/ConsoleLine.cc +0 -152
  111. package/deps/winpty/src/agent/ConsoleLine.h +0 -41
  112. package/deps/winpty/src/agent/Coord.h +0 -87
  113. package/deps/winpty/src/agent/DebugShowInput.cc +0 -239
  114. package/deps/winpty/src/agent/DebugShowInput.h +0 -32
  115. package/deps/winpty/src/agent/DefaultInputMap.cc +0 -422
  116. package/deps/winpty/src/agent/DefaultInputMap.h +0 -28
  117. package/deps/winpty/src/agent/DsrSender.h +0 -30
  118. package/deps/winpty/src/agent/EventLoop.cc +0 -99
  119. package/deps/winpty/src/agent/EventLoop.h +0 -47
  120. package/deps/winpty/src/agent/InputMap.cc +0 -246
  121. package/deps/winpty/src/agent/InputMap.h +0 -114
  122. package/deps/winpty/src/agent/LargeConsoleRead.cc +0 -71
  123. package/deps/winpty/src/agent/LargeConsoleRead.h +0 -68
  124. package/deps/winpty/src/agent/NamedPipe.cc +0 -378
  125. package/deps/winpty/src/agent/NamedPipe.h +0 -125
  126. package/deps/winpty/src/agent/Scraper.cc +0 -699
  127. package/deps/winpty/src/agent/Scraper.h +0 -103
  128. package/deps/winpty/src/agent/SimplePool.h +0 -75
  129. package/deps/winpty/src/agent/SmallRect.h +0 -143
  130. package/deps/winpty/src/agent/Terminal.cc +0 -535
  131. package/deps/winpty/src/agent/Terminal.h +0 -69
  132. package/deps/winpty/src/agent/UnicodeEncoding.h +0 -157
  133. package/deps/winpty/src/agent/UnicodeEncodingTest.cc +0 -189
  134. package/deps/winpty/src/agent/Win32Console.cc +0 -107
  135. package/deps/winpty/src/agent/Win32Console.h +0 -67
  136. package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +0 -193
  137. package/deps/winpty/src/agent/Win32ConsoleBuffer.h +0 -99
  138. package/deps/winpty/src/agent/main.cc +0 -114
  139. package/deps/winpty/src/agent/subdir.mk +0 -61
  140. package/deps/winpty/src/configurations.gypi +0 -60
  141. package/deps/winpty/src/debugserver/DebugServer.cc +0 -117
  142. package/deps/winpty/src/debugserver/subdir.mk +0 -41
  143. package/deps/winpty/src/include/winpty.h +0 -242
  144. package/deps/winpty/src/include/winpty_constants.h +0 -131
  145. package/deps/winpty/src/libwinpty/AgentLocation.cc +0 -75
  146. package/deps/winpty/src/libwinpty/AgentLocation.h +0 -28
  147. package/deps/winpty/src/libwinpty/LibWinptyException.h +0 -54
  148. package/deps/winpty/src/libwinpty/WinptyInternal.h +0 -72
  149. package/deps/winpty/src/libwinpty/subdir.mk +0 -46
  150. package/deps/winpty/src/libwinpty/winpty.cc +0 -970
  151. package/deps/winpty/src/shared/AgentMsg.h +0 -38
  152. package/deps/winpty/src/shared/BackgroundDesktop.cc +0 -122
  153. package/deps/winpty/src/shared/BackgroundDesktop.h +0 -73
  154. package/deps/winpty/src/shared/Buffer.cc +0 -103
  155. package/deps/winpty/src/shared/Buffer.h +0 -102
  156. package/deps/winpty/src/shared/DebugClient.cc +0 -187
  157. package/deps/winpty/src/shared/DebugClient.h +0 -38
  158. package/deps/winpty/src/shared/GenRandom.cc +0 -138
  159. package/deps/winpty/src/shared/GenRandom.h +0 -55
  160. package/deps/winpty/src/shared/GetCommitHash.bat +0 -13
  161. package/deps/winpty/src/shared/Mutex.h +0 -54
  162. package/deps/winpty/src/shared/OsModule.h +0 -63
  163. package/deps/winpty/src/shared/OwnedHandle.cc +0 -36
  164. package/deps/winpty/src/shared/OwnedHandle.h +0 -45
  165. package/deps/winpty/src/shared/PrecompiledHeader.h +0 -43
  166. package/deps/winpty/src/shared/StringBuilder.h +0 -227
  167. package/deps/winpty/src/shared/StringBuilderTest.cc +0 -114
  168. package/deps/winpty/src/shared/StringUtil.cc +0 -55
  169. package/deps/winpty/src/shared/StringUtil.h +0 -80
  170. package/deps/winpty/src/shared/TimeMeasurement.h +0 -63
  171. package/deps/winpty/src/shared/UnixCtrlChars.h +0 -45
  172. package/deps/winpty/src/shared/UpdateGenVersion.bat +0 -20
  173. package/deps/winpty/src/shared/WindowsSecurity.cc +0 -460
  174. package/deps/winpty/src/shared/WindowsSecurity.h +0 -104
  175. package/deps/winpty/src/shared/WindowsVersion.cc +0 -252
  176. package/deps/winpty/src/shared/WindowsVersion.h +0 -29
  177. package/deps/winpty/src/shared/WinptyAssert.cc +0 -55
  178. package/deps/winpty/src/shared/WinptyAssert.h +0 -64
  179. package/deps/winpty/src/shared/WinptyException.cc +0 -57
  180. package/deps/winpty/src/shared/WinptyException.h +0 -43
  181. package/deps/winpty/src/shared/WinptyVersion.cc +0 -42
  182. package/deps/winpty/src/shared/WinptyVersion.h +0 -27
  183. package/deps/winpty/src/shared/winpty_snprintf.h +0 -99
  184. package/deps/winpty/src/subdir.mk +0 -5
  185. package/deps/winpty/src/tests/subdir.mk +0 -28
  186. package/deps/winpty/src/tests/trivial_test.cc +0 -158
  187. package/deps/winpty/src/unix-adapter/InputHandler.cc +0 -114
  188. package/deps/winpty/src/unix-adapter/InputHandler.h +0 -56
  189. package/deps/winpty/src/unix-adapter/OutputHandler.cc +0 -80
  190. package/deps/winpty/src/unix-adapter/OutputHandler.h +0 -53
  191. package/deps/winpty/src/unix-adapter/Util.cc +0 -86
  192. package/deps/winpty/src/unix-adapter/Util.h +0 -31
  193. package/deps/winpty/src/unix-adapter/WakeupFd.cc +0 -70
  194. package/deps/winpty/src/unix-adapter/WakeupFd.h +0 -42
  195. package/deps/winpty/src/unix-adapter/main.cc +0 -729
  196. package/deps/winpty/src/unix-adapter/subdir.mk +0 -41
  197. package/deps/winpty/src/winpty.gyp +0 -236
  198. package/deps/winpty/vcbuild.bat +0 -83
  199. package/lib/conpty_console_list_agent.js.map +0 -1
  200. package/lib/eventEmitter2.js.map +0 -1
  201. package/lib/eventEmitter2.test.js +0 -30
  202. package/lib/eventEmitter2.test.js.map +0 -1
  203. package/lib/index.js.map +0 -1
  204. package/lib/interfaces.js.map +0 -1
  205. package/lib/shared/conout.js.map +0 -1
  206. package/lib/terminal.js.map +0 -1
  207. package/lib/terminal.test.js +0 -139
  208. package/lib/terminal.test.js.map +0 -1
  209. package/lib/testUtils.test.js +0 -28
  210. package/lib/testUtils.test.js.map +0 -1
  211. package/lib/types.js.map +0 -1
  212. package/lib/unixTerminal.js.map +0 -1
  213. package/lib/unixTerminal.test.js +0 -381
  214. package/lib/unixTerminal.test.js.map +0 -1
  215. package/lib/utils.js.map +0 -1
  216. package/lib/windowsConoutConnection.js.map +0 -1
  217. package/lib/windowsPtyAgent.js.map +0 -1
  218. package/lib/windowsPtyAgent.test.js +0 -90
  219. package/lib/windowsPtyAgent.test.js.map +0 -1
  220. package/lib/windowsTerminal.js.map +0 -1
  221. package/lib/windowsTerminal.test.js +0 -219
  222. package/lib/windowsTerminal.test.js.map +0 -1
  223. package/lib/worker/conoutSocketWorker.js.map +0 -1
  224. package/prebuilds/win32-arm64/pty.node +0 -0
  225. package/prebuilds/win32-arm64/pty.pdb +0 -0
  226. package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
  227. package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
  228. package/prebuilds/win32-arm64/winpty.dll +0 -0
  229. package/prebuilds/win32-arm64/winpty.pdb +0 -0
  230. package/prebuilds/win32-x64/pty.node +0 -0
  231. package/prebuilds/win32-x64/pty.pdb +0 -0
  232. package/prebuilds/win32-x64/winpty-agent.exe +0 -0
  233. package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
  234. package/prebuilds/win32-x64/winpty.dll +0 -0
  235. package/prebuilds/win32-x64/winpty.pdb +0 -0
  236. package/scripts/gen-compile-commands.js +0 -8
  237. package/scripts/increment-version.js +0 -54
  238. package/scripts/linux/checksums.txt +0 -2
  239. package/scripts/linux/install-sysroot.js +0 -158
  240. package/scripts/linux/verify-glibc-requirements.sh +0 -36
  241. package/src/conpty_console_list_agent.ts +0 -15
  242. package/src/eventEmitter2.test.ts +0 -30
  243. package/src/eventEmitter2.ts +0 -48
  244. package/src/index.ts +0 -52
  245. package/src/interfaces.ts +0 -130
  246. package/src/native.d.ts +0 -54
  247. package/src/shared/conout.ts +0 -15
  248. package/src/terminal.test.ts +0 -119
  249. package/src/terminal.ts +0 -211
  250. package/src/testUtils.test.ts +0 -23
  251. package/src/tsconfig.json +0 -22
  252. package/src/types.ts +0 -15
  253. package/src/unixTerminal.test.ts +0 -398
  254. package/src/unixTerminal.ts +0 -388
  255. package/src/utils.ts +0 -29
  256. package/src/win/winpty.cc +0 -333
  257. package/src/windowsConoutConnection.ts +0 -82
  258. package/src/windowsPtyAgent.test.ts +0 -94
  259. package/src/windowsPtyAgent.ts +0 -321
  260. package/src/windowsTerminal.test.ts +0 -229
  261. package/src/windowsTerminal.ts +0 -203
  262. package/src/worker/conoutSocketWorker.ts +0 -22
@@ -1,398 +0,0 @@
1
- /**
2
- * Copyright (c) 2017, Daniel Imms (MIT License).
3
- * Copyright (c) 2018, Microsoft Corporation (MIT License).
4
- */
5
-
6
- import { UnixTerminal } from './unixTerminal';
7
- import * as assert from 'assert';
8
- import * as cp from 'child_process';
9
- import * as path from 'path';
10
- import * as tty from 'tty';
11
- import * as fs from 'fs';
12
- import { constants } from 'os';
13
- import { pollUntil } from './testUtils.test';
14
- import { pid } from 'process';
15
-
16
- const FIXTURES_PATH = path.normalize(path.join(__dirname, '..', 'fixtures', 'utf8-character.txt'));
17
-
18
- if (process.platform !== 'win32') {
19
- describe('UnixTerminal', () => {
20
- describe('Constructor', () => {
21
- it('should set a valid pts name', () => {
22
- const term = new UnixTerminal('/bin/bash', [], {});
23
- let regExp: RegExp | undefined;
24
- if (process.platform === 'linux') {
25
- // https://linux.die.net/man/4/pts
26
- regExp = /^\/dev\/pts\/\d+$/;
27
- }
28
- if (process.platform === 'darwin') {
29
- // https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man4/pty.4.html
30
- regExp = /^\/dev\/tty[p-sP-S][a-z0-9]+$/;
31
- }
32
- if (regExp) {
33
- assert.ok(regExp.test(term.ptsName), '"' + term.ptsName + '" should match ' + regExp.toString());
34
- }
35
- assert.ok(tty.isatty(term.fd));
36
- });
37
- });
38
-
39
- describe('PtyForkEncodingOption', () => {
40
- it('should default to utf8', (done) => {
41
- const term = new UnixTerminal('/bin/bash', [ '-c', `cat "${FIXTURES_PATH}"` ]);
42
- term.on('data', (data) => {
43
- assert.strictEqual(typeof data, 'string');
44
- assert.strictEqual(data, '\u00E6');
45
- done();
46
- });
47
- });
48
- it('should return a Buffer when encoding is null', (done) => {
49
- const term = new UnixTerminal('/bin/bash', [ '-c', `cat "${FIXTURES_PATH}"` ], {
50
- encoding: null
51
- });
52
- term.on('data', (data) => {
53
- assert.strictEqual(typeof data, 'object');
54
- assert.ok(data instanceof Buffer);
55
- assert.strictEqual(0xC3, data[0]);
56
- assert.strictEqual(0xA6, data[1]);
57
- done();
58
- });
59
- });
60
- it('should support other encodings', (done) => {
61
- const text = 'test æ!';
62
- const term = new UnixTerminal(undefined, ['-c', 'echo "' + text + '"'], {
63
- encoding: 'base64'
64
- });
65
- let buffer = '';
66
- term.onData((data) => {
67
- assert.strictEqual(typeof data, 'string');
68
- buffer += data;
69
- });
70
- term.onExit(() => {
71
- assert.strictEqual(Buffer.alloc(8, buffer, 'base64').toString().replace('\r', '').replace('\n', ''), text);
72
- done();
73
- });
74
- });
75
- });
76
-
77
- describe('open', () => {
78
- let term: UnixTerminal;
79
-
80
- afterEach(() => {
81
- if (term) {
82
- term.slave!.destroy();
83
- term.master!.destroy();
84
- }
85
- });
86
-
87
- it('should open a pty with access to a master and slave socket', (done) => {
88
- term = UnixTerminal.open({});
89
-
90
- let slavebuf = '';
91
- term.slave!.on('data', (data) => {
92
- slavebuf += data;
93
- });
94
-
95
- let masterbuf = '';
96
- term.master!.on('data', (data) => {
97
- masterbuf += data;
98
- });
99
-
100
- pollUntil(() => {
101
- if (masterbuf === 'slave\r\nmaster\r\n' && slavebuf === 'master\n') {
102
- done();
103
- return true;
104
- }
105
- return false;
106
- }, 200, 10);
107
-
108
- term.slave!.write('slave\n');
109
- term.master!.write('master\n');
110
- });
111
- });
112
- describe('close', () => {
113
- const term = new UnixTerminal('node');
114
- it('should exit when terminal is destroyed programmatically', (done) => {
115
- term.on('exit', (code, signal) => {
116
- assert.strictEqual(code, 0);
117
- assert.strictEqual(signal, constants.signals.SIGHUP);
118
- done();
119
- });
120
- term.destroy();
121
- });
122
- });
123
- describe('signals in parent and child', () => {
124
- it('SIGINT - custom in parent and child', done => {
125
- // this test is cumbersome - we have to run it in a sub process to
126
- // see behavior of SIGINT handlers
127
- const data = `
128
- var pty = require('./lib/index');
129
- process.on('SIGINT', () => console.log('SIGINT in parent'));
130
- var ptyProcess = pty.spawn('node', ['-e', 'process.on("SIGINT", ()=>console.log("SIGINT in child"));setTimeout(() => null, 300);'], {
131
- name: 'xterm-color',
132
- cols: 80,
133
- rows: 30,
134
- cwd: process.env.HOME,
135
- env: process.env
136
- });
137
- ptyProcess.on('data', function (data) {
138
- console.log(data);
139
- });
140
- setTimeout(() => null, 500);
141
- console.log('ready', ptyProcess.pid);
142
- `;
143
- const buffer: string[] = [];
144
- const p = cp.spawn('node', ['-e', data]);
145
- let sub = '';
146
- p.stdout.on('data', (data) => {
147
- if (!data.toString().indexOf('ready')) {
148
- sub = data.toString().split(' ')[1].slice(0, -1);
149
- setTimeout(() => {
150
- process.kill(parseInt(sub), 'SIGINT'); // SIGINT to child
151
- p.kill('SIGINT'); // SIGINT to parent
152
- }, 200);
153
- } else {
154
- buffer.push(data.toString().replace(/^\s+|\s+$/g, ''));
155
- }
156
- });
157
- p.on('close', () => {
158
- // handlers in parent and child should have been triggered
159
- assert.strictEqual(buffer.indexOf('SIGINT in child') !== -1, true);
160
- assert.strictEqual(buffer.indexOf('SIGINT in parent') !== -1, true);
161
- done();
162
- });
163
- });
164
- it('SIGINT - custom in parent, default in child', done => {
165
- // this tests the original idea of the signal(...) change in pty.cc:
166
- // to make sure the SIGINT handler of a pty child is reset to default
167
- // and does not interfere with the handler in the parent
168
- const data = `
169
- var pty = require('./lib/index');
170
- process.on('SIGINT', () => console.log('SIGINT in parent'));
171
- var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log("should not be printed"), 300);'], {
172
- name: 'xterm-color',
173
- cols: 80,
174
- rows: 30,
175
- cwd: process.env.HOME,
176
- env: process.env
177
- });
178
- ptyProcess.on('data', function (data) {
179
- console.log(data);
180
- });
181
- setTimeout(() => null, 500);
182
- console.log('ready', ptyProcess.pid);
183
- `;
184
- const buffer: string[] = [];
185
- const p = cp.spawn('node', ['-e', data]);
186
- let sub = '';
187
- p.stdout.on('data', (data) => {
188
- if (!data.toString().indexOf('ready')) {
189
- sub = data.toString().split(' ')[1].slice(0, -1);
190
- setTimeout(() => {
191
- process.kill(parseInt(sub), 'SIGINT'); // SIGINT to child
192
- p.kill('SIGINT'); // SIGINT to parent
193
- }, 200);
194
- } else {
195
- buffer.push(data.toString().replace(/^\s+|\s+$/g, ''));
196
- }
197
- });
198
- p.on('close', () => {
199
- // handlers in parent and child should have been triggered
200
- assert.strictEqual(buffer.indexOf('should not be printed') !== -1, false);
201
- assert.strictEqual(buffer.indexOf('SIGINT in parent') !== -1, true);
202
- done();
203
- });
204
- });
205
- it('SIGHUP default (child only)', done => {
206
- const term = new UnixTerminal('node', [ '-e', `
207
- console.log('ready');
208
- setTimeout(()=>console.log('timeout'), 200);`
209
- ]);
210
- let buffer = '';
211
- term.on('data', (data) => {
212
- if (data === 'ready\r\n') {
213
- term.kill();
214
- } else {
215
- buffer += data;
216
- }
217
- });
218
- term.on('exit', () => {
219
- // no timeout in buffer
220
- assert.strictEqual(buffer, '');
221
- done();
222
- });
223
- });
224
- it('SIGUSR1 - custom in parent and child', done => {
225
- let pHandlerCalled = 0;
226
- const handleSigUsr = function(h: any): any {
227
- return function(): void {
228
- pHandlerCalled += 1;
229
- process.removeListener('SIGUSR1', h);
230
- };
231
- };
232
- process.on('SIGUSR1', handleSigUsr(handleSigUsr));
233
-
234
- const term = new UnixTerminal('node', [ '-e', `
235
- process.on('SIGUSR1', () => {
236
- console.log('SIGUSR1 in child');
237
- });
238
- console.log('ready');
239
- setTimeout(()=>null, 200);`
240
- ]);
241
- let buffer = '';
242
- term.on('data', (data) => {
243
- if (data === 'ready\r\n') {
244
- process.kill(process.pid, 'SIGUSR1');
245
- term.kill('SIGUSR1');
246
- } else {
247
- buffer += data;
248
- }
249
- });
250
- term.on('exit', () => {
251
- // should have called both handlers and only once
252
- assert.strictEqual(pHandlerCalled, 1);
253
- assert.strictEqual(buffer, 'SIGUSR1 in child\r\n');
254
- done();
255
- });
256
- });
257
- });
258
- describe('spawn', () => {
259
- if (process.platform === 'linux') {
260
- it('should not leak pty file descriptors to child processes', (done) => {
261
- // Spawn 3 ptys - the 3rd should not see FDs from the first two
262
- const ptys: UnixTerminal[] = [];
263
- for (let i = 0; i < 3; i++) {
264
- ptys.push(new UnixTerminal('/bin/bash', [], {}));
265
- }
266
-
267
- let output = '';
268
- ptys[2].onData((data) => {
269
- output += data;
270
- });
271
-
272
- // Check for ptmx FDs in the 3rd terminal's shell
273
- ptys[2].write('echo "PTMX_COUNT:$(file /proc/$$/fd/* 2>/dev/null | grep -c ptmx)"\n');
274
-
275
- setTimeout(() => {
276
- for (const pty of ptys) {
277
- pty.kill();
278
- }
279
- // Extract the count from output - should be 0
280
- const match = output.match(/PTMX_COUNT:(\d+)/);
281
- assert.ok(match, `Could not find PTMX_COUNT in output: ${output}`);
282
- assert.strictEqual(match![1], '0', `Expected 0 ptmx FDs but got ${match![1]}`);
283
- done();
284
- }, 1000);
285
- });
286
- }
287
- if (process.platform === 'darwin') {
288
- it('should return the name of the process', (done) => {
289
- const term = new UnixTerminal('/bin/echo');
290
- assert.strictEqual(term.process, '/bin/echo');
291
- term.on('exit', () => done());
292
- term.destroy();
293
- });
294
- it('should return the name of the sub process', (done) => {
295
- const data = `
296
- var pty = require('./lib/index');
297
- var ptyProcess = pty.spawn('zsh', ['-c', 'python3'], {
298
- env: process.env
299
- });
300
- ptyProcess.on('data', function (data) {
301
- if (ptyProcess.process === 'Python') {
302
- console.log('title', ptyProcess.process);
303
- console.log('ready', ptyProcess.pid);
304
- }
305
- });
306
- `;
307
- const p = cp.spawn('node', ['-e', data]);
308
- let sub = '';
309
- let pid = '';
310
- p.stdout.on('data', (data) => {
311
- const lines = data.toString().split('\n');
312
- for (const line of lines) {
313
- if (line.startsWith('title ')) {
314
- sub = line.split(' ')[1];
315
- } else if (line.startsWith('ready ')) {
316
- pid = line.split(' ')[1];
317
- process.kill(parseInt(pid), 'SIGINT');
318
- p.kill('SIGINT');
319
- }
320
- }
321
- });
322
- p.on('exit', () => {
323
- assert.notStrictEqual(pid, '');
324
- assert.strictEqual(sub, 'Python');
325
- done();
326
- });
327
- });
328
- it('should close on exec', (done) => {
329
- const data = `
330
- var pty = require('./lib/index');
331
- var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log("hello from terminal"), 300);']);
332
- ptyProcess.on('data', function (data) {
333
- console.log(data);
334
- });
335
- setTimeout(() => null, 500);
336
- console.log('ready', ptyProcess.pid);
337
- `;
338
- const buffer: string[] = [];
339
- const readFd = fs.openSync(FIXTURES_PATH, 'r');
340
- const p = cp.spawn('node', ['-e', data], {
341
- stdio: ['ignore', 'pipe', 'pipe', readFd]
342
- });
343
- let sub = '';
344
- p.stdout!.on('data', (data) => {
345
- if (!data.toString().indexOf('ready')) {
346
- sub = data.toString().split(' ')[1].slice(0, -1);
347
- try {
348
- fs.statSync(`/proc/${sub}/fd/${readFd}`);
349
- done('not reachable');
350
- } catch (error) {
351
- assert.notStrictEqual(error.message.indexOf('ENOENT'), -1);
352
- }
353
- setTimeout(() => {
354
- process.kill(parseInt(sub), 'SIGINT'); // SIGINT to child
355
- p.kill('SIGINT'); // SIGINT to parent
356
- }, 200);
357
- } else {
358
- buffer.push(data.toString().replace(/^\s+|\s+$/g, ''));
359
- }
360
- });
361
- p.on('close', () => {
362
- done();
363
- });
364
- });
365
- }
366
- it('should handle exec() errors', (done) => {
367
- const term = new UnixTerminal('/bin/bogus.exe', []);
368
- term.on('exit', (code, signal) => {
369
- assert.strictEqual(code, 1);
370
- done();
371
- });
372
- });
373
- it('should handle chdir() errors', (done) => {
374
- const term = new UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
375
- term.on('exit', (code, signal) => {
376
- assert.strictEqual(code, 1);
377
- done();
378
- });
379
- });
380
- it('should not leak child process', (done) => {
381
- const count = cp.execSync('ps -ax | grep node | wc -l');
382
- const term = new UnixTerminal('node', [ '-e', `
383
- console.log('ready');
384
- setTimeout(()=>console.log('timeout'), 200);`
385
- ]);
386
- term.on('data', async (data) => {
387
- if (data === 'ready\r\n') {
388
- process.kill(term.pid, 'SIGINT');
389
- await setTimeout(() => null, 1000);
390
- const newCount = cp.execSync('ps -ax | grep node | wc -l');
391
- assert.strictEqual(count.toString(), newCount.toString());
392
- done();
393
- }
394
- });
395
- });
396
- });
397
- });
398
- }