1 Introduction
The racket-upnp collection implements a small UPnP control point. It discovers devices with SSDP, downloads their device descriptions, and represents devices and services as ordinary Racket values. Unknown vendor-specific device and service types are retained instead of discarded.
The public interface is divided into layers:
The racket-upnp module provides discovery, device information, generic service inspection, and generic SOAP calls.
Modules in the racket-upnp/services subcollection provide typed interfaces for standard UPnP services.
The racket-upnp/media-renderer and racket-upnp/media-server modules provide convenient device-oriented interfaces.
A normal application can use the device-oriented modules without dealing with SSDP, SOAP, service control URLs, or DIDL-Lite XML directly. The generic layer remains available for inspection and vendor-specific extensions.
SOAP HTTP exchanges and service-description requests have a ten-second response deadline. A stalled renderer therefore raises a transport failure instead of indefinitely occupying a player’s transport lock. The private call-with-http-timeout procedure runs the exchange in a worker, propagates its values or exception and closes its HTTP resources. Its progress! callback can restart the inactivity wait for streaming callers; SOAP calls use a single bounded exchange.