handleTaskJob method

Future<Response> handleTaskJob(
  1. Request request
)

Implementation

Future<Response> handleTaskJob(Request request) async {
  try {
    Map<String, dynamic> body = jsonDecode(await request.readAsString());
    String executorId = body["executor"];
    Map<String, dynamic> taskData = body["task"];
    TaskExecutor? executor = executors.select((t) => t.typeId == executorId);
    ExecutableTask task = executor!.deserialize(taskData);
    int lastBackoffMS = body["lbms"] ?? 0;

    TaskExecutionContext context = TaskExecutionContext(
      task: task,
      started: DateTime.timestamp(),
      timeBlockLimit: executionBlockTime,
      stopwatch: PrecisionStopwatch.start(),
    );

    while (context.running && context.hasTimeRemaining && !context.backing) {
      await task.workOnTask(context);
    }

    if (context.running) {
      if (context.backing) {
        lastBackoffMS = max(
          context.lastBack?.inMilliseconds ?? 0,
          lastBackoffMS,
        );
      } else {
        lastBackoffMS = (lastBackoffMS * 0.7).floor();
      }

      await schedule(
        task,
        delay: Duration(seconds: 5) + Duration(milliseconds: lastBackoffMS),
      );
    }
  } catch (e, es) {
    error(
      "Task handle failure! $e $es. Responding OK to not poison retries. If you want your task to retry then catch your errors.",
    );
  }

  return Response.ok("");
}