Major TypeScript module refactoring (#1319)

* Build cjs, esm and umd versions
* Split MsgPack into separate module
* Split package.jsons up so they can stay clean
* Move common dev dependencies to a root package.json
This commit is contained in:
Andrew Stanton-Nurse 2018-01-19 14:26:31 -08:00 committed by GitHub
parent 87288822a3
commit 0579f40a7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
102 changed files with 1358 additions and 5071 deletions

2
.gitignore vendored
View File

@ -39,7 +39,7 @@ autobahnreports/
site.min.css site.min.css
.idea/ .idea/
.vscode/ .vscode/
signalr-client/
dist/ dist/
global.json global.json
BenchmarkDotNet.Artifacts/ BenchmarkDotNet.Artifacts/
.rpt2_cache/

View File

@ -39,8 +39,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatSample", "samples\ChatS
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SocialWeather", "samples\SocialWeather\SocialWeather.csproj", "{8D789F94-CB74-45FD-ACE7-92AF6E55042E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SocialWeather", "samples\SocialWeather\SocialWeather.csproj", "{8D789F94-CB74-45FD-ACE7-92AF6E55042E}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Test.Server", "client-ts\Microsoft.AspNetCore.SignalR.Test.Server\Microsoft.AspNetCore.SignalR.Test.Server.csproj", "{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Tests", "test\Microsoft.AspNetCore.SignalR.Tests\Microsoft.AspNetCore.SignalR.Tests.csproj", "{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Tests", "test\Microsoft.AspNetCore.SignalR.Tests\Microsoft.AspNetCore.SignalR.Tests.csproj", "{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientSample", "samples\ClientSample\ClientSample.csproj", "{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientSample", "samples\ClientSample\ClientSample.csproj", "{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9}"
@ -55,12 +53,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Signal
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.FunctionalTests", "test\Microsoft.AspNetCore.SignalR.Client.FunctionalTests\Microsoft.AspNetCore.SignalR.Client.FunctionalTests.csproj", "{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.FunctionalTests", "test\Microsoft.AspNetCore.SignalR.Client.FunctionalTests\Microsoft.AspNetCore.SignalR.Client.FunctionalTests.csproj", "{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.TS", "client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj", "{333526A4-633B-491A-AC45-CC62A0012D1C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client-ts", "client-ts", "{3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client-ts", "client-ts", "{3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}"
ProjectSection(SolutionItems) = preProject
client-ts\package.json = client-ts\package.json
EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Microbenchmarks", "benchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks.csproj", "{96771B3F-4D18-41A7-A75B-FF38E76AAC89}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Microbenchmarks", "benchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks.csproj", "{96771B3F-4D18-41A7-A75B-FF38E76AAC89}"
EndProject EndProject
@ -94,6 +87,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Signal
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client.MsgPack", "src\Microsoft.AspNetCore.SignalR.Client.MsgPack\Microsoft.AspNetCore.SignalR.Client.MsgPack.csproj", "{4DBF918E-BD37-4309-B448-BA68C935944D}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client.MsgPack", "src\Microsoft.AspNetCore.SignalR.Client.MsgPack\Microsoft.AspNetCore.SignalR.Client.MsgPack.csproj", "{4DBF918E-BD37-4309-B448-BA68C935944D}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FunctionalTests", "client-ts\FunctionalTests\FunctionalTests.csproj", "{D0C7B22E-B0B6-4D62-BF7D-79EE4AAF1981}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -128,10 +123,6 @@ Global
{8D789F94-CB74-45FD-ACE7-92AF6E55042E}.Debug|Any CPU.Build.0 = Debug|Any CPU {8D789F94-CB74-45FD-ACE7-92AF6E55042E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8D789F94-CB74-45FD-ACE7-92AF6E55042E}.Release|Any CPU.ActiveCfg = Release|Any CPU {8D789F94-CB74-45FD-ACE7-92AF6E55042E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D789F94-CB74-45FD-ACE7-92AF6E55042E}.Release|Any CPU.Build.0 = Release|Any CPU {8D789F94-CB74-45FD-ACE7-92AF6E55042E}.Release|Any CPU.Build.0 = Release|Any CPU
{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}.Release|Any CPU.Build.0 = Release|Any CPU
{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -160,10 +151,6 @@ Global
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Debug|Any CPU.Build.0 = Debug|Any CPU {455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.Build.0 = Release|Any CPU {455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.Build.0 = Release|Any CPU
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{333526A4-633B-491A-AC45-CC62A0012D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{333526A4-633B-491A-AC45-CC62A0012D1C}.Release|Any CPU.Build.0 = Release|Any CPU
{96771B3F-4D18-41A7-A75B-FF38E76AAC89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {96771B3F-4D18-41A7-A75B-FF38E76AAC89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96771B3F-4D18-41A7-A75B-FF38E76AAC89}.Debug|Any CPU.Build.0 = Debug|Any CPU {96771B3F-4D18-41A7-A75B-FF38E76AAC89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96771B3F-4D18-41A7-A75B-FF38E76AAC89}.Release|Any CPU.ActiveCfg = Release|Any CPU {96771B3F-4D18-41A7-A75B-FF38E76AAC89}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -224,6 +211,10 @@ Global
{4DBF918E-BD37-4309-B448-BA68C935944D}.Debug|Any CPU.Build.0 = Debug|Any CPU {4DBF918E-BD37-4309-B448-BA68C935944D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4DBF918E-BD37-4309-B448-BA68C935944D}.Release|Any CPU.ActiveCfg = Release|Any CPU {4DBF918E-BD37-4309-B448-BA68C935944D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4DBF918E-BD37-4309-B448-BA68C935944D}.Release|Any CPU.Build.0 = Release|Any CPU {4DBF918E-BD37-4309-B448-BA68C935944D}.Release|Any CPU.Build.0 = Release|Any CPU
{D0C7B22E-B0B6-4D62-BF7D-79EE4AAF1981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D0C7B22E-B0B6-4D62-BF7D-79EE4AAF1981}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D0C7B22E-B0B6-4D62-BF7D-79EE4AAF1981}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D0C7B22E-B0B6-4D62-BF7D-79EE4AAF1981}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -236,7 +227,6 @@ Global
{59319B72-38BE-4041-8E5C-FF6938874CE8} = {DA69F624-5398-4884-87E4-B816698CDE65} {59319B72-38BE-4041-8E5C-FF6938874CE8} = {DA69F624-5398-4884-87E4-B816698CDE65}
{300979F6-A02E-407A-B8DF-F6200806C18D} = {C4BC9889-B49F-41B6-806B-F84941B2549B} {300979F6-A02E-407A-B8DF-F6200806C18D} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
{8D789F94-CB74-45FD-ACE7-92AF6E55042E} = {C4BC9889-B49F-41B6-806B-F84941B2549B} {8D789F94-CB74-45FD-ACE7-92AF6E55042E} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8} = {3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}
{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9} = {C4BC9889-B49F-41B6-806B-F84941B2549B} {BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
{EE790D50-C632-46B9-A430-06FA2F2FDCD7} = {C4BC9889-B49F-41B6-806B-F84941B2549B} {EE790D50-C632-46B9-A430-06FA2F2FDCD7} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
@ -244,7 +234,6 @@ Global
{E37324FF-6BAF-4243-BA80-7C024CF5F29D} = {DA69F624-5398-4884-87E4-B816698CDE65} {E37324FF-6BAF-4243-BA80-7C024CF5F29D} = {DA69F624-5398-4884-87E4-B816698CDE65}
{354335AB-CEE9-4434-A641-78058F6EFE56} = {DA69F624-5398-4884-87E4-B816698CDE65} {354335AB-CEE9-4434-A641-78058F6EFE56} = {DA69F624-5398-4884-87E4-B816698CDE65}
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {455B68D2-C5B6-4BF4-A685-964B07AFAAF8} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
{333526A4-633B-491A-AC45-CC62A0012D1C} = {3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}
{96771B3F-4D18-41A7-A75B-FF38E76AAC89} = {8A4582C8-DC59-4B61-BCE7-119FBAA99EFB} {96771B3F-4D18-41A7-A75B-FF38E76AAC89} = {8A4582C8-DC59-4B61-BCE7-119FBAA99EFB}
{75E342F6-5445-4E7E-9143-6D9AE62C2B1E} = {6A35B453-52EC-48AF-89CA-D4A69800F131} {75E342F6-5445-4E7E-9143-6D9AE62C2B1E} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
{F2E4FBD6-9AEA-4A82-BAC9-3FAACA677DF8} = {DA69F624-5398-4884-87E4-B816698CDE65} {F2E4FBD6-9AEA-4A82-BAC9-3FAACA677DF8} = {DA69F624-5398-4884-87E4-B816698CDE65}
@ -260,6 +249,7 @@ Global
{55DB4B6F-12E5-4A27-97F4-E97E135470FF} = {DA69F624-5398-4884-87E4-B816698CDE65} {55DB4B6F-12E5-4A27-97F4-E97E135470FF} = {DA69F624-5398-4884-87E4-B816698CDE65}
{FDDB4E1F-2FD2-49E8-B0FF-874B0931369A} = {DA69F624-5398-4884-87E4-B816698CDE65} {FDDB4E1F-2FD2-49E8-B0FF-874B0931369A} = {DA69F624-5398-4884-87E4-B816698CDE65}
{4DBF918E-BD37-4309-B448-BA68C935944D} = {DA69F624-5398-4884-87E4-B816698CDE65} {4DBF918E-BD37-4309-B448-BA68C935944D} = {DA69F624-5398-4884-87E4-B816698CDE65}
{D0C7B22E-B0B6-4D62-BF7D-79EE4AAF1981} = {3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7945A4E4-ACDB-4F6E-95CA-6AC6E7C2CD59} SolutionGuid = {7945A4E4-ACDB-4F6E-95CA-6AC6E7C2CD59}

View File

@ -1,11 +1,58 @@
<Project> <Project>
<ItemGroup>
<NPMPackage Include="$(RepositoryRoot)client-ts/signalr">
<TarName>aspnet-signalr</TarName>
<PackageId>@aspnet/signalr</PackageId>
</NPMPackage>
<NPMPackage Include="$(RepositoryRoot)client-ts/signalr-protocol-msgpack">
<TarName>aspnet-signalr-protocol-msgpack</TarName>
<PackageId>@aspnet/signalr-protocol-msgpack</PackageId>
</NPMPackage>
</ItemGroup>
<Target Name="RestoreNpm" AfterTargets="Restore" Condition="'$(PreflightRestore)' != 'True'"> <Target Name="RestoreNpm" AfterTargets="Restore" Condition="'$(PreflightRestore)' != 'True'">
<Message Text="Restoring NPM modules" Importance="high" /> <Message Text="Restoring NPM modules" Importance="high" />
<Exec Command="npm install --no-optional" WorkingDirectory="$(RepositoryRoot)client-ts" /> <Exec Command="npm install --no-optional" WorkingDirectory="$(RepositoryRoot)client-ts" />
<Exec Command="npm install --no-optional" WorkingDirectory="$(RepositoryRoot)client-ts/FunctionalTests" />
<Exec Command="npm install --no-optional" WorkingDirectory="$(RepositoryRoot)client-ts/signalr" />
<Exec Command="npm install --no-optional" WorkingDirectory="$(RepositoryRoot)client-ts/signalr-protocol-msgpack" />
</Target> </Target>
<Target Name="RunTSClientNodeTests" AfterTargets="Test"> <Target Name="RunTSClientNodeTests" AfterTargets="Test">
<Message Text="Running TypeScript client Node tests" Importance="high" /> <Message Text="Running TypeScript client Node tests" Importance="high" />
<Exec Command="npm test" WorkingDirectory="$(RepositoryRoot)client-ts" IgnoreStandardErrorWarningFormat="true" /> <Exec Command="npm test" WorkingDirectory="$(RepositoryRoot)client-ts" IgnoreStandardErrorWarningFormat="true" />
</Target> </Target>
<PropertyGroup>
<PackageDependsOn>$(PackageDependsOn);PublishNPMPackages</PackageDependsOn>
</PropertyGroup>
<Target Name="PublishNPMPackages" AfterTargets="Package">
<ItemGroup>
<NPMPackage Update="%(NPMPackage)">
<PackageJson>$([System.IO.Path]::Combine(%(NPMPackage.FullPath), 'package.json'))</PackageJson>
<OutputTar>$([System.IO.Path]::Combine(%(NPMPackage.FullPath), '%(NPMPackage.TarName)-$(PackageVersion).tgz'))</OutputTar>
<ArtifactPath>$([System.IO.Path]::Combine($(BuildDir), '%(NPMPackage.TarName)-$(PackageVersion).tgz'))</ArtifactPath>
</NPMPackage>
</ItemGroup>
<ItemGroup>
<ArtifactInfo Include="%(NPMPackage.ArtifactPath)">
<ArtifactType>NpmPackage</ArtifactType>
<PackageId>%(NPMPackage.PackageId)</PackageId>
<Version>$(PackageVersion)</Version>
</ArtifactInfo>
</ItemGroup>
<ItemGroup>
<FilesToExcludeFromSigning Include="%(NPMPackage.ArtifactPath)" />
</ItemGroup>
<Copy SourceFiles="%(NPMPackage.PackageJson)" DestinationFiles="%(NPMPackage.PackageJson).bak" />
<Exec Command="npm --no-git-tag-version --allow-same-version version $(PackageVersion)" WorkingDirectory="%(NPMPackage.FullPath)" />
<Exec Command="npm run build" WorkingDirectory="%(NPMPackage.FullPath)" />
<Exec Command="npm pack" WorkingDirectory="%(NPMPackage.FullPath)" />
<Delete Files="%(NPMPackage.ArtifactPath)" Condition="Exists('%(NPMPackage.ArtifactPath)')" />
<Move SourceFiles="%(NPMPackage.OutputTar)" DestinationFiles="%(NPMPackage.ArtifactPath)" />
<Move SourceFiles="%(NPMPackage.PackageJson).bak" DestinationFiles="%(NPMPackage.PackageJson)" />
</Target>
</Project> </Project>

View File

@ -1,3 +0,0 @@
*
!dist/**/*
!README.md

View File

@ -1,10 +1,11 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
namespace Microsoft.AspNetCore.SignalR.Test.Server namespace FunctionalTests
{ {
[Authorize(JwtBearerDefaults.AuthenticationScheme)] [Authorize(JwtBearerDefaults.AuthenticationScheme)]
public class HubWithAuthorization : Hub public class HubWithAuthorization : Hub

View File

@ -3,7 +3,7 @@
using System; using System;
namespace Microsoft.AspNetCore.SignalR.Test.Server namespace FunctionalTests
{ {
public class ComplexObject public class ComplexObject
{ {
@ -12,4 +12,4 @@ namespace Microsoft.AspNetCore.SignalR.Test.Server
public byte[] ByteArray { get; set; } public byte[] ByteArray { get; set; }
public Guid GUID { get; set; } public Guid GUID { get; set; }
} }
} }

View File

@ -2,10 +2,9 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR.Internal;
using Microsoft.AspNetCore.Sockets; using Microsoft.AspNetCore.Sockets;
namespace Microsoft.AspNetCore.SignalR.Test.Server namespace FunctionalTests
{ {
public class EchoEndPoint : EndPoint public class EchoEndPoint : EndPoint
{ {

View File

@ -5,8 +5,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.MsgPack\Microsoft.AspNetCore.SignalR.MsgPack.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" />
<ProjectReference Include="..\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -20,8 +20,20 @@
<PackageReference Include="System.Reactive.Linq" Version="$(SystemReactiveLinqPackageVersion)" /> <PackageReference Include="System.Reactive.Linq" Version="$(SystemReactiveLinqPackageVersion)" />
</ItemGroup> </ItemGroup>
<!-- these targets relies on npm packages being restored when building the TS client --> <ItemGroup>
<Target Name="CopyRequiredArtifacts" BeforeTargets="AfterBuild"> <Folder Include="wwwroot\js\" />
</ItemGroup>
<Target Name="ClientBuild" BeforeTargets="AfterBuild">
<!-- This will result in a double build of the JavaScript modules. Not sure the best way to deal with that right now. -->
<Exec Command="npm run build" WorkingDirectory="$(MSBuildThisFileDirectory)/.." />
<Exec Command="npm run build" />
<ItemGroup>
<MsgPack5Files Include="$(MSBuildThisFileDirectory)../signalr-protocol-msgpack/node_modules/msgpack5/dist/*.js" />
</ItemGroup>
<Copy SourceFiles="@(MsgPack5Files)" DestinationFolder="$(MSBuildProjectDirectory)/wwwroot/lib/msgpack5" />
<ItemGroup> <ItemGroup>
<JasmineFiles Include="$(MSBuildThisFileDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.js" /> <JasmineFiles Include="$(MSBuildThisFileDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.js" />
<JasmineFiles Include="$(MSBuildThisFileDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.css" /> <JasmineFiles Include="$(MSBuildThisFileDirectory)../node_modules/jasmine-core/lib/jasmine-core/*.css" />
@ -29,9 +41,10 @@
<Copy SourceFiles="@(JasmineFiles)" DestinationFolder="$(MSBuildProjectDirectory)/wwwroot/lib/jasmine" /> <Copy SourceFiles="@(JasmineFiles)" DestinationFolder="$(MSBuildProjectDirectory)/wwwroot/lib/jasmine" />
<ItemGroup> <ItemGroup>
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\dist\browser\*" /> <SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)../signalr/dist/browser/*" />
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)../signalr-protocol-msgpack/dist/browser/*" />
</ItemGroup> </ItemGroup>
<Copy SourceFiles="@(SignalRJSClientFiles)" DestinationFolder="$(MSBuildThisFileDirectory)wwwroot\lib\signalr" /> <Copy SourceFiles="@(SignalRJSClientFiles)" DestinationFolder="$(MSBuildThisFileDirectory)/wwwroot/lib/signalr" />
</Target> </Target>
</Project> </Project>

View File

@ -5,7 +5,7 @@ using System.IO;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.SignalR.Test.Server namespace FunctionalTests
{ {
public class Program public class Program
{ {

View File

@ -13,7 +13,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
namespace Microsoft.AspNetCore.SignalR.Test.Server namespace FunctionalTests
{ {
public class Startup public class Startup
{ {
@ -29,7 +29,8 @@ namespace Microsoft.AspNetCore.SignalR.Test.Server
// we are running the same tests with JSON and MsgPack protocols and having // we are running the same tests with JSON and MsgPack protocols and having
// consistent casing makes it cleaner to verify results // consistent casing makes it cleaner to verify results
options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver(); options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
}); })
.AddMessagePackProtocol();
services.AddAuthorization(options => services.AddAuthorization(options =>
{ {

View File

@ -2,11 +2,11 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.Reactive.Disposables;
using System.Reactive.Linq; using System.Reactive.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;
namespace Microsoft.AspNetCore.SignalR.Test.Server namespace FunctionalTests
{ {
public class CustomObject public class CustomObject
{ {

View File

@ -1,9 +1,9 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using Microsoft.AspNetCore.SignalR;
namespace Microsoft.AspNetCore.SignalR.Test.Server namespace FunctionalTests
{ {
public class UncreatableHub: Hub public class UncreatableHub: Hub
{ {

View File

@ -0,0 +1,14 @@
{
"name": "functionaltests",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"es6-promise": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.2.tgz",
"integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==",
"dev": true
}
}
}

View File

@ -0,0 +1,19 @@
{
"name": "functionaltests",
"private": true,
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {},
"devDependencies": {
"es6-promise": "^4.2.2"
},
"scripts": {
"clean": "node ../node_modules/rimraf/bin.js ./wwwroot/dist",
"build": "npm run build:tsc && npm run build:rollup",
"build:tsc": "node ../node_modules/typescript/bin/tsc --project ./tsconfig.json",
"build:rollup": "node ../node_modules/rollup/bin/rollup -c"
},
"author": "",
"license": "Apache-2.0"
}

View File

@ -0,0 +1,32 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import path from 'path';
import sourceMaps from 'rollup-plugin-sourcemaps'
import commonjs from 'rollup-plugin-commonjs'
import resolve from 'rollup-plugin-node-resolve'
export default {
input: path.join(__dirname, "obj", "js", "index.js"),
output: {
file: path.join(__dirname, "wwwroot", "dist", "signalr-functional-tests.js"),
format: "iife",
sourcemap: true,
banner: "/* @license\r\n" +
" * Copyright (c) .NET Foundation. All rights reserved.\r\n" +
" * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n" +
"*/",
globals: {
"@aspnet/signalr": "signalR",
"@aspnet/signalr-protocol-msgpack": "signalR.protocols.msgpack",
},
},
context: "window",
external: [ "@aspnet/signalr", "@aspnet/signalr-protocol-msgpack" ],
plugins: [
commonjs(),
resolve(),
sourceMaps()
]
}

View File

@ -0,0 +1,43 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { TransportType, IHubProtocol, JsonHubProtocol } from "@aspnet/signalr"
import { MessagePackHubProtocol } from "@aspnet/signalr-protocol-msgpack"
export const ECHOENDPOINT_URL = "http://" + document.location.host + "/echo";
export function getTransportTypes(): TransportType[] {
var transportTypes = [];
if (typeof WebSocket !== "undefined") {
transportTypes.push(TransportType.WebSockets);
}
if (typeof EventSource !== "undefined") {
transportTypes.push(TransportType.ServerSentEvents);
}
transportTypes.push(TransportType.LongPolling);
return transportTypes;
}
export function eachTransport(action: (transport: TransportType) => void) {
getTransportTypes().forEach(function (t) {
return action(t);
});
}
export function eachTransportAndProtocol(action: (transport: TransportType, protocol: IHubProtocol) => void) {
var protocols : IHubProtocol[] = [new JsonHubProtocol()];
// IE9 does not support XmlHttpRequest advanced features so disable for now
// This can be enabled if we fix: https://github.com/aspnet/SignalR/issues/742
if (typeof new XMLHttpRequest().responseType === "string") {
// Because of TypeScript stuff, we can't get "ambient" or "global" declarations to work with the MessagePackHubProtocol module
// This is only a limitation of the .d.ts file.
// Everything works fine in the module
protocols.push(new MessagePackHubProtocol());
}
getTransportTypes().forEach(function (t) {
return protocols.forEach(function (p) {
return action(t, p);
});
});
}

View File

@ -1,13 +1,14 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
"use strict"; import { HttpConnection, LogLevel, TransportType } from "@aspnet/signalr"
import { eachTransport, ECHOENDPOINT_URL } from "./Common"
describe('connection', function () { describe('connection', function () {
if (typeof WebSocket !== 'undefined') { if (typeof WebSocket !== 'undefined') {
it("can connect to the server without specifying transport explicitly", function (done) { it("can connect to the server without specifying transport explicitly", function (done) {
var message = "Hello World!"; var message = "Hello World!";
var connection = new signalR.HttpConnection(ECHOENDPOINT_URL); var connection = new HttpConnection(ECHOENDPOINT_URL);
var received = ""; var received = "";
connection.onreceive = function (data) { connection.onreceive = function (data) {
@ -32,13 +33,13 @@ describe('connection', function () {
} }
eachTransport(function (transportType) { eachTransport(function (transportType) {
it("over " + signalR.TransportType[transportType] + " can send and receive messages", function (done) { it("over " + TransportType[transportType] + " can send and receive messages", function (done) {
var message = "Hello World!"; var message = "Hello World!";
// the url should be resolved relative to the document.location.host // the url should be resolved relative to the document.location.host
// and the leading '/' should be automatically added to the url // and the leading '/' should be automatically added to the url
var connection = new signalR.HttpConnection("echo", { var connection = new HttpConnection("echo", {
transport: transportType, transport: transportType,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}); });
var received = ""; var received = "";

View File

@ -1,22 +1,23 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
'use strict'; import { TransportType, HubConnection, LogLevel } from "@aspnet/signalr";
import { eachTransportAndProtocol, eachTransport } from "./Common";
var TESTHUBENDPOINT_URL = '/testhub'; var TESTHUBENDPOINT_URL = '/testhub';
describe('hubConnection', function () { describe('hubConnection', function () {
eachTransportAndProtocol(function (transportType, protocol) { eachTransportAndProtocol(function (transportType, protocol) {
describe(protocol.name + ' over ' + signalR.TransportType[transportType] + ' transport', function () { describe(protocol.name + ' over ' + TransportType[transportType] + ' transport', function () {
it('can invoke server method and receive result', function (done) { it('can invoke server method and receive result', function (done) {
var message = '你好,世界!'; var message = '你好,世界!';
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.onclose(function (error) { hubConnection.onclose(function (error) {
expect(error).toBe(undefined); expect(error).toBe(undefined);
done(); done();
@ -39,12 +40,11 @@ describe('hubConnection', function () {
it('can invoke server method non-blocking and not receive result', function (done) { it('can invoke server method non-blocking and not receive result', function (done) {
var message = '你好,世界!'; var message = '你好,世界!';
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.onclose(function (error) { hubConnection.onclose(function (error) {
expect(error).toBe(undefined); expect(error).toBe(undefined);
done(); done();
@ -63,12 +63,11 @@ describe('hubConnection', function () {
}); });
it('can invoke server method structural object and receive structural result', function (done) { it('can invoke server method structural object and receive structural result', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.on('CustomObject', function (customObject) { hubConnection.on('CustomObject', function (customObject) {
expect(customObject.Name).toBe('test'); expect(customObject.Name).toBe('test');
@ -90,12 +89,11 @@ describe('hubConnection', function () {
}); });
it('can stream server method and receive result', function (done) { it('can stream server method and receive result', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.onclose(function (error) { hubConnection.onclose(function (error) {
expect(error).toBe(undefined); expect(error).toBe(undefined);
@ -125,12 +123,11 @@ describe('hubConnection', function () {
it('rethrows an exception from the server when invoking', function (done) { it('rethrows an exception from the server when invoking', function (done) {
var errorMessage = 'An error occurred.'; var errorMessage = 'An error occurred.';
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.start().then(function () { hubConnection.start().then(function () {
hubConnection.invoke('ThrowException', errorMessage).then(function () { hubConnection.invoke('ThrowException', errorMessage).then(function () {
@ -150,12 +147,11 @@ describe('hubConnection', function () {
}); });
it('throws an exception when invoking streaming method with invoke', function (done) { it('throws an exception when invoking streaming method with invoke', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.start().then(function () { hubConnection.start().then(function () {
hubConnection.invoke('EmptyStream').then(function () { hubConnection.invoke('EmptyStream').then(function () {
@ -175,12 +171,11 @@ describe('hubConnection', function () {
}); });
it('throws an exception when receiving a streaming result for method called with invoke', function (done) { it('throws an exception when receiving a streaming result for method called with invoke', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.start().then(function () { hubConnection.start().then(function () {
hubConnection.invoke('Stream').then(function () { hubConnection.invoke('Stream').then(function () {
@ -201,12 +196,11 @@ describe('hubConnection', function () {
it('rethrows an exception from the server when streaming', function (done) { it('rethrows an exception from the server when streaming', function (done) {
var errorMessage = 'An error occurred.'; var errorMessage = 'An error occurred.';
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.start().then(function () { hubConnection.start().then(function () {
hubConnection.stream('StreamThrowException', errorMessage).subscribe({ hubConnection.stream('StreamThrowException', errorMessage).subscribe({
@ -231,12 +225,11 @@ describe('hubConnection', function () {
}); });
it('throws an exception when invoking hub method with stream', function (done) { it('throws an exception when invoking hub method with stream', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.start().then(function () { hubConnection.start().then(function () {
hubConnection.stream('Echo', '42').subscribe({ hubConnection.stream('Echo', '42').subscribe({
@ -261,12 +254,11 @@ describe('hubConnection', function () {
}); });
it('can receive server calls', function (done) { it('can receive server calls', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
var message = '你好 SignalR'; var message = '你好 SignalR';
@ -294,12 +286,11 @@ describe('hubConnection', function () {
}); });
it('can receive server calls without rebinding handler when restarted', function (done) { it('can receive server calls without rebinding handler when restarted', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
var message = '你好 SignalR'; var message = '你好 SignalR';
@ -358,28 +349,25 @@ describe('hubConnection', function () {
ServerSentEvents: 'Error occurred' ServerSentEvents: 'Error occurred'
}; };
var options = { var hubConnection = new HubConnection('http://' + document.location.host + '/uncreatable', {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection('http://' + document.location.host + '/uncreatable', options);
hubConnection.onclose(function (error) { hubConnection.onclose(function (error) {
expect(error.message).toMatch(errorRegex[signalR.TransportType[transportType]]); expect(error.message).toMatch(errorRegex[TransportType[transportType]]);
done(); done();
}); });
hubConnection.start(); hubConnection.start();
}); });
it('can handle different types', function (done) { it('can handle different types', function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
hubConnection.onclose(function (error) { hubConnection.onclose(function (error) {
expect(error).toBe(undefined); expect(error).toBe(undefined);
done(); done();
@ -389,8 +377,8 @@ describe('hubConnection', function () {
String: 'Hello, World!', String: 'Hello, World!',
IntArray: [0x01, 0x02, 0x03, 0xff], IntArray: [0x01, 0x02, 0x03, 0xff],
ByteArray: protocol.name === "json" ByteArray: protocol.name === "json"
? btoa([0xff, 0x03, 0x02, 0x01]) ? "aGVsbG8="
: new Uint8Array([0xff, 0x03, 0x02, 0x01]), : new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f]),
GUID: protocol.name === "json" GUID: protocol.name === "json"
? "00010203-0405-0607-0706-050403020100" ? "00010203-0405-0607-0706-050403020100"
: new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00]) : new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00])
@ -430,12 +418,11 @@ describe('hubConnection', function () {
it('can be restarted', function (done) { it('can be restarted', function (done) {
var message = '你好,世界!'; var message = '你好,世界!';
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
protocol: protocol, protocol: protocol,
logging: signalR.LogLevel.Trace logger: LogLevel.Trace
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
let closeCount = 0; let closeCount = 0;
hubConnection.onclose(function (error) { hubConnection.onclose(function (error) {
@ -478,51 +465,45 @@ describe('hubConnection', function () {
}); });
eachTransport(function (transportType) { eachTransport(function (transportType) {
describe(' over ' + signalR.TransportType[transportType] + ' transport', function () { describe(' over ' + TransportType[transportType] + ' transport', function () {
it('can connect to hub with authorization', function (done) { it('can connect to hub with authorization', async function (done) {
var message = '你好,世界!'; var message = '你好,世界!';
var hubConnection; var hubConnection;
getJwtToken('http://' + document.location.host + '/generateJwtToken', done, getJwtToken('http://' + document.location.host + '/generateJwtToken')
function(jwtToken) { .then(jwtToken => {
var options = { hubConnection = new HubConnection('/authorizedhub', {
transport: transportType, transport: transportType,
logging: signalR.LogLevel.Trace, logger: LogLevel.Trace,
accessToken: function () { accessToken: () => jwtToken
return jwtToken; });
}
};
hubConnection = new signalR.HubConnection('/authorizedhub', options);
hubConnection.onclose(function (error) { hubConnection.onclose(function (error) {
expect(error).toBe(undefined); expect(error).toBe(undefined);
done(); done();
}); });
hubConnection.start() return hubConnection.start();
.then(function() { })
return hubConnection.invoke('Echo', message); .then(() => {
}) return hubConnection.invoke('Echo', message)
.then(function(response) { })
expect(response).toEqual(message); .then(response => {
return hubConnection.stop(); expect(response).toEqual(message);
}) done();
.catch(function(e) { })
fail(e); .catch(err => {
done(); fail(err);
}); done();
}); });
}); });
if (transportType != signalR.TransportType.LongPolling) { if (transportType != TransportType.LongPolling) {
it("terminates if no messages received within timeout interval", function (done) { it("terminates if no messages received within timeout interval", function (done) {
var options = { var hubConnection = new HubConnection(TESTHUBENDPOINT_URL, {
transport: transportType, transport: transportType,
logging: signalR.LogLevel.Trace, logger: LogLevel.Trace,
timeoutInMilliseconds: 100 timeoutInMilliseconds: 100
}; });
var hubConnection = new signalR.HubConnection(TESTHUBENDPOINT_URL, options);
var timeout = setTimeout(200, function () { var timeout = setTimeout(200, function () {
fail("Server timeout did not fire within expected interval"); fail("Server timeout did not fire within expected interval");
@ -540,25 +521,25 @@ describe('hubConnection', function () {
}); });
}); });
function getJwtToken(url, done, callback) { function getJwtToken(url) : Promise<string> {
let xhr = new XMLHttpRequest(); return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true); xhr.open('GET', url, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send(); xhr.send();
xhr.onload = function () { xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) { if (xhr.status >= 200 && xhr.status < 300) {
callback(xhr.response || xhr.responseText); resolve(xhr.response || xhr.responseText);
} }
else { else {
fail(); reject(new Error(xhr.statusText));
done(); }
} };
};
xhr.onerror = function() { xhr.onerror = () => {
fail(); reject(new Error(xhr.statusText));
done(); }
} });
} }
}); });

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
'use strict'; import { ECHOENDPOINT_URL } from "./Common";
if (typeof WebSocket !== 'undefined') { if (typeof WebSocket !== 'undefined') {
describe('WebSockets', function () { describe('WebSockets', function () {

View File

@ -0,0 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import 'es6-promise/dist/es6-promise.auto.js';
import './ConnectionTests'
import './HubConnectionTests'
import './WebSocketTests'

View File

@ -0,0 +1,27 @@
{
"compilerOptions": {
"noImplicitAny": false,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es5",
"module": "es2015",
"outDir": "./obj/js",
"baseUrl": ".",
"paths": {
"@aspnet/signalr": [ "../signalr/dist/esm/index" ],
"@aspnet/signalr-protocol-msgpack": [ "../signalr-protocol-msgpack/dist/esm/index" ]
},
"lib": [ "es2015.promise", "es5", "dom", "es2015.collection" ]
},
"include": [
"./**/*",
"../typings/**/*",
"../signalr/dist/esm/**/*.d.ts"
],
"exclude": [
"node_modules",
"wwwroot",
"js"
]
}

View File

@ -1,4 +1,4 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -9,6 +9,7 @@
<script type="text/javascript" src="lib/jasmine/jasmine.js"></script> <script type="text/javascript" src="lib/jasmine/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine/jasmine-html.js"></script> <script type="text/javascript" src="lib/jasmine/jasmine-html.js"></script>
<script type="text/javascript" src="lib/jasmine/boot.js"></script> <script type="text/javascript" src="lib/jasmine/boot.js"></script>
<script type="text/javascript" src="lib/msgpack5/msgpack5.js"></script>
<script type="text/javascript"> <script type="text/javascript">
function getParameterByName(name, url) { function getParameterByName(name, url) {
if (!url) { if (!url) {
@ -23,22 +24,12 @@
} }
var minified = getParameterByName('release') === 'true' ? '.min' : ''; var minified = getParameterByName('release') === 'true' ? '.min' : '';
if (typeof Promise === 'undefined') { document.write(
document.write( '<script type="text/javascript" src="lib/signalr/signalr' + minified + '.js"><\/script>' +
'<script type="text/javascript" src="lib/signalr/signalr-clientES5' + minified + '.js"><\/script>' + '<script type="text/javascript" src="lib/signalr/signalr-protocol-msgpack' + minified + '.js"><\/script>');
'<script type="text/javascript" src="lib/signalr/signalr-msgpackprotocolES5' + minified + '.js"><\/script>');
}
else {
document.write(
'<script type="text/javascript" src="lib/signalr/signalr-client' + minified + '.js"><\/script>' +
'<script type="text/javascript" src="lib/signalr/signalr-msgpackprotocol' + minified + '.js"><\/script>');
}
</script> </script>
<script src="js/common.js"></script> <script src="dist/signalr-functional-tests.js"></script>
<script src="js/webSocketTests.js"></script>
<script src="js/connectionTests.js"></script>
<script src="js/hubConnectionTests.js"></script>
</head> </head>
<body> <body>

View File

@ -1,6 +0,0 @@
{
"spec_dir": "dist/test",
"spec_files": [
"./**/*[sS]pec.js"
]
}

View File

@ -1,13 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { HttpClient } from "./HttpClient"
import { TransportType, ITransport } from "./Transports"
import { ILogger, LogLevel } from "./ILogger";
export interface IHttpConnectionOptions {
httpClient?: HttpClient;
transport?: TransportType | ITransport;
logger?: ILogger | LogLevel;
accessToken?: () => string;
}

View File

@ -1,11 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { IHttpConnectionOptions } from "./IHttpConnectionOptions"
import { IHubProtocol } from "./IHubProtocol"
import { ILogger, LogLevel } from "./ILogger"
export interface IHubConnectionOptions extends IHttpConnectionOptions {
protocol?: IHubProtocol;
timeoutInMilliseconds?: number;
}

View File

@ -1,62 +0,0 @@
<Project>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<SignalRClientDistFolder>$(MSBuildThisFileDirectory)..\dist\</SignalRClientDistFolder>
<OutputFileName>aspnet-signalr-client-$(PackageVersion).tgz</OutputFileName>
</PropertyGroup>
<ItemGroup>
<Inputs Include="*.ts;" />
<Outputs Include="@(Inputs -> '$(SignalRClientDistFolder)src\%(FileName).d.ts')" />
<Outputs Include="@(Inputs -> '$(SignalRClientDistFolder)src\%(FileName).js')" />
<Outputs Include="$(SignalRClientDistFolder)browser\signalr-client.js" />
<Outputs Include="$(SignalRClientDistFolder)browser\third-party-notices.txt" />
</ItemGroup>
<ItemGroup>
<None Include="tsconfig.json" />
</ItemGroup>
<!-- this target relies on npm packages being restored manually or when running full build -->
<Target Name="BuildTSClient" Inputs="@(Inputs)" Outputs="@(Outputs)" BeforeTargets="Build">
<Exec Command="npm run gulp -- --gulpfile &quot;$(MSBuildThisFileDirectory)gulpfile.js&quot; build-ts-client" />
</Target>
<Target Name="CleanTSClient" AfterTargets="Clean">
<RemoveDir Directories="$(SignalRClientDistFolder)" />
</Target>
<Target Name="Pack">
<Message Text="Creating TypeScript client Node module" Importance="High" />
<PropertyGroup>
<IsGitRepository Condition="EXISTS('$(MSBuildThisFileDirectory)..\..\.git\HEAD')">true</IsGitRepository>
<IsGitRepository Condition="'$(IsGitRepository)'==''">false</IsGitRepository>
</PropertyGroup>
<Exec Command="npm version $(PackageVersion) --allow-same-version" WorkingDirectory="$(MSBuildThisFileDirectory)..\" />
<Exec Command="npm pack" WorkingDirectory="$(MSBuildThisFileDirectory)..\" />
<Exec Command="git checkout HEAD -- &quot;$(MSBuildThisFileDirectory)../package.json&quot;" Condition="$(IsGitRepository)" />
<Exec Command="git checkout HEAD -- &quot;$(MSBuildThisFileDirectory)../package-lock.json&quot;" Condition="$(IsGitRepository)" />
<Move SourceFiles="$(MSBuildThisFileDirectory)..\$(OutputFileName)" DestinationFolder="$(PackageOutputPath)" />
</Target>
<!-- Provides information to the bill of materials about expected outputs. -->
<Target Name="GetNpmArtifactInfo" BeforeTargets="GetArtifactInfo" Returns="@(ArtifactInfo)">
<ItemGroup>
<ArtifactInfo Include="$(PackageOutputPath)$(OutputFileName)">
<ArtifactType>NpmPackage</ArtifactType>
<PackageId>@aspnet/signalr-client</PackageId>
<Version>$(PackageVersion)</Version>
</ArtifactInfo>
</ItemGroup>
</Target>
</Project>

View File

@ -1,77 +0,0 @@
const gulp = require('gulp');
const browserify = require('browserify');
const ts = require('gulp-typescript');
const source = require('vinyl-source-stream');
const buffer = require('vinyl-buffer');
const del = require('del');
const rename = require('gulp-rename');
const babel = require('gulp-babel');
const tsProject = ts.createProject('./tsconfig.json');
const clientOutDir = tsProject.options.outDir;
const browserOutDir = clientOutDir + '/../browser/';
gulp.task('clean', () => {
return del([clientOutDir + '/..'], { force: true });
});
gulp.task('compile-ts-client', () => {
return tsProject.src()
.pipe(tsProject())
.pipe(gulp.dest(clientOutDir));
});
function browserifyModule(sourceFileName, namespace, targetFileName) {
return browserify(clientOutDir + '/' + sourceFileName, {standalone: namespace})
.bundle()
.pipe(source(targetFileName))
.pipe(gulp.dest(browserOutDir))
.pipe(buffer())
.pipe(rename({ extname: '.min.js' }))
.pipe(babel({presets: ['minify']}))
.pipe(gulp.dest(browserOutDir));
}
function browserifyModuleES5(sourceFileName, namespace, targetFileName, hasAsync) {
let babelOptions = { presets: ['es2015'] };
if (hasAsync) {
babelOptions.plugins = ['transform-runtime'];
}
return browserify(clientOutDir + '/' + sourceFileName, {standalone: namespace})
.transform('babelify', { presets: ['es2015'], plugins: ['transform-runtime'] })
.bundle()
.pipe(source(targetFileName))
.pipe(gulp.dest(browserOutDir))
.pipe(buffer())
.pipe(rename({ extname: '.min.js' }))
.pipe(babel({presets: ['minify']}))
.pipe(gulp.dest(browserOutDir));
}
gulp.task('browserify-client', ['compile-ts-client'], () => {
return browserifyModule('HubConnection.js', 'signalR', 'signalr-client.js');
});
gulp.task('browserify-msgpackprotocol', ['compile-ts-client'], () => {
return browserifyModule('MessagePackHubProtocol.js', 'signalRMsgPack', 'signalr-msgpackprotocol.js');
});
gulp.task('browserify-clientES5', ['compile-ts-client'], () => {
return browserifyModuleES5('HubConnection.js', 'signalR', 'signalr-clientES5.js', /*hasAsync*/ true);
});
gulp.task('browserify-msgpackprotocolES5', ['compile-ts-client'], () => {
return browserifyModuleES5('MessagePackHubProtocol.js', 'signalRMsgPack', 'signalr-msgpackprotocolES5.js', /*hasAsync*/ false);
});
gulp.task('browserify', [ 'browserify-client', 'browserify-msgpackprotocol', 'browserify-clientES5', 'browserify-msgpackprotocolES5']);
gulp.task('build-ts-client', ['clean', 'compile-ts-client', 'browserify'], () => {
return gulp.src('./third-party-notices.txt')
.pipe(gulp.dest(browserOutDir));
});
gulp.task('default', ['build-ts-client']);

View File

@ -1,19 +0,0 @@
{
"compileOnSave": true,
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true,
"outDir": "../dist/src",
"declaration": true
},
"include": [
"./**/*",
"../typings/*"
]
}

View File

@ -1,27 +0,0 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60249/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Microsoft.AspNetCore.SignalR.Test.Server": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5000/"
}
}
}

View File

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>SignalR Tests</title>
</head>
<body>
<h1>SignalR Tests</h1>
<ul>
<li><a href="connectionTests.html">Connection Tests</a></li>
</ul>
</body>
</html>

View File

@ -1,39 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
"use strict";
var ECHOENDPOINT_URL = "http://" + document.location.host + "/echo";
function getTransportTypes() {
var transportTypes = [];
if (typeof WebSocket !== "undefined") {
transportTypes.push(signalR.TransportType.WebSockets);
}
if (typeof EventSource !== "undefined") {
transportTypes.push(signalR.TransportType.ServerSentEvents);
}
transportTypes.push(signalR.TransportType.LongPolling);
return transportTypes;
}
function eachTransport(action) {
getTransportTypes().forEach(function (t) {
return action(t);
});
}
function eachTransportAndProtocol(action) {
var protocols = [new signalR.JsonHubProtocol()];
// IE9 does not support XmlHttpRequest advanced features so disable for now
// This can be enabled if we fix: https://github.com/aspnet/SignalR/issues/742
if (typeof new XMLHttpRequest().responseType === "string") {
protocols.push(new signalRMsgPack.MessagePackHubProtocol());
}
getTransportTypes().forEach(function (t) {
return protocols.forEach(function (p) {
return action(t, p);
});
});
}

File diff suppressed because it is too large Load Diff

View File

@ -1,47 +1,24 @@
{ {
"name": "@aspnet/signalr-client", "name": "client-ts",
"version": "1.0.0-preview1-t000", "version": "0.0.0",
"description": "ASP.NET Core SignalR", "description": "Common dev-time dependencies for SignalR NPM packages. NOT FOR PUBLISHING",
"main": "dist/src/index.js", "main": "index.js",
"typings": "dist/src/index.d.ts",
"directories": {
"test": "test"
},
"scripts": { "scripts": {
"gulp": "gulp", "build": "cd ./signalr && npm run build && cd ../signalr-protocol-msgpack && npm run build",
"pretest": "tsc -p Microsoft.AspNetCore.SignalR.Client.TS.Tests", "test": "cd ./signalr && npm run test && cd ../signalr-protocol-msgpack && npm run test"
"test": "jasmine JASMINE_CONFIG_PATH=Microsoft.AspNetCore.SignalR.Client.TS.Tests/jasmine.json"
},
"repository": {
"type": "git",
"url": "git+https://github.com/aspnet/SignalR.git"
}, },
"author": "Microsoft", "author": "Microsoft",
"license": "Apache-2.0", "license": "Apache-2.0",
"bugs": {
"url": "https://github.com/aspnet/SignalR/issues"
},
"homepage": "https://github.com/aspnet/SignalR#readme",
"devDependencies": { "devDependencies": {
"@types/msgpack5": "^3.4.0", "@types/jasmine": "^2.8.3",
"babel-minify": "^0.2.0", "@types/node": "^8.5.2",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-es2015": "^6.24.1",
"babelify": "^7.3.0",
"browserify": "^13.1.1",
"buffer": "^5.0.7",
"del": "^2.2.2",
"gulp": "^3.9.1",
"gulp-babel": "^7.0.0",
"gulp-rename": "^1.2.2",
"gulp-typescript": "^3.1.3",
"jasmine": "^2.8.0", "jasmine": "^2.8.0",
"lodash": "^4.17.4", "rimraf": "^2.6.2",
"typescript": "^2.0.10", "rollup": "^0.53.4",
"vinyl-buffer": "^1.0.0", "rollup-plugin-commonjs": "^8.2.6",
"vinyl-source-stream": "^1.1.0" "rollup-plugin-node-resolve": "^3.0.2",
}, "rollup-plugin-sourcemaps": "^0.4.2",
"dependencies": { "typescript": "^2.6.2",
"msgpack5": "^3.6.0" "uglify-js": "^3.3.5"
} }
} }

58
client-ts/rollup-base.js Normal file
View File

@ -0,0 +1,58 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import path from 'path';
import resolve from 'rollup-plugin-node-resolve'
import sourceMaps from 'rollup-plugin-sourcemaps'
import commonjs from 'rollup-plugin-commonjs'
let polyfills = [ 'es6-promise', 'buffer', 'base64-js', 'ieee754' ];
let allowed_externals = [ ];
export default function(rootDir, moduleGlobals) {
let pkg = require(path.join(rootDir, "package.json"));
return {
input: path.join(rootDir, "dist", "cjs", "browser-index.js"),
output: {
file: pkg.browser,
format: "umd",
name: pkg.umd_name,
sourcemap: true,
banner: "/* @license\r\n" +
" * Copyright (c) .NET Foundation. All rights reserved.\r\n" +
" * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n" +
"*/",
globals: moduleGlobals,
},
external: function (m) {
let match = m.match(/node_modules/);
if (match) {
let moduleName = m.substring(match.index + "node_modules".length + 1);
let slashIndex = moduleName.indexOf('/');
if(slashIndex < 0) {
slashIndex = moduleName.indexOf('\\');
}
moduleName = moduleName.substring(0, slashIndex);
if(polyfills.indexOf(moduleName) >= 0) {
// This is a polyfill
console.log(`Importing polyfill: ${m}`);
return false;
}
else if(!allowed_externals.indexOf(moduleName)) {
console.log(`WARNING: External module '${m}' in use.`);
}
return true;
}
return false;
},
plugins: [
commonjs(),
resolve({
preferBuiltins: false
}),
sourceMaps()
]
}
}

View File

@ -0,0 +1,46 @@
MsgPack support for SignalR for ASP.NET Core
## Installation
```bash
npm install @aspnet/signalr-protocol-msgpack
```
## Usage
### Browser
To use the client in a browser, copy `*.js` files from the `dist/browser` folder to your script folder include on your page using the `<script>` tag.
### Example (Browser)
```JavaScript
let connection = new signalR.HubConnection('/chat', {
protocol: new signalR.protocol.msgpack.MessagePackHubProtocol()
});
connection.on('send', data => {
console.log(data);
});
connection.start()
.then(() => connection.invoke('send', 'Hello'));
```
### Example (NodeJS)
```JavaScript
const signalR = require("@aspnet/signalr");
const signalRMsgPack = require("@aspnet/signalr-protocol-msgpack");
let connection = new signalR.HubConnection('/chat', {
protocol: new signalRMsgPack.MessagePackHubProtocol()
});
connection.on('send', data => {
console.log(data);
});
connection.start()
.then(() => connection.invoke('send', 'Hello'));
```

View File

@ -0,0 +1,125 @@
{
"name": "@aspnet/signalr-protocol-msgpack",
"version": "1.0.0-preview1-t000",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/bl": {
"version": "0.8.31",
"resolved": "https://registry.npmjs.org/@types/bl/-/bl-0.8.31.tgz",
"integrity": "sha512-EiFdEaD7EQNFl4PDBvlbPlX4hV8rJhEKfFj58jkjqvj1gN6E1lShu24cXeWH/RQ5nf+/ei4WGp70xp2ubBaE5Q==",
"dev": true,
"requires": {
"@types/node": "8.5.5"
}
},
"@types/msgpack5": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/@types/msgpack5/-/msgpack5-3.4.1.tgz",
"integrity": "sha512-E3wILUjTXONukpiI6tmqpLwf7eV3MVTdxpjz56FqNn7koMF/6sSPUh5TxMlwgoOhyeejxwVoNZUiDcdqChKkAw==",
"dev": true,
"requires": {
"@types/bl": "0.8.31"
}
},
"@types/node": {
"version": "8.5.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.5.tgz",
"integrity": "sha512-JRnfoh0Ll4ElmIXKxbUfcOodkGvcNHljct6mO1X9hE/mlrMzAx0hYCLAD7sgT53YAY1HdlpzUcV0CkmDqUqTuA==",
"dev": true
},
"base64-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
"integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==",
"dev": true
},
"bl": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
"integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
"requires": {
"readable-stream": "2.3.3"
}
},
"buffer": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz",
"integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==",
"dev": true,
"requires": {
"base64-js": "1.2.1",
"ieee754": "1.1.8"
}
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"ieee754": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
"integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
"dev": true
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"msgpack5": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/msgpack5/-/msgpack5-4.0.1.tgz",
"integrity": "sha512-Wx+c6YEE5UMrVrDQuFSIseprjgfeAvMYD35klSKm1xNCvtFI5KICfRmwKMc0Wmu7BknXUA3DUhFWugyCwTsRsg==",
"requires": {
"bl": "1.2.1",
"inherits": "2.0.3",
"readable-stream": "2.3.3",
"safe-buffer": "5.1.1"
}
},
"process-nextick-args": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
"readable-stream": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
"isarray": "1.0.0",
"process-nextick-args": "1.0.7",
"safe-buffer": "5.1.1",
"string_decoder": "1.0.3",
"util-deprecate": "1.0.2"
}
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"requires": {
"safe-buffer": "5.1.1"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
}
}
}

View File

@ -0,0 +1,51 @@
{
"name": "@aspnet/signalr-protocol-msgpack",
"version": "1.0.0-preview1-t000",
"description": "MsgPack Protocol support for ASP.NET Core SignalR",
"main": "./dist/cjs/index.js",
"browser": "./dist/browser/signalr-protocol-msgpack.js",
"module": "./dist/esm/index.js",
"typings": "./dist/esm/index.d.ts",
"umd_name": "signalR.protocols.msgpack",
"directories": {
"test": "spec"
},
"scripts": {
"clean": "node ../node_modules/rimraf/bin.js ./dist",
"build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:browser && npm run build:uglify",
"build:esm": "node ../node_modules/typescript/bin/tsc --project ./tsconfig.json --module es2015 --outDir ./dist/esm --target ES2015 -d",
"build:cjs": "node ../node_modules/typescript/bin/tsc --project ./tsconfig.json --module commonjs --outDir ./dist/cjs --target ES5",
"build:browser": "node ../node_modules/rollup/bin/rollup -c",
"build:uglify": "node ../node_modules/uglify-js/bin/uglifyjs --source-map \"url='signalr-protocol-msgpack.min.js.map',content='./dist/browser/signalr-protocol-msgpack.js.map'\" --comments -o ./dist/browser/signalr-protocol-msgpack.min.js ./dist/browser/signalr-protocol-msgpack.js",
"pretest": "node ../node_modules/rimraf/bin.js ./spec/obj && tsc --project ./spec/tsconfig.json",
"test": "node ../node_modules/jasmine/bin/jasmine.js ./spec/obj/signalr-protocol-msgpack/spec/**/*.spec.js"
},
"keywords": [
"signalr",
"aspnetcore"
],
"repository": {
"type": "git",
"url": "git+https://github.com/aspnet/SignalR.git"
},
"author": "Microsoft",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/aspnet/SignalR/issues"
},
"homepage": "https://github.com/aspnet/SignalR#readme",
"files": [
"dist/**/*",
"src/**/*"
],
"peerDependencies": {
"@aspnet/signalr": "^1.0.0-preview1"
},
"dependencies": {
"msgpack5": "^4.0.1"
},
"devDependencies": {
"@types/msgpack5": "^3.4.1",
"buffer": "^5.0.8"
}
}

View File

@ -0,0 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import baseConfig from "../rollup-base"
export default baseConfig(__dirname, {
msgpack5: "msgpack5"
});

View File

@ -1,31 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { TextMessageFormat, BinaryMessageFormat } from "../Microsoft.AspNetCore.SignalR.Client.TS/Formatters" import { BinaryMessageFormat } from "../src/BinaryMessageFormat"
describe("Text Message Formatter", () => {
([
["\u001e", [""]],
["\u001e\u001e", ["", ""]],
["Hello\u001e", ["Hello"]],
["Hello,\u001eWorld!\u001e", ["Hello,", "World!"]],
] as [[string, string[]]]).forEach(([payload, expected_messages]) => {
it(`should parse '${payload}' correctly`, () => {
let messages = TextMessageFormat.parse(payload);
expect(messages).toEqual(expected_messages);
})
});
([
["", new Error("Message is incomplete.")],
["ABC", new Error("Message is incomplete.")],
["ABC\u001eXYZ", new Error("Message is incomplete.")],
] as [[string, Error]]).forEach(([payload, expected_error]) => {
it(`should fail to parse '${payload}'`, () => {
expect(() => TextMessageFormat.parse(payload)).toThrow(expected_error);
});
});
});
describe("Binary Message Formatter", () => { describe("Binary Message Formatter", () => {
([ ([
@ -34,7 +10,7 @@ describe("Binary Message Formatter", () => {
[[0x01, 0xff], <Uint8Array[]>[ new Uint8Array([0xff])]], [[0x01, 0xff], <Uint8Array[]>[ new Uint8Array([0xff])]],
[[0x01, 0xff, [[0x01, 0xff,
0x01, 0x7f], <Uint8Array[]>[ new Uint8Array([0xff]), new Uint8Array([0x7f])]], 0x01, 0x7f], <Uint8Array[]>[ new Uint8Array([0xff]), new Uint8Array([0x7f])]],
] as [[number[], Uint8Array[]]]).forEach(([payload, expected_messages]) => { ] as [number[], Uint8Array[]][]).forEach(([payload, expected_messages]) => {
it(`should parse '${payload}' correctly`, () => { it(`should parse '${payload}' correctly`, () => {
let messages = BinaryMessageFormat.parse(new Uint8Array(payload).buffer); let messages = BinaryMessageFormat.parse(new Uint8Array(payload).buffer);
expect(messages).toEqual(expected_messages); expect(messages).toEqual(expected_messages);
@ -51,7 +27,7 @@ describe("Binary Message Formatter", () => {
[[0x80, 0x80, 0x80, 0x80, 0x80], new Error("Messages bigger than 2GB are not supported.")], [[0x80, 0x80, 0x80, 0x80, 0x80], new Error("Messages bigger than 2GB are not supported.")],
[[0x02, 0x00], new Error("Incomplete message.")], [[0x02, 0x00], new Error("Incomplete message.")],
[[0xff, 0xff, 0xff, 0xff, 0x07], new Error("Incomplete message.")] [[0xff, 0xff, 0xff, 0xff, 0x07], new Error("Incomplete message.")]
] as [[number[], Error]]).forEach(([payload, expected_error]) => { ] as [number[], Error][]).forEach(([payload, expected_error]) => {
it(`should fail to parse '${payload}'`, () => { it(`should fail to parse '${payload}'`, () => {
expect(() => BinaryMessageFormat.parse(new Uint8Array(payload).buffer)).toThrow(expected_error); expect(() => BinaryMessageFormat.parse(new Uint8Array(payload).buffer)).toThrow(expected_error);
}) })
@ -60,7 +36,7 @@ describe("Binary Message Formatter", () => {
([ ([
[[], [0x00]], [[], [0x00]],
[[0x20], [0x01, 0x20]], [[0x20], [0x01, 0x20]],
] as [[number[], number[]]]).forEach(([input, expected_payload]) => { ] as [number[], number[]][]).forEach(([input, expected_payload]) => {
it(`should write '${input}'`, () => { it(`should write '${input}'`, () => {
let actual = new Uint8Array(BinaryMessageFormat.write(new Uint8Array(input))); let actual = new Uint8Array(BinaryMessageFormat.write(new Uint8Array(input)));
let expected = new Uint8Array(expected_payload); let expected = new Uint8Array(expected_payload);
@ -80,5 +56,4 @@ describe("Binary Message Formatter", () => {
}) })
}); });
});
});

View File

@ -1,8 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { MessagePackHubProtocol } from "../Microsoft.AspNetCore.SignalR.Client.TS/MessagePackHubProtocol" import { MessagePackHubProtocol } from "../src/MessagePackHubProtocol"
import { MessageType, InvocationMessage, CompletionMessage, ResultMessage } from "../Microsoft.AspNetCore.SignalR.Client.TS/IHubProtocol" import { MessageType, InvocationMessage, CompletionMessage, ResultMessage } from "@aspnet/signalr"
describe("MessageHubProtocol", () => { describe("MessageHubProtocol", () => {
it("can write/read non-blocking Invocation message", () => { it("can write/read non-blocking Invocation message", () => {
@ -52,7 +52,7 @@ describe("MessageHubProtocol", () => {
error: null, error: null,
result: null result: null
} as CompletionMessage] } as CompletionMessage]
] as [[number[], CompletionMessage]]).forEach(([payload, expected_message]) => ] as [number[], CompletionMessage][]).forEach(([payload, expected_message]) =>
it("can read Completion message", () => { it("can read Completion message", () => {
let messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); let messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer);
expect(messages).toEqual([expected_message]); expect(messages).toEqual([expected_message]);
@ -83,7 +83,7 @@ describe("MessageHubProtocol", () => {
[[0x05, 0x94, 0x03, 0xa0, 0x02, 0x00], new Error("Invalid payload for Completion message.")], [[0x05, 0x94, 0x03, 0xa0, 0x02, 0x00], new Error("Invalid payload for Completion message.")],
[[0x04, 0x93, 0x03, 0xa0, 0x01], new Error("Invalid payload for Completion message.")], [[0x04, 0x93, 0x03, 0xa0, 0x01], new Error("Invalid payload for Completion message.")],
[[0x04, 0x93, 0x03, 0xa0, 0x03], new Error("Invalid payload for Completion message.")] [[0x04, 0x93, 0x03, 0xa0, 0x03], new Error("Invalid payload for Completion message.")]
] as [[number[], Error]]).forEach(([payload, expected_error]) => ] as [number[], Error][]).forEach(([payload, expected_error]) =>
it("throws for invalid messages", () => { it("throws for invalid messages", () => {
expect(() => new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer)) expect(() => new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer))
.toThrow(expected_error); .toThrow(expected_error);
@ -122,4 +122,4 @@ describe("MessageHubProtocol", () => {
} }
]) ])
}) })
}); });

View File

@ -0,0 +1,18 @@
{
"compileOnSave": false,
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"moduleResolution": "node",
"outDir": "./obj",
"lib": [ "es2015", "dom" ],
"baseUrl": ".",
"paths": {
"@aspnet/signalr": [ "../../signalr/src/index" ]
}
},
"include": [
"./**/*",
"../../typings/**/*"
]
}

View File

@ -1,31 +1,12 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
export namespace TextMessageFormat { export class BinaryMessageFormat {
const RecordSeparator = String.fromCharCode(0x1e);
export function write(output: string): string {
return `${output}${RecordSeparator}`;
}
export function parse(input: string): string[] {
if (input[input.length - 1] != RecordSeparator) {
throw new Error("Message is incomplete.");
}
let messages = input.split(RecordSeparator);
messages.pop();
return messages;
}
}
export namespace BinaryMessageFormat {
// The length prefix of binary messages is encoded as VarInt. Read the comment in // The length prefix of binary messages is encoded as VarInt. Read the comment in
// the BinaryMessageParser.TryParseMessage for details. // the BinaryMessageParser.TryParseMessage for details.
export function write(output: Uint8Array): ArrayBuffer { static write(output: Uint8Array): ArrayBuffer {
// msgpack5 uses returns Buffer instead of Uint8Array on IE10 and some other browser // msgpack5 uses returns Buffer instead of Uint8Array on IE10 and some other browser
// in which case .byteLength does will be undefined // in which case .byteLength does will be undefined
let size = output.byteLength || output.length; let size = output.byteLength || output.length;
@ -51,7 +32,7 @@ export namespace BinaryMessageFormat {
return buffer.buffer; return buffer.buffer;
} }
export function parse(input: ArrayBuffer): Uint8Array[] { static parse(input: ArrayBuffer): Uint8Array[] {
let result: Uint8Array[] = []; let result: Uint8Array[] = [];
let uint8Array = new Uint8Array(input); let uint8Array = new Uint8Array(input);
const maxLengthPrefixSize = 5; const maxLengthPrefixSize = 5;

View File

@ -1,9 +1,10 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { IHubProtocol, ProtocolType, MessageType, HubMessage, InvocationMessage, ResultMessage, CompletionMessage, StreamInvocationMessage } from "./IHubProtocol"; import { IHubProtocol, ProtocolType, MessageType, HubMessage, InvocationMessage, ResultMessage, CompletionMessage, StreamInvocationMessage } from "@aspnet/signalr";
import { BinaryMessageFormat } from "./Formatters" import { BinaryMessageFormat } from "./BinaryMessageFormat"
import * as msgpack5 from "msgpack5" import { Buffer } from 'buffer';
import * as msgpack5 from "msgpack5";
export class MessagePackHubProtocol implements IHubProtocol { export class MessagePackHubProtocol implements IHubProtocol {
@ -151,4 +152,4 @@ export class MessagePackHubProtocol implements IHubProtocol {
return BinaryMessageFormat.write(payload.slice()); return BinaryMessageFormat.write(payload.slice());
} }
} }

View File

@ -0,0 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// This is where we add any polyfills we'll need for the browser. It is the entry module for browser-specific builds.
export * from './index'

View File

@ -0,0 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
export { MessagePackHubProtocol } from "./MessagePackHubProtocol";

View File

@ -8,6 +8,85 @@ bring it to our attention. Post an issue or email us:
The attached notices are provided for information only. The attached notices are provided for information only.
License notice for buffer
------------------------------------------------------------------------------
"The MIT License (MIT)
Copyright (c) Feross Aboukhadijeh, and other contributors.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE."
License notice for base64-js
------------------------------------------------------------------------------
"The MIT License (MIT)
Copyright (c) 2014
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE."
License notice for ieee754
------------------------------------------------------------------------------
"Copyright (c) 2008, Fair Oaks Labs, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE."
License notice for msgpack5 License notice for msgpack5
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

View File

@ -0,0 +1,15 @@
{
"extends": "../tsconfig-base.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@aspnet/signalr": [
"../signalr"
]
}
},
"include": [
"./src/**/*",
"../typings/**/*"
]
}

View File

@ -20,7 +20,7 @@ The following polyfills are required to use the client in Node.js applications:
- `EventSource` - to use the ServerSentEvents transport - `EventSource` - to use the ServerSentEvents transport
- `btoa/atob` - to use binary protocols (e.g. MessagePack) over text transports (ServerSentEvents) - `btoa/atob` - to use binary protocols (e.g. MessagePack) over text transports (ServerSentEvents)
### Example ### Example (Browser)
```JavaScript ```JavaScript
let connection = new signalR.HubConnection('/chat'); let connection = new signalR.HubConnection('/chat');
@ -29,6 +29,21 @@ connection.on('send', data => {
console.log(data); console.log(data);
}); });
connection.start()
.then(() => connection.invoke('send', 'Hello'));
```
### Example (NodeJS)
```JavaScript
const signalR = require("@aspnet/signalR");
let connection = new signalR.HubConnection('/chat');
connection.on('send', data => {
console.log(data);
});
connection.start() connection.start()
.then(() => connection.invoke('send', 'Hello')); .then(() => connection.invoke('send', 'Hello'));
``` ```

View File

@ -0,0 +1,8 @@
// Edit the index.d.ts file to add the UMD export
const fs = require('fs');
const path = require('path');
const target = path.resolve(__dirname, "..", "dist", "esm", "index.d.ts");
let content = fs.readFileSync(target);
fs.writeFileSync(target, content + "\r\nexport as namespace signalR;");

14
client-ts/signalr/package-lock.json generated Normal file
View File

@ -0,0 +1,14 @@
{
"name": "@aspnet/signalr",
"version": "1.0.0-preview1-t000",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"es6-promise": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.2.tgz",
"integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==",
"dev": true
}
}
}

View File

@ -0,0 +1,40 @@
{
"name": "@aspnet/signalr",
"version": "1.0.0-preview1-t000",
"description": "ASP.NET Core SignalR Client",
"main": "./dist/cjs/index.js",
"browser": "./dist/browser/signalr.js",
"module": "./dist/esm/index.js",
"typings": "./dist/esm/index.d.ts",
"umd_name": "signalR",
"directories": {
"test": "spec"
},
"scripts": {
"clean": "node ../node_modules/rimraf/bin.js ./dist ./.rpt2_cache",
"build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:browser && npm run build:uglify",
"build:esm": "node ../node_modules/typescript/bin/tsc --project ./tsconfig.json --module es2015 --outDir ./dist/esm --target ES2015 -d && node ./build/process-dts.js",
"build:cjs": "node ../node_modules/typescript/bin/tsc --project ./tsconfig.json --module commonjs --outDir ./dist/cjs --target ES5",
"build:browser": "node ../node_modules/rollup/bin/rollup -c",
"build:uglify": "node ../node_modules/uglify-js/bin/uglifyjs --source-map \"url='signalr.min.js.map',content='./dist/browser/signalr.js.map'\" --comments -o ./dist/browser/signalr.min.js ./dist/browser/signalr.js",
"pretest": "node ../node_modules/rimraf/bin.js ./spec/obj && tsc --project ./spec/tsconfig.json",
"test": "node ../node_modules/jasmine/bin/jasmine.js ./spec/obj/spec/**/*.spec.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/aspnet/SignalR.git"
},
"author": "Microsoft",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/aspnet/SignalR/issues"
},
"homepage": "https://github.com/aspnet/SignalR#readme",
"files": [
"dist/**/*",
"src/**/*"
],
"devDependencies": {
"es6-promise": "^4.2.2"
}
}

View File

@ -0,0 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import baseConfig from "../rollup-base"
export default baseConfig(__dirname);

View File

@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { asyncit as it } from "./Utils"; import { asyncit as it } from "./Utils";
import { AbortController } from "../Microsoft.AspNetCore.SignalR.Client.TS/AbortController"; import { AbortController } from "../src/AbortController";
describe("AbortSignal", () => { describe("AbortSignal", () => {
describe("aborted", () => { describe("aborted", () => {

View File

@ -1,8 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { Base64EncodedHubProtocol } from "../Microsoft.AspNetCore.SignalR.Client.TS/Base64EncodedHubProtocol" import { Base64EncodedHubProtocol } from "../src/Base64EncodedHubProtocol"
import { IHubProtocol, HubMessage, ProtocolType } from "../Microsoft.AspNetCore.SignalR.Client.TS/IHubProtocol" import { IHubProtocol, HubMessage, ProtocolType } from "../src/IHubProtocol"
class FakeHubProtocol implements IHubProtocol { class FakeHubProtocol implements IHubProtocol {
name: "fakehubprotocol"; name: "fakehubprotocol";
@ -36,7 +36,7 @@ describe("Base64EncodedHubProtocol", () => {
["1.0:A;", new Error("Invalid length: '1.0'")], ["1.0:A;", new Error("Invalid length: '1.0'")],
["2:A;", new Error("Invalid message size.")], ["2:A;", new Error("Invalid message size.")],
["2:ABC;", new Error("Invalid message size.")], ["2:ABC;", new Error("Invalid message size.")],
] as [[string, Error]]).forEach(([payload, expected_error]) => { ] as [string, Error][]).forEach(([payload, expected_error]) => {
it(`should fail to parse '${payload}'`, () => { it(`should fail to parse '${payload}'`, () => {
expect(() => new Base64EncodedHubProtocol(new FakeHubProtocol()).parseMessages(payload)).toThrow(expected_error); expect(() => new Base64EncodedHubProtocol(new FakeHubProtocol()).parseMessages(payload)).toThrow(expected_error);
}); });
@ -59,7 +59,7 @@ describe("Base64EncodedHubProtocol", () => {
([ ([
[{}, "2:{};"], [{}, "2:{};"],
] as [[any, string]]).forEach(([message, payload]) => { ] as [any, string][]).forEach(([message, payload]) => {
it(`should be able to write '${JSON.stringify(message)}'`, () => { it(`should be able to write '${JSON.stringify(message)}'`, () => {
let globalAny: any = global; let globalAny: any = global;

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { ITransport, TransportType } from "../Microsoft.AspNetCore.SignalR.Client.TS/Transports" import { ITransport, TransportType } from "../src/Transports"
export function eachTransport(action: (transport: TransportType) => void) { export function eachTransport(action: (transport: TransportType) => void) {
let transportTypes = [ let transportTypes = [

View File

@ -3,7 +3,7 @@
import { asyncit as it } from "./Utils" import { asyncit as it } from "./Utils"
import { TestHttpClient } from "./TestHttpClient"; import { TestHttpClient } from "./TestHttpClient";
import { HttpRequest } from "../Microsoft.AspNetCore.SignalR.Client.TS/index"; import { HttpRequest } from "../src/index";
describe("HttpClient", () => { describe("HttpClient", () => {
describe("get", () => { describe("get", () => {

View File

@ -2,12 +2,12 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { TestHttpClient } from "./TestHttpClient" import { TestHttpClient } from "./TestHttpClient"
import { HttpConnection } from "../Microsoft.AspNetCore.SignalR.Client.TS/HttpConnection" import { HttpConnection } from "../src/HttpConnection"
import { IHttpConnectionOptions } from "../Microsoft.AspNetCore.SignalR.Client.TS/IHttpConnectionOptions" import { IHttpConnectionOptions } from "../src/HttpConnection"
import { DataReceived, TransportClosed } from "../Microsoft.AspNetCore.SignalR.Client.TS/Common" import { DataReceived, TransportClosed } from "../src/Common"
import { ITransport, TransportType, TransferMode } from "../Microsoft.AspNetCore.SignalR.Client.TS/Transports" import { ITransport, TransportType, TransferMode } from "../src/Transports"
import { eachTransport, eachEndpointUrl } from "./Common"; import { eachTransport, eachEndpointUrl } from "./Common";
import { HttpResponse } from "../Microsoft.AspNetCore.SignalR.Client.TS/index"; import { HttpResponse } from "../src/index";
describe("HttpConnection", () => { describe("HttpConnection", () => {
it("cannot be created with relative url if document object is not present", () => { it("cannot be created with relative url if document object is not present", () => {

View File

@ -1,17 +1,17 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { IConnection } from "../Microsoft.AspNetCore.SignalR.Client.TS/IConnection" import { IConnection } from "../src/IConnection"
import { HubConnection } from "../Microsoft.AspNetCore.SignalR.Client.TS/HubConnection" import { HubConnection } from "../src/HubConnection"
import { DataReceived, ConnectionClosed } from "../Microsoft.AspNetCore.SignalR.Client.TS/Common" import { DataReceived, ConnectionClosed } from "../src/Common"
import { TransportType, ITransport, TransferMode } from "../Microsoft.AspNetCore.SignalR.Client.TS/Transports" import { TransportType, ITransport, TransferMode } from "../src/Transports"
import { Observer } from "../Microsoft.AspNetCore.SignalR.Client.TS/Observable" import { Observer } from "../src/Observable"
import { TextMessageFormat } from "../Microsoft.AspNetCore.SignalR.Client.TS/Formatters" import { TextMessageFormat } from "../src/TextMessageFormat"
import { ILogger, LogLevel } from "../Microsoft.AspNetCore.SignalR.Client.TS/ILogger" import { ILogger, LogLevel } from "../src/ILogger"
import { MessageType } from "../Microsoft.AspNetCore.SignalR.Client.TS/IHubProtocol" import { MessageType } from "../src/IHubProtocol"
import { asyncit as it, captureException, delay, PromiseSource } from './Utils'; import { asyncit as it, captureException, delay, PromiseSource } from './Utils';
import { IHubConnectionOptions } from "../Microsoft.AspNetCore.SignalR.Client.TS/IHubConnectionOptions"; import { IHubConnectionOptions } from "../src/HubConnection";
describe("HubConnection", () => { describe("HubConnection", () => {
@ -150,7 +150,7 @@ describe("HubConnection", () => {
it("callback invoked when servers invokes a method on the client", async () => { it("callback invoked when servers invokes a method on the client", async () => {
let connection = new TestConnection(); let connection = new TestConnection();
let hubConnection = new HubConnection(connection, { logger: null }); let hubConnection = new HubConnection(connection, { logger: null });
let value = 0; let value = "";
hubConnection.on("message", v => value = v); hubConnection.on("message", v => value = v);
connection.receive({ connection.receive({
@ -539,7 +539,7 @@ class TestConnection implements IConnection {
onreceive: DataReceived; onreceive: DataReceived;
onclose: ConnectionClosed; onclose: ConnectionClosed;
sentData: [any]; sentData: any[];
lastInvocationId: string; lastInvocationId: string;
}; };

View File

@ -1,8 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { LoggerFactory } from "../Microsoft.AspNetCore.SignalR.Client.TS/Loggers" import { LoggerFactory } from "../src/Loggers"
import { ILogger, LogLevel } from "../Microsoft.AspNetCore.SignalR.Client.TS/ILogger" import { ILogger, LogLevel } from "../src/ILogger"
describe("LoggerFactory", () => { describe("LoggerFactory", () => {
it("creates ConsoleLogger when no logging specified", () => { it("creates ConsoleLogger when no logging specified", () => {

View File

@ -1,7 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { HttpClient, HttpRequest, HttpResponse } from "../Microsoft.AspNetCore.SignalR.Client.TS/HttpClient" import { HttpClient, HttpRequest, HttpResponse } from "../src/HttpClient"
type TestHttpHandlerResult = HttpResponse | string; type TestHttpHandlerResult = HttpResponse | string;
export type TestHttpHandler = (request: HttpRequest, next?: (request: HttpRequest) => Promise<HttpResponse>) => Promise<TestHttpHandlerResult> | TestHttpHandlerResult; export type TestHttpHandler = (request: HttpRequest, next?: (request: HttpRequest) => Promise<HttpResponse>) => Promise<TestHttpHandlerResult> | TestHttpHandlerResult;

View File

@ -0,0 +1,28 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { TextMessageFormat } from "../src/TextMessageFormat"
describe("Text Message Formatter", () => {
([
["\u001e", [""]],
["\u001e\u001e", ["", ""]],
["Hello\u001e", ["Hello"]],
["Hello,\u001eWorld!\u001e", ["Hello,", "World!"]],
] as [string, string[]][]).forEach(([payload, expected_messages]) => {
it(`should parse '${payload}' correctly`, () => {
let messages = TextMessageFormat.parse(payload);
expect(messages).toEqual(expected_messages);
})
});
([
["", new Error("Message is incomplete.")],
["ABC", new Error("Message is incomplete.")],
["ABC\u001eXYZ", new Error("Message is incomplete.")],
] as [string, Error][]).forEach(([payload, expected_error]) => {
it(`should fail to parse '${payload}'`, () => {
expect(() => TextMessageFormat.parse(payload)).toThrow(expected_error);
});
});
});

View File

@ -1,8 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { clearTimeout, setTimeout } from "timers";
export function asyncit(expectation: string, assertion?: () => Promise<any> | void, timeout?: number): void { export function asyncit(expectation: string, assertion?: () => Promise<any> | void, timeout?: number): void {
let testFunction: (done: DoneFn) => void; let testFunction: (done: DoneFn) => void;
if (assertion) { if (assertion) {

View File

@ -0,0 +1,14 @@
{
"compileOnSave": false,
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"moduleResolution": "node",
"outDir": "./obj",
"lib": [ "es2015", "dom" ]
},
"include": [
"./**/*",
"../../typings/**/*"
]
}

View File

@ -5,10 +5,16 @@ import { DataReceived, ConnectionClosed } from "./Common"
import { IConnection } from "./IConnection" import { IConnection } from "./IConnection"
import { ITransport, TransferMode, TransportType, WebSocketTransport, ServerSentEventsTransport, LongPollingTransport } from "./Transports" import { ITransport, TransferMode, TransportType, WebSocketTransport, ServerSentEventsTransport, LongPollingTransport } from "./Transports"
import { HttpClient, DefaultHttpClient } from "./HttpClient" import { HttpClient, DefaultHttpClient } from "./HttpClient"
import { IHttpConnectionOptions } from "./IHttpConnectionOptions"
import { ILogger, LogLevel } from "./ILogger" import { ILogger, LogLevel } from "./ILogger"
import { LoggerFactory } from "./Loggers" import { LoggerFactory } from "./Loggers"
export interface IHttpConnectionOptions {
httpClient?: HttpClient;
transport?: TransportType | ITransport;
logger?: ILogger | LogLevel;
accessToken?: () => string;
}
const enum ConnectionState { const enum ConnectionState {
Connecting, Connecting,
Connected, Connected,

View File

@ -3,22 +3,22 @@
import { ConnectionClosed } from "./Common" import { ConnectionClosed } from "./Common"
import { IConnection } from "./IConnection" import { IConnection } from "./IConnection"
import { HttpConnection } from "./HttpConnection" import { HttpConnection, IHttpConnectionOptions } from "./HttpConnection"
import { TransportType, TransferMode } from "./Transports" import { TransportType, TransferMode } from "./Transports"
import { Subject, Observable } from "./Observable" import { Subject, Observable } from "./Observable"
import { IHubProtocol, ProtocolType, MessageType, HubMessage, CompletionMessage, ResultMessage, InvocationMessage, StreamInvocationMessage, NegotiationMessage, CancelInvocation } from "./IHubProtocol"; import { IHubProtocol, ProtocolType, MessageType, HubMessage, CompletionMessage, ResultMessage, InvocationMessage, StreamInvocationMessage, NegotiationMessage, CancelInvocation } from "./IHubProtocol";
import { JsonHubProtocol } from "./JsonHubProtocol"; import { JsonHubProtocol } from "./JsonHubProtocol";
import { TextMessageFormat } from "./Formatters" import { TextMessageFormat } from "./TextMessageFormat"
import { Base64EncodedHubProtocol } from "./Base64EncodedHubProtocol" import { Base64EncodedHubProtocol } from "./Base64EncodedHubProtocol"
import { ILogger, LogLevel } from "./ILogger" import { ILogger, LogLevel } from "./ILogger"
import { ConsoleLogger, NullLogger, LoggerFactory } from "./Loggers" import { ConsoleLogger, NullLogger, LoggerFactory } from "./Loggers"
import { IHubConnectionOptions } from "./IHubConnectionOptions"
export { TransportType } from "./Transports" export { JsonHubProtocol }
export { HttpConnection } from "./HttpConnection"
export { JsonHubProtocol } from "./JsonHubProtocol" export interface IHubConnectionOptions extends IHttpConnectionOptions {
export { LogLevel, ILogger } from "./ILogger" protocol?: IHubProtocol;
export { ConsoleLogger, NullLogger } from "./Loggers" timeoutInMilliseconds?: number;
}
const DEFAULT_TIMEOUT_IN_MS: number = 30 * 1000; const DEFAULT_TIMEOUT_IN_MS: number = 30 * 1000;

View File

@ -1,12 +1,14 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
import { TextMessageFormat } from "./Formatters"; import { TextMessageFormat } from "./TextMessageFormat";
import { IHubProtocol, ProtocolType, HubMessage } from "./IHubProtocol"; import { IHubProtocol, ProtocolType, HubMessage } from "./IHubProtocol";
export const JSON_HUB_PROTOCOL_NAME: string = "json";
export class JsonHubProtocol implements IHubProtocol { export class JsonHubProtocol implements IHubProtocol {
readonly name: string = "json"; readonly name: string = JSON_HUB_PROTOCOL_NAME;
readonly type: ProtocolType = ProtocolType.Text; readonly type: ProtocolType = ProtocolType.Text;

View File

@ -0,0 +1,20 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
export class TextMessageFormat {
static RecordSeparator = String.fromCharCode(0x1e);
static write(output: string): string {
return `${output}${TextMessageFormat.RecordSeparator}`;
}
static parse(input: string): string[] {
if (input[input.length - 1] != TextMessageFormat.RecordSeparator) {
throw new Error("Message is incomplete.");
}
let messages = input.split(TextMessageFormat.RecordSeparator);
messages.pop();
return messages;
}
}

View File

@ -0,0 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// This is where we add any polyfills we'll need for the browser. It is the entry module for browser-specific builds.
import 'es6-promise/dist/es6-promise.auto.js';
export * from './index'

View File

@ -1,10 +1,15 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// Everything that users need to access must be exported here. Including interfaces.
export * from "./Common" export * from "./Common"
export * from "./HttpConnection" export * from "./Errors"
export * from "./HttpClient" export * from "./HttpClient"
export * from "./HttpConnection"
export * from "./HubConnection" export * from "./HubConnection"
export * from "./Transports" export * from "./IConnection"
export * from "./IHubProtocol"
export * from "./ILogger"
export * from "./Loggers" export * from "./Loggers"
export * from "./MessagePackHubProtocol" export * from "./Transports"
export * from "./Observable"

View File

@ -0,0 +1,32 @@
.NET Core uses third-party libraries or other resources that may be
distributed under licenses different than the .NET Core software.
In the event that we accidentally failed to list a required notice, please
bring it to our attention. Post an issue or email us:
dotnet@microsoft.com
The attached notices are provided for information only.
License notice for es6-promise
------------------------------------------------------------------------------
"Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE."

View File

@ -0,0 +1,7 @@
{
"extends": "../tsconfig-base.json",
"include": [
"./src/**/*",
"../typings/**/*"
]
}

View File

@ -1,18 +1,17 @@
{ {
"compileOnSave": true, "compileOnSave": false,
"compilerOptions": { "compilerOptions": {
"module": "umd", "module": "es2015",
"target": "es6", "target": "es2016",
"sourceMap": true, "sourceMap": true,
"moduleResolution": "node",
"inlineSources": true,
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"removeComments": false, "removeComments": false,
"noImplicitAny": true, "noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true, "suppressImplicitAnyIndexErrors": true,
"outDir": "../dist/test" "noEmitOnError": true,
}, "lib": [ "es2016", "dom" ]
"include": [ }
"./**/*",
"../typings/*"
]
} }

View File

@ -1,3 +1,9 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// Hand-written EventSource typings. I couldn't find anything easy-to-consume out there. This is purely based on the API docs.
// -anurse
interface EventSourceOptions { interface EventSourceOptions {
withcredentials: boolean withcredentials: boolean
} }

View File

@ -1,571 +0,0 @@
// Generated by typings
// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/c26e1aebf2e08b09778ec4b005f1c446f0635261/jasmine/index.d.ts
declare function describe(description: string, specDefinitions: () => void): void;
declare function fdescribe(description: string, specDefinitions: () => void): void;
declare function xdescribe(description: string, specDefinitions: () => void): void;
declare function it(expectation: string, assertion?: (done: DoneFn) => void, timeout?: number): void;
declare function fit(expectation: string, assertion?: (done: DoneFn) => void, timeout?: number): void;
declare function xit(expectation: string, assertion?: (done: DoneFn) => void, timeout?: number): void;
/** If you call the function pending anywhere in the spec body, no matter the expectations, the spec will be marked pending. */
declare function pending(reason?: string): void;
declare function beforeEach(action: (done: DoneFn) => void, timeout?: number): void;
declare function afterEach(action: (done: DoneFn) => void, timeout?: number): void;
declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): void;
declare function afterAll(action: (done: DoneFn) => void, timeout?: number): void;
declare function expect(spy: Function): jasmine.Matchers;
declare function expect(actual: any): jasmine.Matchers;
declare function fail(e?: any): void;
/** Action method that should be called when the async work is complete */
interface DoneFn extends Function {
(): void;
/** fails the spec and indicates that it has completed. If the message is an Error, Error.message is used */
fail: (message?: Error|string) => void;
}
declare function spyOn(object: any, method: string): jasmine.Spy;
declare function runs(asyncMethod: Function): void;
declare function waitsFor(latchMethod: () => boolean, failureMessage?: string, timeout?: number): void;
declare function waits(timeout?: number): void;
declare namespace jasmine {
var clock: () => Clock;
function any(aclass: any): Any;
function anything(): Any;
function arrayContaining(sample: any[]): ArrayContaining;
function objectContaining(sample: any): ObjectContaining;
function createSpy(name: string, originalFn?: Function): Spy;
function createSpyObj(baseName: string, methodNames: any[]): any;
function createSpyObj<T>(baseName: string, methodNames: any[]): T;
function pp(value: any): string;
function getEnv(): Env;
function addCustomEqualityTester(equalityTester: CustomEqualityTester): void;
function addMatchers(matchers: CustomMatcherFactories): void;
function stringMatching(str: string): Any;
function stringMatching(str: RegExp): Any;
function formatErrorMsg(domain: string, usage: string) : (msg: string) => string
interface Any {
new (expectedClass: any): any;
jasmineMatches(other: any): boolean;
jasmineToString(): string;
}
// taken from TypeScript lib.core.es6.d.ts, applicable to CustomMatchers.contains()
interface ArrayLike<T> {
length: number;
[n: number]: T;
}
interface ArrayContaining {
new (sample: any[]): any;
asymmetricMatch(other: any): boolean;
jasmineToString(): string;
}
interface ObjectContaining {
new (sample: any): any;
jasmineMatches(other: any, mismatchKeys: any[], mismatchValues: any[]): boolean;
jasmineToString(): string;
}
interface Block {
new (env: Env, func: SpecFunction, spec: Spec): any;
execute(onComplete: () => void): void;
}
interface WaitsBlock extends Block {
new (env: Env, timeout: number, spec: Spec): any;
}
interface WaitsForBlock extends Block {
new (env: Env, timeout: number, latchFunction: SpecFunction, message: string, spec: Spec): any;
}
interface Clock {
install(): void;
uninstall(): void;
/** Calls to any registered callback are triggered when the clock is ticked forward via the jasmine.clock().tick function, which takes a number of milliseconds. */
tick(ms: number): void;
mockDate(date?: Date): void;
withMock(func: () => void): void;
}
interface CustomEqualityTester {
(first: any, second: any): boolean;
}
interface CustomMatcher {
compare<T>(actual: T, expected: T): CustomMatcherResult;
compare(actual: any, expected: any): CustomMatcherResult;
}
interface CustomMatcherFactory {
(util: MatchersUtil, customEqualityTesters: Array<CustomEqualityTester>): CustomMatcher;
}
interface CustomMatcherFactories {
[index: string]: CustomMatcherFactory;
}
interface CustomMatcherResult {
pass: boolean;
message?: string;
}
interface MatchersUtil {
equals(a: any, b: any, customTesters?: Array<CustomEqualityTester>): boolean;
contains<T>(haystack: ArrayLike<T> | string, needle: any, customTesters?: Array<CustomEqualityTester>): boolean;
buildFailureMessage(matcherName: string, isNot: boolean, actual: any, ...expected: Array<any>): string;
}
interface Env {
setTimeout: any;
clearTimeout: void;
setInterval: any;
clearInterval: void;
updateInterval: number;
currentSpec: Spec;
matchersClass: Matchers;
version(): any;
versionString(): string;
nextSpecId(): number;
addReporter(reporter: Reporter): void;
addReporter(reporter: CustomReporter): void;
execute(): void;
describe(description: string, specDefinitions: () => void): Suite;
// ddescribe(description: string, specDefinitions: () => void): Suite; Not a part of jasmine. Angular team adds these
beforeEach(beforeEachFunction: () => void): void;
beforeAll(beforeAllFunction: () => void): void;
currentRunner(): Runner;
afterEach(afterEachFunction: () => void): void;
afterAll(afterAllFunction: () => void): void;
xdescribe(desc: string, specDefinitions: () => void): XSuite;
it(description: string, func: () => void): Spec;
// iit(description: string, func: () => void): Spec; Not a part of jasmine. Angular team adds these
xit(desc: string, func: () => void): XSpec;
compareRegExps_(a: RegExp, b: RegExp, mismatchKeys: string[], mismatchValues: string[]): boolean;
compareObjects_(a: any, b: any, mismatchKeys: string[], mismatchValues: string[]): boolean;
equals_(a: any, b: any, mismatchKeys: string[], mismatchValues: string[]): boolean;
contains_(haystack: any, needle: any): boolean;
addCustomEqualityTester(equalityTester: CustomEqualityTester): void;
addMatchers(matchers: CustomMatcherFactories): void;
specFilter(spec: Spec): boolean;
throwOnExpectationFailure(value: boolean): void;
seed(seed: string | number): string | number;
provideFallbackReporter(reporter: Reporter): void;
throwingExpectationFailures(): boolean;
allowRespy(allow: boolean): void;
randomTests(): boolean;
randomizeTests(b: boolean): void;
clearReporters(): void;
}
interface FakeTimer {
new (): any;
reset(): void;
tick(millis: number): void;
runFunctionsWithinRange(oldMillis: number, nowMillis: number): void;
scheduleFunction(timeoutKey: any, funcToCall: () => void, millis: number, recurring: boolean): void;
}
interface HtmlReporter {
new (): any;
}
interface HtmlSpecFilter {
new (): any;
}
interface Result {
type: string;
}
interface NestedResults extends Result {
description: string;
totalCount: number;
passedCount: number;
failedCount: number;
skipped: boolean;
rollupCounts(result: NestedResults): void;
log(values: any): void;
getItems(): Result[];
addResult(result: Result): void;
passed(): boolean;
}
interface MessageResult extends Result {
values: any;
trace: Trace;
}
interface ExpectationResult extends Result {
matcherName: string;
passed(): boolean;
expected: any;
actual: any;
message: string;
trace: Trace;
}
interface Order {
new (options: {random: boolean, seed: string}): any;
random: boolean;
seed: string;
sort<T>(items: T[]) : T[];
}
namespace errors {
class ExpectationFailed extends Error {
constructor();
stack: any;
}
}
interface TreeProcessor {
new (attrs: any): any;
execute: (done: Function) => void;
processTree() : any;
}
interface Trace {
name: string;
message: string;
stack: any;
}
interface PrettyPrinter {
new (): any;
format(value: any): void;
iterateObject(obj: any, fn: (property: string, isGetter: boolean) => void): void;
emitScalar(value: any): void;
emitString(value: string): void;
emitArray(array: any[]): void;
emitObject(obj: any): void;
append(value: any): void;
}
interface StringPrettyPrinter extends PrettyPrinter {
}
interface Queue {
new (env: any): any;
env: Env;
ensured: boolean[];
blocks: Block[];
running: boolean;
index: number;
offset: number;
abort: boolean;
addBefore(block: Block, ensure?: boolean): void;
add(block: any, ensure?: boolean): void;
insertNext(block: any, ensure?: boolean): void;
start(onComplete?: () => void): void;
isRunning(): boolean;
next_(): void;
results(): NestedResults;
}
interface Matchers {
new (env: Env, actual: any, spec: Env, isNot?: boolean): any;
env: Env;
actual: any;
spec: Env;
isNot?: boolean;
message(): any;
toBe(expected: any, expectationFailOutput?: any): boolean;
toEqual(expected: any, expectationFailOutput?: any): boolean;
toMatch(expected: string | RegExp, expectationFailOutput?: any): boolean;
toBeDefined(expectationFailOutput?: any): boolean;
toBeUndefined(expectationFailOutput?: any): boolean;
toBeNull(expectationFailOutput?: any): boolean;
toBeNaN(): boolean;
toBeTruthy(expectationFailOutput?: any): boolean;
toBeFalsy(expectationFailOutput?: any): boolean;
toHaveBeenCalled(): boolean;
toHaveBeenCalledWith(...params: any[]): boolean;
toHaveBeenCalledTimes(expected: number): boolean;
toContain(expected: any, expectationFailOutput?: any): boolean;
toBeLessThan(expected: number, expectationFailOutput?: any): boolean;
toBeLessThanOrEqual(expected: number, expectationFailOutput?: any): boolean;
toBeGreaterThan(expected: number, expectationFailOutput?: any): boolean;
toBeGreaterThanOrEqual(expected: number, expectationFailOutput?: any): boolean;
toBeCloseTo(expected: number, precision?: any, expectationFailOutput?: any): boolean;
toThrow(expected?: any): boolean;
toThrowError(message?: string | RegExp): boolean;
toThrowError(expected?: new (...args: any[]) => Error, message?: string | RegExp): boolean;
not: Matchers;
Any: Any;
}
interface Reporter {
reportRunnerStarting(runner: Runner): void;
reportRunnerResults(runner: Runner): void;
reportSuiteResults(suite: Suite): void;
reportSpecStarting(spec: Spec): void;
reportSpecResults(spec: Spec): void;
log(str: string): void;
}
interface MultiReporter extends Reporter {
addReporter(reporter: Reporter): void;
}
interface SuiteInfo {
totalSpecsDefined: number;
}
interface CustomReportExpectation {
matcherName: string;
message: string;
passed: boolean;
stack: string;
}
interface FailedExpectation extends CustomReportExpectation {
actual: string;
expected: string;
}
interface PassedExpectation extends CustomReportExpectation {
}
interface CustomReporterResult {
description: string,
failedExpectations?: FailedExpectation[],
fullName: string,
id: string;
passedExpectations?: PassedExpectation[],
pendingReason?: string;
status?: string;
}
interface CustomReporter {
jasmineStarted?(suiteInfo: SuiteInfo): void;
suiteStarted?(result: CustomReporterResult): void;
specStarted?(result: CustomReporterResult): void;
specDone?(result: CustomReporterResult): void;
suiteDone?(result: CustomReporterResult): void;
jasmineDone?(): any;
}
interface Runner {
new (env: Env): any;
execute(): void;
beforeEach(beforeEachFunction: SpecFunction): void;
afterEach(afterEachFunction: SpecFunction): void;
beforeAll(beforeAllFunction: SpecFunction): void;
afterAll(afterAllFunction: SpecFunction): void;
finishCallback(): void;
addSuite(suite: Suite): void;
add(block: Block): void;
specs(): Spec[];
suites(): Suite[];
topLevelSuites(): Suite[];
results(): NestedResults;
}
interface SpecFunction {
(spec?: Spec): void;
}
interface SuiteOrSpec {
id: number;
env: Env;
description: string;
queue: Queue;
}
interface Spec extends SuiteOrSpec {
new (env: Env, suite: Suite, description: string): any;
suite: Suite;
afterCallbacks: SpecFunction[];
spies_: Spy[];
results_: NestedResults;
matchersClass: Matchers;
getFullName(): string;
results(): NestedResults;
log(arguments: any): any;
runs(func: SpecFunction): Spec;
addToQueue(block: Block): void;
addMatcherResult(result: Result): void;
getResult(): any;
expect(actual: any): any;
waits(timeout: number): Spec;
waitsFor(latchFunction: SpecFunction, timeoutMessage?: string, timeout?: number): Spec;
fail(e?: any): void;
getMatchersClass_(): Matchers;
addMatchers(matchersPrototype: CustomMatcherFactories): void;
finishCallback(): void;
finish(onComplete?: () => void): void;
after(doAfter: SpecFunction): void;
execute(onComplete?: () => void, enabled?: boolean): any;
addBeforesAndAftersToQueue(): void;
explodes(): void;
spyOn(obj: any, methodName: string, ignoreMethodDoesntExist: boolean): Spy;
removeAllSpies(): void;
throwOnExpectationFailure: boolean;
}
interface XSpec {
id: number;
runs(): void;
}
interface Suite extends SuiteOrSpec {
new (env: Env, description: string, specDefinitions: () => void, parentSuite: Suite): any;
parentSuite: Suite;
getFullName(): string;
finish(onComplete?: () => void): void;
beforeEach(beforeEachFunction: SpecFunction): void;
afterEach(afterEachFunction: SpecFunction): void;
beforeAll(beforeAllFunction: SpecFunction): void;
afterAll(afterAllFunction: SpecFunction): void;
results(): NestedResults;
add(suiteOrSpec: SuiteOrSpec): void;
specs(): Spec[];
suites(): Suite[];
children(): any[];
execute(onComplete?: () => void): void;
}
interface XSuite {
execute(): void;
}
interface Spy {
(...params: any[]): any;
identity: string;
and: SpyAnd;
calls: Calls;
mostRecentCall: { args: any[]; };
argsForCall: any[];
}
interface SpyAnd {
/** By chaining the spy with and.callThrough, the spy will still track all calls to it but in addition it will delegate to the actual implementation. */
callThrough(): Spy;
/** By chaining the spy with and.returnValue, all calls to the function will return a specific value. */
returnValue(val: any): Spy;
/** By chaining the spy with and.returnValues, all calls to the function will return specific values in order until it reaches the end of the return values list. */
returnValues(...values: any[]): Spy;
/** By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied function. */
callFake(fn: Function): Spy;
/** By chaining the spy with and.throwError, all calls to the spy will throw the specified value. */
throwError(msg: string): Spy;
/** When a calling strategy is used for a spy, the original stubbing behavior can be returned at any time with and.stub. */
stub(): Spy;
}
interface Calls {
/** By chaining the spy with calls.any(), will return false if the spy has not been called at all, and then true once at least one call happens. **/
any(): boolean;
/** By chaining the spy with calls.count(), will return the number of times the spy was called **/
count(): number;
/** By chaining the spy with calls.argsFor(), will return the arguments passed to call number index **/
argsFor(index: number): any[];
/** By chaining the spy with calls.allArgs(), will return the arguments to all calls **/
allArgs(): any[];
/** By chaining the spy with calls.all(), will return the context (the this) and arguments passed all calls **/
all(): CallInfo[];
/** By chaining the spy with calls.mostRecent(), will return the context (the this) and arguments for the most recent call **/
mostRecent(): CallInfo;
/** By chaining the spy with calls.first(), will return the context (the this) and arguments for the first call **/
first(): CallInfo;
/** By chaining the spy with calls.reset(), will clears all tracking for a spy **/
reset(): void;
}
interface CallInfo {
/** The context (the this) for the call */
object: any;
/** All arguments passed to the call */
args: any[];
/** The return value of the call */
returnValue: any;
}
interface Util {
inherit(childClass: Function, parentClass: Function): any;
formatException(e: any): any;
htmlEscape(str: string): string;
argsToArray(args: any): any;
extend(destination: any, source: any): any;
}
interface JsApiReporter extends Reporter {
started: boolean;
finished: boolean;
result: any;
messages: any;
runDetails: {
failedExpectations: ExpectationResult[];
order: jasmine.Order
}
new (): any;
suites(): Suite[];
summarize_(suiteOrSpec: SuiteOrSpec): any;
results(): any;
resultsForSpec(specId: any): any;
log(str: any): any;
resultsForSpecs(specIds: any): any;
summarizeResult_(result: any): any;
}
interface Jasmine {
Spec: Spec;
clock: Clock;
util: Util;
}
export var HtmlReporter: HtmlReporter;
export var HtmlSpecFilter: HtmlSpecFilter;
export var DEFAULT_TIMEOUT_INTERVAL: number;
}

View File

@ -1,8 +0,0 @@
{
"resolution": "main",
"tree": {
"src": "https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/c26e1aebf2e08b09778ec4b005f1c446f0635261/jasmine/index.d.ts",
"raw": "registry:dt/jasmine#2.5.0+20161228223817",
"typings": "https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/c26e1aebf2e08b09778ec4b005f1c446f0635261/jasmine/index.d.ts"
}
}

View File

@ -1,2 +0,0 @@
/// <reference path="globals/jasmine/index.d.ts" />
/// <reference path="globals/EventSource/EventSource.d.ts" />

View File

@ -0,0 +1,103 @@
<html>
<head>
<title>Test Page</title>
<style>
.test-success {
color: green;
}
.test-failed {
color: red;
}
</style>
</head>
<body>
<h1>Test Page</h1>
<p>This page validates that the UMD builds of the signalr-client and signalr-protocol-msgpack modules are available in the global scope when in a browser.</p>
<h2>Test Results</h2>
<ul id="results-list">
</ul>
<script src="./signalr-protocol-msgpack/node_modules/msgpack5/dist/msgpack5.js"></script>
<script type="text/javascript">
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 importSignalR() {
var minified = getParameterByName('min') === 'true' ? '.min' : '';
document.write('<script type="text/javascript" src="./signalr/dist/browser/signalr' + minified + '.js"><\/script>');
document.write('<script type="text/javascript" src="./signalr-protocol-msgpack/dist/browser/signalr-protocol-msgpack' + minified + '.js"><\/script>');
}
var resultsList = document.getElementById("results-list");
// Run tests
function test(name, impl) {
var result = ""
var success = false;
try {
impl();
result = "success";
success = true;
} catch(e) {
console.error(e);
result = "error: " + e;
success = false;
}
var cssClass = success ? "test-success": "test-failed";
resultsList.innerHTML += "<li class=\"" + cssClass + "\">" + name + ": " + result + "</li>";
}
test("Promise may not be available before the polyfill", function() {
if(!Promise) {
throw "Promise is falsey: " + Promise;
}
});
test("Buffer is not available before the polyfill", function() {
if(typeof Buffer !== "undefined") {
throw "Buffer is truthy: " + Buffer;
}
});
importSignalR();
</script>
<script>
test("Promise is available after the polyfill", function() {
if(!Promise) {
throw "Promise is falsey: " + Promise;
}
});
test("Buffer is not available after the polyfill", function() {
if(typeof Buffer !== "undefined") {
throw "Buffer is truthy: " + Buffer;
}
});
test("signalR is available", function() {
if(!window.signalR){
throw "window.signalR is falsey: " + window.signalR;
}
});
test("msgpack5 is available", function() {
if(!window.msgpack5){
throw "window.msgpack5 is falsey: " + window.msgpack5;
}
});
test("signalR.protocols.msgpack.MessagePackHubProtocol is available", function() {
if(!window.signalR.protocols.msgpack.MessagePackHubProtocol){
throw "signalR.protocols.msgpack is falsey: " + signalR.protocols.msgpack.MessagePackHubProtocol;
}
});
</script>
</body>
</html>

1
samples/ChatSample/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
wwwroot/lib/

View File

@ -10,7 +10,6 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj" />
<ProjectReference Include="..\..\client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -40,7 +39,11 @@
</ItemGroup> </ItemGroup>
<Target Name="CopyTSClient" BeforeTargets="AfterBuild"> <Target Name="CopyTSClient" BeforeTargets="AfterBuild">
<Copy SourceFiles="$(MSBuildThisFileDirectory)..\..\client-ts\dist\browser\signalr-client.js" DestinationFolder="$(MSBuildThisFileDirectory)wwwroot\lib\signalr-client" /> <ItemGroup>
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\..\client-ts\signalr\dist\browser\*" />
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\..\client-ts\signalr-protocol-msgpack\dist\browser\*" />
</ItemGroup>
<Copy SourceFiles="@(SignalRJSClientFiles)" DestinationFolder="$(MSBuildThisFileDirectory)wwwroot\lib\signalr-client" />
</Target> </Target>
<Target Name="BowerInstall" BeforeTargets="PrepareForPublish"> <Target Name="BowerInstall" BeforeTargets="PrepareForPublish">

View File

@ -1,4 +1,4 @@
@{ @{
ViewData["Title"] = "Chat"; ViewData["Title"] = "Chat";
} }
@ -14,7 +14,7 @@
<input type="submit" id="send" value="Send" class="send" /> <input type="submit" id="send" value="Send" class="send" />
</form> </form>
</div> </div>
<script src="lib/signalr-client/signalr-client.js"></script> <script src="lib/signalr-client/signalr.js"></script>
<script> <script>
let transportType = signalR.TransportType[getParameterByName('transport')] || signalR.TransportType.WebSockets; let transportType = signalR.TransportType[getParameterByName('transport')] || signalR.TransportType.WebSockets;
let logger = new signalR.ConsoleLogger(signalR.LogLevel.Information); let logger = new signalR.ConsoleLogger(signalR.LogLevel.Information);

1
samples/JwtSample/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
wwwroot/lib/

View File

@ -10,7 +10,9 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" />
<ProjectReference Include="..\..\client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj" /> </ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(MicrosoftAspNetCoreDiagnosticsPackageVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(MicrosoftAspNetCoreDiagnosticsPackageVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" />
@ -22,6 +24,10 @@
</ItemGroup> </ItemGroup>
<Target Name="CopyTSClient" BeforeTargets="AfterBuild"> <Target Name="CopyTSClient" BeforeTargets="AfterBuild">
<Copy SourceFiles="$(MSBuildThisFileDirectory)..\..\client-ts\dist\browser\signalr-client.js" DestinationFolder="$(MSBuildThisFileDirectory)wwwroot\lib\signalr-client" /> <ItemGroup>
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\..\client-ts\signalr\dist\browser\*" />
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\..\client-ts\signalr-protocol-msgpack\dist\browser\*" />
</ItemGroup>
<Copy SourceFiles="@(SignalRJSClientFiles)" DestinationFolder="$(MSBuildThisFileDirectory)wwwroot\lib\signalr-client" />
</Target> </Target>
</Project> </Project>

View File

@ -10,7 +10,7 @@
</div> </div>
</body> </body>
</html> </html>
<script type="text/javascript" src="lib/signalr-client/signalr-client.js"></script> <script type="text/javascript" src="lib/signalr-client/signalr.js"></script>
<script> <script>
function createLog(clientId) { function createLog(clientId) {
@ -68,7 +68,7 @@
.then(function () { .then(function () {
var options = { var options = {
transport: transportType, transport: transportType,
jwtBearer: function () { return tokens[clientId]; } accessToken: function () { return tokens[clientId]; }
}; };
connection = new signalR.HubConnection('/broadcast', options); connection = new signalR.HubConnection('/broadcast', options);

1
samples/SocketsSample/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
wwwroot/lib/

View File

@ -3,7 +3,7 @@
"windowsAuthentication": false, "windowsAuthentication": false,
"anonymousAuthentication": true, "anonymousAuthentication": true,
"iisExpress": { "iisExpress": {
"applicationUrl": "http://localhost:1850/", "applicationUrl": "http://localhost:61694/",
"sslPort": 0 "sslPort": 0
} }
}, },

View File

@ -10,7 +10,6 @@
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj" />
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj" /> <ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj" />
<ProjectReference Include="..\..\client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj" />
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonPackageVersion)" /> <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonPackageVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(MicrosoftAspNetCoreDiagnosticsPackageVersion)" /> <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(MicrosoftAspNetCoreDiagnosticsPackageVersion)" />
@ -27,7 +26,8 @@
<Target Name="CopyTSClient" BeforeTargets="AfterBuild"> <Target Name="CopyTSClient" BeforeTargets="AfterBuild">
<ItemGroup> <ItemGroup>
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\..\client-ts\dist\browser\*" /> <SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\..\client-ts\signalr\dist\browser\*" />
<SignalRJSClientFiles Include="$(MSBuildThisFileDirectory)..\..\client-ts\signalr-protocol-msgpack\dist\browser\*" />
</ItemGroup> </ItemGroup>
<Copy SourceFiles="@(SignalRJSClientFiles)" DestinationFolder="$(MSBuildThisFileDirectory)wwwroot\lib\signalr-client" /> <Copy SourceFiles="@(SignalRJSClientFiles)" DestinationFolder="$(MSBuildThisFileDirectory)wwwroot\lib\signalr-client" />
</Target> </Target>

View File

@ -62,18 +62,7 @@
</body> </body>
</html> </html>
<script type="text/javascript"> <script src="lib/signalr-client/signalr.js"></script>
if (typeof Promise === 'undefined') {
document.write(
'<script type="text/javascript" src="lib/signalr-client/signalr-clientES5.js"><\/script>' +
'<script type="text/javascript" src="lib/signalr-client/signalr-msgpackprotocolES5.js"><\/script>');
}
else {
document.write(
'<script type="text/javascript" src="lib/signalr-client/signalr-client.js"><\/script>' +
'<script type="text/javascript" src="lib/signalr-client/signalr-msgpackprotocol.js"><\/script>');
}
</script>
<script src="utils.js"></script> <script src="utils.js"></script>
<script> <script>
var isConnected = false; var isConnected = false;

Some files were not shown because too many files have changed in this diff Show More