convert the samples to use the official client (#234)
This commit is contained in:
parent
08c550655a
commit
667095661b
|
|
@ -52,20 +52,9 @@
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
<script src="lib/signalr-client/signalr-client.js"></script>
|
<script src="lib/signalr-client/signalr-client.js"></script>
|
||||||
|
<script src="utils.js"></script>
|
||||||
<script>
|
<script>
|
||||||
var isConnected = false;
|
var isConnected = false;
|
||||||
function getParameterByName(name, url) {
|
|
||||||
if (!url) {
|
|
||||||
url = window.location.href;
|
|
||||||
}
|
|
||||||
name = name.replace(/[\[\]]/g, "\\$&");
|
|
||||||
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
|
|
||||||
results = regex.exec(url);
|
|
||||||
if (!results) return null;
|
|
||||||
if (!results[2]) return '';
|
|
||||||
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
|
||||||
}
|
|
||||||
|
|
||||||
function click(id, callback) {
|
function click(id, callback) {
|
||||||
document.getElementById(id).addEventListener('click', event => {
|
document.getElementById(id).addEventListener('click', event => {
|
||||||
callback(event);
|
callback(event);
|
||||||
|
|
|
||||||
|
|
@ -6,15 +6,17 @@
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>ASP.NET Sockets</h1>
|
<h1>ASP.NET Sockets</h1>
|
||||||
<h2>Messaging</h2>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="sse.html#/chat">Server Sent Events</a></li>
|
<li><a href="sockets.html?transport=serverSentEvents">Server Sent Events</a></li>
|
||||||
<li><a href="polling.html#/chat">Long polling</a></li>
|
<li><a href="sockets.html?transport=longPolling">Long polling</a></li>
|
||||||
<li><a href="ws.html#/chat">Web Sockets</a></li>
|
<li><a href="sockets.html?transport=webSocket">Web Sockets</a></li>
|
||||||
|
<li><a href="ws.html">"Plain" Web Sockets</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<h1>ASP.NET SignalR</h1>
|
<h1>ASP.NET SignalR (Hubs)</h1>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="hubs.html">Hubs</a></li>
|
<li><a href="hubs.html?transport=serverSentEvents">Server Sent Events</a></li>
|
||||||
|
<li><a href="hubs.html?transport=longPolling">Long polling</a></li>
|
||||||
|
<li><a href="hubs.html?transport=webSockets">Web Sockets</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title></title>
|
|
||||||
<script>
|
|
||||||
function socket(url) {
|
|
||||||
var sock = this;
|
|
||||||
sock.url = url;
|
|
||||||
|
|
||||||
function xhr(method, url) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let xhr = new XMLHttpRequest();
|
|
||||||
xhr.open(method, url, true);
|
|
||||||
xhr.send();
|
|
||||||
xhr.onload = () => {
|
|
||||||
if (xhr.status >= 200 && xhr.status < 300) {
|
|
||||||
resolve(xhr.response);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
reject({
|
|
||||||
status: xhr.status,
|
|
||||||
statusText: xhr.statusText
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr.onerror = () => {
|
|
||||||
reject({
|
|
||||||
status: xhr.status,
|
|
||||||
statusText: xhr.statusText
|
|
||||||
});
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function poll(xhr) {
|
|
||||||
var url = `${sock.url}/poll?id=${sock.connectionId}`;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.onreadystatechange = () => {
|
|
||||||
if (xhr.readyState == 4 && xhr.status == 200) {
|
|
||||||
sock.onmessage({ data: xhr.responseText });
|
|
||||||
poll(xhr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhr.send(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
sock.onopen = function () { };
|
|
||||||
sock.onmessage = function () { };
|
|
||||||
sock.onerror = function (event) { };
|
|
||||||
sock.send = function (data) {
|
|
||||||
if (!sock.connectionId) {
|
|
||||||
throw "Not connected";
|
|
||||||
}
|
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
var url = `${sock.url}/send?id=${sock.connectionId}`;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (xhr.readyState == 4 && xhr.status == 200) {
|
|
||||||
// Do something useful here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhr.send(data);
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr('GET', `${sock.url}/negotiate`).then(connectionId => {
|
|
||||||
sock.connectionId = connectionId;
|
|
||||||
|
|
||||||
sock.onopen();
|
|
||||||
|
|
||||||
poll(new XMLHttpRequest());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
|
||||||
var url = location.hash || '#/chat';
|
|
||||||
var sock = new socket(url.substring(1));
|
|
||||||
|
|
||||||
sock.onopen = function () {
|
|
||||||
console.log('Opened!');
|
|
||||||
};
|
|
||||||
|
|
||||||
sock.onmessage = function (event) {
|
|
||||||
var child = document.createElement('li');
|
|
||||||
child.innerText = event.data;
|
|
||||||
document.getElementById('messages').appendChild(child);
|
|
||||||
};
|
|
||||||
|
|
||||||
document.getElementById('sendmessage').addEventListener('submit', event => {
|
|
||||||
let data = document.getElementById('data').value;
|
|
||||||
sock.send(data);
|
|
||||||
event.preventDefault();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Long Polling</h1>
|
|
||||||
|
|
||||||
<form id="sendmessage">
|
|
||||||
<input type="text" id="data" />
|
|
||||||
<input type="submit" value="Send" />
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<ul id="messages"></ul>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1 id="transportName">Unknown Transport</h1>
|
||||||
|
|
||||||
|
<form id="sendmessage">
|
||||||
|
<input type="text" id="data" />
|
||||||
|
<input type="submit" value="Send" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<ul id="messages"></ul>
|
||||||
|
<script src="lib/signalr-client/signalr-client.js"></script>
|
||||||
|
<script src="utils.js"></script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
let transport = getParameterByName('transport') || 'webSockets';
|
||||||
|
|
||||||
|
document.getElementById('transportName').innerHTML = transport;
|
||||||
|
|
||||||
|
let url = `http://${document.location.host}/chat`
|
||||||
|
let connection = new signalR.Connection(url);
|
||||||
|
|
||||||
|
connection.dataReceived = data => {
|
||||||
|
let child = document.createElement('li');
|
||||||
|
child.innerText = data;
|
||||||
|
document.getElementById('messages').appendChild(child);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.getElementById('sendmessage').addEventListener('submit', event => {
|
||||||
|
let data = document.getElementById('data').value;
|
||||||
|
connection.send(data);
|
||||||
|
event.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.start(transport).then(() => {
|
||||||
|
console.log("Opened");
|
||||||
|
}, () => {
|
||||||
|
console.log("Error opening connection");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title></title>
|
|
||||||
<script>
|
|
||||||
function socket(url) {
|
|
||||||
var sock = this;
|
|
||||||
sock.url = url;
|
|
||||||
|
|
||||||
function xhr(method, url) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let xhr = new XMLHttpRequest();
|
|
||||||
xhr.open(method, url, true);
|
|
||||||
xhr.send();
|
|
||||||
xhr.onload = () => {
|
|
||||||
if (xhr.status >= 200 && xhr.status < 300) {
|
|
||||||
resolve(xhr.response);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
reject({
|
|
||||||
status: xhr.status,
|
|
||||||
statusText: xhr.statusText
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr.onerror = () => {
|
|
||||||
reject({
|
|
||||||
status: xhr.status,
|
|
||||||
statusText: xhr.statusText
|
|
||||||
});
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
sock.onopen = function () { };
|
|
||||||
sock.onmessage = function () { };
|
|
||||||
sock.onerror = function (event) { };
|
|
||||||
sock.send = function (data) {
|
|
||||||
if (!sock.connectionId) {
|
|
||||||
throw "Not connected";
|
|
||||||
}
|
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
var url = `${sock.url}/send?id=${sock.connectionId}`;
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
xhr.onreadystatechange = function () {
|
|
||||||
if (xhr.readyState == 4 && xhr.status == 200) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhr.send(data);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Start the connection
|
|
||||||
xhr('GET', `${sock.url}/negotiate`).then(connectionId => {
|
|
||||||
sock.connectionId = connectionId;
|
|
||||||
|
|
||||||
let source = new EventSource(`${sock.url}/sse?id=${connectionId}`);
|
|
||||||
|
|
||||||
source.onopen = function () {
|
|
||||||
sock.onopen();
|
|
||||||
};
|
|
||||||
|
|
||||||
source.onerror = function (err) {
|
|
||||||
sock.onerror(err);
|
|
||||||
};
|
|
||||||
|
|
||||||
source.onmessage = function (data) {
|
|
||||||
sock.onmessage(data);
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
|
||||||
var url = location.hash || '#/chat';
|
|
||||||
var sock = new socket(url.substring(1));
|
|
||||||
|
|
||||||
sock.onopen = function () {
|
|
||||||
console.log('Opened!');
|
|
||||||
};
|
|
||||||
|
|
||||||
sock.onmessage = function (event) {
|
|
||||||
var child = document.createElement('li');
|
|
||||||
child.innerText = event.data;
|
|
||||||
document.getElementById('messages').appendChild(child);
|
|
||||||
};
|
|
||||||
|
|
||||||
document.getElementById('sendmessage').addEventListener('submit', event => {
|
|
||||||
let data = document.getElementById('data').value;
|
|
||||||
sock.send(data);
|
|
||||||
event.preventDefault();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>Server Sent Events</h1>
|
|
||||||
|
|
||||||
<form id="sendmessage">
|
|
||||||
<input type="text" id="data" />
|
|
||||||
<input type="submit" value="Send" />
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<ul id="messages"></ul>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
function getParameterByName(name, url) {
|
||||||
|
if (!url) {
|
||||||
|
url = window.location.href;
|
||||||
|
}
|
||||||
|
name = name.replace(/[\[\]]/g, "\\$&");
|
||||||
|
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
|
||||||
|
results = regex.exec(url);
|
||||||
|
if (!results) return null;
|
||||||
|
if (!results[2]) return '';
|
||||||
|
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -5,8 +5,7 @@
|
||||||
<title></title>
|
<title></title>
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
var url = (location.hash || '#/chat').substring(1);
|
var ws = new WebSocket(`ws://${document.location.host}/chat/ws`);
|
||||||
var ws = new WebSocket(`ws://${document.location.host}${url}/ws`);
|
|
||||||
|
|
||||||
ws.onopen = function () {
|
ws.onopen = function () {
|
||||||
console.log('Opened!');
|
console.log('Opened!');
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\Microsoft.Extensions.WebSockets.Internal\Microsoft.Extensions.WebSockets.Internal.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.Extensions.WebSockets.Internal\Microsoft.Extensions.WebSockets.Internal.csproj" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Testing" Version="1.2.0-*" />
|
||||||
<PackageReference Include="Microsoft.Extensions.TaskCache.Sources" Version="1.2.0-*" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.Extensions.TaskCache.Sources" Version="1.2.0-*" PrivateAssets="All" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-*" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-*" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-*" />
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-*" />
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
using System;
|
||||||
|
using Microsoft.AspNetCore.Testing.xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.Extensions.WebSockets.Internal.Tests
|
||||||
|
{
|
||||||
|
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
|
||||||
|
public class SkipIfEnvVarPresentAttribute : Attribute, ITestCondition
|
||||||
|
{
|
||||||
|
private readonly string _environmentVariable;
|
||||||
|
private readonly string _skipReason;
|
||||||
|
|
||||||
|
public bool IsMet => string.IsNullOrEmpty(Environment.GetEnvironmentVariable(_environmentVariable));
|
||||||
|
|
||||||
|
public string SkipReason => _skipReason;
|
||||||
|
|
||||||
|
public SkipIfEnvVarPresentAttribute(string environmentVariable, string skipReason)
|
||||||
|
{
|
||||||
|
_environmentVariable = environmentVariable;
|
||||||
|
_skipReason = skipReason;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,6 +9,7 @@ using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
using Microsoft.AspNetCore.Testing.xunit;
|
||||||
|
|
||||||
namespace Microsoft.Extensions.WebSockets.Internal.Tests
|
namespace Microsoft.Extensions.WebSockets.Internal.Tests
|
||||||
{
|
{
|
||||||
|
|
@ -16,7 +17,8 @@ namespace Microsoft.Extensions.WebSockets.Internal.Tests
|
||||||
{
|
{
|
||||||
public class PingPongBehavior
|
public class PingPongBehavior
|
||||||
{
|
{
|
||||||
[Fact]
|
[ConditionalFact]
|
||||||
|
[SkipIfEnvVarPresent("TRAVIS", "This test times out a lot on Travis because of slow performance/threading issues")]
|
||||||
public async Task AutomaticPingTransmission()
|
public async Task AutomaticPingTransmission()
|
||||||
{
|
{
|
||||||
var startTime = DateTime.UtcNow;
|
var startTime = DateTime.UtcNow;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue