@@ -6,13 +6,11 @@ import (
66 "encoding/json"
77 "fmt"
88 "io"
9- "net/http"
109 "net/url"
1110 "path"
1211 "strconv"
1312 "strings"
1413
15- "github.com/esm-dev/esm.sh/internal/fetch"
1614 "github.com/esm-dev/esm.sh/internal/npm"
1715 "github.com/esm-dev/esm.sh/internal/storage"
1816 "github.com/ije/esbuild-internal/xxhash"
@@ -201,7 +199,7 @@ func legacyESM(ctx *rex.Context, fs storage.Storage, buildVersionPrefix string)
201199 return rex .Status (500 , "Failed to read data from storage" )
202200 }
203201 data = bytes .ReplaceAll (data , []byte ("https://esm.sh/v" ), []byte (origin + "/v" ))
204- data = bytes .ReplaceAll (data , []byte (config . LegacyServer + " /v" ), []byte (origin + "/v" ))
202+ data = bytes .ReplaceAll (data , []byte ("https://legacy.esm.sh /v" ), []byte (origin + "/v" ))
205203 return data
206204 }
207205 }
@@ -253,90 +251,16 @@ func legacyESM(ctx *rex.Context, fs storage.Storage, buildVersionPrefix string)
253251 }
254252 }
255253
256- url , err := ctx .R .URL .Parse (config .LegacyServer + ctx .R .URL .Path + query )
257- if err != nil {
258- return rex .Status (http .StatusBadRequest , "Invalid url" )
259- }
260-
261- client := fetch .NewClient (ctx .UserAgent (), 60 , true )
262- res , err := client .Fetch (url , nil )
263- if err != nil {
264- return rex .Status (http .StatusBadGateway , "Failed to connect the legacy esm.sh server" )
265- }
266- defer res .Body .Close ()
267-
268- if res .StatusCode == 301 || res .StatusCode == 302 {
269- url := res .Header .Get ("Location" )
270- if after , ok := strings .CutPrefix (url , "https://legacy.esm.sh" ); ok {
271- url = getOrigin (ctx ) + after
272- }
273- return redirect (ctx , url , res .StatusCode == 301 )
274- }
275-
276- if res .StatusCode != 200 {
277- data , err := io .ReadAll (res .Body )
278- if err != nil {
279- return rex .Status (500 , "Failed to fetch data from the legacy esm.sh server" )
254+ // strip leading `/stable/*` and `/v<build-version>/*`
255+ if buildVersionPrefix != "" {
256+ origin := getOrigin (ctx )
257+ if strings .HasPrefix (pathname , "/node_" ) || strings .HasSuffix (pathname , ".js" ) {
258+ pathname = "/node/" + strings .TrimSuffix (strings .TrimPrefix (pathname , "/node_" ), ".js" ) + ".mjs"
259+ } else if pathname == "/node.ns.d.ts" {
260+ return rex .Status (404 , "Not Found" )
280261 }
281- ctx .SetHeader ("Cache-Control" , "public, max-age=600" )
282- return rex .Status (res .StatusCode , data )
262+ return redirect (ctx , fmt .Sprintf ("%s%s" , origin , pathname ), true )
283263 }
284264
285- if (buildVersionPrefix != "" && isStatic ) || endsWith (pathname , ".d.ts" , ".d.mts" ) {
286- data , err := io .ReadAll (res .Body )
287- if err != nil {
288- return rex .Status (500 , "Failed to fetch data from the legacy esm.sh server" )
289- }
290- err = fs .Put (savePath , bytes .NewReader (data ))
291- if err != nil {
292- return rex .Status (500 , "Storage error: " + err .Error ())
293- }
294- ctx .SetHeader ("Content-Type" , res .Header .Get ("Content-Type" ))
295- ctx .SetHeader ("Cache-Control" , ccImmutable )
296- // resolve hostname in typescript definition files if the origin is not "https://esm.sh"
297- if endsWith (pathname , ".d.ts" , ".d.mts" ) {
298- origin := getOrigin (ctx )
299- if origin != "https://esm.sh" {
300- data = bytes .ReplaceAll (data , []byte ("https://esm.sh/v" ), []byte (origin + "/v" ))
301- data = bytes .ReplaceAll (data , []byte (config .LegacyServer + "/v" ), []byte (origin + "/v" ))
302- }
303- }
304- return data
305- } else {
306- code , err := io .ReadAll (res .Body )
307- if err != nil {
308- return rex .Status (500 , "Failed to fetch data from the legacy esm.sh server" )
309- }
310- esmId := res .Header .Get ("X-Esm-Id" )
311- dts := res .Header .Get ("X-TypeScript-Types" )
312- if dts != "" {
313- u , err := url .Parse (dts )
314- if err != nil {
315- dts = ""
316- } else {
317- dts = u .Path
318- }
319- }
320- ret := LegacyBuildMeta {
321- EsmId : esmId ,
322- Dts : dts ,
323- Code : string (code ),
324- }
325- err = fs .Put (savePath , bytes .NewReader (utils .MustEncodeJSON (ret )))
326- if err != nil {
327- return rex .Status (500 , "Storage error: " + err .Error ())
328- }
329- ctx .SetHeader ("Content-Type" , res .Header .Get ("Content-Type" ))
330- ctx .SetHeader ("Cache-Control" , ccImmutable )
331- if query != "" && ! ctx .R .URL .Query ().Has ("target" ) {
332- appendVaryHeader (ctx .W .Header (), "User-Agent" )
333- }
334- if esmId != "" {
335- ctx .SetHeader ("X-ESM-Id" , esmId )
336- }
337- if dts != "" {
338- ctx .SetHeader ("X-TypeScript-Types" , getOrigin (ctx )+ dts )
339- }
340- return code
341- }
265+ return rex .Next ()
342266}
0 commit comments