Replacing onError with onClosed

Unifying errors in transports
This commit is contained in:
moozzyk 2017-03-17 13:18:24 -07:00
parent ab3dce85fc
commit 33c94c1a47
4 changed files with 31 additions and 31 deletions

View File

@ -1,3 +1,3 @@
export declare type DataReceived = (data: any) => void; export declare type DataReceived = (data: any) => void;
export declare type ErrorHandler = (e: any) => void; export declare type ConnectionClosed = (e?: Error) => void;
export declare type ConnectionClosed = (e?: any) => void; export declare type TransportClosed = (e?: Error) => void;

View File

@ -33,7 +33,7 @@ export class Connection {
this.transport = this.createTransport(transportName); this.transport = this.createTransport(transportName);
this.transport.onDataReceived = this.dataReceivedCallback; this.transport.onDataReceived = this.dataReceivedCallback;
this.transport.onError = e => this.stopConnection(e); this.transport.onClosed = e => this.stopConnection(e);
try { try {
this.connectionId = await this.httpClient.get(`${this.url}/negotiate?${this.queryString}`); this.connectionId = await this.httpClient.get(`${this.url}/negotiate?${this.queryString}`);

View File

@ -1,4 +1,4 @@
import { DataReceived, ErrorHandler } from "./Common" import { DataReceived, TransportClosed } from "./Common"
import { IHttpClient } from "./HttpClient" import { IHttpClient } from "./HttpClient"
import * as Formatters from "./Formatters"; import * as Formatters from "./Formatters";
@ -7,7 +7,7 @@ export interface ITransport {
send(data: any): Promise<void>; send(data: any): Promise<void>;
stop(): void; stop(): void;
onDataReceived: DataReceived; onDataReceived: DataReceived;
onError: ErrorHandler; onClosed: TransportClosed;
} }
export class WebSocketTransport implements ITransport { export class WebSocketTransport implements ITransport {
@ -39,9 +39,12 @@ export class WebSocketTransport implements ITransport {
webSocket.onclose = (event: CloseEvent) => { webSocket.onclose = (event: CloseEvent) => {
// webSocket will be null if the transport did not start successfully // webSocket will be null if the transport did not start successfully
if (this.webSocket && (event.wasClean === false || event.code !== 1000)) { if (this.onClosed && this.webSocket) {
if (this.onError) { if (event.wasClean === false || event.code !== 1000) {
this.onError(event); this.onClosed(new Error(`Websocket closed with status code: ${event.code} (${event.reason})`));
}
else {
this.onClosed();
} }
} }
} }
@ -65,7 +68,7 @@ export class WebSocketTransport implements ITransport {
} }
onDataReceived: DataReceived; onDataReceived: DataReceived;
onError: ErrorHandler; onClosed: TransportClosed;
} }
export class ServerSentEventsTransport implements ITransport { export class ServerSentEventsTransport implements ITransport {
@ -98,8 +101,8 @@ export class ServerSentEventsTransport implements ITransport {
try { try {
message = Formatters.ServerSentEventsFormat.parse(e.data); message = Formatters.ServerSentEventsFormat.parse(e.data);
} catch (error) { } catch (error) {
if (this.onError) { if (this.onClosed) {
this.onError(error); this.onClosed(error);
} }
return; return;
} }
@ -109,12 +112,12 @@ export class ServerSentEventsTransport implements ITransport {
} }
}; };
eventSource.onerror = (e: Event) => { eventSource.onerror = (e: ErrorEvent) => {
reject(); reject();
// don't report an error if the transport did not start successfully // don't report an error if the transport did not start successfully
if (this.eventSource && this.onError) { if (this.eventSource && this.onClosed) {
this.onError(e); this.onClosed(new Error(e.message));
} }
} }
@ -141,7 +144,7 @@ export class ServerSentEventsTransport implements ITransport {
} }
onDataReceived: DataReceived; onDataReceived: DataReceived;
onError: ErrorHandler; onClosed: TransportClosed;
} }
export class LongPollingTransport implements ITransport { export class LongPollingTransport implements ITransport {
@ -178,8 +181,8 @@ export class LongPollingTransport implements ITransport {
try { try {
messages = Formatters.TextMessageFormat.parse(pollXhr.response); messages = Formatters.TextMessageFormat.parse(pollXhr.response);
} catch (error) { } catch (error) {
if (this.onError) { if (this.onClosed) {
this.onError(error); this.onClosed(error);
} }
return; return;
} }
@ -192,24 +195,21 @@ export class LongPollingTransport implements ITransport {
this.poll(url); this.poll(url);
} }
else if (this.pollXhr.status == 204) { else if (this.pollXhr.status == 204) {
// TODO: closed event? if (this.onClosed) {
this.onClosed();
}
} }
else { else {
if (this.onError) { if (this.onClosed) {
this.onError({ this.onClosed(new Error(`Status: ${pollXhr.status}, Message: ${pollXhr.responseText}`));
status: pollXhr.status,
statusText: pollXhr.statusText
});
} }
} }
}; };
pollXhr.onerror = () => { pollXhr.onerror = () => {
if (this.onError) { if (this.onClosed) {
this.onError({ // network related error or denied cross domain request
status: pollXhr.status, this.onClosed(new Error("Sending HTTP request failed."));
statusText: pollXhr.statusText
});
} }
}; };
@ -237,5 +237,5 @@ export class LongPollingTransport implements ITransport {
} }
onDataReceived: DataReceived; onDataReceived: DataReceived;
onError: ErrorHandler; onClosed: TransportClosed;
} }

View File

@ -19,8 +19,8 @@
<!-- these targets relies on npm packages being restored when building the TS client --> <!-- these targets relies on npm packages being restored when building the TS client -->
<Target Name="CopyRequiredArtifacts" BeforeTargets="AfterBuild"> <Target Name="CopyRequiredArtifacts" BeforeTargets="AfterBuild">
<ItemGroup> <ItemGroup>
<JasmineFiles Include="$(MSBuildProjectDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.js" /> <JasmineFiles Include="$(MSBuildThisFileDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.js" />
<JasmineFiles Include="$(MSBuildProjectDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.css" /> <JasmineFiles Include="$(MSBuildThisFileDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.css" />
</ItemGroup> </ItemGroup>
<Copy SourceFiles="@(JasmineFiles)" DestinationFolder="$(MSBuildProjectDirectory)/wwwroot/lib/jasmine" /> <Copy SourceFiles="@(JasmineFiles)" DestinationFolder="$(MSBuildProjectDirectory)/wwwroot/lib/jasmine" />