{"record":{"id":"4124d25feb006c43","repo":"denoland/deno","slug":"err-inspector-already-connected","errorCode":"ERR_INSPECTOR_ALREADY_CONNECTED","errorMessage":"The inspector session is already connected","messagePattern":"The inspector session is already connected","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/inspector.js","lineNumber":110,"sourceCode":"      TypedArrayPrototypeGetByteLength(view),\n    );\n  }\n  throw new TypeError(\n    \"Expected data to be a string, Buffer, Uint8Array, or ArrayBuffer\",\n  );\n}\n\nclass Session extends EventEmitter {\n  #connection = null;\n  #nextId = 1;\n  #messageCallbacks = new SafeMap();\n  #pendingMessages = [];\n  #drainScheduled = false;\n  #isDraining = false;\n\n  connect() {\n    if (this.#connection) {\n      throw new ERR_INSPECTOR_ALREADY_CONNECTED(\"The inspector session\");\n    }\n    this.#connection = op_inspector_connect(\n      false,\n      (m) => this.#enqueueMessage(m),\n    );\n  }\n\n  connectToMainThread() {\n    if (lazyWorkerThreads().isMainThread) {\n      throw new ERR_INSPECTOR_NOT_WORKER();\n    }\n    if (this.#connection) {\n      throw new ERR_INSPECTOR_ALREADY_CONNECTED(\"The inspector session\");\n    }\n    this.#connection = op_inspector_connect(\n      true,\n      (m) => this.#enqueueMessage(m),\n    );","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/ext/node/polyfills/inspector.js#L92-L128","documentation":"node:inspector's Session holds exactly one connection in a private #connection field. connect() throws ERR_INSPECTOR_ALREADY_CONNECTED when a connection already exists — from a previous connect() or connectToMainThread() that was not followed by disconnect().","triggerScenarios":"session.connect(); session.connect(); — a second connect() with no disconnect() in between; reconnect logic that calls connect() again after a transport drop; two init paths sharing one Session instance that both connect.","commonSituations":"Reconnect logic that calls connect() again after a transport error without disconnect(); hot-reload or test frameworks re-running setup code against a cached Session singleton; two modules sharing one Session and both connecting at init.","solutions":["Call session.disconnect() before reconnecting — disconnect also resets message queues, callback state, and counters.","Create a fresh inspector.Session per connection lifecycle instead of reusing one instance.","Wrap session lifecycle in a small manager that tracks the connected flag."],"exampleFix":"// before\nsession.connect();\ntry { session.connect(); } catch (e) {} // ERR_INSPECTOR_ALREADY_CONNECTED\n\n// after\nsession.disconnect();\nsession.connect();","handlingStrategy":"try-catch","validationCode":"class InspectorSessionManager {\n  #connected = false;\n  connect(session) {\n    if (this.#connected) session.disconnect();\n    session.connect();\n    this.#connected = true;\n  }\n  disconnect(session) {\n    session.disconnect();\n    this.#connected = false;\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  session.connect();\n} catch (e) {\n  if (e.code === 'ERR_INSPECTOR_ALREADY_CONNECTED') {\n    session.disconnect();\n    session.connect();\n  } else throw e;\n}","preventionTips":["Treat connect() and disconnect() as a strict pair — one connect per disconnect.","Do not cache Session singletons across test/setup re-runs.","Call disconnect() unconditionally in teardown/reset flows."],"tags":["inspector","session","state-error","node-compat"],"backgroundTag":"inspector-session-state","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}