2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
4
import { MessagePackHubProtocol } from "../src/MessagePackHubProtocol"
5
- import { MessageType , InvocationMessage , CompletionMessage , ResultMessage } from "@aspnet/signalr"
5
+ import { MessageType , InvocationMessage , CompletionMessage , StreamItemMessage } from "@aspnet/signalr"
6
6
7
7
describe ( "MessageHubProtocol" , ( ) => {
8
8
it ( "can write/read non-blocking Invocation message" , ( ) => {
9
9
let invocation = < InvocationMessage > {
10
+ headers : { } ,
11
+ type : MessageType . Invocation ,
12
+ target : "myMethod" ,
13
+ arguments : [ 42 , true , "test" , [ "x1" , "y2" ] , null ]
14
+ } ;
15
+
16
+ let protocol = new MessagePackHubProtocol ( ) ;
17
+ var parsedMessages = protocol . parseMessages ( protocol . writeMessage ( invocation ) ) ;
18
+ expect ( parsedMessages ) . toEqual ( [ invocation ] ) ;
19
+ } ) ;
20
+
21
+ it ( "can write/read Invocation message with headers" , ( ) => {
22
+ let invocation = < InvocationMessage > {
23
+ headers : {
24
+ "foo" : "bar"
25
+ } ,
10
26
type : MessageType . Invocation ,
11
27
target : "myMethod" ,
12
28
arguments : [ 42 , true , "test" , [ "x1" , "y2" ] , null ]
@@ -19,6 +35,7 @@ describe("MessageHubProtocol", () => {
19
35
20
36
it ( "can write/read Invocation message" , ( ) => {
21
37
let invocation = < InvocationMessage > {
38
+ headers : { } ,
22
39
type : MessageType . Invocation ,
23
40
invocationId : "123" ,
24
41
target : "myMethod" ,
@@ -31,22 +48,25 @@ describe("MessageHubProtocol", () => {
31
48
} ) ;
32
49
33
50
( [
34
- [ [ 0x0b , 0x94 , 0x03 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x01 , 0xa3 , 0x45 , 0x72 , 0x72 ] ,
51
+ [ [ 0x0c , 0x95 , 0x03 , 0x80 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x01 , 0xa3 , 0x45 , 0x72 , 0x72 ] ,
35
52
{
53
+ headers : { } ,
36
54
type : MessageType . Completion ,
37
55
invocationId : "abc" ,
38
56
error : "Err" ,
39
57
result : null
40
58
} as CompletionMessage ] ,
41
- [ [ 0x0a , 0x94 , 0x03 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x03 , 0xa2 , 0x4f , 0x4b ] ,
59
+ [ [ 0x0b , 0x95 , 0x03 , 0x80 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x03 , 0xa2 , 0x4f , 0x4b ] ,
42
60
{
61
+ headers : { } ,
43
62
type : MessageType . Completion ,
44
63
invocationId : "abc" ,
45
64
error : null ,
46
65
result : "OK"
47
66
} as CompletionMessage ] ,
48
- [ [ 0x07 , 0x93 , 0x03 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x02 ] ,
67
+ [ [ 0x08 , 0x94 , 0x03 , 0x80 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x02 ] ,
49
68
{
69
+ headers : { } ,
50
70
type : MessageType . Completion ,
51
71
invocationId : "abc" ,
52
72
error : null ,
@@ -59,48 +79,68 @@ describe("MessageHubProtocol", () => {
59
79
} ) ) ;
60
80
61
81
( [
62
- [ [ 0x07 , 0x93 , 0x02 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x08 ] ,
82
+ [ [ 0x08 , 0x94 , 0x02 , 0x80 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x08 ] ,
83
+ {
84
+ headers : { } ,
85
+ type : MessageType . StreamItem ,
86
+ invocationId : "abc" ,
87
+ item : 8
88
+ } as StreamItemMessage ]
89
+ ] as [ [ number [ ] , StreamItemMessage ] ] ) . forEach ( ( [ payload , expected_message ] ) =>
90
+ it ( "can read StreamItem message" , ( ) => {
91
+ let messages = new MessagePackHubProtocol ( ) . parseMessages ( new Uint8Array ( payload ) . buffer ) ;
92
+ expect ( messages ) . toEqual ( [ expected_message ] ) ;
93
+ } ) ) ;
94
+
95
+ ( [
96
+ [ [ 0x0c , 0x94 , 0x02 , 0x81 , 0xa1 , 0x74 , 0xa1 , 0x75 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x08 ] ,
63
97
{
98
+ headers : {
99
+ "t" : "u"
100
+ } ,
64
101
type : MessageType . StreamItem ,
65
102
invocationId : "abc" ,
66
103
item : 8
67
- } as ResultMessage ]
68
- ] as [ [ number [ ] , CompletionMessage ] ] ) . forEach ( ( [ payload , expected_message ] ) =>
69
- it ( "can read Result message" , ( ) => {
104
+ } as StreamItemMessage ]
105
+ ] as [ [ number [ ] , StreamItemMessage ] ] ) . forEach ( ( [ payload , expected_message ] ) =>
106
+ it ( "can read message with headers " , ( ) => {
70
107
let messages = new MessagePackHubProtocol ( ) . parseMessages ( new Uint8Array ( payload ) . buffer ) ;
71
108
expect ( messages ) . toEqual ( [ expected_message ] ) ;
72
109
} ) ) ;
73
110
74
111
( [
75
- [ [ 0x00 ] , new Error ( "Invalid payload." ) ] ,
76
- [ [ 0x01 , 0x90 ] , new Error ( "Invalid payload." ) ] ,
77
- [ [ 0x01 , 0xc2 ] , new Error ( "Invalid payload." ) ] ,
78
- [ [ 0x02 , 0x91 , 0x05 ] , new Error ( "Invalid message type." ) ] ,
79
- [ [ 0x03 , 0x91 , 0xa1 , 0x78 ] , new Error ( "Invalid message type." ) ] ,
80
- [ [ 0x02 , 0x91 , 0x01 ] , new Error ( "Invalid payload for Invocation message." ) ] ,
81
- [ [ 0x02 , 0x91 , 0x02 ] , new Error ( "Invalid payload for stream Result message." ) ] ,
82
- [ [ 0x03 , 0x92 , 0x03 , 0xa0 ] , new Error ( "Invalid payload for Completion message." ) ] ,
83
- [ [ 0x05 , 0x94 , 0x03 , 0xa0 , 0x02 , 0x00 ] , new Error ( "Invalid payload for Completion message." ) ] ,
84
- [ [ 0x04 , 0x93 , 0x03 , 0xa0 , 0x01 ] , new Error ( "Invalid payload for Completion message." ) ] ,
85
- [ [ 0x04 , 0x93 , 0x03 , 0xa0 , 0x03 ] , new Error ( "Invalid payload for Completion message." ) ]
86
- ] as [ number [ ] , Error ] [ ] ) . forEach ( ( [ payload , expected_error ] ) =>
87
- it ( "throws for invalid messages" , ( ) => {
112
+ [ "message with no payload" , [ 0x00 ] , new Error ( "Invalid payload." ) ] ,
113
+ [ "message with empty array" , [ 0x01 , 0x90 ] , new Error ( "Invalid payload." ) ] ,
114
+ [ "message without outer array" , [ 0x01 , 0xc2 ] , new Error ( "Invalid payload." ) ] ,
115
+ [ "message with out-of-range message type" , [ 0x03 , 0x92 , 0x05 , 0x80 ] , new Error ( "Invalid message type." ) ] ,
116
+ [ "message with non-integer message type" , [ 0x04 , 0x92 , 0xa1 , 0x78 , 0x80 ] , new Error ( "Invalid message type." ) ] ,
117
+ [ "message with invalid headers" , [ 0x03 , 0x92 , 0x01 , 0x05 ] , new Error ( "Invalid headers." ) ] ,
118
+ [ "Invocation message with invalid invocation id" , [ 0x03 , 0x92 , 0x01 , 0x80 ] , new Error ( "Invalid payload for Invocation message." ) ] ,
119
+ [ "StreamItem message with invalid invocation id" , [ 0x03 , 0x92 , 0x02 , 0x80 ] , new Error ( "Invalid payload for stream Result message." ) ] ,
120
+ [ "Completion message with invalid invocation id" , [ 0x04 , 0x93 , 0x03 , 0x80 , 0xa0 ] , new Error ( "Invalid payload for Completion message." ) ] ,
121
+ [ "Completion message with unexpected result" , [ 0x06 , 0x95 , 0x03 , 0x80 , 0xa0 , 0x02 , 0x00 ] , new Error ( "Invalid payload for Completion message." ) ] ,
122
+ [ "Completion message with missing result" , [ 0x05 , 0x94 , 0x03 , 0x80 , 0xa0 , 0x01 ] , new Error ( "Invalid payload for Completion message." ) ] ,
123
+ [ "Completion message with missing error" , [ 0x05 , 0x94 , 0x03 , 0x80 , 0xa0 , 0x03 ] , new Error ( "Invalid payload for Completion message." ) ]
124
+ ] as [ string , number [ ] , Error ] [ ] ) . forEach ( ( [ name , payload , expected_error ] ) =>
125
+ it ( "throws for " + name , ( ) => {
88
126
expect ( ( ) => new MessagePackHubProtocol ( ) . parseMessages ( new Uint8Array ( payload ) . buffer ) )
89
127
. toThrow ( expected_error ) ;
90
128
} ) ) ;
91
129
92
130
it ( "can read multiple messages" , ( ) => {
93
131
let payload = [
94
- 0x07 , 0x93 , 0x02 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x08 ,
95
- 0x0a , 0x94 , 0x03 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x03 , 0xa2 , 0x4f , 0x4b ] ;
132
+ 0x08 , 0x94 , 0x02 , 0x80 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x08 ,
133
+ 0x0b , 0x95 , 0x03 , 0x80 , 0xa3 , 0x61 , 0x62 , 0x63 , 0x03 , 0xa2 , 0x4f , 0x4b ] ;
96
134
let messages = new MessagePackHubProtocol ( ) . parseMessages ( new Uint8Array ( payload ) . buffer ) ;
97
135
expect ( messages ) . toEqual ( [
98
136
{
137
+ headers : { } ,
99
138
type : MessageType . StreamItem ,
100
139
invocationId : "abc" ,
101
140
item : 8
102
- } as ResultMessage ,
141
+ } as StreamItemMessage ,
103
142
{
143
+ headers : { } ,
104
144
type : MessageType . Completion ,
105
145
invocationId : "abc" ,
106
146
error : null ,
0 commit comments