From f05c4bbcc7a0634b4ef661c53371027453a2589a Mon Sep 17 00:00:00 2001 From: Jur van den Berg Date: Thu, 20 Jan 2022 20:32:57 +0100 Subject: [PATCH] Update wasm --- cmd/wasm/main.go | 70 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/cmd/wasm/main.go b/cmd/wasm/main.go index 83f7425..1810f31 100644 --- a/cmd/wasm/main.go +++ b/cmd/wasm/main.go @@ -6,6 +6,7 @@ import ( "fmt" "syscall/js" + "github.com/go-pdf/fpdf" "github.com/thegrumpylion/jsref" "covergen/pkg/covergen" @@ -70,6 +71,18 @@ func settingsFromValue(arg js.Value) (*covergen.CoverSettings, error) { }, nil } +func pdfToJs(pdf *fpdf.Fpdf) (js.Value, error) { + var buf bytes.Buffer + if err := pdf.Output(&buf); err != nil { + return js.Null(), fmt.Errorf("failed to write pdf: %w", err) + } + + s := buf.Bytes() + ta := js.Global().Get("Uint8Array").New(len(s)) + js.CopyBytesToJS(ta, s) + return ta, nil +} + func generateCover(this js.Value, args []js.Value) interface{} { defer func() { if r := recover(); r != nil { @@ -96,18 +109,61 @@ func generateCover(this js.Value, args []js.Value) interface{} { return jsmap{"error": err.Error()} } - var buf bytes.Buffer - if err = pdf.Output(&buf); err != nil { + jsBytes, err := pdfToJs(pdf) + if err != nil { + return jsmap{"error": err.Error()} + } + return jsBytes +} + +func generateSplitCover(this js.Value, args []js.Value) interface{} { + defer func() { + if r := recover(); r != nil { + fmt.Println("recovered", r) + } + }() + + if len(args) != 1 { + return jsmap{"error": "missing argument"} + } + + arg := args[0] + if arg.Type() != js.TypeObject { + return jsmap{"error": "expected object"} + } + + settings, err := settingsFromValue(arg) + if err != nil { return jsmap{"error": err.Error()} } - s := buf.Bytes() - ta := js.Global().Get("Uint8Array").New(len(s)) - js.CopyBytesToJS(ta, s) - return ta + front, err := covergen.GenerateFrontCover(*settings) + if err != nil { + return jsmap{"error": fmt.Sprintf("failed to render front: %s", err.Error())} + } + + back, err := covergen.GenerateBackCover(*settings) + if err != nil { + return jsmap{"error": fmt.Sprintf("failed to render back: %s", err.Error())} + } + + frontJSBytes, err := pdfToJs(front) + if err != nil { + return jsmap{"error": fmt.Sprintf("failed to render front: %s", err.Error())} + } + backJSBytes, err := pdfToJs(back) + if err != nil { + return jsmap{"error": fmt.Sprintf("failed to render back: %s", err.Error())} + } + + return jsmap{ + "front": frontJSBytes, + "back": backJSBytes, + } } func main() { - js.Global().Set("covergen", js.FuncOf(generateCover)) + js.Global().Set("generateCover", js.FuncOf(generateCover)) + js.Global().Set("generateSplitCover", js.FuncOf(generateSplitCover)) <-make(chan bool) }