import {Base, Constructable, Mixin} from "../../../generic/util/Common.js";
import {Channel, Envelop, EnvelopId, Message} from "../../../generic/channel/Types.js";
import {ChannelEndPoint} from "../../../generic/channel/ChannelEndPoint.js";
import {ChildProcess} from "child_process";
import {NodeJsLogger} from "../../util/role/NodeJsLogger.js";


export const ParentEndPoint = class extends ChannelEndPoint(NodeJsLogger(Base)) {
    childProcess        : ChildProcess

    messageListener     : (...args) => any


    doConnect (channel : Channel) {
        const childProcess  = this.childProcess = channel

        childProcess.addListener('message', this.messageListener = this.onRawChannelMessage.bind(this))

        childProcess.on('exit', () => {
            this.debug('NodeJS worker process exit')

            this.doDisconnect()
        });

        return Promise.resolve()
    }


    doDisconnect () {
        this.messageListener && this.childProcess.removeListener('message', this.messageListener)
    }


    sendMessage (message : Message) {
        this.childProcess.send(message)
    }


    messageToEnvelop (message : Message) : Envelop | undefined {
        return message as Envelop
    }


    envelopToMessage (envelop : Envelop) : Message {
        return envelop as Message
    }
}
