[common] udpate proto

This commit is contained in:
2018-03-01 12:05:06 +03:00
parent 634f5ad2d0
commit 45fab2c0b5
15 changed files with 96 additions and 63 deletions

View File

@@ -8,6 +8,7 @@ const Haxe = require('../tasks/haxe');
const FlashPlayer = require('../tasks/flashplayer'); const FlashPlayer = require('../tasks/flashplayer');
const version = require('./version'); const version = require('./version');
const prepare = require('./prepare'); const prepare = require('./prepare');
const generate = prepare.generate;
const debug = require('../tasks/debug'); const debug = require('../tasks/debug');
const webserver = require('gulp-webserver'); const webserver = require('gulp-webserver');
const run = require('gulp-run'); const run = require('gulp-run');
@@ -15,12 +16,6 @@ const tail = require('../tasks/tail');
const deb = require('gulp-debian'); const deb = require('gulp-debian');
const generate = () => function generate() {
return new Haxe().haxelib([
'run', 'protohx', 'generate', 'protohx.json'
]);
};
const build = (platform, values) => function build() { const build = (platform, values) => function build() {
const argv = yargs.argv; const argv = yargs.argv;
return gulp.src('.') return gulp.src('.')
@@ -131,10 +126,10 @@ const testLinux = gulp.series(
exports['client:flash:test'] = gulp.series(prepare(Haxe.ID, FlashPlayer.ID), testFlash); exports['client:flash:test'] = gulp.series(prepare(Haxe.ID, FlashPlayer.ID), generate(), testFlash);
exports['client:html5:test'] = gulp.series(prepare(Haxe.ID), testHtml5()); exports['client:html5:test'] = gulp.series(prepare(Haxe.ID), generate(), testHtml5());
exports['client:html5-dom:test'] = gulp.series(prepare(Haxe.ID), testHtml5(true)); exports['client:html5-dom:test'] = gulp.series(prepare(Haxe.ID), generate(), testHtml5(true));
exports['client:linux:test'] = gulp.series(prepare(Haxe.ID), testLinux); exports['client:linux:test'] = gulp.series(prepare(Haxe.ID), generate(), testLinux);
exports['client:test'] = exports['client:flash:test']; exports['client:test'] = exports['client:flash:test'];

View File

@@ -23,10 +23,16 @@ const prepare = (...targets) => function prepare() {
return Promise.all(tasks); return Promise.all(tasks);
}; };
const update = () => { const update = () => {
return new Haxe().upgrade(); return new Haxe().upgrade();
}; };
const generate = () => function generate() {
return new Haxe().haxelib([
'run', 'protohx', 'generate', 'protohx.json'
]);
};
module.exports = prepare; module.exports = prepare;
module.exports.update = update; module.exports.update = update;
module.exports.generate = generate;

View File

@@ -5,15 +5,10 @@ const FlashPlayer = require('../tasks/flashplayer');
const Neko = require('../tasks/neko'); const Neko = require('../tasks/neko');
const version = require('./version'); const version = require('./version');
const prepare = require('./prepare'); const prepare = require('./prepare');
const generate = prepare.generate;
const debug = require('../tasks/debug'); const debug = require('../tasks/debug');
const generate = () => function generate() {
return new Haxe().haxelib([
'run', 'protohx', 'generate', 'protohx.json'
]);
};
const build = () => function build() { const build = () => function build() {
const argv = yargs.argv; const argv = yargs.argv;
return gulp.src('.') return gulp.src('.')
@@ -25,7 +20,6 @@ const build = () => function build() {
'orm', 'orm',
'haxework:git', 'haxework:git',
'haxe-crypto', 'haxe-crypto',
'hxsignal'
], ],
cp: [ cp: [
'src/common/haxe', 'src/common/haxe',

View File

@@ -39,7 +39,6 @@
"haxework": "git@bitbucket.org:shmyga/haxework.git", "haxework": "git@bitbucket.org:shmyga/haxework.git",
"orm": "2.1.0", "orm": "2.1.0",
"yield": "1.1.2", "yield": "1.1.2",
"haxe-crypto": "0.0.7", "haxe-crypto": "0.0.7"
"hxsignal": "0.9.2"
} }
} }

View File

@@ -13,7 +13,6 @@
<haxelib name="haxework" version="git"/> <haxelib name="haxework" version="git"/>
<haxelib name="yaml" version="1.3.0"/> <haxelib name="yaml" version="1.3.0"/>
<haxelib name="yield" version="1.1.2"/> <haxelib name="yield" version="1.1.2"/>
<haxelib name="hxsignal" version="0.9.2"/>
<window fps="30"/> <window fps="30"/>
<window width="1024" height="768" unless="html5"/> <window width="1024" height="768" unless="html5"/>
<haxeflag name="-D" value="swf-gpu"/> <haxeflag name="-D" value="swf-gpu"/>

View File

@@ -1,8 +1,8 @@
package ru.m.tankz.network; package ru.m.tankz.network;
import haxework.provider.Provider; import haxework.provider.Provider;
import hxsignal.impl.Signal1;
import ru.m.connect.IConnection; import ru.m.connect.IConnection;
import ru.m.signal.Signal;
import ru.m.tankz.proto.pack.LoginRequest; import ru.m.tankz.proto.pack.LoginRequest;
import ru.m.tankz.proto.pack.Request; import ru.m.tankz.proto.pack.Request;
import ru.m.tankz.proto.pack.Response; import ru.m.tankz.proto.pack.Response;
@@ -14,7 +14,7 @@ typedef ClientConnection = IConnection<Request, Response>;
class NetworkManager { class NetworkManager {
public var state(default, null):String; public var state(default, null):String;
public var stateSignal:Signal1<String>; public var stateSignal:Signal<String>;
public var user(default, null):User; public var user(default, null):User;
private var connection(get, never):ClientConnection; private var connection(get, never):ClientConnection;
@@ -29,10 +29,10 @@ class NetworkManager {
} }
public function new() { public function new() {
stateSignal = new Signal1<String>(); stateSignal = new Signal<String>();
updateState('offline'); updateState('offline');
connection.handler.connect(onConnectionEvent); connection.handler.connect(onConnectionEvent);
connection.packetHandler.connect(onResponse); connection.receiveHandler.connect(onResponse);
user = storage.read(); user = storage.read();
if (user == null) { if (user == null) {
user = {name: 'User', uuid: null}; user = {name: 'User', uuid: null};
@@ -58,7 +58,12 @@ class NetworkManager {
} }
private function onConnectionEvent(event:ConnectionEvent):Void { private function onConnectionEvent(event:ConnectionEvent):Void {
updateState(Std.string(event)); L.d('Network', '${event}');
updateState(switch (event) {
case ConnectionEvent.CONNECTED: 'connected';
case ConnectionEvent.DISCONNECTED: 'offline';
case ConnectionEvent.ERROR(error): 'error';
});
} }
private function onResponse(packet:Response):Void { private function onResponse(packet:Response):Void {

View File

@@ -1,16 +1,17 @@
package ru.m.connect; package ru.m.connect;
import promhx.Deferred;
import hxsignal.impl.Signal1;
import haxe.io.Bytes; import haxe.io.Bytes;
import promhx.Deferred;
import promhx.Promise; import promhx.Promise;
import protohx.Message; import protohx.Message;
import ru.m.connect.IConnection; import ru.m.connect.IConnection;
import ru.m.signal.Signal;
class BaseConnection<O:Message, I:Message> implements IConnection<O, I> { class BaseConnection<O:Message, I:Message> implements IConnection<O, I> {
public var handler(default, default):Signal1<ConnectionEvent>; public var handler(default, null):Signal<ConnectionEvent>;
public var packetHandler(default, default):Signal1<I>; public var sendHandler(default, null):Signal<O>;
public var receiveHandler(default, null):Signal<I>;
public var connected(default, null):Bool; public var connected(default, null):Bool;
public var queue(default, null):PacketQueue<I>; public var queue(default, null):PacketQueue<I>;
@@ -18,8 +19,9 @@ class BaseConnection<O:Message, I:Message> implements IConnection<O, I> {
public function new(i:Class<I>) { public function new(i:Class<I>) {
queue = new PacketQueue<I>(i); queue = new PacketQueue<I>(i);
handler = new Signal1<ConnectionEvent>(); handler = new Signal<ConnectionEvent>();
packetHandler = new Signal1<I>(); sendHandler = new Signal<O>();
receiveHandler = new Signal<I>();
connectDeferred = new Deferred(); connectDeferred = new Deferred();
} }
@@ -32,14 +34,21 @@ class BaseConnection<O:Message, I:Message> implements IConnection<O, I> {
} }
public function pushData(bytes:Bytes):Void { public function pushData(bytes:Bytes):Void {
#if proto_debug L.d('Proto', 'pushData: ${bytes.length}'); #end
queue.addBytes(bytes); queue.addBytes(bytes);
while (queue.hasMsg()) { while (queue.hasMsg()) {
var packet:I = queue.popMsg(); var packet:I = queue.popMsg();
packetHandler.emit(packet); receive(packet);
} }
} }
public function send(packet:O):Void { public function send(packet:O):Void {
#if proto_debug L.d("Send", Type.getClassName(Type.getClass(packet)).split(".").pop()); #end #if proto_debug L.d('Proto', 'send: ${packet}'); #end
sendHandler.emit(packet);
}
public function receive(packet:I):Void {
#if proto_debug L.d('Proto', 'receive: ${packet}'); #end
receiveHandler.emit(packet);
} }
} }

View File

@@ -1,9 +1,9 @@
package ru.m.connect; package ru.m.connect;
import haxe.io.Bytes; import haxe.io.Bytes;
import hxsignal.impl.Signal1;
import promhx.Promise; import promhx.Promise;
import protohx.Message; import protohx.Message;
import ru.m.signal.Signal;
enum ConnectionEvent { enum ConnectionEvent {
@@ -14,8 +14,9 @@ enum ConnectionEvent {
interface IConnection<O:Message, I:Message> { interface IConnection<O:Message, I:Message> {
public var connected(default, null):Bool; public var connected(default, null):Bool;
public var handler(default, null):Signal1<ConnectionEvent>; public var handler(default, null):Signal<ConnectionEvent>;
public var packetHandler(default, null):Signal1<I>; public var sendHandler(default, null):Signal<O>;
public var receiveHandler(default, null):Signal<I>;
public function connect():Promise<IConnection<O, I>>; public function connect():Promise<IConnection<O, I>>;
public function disconnect():Void; public function disconnect():Void;

View File

@@ -50,7 +50,7 @@ class PacketQueue<P:Message> {
bi.bigEndian = false; bi.bigEndian = false;
while (available > 0) { while (available > 0) {
var packetSize = bi.readUInt16(); var packetSize = bi.readUInt16();
available -= 1; available -= 2;
if (packetSize <= available) { if (packetSize <= available) {
var msgBytes = bi.read(packetSize); var msgBytes = bi.read(packetSize);
var packet:P = Type.createInstance(packetClass, []); var packet:P = Type.createInstance(packetClass, []);

View File

@@ -32,6 +32,7 @@ class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
socket.addEventListener(Event.CONNECT, onConnect); socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
socket.endian = Endian.LITTLE_ENDIAN; socket.endian = Endian.LITTLE_ENDIAN;
sendHandler.connect(_send);
} }
override public function connect():Promise<IConnection<O, I>> { override public function connect():Promise<IConnection<O, I>> {
@@ -77,8 +78,7 @@ class FlashConnection<O:Message, I:Message> extends BaseConnection<O, I> {
} }
} }
override public function send(packet:O):Void { private function _send(packet:O):Void {
super.send(packet);
var out = new BytesOutput(); var out = new BytesOutput();
packet.writeTo(out); packet.writeTo(out);
var bytes = out.getBytes(); var bytes = out.getBytes();

View File

@@ -12,13 +12,13 @@ class NekoConnection<O:Message, I:Message> extends BaseConnection<O, I> {
public function new(socket:Socket, i:Class<I>) { public function new(socket:Socket, i:Class<I>) {
super(i); super(i);
this.socket = socket; this.socket = socket;
socket.setFastSend(true); //socket.setFastSend(true);
socket.output.bigEndian = false; //socket.output.bigEndian = false;
socket.input.bigEndian = false; //socket.input.bigEndian = false;
sendHandler.connect(_send);
} }
override public function send(packet:O):Void { private function _send(packet:O):Void {
super.send(packet);
try { try {
var b = new BytesOutput(); var b = new BytesOutput();
packet.writeTo(b); packet.writeTo(b);
@@ -26,9 +26,8 @@ class NekoConnection<O:Message, I:Message> extends BaseConnection<O, I> {
socket.output.writeUInt16(bytes.length); socket.output.writeUInt16(bytes.length);
socket.output.write(bytes); socket.output.write(bytes);
socket.output.flush(); socket.output.flush();
} catch (e:Dynamic) { } catch (error:Dynamic) {
trace("Error send packet: " + Type.getClassName(Type.getClass(packet))); L.e('Proto', 'Error send packet: ${packet}', error);
trace(e);
} }
} }
} }

View File

@@ -16,13 +16,12 @@ class NekoWebConnection<O:Message, I:Message> extends NekoConnection<O, I> {
opened = false; opened = false;
} }
override public function send(packet:O):Void { override private function _send(packet:O):Void {
#if proto_debug L.d("Send", Type.getClassName(Type.getClass(packet)).split(".").pop()); #end
try { try {
var data = WebSocketTools.packet2string(packet); var data = WebSocketTools.packet2string(packet);
writeData(data, socket); writeData(data, socket);
} catch (e:Dynamic) { } catch (error:Dynamic) {
trace(e); L.e('Proto', 'Error send packet: ${packet}', error);
} }
} }
@@ -39,7 +38,7 @@ class NekoWebConnection<O:Message, I:Message> extends NekoConnection<O, I> {
var data = parseData(bytes); var data = parseData(bytes);
if (data != null) { if (data != null) {
var packet:I = WebSocketTools.string2packet(data, queue.packetClass); var packet:I = WebSocketTools.string2packet(data, queue.packetClass);
packetHandler.emit(packet); receive(packet);
} }
} }
} }

View File

@@ -0,0 +1,27 @@
package ru.m.signal;
typedef Receiver<T> = T -> Void;
class Signal<T> {
private var receivers:Array<Receiver<T>>;
public function new() {
receivers = [];
}
public function connect(receiver:Receiver<T>):Void {
receivers.push(receiver);
}
public function disconnect(receiver:Receiver<T>):Void {
receivers.remove(receiver);
}
public function emit(value:T):Void {
for (receiver in receivers) {
receiver(value);
}
}
}

View File

@@ -1,11 +1,11 @@
package ru.m.tankz.server; package ru.m.tankz.server;
import ru.m.connect.IConnection.ConnectionEvent;
import haxework.log.TraceLogger;
import ru.m.tankz.server.session.Session;
import haxe.io.Bytes; import haxe.io.Bytes;
import sys.net.Socket; import haxework.log.TraceLogger;
import neko.net.ThreadServer; import neko.net.ThreadServer;
import ru.m.connect.IConnection.ConnectionEvent;
import ru.m.tankz.server.session.Session;
import sys.net.Socket;
#if debug import haxework.log.SocketLogger; #end #if debug import haxework.log.SocketLogger; #end
@@ -33,7 +33,11 @@ class Server extends ThreadServer<Session, Bytes> {
} }
override public function clientMessage(session:Session, bytes:Bytes) { override public function clientMessage(session:Session, bytes:Bytes) {
session.pushData(bytes); try {
session.pushData(bytes);
} catch (error:Dynamic) {
L.d(TAG, "_", error);
}
} }
public static function main() { public static function main() {

View File

@@ -46,7 +46,7 @@ class Session {
connection = new NekoConnection<Response, Request>(socket, Request); connection = new NekoConnection<Response, Request>(socket, Request);
} }
connection.handler.connect(onConnectionEvent); connection.handler.connect(onConnectionEvent);
connection.packetHandler.connect(onRequest); connection.receiveHandler.connect(onRequest);
connection.pushData(bytes); connection.pushData(bytes);
} }
} }
@@ -109,8 +109,4 @@ class Session {
public function onGameActionRequest(packet:GameActionRequest):Void { public function onGameActionRequest(packet:GameActionRequest):Void {
GameManager.byPersonId.get(person.id).action(person, packet); GameManager.byPersonId.get(person.id).action(person, packet);
}*/ }*/
public function onPacket(packet:Message):Void {
trace("Unknown packet: " + Type.getClassName(Type.getClass(packet)).split(".").pop());
}
} }