branch: externals/async commit aae9b1927c5c24ed52b1ec738d569edfb7017a65 Author: Matus Goljer <matus.gol...@gmail.com> Commit: Matus Goljer <matus.gol...@gmail.com>
feat: implement reading messages sent from child process --- async.el | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/async.el b/async.el index 244954feb4..12331972c3 100644 --- a/async.el +++ b/async.el @@ -197,6 +197,27 @@ It is intended to be used as follows: (process-name proc) (process-exit-status proc)))) (set (make-local-variable 'async-callback-value-set) t)))))) +(defun async-read-from-client (proc string) + ;; log the message in the process buffer + (with-current-buffer (process-buffer proc) + (insert string)) + + ;; parse message + (with-temp-buffer + (insert string) + (goto-char (point-min)) + (let (msg) + (condition-case nil + (while (setq msg (read (current-buffer))) + (when-let ((msg-decoded (ignore-errors (base64-decode-string msg)))) + (setq msg-decoded (car (read-from-string msg-decoded))) + (with-current-buffer (process-buffer proc) + (when async-callback + (funcall async-callback msg-decoded))))) + ;; This is OK, we reached the end of the chunk subprocess sent + ;; at this time. + (end-of-file t))))) + (defun async--receive-sexp (&optional stream) ;; FIXME: Why use `utf-8-auto' instead of `utf-8-unix'? This is ;; a communication channel over which we have complete control, @@ -288,8 +309,10 @@ its FINISH-FUNC is nil." "Send the given messages to the asynchronous Emacs PROCESS." (let ((args (append args '(:async-message t)))) (if async-in-child-emacs - (if async-callback - (funcall async-callback args)) + (princ + (with-temp-buffer + (async--insert-sexp args) + (buffer-string))) (async--transmit-sexp (car args) (list 'quote (cdr args)))))) (defun async-receive () @@ -310,6 +333,7 @@ working directory." (with-current-buffer buf (set (make-local-variable 'async-callback) finish-func) (set-process-sentinel proc #'async-when-done) + (set-process-filter proc #'async-read-from-client) (unless (string= name "emacs") (set (make-local-variable 'async-callback-for-process) t)) proc)))