Replacing onError with onClosed
Unifying errors in transports
This commit is contained in:
parent
ab3dce85fc
commit
33c94c1a47
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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}`);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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" />
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue