[common] udpate proto
This commit is contained in:
@@ -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'];
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"/>
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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, []);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
27
src/common/haxe/ru/m/signal/Signal.hx
Normal file
27
src/common/haxe/ru/m/signal/Signal.hx
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user