1- import  {  expect ,  Page  }  from  '@playwright/test' ; 
2- import  {  grpc  }  from  '@improbable-eng/grpc-web' ; 
3- import  { 
4-   GrpcErrorResponse , 
5-   grpcResponseToBuffer , 
6-   GrpcSuccessResponse , 
7- }  from  '../base' ; 
8- import  {  Request  }  from  'playwright-core' ; 
1+ import  { expect ,  Page }  from  '@playwright/test' ; 
2+ import  { grpc }  from  '@improbable-eng/grpc-web' ; 
3+ import  { GrpcResponse ,  grpcResponseToBuffer , }  from  '../base' ; 
4+ import  { Request }  from  'playwright-core' ; 
95
106export  interface  UnaryMethodDefinitionish 
117  extends  grpc . UnaryMethodDefinition < any ,  any >  { 
@@ -38,10 +34,15 @@ function unframeRequest(requestBody: Uint8Array): Uint8Array {
3834  return  new  Uint8Array ( requestBody ) . slice ( 5 ) ; 
3935} 
4036
37+ export  function  readGrpcRequest ( request : Request ) : Uint8Array  |  null  { 
38+   const  requestBody  =  request . postDataBuffer ( ) ; 
39+   return  ! requestBody  ? null  : unframeRequest ( requestBody ) ; 
40+ } 
41+ 
4142export  function  mockGrpcUnary ( 
4243  page : Page , 
4344  rpc : UnaryMethodDefinitionish , 
44-   response : GrpcSuccessResponse  |  GrpcErrorResponse 
45+   response : GrpcResponse  |  ( ( request :  Uint8Array | null )   =>   GrpcResponse ) 
4546) : MockedGrpcCall  { 
4647  const  url  =  `/${ rpc . service . serviceName }  /${ rpc . methodName }  ` ; 
4748
@@ -52,11 +53,14 @@ export function mockGrpcUnary(
5253      'ALL gRPC requests should be a POST request' 
5354    ) . toBe ( 'POST' ) ; 
5455
55-     // error messages need to have a zero length message field to be considered valid 
56-     const  grpcResponse  =  grpcResponseToBuffer ( response ) ; 
56+     const  grpcResponse  =  typeof  response  ===  'function' 
57+       ? response ( readGrpcRequest ( route . request ( ) ) ) 
58+       : response ; 
59+ 
60+     const  grpcResponseBody  =  grpcResponseToBuffer ( grpcResponse ) ; 
5761
5862    return  route . fulfill ( { 
59-       body : grpcResponse , 
63+       body : grpcResponseBody , 
6064      contentType : 'application/grpc-web+proto' , 
6165      headers : { 
6266        'Access-Control-Allow-Origin' : '*' , 
@@ -72,8 +76,7 @@ export function mockGrpcUnary(
7276        } 
7377
7478        if  ( requestPredicate )  { 
75-           const  messageBody  =  req . postDataBuffer ( ) ; 
76-           const  unframed  =  ! messageBody  ? null  : unframeRequest ( messageBody ) ; 
79+           const  unframed  =  readGrpcRequest ( req ) ; 
7780          return  requestPredicate ( unframed ,  req ) ; 
7881        } 
7982
@@ -82,8 +85,7 @@ export function mockGrpcUnary(
8285
8386      await  page . waitForResponse ( ( resp )  =>  resp . url ( ) . includes ( url ) ) ; 
8487
85-       const  messageBody  =  request . postDataBuffer ( ) ; 
86-       const  requestMessage  =  ! messageBody  ? null  : unframeRequest ( messageBody ) ; 
88+       const  requestMessage  =  readGrpcRequest ( request ) ; 
8789
8890      return  {  requestMessage } ; 
8991    } , 
0 commit comments