UNPKG

2.92 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const EventSource = require("@heroku/eventsource");
4const cli_ux_1 = require("cli-ux");
5const http_call_1 = require("http-call");
6const url = require("url");
7const colorize_1 = require("./colorize");
8const line_transform_1 = require("./line-transform");
9function readLogs(logplexURL) {
10 let u = url.parse(logplexURL);
11 if (u.query && u.query.includes('srv')) {
12 return readLogsV1(logplexURL);
13 }
14 else {
15 return readLogsV2(logplexURL);
16 }
17}
18async function readLogsV1(logplexURL) {
19 let { response } = await http_call_1.default.stream(logplexURL);
20 return new Promise(function (resolve, reject) {
21 response.setEncoding('utf8');
22 line_transform_1.default.setEncoding('utf8');
23 response.pipe(line_transform_1.default);
24 line_transform_1.default.on('data', line => cli_ux_1.default.log(colorize_1.default(line)));
25 response.on('end', resolve);
26 response.on('error', reject);
27 });
28}
29function readLogsV2(logplexURL) {
30 return new Promise(function (resolve, reject) {
31 const u = url.parse(logplexURL, true);
32 const isTail = u.query.tail && u.query.tail === 'true';
33 const userAgent = process.env.HEROKU_DEBUG_USER_AGENT || 'heroku-run';
34 const proxy = process.env.https_proxy || process.env.HTTPS_PROXY;
35 const es = new EventSource(logplexURL, {
36 proxy,
37 headers: {
38 'User-Agent': userAgent
39 }
40 });
41 es.onerror = function (err) {
42 if (err && (err.status || err.message)) {
43 const msg = (isTail && (err.status === 404 || err.status === 403)) ?
44 'Log stream timed out. Please try again.' :
45 `Logs eventsource failed with: ${err.status} ${err.message}`;
46 reject(msg);
47 es.close();
48 }
49 if (!isTail) {
50 resolve();
51 es.close();
52 }
53 // should only land here if --tail and no error status or message
54 };
55 es.onmessage = function (e) {
56 e.data.trim().split(/\n+/).forEach(line => {
57 cli_ux_1.default.log(colorize_1.default(line));
58 });
59 };
60 });
61}
62async function logDisplayer(heroku, options) {
63 process.stdout.on('error', err => {
64 if (err.code === 'EPIPE') {
65 process.exit(0);
66 }
67 else {
68 cli_ux_1.default.error(err.stack);
69 process.exit(1);
70 }
71 });
72 const response = await heroku.post(`/apps/${options.app}/log-sessions`, {
73 body: {
74 tail: options.tail,
75 dyno: options.dyno,
76 source: options.source,
77 lines: options.lines
78 }
79 });
80 return readLogs(response.body.logplex_url);
81}
82exports.default = logDisplayer;