整体分为两部分
1、 js对c++读写消息,_consumerSocket和producerSocket
2、c++对js读写消息,c++收到都是底层都是通过libuv的uv_read_start和uv_write
目录
二、js主动调用c++,通过producerSocket.write
一、js接收c++数据
channel.js 构造函数注册监听器
this._consumerSocket.on('data', (buffer) => {})
//真正的处理有效数据其实在processMessage
processMessage(msg) {
// If a response, retrieve its associated request.
if (msg.id) {
const sent = this.#sents.get(msg.id);
if (!sent) {
logger.error('received response does not match any sent request [id:%s]', msg.id);
return;
}
if (msg.accepted) {
logger.debug('request succeeded [method:%s, id:%s]', sent.method, sent.id);
sent.resolve(msg.data);
}
else if (msg.targetId && msg.event) {
setImmediate(() => this.emit(String(msg.targetId), msg.event, msg.data));
}
上层需要回调response就带msg.id
不带id属于事件通知,最终会调用 this.emit(msg.targetId, msg.event, msg.data); 发送出去
二、js主动调用c++,通过producerSocket.write
async request(method, handlerId, data) {
this.#nextId < 4294967295 ? ++this.#nextId : (this.#nextId = 1);
const id = this.#nextId;
logger.debug('request() [method:%s, id:%s]', method, id);
if (this.#closed) {
throw new errors_1.InvalidStateError('Channel closed');
}
const request = `${id}:${method}:${handlerId}:${JSON.stringify(data)}`;
if (Buffer.byteLength(request) > MESSAGE_MAX_LEN) {
throw new Error('Channel request too big');
}
// This may throw if closed or remote side ended.
this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(request)).buffer));
this.#producerSocket.write(request);
//构建response的callback,添加id,在processMessage进行回调
return new Promise((pResolve, pReject) => {
const sent = {
&nb

本文详细描述了JavaScript和C++之间的通信机制,涉及使用`_consumerSocket`和`producerSocket`进行数据交换,以及如何通过`uv_read_start`和`uv_write`进行底层操作。特别关注了接收和发送过程中的回调机制及事件通知的实现。
1716

被折叠的 条评论
为什么被折叠?



