@@ -126,7 +126,7 @@ function getImportLine(dependency: Protobuf.Type | Protobuf.Enum | Protobuf.Serv
126
126
} else if ( dependency instanceof Protobuf . Enum ) {
127
127
importedTypes = `${typeInterfaceName } `;
128
128
} else if ( dependency instanceof Protobuf . Service ) {
129
- importedTypes = `${typeInterfaceName } Client `;
129
+ importedTypes = `${typeInterfaceName } Client , ${ typeInterfaceName } Definition `;
130
130
} else {
131
131
throw new Error ( 'Invalid object passed to getImportLine' ) ;
132
132
}
@@ -136,7 +136,7 @@ function getImportLine(dependency: Protobuf.Type | Protobuf.Enum | Protobuf.Serv
136
136
} else if ( dependency instanceof Protobuf . Enum ) {
137
137
importedTypes = `${dependency . name } as ${typeInterfaceName } `;
138
138
} else if ( dependency instanceof Protobuf . Service ) {
139
- importedTypes = `${dependency . name } Client as ${typeInterfaceName } Client `;
139
+ importedTypes = `${dependency . name } Client as ${typeInterfaceName } Client , ${ dependency . name } Definition as ${ typeInterfaceName } Definition `;
140
140
} else {
141
141
throw new Error ( 'Invalid object passed to getImportLine ') ;
142
142
}
@@ -540,11 +540,25 @@ function generateServiceHandlerInterface(formatter: TextFormatter, serviceType:
540
540
formatter . writeLine ( '}' ) ;
541
541
}
542
542
543
+ function generateServiceDefinitionInterface ( formatter : TextFormatter , serviceType : Protobuf . Service ) {
544
+ formatter . writeLine ( `export interface ${ serviceType . name } Definition {` ) ;
545
+ formatter . indent ( ) ;
546
+ for ( const methodName of Object . keys ( serviceType . methods ) . sort ( ) ) {
547
+ const method = serviceType . methods [ methodName ] ;
548
+ const requestType = getTypeInterfaceName ( method . resolvedRequestType ! ) ;
549
+ const responseType = getTypeInterfaceName ( method . resolvedResponseType ! ) ;
550
+ formatter . writeLine ( `${ methodName } : MethodDefinition<${ requestType } , ${ responseType } , ${ requestType } __Output, ${ responseType } __Output>` ) ;
551
+ }
552
+ formatter . unindent ( ) ;
553
+ formatter . writeLine ( '}' )
554
+ }
555
+
543
556
function generateServiceInterfaces ( formatter : TextFormatter , serviceType : Protobuf . Service , options : GeneratorOptions ) {
544
557
formatter . writeLine ( `// Original file: ${ serviceType . filename } ` ) ;
545
558
formatter . writeLine ( '' ) ;
546
559
const grpcImportPath = options . grpcLib . startsWith ( '.' ) ? getPathToRoot ( serviceType ) + options . grpcLib : options . grpcLib ;
547
560
formatter . writeLine ( `import type * as grpc from '${ grpcImportPath } '` ) ;
561
+ formatter . writeLine ( `import type { MethodDefinition } from '@grpc/proto-loader'` )
548
562
const dependencies : Set < Protobuf . Type > = new Set< Protobuf . Type > ();
549
563
for (const method of serviceType.methodsArray) {
550
564
dependencies . add ( method . resolvedRequestType ! ) ;
@@ -559,6 +573,9 @@ function generateServiceInterfaces(formatter: TextFormatter, serviceType: Protob
559
573
formatter.writeLine('');
560
574
561
575
generateServiceHandlerInterface(formatter, serviceType, options);
576
+ formatter.writeLine('');
577
+
578
+ generateServiceDefinitionInterface(formatter, serviceType);
562
579
}
563
580
564
581
function generateServiceImports ( formatter : TextFormatter , namespace : Protobuf . NamespaceBase , options : GeneratorOptions ) {
@@ -576,7 +593,8 @@ function generateSingleLoadedDefinitionType(formatter: TextFormatter, nested: Pr
576
593
if ( options . includeComments ) {
577
594
formatComment ( formatter , nested . comment ) ;
578
595
}
579
- formatter . writeLine ( `${ nested . name } : SubtypeConstructor<typeof grpc.Client, ${ getTypeInterfaceName ( nested ) } Client> & { service: ServiceDefinition }` )
596
+ const typeInterfaceName = getTypeInterfaceName ( nested ) ;
597
+ formatter . writeLine ( `${ nested . name } : SubtypeConstructor<typeof grpc.Client, ${ typeInterfaceName } Client> & { service: ${ typeInterfaceName } Definition }` ) ;
580
598
} else if ( nested instanceof Protobuf . Enum ) {
581
599
formatter . writeLine ( `${ nested . name } : EnumTypeDefinition` ) ;
582
600
} else if (nested instanceof Protobuf.Type) {
0 commit comments