async function run()

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);
  }
}