Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

一个缓冲可以一边写一边根据需要读取特定大小的数据

NotificationsYou must be signed in to change notification settings

langhuihui/oput

Repository files navigation

codecov

该库旨在解决js需要缓存内存块来解决接收不定长度的数据,取出不定长度的数据的问题。例如tcp的粘包问题。

典型需求

接收一个远程请求,不断接收到不定长度的数据,然后根据协议解析到长度字段,然后读取一段长度来解包,此时可能缓存不够,需要等待继续接收数据,如果缓存够了,则读取长度后,需要修改缓存为剩余的数据

用核酸筛查来比喻,陆续有人来排队,需要排满10人为一组进行采样。

安装

$ npm install oput

使用

分成生产端和消费端,生产端负责向OPut中写入数据(TypedArray或者ArrayBuffer)。

importOPutfrom'oput'constoput=newOPut(reader)oput.write(newUint32Array([1,2,3]))

可以在pipeTo中使用

importOPutfrom'oput'constoput=newOPut(reader)readableStream.pipeTo(newWritableStream(oput))

消费端负责从OPut中读取数据。根据实际需要可以选择两种读取模式。

模式一:按字节数读取,返回缓冲中头部N个字节的数据

读取出来的是Uint8Array对象,要及时处理,后续读取出的数据会覆盖前面的数据。

function*reader(){letb=yield5;//读取5个字节console.log(b[0])}

模式二:向生产者提供TypedArray对象,接收数据

可以自行选择是否复用TypedArray对象

function*reader(){letb=newUint8Array(5);yieldb;//填充到b中console.log(b[0])b=newUint32Array(5);yieldb;//填充到b中,又读取了20个字节console.log(b[0])}

模式三:通过异步read方式读取数据

constoput=newOPut();oput.write(newUint32Array([1,2]));oput.write(newUint32Array([1,2]));oput.read(1).then(value=>{expect(value[0]).toBe(1)returnoput.read(4)}).then(value=>{expect(value[3]).toBe(2)})

About

一个缓冲可以一边写一边根据需要读取特定大小的数据

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp