@furystack/websocket-api 12.0.2 → 12.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -92
- package/README.md +8 -6
- package/esm/actions/whoami.d.ts.map +1 -1
- package/esm/actions/whoami.js +8 -1
- package/esm/actions/whoami.js.map +1 -1
- package/esm/actions/whoami.spec.js.map +1 -1
- package/esm/helpers.spec.js +3 -3
- package/esm/helpers.spec.js.map +1 -1
- package/esm/websocket-api.d.ts +2 -2
- package/esm/websocket-api.d.ts.map +1 -1
- package/esm/websocket-api.js +8 -6
- package/esm/websocket-api.js.map +1 -1
- package/esm/websocket-api.spec.js.map +1 -1
- package/esm/websocket-integration.spec.js +7 -7
- package/esm/websocket-integration.spec.js.map +1 -1
- package/package.json +7 -7
- package/src/actions/whoami.spec.ts +2 -2
- package/src/actions/whoami.ts +10 -1
- package/src/helpers.spec.ts +3 -3
- package/src/websocket-api.spec.ts +2 -2
- package/src/websocket-api.ts +16 -14
- package/src/websocket-integration.spec.ts +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -7,168 +7,78 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
7
7
|
|
|
8
8
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
10
|
### [7.0.61](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.60...@furystack/websocket-api@7.0.61) (2022-02-02)
|
|
16
11
|
|
|
17
12
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
18
13
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
14
|
### [7.0.60](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.58...@furystack/websocket-api@7.0.60) (2022-01-10)
|
|
25
15
|
|
|
26
16
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
27
17
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
18
|
### [7.0.59](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.58...@furystack/websocket-api@7.0.59) (2022-01-10)
|
|
34
19
|
|
|
35
20
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
36
21
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
22
|
### [7.0.58](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.57...@furystack/websocket-api@7.0.58) (2021-12-20)
|
|
43
23
|
|
|
44
24
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
45
25
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
26
|
### [7.0.57](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.56...@furystack/websocket-api@7.0.57) (2021-12-08)
|
|
52
27
|
|
|
53
28
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
54
29
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
30
|
### [7.0.56](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.55...@furystack/websocket-api@7.0.56) (2021-11-30)
|
|
61
31
|
|
|
62
32
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
63
33
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
34
|
### [7.0.55](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.54...@furystack/websocket-api@7.0.55) (2021-11-29)
|
|
70
35
|
|
|
71
36
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
72
37
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
38
|
### [7.0.54](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.53...@furystack/websocket-api@7.0.54) (2021-11-19)
|
|
79
39
|
|
|
80
40
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
81
41
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
42
|
### [7.0.53](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.52...@furystack/websocket-api@7.0.53) (2021-11-17)
|
|
88
43
|
|
|
89
44
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
90
45
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
46
|
### [7.0.52](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.51...@furystack/websocket-api@7.0.52) (2021-11-09)
|
|
97
47
|
|
|
98
48
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
99
49
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
50
|
### [7.0.51](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.50...@furystack/websocket-api@7.0.51) (2021-10-15)
|
|
106
51
|
|
|
107
52
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
108
53
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
54
|
### [7.0.50](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.49...@furystack/websocket-api@7.0.50) (2021-10-05)
|
|
115
55
|
|
|
116
56
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
117
57
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
58
|
### [7.0.49](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.48...@furystack/websocket-api@7.0.49) (2021-09-16)
|
|
124
59
|
|
|
125
60
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
126
61
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
62
|
### [7.0.48](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.47...@furystack/websocket-api@7.0.48) (2021-08-27)
|
|
133
63
|
|
|
134
64
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
135
65
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
66
|
### [7.0.47](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.46...@furystack/websocket-api@7.0.47) (2021-08-25)
|
|
142
67
|
|
|
143
68
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
144
69
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
70
|
### [7.0.46](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.45...@furystack/websocket-api@7.0.46) (2021-08-19)
|
|
151
71
|
|
|
152
72
|
**Note:** Version bump only for package @furystack/websocket-api
|
|
153
73
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
74
|
### [7.0.45](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.15...@furystack/websocket-api@7.0.45) (2021-08-19)
|
|
160
75
|
|
|
161
|
-
|
|
162
76
|
### 🐛 Bug Fixes
|
|
163
77
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
78
|
+
- **websocket:** open constant ([94e10ff](https://github.com/furystack/furystack/commit/94e10ffb564876e0e8b77078db5d6b6673e83c74))
|
|
168
79
|
|
|
169
80
|
### [7.0.44](https://github.com/furystack/furystack/compare/@furystack/websocket-api@7.0.15...@furystack/websocket-api@7.0.44) (2021-07-30)
|
|
170
81
|
|
|
171
|
-
|
|
172
82
|
### 🐛 Bug Fixes
|
|
173
83
|
|
|
174
|
-
|
|
84
|
+
- **websocket:** open constant ([94e10ff](https://github.com/furystack/furystack/commit/94e10ffb564876e0e8b77078db5d6b6673e83c74))
|
package/README.md
CHANGED
|
@@ -7,11 +7,10 @@ WebSocket implementation for FuryStack
|
|
|
7
7
|
You can initialize the WebSocket package in the following way
|
|
8
8
|
|
|
9
9
|
```ts
|
|
10
|
-
const myInjector = new Injector()
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
})
|
|
10
|
+
const myInjector = new Injector().useWebsockets({
|
|
11
|
+
path: '/api/sockets',
|
|
12
|
+
actions: [WhoAmI],
|
|
13
|
+
})
|
|
15
14
|
```
|
|
16
15
|
|
|
17
16
|
### Implement your own actions
|
|
@@ -40,6 +39,9 @@ export class WhoAmI implements WebSocketAction {
|
|
|
40
39
|
this.websocket.send(JSON.stringify(currentUser))
|
|
41
40
|
}
|
|
42
41
|
|
|
43
|
-
constructor(
|
|
42
|
+
constructor(
|
|
43
|
+
private httpUserContext: HttpUserContext<User>,
|
|
44
|
+
private websocket: ws,
|
|
45
|
+
) {}
|
|
44
46
|
}
|
|
45
47
|
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":";;;AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAE3C;;GAEG;AACH,qBACa,MAAO,YAAW,eAAe;IACrC,OAAO;WAGA,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":";;;AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAE3C;;GAEG;AACH,qBACa,MAAO,YAAW,eAAe;IACrC,OAAO;WAGA,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO;IAavE,OAAO,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IASzF,iBACyB,eAAe,CAAiB;CAC1D"}
|
package/esm/actions/whoami.js
CHANGED
|
@@ -17,7 +17,14 @@ let WhoAmI = class WhoAmI {
|
|
|
17
17
|
/** */
|
|
18
18
|
}
|
|
19
19
|
static canExecute(options) {
|
|
20
|
-
|
|
20
|
+
const stringifiedValue = typeof options.data === 'string'
|
|
21
|
+
? options.data
|
|
22
|
+
: options.data instanceof Buffer
|
|
23
|
+
? options.data.toString()
|
|
24
|
+
: options.data instanceof ArrayBuffer
|
|
25
|
+
? Buffer.from(options.data).toString()
|
|
26
|
+
: options.data.map((buf) => buf.toString()).join('');
|
|
27
|
+
return stringifiedValue === 'whoami' || stringifiedValue === 'whoami /claims';
|
|
21
28
|
}
|
|
22
29
|
async execute(options) {
|
|
23
30
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAKxD;;GAEG;AAEI,IAAM,MAAM,GAAZ,MAAM,MAAM;IACV,OAAO;QACZ,MAAM;IACR,CAAC;IACM,MAAM,CAAC,UAAU,CAAC,OAAiD;QACxE,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/actions/whoami.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAKxD;;GAEG;AAEI,IAAM,MAAM,GAAZ,MAAM,MAAM;IACV,OAAO;QACZ,MAAM;IACR,CAAC;IACM,MAAM,CAAC,UAAU,CAAC,OAAiD;QACxE,MAAM,gBAAgB,GACpB,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAC9B,CAAC,CAAC,OAAO,CAAC,IAAI;YACd,CAAC,CAAC,OAAO,CAAC,IAAI,YAAY,MAAM;gBAC9B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACzB,CAAC,CAAC,OAAO,CAAC,IAAI,YAAY,WAAW;oBACnC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;oBACtC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAE5D,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,gBAAgB,CAAA;IAC/E,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAoE;QACvF,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC9E,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;CAIF,CAAA;AAD0B;IADxB,QAAQ,CAAC,eAAe,CAAC;8BACgB,eAAe;+CAAA;AA3B9C,MAAM;IADlB,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,MAAM,CA4BlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.spec.js","sourceRoot":"","sources":["../../src/actions/whoami.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;IAC5C,MAAM,WAAW,GAAoB,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,EAAgC,CAAA;IAE9G,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,oBAAoB,EAAqB,CAAA;IAEhE,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"whoami.spec.js","sourceRoot":"","sources":["../../src/actions/whoami.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;IAC5C,MAAM,WAAW,GAAoB,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,EAAgC,CAAA;IAE9G,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,oBAAoB,EAAqB,CAAA;IAEhE,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KACyC,CAAA;IAEvE,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAClD,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;YAC1D,QAAQ,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YAC7C,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;YAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/esm/helpers.spec.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { using } from '@furystack/utils';
|
|
2
2
|
import { Injector } from '@furystack/inject';
|
|
3
3
|
import { useWebsockets } from './helpers.js';
|
|
4
4
|
import { describe, it, expect } from 'vitest';
|
|
5
5
|
import { WebSocketApiSettings } from './websocket-api-settings.js';
|
|
6
6
|
import { getPort } from '@furystack/core/port-generator';
|
|
7
7
|
describe('WebSocket Helpers', () => {
|
|
8
|
-
it('Should register the settings',
|
|
9
|
-
|
|
8
|
+
it('Should register the settings', () => {
|
|
9
|
+
using(new Injector(), (i) => {
|
|
10
10
|
const port = getPort();
|
|
11
11
|
useWebsockets(i, { port });
|
|
12
12
|
const settings = i.getInstance(WebSocketApiSettings);
|
package/esm/helpers.spec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../src/helpers.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../src/helpers.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAExD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,KAAK,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;YACtB,aAAa,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAA;YACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/esm/websocket-api.d.ts
CHANGED
|
@@ -18,13 +18,13 @@ export declare class WebSocketApi implements Disposable {
|
|
|
18
18
|
private readonly serverManager;
|
|
19
19
|
private readonly injector;
|
|
20
20
|
private isInitialized;
|
|
21
|
-
init(): void
|
|
21
|
+
init(): Promise<void>;
|
|
22
22
|
dispose(): Promise<void>;
|
|
23
23
|
broadcast(callback: (options: {
|
|
24
24
|
injector: Injector;
|
|
25
25
|
ws: ws;
|
|
26
26
|
message: IncomingMessage;
|
|
27
27
|
}) => void | Promise<void>): Promise<void>;
|
|
28
|
-
execute(data: Data, request: IncomingMessage, injector: Injector, socket: WebSocket):
|
|
28
|
+
execute(data: Data, request: IncomingMessage, injector: Injector, socket: WebSocket): void;
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=websocket-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-api.d.ts","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":";;;;AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,
|
|
1
|
+
{"version":3,"file":"websocket-api.d.ts","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":";;;;AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,KAAK,SAAS,MAAM,IAAI,CAAA;AAE/B,OAAO,EAAE,MAAM,IAAI,CAAA;AAKnB;;GAEG;AACH,qBACa,YAAa,YAAW,UAAU;IAC7C,SAAgB,MAAM,6DAA0C;IAEhE,OAAO,CAAC,OAAO,CAA0E;IAEzF,iBACyB,QAAQ,CAAsB;IAEvD,iBACyB,aAAa,CAAe;IAErD,iBAAyB,QAAQ,CAAU;IAE3C,OAAO,CAAC,aAAa,CAAQ;IAChB,IAAI;IA2CJ,OAAO;IAMP,SAAS,CACpB,QAAQ,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,EAAE,EAAE,EAAE,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS;CAQ3F"}
|
package/esm/websocket-api.js
CHANGED
|
@@ -11,7 +11,7 @@ import { URL } from 'url';
|
|
|
11
11
|
import { IncomingMessage } from 'http';
|
|
12
12
|
import { HttpUserContext, ServerManager } from '@furystack/rest-service';
|
|
13
13
|
import { Injectable, Injected } from '@furystack/inject';
|
|
14
|
-
import {
|
|
14
|
+
import { using } from '@furystack/utils';
|
|
15
15
|
import { WebSocketServer } from 'ws';
|
|
16
16
|
import ws from 'ws';
|
|
17
17
|
import { WebSocketApiSettings } from './websocket-api-settings.js';
|
|
@@ -23,7 +23,7 @@ let WebSocketApi = class WebSocketApi {
|
|
|
23
23
|
socket = new WebSocketServer({ noServer: true });
|
|
24
24
|
clients = new Map();
|
|
25
25
|
isInitialized = false;
|
|
26
|
-
init() {
|
|
26
|
+
async init() {
|
|
27
27
|
if (!this.isInitialized) {
|
|
28
28
|
this.socket.on('connection', (websocket, msg) => {
|
|
29
29
|
const connectionInjector = this.injector.createChild({ owner: msg });
|
|
@@ -43,7 +43,9 @@ let WebSocketApi = class WebSocketApi {
|
|
|
43
43
|
this.clients.delete(websocket);
|
|
44
44
|
});
|
|
45
45
|
});
|
|
46
|
-
this.serverManager
|
|
46
|
+
await this.serverManager
|
|
47
|
+
.getOrCreate({ port: this.settings.port, hostName: this.settings.host })
|
|
48
|
+
.then((server) => {
|
|
47
49
|
server.server.on('upgrade', (request, socket, head) => {
|
|
48
50
|
const { pathname } = new URL(request.url, `http://${request.headers.host}`);
|
|
49
51
|
if (pathname === this.settings.path) {
|
|
@@ -79,11 +81,11 @@ let WebSocketApi = class WebSocketApi {
|
|
|
79
81
|
throw new AggregatedError('The Broadcast operation encountered some errors', errors);
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
|
-
|
|
84
|
+
execute(data, request, injector, socket) {
|
|
83
85
|
const Action = this.settings.actions.find((a) => a.canExecute({ data, request, socket }));
|
|
84
86
|
if (Action) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
using(injector.getInstance(Action), (action) => {
|
|
88
|
+
action.execute({ data, request, socket });
|
|
87
89
|
});
|
|
88
90
|
}
|
|
89
91
|
}
|
package/esm/websocket-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-api.js","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAExE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"websocket-api.js","sourceRoot":"","sources":["../src/websocket-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-api.spec.js","sourceRoot":"","sources":["../src/websocket-api.spec.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"websocket-api.spec.js","sourceRoot":"","sources":["../src/websocket-api.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ describe('WebSocket Integration tests', () => {
|
|
|
16
16
|
beforeEach(async () => {
|
|
17
17
|
i = new Injector();
|
|
18
18
|
port = getPort();
|
|
19
|
-
useRestService({
|
|
19
|
+
await useRestService({
|
|
20
20
|
injector: i,
|
|
21
21
|
api: {},
|
|
22
22
|
root: '',
|
|
@@ -26,17 +26,18 @@ describe('WebSocket Integration tests', () => {
|
|
|
26
26
|
addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }));
|
|
27
27
|
useHttpAuthentication(i, {});
|
|
28
28
|
useWebsockets(i, { actions: [WhoAmI], path, port, host });
|
|
29
|
-
await new Promise((
|
|
29
|
+
await new Promise((resolve, reject) => {
|
|
30
30
|
i.getInstance(ServerManager)
|
|
31
31
|
.getOrCreate({ port })
|
|
32
32
|
.then(() => {
|
|
33
33
|
client = new WebSocket(`ws://${host}:${port}/ws`);
|
|
34
34
|
client
|
|
35
35
|
.on('open', () => {
|
|
36
|
-
|
|
36
|
+
resolve();
|
|
37
37
|
})
|
|
38
38
|
.on('error', reject);
|
|
39
|
-
})
|
|
39
|
+
})
|
|
40
|
+
.catch(reject);
|
|
40
41
|
});
|
|
41
42
|
});
|
|
42
43
|
afterEach(async () => {
|
|
@@ -59,13 +60,12 @@ describe('WebSocket Integration tests', () => {
|
|
|
59
60
|
it('Should be authenticated, roles should be updated and should be logged out', async () => {
|
|
60
61
|
const testUser = { username: 'test', password: 'test', roles: [] };
|
|
61
62
|
const userStore = i.getInstance(StoreManager).getStoreFor(User, 'username');
|
|
62
|
-
userStore.add(testUser);
|
|
63
|
+
await userStore.add(testUser);
|
|
63
64
|
const userCtx = i.getInstance(HttpUserContext);
|
|
64
65
|
let cookie = '';
|
|
65
66
|
await userCtx.cookieLogin(testUser, {
|
|
66
67
|
setHeader: (_setCookie, cookieValue) => {
|
|
67
68
|
cookie = cookieValue;
|
|
68
|
-
return {};
|
|
69
69
|
},
|
|
70
70
|
});
|
|
71
71
|
const authenticatedClient = await new Promise((done, reject) => {
|
|
@@ -78,7 +78,7 @@ describe('WebSocket Integration tests', () => {
|
|
|
78
78
|
});
|
|
79
79
|
const whoAmIResult = await getWhoAmIResult(authenticatedClient);
|
|
80
80
|
expect(whoAmIResult.currentUser).toEqual(testUser);
|
|
81
|
-
userStore.update(testUser.username, { ...testUser, roles: ['newFancyRole'] });
|
|
81
|
+
await userStore.update(testUser.username, { ...testUser, roles: ['newFancyRole'] });
|
|
82
82
|
const updatedWhoAmIResult = await getWhoAmIResult(authenticatedClient);
|
|
83
83
|
expect(updatedWhoAmIResult.currentUser.roles).toEqual(['newFancyRole']);
|
|
84
84
|
await userCtx.cookieLogout({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-integration.spec.js","sourceRoot":"","sources":["../src/websocket-integration.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAExD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,MAAM,IAAI,GAAG,WAAW,CAAA;IACxB,MAAM,IAAI,GAAG,KAAK,CAAA;IAClB,IAAI,CAAY,CAAA;IAChB,IAAI,MAAiB,CAAA;IACrB,IAAI,IAAY,CAAA;IAEhB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAA;QAClB,IAAI,GAAG,OAAO,EAAE,CAAA;QAChB,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket-integration.spec.js","sourceRoot":"","sources":["../src/websocket-integration.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/websocket-api",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.4",
|
|
4
4
|
"description": "HTTP Api FuryStack package",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -34,16 +34,16 @@
|
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://github.com/furystack/furystack",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@furystack/core": "^14.0.
|
|
38
|
-
"@furystack/inject": "^11.0.
|
|
39
|
-
"@furystack/rest-service": "^9.0.
|
|
40
|
-
"@furystack/utils": "^7.0.
|
|
41
|
-
"ws": "^8.
|
|
37
|
+
"@furystack/core": "^14.0.4",
|
|
38
|
+
"@furystack/inject": "^11.0.3",
|
|
39
|
+
"@furystack/rest-service": "^9.0.4",
|
|
40
|
+
"@furystack/utils": "^7.0.2",
|
|
41
|
+
"ws": "^8.17.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/ws": "^8.5.10",
|
|
45
45
|
"typescript": "^5.4.5",
|
|
46
|
-
"vitest": "^1.
|
|
46
|
+
"vitest": "^1.6.0"
|
|
47
47
|
},
|
|
48
48
|
"gitHead": "1045d854bfd8c475b7035471d130d401417a2321"
|
|
49
49
|
}
|
|
@@ -12,9 +12,9 @@ describe('Whoami action', () => {
|
|
|
12
12
|
|
|
13
13
|
const request = { url: 'https://google.com' } as IncomingMessage
|
|
14
14
|
|
|
15
|
-
const wsMock
|
|
15
|
+
const wsMock = {
|
|
16
16
|
send: vi.fn(() => undefined),
|
|
17
|
-
} as unknown as ws
|
|
17
|
+
} as unknown as ws & { send: (this: void, ...args: unknown[]) => void }
|
|
18
18
|
|
|
19
19
|
it('cannot be executed if data does not match', () => {
|
|
20
20
|
expect(WhoAmI.canExecute({ request, data: 'asd' })).toBeFalsy()
|
package/src/actions/whoami.ts
CHANGED
|
@@ -13,7 +13,16 @@ export class WhoAmI implements WebSocketAction {
|
|
|
13
13
|
/** */
|
|
14
14
|
}
|
|
15
15
|
public static canExecute(options: { data: Data; request: IncomingMessage }): boolean {
|
|
16
|
-
|
|
16
|
+
const stringifiedValue =
|
|
17
|
+
typeof options.data === 'string'
|
|
18
|
+
? options.data
|
|
19
|
+
: options.data instanceof Buffer
|
|
20
|
+
? options.data.toString()
|
|
21
|
+
: options.data instanceof ArrayBuffer
|
|
22
|
+
? Buffer.from(options.data).toString()
|
|
23
|
+
: options.data.map((buf) => buf.toString()).join('')
|
|
24
|
+
|
|
25
|
+
return stringifiedValue === 'whoami' || stringifiedValue === 'whoami /claims'
|
|
17
26
|
}
|
|
18
27
|
|
|
19
28
|
public async execute(options: { data: Data; request: IncomingMessage; socket: WebSocket }) {
|
package/src/helpers.spec.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { using } from '@furystack/utils'
|
|
2
2
|
import { Injector } from '@furystack/inject'
|
|
3
3
|
import { useWebsockets } from './helpers.js'
|
|
4
4
|
import { describe, it, expect } from 'vitest'
|
|
@@ -6,8 +6,8 @@ import { WebSocketApiSettings } from './websocket-api-settings.js'
|
|
|
6
6
|
import { getPort } from '@furystack/core/port-generator'
|
|
7
7
|
|
|
8
8
|
describe('WebSocket Helpers', () => {
|
|
9
|
-
it('Should register the settings',
|
|
10
|
-
|
|
9
|
+
it('Should register the settings', () => {
|
|
10
|
+
using(new Injector(), (i) => {
|
|
11
11
|
const port = getPort()
|
|
12
12
|
useWebsockets(i, { port })
|
|
13
13
|
const settings = i.getInstance(WebSocketApiSettings)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injector, Injectable } from '@furystack/inject'
|
|
2
2
|
import { usingAsync } from '@furystack/utils'
|
|
3
3
|
import { WebSocketApi } from './websocket-api.js'
|
|
4
|
-
import { WebSocket } from 'ws'
|
|
4
|
+
import { WebSocket, type Data } from 'ws'
|
|
5
5
|
import type { WebSocketAction } from './models/websocket-action.js'
|
|
6
6
|
import { useWebsockets } from './helpers.js'
|
|
7
7
|
import { describe, it, expect } from 'vitest'
|
|
@@ -79,7 +79,7 @@ describe('WebSocketApi', () => {
|
|
|
79
79
|
return true
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
public async execute(incomingData:
|
|
82
|
+
public async execute(incomingData: { data: Data }) {
|
|
83
83
|
expect(JSON.parse(incomingData.data.toString())).toEqual(data)
|
|
84
84
|
}
|
|
85
85
|
}
|
package/src/websocket-api.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { IncomingMessage } from 'http'
|
|
|
4
4
|
import { HttpUserContext, ServerManager } from '@furystack/rest-service'
|
|
5
5
|
import type { Injector } from '@furystack/inject'
|
|
6
6
|
import { Injectable, Injected } from '@furystack/inject'
|
|
7
|
-
import {
|
|
7
|
+
import { using, type Disposable } from '@furystack/utils'
|
|
8
8
|
import type { Data } from 'ws'
|
|
9
9
|
import type WebSocket from 'ws'
|
|
10
10
|
import { WebSocketServer } from 'ws'
|
|
@@ -31,7 +31,7 @@ export class WebSocketApi implements Disposable {
|
|
|
31
31
|
private declare readonly injector: Injector
|
|
32
32
|
|
|
33
33
|
private isInitialized = false
|
|
34
|
-
public init() {
|
|
34
|
+
public async init() {
|
|
35
35
|
if (!this.isInitialized) {
|
|
36
36
|
this.socket.on('connection', (websocket, msg) => {
|
|
37
37
|
const connectionInjector = this.injector.createChild({ owner: msg })
|
|
@@ -58,16 +58,18 @@ export class WebSocketApi implements Disposable {
|
|
|
58
58
|
})
|
|
59
59
|
})
|
|
60
60
|
|
|
61
|
-
this.serverManager
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
await this.serverManager
|
|
62
|
+
.getOrCreate({ port: this.settings.port, hostName: this.settings.host })
|
|
63
|
+
.then((server) => {
|
|
64
|
+
server.server.on('upgrade', (request: IncomingMessage, socket: Socket, head: Buffer) => {
|
|
65
|
+
const { pathname } = new URL(request.url as string, `http://${request.headers.host}`)
|
|
66
|
+
if (pathname === this.settings.path) {
|
|
67
|
+
this.socket.handleUpgrade(request, socket, head, (websocket) => {
|
|
68
|
+
this.socket.emit('connection', websocket, request)
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
})
|
|
69
72
|
})
|
|
70
|
-
})
|
|
71
73
|
} else {
|
|
72
74
|
throw Error('WebSocket API is already initialized')
|
|
73
75
|
}
|
|
@@ -98,11 +100,11 @@ export class WebSocketApi implements Disposable {
|
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
|
|
101
|
-
public
|
|
103
|
+
public execute(data: Data, request: IncomingMessage, injector: Injector, socket: WebSocket) {
|
|
102
104
|
const Action = this.settings.actions.find((a) => a.canExecute({ data, request, socket }))
|
|
103
105
|
if (Action) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
using(injector.getInstance<WebSocketAction>(Action), (action) => {
|
|
107
|
+
action.execute({ data, request, socket })
|
|
106
108
|
})
|
|
107
109
|
}
|
|
108
110
|
}
|
|
@@ -18,7 +18,7 @@ describe('WebSocket Integration tests', () => {
|
|
|
18
18
|
beforeEach(async () => {
|
|
19
19
|
i = new Injector()
|
|
20
20
|
port = getPort()
|
|
21
|
-
useRestService({
|
|
21
|
+
await useRestService({
|
|
22
22
|
injector: i,
|
|
23
23
|
api: {},
|
|
24
24
|
root: '',
|
|
@@ -31,17 +31,18 @@ describe('WebSocket Integration tests', () => {
|
|
|
31
31
|
useHttpAuthentication(i, {})
|
|
32
32
|
useWebsockets(i, { actions: [WhoAmI], path, port, host })
|
|
33
33
|
|
|
34
|
-
await new Promise<void>((
|
|
34
|
+
await new Promise<void>((resolve, reject) => {
|
|
35
35
|
i.getInstance(ServerManager)
|
|
36
36
|
.getOrCreate({ port })
|
|
37
37
|
.then(() => {
|
|
38
38
|
client = new WebSocket(`ws://${host}:${port}/ws`)
|
|
39
39
|
client
|
|
40
40
|
.on('open', () => {
|
|
41
|
-
|
|
41
|
+
resolve()
|
|
42
42
|
})
|
|
43
43
|
.on('error', reject)
|
|
44
44
|
})
|
|
45
|
+
.catch(reject)
|
|
45
46
|
})
|
|
46
47
|
})
|
|
47
48
|
|
|
@@ -50,8 +51,8 @@ describe('WebSocket Integration tests', () => {
|
|
|
50
51
|
})
|
|
51
52
|
const getWhoAmIResult = async (subjectClient: WebSocket) => {
|
|
52
53
|
return new Promise<{ currentUser: User }>((resolve, reject) => {
|
|
53
|
-
subjectClient.once('message', (data:
|
|
54
|
-
resolve(JSON.parse(data.toString()))
|
|
54
|
+
subjectClient.once('message', (data: Buffer) => {
|
|
55
|
+
resolve(JSON.parse(data.toString()) as { currentUser: User })
|
|
55
56
|
})
|
|
56
57
|
subjectClient.once('error', reject)
|
|
57
58
|
subjectClient.send('whoami')
|
|
@@ -68,15 +69,14 @@ describe('WebSocket Integration tests', () => {
|
|
|
68
69
|
const testUser = { username: 'test', password: 'test', roles: [] } as User
|
|
69
70
|
|
|
70
71
|
const userStore = i.getInstance(StoreManager).getStoreFor(User, 'username')
|
|
71
|
-
userStore.add(testUser)
|
|
72
|
+
await userStore.add(testUser)
|
|
72
73
|
|
|
73
74
|
const userCtx = i.getInstance(HttpUserContext)
|
|
74
75
|
|
|
75
76
|
let cookie = ''
|
|
76
77
|
await userCtx.cookieLogin(testUser, {
|
|
77
78
|
setHeader: (_setCookie, cookieValue) => {
|
|
78
|
-
cookie = cookieValue
|
|
79
|
-
return {} as any
|
|
79
|
+
cookie = cookieValue
|
|
80
80
|
},
|
|
81
81
|
})
|
|
82
82
|
|
|
@@ -91,7 +91,7 @@ describe('WebSocket Integration tests', () => {
|
|
|
91
91
|
const whoAmIResult = await getWhoAmIResult(authenticatedClient)
|
|
92
92
|
expect(whoAmIResult.currentUser).toEqual(testUser)
|
|
93
93
|
|
|
94
|
-
userStore.update(testUser.username, { ...testUser, roles: ['newFancyRole'] })
|
|
94
|
+
await userStore.update(testUser.username, { ...testUser, roles: ['newFancyRole'] })
|
|
95
95
|
|
|
96
96
|
const updatedWhoAmIResult = await getWhoAmIResult(authenticatedClient)
|
|
97
97
|
expect(updatedWhoAmIResult.currentUser.roles).toEqual(['newFancyRole'])
|