From 83d5762b4e29a19739267ec3a49dd7df3c0b3eea Mon Sep 17 00:00:00 2001 From: Je Xia Date: Wed, 15 Jan 2025 22:45:53 +0800 Subject: [PATCH] Fix leacy router --- server/legacy_router.go | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/server/legacy_router.go b/server/legacy_router.go index f0afcf08..f5fab6e1 100644 --- a/server/legacy_router.go +++ b/server/legacy_router.go @@ -100,6 +100,12 @@ func esmLegacyRouter(buildStorage storage.Storage) rex.Handle { } } +type LegacyBuildMeta struct { + EsmId string `json:"esmId"` + Dts string `json:"dts"` + Code string `json:"code"` +} + func legacyESM(ctx *rex.Context, buildStorage storage.Storage, buildVersionPrefix string) any { pathname := ctx.R.URL.Path if buildVersionPrefix != "" { @@ -179,26 +185,27 @@ func legacyESM(ctx *rex.Context, buildStorage storage.Storage, buildVersionPrefi h.Write([]byte(query)) savePath += "." + base64.RawURLEncoding.EncodeToString(h.Sum(nil)) } - savePath += ".mjs" + savePath += ".meta" f, _, e := buildStorage.Get(savePath) if e != nil && e != storage.ErrNotFound { return rex.Status(500, "Storage error: "+e.Error()) } if e == nil { defer f.Close() - var ret []string - if json.NewDecoder(f).Decode(&ret) == nil && len(ret) >= 2 { + var ret LegacyBuildMeta + if json.NewDecoder(f).Decode(&ret) == nil { ctx.SetHeader("Content-Type", ctJavaScript) ctx.SetHeader("Control-Cache", ccImmutable) - ctx.SetHeader("X-ESM-Id", ret[0]) if varyUA { appendVaryHeader(ctx.W.Header(), "User-Agent") } - if len(ret) == 3 { - ctx.SetHeader("X-TypeScript-Types", getOrigin(ctx)+ret[1]) - return ret[2] + if ret.EsmId != "" { + ctx.SetHeader("X-ESM-Id", ret.EsmId) + } + if ret.Dts != "" { + ctx.SetHeader("X-TypeScript-Types", getOrigin(ctx)+ret.Dts) } - return ret[1] + return ret.Code } } } @@ -242,10 +249,6 @@ func legacyESM(ctx *rex.Context, buildStorage storage.Storage, buildVersionPrefi return rex.Status(500, "Failed to fetch data from the legacy esm.sh server") } esmId := res.Header.Get("X-Esm-Id") - if esmId == "" { - ctx.SetHeader("Cache-Control", "public, max-age=600") - return rex.Status(502, "Unexpected response from the legacy esm.sh server") - } dts := res.Header.Get("X-TypeScript-Types") if dts != "" { u, err := url.Parse(dts) @@ -255,21 +258,23 @@ func legacyESM(ctx *rex.Context, buildStorage storage.Storage, buildVersionPrefi dts = u.Path } } - ret := []string{esmId} - if dts != "" { - ret = append(ret, dts) + ret := LegacyBuildMeta{ + EsmId: esmId, + Dts: dts, + Code: string(code), } - ret = append(ret, string(code)) err = buildStorage.Put(savePath, bytes.NewReader(utils.MustEncodeJSON(ret))) if err != nil { return rex.Status(500, "Storage error: "+err.Error()) } ctx.SetHeader("Content-Type", res.Header.Get("Content-Type")) ctx.SetHeader("Control-Cache", ccImmutable) - ctx.SetHeader("X-ESM-Id", esmId) if query != "" && !ctx.R.URL.Query().Has("target") { appendVaryHeader(ctx.W.Header(), "User-Agent") } + if esmId != "" { + ctx.SetHeader("X-ESM-Id", esmId) + } if dts != "" { ctx.SetHeader("X-TypeScript-Types", getOrigin(ctx)+dts) }