Skip to content

Commit 29c408b

Browse files
committed
support zst
1 parent 86089fd commit 29c408b

File tree

7 files changed

+95
-37
lines changed

7 files changed

+95
-37
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ assets/icons/shapes
77
.secret/
88
*.wasm
99
web/public/wasm/
10+
testdemos/

cmd/wasm/wasm.go

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,9 @@ package main
22

33
import (
44
"bytes"
5-
"compress/gzip"
6-
"csgo-2d-demo-player/pkg/message"
75
"csgo-2d-demo-player/pkg/parser"
86
"fmt"
9-
"io"
10-
"log"
117
"syscall/js"
12-
"time"
13-
14-
"github.com/markus-wa/demoinfocs-golang/v5/pkg/demoinfocs"
15-
"google.golang.org/protobuf/proto"
168
)
179

1810
func main() {
@@ -23,43 +15,24 @@ func main() {
2315
}
2416

2517
func wasmParseDemo(this js.Value, args []js.Value) interface{} {
26-
fmt.Printf("testt: +%v\n", args[0])
27-
fmt.Printf("arg2: +%v\n", args[1])
28-
input := make([]byte, args[1].Get("length").Int())
29-
js.CopyBytesToGo(input, args[1])
30-
31-
fmt.Println("fer")
32-
33-
parse(bytes.NewReader(input), args[2])
34-
35-
return js.ValueOf("2")
36-
}
18+
fmt.Println("Herere")
19+
filename := args[0].String()
20+
fmt.Println("trying to parse a demo %s", &filename)
3721

38-
func parse(input io.Reader, callback js.Value) {
39-
fmt.Printf("callback? %+v\n", callback)
22+
callback := args[2]
23+
demoData := make([]byte, args[1].Get("length").Int())
24+
js.CopyBytesToGo(demoData, args[1])
4025

41-
gzipReader, streamErr := gzip.NewReader(input)
42-
if streamErr != nil {
43-
log.Printf("Failed to create gzip reader from demo. %+v", streamErr)
44-
}
45-
46-
startTime := time.Now().Local()
47-
err := parser.Parse(gzipReader, func(msg *message.Message, state demoinfocs.GameState) {
48-
fmt.Printf("message: %+v \n", msg.MsgType)
49-
50-
payload, protoErr := proto.Marshal(msg)
51-
if protoErr != nil {
52-
fmt.Printf("failed to marshall the message: %+v %+v\n", msg, protoErr)
53-
}
26+
err := parser.WasmParseDemo(filename, bytes.NewReader(demoData), func(payload []byte) {
5427
arrayConstructor := js.Global().Get("Uint8Array")
5528
dataJS := arrayConstructor.New(len(payload))
5629
js.CopyBytesToJS(dataJS, payload)
5730
callback.Invoke(dataJS)
5831
})
59-
fmt.Printf("parsing took: %s\n", time.Since(startTime))
6032

6133
if err != nil {
6234
fmt.Printf("Failed to parse a demo: %+v \n", err)
6335
}
64-
fmt.Println("demo parsed?")
36+
37+
return js.ValueOf("2")
6538
}

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/alexflint/go-arg v1.5.1
1010
github.com/golang/geo v0.0.0-20250813021530-247f39904721
1111
github.com/gorilla/websocket v1.5.3
12+
github.com/klauspost/compress v1.18.0
1213
github.com/markus-wa/demoinfocs-golang/v5 v5.0.2
1314
github.com/sparkoo/go-steam v0.0.0-20231112203532-968479d66868
1415
github.com/stretchr/testify v1.10.0
@@ -44,6 +45,7 @@ require (
4445
github.com/oklog/ulid/v2 v2.1.1 // indirect
4546
github.com/pkg/errors v0.9.1 // indirect
4647
github.com/pmezard/go-difflib v1.0.0 // indirect
48+
github.com/stretchr/objx v0.5.2 // indirect
4749
go.opencensus.io v0.24.0 // indirect
4850
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
4951
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBY
7979
github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E=
8080
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
8181
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
82+
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
83+
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
8284
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
8385
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
8486
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=

pkg/parser/wasmparser.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package parser
2+
3+
import (
4+
"compress/gzip"
5+
"csgo-2d-demo-player/pkg/message"
6+
"fmt"
7+
"io"
8+
"strings"
9+
10+
"github.com/klauspost/compress/zstd"
11+
"github.com/markus-wa/demoinfocs-golang/v5/pkg/demoinfocs"
12+
"google.golang.org/protobuf/proto"
13+
)
14+
15+
func WasmParseDemo(demoFilename string, demoFile io.Reader, callback func(payload []byte)) error {
16+
decompressedDemo, decompressErr := decompress(demoFilename, demoFile)
17+
if decompressErr != nil {
18+
return decompressErr
19+
}
20+
21+
return Parse(decompressedDemo, func(msg *message.Message, state demoinfocs.GameState) {
22+
fmt.Printf("message: %+v \n", msg.MsgType)
23+
24+
payload, protoErr := proto.Marshal(msg)
25+
if protoErr != nil {
26+
fmt.Printf("failed to marshall the message: %+v %+v\n", msg, protoErr)
27+
}
28+
callback(payload)
29+
})
30+
}
31+
32+
func decompress(filename string, demoFile io.Reader) (io.Reader, error) {
33+
if strings.HasSuffix(filename, ".gz") {
34+
return gzip.NewReader(demoFile)
35+
}
36+
37+
if strings.HasSuffix(filename, ".zst") {
38+
return zstd.NewReader(demoFile)
39+
}
40+
41+
return nil, fmt.Errorf("unsupported file format %s", filename)
42+
}

pkg/parser/wasmparser_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package parser
2+
3+
import (
4+
"os"
5+
"testing"
6+
)
7+
8+
var zstDemofileName = "1-cde451fd-6cd4-4c87-a432-d97d2235021a-1-1.dem.zst"
9+
var gzDemofileName = "1-cde451fd-6cd4-4c87-a432-d97d2235021a-1-1.dem.gz"
10+
var testDemosFolderPath = "../../testdemos"
11+
12+
func TestParseZstDemoArchive(t *testing.T) {
13+
demoFile, err := os.Open(testDemosFolderPath + "/" + zstDemofileName)
14+
if err != nil {
15+
t.Skip("failed to open the demo testfile. skipping for now as I have testdemos just locally")
16+
}
17+
parseErr := WasmParseDemo(zstDemofileName, demoFile, func(payload []byte) {})
18+
if parseErr != nil {
19+
t.Fatalf("failed to parse the demo: %v", parseErr)
20+
}
21+
}
22+
23+
func TestParseGzDemoArchive(t *testing.T) {
24+
demoFile, err := os.Open(testDemosFolderPath + "/" + gzDemofileName)
25+
if err != nil {
26+
t.Skip("failed to open the demo testfile. skipping for now as I have testdemos just locally")
27+
}
28+
parseErr := WasmParseDemo(gzDemofileName, demoFile, func(payload []byte) {})
29+
if parseErr != nil {
30+
t.Fatalf("failed to parse the demo: %v", parseErr)
31+
}
32+
}
33+
34+
func TestParseUnsupportedDemoArchive(t *testing.T) {
35+
parseErr := WasmParseDemo("not_supported.demo", nil, func(payload []byte) {})
36+
if parseErr == nil {
37+
t.Fatalf("parse should fail: %v", parseErr)
38+
}
39+
}

web/public/worker.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ onmessage = (event) => {
2727
};
2828

2929
async function loadWasm() {
30-
console.log("hus", serverHost + "/wasm");
3130
const go = new globalThis.Go();
3231
await WebAssembly.instantiateStreaming(
3332
fetch("/wasm/csdemoparser.wasm"),

0 commit comments

Comments
 (0)