60e64dd83c
ipc.Client serialises every call on one mutex, and mavweb routed 28 handlers plus /api/chat through the shared client. A turn is bounded only by phraser.timeout, 60s in deploy, so a page load behind one could wait that long. /models already had its own connection for this reason. Chat gets the third one. A failed dial logs and falls back to the shared client, which is how it behaved before. /api/ptt needs nothing here: it proxies to the voice port and never touches this client. A connection pool inside ipc.Client is the general form and stays unbuilt until a second module is measured queueing.