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