From b3a33efeaea9d99a0541be9b98104a2d72f87579 Mon Sep 17 00:00:00 2001 From: Andrew Stanton-Nurse Date: Fri, 16 Feb 2018 10:43:32 -0800 Subject: [PATCH] Update MsgPack-Cli version * Fixes #1301 * Fixes #1058 * Fixes #1422 --- build/dependencies.props | 2 +- .../signalr-protocol-msgpack/package.json | 2 +- .../spec/MessagePackHubProtocol.spec.ts | 162 +++--- client-ts/signalr/package.json | 2 +- client-ts/tsconfig-base.json | 1 + samples/SocketsSample/SocketsSample.csproj | 8 +- samples/SocketsSample/Startup.cs | 7 +- samples/SocketsSample/wwwroot/hubs.html | 42 +- samples/SocketsSample/wwwroot/index.html | 18 +- samples/SocketsSample/wwwroot/sockets.html | 4 +- samples/SocketsSample/wwwroot/streaming.html | 4 +- .../Protocol/MessagePackHubProtocolTests.cs | 489 ++++++++---------- 12 files changed, 362 insertions(+), 379 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index d982281edd..ade86216d3 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -56,7 +56,7 @@ 2.1.0-preview2-26130-04 15.3.0 4.7.49 - 0.9.0-beta2 + 1.0.0-rc 10.0.1 1.2.4 4.5.0-preview2-26130-01 diff --git a/client-ts/signalr-protocol-msgpack/package.json b/client-ts/signalr-protocol-msgpack/package.json index 53788f99f6..f47ca4f2f7 100644 --- a/client-ts/signalr-protocol-msgpack/package.json +++ b/client-ts/signalr-protocol-msgpack/package.json @@ -18,7 +18,7 @@ "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", + "pretest": "node ../node_modules/rimraf/bin.js ./spec/obj && node ../node_modules/typescript/bin/tsc --project ./spec/tsconfig.json", "test": "node ../node_modules/jasmine/bin/jasmine.js ./spec/obj/signalr-protocol-msgpack/spec/**/*.spec.js" }, "keywords": [ diff --git a/client-ts/signalr-protocol-msgpack/spec/MessagePackHubProtocol.spec.ts b/client-ts/signalr-protocol-msgpack/spec/MessagePackHubProtocol.spec.ts index e11e37f4cd..2793466d7a 100644 --- a/client-ts/signalr-protocol-msgpack/spec/MessagePackHubProtocol.spec.ts +++ b/client-ts/signalr-protocol-msgpack/spec/MessagePackHubProtocol.spec.ts @@ -1,111 +1,139 @@ // 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 { MessagePackHubProtocol } from "../src/MessagePackHubProtocol" -import { MessageType, InvocationMessage, CompletionMessage, StreamItemMessage } from "@aspnet/signalr" +import { CompletionMessage, InvocationMessage, MessageType, StreamItemMessage } from "@aspnet/signalr"; +import { MessagePackHubProtocol } from "../src/MessagePackHubProtocol"; describe("MessageHubProtocol", () => { it("can write/read non-blocking Invocation message", () => { - let invocation = { + const invocation = { + arguments: [42, true, "test", ["x1", "y2"], null], headers: {}, - type: MessageType.Invocation, target: "myMethod", - arguments: [42, true, "test", ["x1", "y2"], null] - }; + type: MessageType.Invocation, + } as InvocationMessage; - let protocol = new MessagePackHubProtocol(); - var parsedMessages = protocol.parseMessages(protocol.writeMessage(invocation)); + const protocol = new MessagePackHubProtocol(); + const parsedMessages = protocol.parseMessages(protocol.writeMessage(invocation)); + expect(parsedMessages).toEqual([invocation]); + }); + + it("can read Invocation message with Date argument", () => { + const invocation = { + arguments: [new Date(Date.UTC(2018, 1, 1, 12, 34, 56))], + headers: {}, + target: "mymethod", + type: MessageType.Invocation, + } as InvocationMessage; + + const protocol = new MessagePackHubProtocol(); + const parsedMessages = protocol.parseMessages(protocol.writeMessage(invocation)); expect(parsedMessages).toEqual([invocation]); }); it("can write/read Invocation message with headers", () => { - let invocation = { + const invocation = { + arguments: [42, true, "test", ["x1", "y2"], null], headers: { - "foo": "bar" + foo: "bar", }, - type: MessageType.Invocation, target: "myMethod", - arguments: [42, true, "test", ["x1", "y2"], null] - }; + type: MessageType.Invocation, + } as InvocationMessage; - let protocol = new MessagePackHubProtocol(); - var parsedMessages = protocol.parseMessages(protocol.writeMessage(invocation)); + const protocol = new MessagePackHubProtocol(); + const parsedMessages = protocol.parseMessages(protocol.writeMessage(invocation)); expect(parsedMessages).toEqual([invocation]); }); it("can write/read Invocation message", () => { - let invocation = { + const invocation = { + arguments: [42, true, "test", ["x1", "y2"], null], headers: {}, - type: MessageType.Invocation, invocationId: "123", target: "myMethod", - arguments: [42, true, "test", ["x1", "y2"], null] - }; + type: MessageType.Invocation, + } as InvocationMessage; - let protocol = new MessagePackHubProtocol(); - var parsedMessages = protocol.parseMessages(protocol.writeMessage(invocation)); + const protocol = new MessagePackHubProtocol(); + const parsedMessages = protocol.parseMessages(protocol.writeMessage(invocation)); expect(parsedMessages).toEqual([invocation]); }); ([ [[0x0c, 0x95, 0x03, 0x80, 0xa3, 0x61, 0x62, 0x63, 0x01, 0xa3, 0x45, 0x72, 0x72], { - headers: {}, - type: MessageType.Completion, - invocationId: "abc", error: "Err", - result: null + headers: {}, + invocationId: "abc", + result: null, + type: MessageType.Completion, } as CompletionMessage], [[0x0b, 0x95, 0x03, 0x80, 0xa3, 0x61, 0x62, 0x63, 0x03, 0xa2, 0x4f, 0x4b], { - headers: {}, - type: MessageType.Completion, - invocationId: "abc", error: null, - result: "OK" + headers: {}, + invocationId: "abc", + result: "OK", + type: MessageType.Completion, } as CompletionMessage], [[0x08, 0x94, 0x03, 0x80, 0xa3, 0x61, 0x62, 0x63, 0x02], { - headers: {}, - type: MessageType.Completion, - invocationId: "abc", error: null, - result: null - } as CompletionMessage] - ] as [number[], CompletionMessage][]).forEach(([payload, expected_message]) => + headers: {}, + invocationId: "abc", + result: null, + type: MessageType.Completion, + } as CompletionMessage], + [[0x0E, 0x95, 0x03, 0x80, 0xa3, 0x61, 0x62, 0x63, 0x03, 0xD6, 0xFF, 0x5A, 0x4A, 0x1A, 0x50], + { + error: null, + headers: {}, + invocationId: "abc", + result: new Date(Date.UTC(2018, 0, 1, 11, 24, 0)), + type: MessageType.Completion, + } as CompletionMessage], + ] as Array<[number[], CompletionMessage]>).forEach(([payload, expectedMessage]) => it("can read Completion message", () => { - let messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); - expect(messages).toEqual([expected_message]); + const messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); + expect(messages).toEqual([expectedMessage]); })); ([ [[0x08, 0x94, 0x02, 0x80, 0xa3, 0x61, 0x62, 0x63, 0x08], { headers: {}, - type: MessageType.StreamItem, invocationId: "abc", - item: 8 + item: 8, + type: MessageType.StreamItem, + } as StreamItemMessage], + [[0x0D, 0x94, 0x02, 0x80, 0xa3, 0x61, 0x62, 0x63, 0xD6, 0xFF, 0x5A, 0x4A, 0x1A, 0x50], + { + headers: {}, + invocationId: "abc", + item: new Date(Date.UTC(2018, 0, 1, 11, 24, 0)), + type: MessageType.StreamItem, } as StreamItemMessage] - ] as [[number[], StreamItemMessage]]).forEach(([payload, expected_message]) => + ] as Array<[number[], StreamItemMessage]>).forEach(([payload, expectedMessage]) => it("can read StreamItem message", () => { - let messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); - expect(messages).toEqual([expected_message]); + const messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); + expect(messages).toEqual([expectedMessage]); })); ([ [[0x0c, 0x94, 0x02, 0x81, 0xa1, 0x74, 0xa1, 0x75, 0xa3, 0x61, 0x62, 0x63, 0x08], { headers: { - "t": "u" + t: "u", }, - type: MessageType.StreamItem, invocationId: "abc", - item: 8 - } as StreamItemMessage] - ] as [[number[], StreamItemMessage]]).forEach(([payload, expected_message]) => + item: 8, + type: MessageType.StreamItem, + } as StreamItemMessage], + ] as Array<[number[], StreamItemMessage]>).forEach(([payload, expectedMessage]) => it("can read message with headers", () => { - let messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); - expect(messages).toEqual([expected_message]); + const messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); + expect(messages).toEqual([expectedMessage]); })); ([ @@ -120,46 +148,46 @@ describe("MessageHubProtocol", () => { ["Completion message with invalid invocation id", [0x04, 0x93, 0x03, 0x80, 0xa0], new Error("Invalid payload for Completion message.")], ["Completion message with unexpected result", [0x06, 0x95, 0x03, 0x80, 0xa0, 0x02, 0x00], new Error("Invalid payload for Completion message.")], ["Completion message with missing result", [0x05, 0x94, 0x03, 0x80, 0xa0, 0x01], new Error("Invalid payload for Completion message.")], - ["Completion message with missing error", [0x05, 0x94, 0x03, 0x80, 0xa0, 0x03], new Error("Invalid payload for Completion message.")] - ] as [string, number[], Error][]).forEach(([name, payload, expected_error]) => + ["Completion message with missing error", [0x05, 0x94, 0x03, 0x80, 0xa0, 0x03], new Error("Invalid payload for Completion message.")], + ] as Array<[string, number[], Error]>).forEach(([name, payload, expectedError]) => it("throws for " + name, () => { expect(() => new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer)) - .toThrow(expected_error); + .toThrow(expectedError); })); it("can read multiple messages", () => { - let payload = [ + const payload = [ 0x08, 0x94, 0x02, 0x80, 0xa3, 0x61, 0x62, 0x63, 0x08, 0x0b, 0x95, 0x03, 0x80, 0xa3, 0x61, 0x62, 0x63, 0x03, 0xa2, 0x4f, 0x4b]; - let messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); + const messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); expect(messages).toEqual([ { headers: {}, - type: MessageType.StreamItem, invocationId: "abc", - item: 8 + item: 8, + type: MessageType.StreamItem, } as StreamItemMessage, { - headers: {}, - type: MessageType.Completion, - invocationId: "abc", error: null, - result: "OK" - } as CompletionMessage + headers: {}, + invocationId: "abc", + result: "OK", + type: MessageType.Completion, + } as CompletionMessage, ]); }); it("can read ping message", () => { - let payload = [ + const payload = [ 0x02, 0x91, // message array length = 1 (fixarray) 0x06, // type = 6 = Ping (fixnum) ]; - let messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); + const messages = new MessagePackHubProtocol().parseMessages(new Uint8Array(payload).buffer); expect(messages).toEqual([ { type: MessageType.Ping, - } - ]) - }) -}); \ No newline at end of file + }, + ]); + }); +}); diff --git a/client-ts/signalr/package.json b/client-ts/signalr/package.json index dcb7d731f0..8f1b8bdb02 100644 --- a/client-ts/signalr/package.json +++ b/client-ts/signalr/package.json @@ -18,7 +18,7 @@ "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", + "pretest": "node ../node_modules/rimraf/bin.js ./spec/obj && node ../node_modules/typescript/bin/tsc --project ./spec/tsconfig.json", "test": "node ../node_modules/jasmine/bin/jasmine.js ./spec/obj/spec/**/*.spec.js" }, "repository": { diff --git a/client-ts/tsconfig-base.json b/client-ts/tsconfig-base.json index aba169f200..2122a6c242 100644 --- a/client-ts/tsconfig-base.json +++ b/client-ts/tsconfig-base.json @@ -3,6 +3,7 @@ "compilerOptions": { "module": "es2015", "target": "es2016", + "outDir": "./obj/js", "sourceMap": true, "moduleResolution": "node", "inlineSources": true, diff --git a/samples/SocketsSample/SocketsSample.csproj b/samples/SocketsSample/SocketsSample.csproj index 007aa50aa6..e89c7f71c7 100644 --- a/samples/SocketsSample/SocketsSample.csproj +++ b/samples/SocketsSample/SocketsSample.csproj @@ -7,6 +7,7 @@ + @@ -29,7 +30,12 @@ - + + + + + + diff --git a/samples/SocketsSample/Startup.cs b/samples/SocketsSample/Startup.cs index 9c3af3050f..e15502d52d 100644 --- a/samples/SocketsSample/Startup.cs +++ b/samples/SocketsSample/Startup.cs @@ -5,9 +5,10 @@ using System; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; -using Newtonsoft.Json.Serialization; +using MsgPack.Serialization; using SocketsSample.EndPoints; using SocketsSample.Hubs; +using StackExchange.Redis; namespace SocketsSample { @@ -23,6 +24,10 @@ namespace SocketsSample { // Faster pings for testing options.KeepAliveInterval = TimeSpan.FromSeconds(5); + }) + .AddMessagePackProtocol(options => + { + options.SerializationContext.DictionarySerlaizationOptions.KeyTransformer = DictionaryKeyTransformers.LowerCamel; }); // .AddRedis(); diff --git a/samples/SocketsSample/wwwroot/hubs.html b/samples/SocketsSample/wwwroot/hubs.html index 2214671c8a..99002d3f48 100644 --- a/samples/SocketsSample/wwwroot/hubs.html +++ b/samples/SocketsSample/wwwroot/hubs.html @@ -1,4 +1,4 @@ - + @@ -7,11 +7,23 @@ -

+

SignalR Hubs Sample

- + + + + + + + @@ -62,7 +74,9 @@ - + + + + +