@@ -8,15 +8,14 @@ class EventParser {
88 static let idLabel : Substring = " id "
99 static let eventLabel : Substring = " event "
1010 static let retryLabel : Substring = " retry "
11- static let defaultEventType = " message "
1211 }
1312
1413 private let handler : EventHandler
1514 private let connectionHandler : ConnectionHandler
1615
1716 private var data : String = " "
1817 private var lastEventId : String ?
19- private var eventType : String = Constants . defaultEventType
18+ private var eventType : String = " "
2019
2120 init ( handler: EventHandler , connectionHandler: ConnectionHandler ) {
2221 self . handler = handler
@@ -36,6 +35,11 @@ class EventParser {
3635 }
3736 }
3837
38+ func reset( ) {
39+ data = " "
40+ eventType = " "
41+ }
42+
3943 private func dropLeadingSpace( str: Substring ) -> Substring {
4044 if str. first == " " {
4145 return str [ str. index ( after: str. startIndex) ... ]
@@ -46,12 +50,14 @@ class EventParser {
4650 private func processField( field: Substring , value: Substring ) {
4751 switch field {
4852 case Constants . dataLabel:
49- if !data. isEmpty {
50- data. append ( contentsOf: " \n " )
51- }
5253 data. append ( contentsOf: value)
54+ data. append ( contentsOf: " \n " )
5355 case Constants . idLabel:
54- lastEventId = String ( value)
56+ // See https://github.com/whatwg/html/issues/689 for reasoning on not setting lastEventId if the value
57+ // contains a null code point.
58+ if !value. contains ( " \u{0000} " ) {
59+ lastEventId = String ( value)
60+ }
5561 case Constants . eventLabel:
5662 eventType = String ( value)
5763 case Constants . retryLabel:
@@ -64,15 +70,20 @@ class EventParser {
6470 }
6571
6672 private func dispatchEvent( ) {
67- guard !data. isEmpty
68- else { return }
69- let messageEvent = MessageEvent ( data: data, lastEventId: lastEventId)
7073 if let lastEventId = lastEventId {
7174 connectionHandler. setLastEventId ( lastEventId)
7275 }
73- handler. onMessage ( eventType: eventType, messageEvent: messageEvent)
76+ guard !data. isEmpty
77+ else {
78+ eventType = " "
79+ return
80+ }
81+ // remove the last LF
82+ _ = data. popLast ( )
83+ let messageEvent = MessageEvent ( data: data, lastEventId: lastEventId)
84+ handler. onMessage ( eventType: eventType. isEmpty ? " message " : eventType, messageEvent: messageEvent)
7485 data = " "
75- eventType = Constants . defaultEventType
86+ eventType = " "
7687 }
7788}
7889
0 commit comments