pino-socket
Advanced tools
Comparing version 0.1.2 to 0.2.0
12
app.js
#!/usr/bin/env node | ||
'use strict'; | ||
'use strict' | ||
const path = require('path'); | ||
const fs = require('fs'); | ||
const realPath = fs.realpathSync(__dirname); | ||
const script = path.join(realPath, 'psock.js'); | ||
const path = require('path') | ||
const fs = require('fs') | ||
const realPath = fs.realpathSync(__dirname) | ||
const script = path.join(realPath, 'psock.js') | ||
require(script.toString()); | ||
require(script.toString()) |
@@ -1,5 +0,5 @@ | ||
'use strict'; | ||
'use strict' | ||
const gulp = require('gulp'); | ||
const $ = require('gulp-load-plugins')(); | ||
const gulp = require('gulp') | ||
const $ = require('gulp-load-plugins')() | ||
@@ -9,28 +9,26 @@ const srcIncludes = [ | ||
'!node_modules/**', | ||
'!coverage/**', | ||
'!test/**' // tests can be wonky | ||
]; | ||
'!coverage/**' | ||
] | ||
gulp.task('lint', function lintTask() { | ||
gulp.task('lint', function lintTask () { | ||
return gulp | ||
.src(srcIncludes) | ||
.pipe($.eslint()) | ||
.pipe($.eslint.formatEach()) | ||
.pipe($.eslint.failAfterError()); | ||
}); | ||
.pipe($.standard()) | ||
.pipe($.standard.reporter('default', { breakOnError: true })) | ||
}) | ||
gulp.task('pre-test', function preTest() { | ||
gulp.task('pre-test', function preTest () { | ||
return gulp | ||
.src(srcIncludes) | ||
.src(srcIncludes.concat(['!test/**'])) | ||
.pipe($.istanbul()) | ||
.pipe($.istanbul.hookRequire()); | ||
}); | ||
.pipe($.istanbul.hookRequire()) | ||
}) | ||
gulp.task('test', ['lint', 'pre-test'], function testTask() { | ||
gulp.task('test', ['lint', 'pre-test'], function testTask () { | ||
return gulp | ||
.src(['test/*.js']) | ||
.pipe($.mocha({ui: 'qunit', reporter: 'min'})) | ||
.pipe($.istanbul.writeReports()); | ||
}); | ||
.pipe($.istanbul.writeReports()) | ||
}) | ||
gulp.task('default', ['test']); | ||
gulp.task('default', ['test']) |
{ | ||
"name": "pino-socket", | ||
"version": "0.1.2", | ||
"version": "0.2.0", | ||
"description": "A pino 'transport' for writing to a tcp or udp socket", | ||
@@ -30,9 +30,11 @@ "homepage": "https://github.com/jsumners/pino-socket", | ||
"gulp": "^3.9.1", | ||
"gulp-eslint": "^2.0.0", | ||
"gulp-istanbul": "^0.10.4", | ||
"gulp-load-plugins": "^1.2.2", | ||
"gulp-mocha": "^2.2.0", | ||
"gulp-standard": "^7.0.1", | ||
"istanbul": "^0.4.3", | ||
"mocha": "^2.4.5", | ||
"pino": "^2.4.0" | ||
"pino": "^2.4.0", | ||
"pre-commit": "^1.1.3", | ||
"standard": "^7.1.0" | ||
}, | ||
@@ -39,0 +41,0 @@ "dependencies": { |
152
psock.js
@@ -1,9 +0,9 @@ | ||
'use strict'; | ||
'use strict' | ||
const net = require('net'); | ||
const dgram = require('dgram'); | ||
const split2 = require('split2'); | ||
const pump = require('pump'); | ||
const through2 = require('through2'); | ||
const nopt = require('nopt'); | ||
const net = require('net') | ||
const dgram = require('dgram') | ||
const split2 = require('split2') | ||
const pump = require('pump') | ||
const through2 = require('through2') | ||
const nopt = require('nopt') | ||
@@ -14,20 +14,59 @@ let options = { | ||
port: '514', | ||
echo: true | ||
}; | ||
const argv = nopt( | ||
{address: String, mode: ['tcp', 'udp'], port: Number, echo: Boolean}, | ||
{a: '--address', m: '--mode', p: '--port', e: '--echo', ne: '--no-echo'}, | ||
process.argv | ||
); | ||
options = Object.assign(options, argv); | ||
echo: true, | ||
cee: false | ||
} | ||
const longOpts = { | ||
address: String, | ||
mode: ['tcp', 'udp'], | ||
port: Number, | ||
echo: Boolean, | ||
cee: Boolean | ||
} | ||
const shortOpts = { | ||
a: '--address', | ||
m: '--mode', | ||
p: '--port', | ||
e: '--echo', | ||
ne: '--no-echo', | ||
c: '--cee', | ||
nc: '--no-cee' | ||
} | ||
const argv = nopt(longOpts, shortOpts, process.argv) | ||
options = Object.assign(options, argv) | ||
/* eslint func-names: "off" */ | ||
/* eslint space-before-function-paren: "off" */ | ||
/* eslint no-empty-function: "off" */ | ||
/* eslint space-before-blocks: "off" */ | ||
const log = (options.echo) ? console.log : function(){}; | ||
const log = (options.echo) ? console.log : function () {} | ||
let socket; | ||
let send; | ||
let close; | ||
function TcpWriter (socket) { | ||
if (options.cee) { | ||
Object.defineProperty(this, 'write', { | ||
value: (message) => socket.write(`@cee: ${message}\n`) | ||
}) | ||
} else { | ||
Object.defineProperty(this, 'write', { | ||
value: (message) => socket.write(`${message}\n`) | ||
}) | ||
} | ||
} | ||
function UdpWriter (socket) { | ||
if (options.cee) { | ||
Object.defineProperty(this, 'write', { | ||
value: (message) => { | ||
const buf = new Buffer(`@cee: ${message}\n`, 'utf8') | ||
socket.send(buf, 0, buf.length, options.port, options.address) | ||
} | ||
}) | ||
} else { | ||
Object.defineProperty(this, 'write', { | ||
value: (message) => { | ||
const buf = new Buffer(`${message}\n`, 'utf8') | ||
socket.send(buf, 0, buf.length, options.port, options.address) | ||
} | ||
}) | ||
} | ||
} | ||
let socket | ||
let send | ||
let close | ||
if (options.mode === 'tcp') { | ||
@@ -37,33 +76,24 @@ socket = net.createConnection({ | ||
port: options.port | ||
}); | ||
send = (message) => { | ||
socket.write(message + '\n'); | ||
}; | ||
close = socket.end; | ||
}) | ||
const writer = new TcpWriter(socket) | ||
send = writer.write | ||
close = socket.end | ||
} else { | ||
socket = dgram.createSocket('udp4'); | ||
send = (message) => { | ||
const buf = new Buffer(message + '\n'); | ||
socket.send( | ||
buf, | ||
0, | ||
buf.length, | ||
options.port, | ||
options.address | ||
); | ||
}; | ||
close = socket.close; | ||
socket = dgram.createSocket('udp4') | ||
const writer = new UdpWriter(socket) | ||
send = writer.write | ||
close = socket.close | ||
} | ||
let lastInput = 0; | ||
function shutdown() { | ||
let lastInput = 0 | ||
function shutdown () { | ||
// We block termination until the piped process has had a chance to shutdown. | ||
let _lastInput = lastInput; | ||
lastInput = 0; | ||
let _lastInput = lastInput | ||
lastInput = 0 | ||
while (_lastInput !== lastInput) { | ||
_lastInput = lastInput; | ||
lastInput = 0; | ||
_lastInput = lastInput | ||
lastInput = 0 | ||
} | ||
try { | ||
close(); | ||
close() | ||
} catch (e) { | ||
@@ -73,19 +103,19 @@ // I assume that due to the closing of the pipe, the dgram/tcp socket has | ||
// this try/catch is here to suppress the resulting error. | ||
process.exit(); | ||
process.exit() | ||
} | ||
} | ||
process.on('SIGINT', function sigint() { | ||
shutdown(); | ||
}); | ||
process.on('SIGTERM', function sigterm() { | ||
shutdown(); | ||
}); | ||
process.on('SIGINT', function sigint () { | ||
shutdown() | ||
}) | ||
process.on('SIGTERM', function sigterm () { | ||
shutdown() | ||
}) | ||
const myTransport = through2.obj(function transport(chunk, enc, cb) { | ||
lastInput = Date.now(); | ||
log(chunk); | ||
send(chunk); | ||
cb(); | ||
}); | ||
const myTransport = through2.obj(function transport (chunk, enc, cb) { | ||
lastInput = Date.now() | ||
setImmediate(log.bind(null, chunk)) | ||
setImmediate(() => send(chunk)) | ||
cb() | ||
}) | ||
pump(process.stdin, split2(), myTransport); | ||
pump(process.stdin, split2(), myTransport) |
@@ -7,3 +7,3 @@ # pino-socket | ||
You should install install `pino-socket` globally for ease of use: | ||
You should install `pino-socket` globally for ease of use: | ||
@@ -33,5 +33,10 @@ ```bash | ||
+ `--no-echo` (`-ne`): disable echoing received messages to stdout. | ||
+ `--cee` (`-c`): prefix the message with `@cee: ` for [rsyslog cee][rsyscee] | ||
support. Default: disabled. | ||
+ `--no-cee` (`-nc`): explicitly disable CEE prefixing | ||
[rsyscee]: http://www.rsyslog.com/doc/mmjsonparse.html | ||
## License | ||
[MIT License](http://jsumners.mit-license.org/) |
@@ -1,6 +0,6 @@ | ||
'use strict'; | ||
'use strict' | ||
const pino = require('pino'); | ||
const log = pino({level: 'debug'}); | ||
const pino = require('pino') | ||
const log = pino({ level: 'debug' }) | ||
log.debug({foo: 'bar'}); | ||
log.debug({ foo: 'bar' }) |
@@ -1,90 +0,146 @@ | ||
'use strict'; | ||
'use strict' | ||
/* eslint-env node, mocha */ | ||
const dgram = require('dgram'); | ||
const net = require('net'); | ||
const spawn = require('child_process').spawn; | ||
const expect = require('chai').expect; | ||
const dgram = require('dgram') | ||
const net = require('net') | ||
const spawn = require('child_process').spawn | ||
const expect = require('chai').expect | ||
function createTcpListener(msgHandler) { | ||
function createTcpListener (msgHandler) { | ||
return new Promise((resolve, reject) => { | ||
const socket = net.createServer((connection) => { | ||
connection.on('data', (data) => msgHandler(data.toString())); | ||
}); | ||
connection.on('data', (data) => msgHandler(data.toString())) | ||
}) | ||
socket.listen((err) => { | ||
if (err) { | ||
return reject(err); | ||
return reject(err) | ||
} | ||
return resolve(socket); | ||
}); | ||
}); | ||
return resolve(socket) | ||
}) | ||
}) | ||
} | ||
function createUdpListener(msgHandler) { | ||
function createUdpListener (msgHandler) { | ||
return new Promise((resolve) => { | ||
const socket = dgram.createSocket('udp4'); | ||
socket.on('message', (msg) => msgHandler(msg.toString())); | ||
socket.on('error', (err) => console.log(`socket error: ${err.message}`)); | ||
socket.bind({address: '127.0.0.1'}, () => resolve(socket)); | ||
}); | ||
const socket = dgram.createSocket('udp4') | ||
socket.on('message', (msg) => msgHandler(msg.toString())) | ||
socket.on('error', (err) => console.log(`socket error: ${err.message}`)) | ||
socket.bind({address: '127.0.0.1'}, () => resolve(socket)) | ||
}) | ||
} | ||
test('tcp send', function tcp(done) { | ||
let socket; | ||
createTcpListener( | ||
(msg) => { | ||
try { | ||
expect(msg).to.contain('"foo":"bar"'); | ||
expect(msg.substr(-1)).to.equal('\n'); | ||
done(); | ||
} catch (e) { | ||
done(e); | ||
} finally { | ||
socket.close(); | ||
} | ||
} | ||
) | ||
function tcpTest (done, socketOptions, cb) { | ||
let socket | ||
createTcpListener((msg) => cb(msg, socket)) | ||
.then((sock) => { | ||
socket = sock; | ||
const address = socket.address().address; | ||
const port = socket.address().port; | ||
const logit = spawn('node', [`${__dirname}/fixtures/logit.js`]); | ||
const psock = spawn('node', [`${__dirname}/../psock.js`, '-a', address, '-p', port, '-m', 'tcp']); | ||
socket = sock | ||
const address = socket.address().address | ||
const port = socket.address().port | ||
const logit = spawn('node', [`${__dirname}/fixtures/logit.js`]) | ||
const psock = spawn( | ||
'node', | ||
[`${__dirname}/../psock.js`, '-a', address, '-p', port, '-m', 'tcp'].concat(socketOptions) | ||
) | ||
logit.stdout.on('data', (data) => psock.stdin.write(data)); | ||
logit.stderr.on('data', (data) => console.log(`logit err: ${data}`)); | ||
psock.stderr.on('data', (data) => console.log(`psock err: ${data}`)); | ||
logit.stdout.on('data', (data) => psock.stdin.write(data)) | ||
logit.stderr.on('data', (data) => console.log(`logit err: ${data}`)) | ||
psock.stderr.on('data', (data) => console.log(`psock err: ${data}`)) | ||
logit.on('close', () => psock.stdin.end()); | ||
logit.on('close', () => psock.stdin.end( | ||
setImmediate.bind(null, psock.kill) | ||
)) | ||
}) | ||
.catch(done); | ||
}); | ||
.catch(done) | ||
} | ||
test('udp send', function udp(done) { | ||
let socket; | ||
createUdpListener( | ||
(msg) => { | ||
try { | ||
expect(msg).to.contain('"foo":"bar"'); | ||
expect(msg.substr(-1)).to.equal('\n'); | ||
done(); | ||
} catch (e) { | ||
done(e); | ||
} finally { | ||
socket.close(); | ||
} | ||
} | ||
) | ||
function udpTest (done, socketOptions, cb) { | ||
let socket | ||
createUdpListener((msg) => cb(msg, socket)) | ||
.then((sock) => { | ||
socket = sock; | ||
const address = socket.address().address; | ||
const port = socket.address().port; | ||
const logit = spawn('node', [`${__dirname}/fixtures/logit.js`]); | ||
const psock = spawn('node', [`${__dirname}/../psock.js`, '-a', address, '-p', port]); | ||
socket = sock | ||
const address = socket.address().address | ||
const port = socket.address().port | ||
const logit = spawn('node', [`${__dirname}/fixtures/logit.js`]) | ||
const psock = spawn( | ||
'node', | ||
[`${__dirname}/../psock.js`, '-a', address, '-p', port].concat(socketOptions) | ||
) | ||
logit.stdout.on('data', (data) => psock.stdin.write(data)); | ||
logit.stderr.on('data', (data) => console.log(`logit err: ${data}`)); | ||
psock.stderr.on('data', (data) => console.log(`psock err: ${data}`)); | ||
logit.stdout.on('data', (data) => psock.stdin.write(data)) | ||
logit.stderr.on('data', (data) => console.log(`logit err: ${data}`)) | ||
psock.stderr.on('data', (data) => console.log(`psock err: ${data}`)) | ||
logit.on('close', () => psock.stdin.end()); | ||
}); | ||
}); | ||
logit.on('close', () => psock.stdin.end( | ||
setImmediate.bind(null, psock.kill) | ||
)) | ||
}) | ||
.catch(done) | ||
} | ||
test('tcp send', function tcp (done) { | ||
tcpTest(done, [], (msg, socket) => { | ||
try { | ||
expect(msg).to.contain('"foo":"bar"') | ||
expect(msg.substr(-1)).to.equal('\n') | ||
done() | ||
} catch (e) { | ||
done(e) | ||
} finally { | ||
socket.end() | ||
socket.unref() | ||
} | ||
}) | ||
}) | ||
test('tcp cee send', function tcpCee (done) { | ||
tcpTest(done, ['--cee'], (msg, socket) => { | ||
try { | ||
expect(msg).to.contain('@cee: {') | ||
expect(msg).to.contain('"foo":"bar"') | ||
expect(msg.substr(-1)).to.equal('\n') | ||
done() | ||
} catch (e) { | ||
done(e) | ||
} finally { | ||
socket.end() | ||
socket.unref() | ||
} | ||
}) | ||
}) | ||
test('udp send', function udp (done) { | ||
udpTest(done, [], (msg, socket) => { | ||
try { | ||
expect(msg).to.contain('"foo":"bar"') | ||
expect(msg.substr(-1)).to.equal('\n') | ||
done() | ||
} catch (e) { | ||
done(e) | ||
} finally { | ||
socket.close() | ||
socket.unref() | ||
} | ||
}) | ||
}) | ||
test('udp cee send', function tcpCee (done) { | ||
udpTest(done, ['-c'], (msg, socket) => { | ||
try { | ||
expect(msg).to.contain('@cee: {') | ||
expect(msg).to.contain('"foo":"bar"') | ||
expect(msg.substr(-1)).to.equal('\n') | ||
done() | ||
} catch (e) { | ||
done(e) | ||
} finally { | ||
socket.close() | ||
socket.unref() | ||
} | ||
}) | ||
}) | ||
// This ridiculousness is because when the tests are run via | ||
// gulp.mocha there's something that causes it to run idefinitely. | ||
// It doesn't matter that we have close all of the sockets and killed all | ||
// of the children. | ||
after(function () { setImmediate(process.exit) }) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
41
12286
14
279
6