Node.js 在zeromq.js中使用ZMQ_XPUB_手册

Node.js 在zeromq.js中使用ZMQ_XPUB_手册,node.js,typescript,zeromq,Node.js,Typescript,Zeromq,我正在尝试使用ZeroMQ实现一个发布/订阅代理,其中可以限制客户端订阅不允许订阅的前缀。我找到了一个尝试使用ZMQ\u XPUB\u手册选项实现类似功能的。使用,可以设置此选项: import * as zmq from "zeromq"; // ... const socket = new zmq.XPublisher({ manual: true }); 设置此选项后,我可以通过在此套接字上调用.receive()来接收订阅消息: const [msg] = awai

我正在尝试使用ZeroMQ实现一个发布/订阅代理,其中可以限制客户端订阅不允许订阅的前缀。我找到了一个尝试使用
ZMQ\u XPUB\u手册
选项实现类似功能的。使用,可以设置此选项:

import * as zmq from "zeromq";
// ...
const socket = new zmq.XPublisher({ manual: true });
设置此选项后,我可以通过在此套接字上调用
.receive()
来接收订阅消息:

const [msg] = await socket.receive();
但是我不知道如何接受这个订阅。通常这是通过使用
ZMQ\u SUBSCRIBE
调用
setSockOpt
来完成的,但我不知道如何使用
zeromq.js
来完成

有没有一种方法可以使用
zeromq.js
调用
setSockOpt
,或者有其他方法可以接受订阅

编辑 我尝试了user3666197的建议,直接调用
setSockOpt
,但我不知道该怎么做。我没有这样做,而是再次查看了资料来源,发现: 似乎
setSockOpt
作为
Socket
类的受保护方法暴露在TypeScript端。为了尝试这一点,我创建了自己的类,该类继承XPublisher并公开了一条
acceptSubscription
消息:

class CustomPublisher extends zmq.XPublisher {
  constructor(options?: zmq.SocketOptions<zmq.XPublisher>) {
    super(options);
  }

  public acceptSubscription(subscription: string | null): void {
    // ZMQ_SUBSCRIBE has a value of 6
    // reference:
    // https://github.com/zeromq/libzmq/blob/master/include/zmq.h#L310
    this.setStringOption(6, subscription);
  }
}
class CustomPublisher扩展了zmq.XPublisher{
构造函数(选项?:zmq.SocketOptions){
超级(期权);
}
公共acceptSubscription(订阅:字符串| null):无效{
//ZMQ_SUBSCRIBE的值为6
//参考:
// https://github.com/zeromq/libzmq/blob/master/include/zmq.h#L310
本.setStringOption(6,认购);
}
}
这很有魅力!但是不要忘记去掉订阅消息的第一个字节,否则您的客户端将不会收到任何消息,因为前缀不匹配

Q:“有没有办法用
zeromq.js
调用
setSockOpt()
,或者有没有其他办法接受订阅?”

所以,让我首先提到Somdoron,出于怀疑&多年来一直是ZeroMQ工具的大师

接下来是问题。在我看来,GitHub源代码(我能够查看atm)允许
ZMQ\u XPUB
-Socket原型处理本机API
ZMQ\u XPUB\u MANUAL
设置(重新修饰为
MANUAL
-property,一种惯用的转换),但没有提供任何方法(到目前为止对我来说是可见的)要实际允许用户满足本机API显式协议:

ZMQ\u XPUB\u手动
:将订阅处理更改为手动


使用手动模式时,订阅请求不会添加到订阅列表中。要添加订阅,用户需要在
XPUB
socket上使用
ZMQ\u SUBSCRIBE
调用
setsockopt()

/\uuuuuuuu来自ZeroMQ native API v.4.3.2文档__/

尝试盲调用继承的
套接字可能会证明我错了,但是如果成功,它可能是一种将
{ZMQ_SUBSCRIBE | ZMQ_UNSUBSCRIBE}
订阅管理步骤注入当前已切换到
ZMQ_XPUB_手动模式的
XPUB
-实例的方法

请测试它,如果它无法通过这个超类继承方法工作,最短的补救办法就是直接向
zeromq.js
维护人员声明冲突/概念缺陷(这可能是一个W.I.p.项目,在他们实际的v6+重构积压中更深入,所以我对这两种情况都祈祷)