• v1.1.8 5857dec730

    v1.1.8
    SonarQube Scan / SonarQube Trigger (push) Successful in 4m6s
    Docker Build and Push / Run Tests (push) Successful in 2m31s
    Docker Build and Push / Build and Push Docker Image (push) Successful in 18m4s
    Stable

    bagas released this 2026-07-19 14:13:04 +07:00 | 5 commits to main since this release

    Concurrency and lifecycle safety fixes across the session, transport, forwarder, and port-registry packages, plus a new frontendURL env var.

    • Fix data race in SetChannel() and Channel() by adding mutex protection

    • Fix data race in StartedAt() by adding mutex protection

    • Fix waitForTCPIPForward() failing on non-tcpip-forward global requests

    • Fix data races in the forwarder struct (SetType(), SetForwardedPort(), SetListener(), TunnelType(), ForwardedPort(), Listener()) via sync.RWMutex

    • Fix data races in the slug struct (Set(), String()) via sync.RWMutex

    • Fix data race in HandleTCPForward() caused by a goroutine writing to an outer-scope err variable

    • Fix POST/PUT requests hanging in the HTTP handler

    • Fix AddRange infinite loop when endPort == 65535 (uint16 wraparound)

    • Fix Claim bypassing the allowed port range — now rejects out-of-range ports

    • Fix Unassigned handing out the same port to concurrent callers — now reserves atomically

    • Fix SetStatus silently creating entries for unknown ports — now returns an error

    • Fix concurrent map read/write in registry.Update crashing the server

    • Refactor Close() to release its mutex before calling external code, preventing deadlocks

    • Make CLOSED a terminal state — SetChannel() and SetStatus() now reject/ignore calls after Close()

    • Add nil check to SetChannel() to prevent masking upstream bugs

    • Add PortRegistry interface for better interface segregation

    • Set startedAt when the session starts running, instead of at object creation

    • Extract Close() into helper methods: closeChannel(), closeConnection(), cleanupRegistry(), cleanupForwarder()

    • Fix isClosedError() redundant string comparison

    • Make cleanupRegistry() conditional on non-empty slug to avoid unnecessary registry calls

    • Use ForwardedPort() / Listener() getters consistently instead of direct field access

    • Add frontendURL environment variable

    • #150 Fix race conditions and improve lifecycle safety

    • #151 fix(session): resolve race conditions

    • #154 fix(httphandler): post/put request hang

    • #155 fix(port, session): harden port registry and fix concurrent allocation

    • #156 fix(registry): data race registry update

    Downloads