You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					76 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					76 lines
				
				1.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const os = require('os')
							 | 
						||
| 
								 | 
							
								const writer = require('flush-write-stream')
							 | 
						||
| 
								 | 
							
								const split = require('split2')
							 | 
						||
| 
								 | 
							
								const { existsSync, statSync } = require('fs')
							 | 
						||
| 
								 | 
							
								const pid = process.pid
							 | 
						||
| 
								 | 
							
								const hostname = os.hostname()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const isWin = process.platform === 'win32'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getPathToNull () {
							 | 
						||
| 
								 | 
							
								  return isWin ? '\\\\.\\NUL' : '/dev/null'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function once (emitter, name) {
							 | 
						||
| 
								 | 
							
								  return new Promise((resolve, reject) => {
							 | 
						||
| 
								 | 
							
								    if (name !== 'error') emitter.once('error', reject)
							 | 
						||
| 
								 | 
							
								    emitter.once(name, (...args) => {
							 | 
						||
| 
								 | 
							
								      emitter.removeListener('error', reject)
							 | 
						||
| 
								 | 
							
								      resolve(...args)
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function sink (func) {
							 | 
						||
| 
								 | 
							
								  const result = split((data) => {
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      return JSON.parse(data)
							 | 
						||
| 
								 | 
							
								    } catch (err) {
							 | 
						||
| 
								 | 
							
								      console.log(err)
							 | 
						||
| 
								 | 
							
								      console.log(data)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  if (func) result.pipe(writer.obj(func))
							 | 
						||
| 
								 | 
							
								  return result
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function check (is, chunk, level, msg) {
							 | 
						||
| 
								 | 
							
								  is(new Date(chunk.time) <= new Date(), true, 'time is greater than Date.now()')
							 | 
						||
| 
								 | 
							
								  delete chunk.time
							 | 
						||
| 
								 | 
							
								  is(chunk.pid, pid)
							 | 
						||
| 
								 | 
							
								  is(chunk.hostname, hostname)
							 | 
						||
| 
								 | 
							
								  is(chunk.level, level)
							 | 
						||
| 
								 | 
							
								  is(chunk.msg, msg)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function sleep (ms) {
							 | 
						||
| 
								 | 
							
								  return new Promise((resolve) => {
							 | 
						||
| 
								 | 
							
								    setTimeout(resolve, ms)
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function watchFileCreated (filename) {
							 | 
						||
| 
								 | 
							
								  return new Promise((resolve, reject) => {
							 | 
						||
| 
								 | 
							
								    const TIMEOUT = 800
							 | 
						||
| 
								 | 
							
								    const INTERVAL = 100
							 | 
						||
| 
								 | 
							
								    const threshold = TIMEOUT / INTERVAL
							 | 
						||
| 
								 | 
							
								    let counter = 0
							 | 
						||
| 
								 | 
							
								    const interval = setInterval(() => {
							 | 
						||
| 
								 | 
							
								      // On some CI runs file is created but not filled
							 | 
						||
| 
								 | 
							
								      if (existsSync(filename) && statSync(filename).size !== 0) {
							 | 
						||
| 
								 | 
							
								        clearInterval(interval)
							 | 
						||
| 
								 | 
							
								        resolve()
							 | 
						||
| 
								 | 
							
								      } else if (counter <= threshold) {
							 | 
						||
| 
								 | 
							
								        counter++
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        clearInterval(interval)
							 | 
						||
| 
								 | 
							
								        reject(new Error(`${filename} was not created.`))
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }, INTERVAL)
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = { getPathToNull, sink, check, once, sleep, watchFileCreated }
							 |