@@ -8,7 +8,7 @@ import { NCSServerConnection } from './connection/NCSServerConnection'
8
8
import { MosModel } from '@mos-connection/helper'
9
9
import { EventEmitter } from 'eventemitter3'
10
10
import * as iconv from 'iconv-lite'
11
- import { MosMessageParser } from './connection/mosMessageParser'
11
+ import { ParsedMosMessage , MosMessageParser } from './connection/mosMessageParser'
12
12
import { IConnectionConfig , IMosConnection , IMOSDeviceConnectionOptions } from './api'
13
13
import { PROFILE_VALIDNESS_CHECK_WAIT_TIME } from './lib'
14
14
@@ -407,7 +407,7 @@ export class MosConnection extends EventEmitter<MosConnectionEvents> implements
407
407
`${ socketID } , ${ client . socket . remoteAddress } , ${ client . portDescription } `
408
408
)
409
409
// messageParser.debug = this._debug
410
- messageParser . on ( 'message' , ( message : MosModel . AnyXML , messageString : string ) => {
410
+ messageParser . on ( 'message' , ( message : ParsedMosMessage , messageString : string ) => {
411
411
// Handle incoming data
412
412
handleMessage ( message , messageString ) . catch ( ( err ) => this . emit ( 'error' , err ) )
413
413
} )
@@ -435,15 +435,15 @@ export class MosConnection extends EventEmitter<MosConnectionEvents> implements
435
435
this . emit ( 'error' , err instanceof Error ? err : new Error ( `${ err } ` ) )
436
436
}
437
437
} )
438
- const handleMessage = async ( parsed : MosModel . AnyXML , _messageString : string ) => {
438
+ const handleMessage = async ( parsed : ParsedMosMessage , _messageString : string ) => {
439
439
const remoteAddressContent = client . socket . remoteAddress
440
440
? client . socket . remoteAddress . split ( ':' )
441
441
: undefined
442
442
const remoteAddress = remoteAddressContent ? remoteAddressContent [ remoteAddressContent . length - 1 ] : ''
443
443
444
444
const ncsID = parsed . mos . ncsID
445
445
const mosID = parsed . mos . mosID
446
- const mosMessageId : number = parsed . mos . messageID
446
+ const mosMessageId = parsed . mos . messageID ? parseInt ( parsed . mos . messageID , 10 ) : undefined
447
447
448
448
let mosDevice = this . _mosDevices [ ncsID + '_' + mosID ] || this . _mosDevices [ mosID + '_' + ncsID ]
449
449
@@ -513,24 +513,36 @@ export class MosConnection extends EventEmitter<MosConnectionEvents> implements
513
513
}
514
514
if ( mosDevice ) {
515
515
mosDevice
516
- . routeData ( parsed , client . portDescription )
516
+ . routeData ( parsed . mos , client . portDescription )
517
+ . catch ( ( err ) => {
518
+ if ( MosModel . ParseError . isParseError ( err ) ) {
519
+ // Try to add the main mos message key to the error:
520
+ const breadcrumbs = Object . keys ( parsed . mos ) . filter (
521
+ ( key ) =>
522
+ ! [ 'messageID' , 'mosID' , 'ncsID' ] . includes ( key ) &&
523
+ typeof parsed . mos [ key ] === 'object'
524
+ )
525
+ throw MosModel . ParseError . handleCaughtError ( breadcrumbs . join ( '/' ) , err )
526
+ } else throw err
527
+ } )
517
528
. then ( ( message : MosModel . MosMessage ) => {
518
529
sendReply ( message )
519
530
} )
520
- . catch ( ( err : Error | MosModel . MosMessage ) => {
531
+ . catch ( ( err : Error | MosModel . MosMessage | MosModel . ParseError ) => {
521
532
// Something went wrong
522
533
if ( err instanceof MosModel . MosMessage ) {
523
534
sendReply ( err )
524
535
} else {
525
- // Unknown / internal error
536
+ // Internal/parsing error
537
+
526
538
// Log error:
527
539
this . emit ( 'warning' , `Error when handling incoming data: ${ err } ${ err ?. stack } ` )
528
540
// reply with NACK:
529
541
// TODO: implement ACK
530
542
// https://mosprotocol.com/wp-content/MOS-Protocol-Documents/MOS_Protocol_Version_2.8.5_Final.htm#mosAck
531
543
const msg = new MosModel . MOSAck (
532
544
{
533
- ID : this . mosTypes . mosString128 . create ( 0 ) ,
545
+ ID : this . mosTypes . mosString128 . create ( '0' ) ,
534
546
Revision : 0 ,
535
547
Description : this . mosTypes . mosString128 . create (
536
548
`MosDevice "${ ncsID + '_' + mosID } " not found`
@@ -548,7 +560,7 @@ export class MosConnection extends EventEmitter<MosConnectionEvents> implements
548
560
// We can't handle the message, reply with a NACK:
549
561
const msg = new MosModel . MOSAck (
550
562
{
551
- ID : this . mosTypes . mosString128 . create ( 0 ) ,
563
+ ID : this . mosTypes . mosString128 . create ( '0' ) ,
552
564
Revision : 0 ,
553
565
Description : this . mosTypes . mosString128 . create ( 'MosDevice not found' ) ,
554
566
Status : IMOSAckStatus . NACK ,
0 commit comments