Repository navigation
v0.2.3
v0.2.3 — Plugin Concurrency Hardening, Networker Logging & Lint Modernization
Concurrency & Race Condition Fixes
Plugin Loader
- Serialized concurrent plugin reloads to prevent double lifecycle calls (start/stop racing on the same plugin)
- Added test coverage for concurrent reload serialization
Exec Controller
- Fixed
runMuxusingsessionIDas channel map key instead of resolvingpluginIDviasessionIndex - Eliminated send-on-closed-channel races:
safeSendhelper with named return and recover guard propagates errors to callers (e.g.WriteSession) - Consolidated double-RLock pattern across 5 session methods into single
lookupSessionhelper OnPluginStopandOnPluginShutdownnow fully clean upinChans,sessionIndex, andhandlerMapentriesOnPluginStartdefers state registration untilprovider.Streamsucceeds, preventing leaked channels on stream failure- Removed unused
stopsmap field GetPluginHandlers/GetHandlersreturn defensive map copies
Logs Controller
OnPluginStopandOnPluginShutdownnow clean uphandlerMapentries to prevent stale resource handlersSendCommandholds mutex during channel send to prevent send-on-closed-channel panic- Added concurrency test for send-during-shutdown race
Metric Controller
Unsubscribesends to channel while holding lock to prevent race withremovePlugin
Settings Controller
- Added mutex protection to all plugin controller map accesses
Resource Controller
CheckConnectionnow wraps errors throughtoAppErrorandcheckConnectionError, consistent with other Wails-bound RPCs- Added crash-recovery test coverage
Plugin Manager
HandlePluginCrashsanitizes log messages (redacts tokens, long base64/hex strings) before storing in crash context
Networker & CheckConnection
- Added
CheckConnectionRPC support to the networker controller (Wails bindings + adapter) - Added debug-level logging to port-forward lifecycle methods (
StartPortForwardSession,ClosePortForwardSession,StopAll)
UI Fixes
- ConnectionTableItem: Fixed
isConnected()— replaced unreliabletoString() === 'Invalid Date'withisNaN(getTime()) - HomepageCard: Wrapped
PluginContext.Providervalue inuseMemoto prevent unnecessary re-renders - ResourceTableView: Moved
groups.isErrorcheck above!groups.dataearly return so errors render instead of an empty fragment
Tooling & Config
- Migrated both
.golangci.ymlconfigs to golangci-lint v2 format (version: "2",linters.default: none,formatterssection) - Enabled
exhaustructandgomodguardlinters (settings existed but linters weren't in enable list) - Added
goimportslocal-prefixes setting to matchgciprefix - Removed dead
wrapchecktest exclusion (linter not enabled) - Deleted
plugins/aws/.golangci.yml(plugin moving to its own repo)
Dependencies
- Bumped
plugin-sdktov0.2.1
SDK v0.2.1 Changes (included via dependency bump)
context.TODO()→context.Background()in networker/exec shutdown paths- Added logging to
ClosePortForwardSessionandStopAll - Resource controller: added logger field, replaced silent
_ =error swallowing withWarnwlogging - Fixed TOCTOU race in
watch_manager.goAddListener/OnStateChange(lock ordering:listenersMu→pendingMu) - Added
injectSessiontoStartConnectionandStopConnectionRPCs for consistency
What's Changed
- fix: plugin concurrency, networker logging, and SDK v0.2.1 by @joshuapare in #23
Full Changelog: v0.2.2...v0.2.3