code: func serveChunkExplorer(ctx *cli.Context, globalStore mock.GlobalStorer) (shutdown func(), err error) {
  	if !ctx.IsSet("explorer-address") {
  		return nil, nil
  	}
  
  	corsOrigins := ctx.StringSlice("explorer-cors-origin")
  	server := &http.Server{
  		Handler:      explorer.NewHandler(globalStore, corsOrigins),
  		IdleTimeout:  30 * time.Minute,
  		ReadTimeout:  2 * time.Minute,
  		WriteTimeout: 2 * time.Minute,
  	}
  	listener, err := net.Listen("tcp", ctx.String("explorer-address"))
  	if err != nil {
  		return nil, fmt.Errorf("explorer: %v", err)
  	}
  	log.Info("chunk explorer http", "address", listener.Addr().String(), "origins", corsOrigins)
  
  	go func() {
  		if err := server.Serve(listener); err != nil {
  			log.Error("chunk explorer", "err", err)
  		}
  	}()
  
  	return func() {
  		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  		defer cancel()
  		if err := server.Shutdown(ctx); err != nil {
  			log.Error("chunk explorer: shutdown", "err", err)
  		}
  	}, nil
  }
docs: // serveChunkExplorer starts an http server in background with chunk explorer handler
  // using the provided global store. Server is started if the returned shutdown function
  // is not nil.