spiceflow 1.1.8 → 1.1.10
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 +177 -92
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +9 -13
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/utils.js.map +1 -1
- package/dist/client/ws.d.ts.map +1 -1
- package/dist/client/ws.js +1 -3
- package/dist/client/ws.js.map +1 -1
- package/dist/client.test.js +1 -1
- package/dist/client.test.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/cors.d.ts.map +1 -1
- package/dist/cors.js.map +1 -1
- package/dist/cors.test.js.map +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js.map +1 -1
- package/dist/middleware.test.js.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +1 -1
- package/dist/openapi.js.map +1 -1
- package/dist/openapi.test.js.map +1 -1
- package/dist/simple.benchmark.d.ts +2 -0
- package/dist/simple.benchmark.d.ts.map +1 -0
- package/dist/{benchmark.benchmark.js → simple.benchmark.js} +1 -1
- package/dist/simple.benchmark.js.map +1 -0
- package/dist/spiceflow.d.ts.map +1 -1
- package/dist/spiceflow.js +14 -2
- package/dist/spiceflow.js.map +1 -1
- package/dist/spiceflow.test.js.map +1 -1
- package/dist/static-node.d.ts +4 -0
- package/dist/static-node.d.ts.map +1 -0
- package/dist/static-node.js +35 -0
- package/dist/static-node.js.map +1 -0
- package/dist/static.benchmark.d.ts +2 -0
- package/dist/static.benchmark.d.ts.map +1 -0
- package/dist/static.benchmark.js +19 -0
- package/dist/static.benchmark.js.map +1 -0
- package/dist/static.d.ts +28 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +181 -0
- package/dist/static.js.map +1 -0
- package/dist/stream.test.js +1 -1
- package/dist/stream.test.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/types.test.js +3 -7
- package/dist/types.test.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js.map +1 -1
- package/dist/zod.test.js.map +1 -1
- package/package.json +1 -1
- package/src/client/errors.ts +17 -17
- package/src/client/index.ts +437 -469
- package/src/client/types.ts +168 -191
- package/src/client/utils.ts +5 -5
- package/src/client/ws.ts +87 -89
- package/src/client.test.ts +176 -183
- package/src/context.ts +82 -82
- package/src/cors.test.ts +38 -38
- package/src/cors.ts +87 -92
- package/src/error.ts +13 -13
- package/src/middleware.test.ts +201 -201
- package/src/openapi.test.ts +97 -97
- package/src/openapi.ts +365 -365
- package/src/simple.benchmark.ts +16 -0
- package/src/spiceflow.test.ts +461 -467
- package/src/spiceflow.ts +1132 -1161
- package/src/static-node.ts +38 -0
- package/src/static.benchmark.ts +22 -0
- package/src/static.ts +240 -0
- package/src/stream.test.ts +310 -310
- package/src/types.test.ts +46 -50
- package/src/types.ts +698 -701
- package/src/utils.ts +79 -79
- package/src/zod.test.ts +64 -64
- package/dist/benchmark.benchmark.d.ts +0 -2
- package/dist/benchmark.benchmark.d.ts.map +0 -1
- package/dist/benchmark.benchmark.js.map +0 -1
- package/src/benchmark.benchmark.ts +0 -16
package/src/client/types.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { EdenFetchError } from './errors.js'
|
|
|
6
6
|
import { EdenWS } from './ws.js'
|
|
7
7
|
|
|
8
8
|
export type Prettify<T> = {
|
|
9
|
-
|
|
9
|
+
[K in keyof T]: T[K]
|
|
10
10
|
} & {}
|
|
11
11
|
|
|
12
12
|
export type IsNever<T> = [T] extends [never] ? true : false
|
|
@@ -14,208 +14,185 @@ export type IsNever<T> = [T] extends [never] ? true : false
|
|
|
14
14
|
type Files = File | FileList
|
|
15
15
|
|
|
16
16
|
type ReplaceBlobWithFiles<in out RecordType extends Record<string, unknown>> = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
[K in keyof RecordType]: RecordType[K] extends Blob | Blob[]
|
|
18
|
+
? Files
|
|
19
|
+
: RecordType[K]
|
|
20
20
|
} & {}
|
|
21
21
|
|
|
22
22
|
type And<A extends boolean, B extends boolean> = A extends true
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
? B extends true
|
|
24
|
+
? true
|
|
25
|
+
: false
|
|
26
|
+
: false
|
|
27
27
|
|
|
28
28
|
type ReplaceGeneratorWithAsyncGenerator<
|
|
29
|
-
|
|
29
|
+
in out RecordType extends Record<string, unknown>,
|
|
30
30
|
> = {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
31
|
+
[K in keyof RecordType]: RecordType[K] extends Generator<
|
|
32
|
+
infer A,
|
|
33
|
+
infer B,
|
|
34
|
+
infer C
|
|
35
|
+
>
|
|
36
|
+
? And<Not<IsNever<A>>, void extends B ? true : false> extends true
|
|
37
|
+
? AsyncGenerator<A, B, C>
|
|
38
|
+
: And<IsNever<A>, void extends B ? false : true> extends true
|
|
39
|
+
? B
|
|
40
|
+
: AsyncGenerator<A, B, C> | B
|
|
41
|
+
: RecordType[K] extends AsyncGenerator<infer A, infer B, infer C>
|
|
42
|
+
? And<Not<IsNever<A>>, void extends B ? true : false> extends true
|
|
43
|
+
? AsyncGenerator<A, B, C>
|
|
44
|
+
: And<IsNever<A>, void extends B ? false : true> extends true
|
|
45
|
+
? B
|
|
46
|
+
: AsyncGenerator<A, B, C> | B
|
|
47
|
+
: RecordType[K]
|
|
48
48
|
} & {}
|
|
49
49
|
|
|
50
50
|
type MaybeArray<T> = T | T[]
|
|
51
51
|
type MaybePromise<T> = T | Promise<T>
|
|
52
52
|
|
|
53
53
|
export namespace SpiceflowClient {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
data: null
|
|
197
|
-
error: Exclude<keyof Res, 200> extends never
|
|
198
|
-
? EdenFetchError<number, any>
|
|
199
|
-
: {
|
|
200
|
-
[Status in keyof Res]: EdenFetchError<
|
|
201
|
-
Status,
|
|
202
|
-
Res[Status]
|
|
203
|
-
>
|
|
204
|
-
}[Exclude<keyof Res, 200>]
|
|
205
|
-
response: Response
|
|
206
|
-
status: number
|
|
207
|
-
headers: RequestInit['headers']
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export interface OnMessage<Data = unknown> extends MessageEvent {
|
|
211
|
-
data: Data
|
|
212
|
-
rawData: MessageEvent['data']
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export type WSEvent<
|
|
216
|
-
K extends keyof WebSocketEventMap,
|
|
217
|
-
Data = unknown,
|
|
218
|
-
> = K extends 'message' ? OnMessage<Data> : WebSocketEventMap[K]
|
|
54
|
+
interface TreatyParam {
|
|
55
|
+
fetch?: RequestInit
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type Create<App extends Spiceflow<any, any, any, any, any, any>> =
|
|
59
|
+
App extends {
|
|
60
|
+
_routes: infer Schema extends Record<string, any>
|
|
61
|
+
}
|
|
62
|
+
? Prettify<Sign<Schema>>
|
|
63
|
+
: 'Please install Spiceflow before using Eden'
|
|
64
|
+
|
|
65
|
+
export type Sign<in out Route extends Record<string, any>> = {
|
|
66
|
+
[K in keyof Route as K extends `:${string}`
|
|
67
|
+
? never
|
|
68
|
+
: K]: K extends 'subscribe' // ? Websocket route
|
|
69
|
+
? (undefined extends Route['subscribe']['headers']
|
|
70
|
+
? { headers?: Record<string, unknown> }
|
|
71
|
+
: {
|
|
72
|
+
headers: Route['subscribe']['headers']
|
|
73
|
+
}) &
|
|
74
|
+
(undefined extends Route['subscribe']['query']
|
|
75
|
+
? { query?: Record<string, unknown> }
|
|
76
|
+
: {
|
|
77
|
+
query: Route['subscribe']['query']
|
|
78
|
+
}) extends infer Param
|
|
79
|
+
? {} extends Param
|
|
80
|
+
? (options?: Param) => EdenWS<Route['subscribe']>
|
|
81
|
+
: (options?: Param) => EdenWS<Route['subscribe']>
|
|
82
|
+
: never
|
|
83
|
+
: Route[K] extends {
|
|
84
|
+
body: infer Body
|
|
85
|
+
// headers: infer Headers
|
|
86
|
+
params: any
|
|
87
|
+
query: infer Query
|
|
88
|
+
response: infer Response extends Record<number, unknown>
|
|
89
|
+
}
|
|
90
|
+
? { headers?: Record<string, unknown> } & (undefined extends Query
|
|
91
|
+
? { query?: Record<string, unknown> }
|
|
92
|
+
: { query: Query }) extends infer Param
|
|
93
|
+
? {} extends Param
|
|
94
|
+
? undefined extends Body
|
|
95
|
+
? K extends 'get' | 'head'
|
|
96
|
+
? (
|
|
97
|
+
options?: Prettify<Param & TreatyParam>,
|
|
98
|
+
) => Promise<
|
|
99
|
+
TreatyResponse<ReplaceGeneratorWithAsyncGenerator<Response>>
|
|
100
|
+
>
|
|
101
|
+
: (
|
|
102
|
+
body?: Body,
|
|
103
|
+
options?: Prettify<Param & TreatyParam>,
|
|
104
|
+
) => Promise<
|
|
105
|
+
TreatyResponse<ReplaceGeneratorWithAsyncGenerator<Response>>
|
|
106
|
+
>
|
|
107
|
+
: (
|
|
108
|
+
body: Body extends Record<string, unknown>
|
|
109
|
+
? ReplaceBlobWithFiles<Body>
|
|
110
|
+
: Body,
|
|
111
|
+
options?: Prettify<Param & TreatyParam>,
|
|
112
|
+
) => Promise<
|
|
113
|
+
TreatyResponse<ReplaceGeneratorWithAsyncGenerator<Response>>
|
|
114
|
+
>
|
|
115
|
+
: K extends 'get' | 'head'
|
|
116
|
+
? (
|
|
117
|
+
options: Prettify<Param & TreatyParam>,
|
|
118
|
+
) => Promise<
|
|
119
|
+
TreatyResponse<ReplaceGeneratorWithAsyncGenerator<Response>>
|
|
120
|
+
>
|
|
121
|
+
: (
|
|
122
|
+
body: Body extends Record<string, unknown>
|
|
123
|
+
? ReplaceBlobWithFiles<Body>
|
|
124
|
+
: Body,
|
|
125
|
+
options: Prettify<Param & TreatyParam>,
|
|
126
|
+
) => Promise<
|
|
127
|
+
TreatyResponse<ReplaceGeneratorWithAsyncGenerator<Response>>
|
|
128
|
+
>
|
|
129
|
+
: never
|
|
130
|
+
: CreateParams<Route[K]>
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
type CreateParams<Route extends Record<string, any>> =
|
|
134
|
+
Extract<keyof Route, `:${string}`> extends infer Path extends string
|
|
135
|
+
? IsNever<Path> extends true
|
|
136
|
+
? Prettify<Sign<Route>>
|
|
137
|
+
: // ! DO NOT USE PRETTIFY ON THIS LINE, OTHERWISE FUNCTION CALLING WILL BE OMITTED
|
|
138
|
+
(((params: {
|
|
139
|
+
[param in Path extends `:${infer Param}`
|
|
140
|
+
? Param extends `${infer Param}?`
|
|
141
|
+
? Param
|
|
142
|
+
: Param
|
|
143
|
+
: never]: string | number
|
|
144
|
+
}) => Prettify<Sign<Route[Path]>> & CreateParams<Route[Path]>) &
|
|
145
|
+
Prettify<Sign<Route>>) &
|
|
146
|
+
(Path extends `:${string}?` ? CreateParams<Route[Path]> : {})
|
|
147
|
+
: never
|
|
148
|
+
|
|
149
|
+
export interface Config {
|
|
150
|
+
// fetch?: Omit<RequestInit, 'headers' | 'method'>
|
|
151
|
+
fetch?: typeof fetch
|
|
152
|
+
headers?: MaybeArray<
|
|
153
|
+
| RequestInit['headers']
|
|
154
|
+
| ((path: string, options: RequestInit) => RequestInit['headers'] | void)
|
|
155
|
+
>
|
|
156
|
+
onRequest?: MaybeArray<
|
|
157
|
+
(path: string, options: RequestInit) => MaybePromise<RequestInit | void>
|
|
158
|
+
>
|
|
159
|
+
onResponse?: MaybeArray<(response: Response) => MaybePromise<unknown>>
|
|
160
|
+
// keepDomain?: boolean
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// type UnwrapAwaited<T extends Record<number, unknown>> = {
|
|
164
|
+
// [K in keyof T]: Awaited<T[K]>
|
|
165
|
+
// }
|
|
166
|
+
|
|
167
|
+
export type TreatyResponse<Res extends Record<number, unknown>> =
|
|
168
|
+
| {
|
|
169
|
+
data: Res[200]
|
|
170
|
+
error: null
|
|
171
|
+
response: Response
|
|
172
|
+
status: number
|
|
173
|
+
headers: RequestInit['headers']
|
|
174
|
+
}
|
|
175
|
+
| {
|
|
176
|
+
data: null
|
|
177
|
+
error: Exclude<keyof Res, 200> extends never
|
|
178
|
+
? EdenFetchError<number, any>
|
|
179
|
+
: {
|
|
180
|
+
[Status in keyof Res]: EdenFetchError<Status, Res[Status]>
|
|
181
|
+
}[Exclude<keyof Res, 200>]
|
|
182
|
+
response: Response
|
|
183
|
+
status: number
|
|
184
|
+
headers: RequestInit['headers']
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export interface OnMessage<Data = unknown> extends MessageEvent {
|
|
188
|
+
data: Data
|
|
189
|
+
rawData: MessageEvent['data']
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export type WSEvent<
|
|
193
|
+
K extends keyof WebSocketEventMap,
|
|
194
|
+
Data = unknown,
|
|
195
|
+
> = K extends 'message' ? OnMessage<Data> : WebSocketEventMap[K]
|
|
219
196
|
}
|
|
220
197
|
|
|
221
198
|
export type Not<T> = T extends true ? false : true
|
package/src/client/utils.ts
CHANGED
package/src/client/ws.ts
CHANGED
|
@@ -3,97 +3,95 @@ import type { SpiceflowClient } from './types.js'
|
|
|
3
3
|
import { parseStringifiedValue } from './utils.js'
|
|
4
4
|
|
|
5
5
|
export class EdenWS<in out Schema extends InputSchema<any> = {}> {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
6
|
+
ws: WebSocket
|
|
7
|
+
|
|
8
|
+
constructor(public url: string) {
|
|
9
|
+
this.ws = new WebSocket(url)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
send(data: Schema['body'] | Schema['body'][]) {
|
|
13
|
+
if (Array.isArray(data)) {
|
|
14
|
+
data.forEach((datum) => this.send(datum))
|
|
15
|
+
|
|
16
|
+
return this
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
this.ws.send(
|
|
20
|
+
typeof data === 'object' ? JSON.stringify(data) : data.toString(),
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
return this
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
on<K extends keyof WebSocketEventMap>(
|
|
27
|
+
type: K,
|
|
28
|
+
listener: (event: SpiceflowClient.WSEvent<K, Schema['response']>) => void,
|
|
29
|
+
options?: boolean | AddEventListenerOptions,
|
|
30
|
+
) {
|
|
31
|
+
return this.addEventListener(type, listener, options)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
off<K extends keyof WebSocketEventMap>(
|
|
35
|
+
type: K,
|
|
36
|
+
listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,
|
|
37
|
+
options?: boolean | EventListenerOptions,
|
|
38
|
+
) {
|
|
39
|
+
this.ws.removeEventListener(type, listener, options)
|
|
40
|
+
|
|
41
|
+
return this
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
subscribe(
|
|
45
|
+
onMessage: (
|
|
46
|
+
event: SpiceflowClient.WSEvent<'message', Schema['response']>,
|
|
47
|
+
) => void,
|
|
48
|
+
options?: boolean | AddEventListenerOptions,
|
|
49
|
+
) {
|
|
50
|
+
return this.addEventListener('message', onMessage, options)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
addEventListener<K extends keyof WebSocketEventMap>(
|
|
54
|
+
type: K,
|
|
55
|
+
listener: (event: SpiceflowClient.WSEvent<K, Schema['response']>) => void,
|
|
56
|
+
options?: boolean | AddEventListenerOptions,
|
|
57
|
+
) {
|
|
58
|
+
this.ws.addEventListener(
|
|
59
|
+
type,
|
|
60
|
+
(ws) => {
|
|
61
|
+
if (type === 'message') {
|
|
62
|
+
const data = parseMessageEvent(ws as MessageEvent)
|
|
63
|
+
|
|
64
|
+
listener({
|
|
65
|
+
...ws,
|
|
66
|
+
data,
|
|
67
|
+
} as any)
|
|
68
|
+
} else listener(ws as any)
|
|
69
|
+
},
|
|
70
|
+
options,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return this
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
removeEventListener<K extends keyof WebSocketEventMap>(
|
|
77
|
+
type: K,
|
|
78
|
+
listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,
|
|
79
|
+
options?: boolean | EventListenerOptions,
|
|
80
|
+
) {
|
|
81
|
+
this.off(type, listener, options)
|
|
82
|
+
|
|
83
|
+
return this
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
close() {
|
|
87
|
+
this.ws.close()
|
|
88
|
+
|
|
89
|
+
return this
|
|
90
|
+
}
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
const parseMessageEvent = (event: MessageEvent) => {
|
|
94
|
-
|
|
94
|
+
const messageString = event.data.toString()
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
? null
|
|
98
|
-
: parseStringifiedValue(messageString)
|
|
96
|
+
return messageString === 'null' ? null : parseStringifiedValue(messageString)
|
|
99
97
|
}
|