/
main.go
58 lines (46 loc) · 1.17 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package main
import (
"bytes"
"compress/gzip"
"io"
"syscall/js"
"time"
)
func main() {
js.Global().Set("compress", compressFunc)
select {}
}
func Compress(src io.Reader) (io.Reader, error) {
var buf bytes.Buffer
zw := gzip.NewWriter(&buf)
zw.ModTime = time.Now()
if _, err := io.Copy(zw, src); err != nil {
return nil, err
}
if err := zw.Close(); err != nil {
return nil, err
}
return &buf, nil
}
func newUint8Array(size int) js.Value {
ua := js.Global().Get("Uint8Array")
return ua.New(size)
}
var compressFunc = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
jsSrc := args[0] // Uint8Arrayを受け取る。
srcLen := jsSrc.Get("length").Int()
srcBytes := make([]byte, srcLen)
js.CopyBytesToGo(srcBytes, jsSrc) // JavaScript側のファイルデータをGo側にコピーする。
src := bytes.NewReader(srcBytes)
r, err := Compress(src) // 圧縮処理の実行。
if err != nil {
panic(err)
}
var buf bytes.Buffer
if _, err := io.Copy(&buf, r); err != nil {
panic(err)
}
ua := newUint8Array(buf.Len())
js.CopyBytesToJS(ua, buf.Bytes()) // Go側で圧縮されたファイルデータをJavaScript側にコピーする。
return ua
})