@@ -6,18 +6,20 @@ import {ParserState} from './Data/ParserState';
6
6
import { ConsoleCmdHandler } from './Parser/Message/ConsoleCmd' ;
7
7
import { DataTableHandler } from './Parser/Message/DataTable' ;
8
8
import { PacketMessageHandler } from './Parser/Message/Packet' ;
9
+ import { StopHandler } from './Parser/Message/Stop' ;
9
10
import { StringTableHandler } from './Parser/Message/StringTable' ;
10
11
import { SyncTickHandler } from './Parser/Message/SyncTick' ;
11
12
import { UserCmdHandler } from './Parser/Message/UserCmd' ;
12
13
13
- const messageHandlers : Map < MessageType , MessageHandler < Message > > = new Map < MessageType , MessageHandler < Message > > ( [
14
+ export const messageHandlers : Map < MessageType , MessageHandler < Message > > = new Map < MessageType , MessageHandler < Message > > ( [
14
15
[ MessageType . Sigon , PacketMessageHandler ] ,
15
16
[ MessageType . Packet , PacketMessageHandler ] ,
16
17
[ MessageType . ConsoleCmd , ConsoleCmdHandler ] ,
17
18
[ MessageType . UserCmd , UserCmdHandler ] ,
18
19
[ MessageType . DataTables , DataTableHandler ] ,
19
20
[ MessageType . StringTables , StringTableHandler ] ,
20
- [ MessageType . SyncTick , SyncTickHandler ]
21
+ [ MessageType . SyncTick , SyncTickHandler ] ,
22
+ [ MessageType . Stop , StopHandler ]
21
23
] ) ;
22
24
23
25
export class Parser {
@@ -50,22 +52,13 @@ export class Parser {
50
52
protected * getMessages ( ) : Iterable < Message > {
51
53
while ( true ) {
52
54
const message = this . readMessage ( this . stream , this . parserState ) ;
53
- if ( message ) {
54
- yield message ;
55
- } else {
55
+ yield message ;
56
+ if ( message . type === MessageType . Stop ) {
56
57
return ;
57
58
}
58
59
}
59
60
}
60
61
61
- protected parseMessage ( data : BitStream , type : MessageType , state : ParserState ) : Message {
62
- const handler = messageHandlers . get ( type ) ;
63
- if ( ! handler ) {
64
- throw new Error ( `No handler for message of type ${ MessageType [ type ] } ` ) ;
65
- }
66
- return handler . parseMessage ( data , state ) ;
67
- }
68
-
69
62
protected parseHeader ( stream ) : Header {
70
63
return {
71
64
type : stream . readASCIIString ( 8 ) ,
@@ -85,22 +78,28 @@ export class Parser {
85
78
protected * handleMessage ( message : Message ) : Iterable < Packet > {
86
79
this . parserState . handleMessage ( message ) ;
87
80
if ( message . type === MessageType . Packet ) {
88
- for ( const packet of ( message as PacketMessage ) . packets ) {
81
+ for ( const packet of message . packets ) {
89
82
this . parserState . handlePacket ( packet ) ;
90
83
yield packet ;
91
84
}
92
85
}
93
86
}
94
87
95
- protected readMessage ( stream : BitStream , state : ParserState ) : Message | false {
88
+ protected readMessage ( stream : BitStream , state : ParserState ) : Message {
96
89
if ( stream . bitsLeft < 8 ) {
97
- return false ;
90
+ throw new Error ( 'Stream ended without stop packet' ) ;
98
91
}
99
92
const type : MessageType = stream . readUint8 ( ) ;
100
- if ( type === MessageType . Stop ) {
101
- return false ;
93
+ if ( type === 0 ) {
94
+ return {
95
+ type : MessageType . Stop ,
96
+ rawData : stream . readBitStream ( 0 )
97
+ } ;
102
98
}
103
-
104
- return this . parseMessage ( stream , type , state ) ;
99
+ const handler = messageHandlers . get ( type ) ;
100
+ if ( ! handler ) {
101
+ throw new Error ( `No handler for message of type ${ MessageType [ type ] } (${ type } )` ) ;
102
+ }
103
+ return handler . parseMessage ( this . stream , state ) ;
105
104
}
106
105
}
0 commit comments