@backstage/cli
Version:
CLI for developing Backstage plugins and apps
61 lines (57 loc) • 1.66 kB
JavaScript
var errors = require('@backstage/errors');
const requestType = "@backstage/cli/channel/request";
const responseType = "@backstage/cli/channel/response";
class IpcServer {
#generation = 1;
#methods = /* @__PURE__ */ new Map();
addChild(child) {
const generation = this.#generation++;
const sendMessage = child.send?.bind(child);
if (!sendMessage) {
return;
}
const messageListener = (request) => {
if (request.type !== requestType) {
return;
}
const handler = this.#methods.get(request.method);
if (!handler) {
sendMessage({
type: responseType,
id: request.id,
error: {
name: "NotFoundError",
message: `No handler registered for method ${request.method}`
}
});
return;
}
Promise.resolve().then(() => handler(request.body, { generation })).then(
(response) => sendMessage({
type: responseType,
id: request.id,
body: response
})
).catch(
(error) => sendMessage({
type: responseType,
id: request.id,
error: errors.serializeError(error)
})
);
};
child.addListener("message", messageListener);
child.addListener("exit", () => {
child.removeListener("message", messageListener);
});
}
registerMethod(method, handler) {
if (this.#methods.has(method)) {
throw new Error(`A handler is already registered for method ${method}`);
}
this.#methods.set(method, handler);
}
}
exports.IpcServer = IpcServer;
//# sourceMappingURL=IpcServer.cjs.js.map
;