Skip to content

Commit 5d8eb71

Browse files
authored
Added documentation for MultiStreamRes, StreamEntry, DestinationStream and Level (#1342)
* Added documentation about MultiStreamRes, StreamEntry, DestinationStream and Level * fix branching in multistream#add
1 parent c3cd594 commit 5d8eb71

File tree

5 files changed

+133
-17
lines changed

5 files changed

+133
-17
lines changed

docs/api.md

+62-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
* [pino.stdTimeFunctions](#pino-stdtimefunctions)
3131
* [pino.symbols](#pino-symbols)
3232
* [pino.version](#pino-version)
33+
* [Interfaces](#interfaces)
34+
* [MultiStreamRes](#multistreamres)
35+
* [StreamEntry](#streamentry)
36+
* [DestinationStream](#destinationstream)
37+
* [Types](#types)
38+
* [Level](#level-1)
3339

3440
<a id="export"></a>
3541
## `pino([options], [destination]) => logger`
@@ -1164,9 +1170,10 @@ finalLogger.info('exiting...')
11641170
11651171
<a id="pino-multistream"></a>
11661172
1167-
### `pino.multistream(options) => Stream`
1173+
### `pino.multistream(streamsArray, opts) => MultiStreamRes`
11681174
1169-
Create a stream composed by multiple destination streams:
1175+
Create a stream composed by multiple destination streams and returns an
1176+
object implementing the [MultiStreamRes](#multistreamres) interface.
11701177
11711178
```js
11721179
var fs = require('fs')
@@ -1272,3 +1279,56 @@ for general use.
12721279
Exposes the Pino package version. Also available on the logger instance.
12731280
12741281
* See [`logger.version`](#version)
1282+
1283+
## Interfaces
1284+
<a id="pino-multistreamres"></a>
1285+
1286+
### `MultiStreamRes`
1287+
Properties:
1288+
1289+
* `write(data)`
1290+
- `data` Object | string
1291+
- Returns: void
1292+
1293+
Write `data` onto the streams held by the current instance.
1294+
* `add(dest)`
1295+
- `dest` [StreamEntry](#streamentry) | [DestinationStream](#destinationstream)
1296+
- Returns: [MultiStreamRes](#multistreamres)
1297+
1298+
Add `dest` stream to the array of streams of the current instance.
1299+
* `flushSync()`
1300+
- Returns: `undefined`
1301+
1302+
Call `flushSync` on each stream held by the current instance.
1303+
* `minLevel`
1304+
- number
1305+
1306+
The minimum level amongst all the streams held by the current instance.
1307+
* `streams`
1308+
- Returns: [StreamEntry[]](#streamentry)
1309+
1310+
The array of streams currently held by the current instance.
1311+
* `clone(level)`
1312+
- `level` [Level](#level-1)
1313+
- Returns: [MultiStreamRes](#multistreamres)
1314+
1315+
Returns a cloned object of the current instance but with the the provided `level`.
1316+
1317+
### `StreamEntry`
1318+
Properties:
1319+
1320+
* `stream`
1321+
- DestinationStream
1322+
* `level`
1323+
- Optional: [Level](#level-1)
1324+
1325+
### `DestinationStream`
1326+
Properties:
1327+
1328+
* `write(msg)`
1329+
- `msg` string
1330+
1331+
## Types
1332+
### `Level`
1333+
1334+
* Values: `"fatal"` | `"error"` | `"warn"` | `"info"` | `"debug"` | `"trace"`

lib/multistream.js

+30-12
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ const { levels } = require('./levels')
66
const defaultLevels = Object.create(levels)
77
defaultLevels.silent = Infinity
88

9+
const DEFAULT_INFO_LEVEL = levels.info
10+
911
function multistream (streamsArray, opts) {
1012
let counter = 0
11-
1213
streamsArray = streamsArray || []
1314
opts = opts || { dedupe: false }
1415

@@ -77,22 +78,39 @@ function multistream (streamsArray, opts) {
7778
}
7879

7980
function add (dest) {
81+
if (!dest) {
82+
return res
83+
}
84+
85+
// Check that dest implements either StreamEntry or DestinationStream
86+
const isStream = typeof dest.write === 'function' || dest.stream
87+
const stream_ = dest.write ? dest : dest.stream
88+
// This is necessary to provide a meaningful error message, otherwise it throws somewhere inside write()
89+
if (!isStream) {
90+
throw Error('stream object needs to implement either StreamEntry or DestinationStream interface')
91+
}
92+
8093
const { streams } = this
81-
if (typeof dest.write === 'function') {
82-
return add.call(this, { stream: dest })
83-
} else if (typeof dest.levelVal === 'number') {
84-
return add.call(this, Object.assign({}, dest, { level: dest.levelVal, levelVal: undefined }))
94+
95+
let level
96+
if (typeof dest.levelVal === 'number') {
97+
level = dest.levelVal
8598
} else if (typeof dest.level === 'string') {
86-
return add.call(this, Object.assign({}, dest, { level: levels[dest.level] }))
87-
} else if (typeof dest.level !== 'number') {
88-
// we default level to 'info'
89-
dest = Object.assign({}, dest, { level: 30 })
99+
level = levels[dest.level]
100+
} else if (typeof dest.level === 'number') {
101+
level = dest.level
90102
} else {
91-
dest = Object.assign({}, dest)
103+
level = DEFAULT_INFO_LEVEL
104+
}
105+
106+
const dest_ = {
107+
stream: stream_,
108+
level,
109+
levelVal: undefined,
110+
id: counter++
92111
}
93-
dest.id = counter++
94112

95-
streams.unshift(dest)
113+
streams.unshift(dest_)
96114
streams.sort(compareByLevel)
97115

98116
this.minLevel = streams[0].level

pino.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,10 @@ declare namespace pino {
261261

262262
interface MultiStreamRes {
263263
write: (data: any) => void,
264-
add: (dest: Record<string, any>) => MultiStreamRes,
264+
add: (dest: StreamEntry | DestinationStream) => MultiStreamRes,
265265
flushSync: () => void,
266266
minLevel: number,
267-
streams: ({ stream: DestinationStream, level: number, id: number })[],
267+
streams: StreamEntry[],
268268
clone(level: Level): MultiStreamRes,
269269
}
270270

test/multistream.test.js

+38-1
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ test('no stream', function (t) {
481481
t.end()
482482
})
483483

484-
test('add a stream', function (t) {
484+
test('one stream', function (t) {
485485
let messageCount = 0
486486
const stream = writeStream(function (data, enc, cb) {
487487
messageCount += 1
@@ -497,6 +497,43 @@ test('add a stream', function (t) {
497497
t.end()
498498
})
499499

500+
test('add a stream', function (t) {
501+
let messageCount = 0
502+
const stream = writeStream(function (data, enc, cb) {
503+
messageCount += 1
504+
cb()
505+
})
506+
507+
const log = pino({
508+
level: 'trace'
509+
}, multistream().add(stream))
510+
log.info('info stream')
511+
log.debug('debug stream')
512+
log.fatal('fatal stream')
513+
t.equal(messageCount, 2)
514+
t.end()
515+
})
516+
517+
test('multistream.add throws if not a stream', function (t) {
518+
try {
519+
pino({
520+
level: 'trace'
521+
}, multistream().add({}))
522+
} catch (_) {
523+
t.end()
524+
}
525+
})
526+
527+
test('multistream throws if not a stream', function (t) {
528+
try {
529+
pino({
530+
level: 'trace'
531+
}, multistream({}))
532+
} catch (_) {
533+
t.end()
534+
}
535+
})
536+
500537
test('flushSync', function (t) {
501538
const tmp = join(
502539
os.tmpdir(),

test/types/pino-multistream.test-d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ expectType<pino.MultiStreamRes>(pino.multistream(streams))
2121
expectType<pino.MultiStreamRes>(pino.multistream(streams, {}))
2222
expectType<pino.MultiStreamRes>(pino.multistream(streams, { levels: { 'info': 30 } }))
2323
expectType<pino.MultiStreamRes>(pino.multistream(streams, { dedupe: true }))
24+
expectType<pino.MultiStreamRes>(pino.multistream(streams[0]).add(streams[1]))
2425

2526
expectType<pino.MultiStreamRes>(multistream(process.stdout));

0 commit comments

Comments
 (0)