[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/plz 43231ac43c 14/40: WIP: Use timer for response parsi
From: |
ELPA Syncer |
Subject: |
[elpa] externals/plz 43231ac43c 14/40: WIP: Use timer for response parsing |
Date: |
Mon, 26 Jun 2023 06:59:32 -0400 (EDT) |
branch: externals/plz
commit 43231ac43c26a4e50b393ba57db56c88b1ed5090
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>
WIP: Use timer for response parsing
---
plz.el | 47 ++++++++++++++++++++++++++++++++++++-----------
1 file changed, 36 insertions(+), 11 deletions(-)
diff --git a/plz.el b/plz.el
index dbf6a1f5be..b318a33c0d 100644
--- a/plz.el
+++ b/plz.el
@@ -702,17 +702,42 @@ Includes active and queued requests."
;;;;; Private
-(defun plz--sentinel (process-or-buffer status)
+(defun plz--sentinel (process status)
+ ;; FIXME: Update docstring for arguments.
"Process buffer of curl output in PROCESS-OR-BUFFER.
If PROCESS-OR-BUFFER if a process, uses its buffer; if a buffer,
uses it. STATUS should be the process's event string (see info
node `(elisp) Sentinels'). Kills the buffer before returning."
;; Inspired by and some code copied from `elfeed-curl--sentinel'.
- (let* ((buffer (cl-etypecase process-or-buffer
- (process (process-buffer process-or-buffer))
- (buffer process-or-buffer)))
- (finally (buffer-local-value 'plz-finally buffer))
- sync)
+ (let ((buffer (process-buffer process)))
+ (with-current-buffer buffer
+ (pcase status
+ ((or 0 "finished\n")
+ ;; Curl exited normally: check HTTP status code.
+ (if plz-sync
+ (plz--timer process buffer status)
+ (run-at-time 0 nil #'plz--timer process buffer status)))
+
+ ((or (and (pred numberp) code)
+ (rx "exited abnormally with code " (let code (group (1+ digit)))))
+ ;; Curl error.
+ (ignore code)
+ (if plz-sync
+ (plz--timer process buffer status)
+ (run-at-time 0 nil #'plz--timer process buffer status)))
+
+ ((and (or "killed\n" "interrupt\n") status)
+ ;; Curl process killed or interrupted.
+ (if plz-sync
+ (plz--timer process buffer status)
+ (run-at-time 0 nil #'plz--timer process buffer status)))))))
+
+(defun plz--timer (process buffer status)
+ "Process HTTP response in BUFFER.
+To be called from a timer run in `plz--sentinel'."
+ (let ((finally (buffer-local-value 'plz-finally buffer))
+ sync)
+ (cl-assert process nil "PROCESS IS NIL FOR BUFFER:%S" buffer)
(unwind-protect
(with-current-buffer buffer
(setf sync plz-sync)
@@ -733,7 +758,7 @@ node `(elisp) Sentinels'). Kills the buffer before
returning."
;; (for now, anyway).
(let ((err (make-plz-error :response (plz--response))))
(pcase-exhaustive plz-else
- (`nil (process-put process-or-buffer :plz-result err))
+ (`nil (process-put process :plz-result err))
((pred functionp) (funcall plz-else err)))))))
((or (and (pred numberp) code)
@@ -745,7 +770,7 @@ node `(elisp) Sentinels'). Kills the buffer before
returning."
(curl-error-message (alist-get curl-exit-code
plz-curl-errors))
(err (make-plz-error :curl-error (cons curl-exit-code
curl-error-message))))
(pcase-exhaustive plz-else
- (`nil (process-put process-or-buffer :plz-result err))
+ (`nil (process-put process :plz-result err))
((pred functionp) (funcall plz-else err)))))
((and (or "killed\n" "interrupt\n") status)
@@ -755,16 +780,16 @@ node `(elisp) Sentinels'). Kills the buffer before
returning."
("interrupt\n" "curl process interrupted")))
(err (make-plz-error :message message)))
(pcase-exhaustive plz-else
- (`nil (process-put process-or-buffer :plz-result err))
+ (`nil (process-put process :plz-result err))
((pred functionp) (funcall plz-else err))))))
(error
;; Error signaled by a function called to process HTTP response:
;; rather than signaling an error from within the sentinel,
;; return or call the ELSE function with a plz-error struct.
(let ((err (make-plz-error :message (format "plz--sentinel: Error
signaled: %S REQUEST-ARGS:%S"
- err (process-get
process-or-buffer :plz-args)))))
+ err (process-get
process :plz-args)))))
(pcase-exhaustive plz-else
- (`nil (process-put process-or-buffer :plz-result err))
+ (`nil (process-put process :plz-result err))
((pred functionp) (funcall plz-else err)))))))
(when finally
(funcall finally))
- [elpa] externals/plz updated (a8ae654530 -> 5e63662e21), ELPA Syncer, 2023/06/26
- [elpa] externals/plz 9ac623858c 01/40: WIP: Fix nil return value bugs, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 797963c035 02/40: WIP: Use separate buffer for STDERR, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 50d977288e 04/40: Fix: Set stderr process sentinel to #'ignore, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 0d4356640d 05/40: Change: Use only one error type, plz-error, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 046f29a816 08/40: Docs: Remove old TODO, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 81d1c61f1f 07/40: Tidy docstring and comment, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 56c92ff78e 12/40: Tidy, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 43231ac43c 14/40: WIP: Use timer for response parsing,
ELPA Syncer <=
- [elpa] externals/plz d6dfe3b27a 11/40: Tidy: Remove plz-result, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 85ac0fbe38 15/40: WIP: Use sentinel value; add comments, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 7d197e968a 20/40: Change: (plz--respond) Don't catch errors from THEN/ELSE, ELPA Syncer, 2023/06/26
- [elpa] externals/plz a2c20b1437 24/40: Comment: TODO, ELPA Syncer, 2023/06/26
- [elpa] externals/plz f551c1bd49 25/40: Tidy: (plz--respond), ELPA Syncer, 2023/06/26
- [elpa] externals/plz de8e21f81d 29/40: Tidy: Docstrings, ELPA Syncer, 2023/06/26
- [elpa] externals/plz f9f95a8544 34/40: Comment: Add TODO, ELPA Syncer, 2023/06/26
- [elpa] externals/plz c786bbf7d2 35/40: Tidy/Comment, ELPA Syncer, 2023/06/26
- [elpa] externals/plz 438162db4e 13/40: WIP: Add request args to sentinel error, ELPA Syncer, 2023/06/26
- [elpa] externals/plz a1f8a10b0b 16/40: Comment: Add FIXME, ELPA Syncer, 2023/06/26