(esmStorage storage.Storage, logger *log.Logger)
| 59 | ) |
| 60 | |
| 61 | func esmRouter(esmStorage storage.Storage, logger *log.Logger) rex.Handle { |
| 62 | var ( |
| 63 | startTime = time.Now() |
| 64 | globalETag = fmt.Sprintf(`W/"%s"`, VERSION) |
| 65 | buildQueue = NewBuildQueue(int(config.BuildConcurrency)) |
| 66 | npmrc = DefaultNpmRC() |
| 67 | metaDB = NewBuildMetaDB(esmStorage) |
| 68 | ) |
| 69 | |
| 70 | // todo: remove old db code after migration is complete |
| 71 | { |
| 72 | oldDbFile := path.Join(config.WorkDir, "esm.db") |
| 73 | if existsFile(oldDbFile) { |
| 74 | var err error |
| 75 | metaDB.oldDB, err = OpenBoltDB(oldDbFile) |
| 76 | if err != nil { |
| 77 | logger.Errorf("failed to open old db: %v", err) |
| 78 | } |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | // purge npm cache when disk is low or full |
| 83 | go func() { |
| 84 | // run an initial check before waiting for the first ticker event |
| 85 | purgeNPMCacheWhenDiskIsLowOrFull(npmrc, logger) |
| 86 | |
| 87 | ticker := time.NewTicker(1 * time.Hour) |
| 88 | defer ticker.Stop() |
| 89 | for range ticker.C { |
| 90 | go purgeNPMCacheWhenDiskIsLowOrFull(npmrc, logger) |
| 91 | } |
| 92 | }() |
| 93 | |
| 94 | return func(ctx *rex.Context) any { |
| 95 | pathname := ctx.R.URL.Path |
| 96 | |
| 97 | // ban malicious requests |
| 98 | if strings.HasSuffix(pathname, ".env") || strings.HasSuffix(pathname, ".php") || strings.Contains(pathname, "/.") { |
| 99 | ctx.SetHeader("Cache-Control", ccImmutable) |
| 100 | return rex.Status(404, "not found") |
| 101 | } |
| 102 | |
| 103 | // handle POST API requests |
| 104 | switch ctx.R.Method { |
| 105 | case "HEAD", "GET": |
| 106 | // continue |
| 107 | case "POST": |
| 108 | switch pathname { |
| 109 | case "/transform": |
| 110 | var options TransformOptions |
| 111 | err := json.NewDecoder(io.LimitReader(ctx.R.Body, 2*MB)).Decode(&options) |
| 112 | ctx.R.Body.Close() |
| 113 | if err != nil { |
| 114 | return rex.Err(400, "require valid json body") |
| 115 | } |
| 116 | if options.Code == "" { |
| 117 | return rex.Err(400, "Code is required") |
| 118 | } |
no test coverage detected