fix: for enjoy hangle server name.

Hee Sung Son committed Nov 7, 2025 at 23:49 UTC 06941a9a28f28edce871ebdb31ae8ab6883b6505
2 files changed +55 -3
cmd/webclient/main_js.go
+46 -1
@@ -614,14 +614,35 @@ func (p *Proxy) handleDisconnect(w http.ResponseWriter, r *http.Request, connID
614 // SDK Connection handlers for Service Worker messaging
615
616 func handleSDKConnect(data js.Value) {
617 + defer func() {
618 + if r := recover(); r != nil {
619 + log.Error().Interface("panic", r).Msg("[SDK Connect] Recovered from panic")
620 + }
621 + }()
622 +
623 + // Safely extract fields with validation
624 + if data.Get("leaseName").Type() == js.TypeUndefined || data.Get("clientId").Type() == js.TypeUndefined {
625 + log.Warn().Msg("[SDK Connect] Missing required fields")
626 + return
627 + }
628 +
629 leaseName := data.Get("leaseName").String()
630 clientId := data.Get("clientId").String()
631
632 log.Info().Str("leaseName", leaseName).Str("clientId", clientId).Msg("[SDK Connect] Connecting")
633
634 go func() {
635 + defer func() {
636 + if r := recover(); r != nil {
637 + log.Error().Interface("panic", r).Str("clientId", clientId).Msg("[SDK Connect] Goroutine recovered from panic")
638 + }
639 + }()
640 + // Convert leaseName (may be punycode) to uppercase unicode
641 + normalizedLeaseName := getLeaseID(leaseName)
642 + log.Debug().Str("original", leaseName).Str("normalized", normalizedLeaseName).Msg("[SDK Connect] Normalized lease name")
643 +
644 // Lookup lease by name to get lease ID
624 - lease, err := rdClient.LookupName(leaseName)
645 + lease, err := rdClient.LookupName(normalizedLeaseName)
646 if err != nil {
647 log.Error().Err(err).Str("leaseName", leaseName).Msg("[SDK Connect] Lease lookup failed")
648 js.Global().Call("__sdk_post_message", map[string]interface{}{
@@ -716,6 +737,18 @@ func handleSDKConnect(data js.Value) {
737 }
738
739 func handleSDKSend(data js.Value) {
740 + defer func() {
741 + if r := recover(); r != nil {
742 + log.Error().Interface("panic", r).Msg("[SDK Send] Recovered from panic")
743 + }
744 + }()
745 +
746 + // Safely extract fields with validation
747 + if data.Get("connId").Type() == js.TypeUndefined || data.Get("clientId").Type() == js.TypeUndefined || data.Get("data").Type() == js.TypeUndefined {
748 + log.Warn().Msg("[SDK Send] Missing required fields")
749 + return
750 + }
751 +
752 connID := data.Get("connId").String()
753 clientId := data.Get("clientId").String()
754 payload := data.Get("data")
@@ -767,6 +800,18 @@ func handleSDKSend(data js.Value) {
800 }
801
802 func handleSDKClose(data js.Value) {
803 + defer func() {
804 + if r := recover(); r != nil {
805 + log.Error().Interface("panic", r).Msg("[SDK Close] Recovered from panic")
806 + }
807 + }()
808 +
809 + // Safely extract fields with validation
810 + if data.Get("connId").Type() == js.TypeUndefined || data.Get("clientId").Type() == js.TypeUndefined {
811 + log.Warn().Msg("[SDK Close] Missing required fields")
812 + return
813 + }
814 +
815 connID := data.Get("connId").String()
816 clientId := data.Get("clientId").String()
817
cmd/webclient/polyfill.js
+9 -2
@@ -83,8 +83,15 @@
83 try {
84 // Extract hostname from URL
85 const urlObj = new URL(this.url);
86 - const hostname = urlObj.hostname;
87 - const leaseName = hostname.split('.')[0].toUpperCase();
86 + let hostname = urlObj.hostname;
87 +
88 + // Normalize punycode to lowercase (punycode is case-insensitive per RFC 3492)
89 + // This ensures XN--CW4B85OB9G becomes xn--cw4b85ob9g before processing
90 + hostname = hostname.toLowerCase();
91 +
92 + // Extract first label (keep lowercase for punycode conversion in Go backend)
93 + // Go backend will convert punycode->unicode and then uppercase
94 + const leaseName = hostname.split('.')[0];
95
96 console.log("[WebSocket Polyfill] Lease name:", leaseName);
97