From 9c612a26d7821aa57a5de2e0af24e01817821cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 7 Aug 2024 10:40:54 +0200 Subject: [PATCH] Add build time math rendering See #11927 --- cache/filecache/filecache_config.go | 12 +- deps/deps.go | 8 + hugolib/site_new.go | 11 + internal/ext/js/greet.bundle.js | 2 - internal/ext/js/greet.js | 9 - internal/ext/js/renderkatex.js | 15 - internal/ext/katex.go | 39 -- internal/ext/warpc.go | 401 ------------- internal/ext/warpc_test.go | 364 ------------ internal/ext/wasm/greet.wasm | Bin 1864 -> 0 bytes internal/{ext => warpc}/.DS_Store | Bin internal/{ext => warpc}/build.sh | 0 internal/{ext => warpc}/gen/main.go | 0 internal/{ext => warpc}/js/.gitignore | 0 internal/{ext => warpc}/js/common.js | 0 internal/warpc/js/greet.bundle.js | 2 + internal/warpc/js/greet.js | 9 + internal/{ext => warpc}/js/package.json | 0 .../{ext => warpc}/js/renderkatex.bundle.js | 2 +- internal/warpc/js/renderkatex.js | 11 + internal/warpc/katex.go | 35 ++ internal/warpc/warpc.go | 552 ++++++++++++++++++ internal/warpc/warpc_test.go | 439 ++++++++++++++ internal/warpc/wasm/greet.wasm | Bin 0 -> 1979 bytes internal/{ext => warpc}/wasm/quickjs.wasm | Bin internal/{ext => warpc}/wasm/renderkatex.wasm | Bin 472172 -> 472126 bytes internal/{ext => warpc}/watchtestscripts.sh | 0 tpl/transform/transform.go | 99 +++- tpl/transform/transform_integration_test.go | 18 + tpl/transform/unmarshal.go | 4 +- 30 files changed, 1167 insertions(+), 865 deletions(-) delete mode 100644 internal/ext/js/greet.bundle.js delete mode 100644 internal/ext/js/greet.js delete mode 100644 internal/ext/js/renderkatex.js delete mode 100644 internal/ext/katex.go delete mode 100644 internal/ext/warpc.go delete mode 100644 internal/ext/warpc_test.go delete mode 100644 internal/ext/wasm/greet.wasm rename internal/{ext => warpc}/.DS_Store (100%) rename internal/{ext => warpc}/build.sh (100%) rename internal/{ext => warpc}/gen/main.go (100%) rename internal/{ext => warpc}/js/.gitignore (100%) rename internal/{ext => warpc}/js/common.js (100%) create mode 100644 internal/warpc/js/greet.bundle.js create mode 100644 internal/warpc/js/greet.js rename internal/{ext => warpc}/js/package.json (100%) rename internal/{ext => warpc}/js/renderkatex.bundle.js (99%) create mode 100644 internal/warpc/js/renderkatex.js create mode 100644 internal/warpc/katex.go create mode 100644 internal/warpc/warpc.go create mode 100644 internal/warpc/warpc_test.go create mode 100644 internal/warpc/wasm/greet.wasm rename internal/{ext => warpc}/wasm/quickjs.wasm (100%) rename internal/{ext => warpc}/wasm/renderkatex.wasm (86%) rename internal/{ext => warpc}/watchtestscripts.sh (100%) diff --git a/cache/filecache/filecache_config.go b/cache/filecache/filecache_config.go index 6a2b5f3e30a..a71ddb474c4 100644 --- a/cache/filecache/filecache_config.go +++ b/cache/filecache/filecache_config.go @@ -46,6 +46,7 @@ const ( CacheKeyAssets = "assets" CacheKeyModules = "modules" CacheKeyGetResource = "getresource" + CacheKeyMisc = "misc" ) type Configs map[string]FileCacheConfig @@ -70,10 +71,14 @@ var defaultCacheConfigs = Configs{ MaxAge: -1, Dir: resourcesGenDir, }, - CacheKeyGetResource: FileCacheConfig{ + CacheKeyGetResource: { MaxAge: -1, // Never expire Dir: cacheDirProject, }, + CacheKeyMisc: { + MaxAge: -1, + Dir: cacheDirProject, + }, } type FileCacheConfig struct { @@ -120,6 +125,11 @@ func (f Caches) AssetsCache() *Cache { return f[CacheKeyAssets] } +// MiscCache gets the file cache for miscellaneous stuff. +func (f Caches) MiscCache() *Cache { + return f[CacheKeyMisc] +} + // GetResourceCache gets the file cache for remote resources. func (f Caches) GetResourceCache() *Cache { return f[CacheKeyGetResource] diff --git a/deps/deps.go b/deps/deps.go index 0d0f283c26a..e137aed7b10 100644 --- a/deps/deps.go +++ b/deps/deps.go @@ -23,6 +23,7 @@ import ( "github.com/gohugoio/hugo/helpers" "github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/identity" + "github.com/gohugoio/hugo/internal/warpc" "github.com/gohugoio/hugo/media" "github.com/gohugoio/hugo/resources/page" "github.com/gohugoio/hugo/resources/postpub" @@ -93,6 +94,10 @@ type Deps struct { // This is common/global for all sites. BuildState *BuildState + // Holds RPC dispatchers for Katex etc. + // TODO(bep) rethink this re. a plugin setup, but this will have to do for now. + WasmDispatchers *warpc.Dispatchers + *globalErrHandler } @@ -343,6 +348,9 @@ func (d *Deps) Close() error { if d.MemCache != nil { d.MemCache.Stop() } + if d.WasmDispatchers != nil { + d.WasmDispatchers.Close() + } return d.BuildClosers.Close() } diff --git a/hugolib/site_new.go b/hugolib/site_new.go index cb6630cb34a..19a7e42d755 100644 --- a/hugolib/site_new.go +++ b/hugolib/site_new.go @@ -19,6 +19,7 @@ import ( "fmt" "html/template" "os" + "path/filepath" "sort" "time" @@ -34,6 +35,7 @@ import ( "github.com/gohugoio/hugo/hugolib/doctree" "github.com/gohugoio/hugo/hugolib/pagesfromdata" "github.com/gohugoio/hugo/identity" + "github.com/gohugoio/hugo/internal/warpc" "github.com/gohugoio/hugo/langs" "github.com/gohugoio/hugo/langs/i18n" "github.com/gohugoio/hugo/lazy" @@ -157,6 +159,15 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) { MemCache: memCache, TemplateProvider: tplimpl.DefaultTemplateProvider, TranslationProvider: i18n.NewTranslationProvider(), + WasmDispatchers: warpc.AllDispatchers( + warpc.Options{ + CompilationCacheDir: filepath.Join(conf.Dirs().CacheDir, "_warpc"), + + // Katex is relatively slow. + PoolSize: 8, + Infof: logger.InfoCommand("wasm").Logf, + }, + ), } if err := firstSiteDeps.Init(); err != nil { diff --git a/internal/ext/js/greet.bundle.js b/internal/ext/js/greet.bundle.js deleted file mode 100644 index 0237823edcf..00000000000 --- a/internal/ext/js/greet.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{function f(r){let e=[],i=new Uint8Array(1024);for(;;){let n=0;try{n=Javy.IO.readSync(0,i)}catch(o){if(o.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(n<0)throw new Error("Error reading from stdin");if(n===0)break;e=[...e,...i.subarray(0,n)];let t=0;for(let o=0;t { - readInput(greet); -})(); diff --git a/internal/ext/js/renderkatex.js b/internal/ext/js/renderkatex.js deleted file mode 100644 index 206dae8517f..00000000000 --- a/internal/ext/js/renderkatex.js +++ /dev/null @@ -1,15 +0,0 @@ -import { readInput, writeOutput } from './common'; -import katex from 'katex'; - -const render = function (input) { - const expression = input.expression; - const id = input.id; - delete input.expression; - delete input.id; - input.throwOnError = false; - writeOutput({ id: id, output: katex.renderToString(expression, input) }); -}; - -(() => { - readInput(render); -})(); diff --git a/internal/ext/katex.go b/internal/ext/katex.go deleted file mode 100644 index 64793f13a37..00000000000 --- a/internal/ext/katex.go +++ /dev/null @@ -1,39 +0,0 @@ -package ext - -import ( - _ "embed" -) - -//go:embed wasm/renderkatex.wasm -var katexWasm []byte - -var katexOptions = Options{ - CompileModule: compileFunc("katex", katexWasm, true), - PoolSize: 8, -} - -// StartKatex starts a new dispatcher for the Katex module. -func StartKatex() (Dispatcher[KatexInput, KatexOutput], error) { - return Start[KatexInput, KatexOutput](katexOptions) -} - -// See https://katex.org/docs/options.html -type KatexInput struct { - ID uint32 `json:"id"` - Expression string `json:"expression"` - Output string `json:"output"` // html, mathml, htmlAndMathml (default) - DisplayMode bool `json:"displayMode"` -} - -type KatexOutput struct { - ID uint32 `json:"id"` - Output string `json:"output"` -} - -func (k KatexOutput) GetID() uint32 { - return k.ID -} - -func (k KatexInput) GetID() uint32 { - return k.ID -} diff --git a/internal/ext/warpc.go b/internal/ext/warpc.go deleted file mode 100644 index ef4c6bd60f6..00000000000 --- a/internal/ext/warpc.go +++ /dev/null @@ -1,401 +0,0 @@ -package ext - -import ( - "context" - _ "embed" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "runtime" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/gohugoio/hugo/common/hugio" - - "github.com/tetratelabs/wazero" - "github.com/tetratelabs/wazero/api" - "github.com/tetratelabs/wazero/experimental" - "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" -) - -//go:embed wasm/quickjs.wasm -var quickjsWasm []byte - -type IDGetter interface { - GetID() uint32 -} - -type Dispatcher[Q, R IDGetter] interface { - Execute(ctx context.Context, q Q) (R, error) - Close() error -} - -func (p *dispatcherPool[Q, R]) getDispatcher() *dispatcher[Q, R] { - i := int(p.counter.Add(1)) % len(p.dispatchers) - return p.dispatchers[i] -} - -func (p *dispatcherPool[Q, R]) Close() error { - return p.close() -} - -type dispatcher[Q, R IDGetter] struct { - zero R - counter atomic.Uint32 - - mu sync.RWMutex - encMu sync.Mutex - - pending map[uint32]*call[Q, R] - - inOut *inOut - - shutdown bool - closing bool - - close func() error -} - -type inOut struct { - sync.Mutex - stdin hugio.ReadWriteCloser - stdout hugio.ReadWriteCloser - dec *json.Decoder - enc *json.Encoder -} - -var ErrShutdown = fmt.Errorf("dispatcher is shutting down") - -var timerPool = sync.Pool{} - -func getTimer(d time.Duration) *time.Timer { - if v := timerPool.Get(); v != nil { - timer := v.(*time.Timer) - timer.Reset(d) - return timer - } - return time.NewTimer(d) -} - -func putTimer(t *time.Timer) { - if !t.Stop() { - select { - case <-t.C: - default: - } - } - timerPool.Put(t) -} - -// Execute sends a request to the dispatcher and waits for the response. -func (p *dispatcherPool[Q, R]) Execute(ctx context.Context, q Q) (R, error) { - d := p.getDispatcher() - if q.GetID() == 0 { - return d.zero, errors.New("ID must not be 0 (note that this must be unique within the current request set time window)") - } - - call, err := d.newCall(q) - if err != nil { - return d.zero, err - } - - if err := d.send(call); err != nil { - return d.zero, err - } - - timer := getTimer(30 * time.Second) - defer putTimer(timer) - - select { - case call = <-call.Done: - case <-timer.C: - return d.zero, errors.New("timeout") - } - - if call.Error != nil { - return d.zero, call.Error - } - - return call.Response, nil -} - -func (d *dispatcher[Q, R]) newCall(q Q) (*call[Q, R], error) { - call := &call[Q, R]{ - Done: make(chan *call[Q, R], 1), - Request: q, - } - - if d.shutdown || d.closing { - call.Error = ErrShutdown - call.done() - return call, nil - } - - d.mu.Lock() - d.pending[q.GetID()] = call - d.mu.Unlock() - - return call, nil -} - -func (d *dispatcher[Q, R]) send(call *call[Q, R]) error { - d.mu.RLock() - if d.closing || d.shutdown { - d.mu.RUnlock() - return ErrShutdown - } - d.mu.RUnlock() - - d.encMu.Lock() - defer d.encMu.Unlock() - err := d.inOut.enc.Encode(call.Request) - if err != nil { - return err - } - return nil -} - -func (d *dispatcher[Q, R]) input() { - var inputErr error - - for d.inOut.dec.More() { - var r R - if err := d.inOut.dec.Decode(&r); err != nil { - inputErr = err - break - } - - d.mu.Lock() - call, found := d.pending[r.GetID()] - if !found { - d.mu.Unlock() - panic(fmt.Errorf("call with ID %d not found", r.GetID())) - } - delete(d.pending, r.GetID()) - d.mu.Unlock() - call.Response = r - call.done() - } - - // Terminate pending calls. - d.shutdown = true - if inputErr != nil { - isEOF := inputErr == io.EOF || strings.Contains(inputErr.Error(), "already closed") - if isEOF { - if d.closing { - inputErr = ErrShutdown - } else { - inputErr = io.ErrUnexpectedEOF - } - } - } - - d.mu.Lock() - defer d.mu.Unlock() - for _, call := range d.pending { - call.Error = inputErr - call.done() - } -} - -type call[Q, R any] struct { - Request Q - Response R - Error error - Done chan *call[Q, R] -} - -func (call *call[Q, R]) done() { - select { - case call.Done <- call: - default: - } -} - -type Options struct { - Ctx context.Context - - CompileModule func(ctx context.Context, r wazero.Runtime, io []*inOut) (func() error, error) - CompilationCacheDir string - PoolSize int -} - -func Start[Q, R IDGetter](opts Options) (Dispatcher[Q, R], error) { - if opts.PoolSize == 0 { - opts.PoolSize = 1 - } - - return newDispatcher[Q, R](opts) -} - -type dispatcherPool[Q, R IDGetter] struct { - counter atomic.Uint32 - dispatchers []*dispatcher[Q, R] - close func() error -} - -func newDispatcher[Q, R IDGetter](opts Options) (*dispatcherPool[Q, R], error) { - if opts.Ctx == nil { - opts.Ctx = context.Background() - } - if opts.CompileModule == nil { - return nil, errors.New("InstansiateModule is required") - } - ctx := opts.Ctx - - runtimeConfig := wazero.NewRuntimeConfig() - - if opts.CompilationCacheDir != "" { - compilationCache, err := wazero.NewCompilationCacheWithDir(opts.CompilationCacheDir) - if err != nil { - return nil, err - } - runtimeConfig = runtimeConfig.WithCompilationCache(compilationCache) - } - - // Create a new WebAssembly Runtime. - r := wazero.NewRuntimeWithConfig(opts.Ctx, runtimeConfig) - - // Instantiate WASI, which implements system I/O such as console output. - if _, err := wasi_snapshot_preview1.Instantiate(ctx, r); err != nil { - return nil, err - } - - inOuts := make([]*inOut, opts.PoolSize) - for i := 0; i < opts.PoolSize; i++ { - var stdin, stdout hugio.ReadWriteCloser - - stdin = hugio.NewPipeReadWriteCloser() - stdout = hugio.NewPipeReadWriteCloser() - - inOuts[i] = &inOut{ - stdin: stdin, - stdout: stdout, - dec: json.NewDecoder(stdout), - enc: json.NewEncoder(stdin), - } - } - - run, err := opts.CompileModule(ctx, r, inOuts) - if err != nil { - return nil, err - } - - done := make(chan struct{}) - go func() { - // This will block until stdin is closed. - err := run() - if err != nil { - panic(err) - } - close(done) - }() - - dispatchers := make([]*dispatcher[Q, R], len(inOuts)) - for i := 0; i < len(inOuts); i++ { - d := &dispatcher[Q, R]{ - pending: make(map[uint32]*call[Q, R]), - inOut: inOuts[i], - } - go d.input() - dispatchers[i] = d - } - - close := func() error { - for _, d := range dispatchers { - d.closing = true - if err := d.inOut.stdin.Close(); err != nil { - return err - } - if err := d.inOut.stdout.Close(); err != nil { - return err - } - } - - // We need to wait for the WebAssembly instances to finish executing before we can close the runtime. - <-done - - return r.Close(ctx) - } - - dp := &dispatcherPool[Q, R]{ - dispatchers: dispatchers, - close: close, - } - - return dp, nil -} - -func printStackTrace(w io.Writer) { - buf := make([]byte, 1<<16) - runtime.Stack(buf, true) - fmt.Fprintf(w, "%s", buf) -} - -func compileFunc(name string, wasm []byte, needsQuickJSProvider bool) func(ctx context.Context, r wazero.Runtime, inouts []*inOut) (func() error, error) { - return func(ctx context.Context, r wazero.Runtime, inouts []*inOut) (func() error, error) { - compiledModule, err := r.CompileModule(ctx, wasm) - if err != nil { - return nil, err - } - - var compiledQuickJS wazero.CompiledModule - if needsQuickJSProvider { - compiledQuickJS, err = r.CompileModule(ctx, quickjsWasm) - if err != nil { - return nil, err - } - } - - return func() error { - var wg sync.WaitGroup - for i, c := range inouts { - name := fmt.Sprintf("%s_%d", name, i) - c := c - - wg.Add(1) - go func() { - defer wg.Done() - configBase := wazero.NewModuleConfig().WithStderr(os.Stderr).WithStartFunctions() - config := configBase.WithName(name) - if needsQuickJSProvider { - // TODO1 else, configure with stdout etc. - qmod, err := r.InstantiateModule(ctx, compiledQuickJS, configBase.WithName("").WithStdout(c.stdout).WithStdin(c.stdin)) - if err != nil { - panic(err) - } - ctx = experimental.WithImportResolver(ctx, - func(name string) api.Module { - if name == "javy_quickjs_provider_v2" { - return qmod - } - return nil - }) - - } - - mod, err := r.InstantiateModule(ctx, compiledModule, config) - if err != nil { - panic(err) - } - if _, err := mod.ExportedFunction("_start").Call(ctx); err != nil { - panic(err) - } - }() - } - wg.Wait() - return nil - }, nil - } -} - -// TODO1 notes -/* - -QuickJS native JSON intrinsic https://github.com/bytecodealliance/javy/blob/main/crates/javy/src/config.rs -Whether to override the implementation of JSON.parse and JSON.stringify -*/ diff --git a/internal/ext/warpc_test.go b/internal/ext/warpc_test.go deleted file mode 100644 index 5ce28706de2..00000000000 --- a/internal/ext/warpc_test.go +++ /dev/null @@ -1,364 +0,0 @@ -package ext - -import ( - "context" - _ "embed" - "fmt" - "sync" - "sync/atomic" - "testing" -) - -//go:embed wasm/greet.wasm -var greetWasm []byte - -type person struct { - ID uint32 `json:"id"` - Name string `json:"name"` -} - -func (p person) GetID() uint32 { - return p.ID -} - -func TestKatex(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("renderkatex", katexWasm, true), - } - - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - input := KatexInput{ - ID: uint32(32), - Expression: "c = \\pm\\sqrt{a^2 + b^2}", - DisplayMode: true, - } - - result, err := d.Execute(ctx, input) - if err != nil { - t.Fatal(err) - } - - if result.ID != input.ID { - t.Fatalf("%d vs %d", result.ID, input.ID) - } -} - -func TestGreet(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - PoolSize: 2, - } - - d, err := Start[person, greeting](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - inputPerson := person{ - Name: "Person", - } - - for i := 0; i < 20; i++ { - inputPerson.ID = uint32(i + 1) - g, err := d.Execute(ctx, inputPerson) - if err != nil { - t.Fatal(err) - } - if g.Greeting != "Hello Person!" { - t.Fatalf("got: %v", g) - } - if g.ID != inputPerson.ID { - t.Fatalf("%d vs %d", g.ID, inputPerson.ID) - } - - } -} - -func TestGreetParallel(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - PoolSize: 4, - } - d, err := Start[*person, greeting](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - var wg sync.WaitGroup - - for i := 1; i <= 10; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - - ctx := context.Background() - - for j := 0; j < 5; j++ { - base := i * 100 - id := uint32(base + j) - - inputPerson := &person{ - Name: fmt.Sprintf("Person %d", id), - ID: id, - } - g, err := d.Execute(ctx, inputPerson) - if err != nil { - t.Error(err) - return - } - if g.Greeting != fmt.Sprintf("Hello Person %d!", id) { - t.Errorf("got: %v", g) - return - } - if g.ID != inputPerson.ID { - t.Errorf("%d vs %d", g.ID, inputPerson.ID) - return - } - } - }(i) - - } - - wg.Wait() -} - -func TestKatexParallel(t *testing.T) { - opts := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - PoolSize: 6, - } - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - t.Fatal(err) - } - defer d.Close() - - var wg sync.WaitGroup - - for i := 1; i <= 10; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - - ctx := context.Background() - - for j := 0; j < 1; j++ { - base := i * 100 - id := uint32(base + j) - - input := katexInputTemplate - input.ID = id - - result, err := d.Execute(ctx, input) - if err != nil { - t.Error(err) - return - } - - if result.ID != input.ID { - t.Errorf("%d vs %d", result.ID, input.ID) - return - } - } - }(i) - - } - - wg.Wait() -} - -func BenchmarkExecuteKatex(b *testing.B) { - opts := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - } - d, err := Start[*KatexInput, KatexOutput](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - input := &katexInputTemplate - - b.ResetTimer() - for i := 0; i < b.N; i++ { - input.ID = uint32(i + 1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - - } -} - -func BenchmarkKatexStartStop(b *testing.B) { - optsTemplate := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - CompilationCacheDir: b.TempDir(), - } - - runBench := func(b *testing.B, opts Options) { - for i := 0; i < b.N; i++ { - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - b.Fatal(err) - } - if err := d.Close(); err != nil { - b.Fatal(err) - } - } - } - - for _, poolSize := range []int{1, 8, 16} { - - name := fmt.Sprintf("PoolSize%d", poolSize) - - b.Run(name, func(b *testing.B) { - opts := optsTemplate - opts.PoolSize = poolSize - runBench(b, opts) - }) - - } -} - -var katexInputTemplate = KatexInput{ - Expression: "c = \\pm\\sqrt{a^2 + b^2}", - DisplayMode: true, - Output: "html", -} - -func BenchmarkExecuteKatexPara(b *testing.B) { - optsTemplate := Options{ - CompileModule: compileFunc("katex", katexWasm, true), - } - - runBench := func(b *testing.B, opts Options) { - d, err := Start[KatexInput, KatexOutput](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - b.ResetTimer() - - var id atomic.Uint32 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - input := katexInputTemplate - input.ID = id.Add(1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - } - }) - } - - for _, poolSize := range []int{1, 8, 16} { - name := fmt.Sprintf("PoolSize%d", poolSize) - - b.Run(name, func(b *testing.B) { - opts := optsTemplate - opts.PoolSize = poolSize - runBench(b, opts) - }) - } -} - -func BenchmarkExecuteGreet(b *testing.B) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - } - d, err := Start[*person, greeting](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - input := &person{ - Name: "Person", - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - input.ID = uint32(i + 1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - - } -} - -func BenchmarkExecuteGreetPara(b *testing.B) { - opts := Options{ - CompileModule: compileFunc("greet", greetWasm, true), - PoolSize: 8, - } - - d, err := Start[person, greeting](opts) - if err != nil { - b.Fatal(err) - } - defer d.Close() - - ctx := context.Background() - - inputTemplate := person{ - Name: "Person", - } - - b.ResetTimer() - - var id atomic.Uint32 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - input := inputTemplate - input.ID = id.Add(1) - result, err := d.Execute(ctx, input) - if err != nil { - b.Fatal(err) - } - if result.ID != input.ID { - b.Fatalf("%d vs %d", result.ID, input.ID) - } - } - }) -} - -type greeting struct { - ID uint32 `json:"id"` - Greeting string `json:"greeting"` -} - -func (g greeting) GetID() uint32 { - return g.ID -} diff --git a/internal/ext/wasm/greet.wasm b/internal/ext/wasm/greet.wasm deleted file mode 100644 index 77cf5906a8abb0ae6d9f385e76ddafebb5c14cb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmZ`(X>e0j6h8Of_g<2hG$h?9ix>(rmZb}e24RpE5WzAm1%`FnmzS54(j@p^(pnHY z0uF;9jt=__Wo!9?jG`>9h_Yx0=q6GIvB=V@qobu*c8~$jO<_=H$a3zvXZ_B(=Uz~Z z0098vWO)F2w6qlRgi`#FQo4jC6(~g|xo<}N>ihyDcYz)%@_RKsw`gF3ssuwpzp51G zDjt8Xt|^6uArs>ur!-Ov)JYHx){M@!Xh-smbDTus%eYD|!KLAPnqHP#60 z7}f79p>k}o?hk7mhv4_xUe~a#F51(PuWMQuZDLL`JS+g4OCsgba|0rSxs|3IhrjGn z>Pbc@Ndns0YNHbB8Bk!ctcH8lF(4xwxa2t09w&9j>4e`pT-h*2EY?&MLZoVlk5I5{ogpuCN%h zOCg{D^Z}@Ke~gKoM?vUGpiU7$p-@>LNJgQ%9ZBYOBw06*RC);Xrr=a5*zIkp4S~KW ztjQeA^*50Sw~+KE(8}y7?#;+Mh1*CmY+9NJgO;~C{wLAXU?`h3b%%GS+k+?4FE_!=JuB4$haAYHYy>xjcCgR5&5!gek=KXqcAuDAPFy;*#dG>wAGRf*0C_sf)A}XqH4N9&4o%ZKceJo zM8txarWMO(U|;9Qz?9WBRU}LpGeMkXOW4{d}u>K-sP%Tkr2Xnx4G3U|-*JTdw)G z=3lRCD45i(i*jmb)z}aFLHP;mg(8zBt+aoa#<%^$#U7uhJ^#yyRDJh`ueU`q-Z^mi zk+geHdE*PGPaJ$T;o6v%tIap!Z%^v-!PqOazg<=Au+AIQ(q+?opQhZYUzWA@#P)U9 z;#b%%EpBTVIb>P?Gn2>l+duq|oxw|)8>ek_4vU@q?)mikRpUK5t&6`e8fJAbuMy@n z&CS|zbyh|5jM~+YTJELH+F5+mm>D~H?#hZ+9G6FT(!X=O|9jW^>Fd8_o7e1_WBq1D z&5k8y>qdO$yKUL)o^)ARH7_naFL~uBq2XVx_Z_=1!5BTe&HqyK(7oLUkG|OH=)&Tq z%NGv%aa;4R(-!S-I$Jomc1mEzt<}0K??B=F=9W&4Q|~St+Q--4?4CAp+^~uqWy_WQ QhjLy%Jk!LQ-slhi0B`>1KL7v# diff --git a/internal/ext/.DS_Store b/internal/warpc/.DS_Store similarity index 100% rename from internal/ext/.DS_Store rename to internal/warpc/.DS_Store diff --git a/internal/ext/build.sh b/internal/warpc/build.sh similarity index 100% rename from internal/ext/build.sh rename to internal/warpc/build.sh diff --git a/internal/ext/gen/main.go b/internal/warpc/gen/main.go similarity index 100% rename from internal/ext/gen/main.go rename to internal/warpc/gen/main.go diff --git a/internal/ext/js/.gitignore b/internal/warpc/js/.gitignore similarity index 100% rename from internal/ext/js/.gitignore rename to internal/warpc/js/.gitignore diff --git a/internal/ext/js/common.js b/internal/warpc/js/common.js similarity index 100% rename from internal/ext/js/common.js rename to internal/warpc/js/common.js diff --git a/internal/warpc/js/greet.bundle.js b/internal/warpc/js/greet.bundle.js new file mode 100644 index 00000000000..c1b9c5264b0 --- /dev/null +++ b/internal/warpc/js/greet.bundle.js @@ -0,0 +1,2 @@ +(()=>{function i(r){let e=[],a=new Uint8Array(1024);for(;;){let n=0;try{n=Javy.IO.readSync(0,a)}catch(o){if(o.message.includes("os error 29"))break;throw new Error("Error reading from stdin")}if(n<0)throw new Error("Error reading from stdin");if(n===0)break;e=[...e,...a.subarray(0,n)];let t=0;for(let o=0;t0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,a){if(a===void 0&&(a=!1),a){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var s=this.undefStack[this.undefStack.length-1];s&&!s.hasOwnProperty(e)&&(s[e]=this.current[e])}t==null?delete this.current[e]:this.current[e]=t}},u4=_r;m("\\noexpand",function(r){var e=r.popToken();return r.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});m("\\expandafter",function(r){var e=r.popToken();return r.expandOnce(!0),{tokens:[e],numArgs:0}});m("\\@firstoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[0],numArgs:0}});m("\\@secondoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[1],numArgs:0}});m("\\@ifnextchar",function(r){var e=r.consumeArgs(3);r.consumeSpaces();var t=r.future();return e[0].length===1&&e[0][0].text===t.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});m("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");m("\\TextOrMath",function(r){var e=r.consumeArgs(2);return r.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var gr={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};m("\\char",function(r){var e=r.popToken(),t,a="";if(e.text==="'")t=8,e=r.popToken();else if(e.text==='"')t=16,e=r.popToken();else if(e.text==="`")if(e=r.popToken(),e.text[0]==="\\")a=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new M("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=gr[e.text],a==null||a>=t)throw new M("Invalid base-"+t+" digit "+e.text);for(var n;(n=gr[r.future().text])!=null&&n{var a=r.consumeArg().tokens;if(a.length!==1)throw new M("\\newcommand's first argument must be a macro name");var n=a[0].text,s=r.isDefined(n);if(s&&!e)throw new M("\\newcommand{"+n+"} attempting to redefine "+(n+"; use \\renewcommand"));if(!s&&!t)throw new M("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var o=0;if(a=r.consumeArg().tokens,a.length===1&&a[0].text==="["){for(var h="",c=r.expandNextToken();c.text!=="]"&&c.text!=="EOF";)h+=c.text,c=r.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new M("Invalid number of arguments: "+h);o=parseInt(h),a=r.consumeArg().tokens}return r.macros.set(n,{tokens:a,numArgs:o}),""};m("\\newcommand",r=>It(r,!1,!0));m("\\renewcommand",r=>It(r,!0,!1));m("\\providecommand",r=>It(r,!0,!0));m("\\message",r=>{var e=r.consumeArgs(1)[0];return console.log(e.reverse().map(t=>t.text).join("")),""});m("\\errmessage",r=>{var e=r.consumeArgs(1)[0];return console.error(e.reverse().map(t=>t.text).join("")),""});m("\\show",r=>{var e=r.popToken(),t=e.text;return console.log(e,r.macros.get(t),L0[t],$.math[t],$.text[t]),""});m("\\bgroup","{");m("\\egroup","}");m("~","\\nobreakspace");m("\\lq","`");m("\\rq","'");m("\\aa","\\r a");m("\\AA","\\r A");m("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");m("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");m("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");m("\u212C","\\mathscr{B}");m("\u2130","\\mathscr{E}");m("\u2131","\\mathscr{F}");m("\u210B","\\mathscr{H}");m("\u2110","\\mathscr{I}");m("\u2112","\\mathscr{L}");m("\u2133","\\mathscr{M}");m("\u211B","\\mathscr{R}");m("\u212D","\\mathfrak{C}");m("\u210C","\\mathfrak{H}");m("\u2128","\\mathfrak{Z}");m("\\Bbbk","\\Bbb{k}");m("\xB7","\\cdotp");m("\\llap","\\mathllap{\\textrm{#1}}");m("\\rlap","\\mathrlap{\\textrm{#1}}");m("\\clap","\\mathclap{\\textrm{#1}}");m("\\mathstrut","\\vphantom{(}");m("\\underbar","\\underline{\\text{#1}}");m("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');m("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");m("\\ne","\\neq");m("\u2260","\\neq");m("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");m("\u2209","\\notin");m("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");m("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");m("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");m("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");m("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");m("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");m("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");m("\u27C2","\\perp");m("\u203C","\\mathclose{!\\mkern-0.8mu!}");m("\u220C","\\notni");m("\u231C","\\ulcorner");m("\u231D","\\urcorner");m("\u231E","\\llcorner");m("\u231F","\\lrcorner");m("\xA9","\\copyright");m("\xAE","\\textregistered");m("\uFE0F","\\textregistered");m("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');m("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');m("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');m("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');m("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}");m("\u22EE","\\vdots");m("\\varGamma","\\mathit{\\Gamma}");m("\\varDelta","\\mathit{\\Delta}");m("\\varTheta","\\mathit{\\Theta}");m("\\varLambda","\\mathit{\\Lambda}");m("\\varXi","\\mathit{\\Xi}");m("\\varPi","\\mathit{\\Pi}");m("\\varSigma","\\mathit{\\Sigma}");m("\\varUpsilon","\\mathit{\\Upsilon}");m("\\varPhi","\\mathit{\\Phi}");m("\\varPsi","\\mathit{\\Psi}");m("\\varOmega","\\mathit{\\Omega}");m("\\substack","\\begin{subarray}{c}#1\\end{subarray}");m("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");m("\\boxed","\\fbox{$\\displaystyle{#1}$}");m("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");m("\\implies","\\DOTSB\\;\\Longrightarrow\\;");m("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");var br={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};m("\\dots",function(r){var e="\\dotso",t=r.expandAfterFuture().text;return t in br?e=br[t]:(t.slice(0,4)==="\\not"||t in $.math&&N.contains(["bin","rel"],$.math[t].group))&&(e="\\dotsb"),e});var Ot={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};m("\\dotso",function(r){var e=r.future().text;return e in Ot?"\\ldots\\,":"\\ldots"});m("\\dotsc",function(r){var e=r.future().text;return e in Ot&&e!==","?"\\ldots\\,":"\\ldots"});m("\\cdots",function(r){var e=r.future().text;return e in Ot?"\\@cdots\\,":"\\@cdots"});m("\\dotsb","\\cdots");m("\\dotsm","\\cdots");m("\\dotsi","\\!\\cdots");m("\\dotsx","\\ldots\\,");m("\\DOTSI","\\relax");m("\\DOTSB","\\relax");m("\\DOTSX","\\relax");m("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");m("\\,","\\tmspace+{3mu}{.1667em}");m("\\thinspace","\\,");m("\\>","\\mskip{4mu}");m("\\:","\\tmspace+{4mu}{.2222em}");m("\\medspace","\\:");m("\\;","\\tmspace+{5mu}{.2777em}");m("\\thickspace","\\;");m("\\!","\\tmspace-{3mu}{.1667em}");m("\\negthinspace","\\!");m("\\negmedspace","\\tmspace-{4mu}{.2222em}");m("\\negthickspace","\\tmspace-{5mu}{.277em}");m("\\enspace","\\kern.5em ");m("\\enskip","\\hskip.5em\\relax");m("\\quad","\\hskip1em\\relax");m("\\qquad","\\hskip2em\\relax");m("\\tag","\\@ifstar\\tag@literal\\tag@paren");m("\\tag@paren","\\tag@literal{({#1})}");m("\\tag@literal",r=>{if(r.macros.get("\\df@tag"))throw new M("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});m("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");m("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");m("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");m("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");m("\\newline","\\\\\\relax");m("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var ma=A(k0["Main-Regular"][84][1]-.7*k0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+ma+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+ma+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");m("\\hspace","\\@ifstar\\@hspacer\\@hspace");m("\\@hspace","\\hskip #1\\relax");m("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");m("\\ordinarycolon",":");m("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");m("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');m("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');m("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');m("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');m("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');m("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');m("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');m("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');m("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');m("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');m("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');m("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');m("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');m("\u2237","\\dblcolon");m("\u2239","\\eqcolon");m("\u2254","\\coloneqq");m("\u2255","\\eqqcolon");m("\u2A74","\\Coloneqq");m("\\ratio","\\vcentcolon");m("\\coloncolon","\\dblcolon");m("\\colonequals","\\coloneqq");m("\\coloncolonequals","\\Coloneqq");m("\\equalscolon","\\eqqcolon");m("\\equalscoloncolon","\\Eqqcolon");m("\\colonminus","\\coloneq");m("\\coloncolonminus","\\Coloneq");m("\\minuscolon","\\eqcolon");m("\\minuscoloncolon","\\Eqcolon");m("\\coloncolonapprox","\\Colonapprox");m("\\coloncolonsim","\\Colonsim");m("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");m("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");m("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");m("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");m("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");m("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");m("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");m("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");m("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");m("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");m("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");m("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");m("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");m("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");m("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");m("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");m("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");m("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");m("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");m("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");m("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");m("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");m("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");m("\\imath","\\html@mathml{\\@imath}{\u0131}");m("\\jmath","\\html@mathml{\\@jmath}{\u0237}");m("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");m("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");m("\u27E6","\\llbracket");m("\u27E7","\\rrbracket");m("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");m("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");m("\u2983","\\lBrace");m("\u2984","\\rBrace");m("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");m("\u29B5","\\minuso");m("\\darr","\\downarrow");m("\\dArr","\\Downarrow");m("\\Darr","\\Downarrow");m("\\lang","\\langle");m("\\rang","\\rangle");m("\\uarr","\\uparrow");m("\\uArr","\\Uparrow");m("\\Uarr","\\Uparrow");m("\\N","\\mathbb{N}");m("\\R","\\mathbb{R}");m("\\Z","\\mathbb{Z}");m("\\alef","\\aleph");m("\\alefsym","\\aleph");m("\\Alpha","\\mathrm{A}");m("\\Beta","\\mathrm{B}");m("\\bull","\\bullet");m("\\Chi","\\mathrm{X}");m("\\clubs","\\clubsuit");m("\\cnums","\\mathbb{C}");m("\\Complex","\\mathbb{C}");m("\\Dagger","\\ddagger");m("\\diamonds","\\diamondsuit");m("\\empty","\\emptyset");m("\\Epsilon","\\mathrm{E}");m("\\Eta","\\mathrm{H}");m("\\exist","\\exists");m("\\harr","\\leftrightarrow");m("\\hArr","\\Leftrightarrow");m("\\Harr","\\Leftrightarrow");m("\\hearts","\\heartsuit");m("\\image","\\Im");m("\\infin","\\infty");m("\\Iota","\\mathrm{I}");m("\\isin","\\in");m("\\Kappa","\\mathrm{K}");m("\\larr","\\leftarrow");m("\\lArr","\\Leftarrow");m("\\Larr","\\Leftarrow");m("\\lrarr","\\leftrightarrow");m("\\lrArr","\\Leftrightarrow");m("\\Lrarr","\\Leftrightarrow");m("\\Mu","\\mathrm{M}");m("\\natnums","\\mathbb{N}");m("\\Nu","\\mathrm{N}");m("\\Omicron","\\mathrm{O}");m("\\plusmn","\\pm");m("\\rarr","\\rightarrow");m("\\rArr","\\Rightarrow");m("\\Rarr","\\Rightarrow");m("\\real","\\Re");m("\\reals","\\mathbb{R}");m("\\Reals","\\mathbb{R}");m("\\Rho","\\mathrm{P}");m("\\sdot","\\cdot");m("\\sect","\\S");m("\\spades","\\spadesuit");m("\\sub","\\subset");m("\\sube","\\subseteq");m("\\supe","\\supseteq");m("\\Tau","\\mathrm{T}");m("\\thetasym","\\vartheta");m("\\weierp","\\wp");m("\\Zeta","\\mathrm{Z}");m("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");m("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");m("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");m("\\bra","\\mathinner{\\langle{#1}|}");m("\\ket","\\mathinner{|{#1}\\rangle}");m("\\braket","\\mathinner{\\langle{#1}\\rangle}");m("\\Bra","\\left\\langle#1\\right|");m("\\Ket","\\left|#1\\right\\rangle");var ca=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,s=e.consumeArg().tokens,o=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=y=>w=>{r&&(w.macros.set("|",o),n.length&&w.macros.set("\\|",h));var x=y;if(!y&&n.length){var z=w.future();z.text==="|"&&(w.popToken(),x=!0)}return{tokens:x?n:a,numArgs:0}};e.macros.set("|",c(!1)),n.length&&e.macros.set("\\|",c(!0));var p=e.consumeArg().tokens,g=e.expandTokens([...s,...p,...t]);return e.macros.endGroup(),{tokens:g.reverse(),numArgs:0}};m("\\bra@ket",ca(!1));m("\\bra@set",ca(!0));m("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");m("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");m("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");m("\\angln","{\\angl n}");m("\\blue","\\textcolor{##6495ed}{#1}");m("\\orange","\\textcolor{##ffa500}{#1}");m("\\pink","\\textcolor{##ff00af}{#1}");m("\\red","\\textcolor{##df0030}{#1}");m("\\green","\\textcolor{##28ae7b}{#1}");m("\\gray","\\textcolor{gray}{#1}");m("\\purple","\\textcolor{##9d38bd}{#1}");m("\\blueA","\\textcolor{##ccfaff}{#1}");m("\\blueB","\\textcolor{##80f6ff}{#1}");m("\\blueC","\\textcolor{##63d9ea}{#1}");m("\\blueD","\\textcolor{##11accd}{#1}");m("\\blueE","\\textcolor{##0c7f99}{#1}");m("\\tealA","\\textcolor{##94fff5}{#1}");m("\\tealB","\\textcolor{##26edd5}{#1}");m("\\tealC","\\textcolor{##01d1c1}{#1}");m("\\tealD","\\textcolor{##01a995}{#1}");m("\\tealE","\\textcolor{##208170}{#1}");m("\\greenA","\\textcolor{##b6ffb0}{#1}");m("\\greenB","\\textcolor{##8af281}{#1}");m("\\greenC","\\textcolor{##74cf70}{#1}");m("\\greenD","\\textcolor{##1fab54}{#1}");m("\\greenE","\\textcolor{##0d923f}{#1}");m("\\goldA","\\textcolor{##ffd0a9}{#1}");m("\\goldB","\\textcolor{##ffbb71}{#1}");m("\\goldC","\\textcolor{##ff9c39}{#1}");m("\\goldD","\\textcolor{##e07d10}{#1}");m("\\goldE","\\textcolor{##a75a05}{#1}");m("\\redA","\\textcolor{##fca9a9}{#1}");m("\\redB","\\textcolor{##ff8482}{#1}");m("\\redC","\\textcolor{##f9685d}{#1}");m("\\redD","\\textcolor{##e84d39}{#1}");m("\\redE","\\textcolor{##bc2612}{#1}");m("\\maroonA","\\textcolor{##ffbde0}{#1}");m("\\maroonB","\\textcolor{##ff92c6}{#1}");m("\\maroonC","\\textcolor{##ed5fa6}{#1}");m("\\maroonD","\\textcolor{##ca337c}{#1}");m("\\maroonE","\\textcolor{##9e034e}{#1}");m("\\purpleA","\\textcolor{##ddd7ff}{#1}");m("\\purpleB","\\textcolor{##c6b9fc}{#1}");m("\\purpleC","\\textcolor{##aa87ff}{#1}");m("\\purpleD","\\textcolor{##7854ab}{#1}");m("\\purpleE","\\textcolor{##543b78}{#1}");m("\\mintA","\\textcolor{##f5f9e8}{#1}");m("\\mintB","\\textcolor{##edf2df}{#1}");m("\\mintC","\\textcolor{##e0e5cc}{#1}");m("\\grayA","\\textcolor{##f6f7f7}{#1}");m("\\grayB","\\textcolor{##f0f1f2}{#1}");m("\\grayC","\\textcolor{##e3e5e6}{#1}");m("\\grayD","\\textcolor{##d6d8da}{#1}");m("\\grayE","\\textcolor{##babec2}{#1}");m("\\grayF","\\textcolor{##888d93}{#1}");m("\\grayG","\\textcolor{##626569}{#1}");m("\\grayH","\\textcolor{##3b3e40}{#1}");m("\\grayI","\\textcolor{##21242c}{#1}");m("\\kaBlue","\\textcolor{##314453}{#1}");m("\\kaGreen","\\textcolor{##71B307}{#1}");var da={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},xt=class{constructor(e,t,a){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new yt(u4,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Le(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,a,n;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;t=this.popToken(),{tokens:n,end:a}=this.consumeArg(["]"])}else({tokens:n,start:t,end:a}=this.consumeArg());return this.pushToken(new p0("EOF",a.loc)),this.pushTokens(n),t.range(a,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var t=[],a=e&&e.length>0;a||this.consumeSpaces();var n=this.future(),s,o=0,h=0;do{if(s=this.popToken(),t.push(s),s.text==="{")++o;else if(s.text==="}"){if(--o,o===-1)throw new M("Extra }",s)}else if(s.text==="EOF")throw new M("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",s);if(e&&a)if((o===0||o===1&&e[h]==="{")&&s.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(o!==0||a);return n.text==="{"&&t[t.length-1].text==="}"&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new M("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new M("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),a=t.text,n=t.noexpand?null:this._getExpansion(a);if(n==null||e&&n.unexpandable){if(e&&n==null&&a[0]==="\\"&&!this.isDefined(a))throw new M("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var s=n.tokens,o=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs){s=s.slice();for(var h=s.length-1;h>=0;--h){var c=s[h];if(c.text==="#"){if(h===0)throw new M("Incomplete placeholder at end of macro body",c);if(c=s[--h],c.text==="#")s.splice(h+1,1);else if(/^[1-9]$/.test(c.text))s.splice(h,2,...o[+c.text-1]);else throw new M("Not a valid argument number",c)}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new p0(e)]):void 0}expandTokens(e){var t=[],a=this.stack.length;for(this.pushTokens(e);this.stack.length>a;)if(this.expandOnce(!0)===!1){var n=this.stack.pop();n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(n)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t&&t.map(a=>a.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(t==null)return t;if(e.length===1){var a=this.lexer.catcodes[e];if(a!=null&&a!==13)return}var n=typeof t=="function"?t(this):t;if(typeof n=="string"){var s=0;if(n.indexOf("#")!==-1)for(var o=n.replace(/##/g,"");o.indexOf("#"+(s+1))!==-1;)++s;for(var h=new Le(n,this.settings),c=[],p=h.lex();p.text!=="EOF";)c.push(p),p=h.lex();c.reverse();var g={tokens:c,numArgs:s};return g}return n}isDefined(e){return this.macros.has(e)||L0.hasOwnProperty(e)||$.math.hasOwnProperty(e)||$.text.hasOwnProperty(e)||da.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:L0.hasOwnProperty(e)&&!L0[e].primitive}},yr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Ce=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),ot={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},xr={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},Pe=class r{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new xt(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(t===void 0&&(t=!0),this.fetch().text!==e)throw new M("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new p0("}")),this.gullet.pushTokens(e);var a=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,a}parseExpression(e,t){for(var a=[];;){this.mode==="math"&&this.consumeSpaces();var n=this.fetch();if(r.endOfExpression.indexOf(n.text)!==-1||t&&n.text===t||e&&L0[n.text]&&L0[n.text].infix)break;var s=this.parseAtom(t);if(s){if(s.type==="internal")continue}else break;a.push(s)}return this.mode==="text"&&this.formLigatures(a),this.handleInfixNodes(a)}handleInfixNodes(e){for(var t=-1,a,n=0;n=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var h=$[this.mode][t].group,c=m0.range(e),p;if(e1.hasOwnProperty(h)){var g=h;p={type:"atom",mode:this.mode,family:g,loc:c,text:t}}else p={type:h,mode:this.mode,loc:c,text:t};o=p}else if(t.charCodeAt(0)>=128)this.settings.strict&&(kr(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),o={type:"textord",mode:"text",loc:m0.range(e),text:t};else return null;if(this.consume(),s)for(var y=0;y=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var h=$[this.mode][t].group,c=m0.range(e),p;if(e1.hasOwnProperty(h)){var g=h;p={type:"atom",mode:this.mode,family:g,loc:c,text:t}}else p={type:h,mode:this.mode,loc:c,text:t};o=p}else if(t.charCodeAt(0)>=128)this.settings.strict&&(kr(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),o={type:"textord",mode:"text",loc:m0.range(e),text:t};else return null;if(this.consume(),s)for(var y=0;y 0 { + opts.Infof("%s", errBuff.String()) + } + + return nil + }) + } + return g.Wait() + } + + dp := &dispatcherPool[Q, R]{ + dispatchers: make([]*dispatcher[Q, R], len(inOuts)), + + errc: make(chan error, 10), + donec: make(chan struct{}), + } + + go func() { + // This will block until stdin is closed or it encounters an error. + err := run() + dp.SendIfErr(err) + close(dp.donec) + }() + + for i := 0; i < len(inOuts); i++ { + d := &dispatcher[Q, R]{ + pending: make(map[uint32]*call[Q, R]), + inOut: inOuts[i], + } + go d.input() + dp.dispatchers[i] = d + } + + dp.close = func() error { + for _, d := range dp.dispatchers { + d.closing = true + if err := d.inOut.stdin.Close(); err != nil { + return err + } + if err := d.inOut.stdout.Close(); err != nil { + return err + } + } + + // We need to wait for the WebAssembly instances to finish executing before we can close the runtime. + <-dp.donec + + if err := r.Close(ctx); err != nil { + return err + } + + // Return potential late compilation errors. + return dp.Err() + } + + return dp, dp.Err() +} + +type lazyDispatcher[Q, R any] struct { + opts Options + + dispatcher Dispatcher[Q, R] + startOnce sync.Once + started bool + startErr error +} + +func (d *lazyDispatcher[Q, R]) start() (Dispatcher[Q, R], error) { + d.startOnce.Do(func() { + start := time.Now() + d.dispatcher, d.startErr = Start[Q, R](d.opts) + d.started = true + d.opts.Infof("started dispatcher in %s", time.Since(start)) + }) + return d.dispatcher, d.startErr +} + +// Dispatchers holds all the dispatchers for the warpc package. +type Dispatchers struct { + katex *lazyDispatcher[KatexInput, KatexOutput] +} + +func (d *Dispatchers) Katex() (Dispatcher[KatexInput, KatexOutput], error) { + return d.katex.start() +} + +func (d *Dispatchers) Close() error { + var errs []error + if d.katex.started { + if err := d.katex.dispatcher.Close(); err != nil { + errs = append(errs, err) + } + } + if len(errs) == 0 { + return nil + } + return fmt.Errorf("%v", errs) +} + +// AllDispatchers creates all the dispatchers for the warpc package. +// Note that the individual dispatchers are started lazily. +// Remember to call Close on the returned Dispatchers when done. +func AllDispatchers(katexOpts Options) *Dispatchers { + if katexOpts.Runtime.Data == nil { + katexOpts.Runtime = Binary{Name: "javy_quickjs_provider_v2", Data: quickjsWasm} + } + if katexOpts.Main.Data == nil { + katexOpts.Main = Binary{Name: "renderkatex", Data: katexWasm} + } + + if katexOpts.Infof == nil { + katexOpts.Infof = func(format string, v ...any) { + // noop + } + } + + return &Dispatchers{ + katex: &lazyDispatcher[KatexInput, KatexOutput]{opts: katexOpts}, + } +} diff --git a/internal/warpc/warpc_test.go b/internal/warpc/warpc_test.go new file mode 100644 index 00000000000..3de20a0f41f --- /dev/null +++ b/internal/warpc/warpc_test.go @@ -0,0 +1,439 @@ +package warpc + +import ( + "context" + _ "embed" + "fmt" + "sync" + "sync/atomic" + "testing" + + qt "github.com/frankban/quicktest" +) + +//go:embed wasm/greet.wasm +var greetWasm []byte + +type person struct { + Name string `json:"name"` +} + +func TestKatex(t *testing.T) { + c := qt.New(t) + + opts := Options{ + PoolSize: 8, + Runtime: quickjsBinary, + Main: katexBinary, + } + + d, err := Start[KatexInput, KatexOutput](opts) + c.Assert(err, qt.IsNil) + + defer d.Close() + + ctx := context.Background() + + input := KatexInput{ + Expression: "c = \\pm\\sqrt{a^2 + b^2}", + Options: KatexOptions{ + Output: "html", + DisplayMode: true, + }, + } + + message := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: uint32(32), + }, + Data: input, + } + + result, err := d.Execute(ctx, message) + c.Assert(err, qt.IsNil) + + c.Assert(result.GetID(), qt.Equals, message.GetID()) +} + +func TestGreet(t *testing.T) { + c := qt.New(t) + opts := Options{ + PoolSize: 1, + Runtime: quickjsBinary, + Main: greetBinary, + Infof: t.Logf, + } + + for i := 0; i < 2; i++ { + func() { + d, err := Start[person, greeting](opts) + if err != nil { + t.Fatal(err) + } + + defer func() { + c.Assert(d.Close(), qt.IsNil) + }() + + ctx := context.Background() + + inputMessage := Message[person]{ + Header: Header{ + Version: currentVersion, + }, + Data: person{ + Name: "Person", + }, + } + + for j := 0; j < 20; j++ { + inputMessage.Header.ID = uint32(j + 1) + g, err := d.Execute(ctx, inputMessage) + if err != nil { + t.Fatal(err) + } + if g.Data.Greeting != "Hello Person!" { + t.Fatalf("got: %v", g) + } + if g.GetID() != inputMessage.GetID() { + t.Fatalf("%d vs %d", g.GetID(), inputMessage.GetID()) + } + } + }() + } +} + +func TestGreetParallel(t *testing.T) { + c := qt.New(t) + + opts := Options{ + Runtime: quickjsBinary, + Main: greetBinary, + PoolSize: 4, + } + d, err := Start[person, greeting](opts) + c.Assert(err, qt.IsNil) + defer func() { + c.Assert(d.Close(), qt.IsNil) + }() + + var wg sync.WaitGroup + + for i := 1; i <= 10; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + + ctx := context.Background() + + for j := 0; j < 5; j++ { + base := i * 100 + id := uint32(base + j) + + inputPerson := person{ + Name: fmt.Sprintf("Person %d", id), + } + inputMessage := Message[person]{ + Header: Header{ + Version: currentVersion, + ID: id, + }, + Data: inputPerson, + } + g, err := d.Execute(ctx, inputMessage) + if err != nil { + t.Error(err) + return + } + + c.Assert(g.Data.Greeting, qt.Equals, fmt.Sprintf("Hello Person %d!", id)) + c.Assert(g.GetID(), qt.Equals, inputMessage.GetID()) + + } + }(i) + + } + + wg.Wait() +} + +func TestKatexParallel(t *testing.T) { + c := qt.New(t) + + opts := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + PoolSize: 6, + } + d, err := Start[KatexInput, KatexOutput](opts) + c.Assert(err, qt.IsNil) + defer func() { + c.Assert(d.Close(), qt.IsNil) + }() + + var wg sync.WaitGroup + + for i := 1; i <= 10; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + + ctx := context.Background() + + for j := 0; j < 1; j++ { + base := i * 100 + id := uint32(base + j) + + input := katexInputTemplate + inputMessage := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: id, + }, + Data: input, + } + + result, err := d.Execute(ctx, inputMessage) + if err != nil { + t.Error(err) + return + } + + if result.GetID() != inputMessage.GetID() { + t.Errorf("%d vs %d", result.GetID(), inputMessage.GetID()) + return + } + } + }(i) + + } + + wg.Wait() +} + +func BenchmarkExecuteKatex(b *testing.B) { + opts := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + } + d, err := Start[KatexInput, KatexOutput](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + input := katexInputTemplate + + b.ResetTimer() + for i := 0; i < b.N; i++ { + message := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: uint32(i + 1), + }, + Data: input, + } + + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + + } +} + +func BenchmarkKatexStartStop(b *testing.B) { + optsTemplate := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + CompilationCacheDir: b.TempDir(), + } + + runBench := func(b *testing.B, opts Options) { + for i := 0; i < b.N; i++ { + d, err := Start[KatexInput, KatexOutput](opts) + if err != nil { + b.Fatal(err) + } + if err := d.Close(); err != nil { + b.Fatal(err) + } + } + } + + for _, poolSize := range []int{1, 8, 16} { + + name := fmt.Sprintf("PoolSize%d", poolSize) + + b.Run(name, func(b *testing.B) { + opts := optsTemplate + opts.PoolSize = poolSize + runBench(b, opts) + }) + + } +} + +var katexInputTemplate = KatexInput{ + Expression: "c = \\pm\\sqrt{a^2 + b^2}", + Options: KatexOptions{Output: "html", DisplayMode: true}, +} + +func BenchmarkExecuteKatexPara(b *testing.B) { + optsTemplate := Options{ + Runtime: quickjsBinary, + Main: katexBinary, + } + + runBench := func(b *testing.B, opts Options) { + d, err := Start[KatexInput, KatexOutput](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + b.ResetTimer() + + var id atomic.Uint32 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + message := Message[KatexInput]{ + Header: Header{ + Version: currentVersion, + ID: id.Add(1), + }, + Data: katexInputTemplate, + } + + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + } + }) + } + + for _, poolSize := range []int{1, 8, 16} { + name := fmt.Sprintf("PoolSize%d", poolSize) + + b.Run(name, func(b *testing.B) { + opts := optsTemplate + opts.PoolSize = poolSize + runBench(b, opts) + }) + } +} + +func BenchmarkExecuteGreet(b *testing.B) { + opts := Options{ + Runtime: quickjsBinary, + Main: greetBinary, + } + d, err := Start[person, greeting](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + input := person{ + Name: "Person", + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + message := Message[person]{ + Header: Header{ + Version: currentVersion, + ID: uint32(i + 1), + }, + Data: input, + } + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + + } +} + +func BenchmarkExecuteGreetPara(b *testing.B) { + opts := Options{ + Runtime: quickjsBinary, + Main: greetBinary, + PoolSize: 8, + } + + d, err := Start[person, greeting](opts) + if err != nil { + b.Fatal(err) + } + defer d.Close() + + ctx := context.Background() + + inputTemplate := person{ + Name: "Person", + } + + b.ResetTimer() + + var id atomic.Uint32 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + message := Message[person]{ + Header: Header{ + Version: currentVersion, + ID: id.Add(1), + }, + Data: inputTemplate, + } + + result, err := d.Execute(ctx, message) + if err != nil { + b.Fatal(err) + } + if result.GetID() != message.GetID() { + b.Fatalf("%d vs %d", result.GetID(), message.GetID()) + } + } + }) +} + +type greeting struct { + Greeting string `json:"greeting"` +} + +var ( + greetBinary = Binary{ + Name: "greet", + Data: greetWasm, + } + + katexBinary = Binary{ + Name: "renderkatex", + Data: katexWasm, + } + + quickjsBinary = Binary{ + Name: "javy_quickjs_provider_v2", + Data: quickjsWasm, + } +) diff --git a/internal/warpc/wasm/greet.wasm b/internal/warpc/wasm/greet.wasm new file mode 100644 index 0000000000000000000000000000000000000000..dbbd0fda0229d043824fab14f6248aa2f116c2b6 GIT binary patch literal 1979 zcmZ`)3s4kw82|qN|L)$hEY}?%l9n!H8kGkk)ipMbpokG>qd8?Z;ojbI9Npd0?j1%i zEV7hL9rBUnFy&Z{qcdihfbbI&hx8M8wecyi% zbSFvxfOy$FfO)i`0py%h_h-j0~W0#zRt5S1E)vE0f1$S0!RbJZ!~$(He(_X^=+Th81(H zh$%&^(C9MTG~-&-3ML|^7P0i88KgEfsZL|mqH$V99h#8K5dz`H86NC0IIBKpc)~Fw zk_ehkmgQ)sZCkchczr=>lHoStSV*g~t*GY2k@q->fNtA*z3S9P!iK5T>b7HM-D=(& zpOS>aR)fjA;&3%JlB&`eN6A*r%EqY#;aPW;xg< zPCy434bbJ^h>5*#f{;U?TNgm5(7r#Ki$ed;NQzG(DftCSdw{?w3SNVP+kM>E6TK3J z`-+RW{#PWzZ%D9%e&){ew;=Boen*O7^Ya53bbY_)KVmN3g!o|@?E!$9n4sh|y0oJL zGtG2+4FGq0hoFnl-XR7AK&v0t_t)VKAIjcPHucZbWzb!qOI%m-2YLrYu6(r>BXmfE z-326GMu*G)9O_HXAn~6?;?2RQbKJ$n3&(GV+#8T#z?}@>HALWCvmt={_#-_2pWImB zmdVmiymt;q1=1n>UBX8tC;&1@S->s@0r7ET2GxzD6F^i(fS8^FYzTOLVoGwN=^%PR zEWm@vow=t9Vg`s6Vn+7ABtnG((G6i{#gnMvTW5J>?~6egwMD?FGm zOxvMyM303MddMUSzTxy)h8?brOQo|43knNVG&4-cF@s|R^+e!rKykdUz&8$>SZeYw z!LbsyVGiFwVabZ)OF!&cv*Z3X6D#J^0keEb{;bo(OnXD;CU+;_sR$A+6F2P9X(L?;LfM}E?;obRqdaWN%!q~`RoYo>r=~~547~`Z^<3GakJ;! zi9Wk|b?b8{^BSF9e@?Ag`_0K~KIlAMyY0laC-3{Ue(Bum?qRFneB#kh4(H6N9(&~C zE#=GdhJMjlvZC|lr%tS0I%LiuF;}hL^Ha{2X`4f(Gd8U$m9|beHeOxi+cRQ%?)%ZNzWTPvdv&SP=llGF z>V9Xvf8U~}k?Qa>7Z)D;sCwaJ*5-rjdS8hAU>}{kr#TdC5UyVNfa|t5-tGJ>ebw); zteyYK#PK&RI(z$%Yqph#KChY6_}YiZZeICF$5^H7m;6)D-nBDt=j^7o^3yw{hQ6NH F;V)&q3qAk< literal 0 HcmV?d00001 diff --git a/internal/ext/wasm/quickjs.wasm b/internal/warpc/wasm/quickjs.wasm similarity index 100% rename from internal/ext/wasm/quickjs.wasm rename to internal/warpc/wasm/quickjs.wasm diff --git a/internal/ext/wasm/renderkatex.wasm b/internal/warpc/wasm/renderkatex.wasm similarity index 86% rename from internal/ext/wasm/renderkatex.wasm rename to internal/warpc/wasm/renderkatex.wasm index 0aa6e84a84572800ad2765aa663e362f4fbdd8a8..c2b004d75e5f44be09b04afa7743096faf184066 100644 GIT binary patch delta 64340 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 j4vk7a>(cT0{={Zx7Y=wT3#k8 1 { + if err := mapstructure.WeakDecode(args[1], &katexInput); err != nil { + return "", err + } } - return result.Output, nil + + s := hashing.HashString(args...) + key := "tomath/" + s[:2] + "/" + s[2:] + fileCache := ns.deps.ResourceSpec.FileCaches.MiscCache() + + return ns.cacheMath.GetOrCreate(key, func(string) (string, error) { + _, r, err := fileCache.GetOrCreate(key, func() (io.ReadCloser, error) { + message := warpc.Message[warpc.KatexInput]{ + Header: warpc.Header{ + Version: "v1", + ID: ns.id.Add(1), + }, + Data: katexInput, + } + + k, err := ns.deps.WasmDispatchers.Katex() + if err != nil { + return nil, err + } + result, err := k.Execute(ctx, message) + if err != nil { + return nil, err + } + return hugio.NewReadSeekerNoOpCloserFromString(result.Data.Output), nil + }) + if err != nil { + return "", err + } + + return hugio.ReadString(r) + }) } // For internal use. func (ns *Namespace) Reset() { - ns.cache.Clear() + ns.cacheUnmarshal.Clear() } diff --git a/tpl/transform/transform_integration_test.go b/tpl/transform/transform_integration_test.go index 351420a675d..ed37222beed 100644 --- a/tpl/transform/transform_integration_test.go +++ b/tpl/transform/transform_integration_test.go @@ -133,3 +133,21 @@ Scar,"a "dead cat",11 [[name description age] [Spot a nice dog 3] [Rover a big dog 5] [Felix a "malicious" cat 7] [Bella an "evil" cat 9] [Scar a "dead cat 11]] `) } + +func TestToMathML(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['page','rss','section','sitemap','taxonomy','term'] +-- layouts/index.html -- +{{ $opts := dict "output" "mathml" }} +{{ $result := transform.ToMath "c = \\pm\\sqrt{a^2 + b^2}" }} +{{ printf "%v" $result | safeHTML }} + ` + b := hugolib.Test(t, files) + + b.AssertFileContent("public/index.html", ` +