in packages/sqrl-cli/src/SqrlServer.ts [42:103]
async function run(
ctx: Context,
executable: Executable,
req: IncomingMessage,
res: ServerResponse
) {
const query = microQuery(req);
const featureTimeoutMs = parseInt(query.timeoutMs || "1000", 10);
userInvariant(!isNaN(featureTimeoutMs), "timeoutMs was not a valid integer");
const inputs = await micro.json(req, { limit: "128mb" });
const manipulator = new CliManipulator();
const execution: Execution = await executable.execute(ctx, {
manipulator,
inputs,
featureTimeoutMs,
});
await execution.fetchFeature("SqrlExecutionComplete");
const rules: ApiRulesResponse = {};
function ruleToName(rule: FiredRule) {
rules[rule.name] = {
reason: rule.reason,
};
return rule.name;
}
const rv: ApiResponse = {
allow: !manipulator.wasBlocked(),
verdict: {
blockRules: manipulator.blockedRules.map(ruleToName) || [],
whitelistRules: manipulator.whitelistedRules.map(ruleToName) || [],
},
rules,
};
if (query.features) {
const featureNames = query.features.split(",");
try {
rv.features = {};
await Promise.all(
featureNames.map(async (featureName) => {
rv.features[featureName] = await execution.fetchValue(featureName);
})
);
} catch (e) {
throw micro.createError(500, e.message, e);
}
}
await manipulator.mutate(ctx);
res.setHeader("Content-Type", "application/json");
if (query.hasOwnProperty("pretty")) {
return JSON.stringify(rv, undefined, 2) + "\n";
} else {
return JSON.stringify(rv);
}
}