22
33namespace Clue \React \Stdio ;
44
5- use Clue \React \Stdio \Io \Stdin ;
6- use Clue \React \Stdio \Io \Stdout ;
75use Evenement \EventEmitter ;
86use React \EventLoop \LoopInterface ;
97use React \Stream \DuplexStreamInterface ;
@@ -23,6 +21,7 @@ class Stdio extends EventEmitter implements DuplexStreamInterface
2321 private $ closed = false ;
2422 private $ incompleteLine = '' ;
2523 private $ originalTtyMode = null ;
24+ private $ usesExtReadlineHandler = false ;
2625
2726 public function __construct (LoopInterface $ loop , ReadableStreamInterface $ input = null , WritableStreamInterface $ output = null , Readline $ readline = null )
2827 {
@@ -246,8 +245,9 @@ public function handleCloseOutput()
246245 */
247246 private function restoreTtyMode ()
248247 {
249- if (function_exists ( ' readline_callback_handler_remove ' ) ) {
248+ if ($ this -> usesExtReadlineHandler ) {
250249 // remove dummy readline handler to turn to default input mode
250+ $ this ->usesExtReadlineHandler = false ;
251251 readline_callback_handler_remove ();
252252 } elseif ($ this ->originalTtyMode !== null && $ this ->isTty ()) {
253253 // Reset stty so it behaves normally again
@@ -279,11 +279,14 @@ private function createStdin(LoopInterface $loop)
279279
280280 $ stream = new ReadableResourceStream (STDIN , $ loop );
281281
282- if (function_exists ('readline_callback_handler_install ' )) {
282+ if (PHP_OS === ' Linux ' && function_exists ('readline_callback_handler_install ' )) {
283283 // Prefer `ext-readline` to install dummy handler to turn on raw input mode.
284+ // This is known to work on Linux and known to cause issues with CR/LF
285+ // on Mac, so we only use this on Linux for now, see also issue #66.
284286 // We will nevery actually feed the readline handler and instead
285287 // handle all input in our `Readline` implementation.
286288 readline_callback_handler_install ('' , function () { });
289+ $ this ->usesExtReadlineHandler = true ;
287290 return $ stream ;
288291 }
289292
0 commit comments