@stormking/emere
Version:
a nightmarejs replacement for scraping websites using electron.
71 lines (70 loc) • 2 kB
JavaScript
;
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);
}