Socket
Socket
Sign inDemoInstall

peek-readable

Package Overview
Dependencies
Maintainers
1
Versions
22
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

peek-readable - npm Package Compare versions

Comparing version 5.0.0-alpha.4 to 5.0.0-alpha.5

lib/Deferred.d.ts

0

lib/EndOfFileStream.d.ts

@@ -0,0 +0,0 @@ export declare const defaultMessages = "End-Of-Stream";

@@ -0,0 +0,0 @@ export const defaultMessages = 'End-Of-Stream';

43

lib/index.d.ts

@@ -1,43 +0,2 @@

/// <reference types="node" />
import stream from 'stream';
export { EndOfStreamError } from './EndOfFileStream.js';
export declare class StreamReader {
private s;
/**
* Deferred read request
*/
private request;
private endOfStream;
/**
* Store peeked data
* @type {Array}
*/
private peekQueue;
constructor(s: stream.Readable);
/**
* Read ahead (peek) from stream. Subsequent read or peeks will return the same data
* @param uint8Array - Uint8Array (or Buffer) to store data read from stream in
* @param offset - Offset target
* @param length - Number of bytes to read
* @returns Number of bytes peeked
*/
peek(uint8Array: Uint8Array, offset: number, length: number): Promise<number>;
/**
* Read chunk from stream
* @param buffer - Target Uint8Array (or Buffer) to store data read from stream in
* @param offset - Offset target
* @param length - Number of bytes to read
* @returns Number of bytes read
*/
read(buffer: Uint8Array, offset: number, length: number): Promise<number>;
/**
* Read chunk from stream
* @param buffer Target Uint8Array (or Buffer) to store data read from stream in
* @param offset Offset target
* @param length Number of bytes to read
* @returns Number of bytes read
*/
private _read;
private tryRead;
private reject;
}
export { StreamReader } from './StreamReader.js';

@@ -1,137 +0,2 @@

import { EndOfStreamError } from './EndOfFileStream.js';
export { EndOfStreamError } from './EndOfFileStream.js';
class Deferred {
constructor() {
this.resolve = () => null;
this.reject = () => null;
this.promise = new Promise((resolve, reject) => {
this.reject = reject;
this.resolve = resolve;
});
}
}
const maxStreamReadSize = 1 * 1024 * 1024; // Maximum request length on read-stream operation
export class StreamReader {
constructor(s) {
this.s = s;
/**
* Deferred read request
*/
this.request = null;
this.endOfStream = false;
/**
* Store peeked data
* @type {Array}
*/
this.peekQueue = [];
if (!s.read || !s.once) {
throw new Error('Expected an instance of stream.Readable');
}
this.s.once('end', () => this.reject(new EndOfStreamError()));
this.s.once('error', err => this.reject(err));
this.s.once('close', () => this.reject(new Error('Stream closed')));
}
/**
* Read ahead (peek) from stream. Subsequent read or peeks will return the same data
* @param uint8Array - Uint8Array (or Buffer) to store data read from stream in
* @param offset - Offset target
* @param length - Number of bytes to read
* @returns Number of bytes peeked
*/
async peek(uint8Array, offset, length) {
const bytesRead = await this.read(uint8Array, offset, length);
this.peekQueue.push(uint8Array.subarray(offset, offset + bytesRead)); // Put read data back to peek buffer
return bytesRead;
}
/**
* Read chunk from stream
* @param buffer - Target Uint8Array (or Buffer) to store data read from stream in
* @param offset - Offset target
* @param length - Number of bytes to read
* @returns Number of bytes read
*/
async read(buffer, offset, length) {
if (length === 0) {
return 0;
}
if (this.peekQueue.length === 0 && this.endOfStream) {
throw new EndOfStreamError();
}
let remaining = length;
let bytesRead = 0;
// consume peeked data first
while (this.peekQueue.length > 0 && remaining > 0) {
const peekData = this.peekQueue.pop(); // Front of queue
if (!peekData)
throw new Error('peekData should be defined');
const lenCopy = Math.min(peekData.length, remaining);
buffer.set(peekData.subarray(0, lenCopy), offset + bytesRead);
bytesRead += lenCopy;
remaining -= lenCopy;
if (lenCopy < peekData.length) {
// remainder back to queue
this.peekQueue.push(peekData.subarray(lenCopy));
}
}
// continue reading from stream if required
while (remaining > 0 && !this.endOfStream) {
const reqLen = Math.min(remaining, maxStreamReadSize);
const chunkLen = await this._read(buffer, offset + bytesRead, reqLen);
bytesRead += chunkLen;
if (chunkLen < reqLen)
break;
remaining -= chunkLen;
}
return bytesRead;
}
/**
* Read chunk from stream
* @param buffer Target Uint8Array (or Buffer) to store data read from stream in
* @param offset Offset target
* @param length Number of bytes to read
* @returns Number of bytes read
*/
async _read(buffer, offset, length) {
if (this.request)
throw new Error('Concurrent read operation?');
const readBuffer = this.s.read(length);
if (readBuffer) {
buffer.set(readBuffer, offset);
return readBuffer.length;
}
else {
this.request = {
buffer,
offset,
length,
deferred: new Deferred()
};
this.s.once('readable', () => {
this.tryRead();
});
return this.request.deferred.promise;
}
}
tryRead() {
if (!this.request)
throw new Error('this.request should be defined');
const readBuffer = this.s.read(this.request.length);
if (readBuffer) {
this.request.buffer.set(readBuffer, this.request.offset);
this.request.deferred.resolve(readBuffer.length);
this.request = null;
}
else {
this.s.once('readable', () => {
this.tryRead();
});
}
}
reject(err) {
this.endOfStream = true;
if (this.request) {
this.request.deferred.reject(err);
this.request = null;
}
}
}
export { StreamReader } from './StreamReader.js';
{
"name": "peek-readable",
"version": "5.0.0-alpha.4",
"version": "5.0.0-alpha.5",
"description": "Read and peek from a readable stream",

@@ -35,3 +35,2 @@ "author": {

"license": "MIT",
"main": "lib/index.js",
"type": "module",

@@ -48,7 +47,7 @@ "exports": "./lib/index.js",

"devDependencies": {
"@types/chai": "^4.2.21",
"@types/chai": "^4.3.0",
"@types/mocha": "^9.0.0",
"@types/node": "^16.4.10",
"@typescript-eslint/eslint-plugin": "^4.28.5",
"@typescript-eslint/parser": "^4.28.5",
"@types/node": "^17.0.0",
"@typescript-eslint/eslint-plugin": "^4.31.0",
"@typescript-eslint/parser": "^4.31.0",
"add": "^2.0.6",

@@ -60,7 +59,7 @@ "c8": "^7.8.0",

"eslint": "^7.32.0",
"mocha": "^9.0.3",
"remark-cli": "^9.0.0",
"remark-preset-lint-recommended": "^5.0.0",
"mocha": "^9.1.3",
"remark-cli": "^10.0.0",
"remark-preset-lint-recommended": "^6.1.2",
"ts-node": "^10.1.0",
"typescript": "^4.3.5"
"typescript": "^4.4.2"
},

@@ -67,0 +66,0 @@ "keywords": [

@@ -5,3 +5,3 @@ ![Node.js CI](https://github.com/Borewit/peek-readable/workflows/Node.js%20CI/badge.svg)

[![Coverage Status](https://coveralls.io/repos/github/Borewit/peek-readable/badge.svg?branch=master)](https://coveralls.io/github/Borewit/peek-readable?branch=master)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/8a89b90858734a6da07570eaf2e89849)](https://www.codacy.com/app/Borewit/peek-readable?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=Borewit/peek-readable&amp;utm_campaign=Badge_Grade)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/d4b511481b3a4634b6ca5c0724407eb9)](https://www.codacy.com/gh/Borewit/peek-readable/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=Borewit/peek-readable&amp;utm_campaign=Badge_Grade)
[![Total alerts](https://img.shields.io/lgtm/alerts/g/Borewit/peek-readable.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Borewit/peek-readable/alerts/)

@@ -8,0 +8,0 @@ [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Borewit/peek-readable.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Borewit/peek-readable/context:javascript)

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc