diff --git a/samples/SocketsSample/wwwroot/hubs.html b/samples/SocketsSample/wwwroot/hubs.html index 42f099306d..45083d0c39 100644 --- a/samples/SocketsSample/wwwroot/hubs.html +++ b/samples/SocketsSample/wwwroot/hubs.html @@ -8,7 +8,8 @@ document.addEventListener('DOMContentLoaded', () => { let connectButton = document.getElementById('connect'); let connection = new RpcConnection(`http://${document.location.host}/hubs`, 'formatType=json&format=text'); - connection.on('Send',(msg) => { addLine(msg); }); + connection.on('Send', msg => { + addLine(msg); }); let isConnected = false; connectButton.addEventListener('click', () => { diff --git a/src/Microsoft.AspNetCore.SignalR.Client.TS/LongPollingTransport.ts b/src/Microsoft.AspNetCore.SignalR.Client.TS/LongPollingTransport.ts index 76d5eed09b..6630541d80 100644 --- a/src/Microsoft.AspNetCore.SignalR.Client.TS/LongPollingTransport.ts +++ b/src/Microsoft.AspNetCore.SignalR.Client.TS/LongPollingTransport.ts @@ -9,13 +9,13 @@ class LongPollingTransport implements ITransport { // TODO: string won't work for binary formats constructor(receiveCallback: (data: string) => void) { this.receiveCallback = receiveCallback; - this.pollXhr = new XMLHttpRequest(); } connect(url: string, queryString: string): Promise { this.queryString = queryString || ""; this.url = url || ""; + this.pollXhr = new XMLHttpRequest(); // TODO: resolve promise on open sending? + reject on error this.poll(url + "/poll?" + this.queryString) return Promise.resolve(); diff --git a/src/Microsoft.AspNetCore.SignalR.Client.TS/RpcConnection.ts b/src/Microsoft.AspNetCore.SignalR.Client.TS/RpcConnection.ts index 467f0737e3..fd92d3eb18 100644 --- a/src/Microsoft.AspNetCore.SignalR.Client.TS/RpcConnection.ts +++ b/src/Microsoft.AspNetCore.SignalR.Client.TS/RpcConnection.ts @@ -51,17 +51,19 @@ class RpcConnection { start(): Promise { return new Promise((resolve, reject) => { new HttpClient().get(this.url + "/getid?" + this.queryString) - .then(id => { - // this.transport = new WebSocketTransport(data => this.messageReceived(data)); - this.transport = new LongPollingTransport(data => this.messageReceived(data)); - return this.transport.connect(this.url, `id=${id}&${this.queryString}`); - }) - .then(() => { - resolve(); - }) - .catch(() => { - reject(); - }); + .then(id => { + this.transport = new ServerSentEventsTransport(data => this.messageReceived(data)); + // this.transport = new WebSocketTransport(data => this.messageReceived(data)); + // this.transport = new WebSocketTransport(data => this.messageReceived(data)); + // this.transport = new LongPollingTransport(data => this.messageReceived(data)); + return this.transport.connect(this.url, `id=${id}&${this.queryString}`); + }) + .then(() => { + resolve(); + }) + .catch(e => { + reject(e); + }); }); } diff --git a/src/Microsoft.AspNetCore.SignalR.Client.TS/ServerSentEventsTransport.ts b/src/Microsoft.AspNetCore.SignalR.Client.TS/ServerSentEventsTransport.ts new file mode 100644 index 0000000000..1c5be418ca --- /dev/null +++ b/src/Microsoft.AspNetCore.SignalR.Client.TS/ServerSentEventsTransport.ts @@ -0,0 +1,33 @@ +// TODO: need EvenSource typings + +class ServerSentEventsTransport implements ITransport { + private receiveCallback: (data: string) => void; + private eventSource: EventSource; + private url: string; + private queryString: string; + + constructor(receiveCallback: (data: string) => void) { + this.receiveCallback = receiveCallback; + } + + connect(url: string, queryString: string): Promise { + this.queryString = queryString || ""; + this.url = url || ""; + let tmp = `${this.url}/sse?${this.queryString}`; + this.eventSource = new EventSource(`${this.url}/sse?${this.queryString}`); + this.eventSource.onmessage = e => { + this.receiveCallback(e.data); + }; + + //TODO: handle errors + return Promise.resolve(); + } + + send(data: string): Promise { + return new HttpClient().post(this.url + "/send?" + this.queryString, data); + } + + stop(): void { + this.eventSource.close(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs b/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs index 86fff147a5..41bc105cd7 100644 --- a/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs +++ b/src/Microsoft.AspNetCore.Sockets/HttpConnectionDispatcher.cs @@ -47,6 +47,10 @@ namespace Microsoft.AspNetCore.Sockets state.Connection.Metadata["transport"] = "sse"; state.Connection.Metadata.Format = format; + // TODO: this is wrong. + how does the user add their own metadata based on HttpContext + var formatType = (string)context.Request.Query["formatType"]; + state.Connection.Metadata["formatType"] = string.IsNullOrEmpty(formatType) ? "json" : formatType; + var sse = new ServerSentEvents(state.Connection); await DoPersistentConnection(endpoint, sse, context, state.Connection);