codius
Version:
Command Line Interface for Codius
58 lines (43 loc) • 1.68 kB
JavaScript
const logger = require('riverpig')('codius-cli:pod-control')
const multi = require('multi-read-stream')
const chalk = require('chalk')
const split = require('binary-split')
const { parse: parseUrl } = require('url')
const { Transform } = require('stream')
async function attachToLogs (hosts, podId) {
logger.info('attaching to logs. hosts=%s podId=%s', hosts, podId)
const streams = await Promise.all(hosts.map(async host => {
const url = parseUrl(host)
const get = (url.protocol === 'https:' ? require('https') : require('http')).get
const res = await new Promise((resolve, reject) => {
const req = get(`${host}/pods/${podId}/logs?follow=true`, resolve)
req.on('error', err => reject(err))
})
const transform = new Transform({
transform (chunk, encoding, callback) {
const line = chunk.toString('utf8')
if (line === 'ping') {
return
}
const firstSpaceIndex = line.indexOf(' ')
const secondSpaceIndex = line.indexOf(' ', firstSpaceIndex + 1)
const containerId = line.substring(0, firstSpaceIndex)
const streamId = line.substring(firstSpaceIndex + 1, secondSpaceIndex)
const logText = line.substring(secondSpaceIndex + 1)
const streamColor = streamId === 'stdout'
? chalk.green
: streamId === 'stderr'
? chalk.red
: chalk.blue
const outputLine = `${chalk.gray(url.hostname)} ${streamColor(containerId)} ${logText}\n`
callback(null, outputLine)
}
})
res.pipe(split()).pipe(transform)
return transform
}))
return multi(streams)
}
module.exports = {
attachToLogs
}