fsBuildReadStreamText.mjs

import fs from 'fs'
import readline from 'readline'
import fsIsFile from './fsIsFile.mjs'
import evem from './evem.mjs'


/**
 * 使用stream從檔案讀utf8文字
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/fsBuildReadStreamText.test.mjs Github}
 * @memberOf wsemi
 * @param {String} fp 輸入讀取檔案路徑字串
 * @returns {EventEmitter} 回傳EventEmitter,可監聽create、line、close事件,line事件接收讀入各列字串
 * @example
 * need test in nodejs.
 *
 * let test = async () => {
 *
 *     let ms = []
 *
 *     let fdt = './_test_fsBuildReadStreamText'
 *     fsCreateFolder(fdt) //創建臨時任務資料夾
 *
 *     let fn = 't1.txt'
 *     let fp = `${fdt}/${fn}`
 *
 *     fs.writeFileSync(fp, `abc
 * 測試中文
 * def123xyz
 * `, 'utf8')
 *
 *     let ev = fsBuildReadStreamText(fp)
 *     ms.push({ 'create': '' })
 *
 *     ev.on('line', (line) => {
 *         console.log('line', line)
 *         ms.push({ line })
 *     })
 *
 *     let pm = genPm()
 *     ev.on('close', () => {
 *         console.log('close')
 *         pm.resolve()
 *         ms.push({ 'close': '' })
 *     })
 *     await pm
 *
 *     fsDeleteFolder(fdt) //刪除臨時任務資料夾
 *
 *     console.log('ms', ms)
 *     return ms
 * }
 * await test()
 * // ms [
 * //   { create: '' },
 * //   { line: 'abc' },
 * //   { line: '測試中文' },
 * //   { line: 'def123xyz' },
 * //   { close: '' }
 * // ]
 *
 */
function fsBuildReadStreamText(fp) {

    //check
    if (!fsIsFile(fp)) {
        throw new Error(`fp is not a file`)
    }

    //ev
    let ev = evem()

    //stream
    let stream = fs.createReadStream(fp, { encoding: 'utf8' })
    ev.emit('create')

    //rl
    let rl = readline.createInterface({
        input: stream,
        crlfDelay: Infinity, //支援\r\n或\n
    })

    //rl line
    rl.on('line', (line) => {
        // console.log(`line`,line)
        ev.emit('line', line)
    })

    // //rl close
    // rl.on('close', () => {
    //     // console.log('close')
    // })

    //stream close
    stream.on('close', () => {
        //stream close事件才代表檔案可刪除
        ev.emit('close')
    })

    // //stream end
    // stream.on('end', () => {
    //     //stream end事件只是讀寫結束, 不代表檔案可刪除
    // })

    return ev
}


export default fsBuildReadStreamText