Class: Paquette::NpmServer

Inherits:
Object
  • Object
show all
Defined in:
lib/paquette/npm_server.rb,
lib/paquette/npm_server/npm_repository.rb,
lib/paquette/npm_server/gated_npm_repository.rb,
lib/paquette/npm_server/directory_npm_repository.rb

Defined Under Namespace

Classes: DirectoryNpmRepository, GatedNpmRepository, NpmRepository

Constant Summary collapse

@@routes =
Routes.draw do |r|
  # Root endpoint
  r.get "/" do
    text_ok("Paquette NPM Repository")
  end
   # NPM API endpoints
  r.get "/-/ping" do
    json_ok({})
  end
   r.get "/-/whoami" do
    json_ok({username: "paquette"})
  end
   # Dynamic endpoints with parameters
  r.get "/-/package/:package_name/dist-tags" do |package_name:|
     = @repository.(package_name)
    if  && [:"dist-tags"]
      json_ok([:"dist-tags"])
    else
      not_found("Package not found")
    end
  end
   r.get "/:package_name" do |package_name:|
     = @repository.(package_name)
    if 
      json_ok()
    else
      not_found("Package not found")
    end
  end
   r.get "/:package_name/:tarball_name" do |package_name:, tarball_name:|
    # Extract version from tarball name (e.g., "package-1.0.0.tgz")
    if (match = tarball_name.match(/^#{Regexp.escape(package_name)}-(\d+\.\d+\.\d+.*)\.tgz$/))
      version = match[1]
      package_path = @repository.package_file_path(package_name, version)
       if @repository.package_exists?(package_name, version)
        [200, {"Content-Type" => "application/octet-stream"}, [File.read(package_path)]]
      else
        not_found("Package not found")
      end
    else
      not_found("Invalid package filename")
    end
  end
end

Instance Method Summary collapse

Constructor Details

#initialize(packages_dir) ⇒ NpmServer

Returns a new instance of NpmServer.



60
61
62
# File 'lib/paquette/npm_server.rb', line 60

def initialize(packages_dir)
  @dir_repository = DirectoryNpmRepository.new(packages_dir)
end

Instance Method Details

#call(env) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# File 'lib/paquette/npm_server.rb', line 64

def call(env)
  request = Rack::Request.new(env)
  @repository = GatedNpmRepository.new(@dir_repository) { |name:, version: nil| true }

  if (route = @@routes.match(request))
    @@routes.perform_action(route, self, request)
  else
    not_found("Not Found")
  end
end