1'use strict';
2
3import * as UDP from 'UDP'
4import * as event from 'events'
5
6class UDPClient extends event.EventEmitter {
7    constructor() {
8        super();
9        this.udpClientInstance = UDP.createSocket();
10        if(this.udpClientInstance < 0) {
11            throw new Error("create socket error!");
12        }
13        this.localPort = 0;
14    }
15
16    bind(port) {
17        this.localPort = port || 0;
18        if(UDP.bind(this.udpClientInstance, this.localPort) < 0) {
19            throw new Error("bind error");
20        }
21        this._onListening();
22    };
23
24    send(options) {
25        if (!(options.message instanceof Array)) {
26            throw new Error("udp send message is empty");
27        }
28        options.message = new Uint8Array(options.message).buffer;
29        UDP.sendto(this.udpClientInstance, options, function(ret) {
30            console.log("sendto callback " + ret);
31            if (ret < 0) {
32                this.emit('error', 'udp send error');
33                if(options.fail) options.fail();
34                return;
35            }
36            this.emit('send', 'udp send success');
37            if(options.success) options.success();
38        }.bind(this));
39    };
40
41    close() {
42        var ret = UDP.close(this.udpClientInstance);
43        if (ret < 0) {
44            console.log('close udp socket faild');
45            return;
46        }
47        this.emit('close', 'udp client close');
48    };
49
50    _onListening() {
51            UDP.recvfrom(this.udpClientInstance, function(data, rinfo, err) {
52            console.log("recvfrom callback " + err);
53            if (err === -4) {
54                this.emit('error', 'udp client receive data error');
55                return;
56            }
57            if (err > 0) {
58                this.emit('message', data, rinfo);
59            }
60        }.bind(this));
61    };
62}
63
64export function createSocket(options) {
65    return new UDPClient(options);
66}