@airplane/views
Version:
A React library for building Airplane views. Views components are optimized in style and functionality to produce internal apps that are easy to build and maintain.
122 lines (121 loc) • 3.27 kB
JavaScript
import { executeRunbookBackground, SessionTerminationError } from "airplane";
import { getSession } from "airplane/api";
import hash from "object-hash";
import { isGenericExecuteError } from "./status.js";
import { MISSING_EXECUTE_PERMISSIONS_ERROR_PREFIX } from "../errors/formatErrors.js";
import { sendViewMessage } from "../message/sendViewMessage.js";
import { getExecuteOptions } from "./env.js";
const executeRunbook = async (slug, executeType = "mutation", params) => {
try {
const executeOptions = getExecuteOptions(executeType);
const sessionID = await executeRunbookBackground(slug, params, executeOptions);
sendViewMessage({
type: "start_session",
sessionID
});
const checkSession = async () => {
const session = await getSession(sessionID, executeOptions);
if (session.status === "Failed" || session.status === "Cancelled") {
throw new SessionTerminationError(session);
}
if (session.status !== "Succeeded") {
return null;
}
return {
sessionID: session.id
};
};
const output = await new Promise((resolve, reject) => {
const fnw = async () => {
try {
const out = await checkSession();
if (out !== null) {
return resolve(out);
}
} catch (err) {
return reject(err);
}
setTimeout(fnw, 500);
};
fnw();
});
return output;
} catch (e) {
if (isSessionTerminationError(e)) {
return {
error: {
message: e.message,
type: "FAILED"
},
sessionID: e.session.id
};
}
if (isGenericExecuteError(e)) {
if (e.statusCode === 403) {
return {
error: {
message: `${MISSING_EXECUTE_PERMISSIONS_ERROR_PREFIX} ${slug}`,
type: "AIRPLANE_INTERNAL"
}
};
} else if (e.statusCode >= 400 && e.statusCode < 500) {
sendViewMessage({
type: "console",
messageType: "error",
message: e.message,
runbookSlug: slug,
hash: hash(e),
time: Date.now()
});
return {
error: {
message: e.message,
type: "CLIENT_ERROR"
}
};
} else {
sendViewMessage({
type: "console",
messageType: "error",
message: e.message,
runbookSlug: slug,
hash: hash(e),
time: Date.now()
});
return {
error: {
message: e.message,
type: "AIRPLANE_INTERNAL"
}
};
}
} else {
const message = "An error occured";
sendViewMessage({
type: "console",
messageType: "error",
message,
runbookSlug: slug,
hash: hash(message),
time: Date.now()
});
return {
error: {
message,
type: "AIRPLANE_INTERNAL"
}
};
}
}
};
const isSessionTerminationError = (x) => {
return typeof x.message === "string" && "session" in x;
};
function isExecuteRunbookError(value) {
return !!value.error;
}
export {
executeRunbook,
isExecuteRunbookError
};
//# sourceMappingURL=executeRunbook.js.map