Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript rxjs流式解析器(用于NAT)_Typescript_Rxjs_Nats.io - Fatal编程技术网

Typescript rxjs流式解析器(用于NAT)

Typescript rxjs流式解析器(用于NAT),typescript,rxjs,nats.io,Typescript,Rxjs,Nats.io,亲爱的rxjs stackoverflow专家: 我一直在用rxjs实现一个非常基本的流式解析器。我不确定我在性能或使用方面做的事情是否正确。我正在使用webSocket主题连接到用于NAT的ws-gateway 我正在映射传入流,以便用正则表达式准备操作名和参数。 然后我订阅这个流,将消息推送到另一个名为protocoll$$的主题 protocoll$$主题实现了过滤和订阅PING消息的基本功能,以使用PONG响应keep-alive 然后创建另一个名为messages$$的主题,该主题在协

亲爱的rxjs stackoverflow专家:

我一直在用rxjs实现一个非常基本的流式解析器。我不确定我在性能或使用方面做的事情是否正确。我正在使用webSocket主题连接到用于NAT的ws-gateway

我正在映射传入流,以便用正则表达式准备操作名和参数。 然后我订阅这个流,将消息推送到另一个名为protocoll$$的主题

protocoll$$主题实现了过滤和订阅PING消息的基本功能,以使用PONG响应keep-alive

然后创建另一个名为messages$$的主题,该主题在协议$$主题上过滤“MSG”操作,然后转换它们

进一步在应用程序中,用户可以订阅主题(这反过来会创建一个新的Obserable,订阅消息$$subject并过滤subscrptionId)

我的问题是。我做得对吗?我可以改进吗

从“rxjs”导入{Observable,Subject}
从“rxjs/operators”导入{filter,map}
从“rxjs/webSocket”导入{webSocket,WebSocketSubject}
接口NatsOptions{
url:string
选项:连接选项
}
接口连接选项{
verbose:boolean//false
迂腐的:布尔//假
朗:弦
版本:字符串
}
导出接口协议{
操作:字符串,
args?:字符串
}
导出接口消息{
希德:号码
主题:字符串
答复:字符串
尺码:号码
//TODO:移动编码和模块化
有效载荷:T
}
常量msgPattern=/^(?[^\s]+)\s+(?[^\s]+)\s+(?([^\s\r\n]+)[^\s\r\n]+)?(?\d+)\r\n(?\s+)\r\n/gi
const protocolPattern=/^([^\s]+)(\s+([\s\s]*))?/gi
@注射的({
提供于:“根”,
})
导出类NatsService{
私有nats$:WebSocketSubject
私有订阅:数组=[];
公共协议$$:主题;
公共信息$$:主题;
构造函数(@Inject(“natsOptions”)私有选项:natsOptions){
this.nats$=webSocket({url:options.url,序列化程序:(m)=>m,反序列化程序:(m)=>m})
这个,连接({
学究:错,
冗长:错,
…选项,选项,
朗:“打字稿”,
版本:“0.0.1”
})
}
专用异步连接(选项:ConnectionOptions){
this.protocol$$=新主题()
this.messages$$=新主题();
这个.nats$.pipe(
映射((事件:MessageEvent)=>{
常量匹配:Array=Array.from(event.data.matchAll(protocolPattern))
如果(匹配。长度>0){
常量组:数组=匹配项[0]
常量操作=组[1]
让args
if(组长度){
args=组[3]
}
返回{操作,args}
}
返回{operation:event.data}
})
).订阅(协议=>{
this.protocol$$.next(protocol);
})
此.protocol$$.pipe(
筛选器((x:Protocol)=>x.operation==“PING”)
).subscribe(x=>this.send('PONG'))
此.protocol$$.pipe(
过滤器((p)=>{
返回p.operation==“MSG”
})
).订阅((p)=>{
常量匹配:数组=数组.from(p.args?.matchAll(msgPattern))
如果(匹配。长度>0){
常量组=匹配项[0]
让msg:msg={
主题:组[1],
sid:编号(组[2]),
答复:小组[3],,
大小:数量(组[5]),
//TODO:使编码器可配置并模块化
有效负载:JSON.parse(组[6])
}
this.messages$$.next(msg);
}
})
this.nats$.next(`CONNECT${JSON.stringify(options)}\r\n`)
}
专用发送(命令:字符串){
此.nats$.next(`${command}\r\n`)
}
公共发件人(主题:字符串,组?:字符串){
//检查订阅是否已存在。如果已存在,请重新使用
const sid=this.subscriptions.push(主题);
让受试者$=新可观察((观察者)=>{
此.messages$$.pipe(
过滤器(msg=>msg.sid==sid),
).subscribe(msg=>observer.next(msg))
return()=>{
this.send(`UNSUB${sid}`)
}
})
//我们还不支持团体
this.send(`SUB${subject}${group}${sid}`)
返回主题$
}
}