This commit is contained in:
2026-09-08 15:20:27 +02:00
parent 4b9e6c5651
commit 2eb9a9590e
15 changed files with 1023 additions and 127 deletions
+37 -4
View File
@@ -101,12 +101,18 @@
(define (request-username auth request)
(or (auth-request-user auth request) "anonymous"))
;;; Returns the player state belonging to the requesting user.
;;; Read the opaque version of the playlist already held by this browser.
(define (request-playlist-version request)
(let ((entry (assq 'playlistVersion (url-query (request-uri request)))))
(and entry (cdr entry))))
;;; Returns user state, including tracks only when this browser needs them.
(define (state-handler player auth request)
(json-response
(player-state->jsexpr
player
#:username (request-username auth request))))
#:username (request-username auth request)
#:playlist-version (request-playlist-version request))))
;;; Starts renderer discovery and returns the updated player state.
(define (discover-handler player auth request)
@@ -114,7 +120,8 @@
(json-response
(player-state->jsexpr
player
#:username (request-username auth request))))
#:username (request-username auth request)
#:playlist-version (request-playlist-version request))))
;;; Applies one player command for the requesting user.
(define (command-handler player auth request command)
@@ -125,7 +132,8 @@
player
command
(request-jsexpr request)
#:username (request-username auth request)))))
#:username (request-username auth request)
#:playlist-version (request-playlist-version request)))))
;;; Returns the persisted interface preferences for the requesting user.
(define (preferences-handler player auth request)
@@ -405,6 +413,31 @@
(check-equal?
(request-jsexpr (test-request #"POST" "/api/preferences"))
(hasheq))
(test-case "HTTP state and commands accept the browser's playlist version"
(let* ((value (make-player '() #:playlist-keystore #f #:local-output? #f))
(auth (make-auth-manager '()))
(dispatch (make-dispatch value auth)))
(dynamic-wind
void
(λ ()
(let* ((full (response-jsexpr (dispatch (test-request #"GET" "/api/state"))))
(version (hash-ref full 'playlistVersion))
(compact
(response-jsexpr
(dispatch (test-request #"GET" (string-append "/api/state?playlistVersion=" version))))))
(check-equal? (hash-ref full 'tracks) '())
(check-eq? (hash-ref compact 'tracks) 'null)
(check-equal? (hash-ref compact 'playlistVersion) version)
(let ((renamed
(response-jsexpr
(dispatch
(test-request #"POST"
(string-append "/api/command/tab-rename?playlistVersion=" version)
#:headers (list (header #"Content-Type" #"application/json"))
#:body #"{\"index\":0,\"name\":\"Music\"}")))))
(check-eq? (hash-ref renamed 'tracks) 'null)
(check-equal? (hash-ref (car (hash-ref renamed 'tabs)) 'name) "Music"))))
(λ () (player-close! value)))))
(check-equal?
(request-jsexpr
(test-request #"POST"