Skip to content

Commit 8e531dd

Browse files
Remove producers when connections close
1 parent c33e614 commit 8e531dd

File tree

3 files changed

+13
-17
lines changed

3 files changed

+13
-17
lines changed

src/jsonrpc/server.clj

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,9 @@
259259
(fn [arguments]
260260
(logger/trace
261261
(-> arguments
262-
(merge
263-
(db/parameter-values (:name params))
264-
(select-keys (-> @db* :servers (get server-id)) [:roots]))
262+
(merge
263+
(db/parameter-values (:name params))
264+
(select-keys (-> @db* :servers (get server-id)) [:roots]))
265265
(json/generate-string)))))
266266
:id "1"}])
267267
(async/reduce conj [])
@@ -307,7 +307,7 @@
307307
(when (= f "registry.yaml")
308308
(try
309309
(db/add-refs (db/registry-refs registry))
310-
(doseq [producer @jsonrpc.state/producers]
310+
(doseq [producer (vals @jsonrpc.state/producers)]
311311
(try
312312
(producer/publish-tool-list-changed producer {})
313313
(producer/publish-prompt-list-changed producer {})
@@ -317,7 +317,7 @@
317317
(when (string/ends-with? f ".md")
318318
(try
319319
(db/update-prompt opts (string/replace f #"\.md" "") (slurp (str "/prompts/" f)))
320-
(doseq [producer @jsonrpc.state/producers]
320+
(doseq [producer (vals @jsonrpc.state/producers)]
321321
(try
322322
(producer/publish-tool-list-changed producer {})
323323
(producer/publish-prompt-list-changed producer {})
@@ -375,9 +375,9 @@
375375
:trace-level trace-level
376376
:keyword-function keyword
377377
:server-context-factory
378-
(fn [server]
378+
(fn [server state-id]
379379
(let [producer (producer/->McpProducer server db*)]
380-
(swap! jsonrpc.state/producers conj producer)
380+
(swap! jsonrpc.state/producers assoc state-id producer)
381381
{:db* db*
382382
:logger timbre-logger
383383
:producer producer
@@ -399,9 +399,8 @@
399399
:out System/out}))]
400400
(logger/info "Starting server...")
401401
;; only on lsp.server/start will the stdio channels start being used
402-
(let [{:keys [producer] :as context}
403-
(assoc
404-
((:server-context-factory server-opts) server)
405-
:server-id (swap! jsonrpc.state/server-counter inc))]
402+
(let [server-id (swap! jsonrpc.state/server-counter inc)
403+
{:keys [producer] :as context}
404+
((:server-context-factory server-opts) server server-id)]
406405
[producer (lsp.server/start server context)]))))
407406

src/jsonrpc/socket_server.clj

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,14 @@
2727
;; chan servers have on-close callbacks
2828
;; connections have both input and output streams
2929
(let [server-id (swap! jsonrpc.state/server-counter inc)
30-
context-factory (fn [s]
31-
(assoc
32-
(component-factory s)
33-
:server-id server-id))
3430
on-close #(do
3531
(shutdown/on-connection-close server-id)
3632
(.close connection)
33+
(swap! jsonrpc.state/producers dissoc server-id)
3734
(logger/info (format "closed connection %s" server-id)))
3835
s (io-server/server (assoc opts
3936
:in connection
4037
:out connection
4138
:on-close on-close))]
42-
(server/start s (context-factory s)))))
39+
(server/start s (component-factory s server-id)))))
4340

src/jsonrpc/state.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
(def server-counter (atom 0))
44

5-
(def producers (atom []))
5+
(def producers (atom {}))
66

0 commit comments

Comments
 (0)