UNPKG

@stormking/emere

Version:

a nightmarejs replacement for scraping websites using electron.

71 lines (70 loc) 2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageHost = void 0; exports.init = init; const crypto_1 = require("crypto"); const events_1 = __importDefault(require("events")); class MessageHost extends events_1.default { #_send; #open = new Map(); constructor(proc) { super(); this.#_send = proc.send.bind(proc); proc.on('message', this.onMessage.bind(this)); } onMessage(m) { // console.log('onMessage', m); if ('res' in m) { let wrap = this.#open.get(m.res); this.#open.delete(m.res); if (!wrap) { console.error('response has no promise waiting', m); return; } if (m.error) wrap.reject(new Error(m.error)); else wrap.resolve(m.data); } else { this.emit('request', m, (err, res) => { this.sendResponse(m.id, err, res); }); } } sendResponse(id, err, res) { // console.log('sending response', { id, err, res }); this.#_send({ res: id, error: err, data: res }); } async call(action, params) { let msg = { id: (0, crypto_1.randomBytes)(8).toString('base64'), action, params }; let wrap = { p: null, resolve: null, reject: null }; wrap.p = new Promise((res, rej) => { wrap.resolve = res; wrap.reject = rej; }); this.#open.set(msg.id, wrap); // console.log('sending request', msg); this.#_send(msg); return wrap.p; } } exports.MessageHost = MessageHost; function init(proc) { return new MessageHost(proc); }