@shitiandmw/node-pty 1.1.0-agent.0

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 (288) hide show
  1. package/LICENSE +69 -0
  2. package/README.md +170 -0
  3. package/binding.gyp +111 -0
  4. package/deps/.editorconfig +2 -0
  5. package/deps/winpty/.drone.yml +17 -0
  6. package/deps/winpty/.gitattributes +19 -0
  7. package/deps/winpty/LICENSE +21 -0
  8. package/deps/winpty/Makefile +166 -0
  9. package/deps/winpty/README.md +151 -0
  10. package/deps/winpty/RELEASES.md +280 -0
  11. package/deps/winpty/VERSION.txt +1 -0
  12. package/deps/winpty/configure +167 -0
  13. package/deps/winpty/misc/BufferResizeTests.cc +90 -0
  14. package/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
  15. package/deps/winpty/misc/ClearConsole.cc +72 -0
  16. package/deps/winpty/misc/ConinMode.cc +117 -0
  17. package/deps/winpty/misc/ConinMode.ps1 +116 -0
  18. package/deps/winpty/misc/ConoutMode.cc +113 -0
  19. package/deps/winpty/misc/DebugClient.py +42 -0
  20. package/deps/winpty/misc/DebugServer.py +63 -0
  21. package/deps/winpty/misc/DumpLines.py +5 -0
  22. package/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
  23. package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
  24. package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
  25. package/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
  26. package/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
  27. package/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
  28. package/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
  29. package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
  30. package/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
  31. package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
  32. package/deps/winpty/misc/FontSurvey.cc +100 -0
  33. package/deps/winpty/misc/FormatChar.h +21 -0
  34. package/deps/winpty/misc/FreezePerfTest.cc +62 -0
  35. package/deps/winpty/misc/GetCh.cc +20 -0
  36. package/deps/winpty/misc/GetConsolePos.cc +41 -0
  37. package/deps/winpty/misc/GetFont.cc +261 -0
  38. package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
  39. package/deps/winpty/misc/IsNewConsole.cc +87 -0
  40. package/deps/winpty/misc/MouseInputNotes.txt +90 -0
  41. package/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
  42. package/deps/winpty/misc/Notes.txt +219 -0
  43. package/deps/winpty/misc/OSVersion.cc +27 -0
  44. package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
  45. package/deps/winpty/misc/ScreenBufferTest.cc +671 -0
  46. package/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
  47. package/deps/winpty/misc/SelectAllTest.cc +45 -0
  48. package/deps/winpty/misc/SetBufferSize.cc +32 -0
  49. package/deps/winpty/misc/SetCursorPos.cc +10 -0
  50. package/deps/winpty/misc/SetFont.cc +145 -0
  51. package/deps/winpty/misc/SetWindowRect.cc +36 -0
  52. package/deps/winpty/misc/ShowArgv.cc +12 -0
  53. package/deps/winpty/misc/ShowConsoleInput.cc +40 -0
  54. package/deps/winpty/misc/Spew.py +5 -0
  55. package/deps/winpty/misc/TestUtil.cc +172 -0
  56. package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
  57. package/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
  58. package/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
  59. package/deps/winpty/misc/UnixEcho.cc +89 -0
  60. package/deps/winpty/misc/Utf16Echo.cc +46 -0
  61. package/deps/winpty/misc/VeryLargeRead.cc +122 -0
  62. package/deps/winpty/misc/VkEscapeTest.cc +56 -0
  63. package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
  64. package/deps/winpty/misc/Win10WrapTest1.cc +57 -0
  65. package/deps/winpty/misc/Win10WrapTest2.cc +30 -0
  66. package/deps/winpty/misc/Win32Echo1.cc +26 -0
  67. package/deps/winpty/misc/Win32Echo2.cc +19 -0
  68. package/deps/winpty/misc/Win32Test1.cc +46 -0
  69. package/deps/winpty/misc/Win32Test2.cc +70 -0
  70. package/deps/winpty/misc/Win32Test3.cc +78 -0
  71. package/deps/winpty/misc/Win32Write1.cc +44 -0
  72. package/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
  73. package/deps/winpty/misc/WriteConsole.cc +106 -0
  74. package/deps/winpty/misc/build32.sh +9 -0
  75. package/deps/winpty/misc/build64.sh +9 -0
  76. package/deps/winpty/misc/color-test.sh +212 -0
  77. package/deps/winpty/misc/font-notes.txt +300 -0
  78. package/deps/winpty/misc/winbug-15048.cc +201 -0
  79. package/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
  80. package/deps/winpty/ship/common_ship.py +53 -0
  81. package/deps/winpty/ship/make_msvc_package.py +165 -0
  82. package/deps/winpty/ship/ship.py +108 -0
  83. package/deps/winpty/src/agent/Agent.cc +613 -0
  84. package/deps/winpty/src/agent/Agent.h +103 -0
  85. package/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
  86. package/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
  87. package/deps/winpty/src/agent/ConsoleFont.cc +632 -0
  88. package/deps/winpty/src/agent/ConsoleFont.h +28 -0
  89. package/deps/winpty/src/agent/ConsoleInput.cc +852 -0
  90. package/deps/winpty/src/agent/ConsoleInput.h +109 -0
  91. package/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
  92. package/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
  93. package/deps/winpty/src/agent/ConsoleLine.cc +152 -0
  94. package/deps/winpty/src/agent/ConsoleLine.h +41 -0
  95. package/deps/winpty/src/agent/Coord.h +87 -0
  96. package/deps/winpty/src/agent/DebugShowInput.cc +239 -0
  97. package/deps/winpty/src/agent/DebugShowInput.h +32 -0
  98. package/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
  99. package/deps/winpty/src/agent/DefaultInputMap.h +28 -0
  100. package/deps/winpty/src/agent/DsrSender.h +30 -0
  101. package/deps/winpty/src/agent/EventLoop.cc +99 -0
  102. package/deps/winpty/src/agent/EventLoop.h +47 -0
  103. package/deps/winpty/src/agent/InputMap.cc +246 -0
  104. package/deps/winpty/src/agent/InputMap.h +114 -0
  105. package/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
  106. package/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
  107. package/deps/winpty/src/agent/NamedPipe.cc +378 -0
  108. package/deps/winpty/src/agent/NamedPipe.h +125 -0
  109. package/deps/winpty/src/agent/Scraper.cc +699 -0
  110. package/deps/winpty/src/agent/Scraper.h +103 -0
  111. package/deps/winpty/src/agent/SimplePool.h +75 -0
  112. package/deps/winpty/src/agent/SmallRect.h +143 -0
  113. package/deps/winpty/src/agent/Terminal.cc +535 -0
  114. package/deps/winpty/src/agent/Terminal.h +69 -0
  115. package/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
  116. package/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
  117. package/deps/winpty/src/agent/Win32Console.cc +107 -0
  118. package/deps/winpty/src/agent/Win32Console.h +67 -0
  119. package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
  120. package/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
  121. package/deps/winpty/src/agent/main.cc +114 -0
  122. package/deps/winpty/src/agent/subdir.mk +61 -0
  123. package/deps/winpty/src/configurations.gypi +60 -0
  124. package/deps/winpty/src/debugserver/DebugServer.cc +117 -0
  125. package/deps/winpty/src/debugserver/subdir.mk +41 -0
  126. package/deps/winpty/src/include/winpty.h +242 -0
  127. package/deps/winpty/src/include/winpty_constants.h +131 -0
  128. package/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
  129. package/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
  130. package/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
  131. package/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
  132. package/deps/winpty/src/libwinpty/subdir.mk +46 -0
  133. package/deps/winpty/src/libwinpty/winpty.cc +970 -0
  134. package/deps/winpty/src/shared/AgentMsg.h +38 -0
  135. package/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
  136. package/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
  137. package/deps/winpty/src/shared/Buffer.cc +103 -0
  138. package/deps/winpty/src/shared/Buffer.h +102 -0
  139. package/deps/winpty/src/shared/DebugClient.cc +187 -0
  140. package/deps/winpty/src/shared/DebugClient.h +38 -0
  141. package/deps/winpty/src/shared/GenRandom.cc +138 -0
  142. package/deps/winpty/src/shared/GenRandom.h +55 -0
  143. package/deps/winpty/src/shared/GetCommitHash.bat +13 -0
  144. package/deps/winpty/src/shared/Mutex.h +54 -0
  145. package/deps/winpty/src/shared/OsModule.h +63 -0
  146. package/deps/winpty/src/shared/OwnedHandle.cc +36 -0
  147. package/deps/winpty/src/shared/OwnedHandle.h +45 -0
  148. package/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
  149. package/deps/winpty/src/shared/StringBuilder.h +227 -0
  150. package/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
  151. package/deps/winpty/src/shared/StringUtil.cc +55 -0
  152. package/deps/winpty/src/shared/StringUtil.h +80 -0
  153. package/deps/winpty/src/shared/TimeMeasurement.h +63 -0
  154. package/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
  155. package/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
  156. package/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
  157. package/deps/winpty/src/shared/WindowsSecurity.h +104 -0
  158. package/deps/winpty/src/shared/WindowsVersion.cc +252 -0
  159. package/deps/winpty/src/shared/WindowsVersion.h +29 -0
  160. package/deps/winpty/src/shared/WinptyAssert.cc +55 -0
  161. package/deps/winpty/src/shared/WinptyAssert.h +64 -0
  162. package/deps/winpty/src/shared/WinptyException.cc +57 -0
  163. package/deps/winpty/src/shared/WinptyException.h +43 -0
  164. package/deps/winpty/src/shared/WinptyVersion.cc +42 -0
  165. package/deps/winpty/src/shared/WinptyVersion.h +27 -0
  166. package/deps/winpty/src/shared/winpty_snprintf.h +99 -0
  167. package/deps/winpty/src/subdir.mk +5 -0
  168. package/deps/winpty/src/tests/subdir.mk +28 -0
  169. package/deps/winpty/src/tests/trivial_test.cc +158 -0
  170. package/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
  171. package/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
  172. package/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
  173. package/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
  174. package/deps/winpty/src/unix-adapter/Util.cc +86 -0
  175. package/deps/winpty/src/unix-adapter/Util.h +31 -0
  176. package/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
  177. package/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
  178. package/deps/winpty/src/unix-adapter/main.cc +729 -0
  179. package/deps/winpty/src/unix-adapter/subdir.mk +41 -0
  180. package/deps/winpty/src/winpty.gyp +234 -0
  181. package/deps/winpty/vcbuild.bat +83 -0
  182. package/lib/conpty_console_list_agent.js +16 -0
  183. package/lib/conpty_console_list_agent.js.map +1 -0
  184. package/lib/eventEmitter2.js +47 -0
  185. package/lib/eventEmitter2.js.map +1 -0
  186. package/lib/eventEmitter2.test.js +30 -0
  187. package/lib/eventEmitter2.test.js.map +1 -0
  188. package/lib/index.js +52 -0
  189. package/lib/index.js.map +1 -0
  190. package/lib/interfaces.js +7 -0
  191. package/lib/interfaces.js.map +1 -0
  192. package/lib/shared/conout.js +11 -0
  193. package/lib/shared/conout.js.map +1 -0
  194. package/lib/terminal.js +190 -0
  195. package/lib/terminal.js.map +1 -0
  196. package/lib/terminal.test.js +139 -0
  197. package/lib/terminal.test.js.map +1 -0
  198. package/lib/testUtils.test.js +28 -0
  199. package/lib/testUtils.test.js.map +1 -0
  200. package/lib/types.js +7 -0
  201. package/lib/types.js.map +1 -0
  202. package/lib/unixTerminal.js +346 -0
  203. package/lib/unixTerminal.js.map +1 -0
  204. package/lib/unixTerminal.test.js +351 -0
  205. package/lib/unixTerminal.test.js.map +1 -0
  206. package/lib/utils.js +39 -0
  207. package/lib/utils.js.map +1 -0
  208. package/lib/windowsConoutConnection.js +125 -0
  209. package/lib/windowsConoutConnection.js.map +1 -0
  210. package/lib/windowsPtyAgent.js +320 -0
  211. package/lib/windowsPtyAgent.js.map +1 -0
  212. package/lib/windowsPtyAgent.test.js +90 -0
  213. package/lib/windowsPtyAgent.test.js.map +1 -0
  214. package/lib/windowsTerminal.js +199 -0
  215. package/lib/windowsTerminal.js.map +1 -0
  216. package/lib/windowsTerminal.test.js +219 -0
  217. package/lib/windowsTerminal.test.js.map +1 -0
  218. package/lib/worker/conoutSocketWorker.js +22 -0
  219. package/lib/worker/conoutSocketWorker.js.map +1 -0
  220. package/package.json +68 -0
  221. package/prebuilds/darwin-arm64/pty.node +0 -0
  222. package/prebuilds/darwin-arm64/spawn-helper +0 -0
  223. package/prebuilds/darwin-x64/pty.node +0 -0
  224. package/prebuilds/darwin-x64/spawn-helper +0 -0
  225. package/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  226. package/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  227. package/prebuilds/win32-arm64/conpty.node +0 -0
  228. package/prebuilds/win32-arm64/conpty.pdb +0 -0
  229. package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  230. package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  231. package/prebuilds/win32-arm64/pty.node +0 -0
  232. package/prebuilds/win32-arm64/pty.pdb +0 -0
  233. package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
  234. package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
  235. package/prebuilds/win32-arm64/winpty.dll +0 -0
  236. package/prebuilds/win32-arm64/winpty.pdb +0 -0
  237. package/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  238. package/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  239. package/prebuilds/win32-x64/conpty.node +0 -0
  240. package/prebuilds/win32-x64/conpty.pdb +0 -0
  241. package/prebuilds/win32-x64/conpty_console_list.node +0 -0
  242. package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  243. package/prebuilds/win32-x64/pty.node +0 -0
  244. package/prebuilds/win32-x64/pty.pdb +0 -0
  245. package/prebuilds/win32-x64/winpty-agent.exe +0 -0
  246. package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
  247. package/prebuilds/win32-x64/winpty.dll +0 -0
  248. package/prebuilds/win32-x64/winpty.pdb +0 -0
  249. package/scripts/gen-compile-commands.js +8 -0
  250. package/scripts/increment-version.js +54 -0
  251. package/scripts/post-install.js +99 -0
  252. package/scripts/prebuild.js +39 -0
  253. package/scripts/sync-prebuild.js +31 -0
  254. package/scripts/verify-darwin-fd-leak.js +63 -0
  255. package/src/conpty_console_list_agent.ts +15 -0
  256. package/src/eventEmitter2.test.ts +30 -0
  257. package/src/eventEmitter2.ts +48 -0
  258. package/src/index.ts +52 -0
  259. package/src/interfaces.ts +130 -0
  260. package/src/native.d.ts +54 -0
  261. package/src/shared/conout.ts +15 -0
  262. package/src/terminal.test.ts +119 -0
  263. package/src/terminal.ts +211 -0
  264. package/src/testUtils.test.ts +23 -0
  265. package/src/tsconfig.json +22 -0
  266. package/src/types.ts +15 -0
  267. package/src/unix/pty.cc +808 -0
  268. package/src/unix/spawn-helper.cc +23 -0
  269. package/src/unixTerminal.test.ts +367 -0
  270. package/src/unixTerminal.ts +388 -0
  271. package/src/utils.ts +29 -0
  272. package/src/win/conpty.cc +583 -0
  273. package/src/win/conpty.h +41 -0
  274. package/src/win/conpty_console_list.cc +44 -0
  275. package/src/win/path_util.cc +95 -0
  276. package/src/win/path_util.h +26 -0
  277. package/src/win/winpty.cc +333 -0
  278. package/src/windowsConoutConnection.ts +82 -0
  279. package/src/windowsPtyAgent.test.ts +94 -0
  280. package/src/windowsPtyAgent.ts +321 -0
  281. package/src/windowsTerminal.test.ts +229 -0
  282. package/src/windowsTerminal.ts +203 -0
  283. package/src/worker/conoutSocketWorker.ts +22 -0
  284. package/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  285. package/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  286. package/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  287. package/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  288. package/typings/node-pty.d.ts +211 -0
@@ -0,0 +1,63 @@
1
+ //@ts-check
2
+
3
+ const { execFileSync } = require('child_process');
4
+ const pty = require('../lib/index.js');
5
+
6
+ if (process.platform !== 'darwin') {
7
+ console.error('verify-darwin-fd-leak only runs on darwin.');
8
+ process.exit(1);
9
+ }
10
+
11
+ const iterations = Number(process.argv[2] || 100);
12
+ const shell = process.env.SHELL || '/bin/zsh';
13
+
14
+ function countOpenFds() {
15
+ const output = execFileSync('lsof', ['-p', String(process.pid)], { encoding: 'utf8' });
16
+ return output.trim().split('\n').length - 1;
17
+ }
18
+
19
+ async function runOnce() {
20
+ await new Promise((resolve, reject) => {
21
+ const term = pty.spawn(shell, ['-lc', 'exit'], {
22
+ name: 'xterm-256color',
23
+ cols: 80,
24
+ rows: 24,
25
+ env: process.env,
26
+ cwd: process.cwd(),
27
+ });
28
+
29
+ const timeout = setTimeout(() => {
30
+ try {
31
+ term.kill();
32
+ } catch {
33
+ // ignore
34
+ }
35
+ reject(new Error('Timed out waiting for PTY exit'));
36
+ }, 5000);
37
+
38
+ term.onExit(() => {
39
+ clearTimeout(timeout);
40
+ resolve(undefined);
41
+ });
42
+ });
43
+ }
44
+
45
+ async function main() {
46
+ const start = countOpenFds();
47
+ for (let i = 0; i < iterations; i++) {
48
+ await runOnce();
49
+ }
50
+ const end = countOpenFds();
51
+ const delta = end - start;
52
+
53
+ console.log(JSON.stringify({ iterations, start, end, delta }, null, 2));
54
+
55
+ if (delta > 5) {
56
+ throw new Error(`FD leak detected: start=${start}, end=${end}, delta=${delta}`);
57
+ }
58
+ }
59
+
60
+ main().catch((error) => {
61
+ console.error(error.stack || error.message);
62
+ process.exit(1);
63
+ });
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright (c) 2019, Microsoft Corporation (MIT License).
3
+ *
4
+ * This module fetches the console process list for a particular PID. It must be
5
+ * called from a different process (child_process.fork) as there can only be a
6
+ * single console attached to a process.
7
+ */
8
+
9
+ import { loadNativeModule } from './utils';
10
+
11
+ const getConsoleProcessList = loadNativeModule('conpty_console_list').module.getConsoleProcessList;
12
+ const shellPid = parseInt(process.argv[2], 10);
13
+ const consoleProcessList = getConsoleProcessList(shellPid);
14
+ process.send!({ consoleProcessList });
15
+ process.exit(0);
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Copyright (c) 2019, Microsoft Corporation (MIT License).
3
+ */
4
+
5
+ import * as assert from 'assert';
6
+ import { EventEmitter2 } from './eventEmitter2';
7
+
8
+ describe('EventEmitter2', () => {
9
+ it('should fire listeners multiple times', () => {
10
+ const order: string[] = [];
11
+ const emitter = new EventEmitter2<number>();
12
+ emitter.event(data => order.push(data + 'a'));
13
+ emitter.event(data => order.push(data + 'b'));
14
+ emitter.fire(1);
15
+ emitter.fire(2);
16
+ assert.deepEqual(order, [ '1a', '1b', '2a', '2b' ]);
17
+ });
18
+
19
+ it('should not fire listeners once disposed', () => {
20
+ const order: string[] = [];
21
+ const emitter = new EventEmitter2<number>();
22
+ emitter.event(data => order.push(data + 'a'));
23
+ const disposeB = emitter.event(data => order.push(data + 'b'));
24
+ emitter.event(data => order.push(data + 'c'));
25
+ emitter.fire(1);
26
+ disposeB.dispose();
27
+ emitter.fire(2);
28
+ assert.deepEqual(order, [ '1a', '1b', '1c', '2a', '2c' ]);
29
+ });
30
+ });
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Copyright (c) 2019, Microsoft Corporation (MIT License).
3
+ */
4
+
5
+ import { IDisposable } from './types';
6
+
7
+ interface IListener<T> {
8
+ (e: T): void;
9
+ }
10
+
11
+ export interface IEvent<T> {
12
+ (listener: (e: T) => any): IDisposable;
13
+ }
14
+
15
+ export class EventEmitter2<T> {
16
+ private _listeners: IListener<T>[] = [];
17
+ private _event?: IEvent<T>;
18
+
19
+ public get event(): IEvent<T> {
20
+ if (!this._event) {
21
+ this._event = (listener: (e: T) => any) => {
22
+ this._listeners.push(listener);
23
+ const disposable = {
24
+ dispose: () => {
25
+ for (let i = 0; i < this._listeners.length; i++) {
26
+ if (this._listeners[i] === listener) {
27
+ this._listeners.splice(i, 1);
28
+ return;
29
+ }
30
+ }
31
+ }
32
+ };
33
+ return disposable;
34
+ };
35
+ }
36
+ return this._event;
37
+ }
38
+
39
+ public fire(data: T): void {
40
+ const queue: IListener<T>[] = [];
41
+ for (let i = 0; i < this._listeners.length; i++) {
42
+ queue.push(this._listeners[i]);
43
+ }
44
+ for (let i = 0; i < queue.length; i++) {
45
+ queue[i].call(undefined, data);
46
+ }
47
+ }
48
+ }
package/src/index.ts ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Copyright (c) 2012-2015, Christopher Jeffrey, Peter Sunde (MIT License)
3
+ * Copyright (c) 2016, Daniel Imms (MIT License).
4
+ * Copyright (c) 2018, Microsoft Corporation (MIT License).
5
+ */
6
+
7
+ import { ITerminal, IPtyOpenOptions, IPtyForkOptions, IWindowsPtyForkOptions } from './interfaces';
8
+ import { ArgvOrCommandLine } from './types';
9
+ import { loadNativeModule } from './utils';
10
+
11
+ let terminalCtor: any;
12
+ if (process.platform === 'win32') {
13
+ terminalCtor = require('./windowsTerminal').WindowsTerminal;
14
+ } else {
15
+ terminalCtor = require('./unixTerminal').UnixTerminal;
16
+ }
17
+
18
+ /**
19
+ * Forks a process as a pseudoterminal.
20
+ * @param file The file to launch.
21
+ * @param args The file's arguments as argv (string[]) or in a pre-escaped
22
+ * CommandLine format (string). Note that the CommandLine option is only
23
+ * available on Windows and is expected to be escaped properly.
24
+ * @param options The options of the terminal.
25
+ * @throws When the file passed to spawn with does not exists.
26
+ * @see CommandLineToArgvW https://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx
27
+ * @see Parsing C++ Comamnd-Line Arguments https://msdn.microsoft.com/en-us/library/17w5ykft.aspx
28
+ * @see GetCommandLine https://msdn.microsoft.com/en-us/library/windows/desktop/ms683156.aspx
29
+ */
30
+ export function spawn(file?: string, args?: ArgvOrCommandLine, opt?: IPtyForkOptions | IWindowsPtyForkOptions): ITerminal {
31
+ return new terminalCtor(file, args, opt);
32
+ }
33
+
34
+ /** @deprecated */
35
+ export function fork(file?: string, args?: ArgvOrCommandLine, opt?: IPtyForkOptions | IWindowsPtyForkOptions): ITerminal {
36
+ return new terminalCtor(file, args, opt);
37
+ }
38
+
39
+ /** @deprecated */
40
+ export function createTerminal(file?: string, args?: ArgvOrCommandLine, opt?: IPtyForkOptions | IWindowsPtyForkOptions): ITerminal {
41
+ return new terminalCtor(file, args, opt);
42
+ }
43
+
44
+ export function open(options: IPtyOpenOptions): ITerminal {
45
+ return terminalCtor.open(options);
46
+ }
47
+
48
+ /**
49
+ * Expose the native API when not Windows, note that this is not public API and
50
+ * could be removed at any time.
51
+ */
52
+ export const native = (process.platform !== 'win32' ? loadNativeModule('pty').module : null);
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Copyright (c) 2016, Daniel Imms (MIT License).
3
+ * Copyright (c) 2018, Microsoft Corporation (MIT License).
4
+ */
5
+
6
+ export interface IProcessEnv {
7
+ [key: string]: string | undefined;
8
+ }
9
+
10
+ export interface ITerminal {
11
+ /**
12
+ * Gets the name of the process.
13
+ */
14
+ process: string;
15
+
16
+ /**
17
+ * Gets the process ID.
18
+ */
19
+ pid: number;
20
+
21
+ /**
22
+ * Writes data to the socket.
23
+ * @param data The data to write.
24
+ */
25
+ write(data: string | Buffer): void;
26
+
27
+ /**
28
+ * Resize the pty.
29
+ * @param cols The number of columns.
30
+ * @param rows The number of rows.
31
+ */
32
+ resize(cols: number, rows: number): void;
33
+
34
+ /**
35
+ * Clears the pty's internal representation of its buffer. This is a no-op
36
+ * unless on Windows/ConPTY.
37
+ */
38
+ clear(): void;
39
+
40
+ /**
41
+ * Close, kill and destroy the socket.
42
+ */
43
+ destroy(): void;
44
+
45
+ /**
46
+ * Kill the pty.
47
+ * @param signal The signal to send, by default this is SIGHUP. This is not
48
+ * supported on Windows.
49
+ */
50
+ kill(signal?: string): void;
51
+
52
+ /**
53
+ * Set the pty socket encoding.
54
+ */
55
+ setEncoding(encoding: string | null): void;
56
+
57
+ /**
58
+ * Resume the pty socket.
59
+ */
60
+ resume(): void;
61
+
62
+ /**
63
+ * Pause the pty socket.
64
+ */
65
+ pause(): void;
66
+
67
+ /**
68
+ * Alias for ITerminal.on(eventName, listener).
69
+ */
70
+ addListener(eventName: string, listener: (...args: any[]) => any): void;
71
+
72
+ /**
73
+ * Adds the listener function to the end of the listeners array for the event
74
+ * named eventName.
75
+ * @param eventName The event name.
76
+ * @param listener The callback function
77
+ */
78
+ on(eventName: string, listener: (...args: any[]) => any): void;
79
+
80
+ /**
81
+ * Returns a copy of the array of listeners for the event named eventName.
82
+ */
83
+ listeners(eventName: string): Function[];
84
+
85
+ /**
86
+ * Removes the specified listener from the listener array for the event named
87
+ * eventName.
88
+ */
89
+ removeListener(eventName: string, listener: (...args: any[]) => any): void;
90
+
91
+ /**
92
+ * Removes all listeners, or those of the specified eventName.
93
+ */
94
+ removeAllListeners(eventName: string): void;
95
+
96
+ /**
97
+ * Adds a one time listener function for the event named eventName. The next
98
+ * time eventName is triggered, this listener is removed and then invoked.
99
+ */
100
+ once(eventName: string, listener: (...args: any[]) => any): void;
101
+ }
102
+
103
+ interface IBasePtyForkOptions {
104
+ name?: string;
105
+ cols?: number;
106
+ rows?: number;
107
+ cwd?: string;
108
+ env?: IProcessEnv;
109
+ encoding?: string | null;
110
+ handleFlowControl?: boolean;
111
+ flowControlPause?: string;
112
+ flowControlResume?: string;
113
+ }
114
+
115
+ export interface IPtyForkOptions extends IBasePtyForkOptions {
116
+ uid?: number;
117
+ gid?: number;
118
+ }
119
+
120
+ export interface IWindowsPtyForkOptions extends IBasePtyForkOptions {
121
+ useConpty?: boolean;
122
+ useConptyDll?: boolean;
123
+ conptyInheritCursor?: boolean;
124
+ }
125
+
126
+ export interface IPtyOpenOptions {
127
+ cols?: number;
128
+ rows?: number;
129
+ encoding?: string | null;
130
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Copyright (c) 2018, Microsoft Corporation (MIT License).
3
+ */
4
+
5
+ interface IConptyNative {
6
+ startProcess(file: string, cols: number, rows: number, debug: boolean, pipeName: string, conptyInheritCursor: boolean, useConptyDll: boolean): IConptyProcess;
7
+ connect(ptyId: number, commandLine: string, cwd: string, env: string[], useConptyDll: boolean, onExitCallback: (exitCode: number) => void): { pid: number };
8
+ resize(ptyId: number, cols: number, rows: number, useConptyDll: boolean): void;
9
+ clear(ptyId: number, useConptyDll: boolean): void;
10
+ kill(ptyId: number, useConptyDll: boolean): void;
11
+ }
12
+
13
+ interface IWinptyNative {
14
+ startProcess(file: string, commandLine: string, env: string[], cwd: string, cols: number, rows: number, debug: boolean): IWinptyProcess;
15
+ resize(pid: number, cols: number, rows: number): void;
16
+ kill(pid: number, innerPid: number): void;
17
+ getProcessList(pid: number): number[];
18
+ getExitCode(innerPid: number): number;
19
+ }
20
+
21
+ interface IUnixNative {
22
+ fork(file: string, args: string[], parsedEnv: string[], cwd: string, cols: number, rows: number, uid: number, gid: number, useUtf8: boolean, helperPath: string, onExitCallback: (code: number, signal: number) => void): IUnixProcess;
23
+ open(cols: number, rows: number): IUnixOpenProcess;
24
+ process(fd: number, pty?: string): string;
25
+ resize(fd: number, cols: number, rows: number): void;
26
+ }
27
+
28
+ interface IConptyProcess {
29
+ pty: number;
30
+ fd: number;
31
+ conin: string;
32
+ conout: string;
33
+ }
34
+
35
+ interface IWinptyProcess {
36
+ pty: number;
37
+ fd: number;
38
+ conin: string;
39
+ conout: string;
40
+ pid: number;
41
+ innerPid: number;
42
+ }
43
+
44
+ interface IUnixProcess {
45
+ fd: number;
46
+ pid: number;
47
+ pty: string;
48
+ }
49
+
50
+ interface IUnixOpenProcess {
51
+ master: number;
52
+ slave: number;
53
+ pty: string;
54
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright (c) 2020, Microsoft Corporation (MIT License).
3
+ */
4
+
5
+ export interface IWorkerData {
6
+ conoutPipeName: string;
7
+ }
8
+
9
+ export const enum ConoutWorkerMessage {
10
+ READY = 1
11
+ }
12
+
13
+ export function getWorkerPipeName(conoutPipeName: string): string {
14
+ return `${conoutPipeName}-worker`;
15
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Copyright (c) 2017, Daniel Imms (MIT License).
3
+ * Copyright (c) 2018, Microsoft Corporation (MIT License).
4
+ */
5
+
6
+ import * as assert from 'assert';
7
+ import { WindowsTerminal } from './windowsTerminal';
8
+ import { UnixTerminal } from './unixTerminal';
9
+ import { Terminal } from './terminal';
10
+ import { Socket } from 'net';
11
+
12
+ const terminalConstructor = (process.platform === 'win32') ? WindowsTerminal : UnixTerminal;
13
+ const SHELL = (process.platform === 'win32') ? 'cmd.exe' : '/bin/bash';
14
+
15
+ let terminalCtor: WindowsTerminal | UnixTerminal;
16
+ if (process.platform === 'win32') {
17
+ terminalCtor = require('./windowsTerminal');
18
+ } else {
19
+ terminalCtor = require('./unixTerminal');
20
+ }
21
+
22
+ class TestTerminal extends Terminal {
23
+ public checkType<T>(name: string, value: T, type: string, allowArray: boolean = false): void {
24
+ this._checkType(name, value, type, allowArray);
25
+ }
26
+ protected _write(data: string | Buffer): void {
27
+ throw new Error('Method not implemented.');
28
+ }
29
+ public resize(cols: number, rows: number): void {
30
+ throw new Error('Method not implemented.');
31
+ }
32
+ public clear(): void {
33
+ throw new Error('Method not implemented.');
34
+ }
35
+ public destroy(): void {
36
+ throw new Error('Method not implemented.');
37
+ }
38
+ public kill(signal?: string): void {
39
+ throw new Error('Method not implemented.');
40
+ }
41
+ public get process(): string {
42
+ throw new Error('Method not implemented.');
43
+ }
44
+ public get master(): Socket {
45
+ throw new Error('Method not implemented.');
46
+ }
47
+ public get slave(): Socket {
48
+ throw new Error('Method not implemented.');
49
+ }
50
+ }
51
+
52
+ describe('Terminal', () => {
53
+ describe('constructor', () => {
54
+ it('should do basic type checks', () => {
55
+ assert.throws(
56
+ () => new (<any>terminalCtor)('a', 'b', { 'name': {} }),
57
+ 'name must be a string (not a object)'
58
+ );
59
+ });
60
+ });
61
+
62
+ describe('checkType', () => {
63
+ it('should throw for the wrong type', () => {
64
+ const t = new TestTerminal();
65
+ assert.doesNotThrow(() => t.checkType('foo', 'test', 'string'));
66
+ assert.doesNotThrow(() => t.checkType('foo', 1, 'number'));
67
+ assert.doesNotThrow(() => t.checkType('foo', {}, 'object'));
68
+
69
+ assert.throws(() => t.checkType('foo', 'test', 'number'));
70
+ assert.throws(() => t.checkType('foo', 1, 'object'));
71
+ assert.throws(() => t.checkType('foo', {}, 'string'));
72
+ });
73
+ it('should throw for wrong types within arrays', () => {
74
+ const t = new TestTerminal();
75
+ assert.doesNotThrow(() => t.checkType('foo', ['test'], 'string', true));
76
+ assert.doesNotThrow(() => t.checkType('foo', [1], 'number', true));
77
+ assert.doesNotThrow(() => t.checkType('foo', [{}], 'object', true));
78
+
79
+ assert.throws(() => t.checkType('foo', ['test'], 'number', true));
80
+ assert.throws(() => t.checkType('foo', [1], 'object', true));
81
+ assert.throws(() => t.checkType('foo', [{}], 'string', true));
82
+ });
83
+ });
84
+
85
+ describe('automatic flow control', () => {
86
+ it('should respect ctor flow control options', () => {
87
+ const pty = new terminalConstructor(SHELL, [], {handleFlowControl: true, flowControlPause: 'abc', flowControlResume: '123'});
88
+ assert.equal(pty.handleFlowControl, true);
89
+ assert.equal((pty as any)._flowControlPause, 'abc');
90
+ assert.equal((pty as any)._flowControlResume, '123');
91
+ });
92
+ // TODO: I don't think this test ever worked due to pollUntil being used incorrectly
93
+ // it('should do flow control automatically', async function(): Promise<void> {
94
+ // // Flow control doesn't work on Windows
95
+ // if (process.platform === 'win32') {
96
+ // return;
97
+ // }
98
+
99
+ // this.timeout(10000);
100
+ // const pty = new terminalConstructor(SHELL, [], {handleFlowControl: true, flowControlPause: 'PAUSE', flowControlResume: 'RESUME'});
101
+ // let read: string = '';
102
+ // pty.on('data', data => read += data);
103
+ // pty.on('pause', () => read += 'paused');
104
+ // pty.on('resume', () => read += 'resumed');
105
+ // pty.write('1');
106
+ // pty.write('PAUSE');
107
+ // pty.write('2');
108
+ // pty.write('RESUME');
109
+ // pty.write('3');
110
+ // await pollUntil(() => {
111
+ // return stripEscapeSequences(read).endsWith('1pausedresumed23');
112
+ // }, 100, 10);
113
+ // });
114
+ });
115
+ });
116
+
117
+ function stripEscapeSequences(data: string): string {
118
+ return data.replace(/\u001b\[0K/, '');
119
+ }