@@ -42,22 +42,40 @@ defmodule NPM.Registry do
4242 @ doc "Fetch the abbreviated packument for a package."
4343 @ spec get_packument ( String . t ( ) ) :: { :ok , packument ( ) } | { :error , term ( ) }
4444 def get_packument ( package ) do
45+ case NPM.PackumentCache . get ( package ) do
46+ { :ok , packument } ->
47+ { :ok , packument }
48+
49+ :miss ->
50+ fetch_packument ( package )
51+ end
52+ end
53+
54+ defp fetch_packument ( package ) do
4555 url = "#{ registry_url ( ) } /#{ encode_package ( package ) } "
4656 headers = auth_headers ( ) ++ [ accept: "application/vnd.npm.install-v1+json" ]
47-
48- fetch_with_retry ( url , headers , @ max_retries )
57+ fetch_with_retry ( package , url , headers , @ max_retries )
4958 end
5059
51- defp fetch_with_retry ( url , headers , retries_left ) do
60+ defp fetch_with_retry ( package , url , headers , retries_left ) do
5261 result = Req . get ( url , headers: headers , decode_body: false )
5362
5463 case classify_result ( result ) do
55- { :ok , body } -> { :ok , body |> decode_body ( ) |> parse_packument ( ) }
56- { :retry , _ } when retries_left > 0 -> retry ( url , headers , retries_left )
57- { _ , error } -> error
64+ { :ok , body } ->
65+ packument = body |> decode_body ( ) |> parse_packument ( )
66+ NPM.PackumentCache . put ( package , packument )
67+ { :ok , packument }
68+
69+ { :retry , _ } when retries_left > 0 ->
70+ retry ( package , url , headers , retries_left )
71+
72+ { _ , error } ->
73+ error
5874 end
5975 end
6076
77+
78+
6179 defp classify_result ( { :ok , % { status: 200 , body: body } } ) , do: { :ok , body }
6280 defp classify_result ( { :ok , % { status: 404 } } ) , do: { :error , { :error , :not_found } }
6381 defp classify_result ( { :ok , % { status: 401 } } ) , do: { :error , { :error , :unauthorized } }
@@ -66,9 +84,9 @@ defmodule NPM.Registry do
6684 defp classify_result ( { :ok , % { status: s } } ) , do: { :error , { :error , { :http , s } } }
6785 defp classify_result ( { :error , reason } ) , do: { :retry , { :error , reason } }
6886
69- defp retry ( url , headers , retries_left ) do
87+ defp retry ( package , url , headers , retries_left ) do
7088 Process . sleep ( 1000 * ( @ max_retries - retries_left + 1 ) )
71- fetch_with_retry ( url , headers , retries_left - 1 )
89+ fetch_with_retry ( package , url , headers , retries_left - 1 )
7290 end
7391
7492 defp auth_headers do
0 commit comments