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.
Files changed (82) hide show
  1. package/README.md +177 -92
  2. package/dist/client/errors.d.ts.map +1 -1
  3. package/dist/client/errors.js.map +1 -1
  4. package/dist/client/index.d.ts.map +1 -1
  5. package/dist/client/index.js +9 -13
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/types.d.ts.map +1 -1
  8. package/dist/client/utils.js.map +1 -1
  9. package/dist/client/ws.d.ts.map +1 -1
  10. package/dist/client/ws.js +1 -3
  11. package/dist/client/ws.js.map +1 -1
  12. package/dist/client.test.js +1 -1
  13. package/dist/client.test.js.map +1 -1
  14. package/dist/context.d.ts.map +1 -1
  15. package/dist/cors.d.ts.map +1 -1
  16. package/dist/cors.js.map +1 -1
  17. package/dist/cors.test.js.map +1 -1
  18. package/dist/error.d.ts.map +1 -1
  19. package/dist/error.js.map +1 -1
  20. package/dist/middleware.test.js.map +1 -1
  21. package/dist/openapi.d.ts.map +1 -1
  22. package/dist/openapi.js +1 -1
  23. package/dist/openapi.js.map +1 -1
  24. package/dist/openapi.test.js.map +1 -1
  25. package/dist/simple.benchmark.d.ts +2 -0
  26. package/dist/simple.benchmark.d.ts.map +1 -0
  27. package/dist/{benchmark.benchmark.js → simple.benchmark.js} +1 -1
  28. package/dist/simple.benchmark.js.map +1 -0
  29. package/dist/spiceflow.d.ts.map +1 -1
  30. package/dist/spiceflow.js +14 -2
  31. package/dist/spiceflow.js.map +1 -1
  32. package/dist/spiceflow.test.js.map +1 -1
  33. package/dist/static-node.d.ts +4 -0
  34. package/dist/static-node.d.ts.map +1 -0
  35. package/dist/static-node.js +35 -0
  36. package/dist/static-node.js.map +1 -0
  37. package/dist/static.benchmark.d.ts +2 -0
  38. package/dist/static.benchmark.d.ts.map +1 -0
  39. package/dist/static.benchmark.js +19 -0
  40. package/dist/static.benchmark.js.map +1 -0
  41. package/dist/static.d.ts +28 -0
  42. package/dist/static.d.ts.map +1 -0
  43. package/dist/static.js +181 -0
  44. package/dist/static.js.map +1 -0
  45. package/dist/stream.test.js +1 -1
  46. package/dist/stream.test.js.map +1 -1
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js.map +1 -1
  49. package/dist/types.test.js +3 -7
  50. package/dist/types.test.js.map +1 -1
  51. package/dist/utils.d.ts.map +1 -1
  52. package/dist/utils.js.map +1 -1
  53. package/dist/zod.test.js.map +1 -1
  54. package/package.json +1 -1
  55. package/src/client/errors.ts +17 -17
  56. package/src/client/index.ts +437 -469
  57. package/src/client/types.ts +168 -191
  58. package/src/client/utils.ts +5 -5
  59. package/src/client/ws.ts +87 -89
  60. package/src/client.test.ts +176 -183
  61. package/src/context.ts +82 -82
  62. package/src/cors.test.ts +38 -38
  63. package/src/cors.ts +87 -92
  64. package/src/error.ts +13 -13
  65. package/src/middleware.test.ts +201 -201
  66. package/src/openapi.test.ts +97 -97
  67. package/src/openapi.ts +365 -365
  68. package/src/simple.benchmark.ts +16 -0
  69. package/src/spiceflow.test.ts +461 -467
  70. package/src/spiceflow.ts +1132 -1161
  71. package/src/static-node.ts +38 -0
  72. package/src/static.benchmark.ts +22 -0
  73. package/src/static.ts +240 -0
  74. package/src/stream.test.ts +310 -310
  75. package/src/types.test.ts +46 -50
  76. package/src/types.ts +698 -701
  77. package/src/utils.ts +79 -79
  78. package/src/zod.test.ts +64 -64
  79. package/dist/benchmark.benchmark.d.ts +0 -2
  80. package/dist/benchmark.benchmark.d.ts.map +0 -1
  81. package/dist/benchmark.benchmark.js.map +0 -1
  82. package/src/benchmark.benchmark.ts +0 -16
@@ -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
- [K in keyof T]: T[K]
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
- [K in keyof RecordType]: RecordType[K] extends Blob | Blob[]
18
- ? Files
19
- : RecordType[K]
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
- ? B extends true
24
- ? true
25
- : false
26
- : false
23
+ ? B extends true
24
+ ? true
25
+ : false
26
+ : false
27
27
 
28
28
  type ReplaceGeneratorWithAsyncGenerator<
29
- in out RecordType extends Record<string, unknown>,
29
+ in out RecordType extends Record<string, unknown>,
30
30
  > = {
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]
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
- 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<
100
- ReplaceGeneratorWithAsyncGenerator<Response>
101
- >
102
- >
103
- : (
104
- body?: Body,
105
- options?: Prettify<Param & TreatyParam>,
106
- ) => Promise<
107
- TreatyResponse<
108
- ReplaceGeneratorWithAsyncGenerator<Response>
109
- >
110
- >
111
- : (
112
- body: Body extends Record<string, unknown>
113
- ? ReplaceBlobWithFiles<Body>
114
- : Body,
115
- options?: Prettify<Param & TreatyParam>,
116
- ) => Promise<
117
- TreatyResponse<
118
- ReplaceGeneratorWithAsyncGenerator<Response>
119
- >
120
- >
121
- : K extends 'get' | 'head'
122
- ? (
123
- options: Prettify<Param & TreatyParam>,
124
- ) => Promise<
125
- TreatyResponse<
126
- ReplaceGeneratorWithAsyncGenerator<Response>
127
- >
128
- >
129
- : (
130
- body: Body extends Record<string, unknown>
131
- ? ReplaceBlobWithFiles<Body>
132
- : Body,
133
- options: Prettify<Param & TreatyParam>,
134
- ) => Promise<
135
- TreatyResponse<
136
- ReplaceGeneratorWithAsyncGenerator<Response>
137
- >
138
- >
139
- : never
140
- : CreateParams<Route[K]>
141
- }
142
-
143
- type CreateParams<Route extends Record<string, any>> = Extract<
144
- keyof Route,
145
- `:${string}`
146
- > extends infer Path extends string
147
- ? IsNever<Path> extends true
148
- ? Prettify<Sign<Route>>
149
- : // ! DO NOT USE PRETTIFY ON THIS LINE, OTHERWISE FUNCTION CALLING WILL BE OMITTED
150
- (((params: {
151
- [param in Path extends `:${infer Param}`
152
- ? Param extends `${infer Param}?`
153
- ? Param
154
- : Param
155
- : never]: string | number
156
- }) => Prettify<Sign<Route[Path]>> & CreateParams<Route[Path]>) &
157
- Prettify<Sign<Route>>) &
158
- (Path extends `:${string}?`
159
- ? CreateParams<Route[Path]>
160
- : {})
161
- : never
162
-
163
- export interface Config {
164
- // fetch?: Omit<RequestInit, 'headers' | 'method'>
165
- fetch?: typeof fetch
166
- headers?: MaybeArray<
167
- | RequestInit['headers']
168
- | ((
169
- path: string,
170
- options: RequestInit,
171
- ) => RequestInit['headers'] | void)
172
- >
173
- onRequest?: MaybeArray<
174
- (
175
- path: string,
176
- options: RequestInit,
177
- ) => MaybePromise<RequestInit | void>
178
- >
179
- onResponse?: MaybeArray<(response: Response) => MaybePromise<unknown>>
180
- // keepDomain?: boolean
181
- }
182
-
183
- // type UnwrapAwaited<T extends Record<number, unknown>> = {
184
- // [K in keyof T]: Awaited<T[K]>
185
- // }
186
-
187
- export type TreatyResponse<Res extends Record<number, unknown>> =
188
- | {
189
- data: Res[200]
190
- error: null
191
- response: Response
192
- status: number
193
- headers: RequestInit['headers']
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
@@ -1,7 +1,7 @@
1
1
  export function parseStringifiedValue(value: string) {
2
- try {
3
- return JSON.parse(value)
4
- } catch (error) {
5
- return value
6
- }
2
+ try {
3
+ return JSON.parse(value)
4
+ } catch (error) {
5
+ return value
6
+ }
7
7
  }
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
- 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
- }
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
- const messageString = event.data.toString()
94
+ const messageString = event.data.toString()
95
95
 
96
- return messageString === 'null'
97
- ? null
98
- : parseStringifiedValue(messageString)
96
+ return messageString === 'null' ? null : parseStringifiedValue(messageString)
99
97
  }