@@ -5,12 +5,19 @@ import {
5
5
ZodSocketMessageCatalogSchema ,
6
6
ZodSocketMessageHandler ,
7
7
ZodSocketMessageHandlers ,
8
+ GetSocketMessagesWithCallback ,
8
9
} from "./zodSocket.js" ;
9
10
// @ts -ignore
10
11
import type { DefaultEventsMap , EventsMap } from "socket.io/dist/typed-events" ;
11
12
import { z } from "zod" ;
12
13
import { SimpleStructuredLogger , StructuredLogger } from "./utils/structuredLogger.js" ;
13
14
15
+ type AssertNoCallbackSchemas < T extends ZodSocketMessageCatalogSchema > = [
16
+ GetSocketMessagesWithCallback < T > ,
17
+ ] extends [ never ]
18
+ ? { }
19
+ : { __error__ : GetSocketMessagesWithCallback < T > } ;
20
+
14
21
interface ExtendedError extends Error {
15
22
data ?: any ;
16
23
}
@@ -32,7 +39,7 @@ interface ZodNamespaceOptions<
32
39
TServerMessages extends ZodSocketMessageCatalogSchema ,
33
40
TServerSideEvents extends EventsMap = DefaultEventsMap ,
34
41
TSocketData extends z . ZodObject < any , any , any > = any ,
35
- > {
42
+ > extends AssertNoCallbackSchemas < TServerMessages > {
36
43
io : Server ;
37
44
name : string ;
38
45
clientMessages : TClientMessages ;
@@ -108,7 +115,16 @@ export class ZodNamespace<
108
115
109
116
this . namespace = this . io . of ( opts . name ) ;
110
117
111
- // FIXME: There's a bug here, this sender should not accept Socket schemas with callbacks
118
+ const invalidMessages = Object . entries ( opts . serverMessages )
119
+ . filter ( ( [ , value ] ) => "callback" in value && value . callback )
120
+ . map ( ( [ key ] ) => key ) ;
121
+
122
+ if ( invalidMessages . length > 0 ) {
123
+ throw new Error (
124
+ `serverMessages with callbacks are not supported: ${ invalidMessages . join ( ", " ) } `
125
+ ) ;
126
+ }
127
+
112
128
this . sender = new ZodMessageSender ( {
113
129
schema : opts . serverMessages ,
114
130
sender : async ( message ) => {
0 commit comments