Skip to content

Commit 5763280

Browse files
committed
Merge pull request #791 from vitoshka/dispatch-request
[#780] make sure to dispatch requests in connection buffer
2 parents 70c0bb4 + 56d5ed3 commit 5763280

File tree

1 file changed

+15
-29
lines changed

1 file changed

+15
-29
lines changed

nrepl-client.el

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,9 @@ To be used for tooling calls (i.e. completion, eldoc, etc)")
221221
(defvar-local nrepl-request-counter 0
222222
"Continuation serial number counter.")
223223

224-
(defvar-local nrepl-pending-requests (make-hash-table :test 'equal))
224+
(defvar-local nrepl-pending-requests nil)
225225

226-
(defvar-local nrepl-completed-requests (make-hash-table :test 'equal))
226+
(defvar-local nrepl-completed-requests nil)
227227

228228
(defvar-local nrepl-buffer-ns "user"
229229
"Current Clojure namespace of this buffer.")
@@ -463,11 +463,10 @@ specification. Everything else is encoded as string."
463463
;; Start decoding only if the last letter is 'e'
464464
(when (eq ?e (aref string (1- (length string))))
465465
(let ((response-q (process-get proc :response-q)))
466-
;; (nrepl-log-message string-q)
467-
;; (nrepl-log-message response-q)
468466
(nrepl-bdecode string-q response-q)
469-
(while (queue-head response-q)
470-
(nrepl--dispatch-response (queue-dequeue response-q)))))))
467+
(with-current-buffer (process-buffer proc)
468+
(while (queue-head response-q)
469+
(nrepl--dispatch-response (queue-dequeue response-q))))))))
471470

472471
(defun nrepl--dispatch-response (response)
473472
"Dispatch the RESPONSE to associated callback.
@@ -480,7 +479,7 @@ older requests with \"done\" status."
480479
(gethash id nrepl-completed-requests))))
481480
(if callback
482481
(funcall callback response)
483-
(funcall (nrepl--make-default-handler) response)))))
482+
(error "No response handler with id %s found" id)))))
484483

485484
(defun nrepl-client-sentinel (process message)
486485
"Handle sentinel events from PROCESS.
@@ -534,7 +533,9 @@ within Emacs. Return the newly created client connection process."
534533
;; fixme: repl and connection buffers are the same thing
535534
nrepl-connection-buffer client-buf
536535
nrepl-repl-buffer (when replp client-buf)
537-
nrepl-on-connection-buffer proc-buffer-name))
536+
nrepl-on-connection-buffer proc-buffer-name
537+
nrepl-pending-requests (make-hash-table :test 'equal)
538+
nrepl-completed-requests (make-hash-table :test 'equal)))
538539

539540
(nrepl-make-connection-default client-buf)
540541

@@ -550,8 +551,9 @@ within Emacs. Return the newly created client connection process."
550551
"Return a handler to setup CONN-BUFFER as a connection buffer.
551552
If REPLP is non-nil, also initialize it as a REPL buffer."
552553
(lambda (response)
553-
(nrepl-dbind-response response (ops versions)
554+
(nrepl-dbind-response response (id ops versions)
554555
(with-current-buffer conn-buffer
556+
(remhash id nrepl-pending-requests)
555557
(setq nrepl-ops ops)
556558
(setq nrepl-versions versions)))
557559
(when replp
@@ -563,9 +565,9 @@ If REPLP is non-nil, also initialize it as a REPL buffer."
563565
"Create a new session handler for PROCESS."
564566
(lambda (response)
565567
(nrepl-dbind-response response (id new-session err)
566-
(remhash id nrepl-pending-requests)
567568
(if new-session
568569
(with-current-buffer (process-buffer process)
570+
(remhash id nrepl-pending-requests)
569571
(setq nrepl-session new-session))
570572
(error "Could not create new session (%s)" err))
571573
(run-hooks 'nrepl-connected-hook))))
@@ -661,22 +663,6 @@ server responses."
661663
(when done-handler
662664
(funcall done-handler buffer))))))))
663665

664-
(defun nrepl--make-default-handler ()
665-
"Default handler which is invoked when no handler is found.
666-
Handles only stdout and stderr responses."
667-
(nrepl-make-response-handler (cider-current-repl-buffer)
668-
;; VALUE
669-
'()
670-
;; STDOUT
671-
(lambda (buffer out)
672-
;; fixme: rename into emit-out-output
673-
(cider-repl-emit-output buffer out))
674-
;; STDERR
675-
(lambda (buffer err)
676-
(cider-repl-emit-err-output buffer err))
677-
;; DONE
678-
'()))
679-
680666

681667
;;; Client: Request Handling
682668

@@ -713,9 +699,9 @@ REQUEST is a pair list of the form (\"op\" \"operation\" \"par1-name\"
713699
(request (append (list 'dict "id" request-id) request))
714700
(message (nrepl-bencode request)))
715701
(nrepl-log-message request)
716-
(puthash request-id callback nrepl-pending-requests)
717-
(process-send-string (nrepl-current-connection-buffer)
718-
message)))
702+
(with-current-buffer (nrepl-current-connection-buffer)
703+
(puthash request-id callback nrepl-pending-requests)
704+
(process-send-string nil message))))
719705

720706
(defun nrepl-request:clone (callback)
721707
"Sent a :clone request to create a new client session.

0 commit comments

Comments
 (0)