@restorecommerce/chassis-srv
Version:
Restore Commerce microservice chassis
79 lines • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.loggingMiddleware = void 0;
exports.tracingMiddleware = tracingMiddleware;
exports.metaMiddleware = metaMiddleware;
const nice_grpc_1 = require("nice-grpc");
const abort_controller_x_1 = require("abort-controller-x");
const uuid_1 = require("uuid");
const middleware_1 = require("@restorecommerce/grpc-client/dist/middleware");
const tracingHeader = 'x-request-id';
async function* tracingMiddleware(call, context) {
const nextID = context.metadata.get(tracingHeader) || (0, uuid_1.v1)();
context.metadata?.set(tracingHeader, nextID);
return yield* call.next(call.request, {
...context,
rid: nextID
});
}
const loggingMiddleware = (logger) => {
return async function* (call, context) {
const { path } = call.method;
logger.verbose(`[rid: ${context.rid}] received request to method ${path}`, call.request);
try {
const response = yield* call.next(call.request, context);
logger.verbose(`[rid: ${context.rid}] request to method ${path} response sent`, { request: call.request });
return response;
}
catch (error) {
if (error instanceof nice_grpc_1.ServerError) {
logger.error(`${context.rid} request to method ${path} server error`, {
message: error.details,
code: error.code
});
}
else if ((0, abort_controller_x_1.isAbortError)(error)) {
logger.error(`${context.rid} request to method ${path} cancel`, {
message: error.message,
stack: error.stack
});
}
else {
logger.error(`${context.rid} request to method ${path} error`, {
message: error.message,
stack: error.stack
});
}
return {
status: {
code: 500,
message: error.message
}
};
}
};
};
exports.loggingMiddleware = loggingMiddleware;
function bindAsyncGenerator(store, generator) {
const ctx = store.getStore();
return {
next: () => store.run(ctx, generator.next.bind(generator)),
return: (args) => store.run(ctx, generator.return.bind(generator), args),
throw: (args) => store.run(ctx, generator.throw.bind(generator), args),
[Symbol.asyncIterator]() {
return this;
},
};
}
async function* metaMiddleware(call, context) {
const mapped = {};
for (const [a, b] of context.metadata) {
mapped[a] = b;
}
const val = JSON.stringify(mapped);
middleware_1.metadataPassThrough.enterWith(val);
return yield* bindAsyncGenerator(middleware_1.metadataPassThrough, call.next(call.request, {
...context,
}));
}
//# sourceMappingURL=middlewares.js.map