You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: server.rb
    path of file: ./repos/ruby-lsp/lib/ruby_lsp
    
    the code of the file until where you have to start completion: # typed: strict
# frozen_string_literal: true

module RubyLsp
  # rubocop:disable RubyLsp/UseLanguageServerAliases
  Interface = LanguageServer::Protocol::Interface
  Constant = LanguageServer::Protocol::Constant
  Transport = LanguageServer::Protocol::Transport
  # rubocop:enable RubyLsp/UseLanguageServerAliases

  class Server
    extend T::Sig

    sig { void }
    def initialize
      @writer = T.let(Transport::Stdio::Writer.new, Transport::Stdio::Writer)
      @reader = T.let(Transport::Stdio::Reader.new, Transport::Stdio::Reader)
      @store = T.let(Store.new, Store)

      # The job queue is the actual list of requests we have to process
      @job_queue = T.let(Thread::Queue.new, Thread::Queue)
      # The jobs hash is just a way of keeping a handle to jobs based on the request ID, so we can cancel them
      @jobs = T.let({}, T::Hash[T.any(String, Integer), Job])
      @mutex = T.let(Mutex.new, Mutex)
      @worker = T.let(new_worker, Thread)

      # The messages queue includes requests and notifications to be sent to the client
      @message_queue = T.let(Thread::Queue.new, Thread::Queue)

      # The executor is responsible for executing requests
      @executor = T.let(Executor.new(@store, @message_queue), Executor)

      # Create a thread to watch the messages queue and send them to the client
      @message_dispatcher = T.let(
        Thread.new do
          current_request_id = 1

          loop do
            message = @message_queue.pop
            break if message
    
    def initialize
      @writer = T.let(Transport::Stdio::Writer.new, Transport::Stdio::Writer)
      @reader = T.let(Transport::Stdio::Reader.new, Transport::Stdio::Reader)
      @store = T.let(Store.new, Store)

      # The job queue is the actual list of requests we have to process
      @job_queue = T.let(Thread::Queue.new, Thread::Queue)
      # The jobs hash is just a way of keeping a handle to jobs based on the request ID, so we can cancel them
      @jobs = T.let({}, T::Hash[T.any(String, Integer), Job])
      @mutex = T.let(Mutex.new, Mutex)
      @worker = T.let(new_worker, Thread)

      # The messages queue includes requests and notifications to be sent to the client
      @message_queue = T.let(Thread::Queue.new, Thread::Queue)

      # The executor is responsible for executing requests
      @executor = T.let(Executor.new(@store, @message_queue), Executor)

      # Create a thread to watch the messages queue and send them to the client
      @message_dispatcher = T.let(
        Thread.new do
          current_request_id = 1

          loop do
            message = @message_queue.pop
            break if message.nil?

            @mutex.synchronize do
              case message
              when Notification
                @writer.write(method: message.message, params: message.params)
              when Request
                @writer.write(id: current_request_id, method: message.message, params: message.params)
                current_request_id += 1
              end
            end
          end
        end,
        Thread,
      )

      Thread.main.priority = 1
    end