Skip to content

Commit

Permalink
Disable sourcemaps support in babel if input is big (#2345)
Browse files Browse the repository at this point in the history
This prevents babel from using up a lot of memory (3.5x as much as
before source maps) on really big inputs.

Co-authored-by: na-- <n@andreev.sh>
Co-authored-by: Ivan <2103732+codebien@users.noreply.github.com>
  • Loading branch information
3 people authored and oleiade committed Jan 26, 2022
1 parent 22a0db3 commit 3f2c0d9
Showing 1 changed file with 31 additions and 2 deletions.
33 changes: 31 additions & 2 deletions js/compiler/compiler.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import (
_ "embed" // we need this for embedding Babel
"encoding/json"
"errors"
"os"
"strconv"
"sync"
"time"

Expand Down Expand Up @@ -81,14 +83,20 @@ var (
"highlightCode": false,
}

maxSrcLenForBabelSourceMap = 250 * 1024 //nolint:gochecknoglobals
maxSrcLenForBabelSourceMapOnce sync.Once //nolint:gochecknoglobals

onceBabelCode sync.Once // nolint:gochecknoglobals
globalBabelCode *goja.Program // nolint:gochecknoglobals
globalBabelCodeErr error // nolint:gochecknoglobals
onceBabel sync.Once // nolint:gochecknoglobals
globalBabel *babel // nolint:gochecknoglobals
)

const sourceMapURLFromBabel = "k6://internal-should-not-leak/file.map"
const (
maxSrcLenForBabelSourceMapVarName = "K6_DEBUG_SOURCEMAP_FILESIZE_LIMIT"
sourceMapURLFromBabel = "k6://internal-should-not-leak/file.map"
)

// A Compiler compiles JavaScript source code (ES5.1 or ES6) into a goja.Program
type Compiler struct {
Expand Down Expand Up @@ -124,7 +132,28 @@ func (c *Compiler) Transform(src, filename string, inputSrcMap []byte) (code str
return
}

code, srcMap, err = c.babel.transformImpl(c.logger, src, filename, c.Options.SourceMapLoader != nil, inputSrcMap)
sourceMapEnabled := c.Options.SourceMapLoader != nil
maxSrcLenForBabelSourceMapOnce.Do(func() {
// TODO: drop this code and everything it's connected to when babel is dropped
v := os.Getenv(maxSrcLenForBabelSourceMapVarName)
if len(v) > 0 {
i, err := strconv.Atoi(v) //nolint:govet // we shadow err on purpose
if err != nil {
c.logger.Warnf("Tried to parse %q from %s as integer but couldn't %s\n",
v, maxSrcLenForBabelSourceMapVarName, err)
return
}
maxSrcLenForBabelSourceMap = i
}
})
if sourceMapEnabled && len(src) > maxSrcLenForBabelSourceMap {
sourceMapEnabled = false
c.logger.Warnf("The source for `%s` needs to go through babel but is over %d bytes. "+
"For performance reasons source map support will be disabled for this particular file.",
filename, maxSrcLenForBabelSourceMap)
}

code, srcMap, err = c.babel.transformImpl(c.logger, src, filename, sourceMapEnabled, inputSrcMap)
return
}

Expand Down

0 comments on commit 3f2c0d9

Please sign in to comment.