async run()

in src/commands/build/logs.ts [43:113]


  async run(client: AppCenterClient): Promise<CommandResult> {
    // validate build id
    const buildIdNumber = Number(this.buildId);

    if (!Number.isSafeInteger(buildIdNumber) || buildIdNumber < 1) {
      return failure(ErrorCodes.InvalidParameter, "build id should be positive integer");
    }

    // validate lines number
    let numberOfLines: number;
    if (!_.isNil(this.lines)) {
      numberOfLines = Number(this.lines);
      if (!Number.isSafeInteger(numberOfLines) || numberOfLines < 1) {
        return failure(ErrorCodes.InvalidParameter, "number of lines should be positive integer");
      }
    } else {
      numberOfLines = Number.MAX_SAFE_INTEGER;
    }

    const app = this.app;

    const streamingOutput = new StreamingArrayOutput();
    streamingOutput.start();

    let skippedAndShownLogsCount: number;
    await ContinuousPollingHelper.pollContinuously(
      async () => {
        try {
          debug(`Downloading logs for build ${this.buildId}`);
          return await clientRequest<models.BuildLog>((cb) => client.builds.getLog(buildIdNumber, app.ownerName, app.appName, cb));
        } catch (error) {
          debug(`Request failed - ${inspect(error)}`);
          switch (error.statusCode) {
            case 401:
              throw failure(ErrorCodes.Exception, "failed to get build logs because the authentication has failed");
            case 404:
              throw failure(ErrorCodes.InvalidParameter, `failed to get build logs because build ${buildIdNumber} doesn't exist`);
            default:
              throw failure(ErrorCodes.Exception, "failed to get build logs");
          }
        }
      },
      (response, responsesProcessed) => {
        // processing response
        const logs = response.result.value;
        let filteredLogs: string[];
        if (responsesProcessed) {
          filteredLogs = _.drop(logs, skippedAndShownLogsCount);
          skippedAndShownLogsCount += filteredLogs.length;
        } else {
          filteredLogs = _.takeRight(logs, Math.min(numberOfLines, logs.length));
          skippedAndShownLogsCount = logs.length;
        }

        if (!this.showContinuously && filteredLogs.length === 0) {
          streamingOutput.text(_.constant(""), "No log entries were found");
        } else {
          for (const log of filteredLogs) {
            streamingOutput.text(_.constant(log), log);
          }
        }
      },
      this.showContinuously,
      DisplayLogsStatusCommand.delayBetweenRequests,
      `Downloading logs for build ${this.buildId}...`
    );

    streamingOutput.finish();

    return success();
  }