in src/directLine.ts [548:596]
private checkConnection(once = false) {
let obs = this.connectionStatus$
.flatMap(connectionStatus => {
if (connectionStatus === ConnectionStatus.Uninitialized) {
this.connectionStatus$.next(ConnectionStatus.Connecting);
//if token and streamUrl are defined it means reconnect has already been done. Skipping it.
if (this.token && this.streamUrl) {
this.connectionStatus$.next(ConnectionStatus.Online);
return Observable.of(connectionStatus, this.services.scheduler);
} else {
return this.startConversation().do(conversation => {
this.conversationId = conversation.conversationId;
this.token = this.secret || conversation.token;
this.streamUrl = conversation.streamUrl;
this.referenceGrammarId = conversation.referenceGrammarId;
if (!this.secret)
this.refreshTokenLoop();
this.connectionStatus$.next(ConnectionStatus.Online);
}, error => {
this.connectionStatus$.next(ConnectionStatus.FailedToConnect);
})
.map(_ => connectionStatus);
}
}
else {
return Observable.of(connectionStatus, this.services.scheduler);
}
})
.filter(connectionStatus => connectionStatus != ConnectionStatus.Uninitialized && connectionStatus != ConnectionStatus.Connecting)
.flatMap(connectionStatus => {
switch (connectionStatus) {
case ConnectionStatus.Ended:
return Observable.throw(errorConversationEnded, this.services.scheduler);
case ConnectionStatus.FailedToConnect:
return Observable.throw(errorFailedToConnect, this.services.scheduler);
case ConnectionStatus.ExpiredToken:
return Observable.of(connectionStatus, this.services.scheduler);
default:
return Observable.of(connectionStatus, this.services.scheduler);
}
})
return once ? obs.take(1) : obs;
}