( ctx context.Context, api *auth0.API, display *display.Renderer, tenantDomain string, )
| 470 | } |
| 471 | |
| 472 | func startWebSocketServer( |
| 473 | ctx context.Context, |
| 474 | api *auth0.API, |
| 475 | display *display.Renderer, |
| 476 | tenantDomain string, |
| 477 | ) error { |
| 478 | ctx, cancel := context.WithCancel(ctx) |
| 479 | defer cancel() |
| 480 | |
| 481 | listener, err := net.Listen("tcp", webServerHost) |
| 482 | if err != nil { |
| 483 | return err |
| 484 | } |
| 485 | defer func() { |
| 486 | _ = listener.Close() |
| 487 | }() |
| 488 | |
| 489 | handler := &webSocketHandler{ |
| 490 | display: display, |
| 491 | api: api, |
| 492 | shutdown: cancel, |
| 493 | tenant: tenantDomain, |
| 494 | } |
| 495 | |
| 496 | assetsWithoutPrefix, err := fs.Sub(universalLoginPreviewAssets, "data/universal-login") |
| 497 | if err != nil { |
| 498 | return err |
| 499 | } |
| 500 | |
| 501 | router := http.NewServeMux() |
| 502 | router.Handle("/", http.FileServer(http.FS(assetsWithoutPrefix))) |
| 503 | router.Handle("/ws", handler) |
| 504 | |
| 505 | server := &http.Server{ |
| 506 | Handler: router, |
| 507 | ReadTimeout: time.Minute * 10, |
| 508 | WriteTimeout: time.Minute * 10, |
| 509 | } |
| 510 | |
| 511 | errChan := make(chan error, 1) |
| 512 | go func() { |
| 513 | errChan <- server.Serve(listener) |
| 514 | }() |
| 515 | |
| 516 | openWebAppInBrowser(display) |
| 517 | |
| 518 | select { |
| 519 | case err := <-errChan: |
| 520 | return err |
| 521 | case <-ctx.Done(): |
| 522 | return server.Close() |
| 523 | } |
| 524 | } |
| 525 | |
| 526 | func openWebAppInBrowser(display *display.Renderer) { |
| 527 | display.Infof("Perform your changes within the editor: %q", webServerURL) |
no test coverage detected