Skip to content

Commit 9389d68

Browse files
author
Brian Sorahan
committed
massive breaking changes
1 parent 7812204 commit 9389d68

15 files changed

+268
-673
lines changed

bundle.go

+21-23
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package osc
22

33
import (
4-
"bytes"
54
"encoding/binary"
6-
"fmt"
75
"io"
86
"net"
97
"time"
@@ -62,27 +60,27 @@ func NewBundle() *Bundle {
6260
// parseBundle parses an OSC bundle from a slice of bytes.
6361
func parseBundle(data []byte, senderAddress net.Addr) (*Bundle, error) {
6462
// Read the '#bundle' OSC string
65-
startTag, _ := readPaddedString(data)
66-
// *start += n
67-
68-
if startTag != BundleTag {
69-
return nil, fmt.Errorf("Invalid bundle start tag: %s", startTag)
70-
}
71-
72-
// Read the timetag
73-
var (
74-
timeTag uint64
75-
r = bytes.NewReader(data)
76-
)
77-
if err := binary.Read(r, binary.BigEndian, &timeTag); err != nil {
78-
return nil, err
79-
}
80-
// *start += 8
81-
82-
// Create a new bundle
83-
bundle := &Bundle{Timetag: Timetag(timeTag), SenderAddress: senderAddress}
84-
85-
return bundle, nil
63+
// startTag, _ := readPaddedString(data)
64+
// // *start += n
65+
66+
// if startTag != BundleTag {
67+
// return nil, fmt.Errorf("Invalid bundle start tag: %s", startTag)
68+
// }
69+
70+
// // Read the timetag
71+
// var (
72+
// timeTag uint64
73+
// r = bytes.NewReader(data)
74+
// )
75+
// if err := binary.Read(r, binary.BigEndian, &timeTag); err != nil {
76+
// return nil, err
77+
// }
78+
// // *start += 8
79+
80+
// // Create a new bundle
81+
// bundle := &Bundle{Timetag: Timetag(timeTag), SenderAddress: senderAddress}
82+
83+
return nil, nil
8684
}
8785

8886
// Element is an implementation of the Elementer interface.

client.go

-35
This file was deleted.

client_test.go

+26-80
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ package osc
22

33
import (
44
"bytes"
5-
"log"
6-
"os"
5+
"net"
76
"testing"
87
)
98

@@ -13,29 +12,39 @@ func TestClientSend(t *testing.T) {
1312
errChan = make(chan error, 1)
1413
)
1514

16-
handlers := map[string]Method{
17-
"/osc/address": func(msg *Message) {
15+
dispatcher := map[string]Method{
16+
"/osc/address": func(msg *Message) error {
1817
doneChan <- msg
18+
return nil
1919
},
2020
}
2121

22-
server, err := NewServer("127.0.0.1:0", handlers)
22+
laddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
2323
if err != nil {
2424
t.Fatal(err)
2525
}
26-
defer func() { _ = server.Close() }() // Best effort.
2726

28-
go func() {
29-
errChan <- server.Listen()
30-
}()
27+
server, err := ListenUDP("udp", laddr)
28+
if err != nil {
29+
t.Fatal(err)
30+
}
31+
defer func() { _ = server.Close() }() // Best effort.
3132

32-
_ = <-server.Listening
33+
serverAddr := server.LocalAddr()
34+
raddr, err := net.ResolveUDPAddr(serverAddr.Network(), serverAddr.String())
35+
if err != nil {
36+
t.Fatal(err)
37+
}
3338

34-
client, err := NewClient(server.LocalAddr())
39+
client, err := DialUDP("udp", nil, raddr)
3540
if err != nil {
3641
t.Fatal(err)
3742
}
3843

44+
go func() {
45+
errChan <- server.Serve(dispatcher) // Best effort.
46+
}()
47+
3948
msg := NewMessage("/osc/address")
4049
if err := msg.WriteInt32(111); err != nil {
4150
t.Fatal(err)
@@ -48,11 +57,7 @@ func TestClientSend(t *testing.T) {
4857
}
4958

5059
// Send a message.
51-
data, err := msg.Bytes()
52-
if err != nil {
53-
t.Fatal(err)
54-
}
55-
if err := client.Send(data); err != nil {
60+
if err := client.Send(msg); err != nil {
5661
t.Fatal(err)
5762
}
5863

@@ -66,76 +71,17 @@ func TestClientSend(t *testing.T) {
6671

6772
recvMsg := <-doneChan
6873

69-
recvData, err := recvMsg.Bytes()
74+
recvData, err := recvMsg.bytes()
7075
if err != nil {
7176
t.Fatal(err)
7277
}
7378

74-
if 0 != bytes.Compare(data, recvData[0:len(data)]) {
75-
t.Fatalf("Expected %s got %s", data, recvData)
76-
}
77-
}
78-
79-
func ExampleClient() {
80-
var (
81-
doneChan = make(chan struct{})
82-
errChan = make(chan error, 1)
83-
)
84-
85-
handlers := map[string]Method{
86-
"/osc/address": func(msg *Message) {
87-
errChan <- msg.Print(os.Stdout)
88-
doneChan <- struct{}{}
89-
},
90-
}
91-
92-
server, err := NewServer("127.0.0.1:0", handlers)
79+
data, err := msg.bytes()
9380
if err != nil {
94-
log.Fatal(err)
95-
}
96-
defer func() { _ = server.Close() }() // Best effort.
97-
98-
go func() {
99-
errChan <- server.Listen()
100-
}()
101-
102-
_ = <-server.Listening
103-
104-
client, err := NewClient(server.LocalAddr())
105-
if err != nil {
106-
log.Fatal(err)
107-
}
108-
109-
msg := NewMessage("/osc/address")
110-
if err := msg.WriteInt32(111); err != nil {
111-
log.Fatal(err)
112-
}
113-
if err := msg.WriteBool(true); err != nil {
114-
log.Fatal(err)
115-
}
116-
if err := msg.WriteString("hello"); err != nil {
117-
log.Fatal(err)
118-
}
119-
120-
// Send a message.
121-
data, err := msg.Bytes()
122-
if err != nil {
123-
log.Fatal(err)
124-
}
125-
126-
if err := client.Send(data); err != nil {
127-
log.Fatal(err)
81+
t.Fatal(err)
12882
}
12983

130-
select {
131-
default:
132-
case err := <-errChan:
133-
if err != nil {
134-
log.Fatal(err)
135-
}
84+
if 0 != bytes.Compare(data, recvData[0:len(data)]) {
85+
t.Fatalf("Expected %s got %s", data, recvData)
13686
}
137-
138-
_ = <-doneChan
139-
// Output:
140-
// /osc/address,iTs 111 true hello
14187
}

conn.go

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package osc
2+
3+
import (
4+
"errors"
5+
"net"
6+
"strings"
7+
)
8+
9+
const (
10+
readBufSize = 4096
11+
)
12+
13+
// Common errors.
14+
var (
15+
errBundle = errors.New("message is a bundle")
16+
ErrNilDispatcher = errors.New("nil dispatcher")
17+
ErrPrematureClose = errors.New("server cannot be closed before calling Listen")
18+
networkTCP = "tcp"
19+
networkUDP = "udp"
20+
)
21+
22+
// Conn defines the methods
23+
type Conn interface {
24+
net.Conn
25+
Serve(Dispatcher) error
26+
Send(*Message) error
27+
}
28+
29+
var invalidAddressRunes = []rune{'*', '?', ',', '[', ']', '{', '}', '#', ' '}
30+
31+
func validateAddress(addr string) error {
32+
for _, chr := range invalidAddressRunes {
33+
if strings.ContainsRune(addr, chr) {
34+
return ErrInvalidAddress
35+
}
36+
}
37+
return nil
38+
}

conn_test.go

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package osc
2+
3+
import (
4+
"net"
5+
"testing"
6+
)
7+
8+
func TestInvalidAddress(t *testing.T) {
9+
dispatcher := map[string]Method{
10+
"/address*/test": func(msg *Message) error {
11+
return nil
12+
},
13+
}
14+
laddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
15+
if err != nil {
16+
t.Fatal(err)
17+
}
18+
server, err := ListenUDP("udp", laddr)
19+
if err != nil {
20+
t.Fatal(err)
21+
}
22+
defer func() { _ = server.Close() }() // Best effort.
23+
24+
if err := server.Serve(dispatcher); err != ErrInvalidAddress {
25+
t.Fatal("expected invalid address error")
26+
}
27+
if server != nil {
28+
_ = server.Close()
29+
}
30+
}
31+
32+
func TestMessageDispatching(t *testing.T) {
33+
// dispatcher := map[string]Method{
34+
// "/address/test": func(msg *Message) error {
35+
// val, err := msg.ReadInt32()
36+
// if err != nil {
37+
// return err
38+
// }
39+
// if expected, got := int32(1122), val; expected != got {
40+
// return fmt.Errorf("Expected %d got %d", expected, got)
41+
// }
42+
// return nil
43+
// },
44+
// }
45+
46+
laddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
47+
if err != nil {
48+
t.Fatal(err)
49+
}
50+
51+
server, err := ListenUDP("udp", laddr)
52+
if err != nil {
53+
t.Fatal(err)
54+
}
55+
defer func() { _ = server.Close() }() // Best effort.
56+
}

dispatcher.go

+10-7
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,28 @@ var (
66
ErrInvalidAddress = errors.New("invalid OSC address")
77
)
88

9-
// oscDispatcher dispatches OSC packets.
10-
type oscDispatcher map[string]Method
9+
// Method is an OSC method
10+
type Method func(msg *Message) error
1111

12-
// dispatchMessage dispatches OSC message.
13-
func (disp oscDispatcher) dispatchMessage(msg *Message) error {
12+
// Dispatcher dispatches OSC packets.
13+
type Dispatcher map[string]Method
14+
15+
// DispatchMessage dispatches OSC message.
16+
func (disp Dispatcher) DispatchMessage(msg *Message) error {
1417
for address, method := range disp {
1518
matched, err := msg.Match(address)
1619
if err != nil {
1720
return err
1821
}
1922
if matched {
20-
method(msg)
23+
return method(msg)
2124
}
2225
}
2326
return nil
2427
}
2528

26-
// dispatchBundle dispatches an OSC bundle.
27-
func (disp oscDispatcher) dispatchBundle(bun *Bundle) error {
29+
// DispatchBundle dispatches an OSC bundle.
30+
func (disp Dispatcher) DispatchBundle(bun *Bundle) error {
2831
for address, method := range disp {
2932
bun.Invoke(address, method)
3033
}

0 commit comments

Comments
 (0)