Skip to content

Instantly share code, notes, and snippets.

@kobzarvs
Created May 4, 2025 11:04
Show Gist options
  • Save kobzarvs/02e1e04c4c03d7846900dfe69189b192 to your computer and use it in GitHub Desktop.
Save kobzarvs/02e1e04c4c03d7846900dfe69189b192 to your computer and use it in GitHub Desktop.
grpc logger
export function loggerDecoratorUnary(func: GrpcWebImpl['unary']) {
return async function (this: GrpcWebImpl, ...params: Parameters<GrpcWebImpl['unary']>) {
const id = uuidv7();
try {
params[2] = createMetadata();
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
// @ts-expect-error params[0]
methodName: `* ${params[0].methodName}`,
requestMessage: params[1],
requestMetadata: params[2],
timestamp: Date.now(),
// @ts-expect-error params[0]
serviceName: `${params[0].service.serviceName}`,
},
},
'*',
);
try {
const result = await func.apply(this, params);
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
responseMessage: JSON.parse(JSON.stringify(result)),
timestamp: Date.now(),
},
},
'*',
);
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
responseMessage: { EOF: Date.now() },
timestamp: Date.now(),
},
},
'*',
);
return result;
} catch (error) {
if (error instanceof RpcError) {
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
errorMetadata: {},
responseMessage: {
code: error.code,
name: `RpcError: ${RpcStatusCodes[error.code]}`,
messsage: error.message,
},
timestamp: Date.now(),
},
},
'*',
);
} else {
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
errorMetadata: {},
responseMessage: {
code: -1,
name: 'Unexoected error',
messsage: String(error),
},
timestamp: Date.now(),
},
},
'*',
);
}
}
} catch (error) {
console.error(error);
throw new Error(error as any);
}
};
}
export function loggerDecoratorStream(func: GrpcWebImpl['invoke']) {
return function (this: GrpcWebImpl, ...params: Parameters<GrpcWebImpl['invoke']>) {
let response: any;
const id = uuidv7();
try {
params[2] = createMetadata();
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
// @ts-expect-error params[0]
methodName: `* ${params[0].methodName}`,
requestMessage: params[1],
requestMetadata: params[2],
timestamp: Date.now(),
// @ts-expect-error params[0]
serviceName: `${params[0].service.serviceName}`,
},
},
'*',
);
response = func.apply(this, params);
response.subscribe(
(data: any) => {
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
responseMessage: JSON.parse(JSON.stringify(data)),
timestamp: Date.now(),
},
},
'*',
);
},
(error: RpcError) => {
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
errorMetadata: {},
responseMessage: {
code: error.code,
name: `RpcError: ${RpcStatusCodes[error.code]}`,
messsage: error.message,
},
timestamp: Date.now(),
},
},
'*',
);
},
() => {
window.postMessage(
{
source: '__gRPC_devtools_content_scripts_main__',
payload: {
id,
responseMessage: { EOF: Date.now() },
timestamp: Date.now(),
},
},
'*',
);
},
);
return response;
} catch (error) {
console.error(error);
throw new Error(error as any);
}
};
}
const rpc = new GrpcWebImpl(`${window.location.protocol}//${window.location.host}`, { debug: false });
rpc.invoke = loggerDecoratorStream(rpc.invoke);
rpc.unary = loggerDecoratorUnary(rpc.unary);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment