Compare commits

6 Commits

Author SHA1 Message Date
b59c939e3e Add acl
All checks were successful
continuous-integration/drone/push Build is passing
2022-01-20 21:22:52 +01:00
3a30c7a6f4 Actually fix path
All checks were successful
continuous-integration/drone/push Build is passing
2022-01-20 21:18:57 +01:00
bdab11b100 try fix path
All checks were successful
continuous-integration/drone/push Build is passing
2022-01-20 21:16:30 +01:00
d3f6f0e946 update ci
All checks were successful
continuous-integration/drone/push Build is passing
2022-01-20 21:13:40 +01:00
f05c4bbcc7 Update wasm
All checks were successful
continuous-integration/drone/push Build is passing
2022-01-20 20:32:57 +01:00
d2ac081d5e Update pipeline 2022-01-20 20:32:40 +01:00
4 changed files with 120 additions and 11 deletions

View File

@@ -1,9 +1,55 @@
---
kind: pipeline kind: pipeline
type: kubernetes type: kubernetes
name: default name: build-clis
steps: steps:
- name: build - name: build
image: golang:1.17 image: golang:1.17
commands: commands:
- go build - make build-cross-clis
- name: upload
image: plugins/s3
settings:
bucket: covergen
source: dist/*
target: /dist/
strip_prefix: dist/
acl: readonly
path_style: true
endpoint: https://s3.blacknova.io
access_key:
from_secret: minio_access_key_id
secret_key:
from_secret: minio_secret_access_key
---
kind: pipeline
type: kubernetes
name: build-wasm
steps:
- name: build
image: golang:1.17
environment:
GOOS: js
GOARCH: wasm
commands:
- make wasm
- name: upload
image: plugins/s3
settings:
bucket: covergen
source: assets/**/*
target: /
strip_prefix: assets/
acl: readonly
path_style: true
endpoint: https://s3.blacknova.io
access_key:
from_secret: minio_access_key_id
secret_key:
from_secret: minio_secret_access_key

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@ covergen
!covergen/ !covergen/
*.pdf *.pdf
assets/*.wasm assets/*.wasm
dist/

View File

@@ -1,3 +1,9 @@
.PHONY: build-cross-clis
build-cross-clis:
rm -rf ./dist && mkdir ./dist
GOOS=linux GOARCH=amd64 go build -o dist/covergen.linux-amd64 ./cmd/covergen
GOOS=darwin GOARCH=amd64 go build -o dist/covergen.darwin-amd64 ./cmd/covergen
.PHONY: wasm
wasm: wasm:
GOOS=js GOARCH=wasm go build -o assets/covergen.wasm ./cmd/wasm/main.go GOOS=js GOARCH=wasm go build -o assets/covergen.wasm ./cmd/wasm/main.go
.PHONY: wasm

View File

@@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"syscall/js" "syscall/js"
"github.com/go-pdf/fpdf"
"github.com/thegrumpylion/jsref" "github.com/thegrumpylion/jsref"
"covergen/pkg/covergen" "covergen/pkg/covergen"
@@ -70,6 +71,18 @@ func settingsFromValue(arg js.Value) (*covergen.CoverSettings, error) {
}, nil }, 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{} { func generateCover(this js.Value, args []js.Value) interface{} {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
@@ -96,18 +109,61 @@ func generateCover(this js.Value, args []js.Value) interface{} {
return jsmap{"error": err.Error()} return jsmap{"error": err.Error()}
} }
var buf bytes.Buffer jsBytes, err := pdfToJs(pdf)
if err = pdf.Output(&buf); err != nil { 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()} return jsmap{"error": err.Error()}
} }
s := buf.Bytes() front, err := covergen.GenerateFrontCover(*settings)
ta := js.Global().Get("Uint8Array").New(len(s)) if err != nil {
js.CopyBytesToJS(ta, s) return jsmap{"error": fmt.Sprintf("failed to render front: %s", err.Error())}
return ta }
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() { 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) <-make(chan bool)
} }