Skip to content

Commit f7ee9fa

Browse files
bign8dmitshur
authored andcommitted
Separate high- and low-level wrappers in two packages. (#20)
The goal is to help reduce generated binary size for that only use the low-level wrapper. Packages net and net/url use fmt package, making it not possible to remove the relatively large fmt dependency from the websocket package. Package net is only used to implement the net.Conn interface. Separate the low-level plain wrapper into a different package from the high-level net.Conn wrapper, making it possible for users to import only what they need at a more granular level. Updates #18. Updates #19.
1 parent edfe143 commit f7ee9fa

File tree

5 files changed

+74
-54
lines changed

5 files changed

+74
-54
lines changed

README.md

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,44 @@
11
websocket
22
=========
33

4-
Package websocket provides high- and low-level bindings for the browser's WebSocket API.
4+
Packages websocket and websocketjs provide high- and low-level bindings for the browser's WebSocket API (respectively).
55

6-
The high-level bindings act like a regular net.Conn. They can be used as such. For example:
6+
The high-level bindings offer a Dial function that returns a regular net.Conn.
7+
It can be used similarly to net package.
78

89
```Go
9-
c, err := websocket.Dial("ws://localhost/socket") // Blocks until connection is established
10-
if err != nil { panic(err) }
10+
conn, err := websocket.Dial("ws://localhost/socket") // Blocks until connection is established.
11+
if err != nil {
12+
// handle error
13+
}
1114

1215
buf := make([]byte, 1024)
13-
n, err = c.Read(buf) // Blocks until a WebSocket frame is received
14-
if err != nil { panic(err) }
16+
n, err = conn.Read(buf) // Blocks until a WebSocket frame is received.
1517
doSomethingWithData(buf[:n])
18+
if err != nil {
19+
// handle error
20+
}
1621

17-
_, err = c.Write([]byte("Hello!"))
18-
if err != nil { panic(err) }
22+
_, err = conn.Write([]byte("Hello!"))
23+
// ...
1924

20-
err = c.Close()
21-
if err != nil { panic(err) }
25+
err = conn.Close()
26+
// ...
2227
```
2328

24-
The low-level bindings use the typical JavaScript idioms.
29+
The low-level bindings work with typical JavaScript idioms, such as adding event listeners with callbacks.
2530

2631
```Go
27-
ws, err := websocket.New("ws://localhost/socket") // Does not block.
28-
if err != nil { panic(err) }
32+
ws, err := websocketjs.New("ws://localhost/socket") // Does not block.
33+
if err != nil {
34+
// handle error
35+
}
2936

3037
onOpen := func(ev *js.Object) {
31-
err := ws.Send([]byte("Hello!")) // Send as a binary frame
32-
err := ws.Send("Hello!") // Send a text frame
38+
err := ws.Send([]byte("Hello!")) // Send a binary frame.
39+
// ...
40+
err := ws.Send("Hello!") // Send a text frame.
41+
// ...
3342
}
3443

3544
ws.AddEventListener("open", false, onOpen)
@@ -38,5 +47,5 @@ ws.AddEventListener("close", false, onClose)
3847
ws.AddEventListener("error", false, onError)
3948

4049
err = ws.Close()
41-
if err != nil { panic(err) }
50+
// ...
4251
```

conn.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"time"
1414

1515
"github.com/gopherjs/gopherjs/js"
16+
"github.com/gopherjs/websocket/websocketjs"
1617
)
1718

1819
func beginHandlerOpen(ch chan error, removeHandlers func()) func(ev *js.Object) {
@@ -64,7 +65,7 @@ var errDeadlineReached = &deadlineErr{}
6465
// Dial opens a new WebSocket connection. It will block until the connection is
6566
// established or fails to connect.
6667
func Dial(url string) (net.Conn, error) {
67-
ws, err := New(url)
68+
ws, err := websocketjs.New(url)
6869
if err != nil {
6970
return nil, err
7071
}
@@ -107,7 +108,7 @@ func Dial(url string) (net.Conn, error) {
107108

108109
// conn is a high-level wrapper around WebSocket. It implements net.Conn interface.
109110
type conn struct {
110-
*WebSocket
111+
*websocketjs.WebSocket
111112

112113
ch chan *messageEvent
113114
readBuf *bytes.Reader

doc.go

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,27 @@
33
// in the LICENSE file.
44

55
/*
6-
Package websocket provides high- and low-level bindings for the browser's WebSocket API.
6+
Package websocket provides high-level bindings for the browser's WebSocket API.
77
8-
The high-level bindings act like a regular net.Conn. They can be used as such. For example:
8+
These bindings offer a Dial function that returns a regular net.Conn.
9+
It can be used similarly to net package.
910
10-
c, err := websocket.Dial("ws://localhost/socket") // Blocks until connection is established
11-
if err != nil { panic(err) }
11+
conn, err := websocket.Dial("ws://localhost/socket") // Blocks until connection is established.
12+
if err != nil {
13+
// handle error
14+
}
1215
1316
buf := make([]byte, 1024)
14-
n, err = c.Read(buf) // Blocks until a WebSocket frame is received
15-
if err != nil { panic(err) }
17+
n, err = conn.Read(buf) // Blocks until a WebSocket frame is received.
1618
doSomethingWithData(buf[:n])
17-
18-
_, err = c.Write([]byte("Hello!"))
19-
if err != nil { panic(err) }
20-
21-
err = c.Close()
22-
if err != nil { panic(err) }
23-
24-
The low-level bindings use the typical JavaScript idioms.
25-
26-
ws, err := websocket.New("ws://localhost/socket") // Does not block.
27-
if err != nil { panic(err) }
28-
29-
onOpen := func(ev *js.Object) {
30-
err := ws.Send([]byte("Hello!")) // Send as a binary frame
31-
err := ws.Send("Hello!") // Send a text frame
19+
if err != nil {
20+
// handle error
3221
}
3322
34-
ws.AddEventListener("open", false, onOpen)
35-
ws.AddEventListener("message", false, onMessage)
36-
ws.AddEventListener("close", false, onClose)
37-
ws.AddEventListener("error", false, onError)
23+
_, err = conn.Write([]byte("Hello!"))
24+
// ...
3825
39-
err = ws.Close()
40-
if err != nil { panic(err) }
26+
err = conn.Close()
27+
// ...
4128
*/
4229
package websocket

test/test/index.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/gopherjs/gopherjs/js"
1212
"github.com/gopherjs/websocket"
13+
"github.com/gopherjs/websocket/websocketjs"
1314
"github.com/rusco/qunit"
1415
)
1516

@@ -28,11 +29,11 @@ func getWSBaseURL() string {
2829
func main() {
2930
wsBaseURL := getWSBaseURL()
3031

31-
qunit.Module("websocket.WebSocket")
32+
qunit.Module("websocketjs.WebSocket")
3233
qunit.Test("Invalid URL", func(assert qunit.QUnitAssert) {
3334
qunit.Expect(1)
3435

35-
ws, err := websocket.New("blah://blah.example/invalid")
36+
ws, err := websocketjs.New("blah://blah.example/invalid")
3637
if err == nil {
3738
ws.Close()
3839
assert.Ok(false, "Got no error, but expected an invalid URL error")
@@ -44,7 +45,7 @@ func main() {
4445
qunit.AsyncTest("Immediate close", func() interface{} {
4546
qunit.Expect(2)
4647

47-
ws, err := websocket.New(wsBaseURL + "immediate-close")
48+
ws, err := websocketjs.New(wsBaseURL + "immediate-close")
4849
if err != nil {
4950
qunit.Ok(false, fmt.Sprintf("Error opening WebSocket: %s", err))
5051
qunit.Start()

wrapper.go renamed to websocketjs/websocketjs.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,35 @@
22
// Use of this source code is governed by a BSD-style license that can be found
33
// in the LICENSE file.
44

5-
package websocket
5+
/*
6+
Package websocketjs provides low-level bindings for the browser's WebSocket API.
67
7-
import (
8-
"github.com/gopherjs/gopherjs/js"
9-
)
8+
These bindings work with typical JavaScript idioms,
9+
such as adding event listeners with callbacks.
10+
11+
ws, err := websocketjs.New("ws://localhost/socket") // Does not block.
12+
if err != nil {
13+
// handle error
14+
}
15+
16+
onOpen := func(ev *js.Object) {
17+
err := ws.Send([]byte("Hello!")) // Send a binary frame.
18+
// ...
19+
err := ws.Send("Hello!") // Send a text frame.
20+
// ...
21+
}
22+
23+
ws.AddEventListener("open", false, onOpen)
24+
ws.AddEventListener("message", false, onMessage)
25+
ws.AddEventListener("close", false, onClose)
26+
ws.AddEventListener("error", false, onError)
27+
28+
err = ws.Close()
29+
// ...
30+
*/
31+
package websocketjs
32+
33+
import "github.com/gopherjs/gopherjs/js"
1034

1135
// ReadyState represents the state that a WebSocket is in. For more information
1236
// about the available states, see
@@ -69,8 +93,6 @@ func New(url string) (ws *WebSocket, err error) {
6993
// WebSocket is a low-level convenience wrapper around the browser's WebSocket
7094
// object. For more information, see
7195
// http://dev.w3.org/html5/websockets/#the-websocket-interface
72-
//
73-
// For the high-level wrapper, see Conn.
7496
type WebSocket struct {
7597
*js.Object
7698

0 commit comments

Comments
 (0)