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