uws-react-native 0.0.11 → 0.1.0-beta.1
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/README.md +1 -1
- package/cpp/UwsReactNativeModule.cpp +4 -0
- package/cpp/app/HttpResponseObject.h +116 -40
- package/cpp/app/RecognizedString.h +20 -14
- package/cpp/app/TemplatedAppObject.h +61 -36
- package/cpp/app/WebSocketBehaviorImpl.h +269 -11
- package/cpp/app/WebSocketObject.h +354 -16
- package/cpp/app/WebSocketUserData.h +227 -0
- package/lib/commonjs/modules/WebSocketSendStatus.js +22 -0
- package/lib/commonjs/modules/WebSocketSendStatus.js.map +1 -0
- package/lib/commonjs/modules/index.js +22 -0
- package/lib/commonjs/modules/index.js.map +1 -1
- package/lib/commonjs/types/WebSocketUserData.js +2 -0
- package/lib/commonjs/types/WebSocketUserData.js.map +1 -0
- package/lib/module/modules/WebSocketSendStatus.js +18 -0
- package/lib/module/modules/WebSocketSendStatus.js.map +1 -0
- package/lib/module/modules/index.js +2 -1
- package/lib/module/modules/index.js.map +1 -1
- package/lib/module/types/WebSocketUserData.js +2 -0
- package/lib/module/types/WebSocketUserData.js.map +1 -0
- package/lib/typescript/commonjs/modules/WebSocketSendStatus.d.ts +15 -0
- package/lib/typescript/commonjs/modules/WebSocketSendStatus.d.ts.map +1 -0
- package/lib/typescript/commonjs/modules/index.d.ts +2 -0
- package/lib/typescript/commonjs/modules/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/types/HttpResponse.d.ts +35 -0
- package/lib/typescript/commonjs/types/HttpResponse.d.ts.map +1 -1
- package/lib/typescript/commonjs/types/HttpRouterOptions.d.ts +1 -1
- package/lib/typescript/commonjs/types/TemplatedApp.d.ts +5 -0
- package/lib/typescript/commonjs/types/TemplatedApp.d.ts.map +1 -1
- package/lib/typescript/commonjs/types/WebSocket.d.ts +18 -8
- package/lib/typescript/commonjs/types/WebSocket.d.ts.map +1 -1
- package/lib/typescript/commonjs/types/WebSocketBehavior.d.ts +9 -9
- package/lib/typescript/commonjs/types/WebSocketBehavior.d.ts.map +1 -1
- package/lib/typescript/commonjs/types/WebSocketUserData.d.ts +9 -0
- package/lib/typescript/commonjs/types/WebSocketUserData.d.ts.map +1 -0
- package/lib/typescript/commonjs/types/index.d.ts +3 -0
- package/lib/typescript/commonjs/types/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/types/us_socket_context_t.d.ts +2 -3
- package/lib/typescript/commonjs/types/us_socket_context_t.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +2 -2
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/modules/App.d.ts +1 -1
- package/lib/typescript/module/modules/App.d.ts.map +1 -1
- package/lib/typescript/module/modules/WebSocketSendStatus.d.ts +15 -0
- package/lib/typescript/module/modules/WebSocketSendStatus.d.ts.map +1 -0
- package/lib/typescript/module/modules/getParts.d.ts +1 -1
- package/lib/typescript/module/modules/getParts.d.ts.map +1 -1
- package/lib/typescript/module/modules/index.d.ts +7 -5
- package/lib/typescript/module/modules/index.d.ts.map +1 -1
- package/lib/typescript/module/types/HttpRequest.d.ts +1 -1
- package/lib/typescript/module/types/HttpRequest.d.ts.map +1 -1
- package/lib/typescript/module/types/HttpResponse.d.ts +36 -1
- package/lib/typescript/module/types/HttpResponse.d.ts.map +1 -1
- package/lib/typescript/module/types/HttpRouterOptions.d.ts +1 -1
- package/lib/typescript/module/types/TemplatedApp.d.ts +10 -5
- package/lib/typescript/module/types/TemplatedApp.d.ts.map +1 -1
- package/lib/typescript/module/types/WebSocket.d.ts +19 -9
- package/lib/typescript/module/types/WebSocket.d.ts.map +1 -1
- package/lib/typescript/module/types/WebSocketBehavior.d.ts +14 -14
- package/lib/typescript/module/types/WebSocketBehavior.d.ts.map +1 -1
- package/lib/typescript/module/types/WebSocketUserData.d.ts +9 -0
- package/lib/typescript/module/types/WebSocketUserData.d.ts.map +1 -0
- package/lib/typescript/module/types/index.d.ts +8 -5
- package/lib/typescript/module/types/index.d.ts.map +1 -1
- package/lib/typescript/module/types/us_socket_context_t.d.ts +2 -3
- package/lib/typescript/module/types/us_socket_context_t.d.ts.map +1 -1
- package/lib/typescript/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/src/modules/WebSocketSendStatus.ts +14 -0
- package/src/modules/index.ts +2 -1
- package/src/types/HttpResponse.ts +46 -29
- package/src/types/HttpRouterOptions.ts +1 -1
- package/src/types/TemplatedApp.ts +10 -10
- package/src/types/WebSocket.ts +24 -8
- package/src/types/WebSocketBehavior.ts +9 -9
- package/src/types/WebSocketUserData.ts +28 -0
- package/src/types/index.ts +3 -2
- package/src/types/us_socket_context_t.ts +2 -3
|
@@ -2,9 +2,13 @@ import type {
|
|
|
2
2
|
RecognizedString,
|
|
3
3
|
} from "./RecognizedString"
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import type {
|
|
6
|
+
WebSocketUserData,
|
|
7
|
+
} from "./WebSocketUserData"
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
us_socket_context_t,
|
|
11
|
+
} from "./us_socket_context_t"
|
|
8
12
|
|
|
9
13
|
/**
|
|
10
14
|
* An HttpResponse is valid until either onAborted callback or any of the .end/.tryEnd calls succeed. You may attach user data to this object.
|
|
@@ -247,23 +251,45 @@ export interface HttpResponse {
|
|
|
247
251
|
totalSize: number,
|
|
248
252
|
) : [boolean, boolean],
|
|
249
253
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
254
|
+
/**
|
|
255
|
+
* Upgrades a HttpResponse to a WebSocket.
|
|
256
|
+
*
|
|
257
|
+
* Important! There is one difference compared to the uWebSockets.js.
|
|
258
|
+
* Instead of passing a user data object to the first argument,
|
|
259
|
+
* modify the user data object from the handler parameter at the first argument of this method.
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* ```ts
|
|
263
|
+
* uWS.App()
|
|
264
|
+
* .ws("/*", {
|
|
265
|
+
* upgrade: (res, req, context) => {
|
|
266
|
+
* // you can do an async task here
|
|
267
|
+
* // and then, call upgrade method from res
|
|
268
|
+
* res.upgrade(
|
|
269
|
+
* userData => { // do not do an async task in this
|
|
270
|
+
* userData.setString("your_love_letter", "hello world")
|
|
271
|
+
* userData.setBoolean("is_flat_earth", true)
|
|
272
|
+
* userData.setNumber("worth", 67)
|
|
273
|
+
* },
|
|
274
|
+
* req.getHeader("sec-websocket-key"),
|
|
275
|
+
* req.getHeader("sec-websocket-protocol"),
|
|
276
|
+
* req.getHeader("sec-websocket-extensions"),
|
|
277
|
+
* context,
|
|
278
|
+
* )
|
|
279
|
+
* },
|
|
280
|
+
* open: ws => {
|
|
281
|
+
* const isFlatEarth = ws.getUserData().getBoolean("is_flat_earth")
|
|
282
|
+
* },
|
|
283
|
+
* })
|
|
284
|
+
* ```
|
|
285
|
+
*/
|
|
286
|
+
upgrade(
|
|
287
|
+
userDataFn: (userData: WebSocketUserData) => void,
|
|
288
|
+
secWebSocketKey: RecognizedString,
|
|
289
|
+
secWebSocketProtocol: RecognizedString,
|
|
290
|
+
secWebSocketExtensions: RecognizedString,
|
|
291
|
+
context: us_socket_context_t,
|
|
292
|
+
) : void,
|
|
267
293
|
|
|
268
294
|
/**
|
|
269
295
|
* Enters or continues chunked encoding mode. Writes part of the response. End with zero length write. Returns true if no backpressure was added.
|
|
@@ -299,13 +325,4 @@ export interface HttpResponse {
|
|
|
299
325
|
writeStatus(
|
|
300
326
|
status: RecognizedString,
|
|
301
327
|
) : HttpResponse,
|
|
302
|
-
|
|
303
|
-
// TODO
|
|
304
|
-
// the `upgrade` method needs to be implemented first,
|
|
305
|
-
// but I also don't know how to attach arbitrary UserData to the HttpRequest object JSI C++.
|
|
306
|
-
// Probably, I would tell user to get the data explicitly from the ws.getUserData() method
|
|
307
|
-
// /**
|
|
308
|
-
// * Arbitrary user data may be attached to this object
|
|
309
|
-
// */
|
|
310
|
-
// [key: string]: unknown,
|
|
311
328
|
}
|
|
@@ -5,7 +5,7 @@ export interface HttpRouterOptions {
|
|
|
5
5
|
* if the body read is disabled.
|
|
6
6
|
*
|
|
7
7
|
* This is an actual optimization, because uws-react-native has to predefined the body read
|
|
8
|
-
* (the res->onDataV2) internally from C++ side by default. So if you disable body reading
|
|
8
|
+
* (the res->onDataV2) internally from C++ side by default. So, if you disable body reading
|
|
9
9
|
* in a specific route handler, uws-react-native will not do the predefined res->onDataV2 from C++ side at all.
|
|
10
10
|
*
|
|
11
11
|
* The reason why uws-react-native has to predefined the res->onDataV2 from C++ side, it is because we cannot do a sync call from uWebSockets C++ which run in arbitrary thread to JS, and late onDataV2 assignment will losing the body data. It is also by design that we run uWebSockets in another thread to prevent Main/UI thread blocking.
|
|
@@ -26,9 +26,9 @@ import type {
|
|
|
26
26
|
RecognizedString,
|
|
27
27
|
} from "./RecognizedString"
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
import type {
|
|
30
|
+
WebSocketBehavior,
|
|
31
|
+
} from "./WebSocketBehavior"
|
|
32
32
|
|
|
33
33
|
// import type {
|
|
34
34
|
// us_listen_socket,
|
|
@@ -172,13 +172,13 @@ export interface TemplatedApp {
|
|
|
172
172
|
// hostname: string,
|
|
173
173
|
// ) : TemplatedApp,
|
|
174
174
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
175
|
+
/**
|
|
176
|
+
* Registers a handler matching specified URL pattern where WebSocket upgrade requests are caught.
|
|
177
|
+
*/
|
|
178
|
+
ws(
|
|
179
|
+
pattern: RecognizedString,
|
|
180
|
+
behavior: WebSocketBehavior,
|
|
181
|
+
) : TemplatedApp,
|
|
182
182
|
|
|
183
183
|
// we can't provide this in Reaact Native
|
|
184
184
|
/**
|
package/src/types/WebSocket.ts
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WebSocketSendStatus,
|
|
3
|
+
} from "../modules/WebSocketSendStatus"
|
|
4
|
+
|
|
1
5
|
import type {
|
|
2
6
|
RecognizedString,
|
|
3
7
|
} from "./RecognizedString"
|
|
4
8
|
|
|
9
|
+
import type {
|
|
10
|
+
WebSocketUserData,
|
|
11
|
+
} from "./WebSocketUserData"
|
|
12
|
+
|
|
5
13
|
/**
|
|
6
14
|
* A WebSocket connection that is valid from open to close event.
|
|
7
15
|
* Read more about this in the user manual.
|
|
8
16
|
*/
|
|
9
|
-
export interface WebSocket
|
|
17
|
+
export interface WebSocket {
|
|
10
18
|
/**
|
|
11
19
|
* Forcefully closes this WebSocket. Immediately calls the close handler.
|
|
12
20
|
* No WebSocket close message is sent.
|
|
@@ -19,7 +27,7 @@ export interface WebSocket<UserData> {
|
|
|
19
27
|
*/
|
|
20
28
|
cork(
|
|
21
29
|
cb: () => void,
|
|
22
|
-
) : WebSocket
|
|
30
|
+
) : WebSocket,
|
|
23
31
|
|
|
24
32
|
/**
|
|
25
33
|
* Gracefully closes this WebSocket. Immediately calls the close handler.
|
|
@@ -62,9 +70,9 @@ export interface WebSocket<UserData> {
|
|
|
62
70
|
getTopics() : string[],
|
|
63
71
|
|
|
64
72
|
/**
|
|
65
|
-
* Returns the
|
|
73
|
+
* Returns the user data object.
|
|
66
74
|
*/
|
|
67
|
-
getUserData() :
|
|
75
|
+
getUserData() : WebSocketUserData,
|
|
68
76
|
|
|
69
77
|
/**
|
|
70
78
|
* Returns whether this websocket is subscribed to topic.
|
|
@@ -95,40 +103,48 @@ export interface WebSocket<UserData> {
|
|
|
95
103
|
* Sends a message. Returns 1 for success, 2 for dropped due to backpressure limit, and 0 for built up backpressure that will drain over time. You can check backpressure before or after sending by calling getBufferedAmount().
|
|
96
104
|
*
|
|
97
105
|
* Make sure you properly understand the concept of backpressure. Check the backpressure example file.
|
|
106
|
+
*
|
|
107
|
+
* This method will returns void due to the message is not a recognized string.
|
|
98
108
|
*/
|
|
99
109
|
send(
|
|
100
110
|
message: RecognizedString,
|
|
101
111
|
isBinary?: boolean,
|
|
102
112
|
compress?: boolean,
|
|
103
|
-
) :
|
|
113
|
+
) : WebSocketSendStatus | void,
|
|
104
114
|
|
|
105
115
|
/**
|
|
106
116
|
* Sends the first fragment of a fragmented message. Use for sending large messages in chunks.
|
|
107
117
|
* Returns 1 for success, 2 for dropped due to backpressure limit, and 0 for built up backpressure.
|
|
118
|
+
*
|
|
119
|
+
* This method will returns void due to the message is not a recognized string.
|
|
108
120
|
*/
|
|
109
121
|
sendFirstFragment(
|
|
110
122
|
message: RecognizedString,
|
|
111
123
|
isBinary?: boolean,
|
|
112
124
|
compress?: boolean,
|
|
113
|
-
) :
|
|
125
|
+
) : WebSocketSendStatus | void,
|
|
114
126
|
|
|
115
127
|
/**
|
|
116
128
|
* Sends a middle fragment of a fragmented message.
|
|
117
129
|
* Returns 1 for success, 2 for dropped due to backpressure limit, and 0 for built up backpressure.
|
|
130
|
+
*
|
|
131
|
+
* This method will returns void due to the message is not a recognized string.
|
|
118
132
|
*/
|
|
119
133
|
sendFragment(
|
|
120
134
|
message: RecognizedString,
|
|
121
135
|
compress?: boolean,
|
|
122
|
-
) :
|
|
136
|
+
) : WebSocketSendStatus | void,
|
|
123
137
|
|
|
124
138
|
/**
|
|
125
139
|
* Sends the last fragment of a fragmented message.
|
|
126
140
|
* Returns 1 for success, 2 for dropped due to backpressure limit, and 0 for built up backpressure.
|
|
141
|
+
*
|
|
142
|
+
* This method will returns void due to the message is not a recognized string.
|
|
127
143
|
*/
|
|
128
144
|
sendLastFragment(
|
|
129
145
|
message: RecognizedString,
|
|
130
146
|
compress?: boolean,
|
|
131
|
-
) :
|
|
147
|
+
) : WebSocketSendStatus | void,
|
|
132
148
|
|
|
133
149
|
/**
|
|
134
150
|
* Subscribe to a topic.
|
|
@@ -21,14 +21,14 @@ import type {
|
|
|
21
21
|
/**
|
|
22
22
|
* A structure holding settings and handlers for a WebSocket URL route handler.
|
|
23
23
|
*/
|
|
24
|
-
export interface WebSocketBehavior<UserData> {
|
|
24
|
+
export interface WebSocketBehavior/* <UserData extends object> */ {
|
|
25
25
|
/**
|
|
26
26
|
* Handler for close event, no matter if error, timeout or graceful close.
|
|
27
27
|
* You may not use WebSocket after this event.
|
|
28
28
|
* Do not send on this WebSocket from within here, it is closed.
|
|
29
29
|
*/
|
|
30
30
|
close?: (
|
|
31
|
-
ws: WebSocket
|
|
31
|
+
ws: WebSocket,
|
|
32
32
|
code: number,
|
|
33
33
|
message: ArrayBuffer,
|
|
34
34
|
) => void,
|
|
@@ -51,7 +51,7 @@ export interface WebSocketBehavior<UserData> {
|
|
|
51
51
|
* Use this to guide / drive your backpressure throttling.
|
|
52
52
|
*/
|
|
53
53
|
drain?: (
|
|
54
|
-
ws: WebSocket
|
|
54
|
+
ws: WebSocket,
|
|
55
55
|
) => void,
|
|
56
56
|
|
|
57
57
|
/**
|
|
@@ -62,7 +62,7 @@ export interface WebSocketBehavior<UserData> {
|
|
|
62
62
|
* (until first await or return) and will be neutered.
|
|
63
63
|
*/
|
|
64
64
|
dropped?: (
|
|
65
|
-
ws: WebSocket
|
|
65
|
+
ws: WebSocket,
|
|
66
66
|
message: ArrayBuffer,
|
|
67
67
|
isBinary: boolean,
|
|
68
68
|
) => void | Promise<void>,
|
|
@@ -105,7 +105,7 @@ export interface WebSocketBehavior<UserData> {
|
|
|
105
105
|
* Given ArrayBuffer is valid during the lifetime of this callback (until first await or return) and will be neutered.
|
|
106
106
|
*/
|
|
107
107
|
message?: (
|
|
108
|
-
ws: WebSocket
|
|
108
|
+
ws: WebSocket,
|
|
109
109
|
message: ArrayBuffer,
|
|
110
110
|
isBinary: boolean,
|
|
111
111
|
) => void | Promise<void>,
|
|
@@ -115,7 +115,7 @@ export interface WebSocketBehavior<UserData> {
|
|
|
115
115
|
* WebSocket is valid from open to close, no errors.
|
|
116
116
|
*/
|
|
117
117
|
open?: (
|
|
118
|
-
ws: WebSocket
|
|
118
|
+
ws: WebSocket,
|
|
119
119
|
) => void | Promise<void>,
|
|
120
120
|
|
|
121
121
|
/**
|
|
@@ -123,7 +123,7 @@ export interface WebSocketBehavior<UserData> {
|
|
|
123
123
|
* You do not need to handle this, pong messages are automatically sent as per the standard.
|
|
124
124
|
*/
|
|
125
125
|
ping?: (
|
|
126
|
-
ws: WebSocket
|
|
126
|
+
ws: WebSocket,
|
|
127
127
|
message: ArrayBuffer,
|
|
128
128
|
) => void,
|
|
129
129
|
|
|
@@ -131,7 +131,7 @@ export interface WebSocketBehavior<UserData> {
|
|
|
131
131
|
* Handler for received pong control message.
|
|
132
132
|
*/
|
|
133
133
|
pong?: (
|
|
134
|
-
ws: WebSocket
|
|
134
|
+
ws: WebSocket,
|
|
135
135
|
message: ArrayBuffer,
|
|
136
136
|
) => void,
|
|
137
137
|
|
|
@@ -144,7 +144,7 @@ export interface WebSocketBehavior<UserData> {
|
|
|
144
144
|
* Handler for subscription changes.
|
|
145
145
|
*/
|
|
146
146
|
subscription?: (
|
|
147
|
-
ws: WebSocket
|
|
147
|
+
ws: WebSocket,
|
|
148
148
|
topic: ArrayBuffer,
|
|
149
149
|
newCount: number,
|
|
150
150
|
oldCount: number,
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface WebSocketUserData {
|
|
2
|
+
getBoolean(
|
|
3
|
+
key: string,
|
|
4
|
+
): boolean | undefined,
|
|
5
|
+
|
|
6
|
+
setBoolean(
|
|
7
|
+
key: string,
|
|
8
|
+
value: boolean,
|
|
9
|
+
): void,
|
|
10
|
+
|
|
11
|
+
getNumber(
|
|
12
|
+
key: string,
|
|
13
|
+
): number | undefined,
|
|
14
|
+
|
|
15
|
+
setNumber(
|
|
16
|
+
key: string,
|
|
17
|
+
value: number,
|
|
18
|
+
): void,
|
|
19
|
+
|
|
20
|
+
getString(
|
|
21
|
+
key: string,
|
|
22
|
+
): string | undefined,
|
|
23
|
+
|
|
24
|
+
setString(
|
|
25
|
+
key: string,
|
|
26
|
+
value: number,
|
|
27
|
+
): void,
|
|
28
|
+
}
|
package/src/types/index.ts
CHANGED
|
@@ -5,8 +5,9 @@ export type * from "./HttpResponse"
|
|
|
5
5
|
export type * from "./MultipartField"
|
|
6
6
|
export type * from "./RecognizedString"
|
|
7
7
|
export type * from "./TemplatedApp"
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
export type * from "./WebSocket"
|
|
9
|
+
export type * from "./WebSocketBehavior"
|
|
10
|
+
export type * from "./WebSocketUserData"
|
|
10
11
|
// export type * from "./us_listen_socket"
|
|
11
12
|
// export type * from "./us_socket"
|
|
12
13
|
// export type * from "./us_socket_context_t"
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Native type representing a raw uSockets struct us_socket_context_t.
|
|
3
|
-
*
|
|
3
|
+
* This is not intended to be modified from JavaScript.
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
6
|
-
}
|
|
5
|
+
export type us_socket_context_t = unknown
|