{"record":{"id":"a31498bc30be886c","repo":"nautechsystems/nautilus_trader","slug":"derive-websocket-event-receiver-not-initialized","errorCode":null,"errorMessage":"Derive WebSocket event receiver not initialized","messagePattern":"Derive WebSocket event receiver not initialized","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/derive/src/data.rs","lineNumber":774,"sourceCode":"                ws_shutdown.begin_shutdown();\n            });\n\n        if !self.config.currencies.is_empty() {\n            self.provider\n                .load_all(None)\n                .await\n                .context(\"failed to load Derive instruments\")?;\n            self.cache_provider_instruments();\n        }\n\n        self.ws_client\n            .connect()\n            .await\n            .context(\"failed to connect Derive WebSocket\")?;\n        let session_result = self\n            .ws_client\n            .take_event_receiver()\n            .ok_or_else(|| anyhow::anyhow!(\"Derive WebSocket event receiver not initialized\"))\n            .and_then(|rx| self.spawn_stream_task(rx));\n\n        if let Err(e) = session_result {\n            if let Err(teardown_error) = self.teardown_partial_connect().await {\n                return Err(e.context(format!(\n                    \"Derive data startup teardown failed: {teardown_error}\"\n                )));\n            }\n            return Err(e);\n        }\n\n        self.is_connected.store(true, Ordering::Release);\n        setup_guard.disarm();\n        log::info!(\n            \"Connected Derive data client ({:?})\",\n            self.config.environment\n        );\n        Ok(())","sourceCodeStart":756,"sourceCodeEnd":792,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/derive/src/data.rs#L756-L792","documentation":"After connecting the Derive WebSocket, `connect()` calls `take_event_receiver()` to obtain the mpsc receiver the WS client was built with. If the receiver was never initialized (or already taken), this error is thrown and a partial-connect teardown is performed.","triggerScenarios":"Calling `connect()` when `ws_client.take_event_receiver()` returns None — the WebSocket client was constructed without an event receiver, or connect is called twice so the receiver was consumed by the first call.","commonSituations":"Calling connect twice on the same data client; constructing the WS client through a path that skipped receiver setup; reusing a client whose first session already consumed the receiver.","solutions":["Call connect only once per data-client instance; create a new instance for reconnects.","Verify the WS client construction path initializes the event receiver channel.","Log the teardown error appended via `Derive data startup teardown failed` to catch secondary issues.","Check for double-spawned connect tasks (actor callbacks firing twice)."],"exampleFix":"// before\nclient.connect().await?;\nclient.connect().await?; // receiver already taken\n// after\nclient.connect().await?; // single connect per instance\n// recreate client for a new session","handlingStrategy":"try-catch","validationCode":"// Track connect-once semantics:\nif already_connected { return Ok(()); } // guard before calling connect","typeGuard":null,"tryCatchPattern":"match data_client.connect().await {\n    Err(e) if e.to_string().contains(\"event receiver not initialized\") => {\n        // receiver consumed or missing: recreate the data client\n        data_client = DeriveDataClient::new(...).await?;\n        data_client.connect().await?;\n    }\n    other => other?,\n}","preventionTips":["Call connect at most once per data-client instance.","Recreate the client for each new WebSocket session.","Verify construction path initializes the WS event receiver.","Guard actor start hooks against double invocation."],"tags":["websocket","channel","derive","connection-lifecycle"],"backgroundTag":"internal-invariant-violation","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}