screen.mjs

import fs from 'fs'
import screenshot from 'screenshot-desktop'
import sharp from 'sharp'


let _initialized = false
let _externalScreenshot = null


/**
 * @param {Object} opt
 * @param {Function} opt.screenshot - async () => Buffer(png), 回傳整個畫面的PNG Buffer
 */
function init(opt = {}) {
    if (typeof opt.screenshot === 'function') {
        _externalScreenshot = opt.screenshot
        _initialized = true
    }
}


async function getScreen() {

    let img

    if (_initialized && _externalScreenshot) {
        //使用外部注入的截圖函數
        img = await _externalScreenshot()
    }
    else {
        //未初始化, 使用內建screenshot-desktop
        img = await screenshot({ format: 'png' })
    }

    //check
    if (!img || img.length === 0) {
        console.log('img', img)
        throw new Error(`can not get the screenshot`)
    }

    return img
}

async function screenFull() {

    //screenshot
    let img = await getScreen()

    return img
}

async function screen(x, y, width, height) {

    //screenshot
    let img = await getScreen()

    //cut
    let buffer = await sharp(img)
        .extract({ left: x, top: y, width, height })
        .toBuffer()

    return buffer
}

async function screenFullSave(fp) {

    //screenshot
    let img = await getScreen()

    //writeFileSync
    fs.writeFileSync(fp, img)

    return img
}

async function screenSave(x, y, width, height, fp) {

    //screenshot
    let img = await getScreen()

    //cut
    let buffer = await sharp(img)
        .extract({ left: x, top: y, width, height })
        .toBuffer()

    //writeFileSync
    fs.writeFileSync(fp, buffer)

    return buffer
}

let obj = {
    init,
    screenFull,
    screen,
    screenFullSave,
    screenSave,
}


export default obj