@@ -19,7 +19,8 @@ module.exports = function(RED) {
1919 OLD_SERVICE_IDENTIFIER = 'conversation' ,
2020 SERVICE_VERSION = '2018-11-08' ,
2121 AssistantV2 = require ( 'ibm-watson/assistant/v2' ) ,
22- { IamAuthenticator } = require ( 'ibm-watson/auth' ) ;
22+ { IamAuthenticator } = require ( 'ibm-watson/auth' ) ,
23+ INVALID_SESSION = 'Invalid Session' ;
2324
2425 var pkg = require ( '../../package.json' ) ,
2526 serviceutils = require ( '../../utilities/service-utils' ) ,
@@ -313,7 +314,16 @@ module.exports = function(RED) {
313314 } ) ;
314315 }
315316
316- function messageTurn ( params ) {
317+ function checkForInvalidSession ( err ) {
318+ if ( err &&
319+ err . code && ( 404 === err . code ) &&
320+ err . message && ( INVALID_SESSION === err . message ) ) {
321+ return true ;
322+ }
323+ return false ;
324+ }
325+
326+ function messageTurn ( params , repeatedTurn ) {
317327 return new Promise ( function resolver ( resolve , reject ) {
318328 node . service . message ( params )
319329 . then ( ( response ) => {
@@ -324,8 +334,37 @@ module.exports = function(RED) {
324334 }
325335 } )
326336 . catch ( ( err ) => {
327- reject ( err ) ;
328- } )
337+ if ( ( ! repeatedTurn ) && checkForInvalidSession ( err ) ) {
338+ resolve ( { INVALID_SESSION : true } ) ;
339+ } else {
340+ reject ( err ) ;
341+ }
342+ } ) ;
343+ } ) ;
344+ }
345+
346+ function invalidSessionTurnCheck ( body , msg , params ) {
347+ return new Promise ( function resolver ( resolve , reject ) {
348+ if ( body && body . INVALID_SESSION ) {
349+ // Message Turn has returned an invalid session
350+ // This time round force a new session, but ensure
351+ // that the messageTurn sends a consequental invalid session
352+ // as an error.
353+ node . status ( { fill : 'blue' , shape : 'dot' , text : 'Resetting Session ...' } ) ;
354+ params . sessionId = null ;
355+ checkSession ( msg , params )
356+ . then ( function ( ) {
357+ return messageTurn ( params , true ) ;
358+ } )
359+ . then ( ( body ) => {
360+ return resolve ( body ) ;
361+ } )
362+ . catch ( ( err ) => {
363+ reject ( err ) ;
364+ } )
365+ } else {
366+ resolve ( body ) ;
367+ }
329368 } ) ;
330369 }
331370
@@ -357,7 +396,10 @@ module.exports = function(RED) {
357396 } )
358397 . then ( function ( ) {
359398 node . status ( { fill : 'blue' , shape : 'dot' , text : 'Calling Assistant service ...' } ) ;
360- return messageTurn ( params ) ;
399+ return messageTurn ( params , false ) ;
400+ } )
401+ . then ( function ( body ) {
402+ return invalidSessionTurnCheck ( body , msg , params ) ;
361403 } )
362404 . then ( function ( body ) {
363405 body . session_id = params . sessionId ;
0 commit comments