Files
GaCy-GO/docs/currency-wars-response-boundary.md
T
2026-10-28 18:54:43 +07:00

2.4 KiB

CW typed response boundary

Source correction, 2026-10-25

The shared typed dispatcher sends its response only when the registered function returns nil (or the handler has already sent the response explicitly). Several CW paths returned resource, validation or save errors directly. Those paths therefore left the Client waiting instead of receiving the revision's typed error response.

CW registrations now use cwHandle / cwHandleNamed, which still resolve request and response IDs by their names through the existing protocol table. When a CW operation returns an application error, the wrapper preserves a nonzero retcode already selected by that handler, or assigns RET_GRID_FIGHT_CONF_MISS if it was still zero. It logs the error and returns control to the dispatcher to send exactly one typed response. It never converts an unsupported operation into success or replays a failed transaction.

Every explicit packet send within these registered handlers uses cwSend to mark any send error, including serialization or projection failures. The wrapper propagates that error, network/EOF/closed-connection errors, and errResponseAlreadySent unchanged. It does not attempt an additional packet in those cases. The former pending-action-specific error defer was removed because it swallowed send errors as though they were application failures.

GridFightUpdatePos also rejects position changes while CURRENT_BATTLE is active, matching the existing Preparation-only mutation boundary used by shop, equipment and grants. This does not remove or settle the active battle.

Validation and limits

  • go build ./internal/gameserver succeeded. No tests were run.
  • No executable was replaced, no server restarted, no live save changed and no probe was staged by this change.
  • This closes a source-level missing-response path. Client behavior is not yet verified, and Tea Break choices, automatic Orb drops/opening and later route recipes are still incomplete.
  • The existing GridFightEnterBonfire handler's success-only navigation response is not proof of a working Tea Break. Its game-event consumer and the associated current revision's choices/effects still need runtime evidence before new pending state can be implemented.

The static inventory scanner recognizes both CW wrappers, so registration reports continue to distinguish present handlers from actual gameplay support.