1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const EventSource = require("@heroku/eventsource");
|
4 | const cli_ux_1 = require("cli-ux");
|
5 | const http_call_1 = require("http-call");
|
6 | const url = require("url");
|
7 | const colorize_1 = require("./colorize");
|
8 | const line_transform_1 = require("./line-transform");
|
9 | function 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 | }
|
18 | async 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 | }
|
29 | function 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 |
|
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 | }
|
62 | async 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 | }
|
82 | exports.default = logDisplayer;
|