Improvements & Feature:

- Add API ACKFETCH to update fetch history
- Improve anti-exception performance
This commit is contained in:
Linloir 2022-10-22 21:26:38 +08:00
parent 3e575110a9
commit 23a0633623
No known key found for this signature in database
GPG Key ID: 58EEB209A0F2C366
5 changed files with 154 additions and 43 deletions

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-06 15:44:16 * @Date : 2022-10-06 15:44:16
* @LastEditTime : 2022-10-22 20:35:50 * @LastEditTime : 2022-10-22 21:25:00
* @Description : * @Description :
*/ */
@ -38,7 +38,7 @@ void main(List<String> arguments) async {
onError: (_) { onError: (_) {
print('[L] [EXCEPTION]-----------------------'); print('[L] [EXCEPTION]-----------------------');
print('[L] TCP Controller ran into exception'); print('[L] TCP Controller ran into exception');
print('[L] Remote: ${controller.socket.remoteAddress}:${controller.socket.remotePort}'); print('[L] socket: ${controller.socket.address}:${controller.socket.port}');
var token = controllerMap[controller]; var token = controllerMap[controller];
controllerMap.remove(controller); controllerMap.remove(controller);
tokenMap[token]?.remove(controller); tokenMap[token]?.remove(controller);
@ -81,17 +81,38 @@ void main(List<String> arguments) async {
switch(request.requestType) { switch(request.requestType) {
case RequestType.checkState: { case RequestType.checkState: {
var response = await onCheckState(request, socket); var response = await onCheckState(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.register: { case RequestType.register: {
var response = await onRegister(request, socket); var response = await onRegister(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.login: { case RequestType.login: {
var response = await onLogin(request, socket); var response = await onLogin(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.logout: { case RequestType.logout: {
@ -101,17 +122,38 @@ void main(List<String> arguments) async {
} }
case RequestType.profile: { case RequestType.profile: {
var response = await onFetchProfile(request, socket); var response = await onFetchProfile(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.modifyProfile: { case RequestType.modifyProfile: {
var response = await onModifyProfile(request, socket); var response = await onModifyProfile(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.modifyPassword: { case RequestType.modifyPassword: {
var response = await onModifyPassword(request, socket); var response = await onModifyPassword(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.sendMessage: { case RequestType.sendMessage: {
@ -183,32 +225,74 @@ void main(List<String> arguments) async {
// ); // );
} }
var response = await onSendMessage(request, socket); var response = await onSendMessage(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.fetchMessage: { case RequestType.fetchMessage: {
var response = await onFetchMessage(request, socket); var response = await onFetchMessage(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.findFile: { case RequestType.findFile: {
var response = await onFindFile(request, socket); var response = await onFindFile(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.fetchFile: { case RequestType.fetchFile: {
var response = await onFetchFile(request, socket); var response = await onFetchFile(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.searchUser: { case RequestType.searchUser: {
var response = await onSearchUser(request, socket); var response = await onSearchUser(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
case RequestType.addContact: { case RequestType.addContact: {
var response = await onAddContact(request, socket); var response = await onAddContact(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
var contactResponse = await onFetchContact( var contactResponse = await onFetchContact(
TCPRequest.fromData( TCPRequest.fromData(
type: RequestType.fetchContact, type: RequestType.fetchContact,
@ -222,12 +306,30 @@ void main(List<String> arguments) async {
} }
case RequestType.fetchContact: { case RequestType.fetchContact: {
var response = await onFetchContact(request, socket); var response = await onFetchContact(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break;
}
case RequestType.ackFetch: {
onAckFetch(request, socket);
break; break;
} }
case RequestType.unknown: { case RequestType.unknown: {
var response = await onUnknownRequest(request, socket); var response = await onUnknownRequest(request, socket);
controller.outStream.add(response); try {
controller.outStream.add(response);
} catch (e) {
print('[E] [EXCEPTION]-----------------------');
var token = controllerMap[controller];
controllerMap.remove(controller);
tokenMap[token]?.remove(controller);
}
break; break;
} }
default: { default: {

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-06 16:15:01 * @Date : 2022-10-06 16:15:01
* @LastEditTime : 2022-10-20 20:58:57 * @LastEditTime : 2022-10-22 21:08:27
* @Description : * @Description :
*/ */
@ -403,19 +403,19 @@ class DataBaseHelper {
}).toList(); }).toList();
//Set new fetch history //Set new fetch history
if(unfetchMsgQueryResult.isNotEmpty) { // if(unfetchMsgQueryResult.isNotEmpty) {
await _database.update( // await _database.update(
'histories', // 'histories',
{ // {
'lastfetch': unfetchMsgQueryResult[0]['timestamp'] // 'lastfetch': unfetchMsgQueryResult[0]['timestamp']
}, // },
where: 'tokenid = ? and userid = ?', // where: 'tokenid = ? and userid = ?',
whereArgs: [ // whereArgs: [
tokenID, // tokenID,
userID // userID
] // ]
); // );
} // }
//return result //return result
return unfetchMessages; return unfetchMessages;

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-08 20:52:48 * @Date : 2022-10-08 20:52:48
* @LastEditTime : 2022-10-15 00:40:24 * @LastEditTime : 2022-10-22 20:56:15
* @Description : * @Description :
*/ */
@ -276,6 +276,14 @@ Future<TCPResponse> onFetchContact(TCPRequest request, Socket socket) async {
} }
} }
void onAckFetch(TCPRequest request, Socket socket) async {
//Update Fetch Histories
await DataBaseHelper().setFetchHistoryFor(
tokenID: request.tokenID,
newTimeStamp: request.body['timestamp'] as int,
);
}
Future<TCPResponse> onUnknownRequest(TCPRequest request, Socket socket) async { Future<TCPResponse> onUnknownRequest(TCPRequest request, Socket socket) async {
return TCPResponse( return TCPResponse(
type: ResponseType.fromRequestType(request.requestType), type: ResponseType.fromRequestType(request.requestType),

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-08 15:10:04 * @Date : 2022-10-08 15:10:04
* @LastEditTime : 2022-10-22 20:30:36 * @LastEditTime : 2022-10-22 21:20:57
* @Description : * @Description :
*/ */
@ -58,20 +58,21 @@ class TCPController {
print('[L] Remote: ${socket.remoteAddress}:${socket.remotePort}'); print('[L] Remote: ${socket.remoteAddress}:${socket.remotePort}');
print('[L] Local: ${socket.address}:${socket.port}'); print('[L] Local: ${socket.address}:${socket.port}');
Future(() async { Future(() async {
await for(var request in socket) { try {
_pullRequest(request); await for(var request in socket) {
await Future.delayed(const Duration(microseconds: 0)); _pullRequest(request);
await Future.delayed(const Duration(microseconds: 0));
}
} catch (e) {
_requestStreamController.addError(e);
_responseStreamController.addError(e);
} }
}).then((_) { }).then((_) {
print('[L] [CLOSED ]-----------------------'); print('[L] [CLOSED ]-----------------------');
print('[L] Connection closed: ${socket.address}:${socket.port}<-${socket.remoteAddress}:${socket.remotePort}'); print('[L] Connection closed: ${socket.address}:${socket.port}');
_requestStreamController.close(); _requestStreamController.close();
_responseStreamController.close(); _responseStreamController.close();
}).onError((error, stackTrace) { });
print(error);
_requestStreamController.addError(error ?? Error());
_responseStreamController.addError(error ?? Error());
},);
// socket.listen( // socket.listen(
// _pullRequest, // _pullRequest,
// onError: (e) { // onError: (e) {

View File

@ -1,7 +1,7 @@
/* /*
* @Author : Linloir * @Author : Linloir
* @Date : 2022-10-08 15:14:26 * @Date : 2022-10-08 15:14:26
* @LastEditTime : 2022-10-22 20:21:10 * @LastEditTime : 2022-10-22 20:54:40
* @Description : * @Description :
*/ */
import 'dart:convert'; import 'dart:convert';
@ -16,7 +16,7 @@ enum RequestType {
modifyPassword('MODIFYPASSWD'), //Modify user password modifyPassword('MODIFYPASSWD'), //Modify user password
modifyProfile ('MODIFYPROFILE'), //Modify user profile modifyProfile ('MODIFYPROFILE'), //Modify user profile
sendMessage ('SENDMSG'), //Send message sendMessage ('SENDMSG'), //Send message
ackMessage ('ACKMSG'), //Ack forwarded messages, update fetch history ackFetch ('ACKFETCH'), //Ack fetched messages, update fetch history
fetchMessage ('FETCHMSG'), //Fetch message fetchMessage ('FETCHMSG'), //Fetch message
findFile ('FINDFILE'), //Find file by md5 before transmitting the file findFile ('FINDFILE'), //Find file by md5 before transmitting the file
fetchFile ('FETCHFILE'), //Fetch file and file md5 by message md5 fetchFile ('FETCHFILE'), //Fetch file and file md5 by message md5