[client] update proto

This commit is contained in:
2018-02-28 22:06:00 +03:00
parent 336896b37e
commit 34e5ac2b9e
10 changed files with 249 additions and 343 deletions

View File

@@ -1,60 +1,45 @@
package ru.m.connect;
import haxework.dispath.Dispatcher;
import haxework.dispath.IDispatcher;
import haxework.provider.Provider;
import promhx.Deferred;
import hxsignal.impl.Signal1;
import haxe.io.Bytes;
import promhx.Promise;
import protohx.Message;
import ru.m.connect.IConnection;
class BaseConnection implements IConnection {
public var handler(default,default):IDispatcher<IConnectionHandler>;
public var packetHandler(default,default):IDispatcher<IPacketHandler>;
public var connected(default, null):Bool;
public var queue(default, null):PacketQueue;
public var builder(default, null):IPacketBuilder;
public function new() {
this.builder = Provider.get(IPacketBuilder);
this.queue = new PacketQueue(builder);
this.handler = new Dispatcher<IConnectionHandler>();
this.packetHandler = new Dispatcher<IPacketHandler>();
}
class BaseConnection<O:Message, I:Message> implements IConnection<O, I> {
public var handler(default, default):Signal1<ConnectionEvent>;
public var packetHandler(default, default):Signal1<I>;
public var connected(default, null):Bool;
public var queue(default, null):PacketQueue<I>;
public function connect():Void {
throw "Not implemented";
}
private var connectDeferred:Deferred<IConnection<O, I>>;
public function disconnect():Void {
throw "Not implemented";
}
public function pushData(bytes:Bytes):Void {
queue.addBytes(bytes);
while (queue.hasMsg()) {
var packet:Message = queue.popMsg();
try {
receive(packet);
} catch (error:Dynamic) {
trace(error);
handler.dispatch(function(h) h.onError(error));
}
public function new(i:Class<I>) {
queue = new PacketQueue<I>(i);
handler = new Signal1<ConnectionEvent>();
packetHandler = new Signal1<I>();
connectDeferred = new Deferred();
}
}
public function send(packet:Message):Void {
#if proto_debug L.d("Send", Type.getClassName(Type.getClass(packet)).split(".").pop()); #end
}
public function receive(packet:Message):Void {
#if proto_debug L.d("Receive", Type.getClassName(Type.getClass(packet)).split(".").pop()); #end
var name = "on" + Type.getClassName(Type.getClass(packet)).split(".").pop();
packetHandler.dispatch(function(h) {
var method = Reflect.field(h, name);
if (method != null && Reflect.isFunction(method)) {
Reflect.callMethod(h, method, [packet]);
} else {
h.onPacket(packet);
}
});
}
public function connect():Promise<IConnection<O, I>> {
throw "Not implemented";
}
public function disconnect():Void {
throw "Not implemented";
}
public function pushData(bytes:Bytes):Void {
queue.addBytes(bytes);
while (queue.hasMsg()) {
var packet:I = queue.popMsg();
packetHandler.emit(packet);
}
}
public function send(packet:O):Void {
#if proto_debug L.d("Send", Type.getClassName(Type.getClass(packet)).split(".").pop()); #end
}
}