strtok3 6.1.2 → 6.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/lib/AbstractTokenizer.d.ts +10 -10
- package/lib/AbstractTokenizer.js +28 -8
- package/lib/BufferTokenizer.d.ts +10 -21
- package/lib/BufferTokenizer.js +18 -77
- package/lib/FileTokenizer.d.ts +2 -7
- package/lib/FileTokenizer.js +5 -42
- package/lib/FsPromise.d.ts +2 -2
- package/lib/ReadStreamTokenizer.d.ts +3 -3
- package/lib/ReadStreamTokenizer.js +24 -38
- package/lib/core.d.ts +2 -2
- package/lib/core.js +3 -3
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ The `strtok3` contains a few methods to turn different input into a [*tokenizer*
|
|
|
20
20
|
It can read from:
|
|
21
21
|
* A file (taking a file path as an input)
|
|
22
22
|
* A Node.js [stream](https://nodejs.org/api/stream.html).
|
|
23
|
-
* A [Buffer](https://nodejs.org/api/buffer.html)
|
|
23
|
+
* A [Buffer](https://nodejs.org/api/buffer.html) or [Uint8Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array)
|
|
24
24
|
* HTTP chunked transfer provided by [@tokenizer/http](https://github.com/Borewit/tokenizer-http).
|
|
25
25
|
* Chunked [Amazon S3](https://aws.amazon.com/s3) access provided by [@tokenizer/s3](https://github.com/Borewit/tokenizer-s3).
|
|
26
26
|
|
|
@@ -35,7 +35,8 @@ npm install strtok3
|
|
|
35
35
|
Use one of the methods to instantiate an [*abstract tokenizer*](#tokenizer):
|
|
36
36
|
* [strtok3.fromFile](#method-strtok3fromfile)
|
|
37
37
|
* [strtok3.fromStream](#method-strtok3fromstream)
|
|
38
|
-
* [strtok3.fromBuffer](#method-
|
|
38
|
+
* [strtok3.fromBuffer](#method-strtok3fromBuffer)
|
|
39
|
+
* [strtok3.fromUint8Array](#method-strtok3fromUint8Array)
|
|
39
40
|
|
|
40
41
|
### strtok3 methods
|
|
41
42
|
|
|
@@ -92,10 +93,10 @@ strtok3.fromStream(stream).then(tokenizer => {
|
|
|
92
93
|
|
|
93
94
|
#### Method `strtok3.fromBuffer()`
|
|
94
95
|
|
|
95
|
-
| Parameter
|
|
96
|
-
|
|
97
|
-
|
|
|
98
|
-
| fileInfo
|
|
96
|
+
| Parameter | Optional | Type | Description |
|
|
97
|
+
|------------|----------|--------------------------------------------------|----------------------------------------|
|
|
98
|
+
| uint8Array | no | [Uint8Array](https://nodejs.org/api/buffer.html) | Uint8Array or Buffer to read from |
|
|
99
|
+
| fileInfo | yes | [IFileInfo](#IFileInfo) | Provide file information |
|
|
99
100
|
|
|
100
101
|
Returns a [*tokenizer*](#tokenizer) which can be used to parse the provided buffer.
|
|
101
102
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import { ITokenizer, IFileInfo, IReadChunkOptions } from './types';
|
|
3
2
|
import { IGetToken, IToken } from '@tokenizer/token';
|
|
4
3
|
/**
|
|
@@ -18,28 +17,28 @@ export declare abstract class AbstractTokenizer implements ITokenizer {
|
|
|
18
17
|
* @param options - Additional read options
|
|
19
18
|
* @returns Promise with number of bytes read
|
|
20
19
|
*/
|
|
21
|
-
abstract readBuffer(buffer:
|
|
20
|
+
abstract readBuffer(buffer: Uint8Array, options?: IReadChunkOptions): Promise<number>;
|
|
22
21
|
/**
|
|
23
22
|
* Peek (read ahead) buffer from tokenizer
|
|
24
|
-
* @param
|
|
23
|
+
* @param uint8Array- Target buffer to fill with data peek from the tokenizer-stream
|
|
25
24
|
* @param options - Peek behaviour options
|
|
26
25
|
* @returns Promise with number of bytes read
|
|
27
26
|
*/
|
|
28
|
-
abstract peekBuffer(
|
|
27
|
+
abstract peekBuffer(uint8Array: Uint8Array, options?: IReadChunkOptions): Promise<number>;
|
|
29
28
|
/**
|
|
30
29
|
* Read a token from the tokenizer-stream
|
|
31
30
|
* @param token - The token to read
|
|
32
31
|
* @param position - If provided, the desired position in the tokenizer-stream
|
|
33
32
|
* @returns Promise with token data
|
|
34
33
|
*/
|
|
35
|
-
readToken<
|
|
34
|
+
readToken<Value>(token: IGetToken<Value>, position?: number): Promise<Value>;
|
|
36
35
|
/**
|
|
37
36
|
* Peek a token from the tokenizer-stream.
|
|
38
37
|
* @param token - Token to peek from the tokenizer-stream.
|
|
39
38
|
* @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.
|
|
40
39
|
* @returns Promise with token data
|
|
41
40
|
*/
|
|
42
|
-
peekToken<
|
|
41
|
+
peekToken<Value>(token: IGetToken<Value>, position?: number): Promise<Value>;
|
|
43
42
|
/**
|
|
44
43
|
* Read a numeric token from the stream
|
|
45
44
|
* @param token - Numeric token
|
|
@@ -53,10 +52,11 @@ export declare abstract class AbstractTokenizer implements ITokenizer {
|
|
|
53
52
|
*/
|
|
54
53
|
peekNumber(token: IToken<number>): Promise<number>;
|
|
55
54
|
/**
|
|
56
|
-
*
|
|
57
|
-
* @param length - Number of bytes to
|
|
58
|
-
* @return
|
|
55
|
+
* Ignore number of bytes, advances the pointer in under tokenizer-stream.
|
|
56
|
+
* @param length - Number of bytes to ignore
|
|
57
|
+
* @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available
|
|
59
58
|
*/
|
|
60
|
-
|
|
59
|
+
ignore(length: number): Promise<number>;
|
|
61
60
|
close(): Promise<void>;
|
|
61
|
+
protected normalizeOptions(uint8Array: Uint8Array, options?: IReadChunkOptions): IReadChunkOptions;
|
|
62
62
|
}
|
package/lib/AbstractTokenizer.js
CHANGED
|
@@ -11,7 +11,7 @@ class AbstractTokenizer {
|
|
|
11
11
|
* Tokenizer-stream position
|
|
12
12
|
*/
|
|
13
13
|
this.position = 0;
|
|
14
|
-
this.numBuffer =
|
|
14
|
+
this.numBuffer = new Uint8Array(8);
|
|
15
15
|
this.fileInfo = fileInfo ? fileInfo : {};
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
@@ -20,12 +20,12 @@ class AbstractTokenizer {
|
|
|
20
20
|
* @param position - If provided, the desired position in the tokenizer-stream
|
|
21
21
|
* @returns Promise with token data
|
|
22
22
|
*/
|
|
23
|
-
async readToken(token, position) {
|
|
24
|
-
const
|
|
25
|
-
const len = await this.readBuffer(
|
|
23
|
+
async readToken(token, position = this.position) {
|
|
24
|
+
const uint8Array = Buffer.alloc(token.len);
|
|
25
|
+
const len = await this.readBuffer(uint8Array, { position });
|
|
26
26
|
if (len < token.len)
|
|
27
27
|
throw new peek_readable_1.EndOfStreamError();
|
|
28
|
-
return token.get(
|
|
28
|
+
return token.get(uint8Array, 0);
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Peek a token from the tokenizer-stream.
|
|
@@ -34,11 +34,11 @@ class AbstractTokenizer {
|
|
|
34
34
|
* @returns Promise with token data
|
|
35
35
|
*/
|
|
36
36
|
async peekToken(token, position = this.position) {
|
|
37
|
-
const
|
|
38
|
-
const len = await this.peekBuffer(
|
|
37
|
+
const uint8Array = Buffer.alloc(token.len);
|
|
38
|
+
const len = await this.peekBuffer(uint8Array, { position });
|
|
39
39
|
if (len < token.len)
|
|
40
40
|
throw new peek_readable_1.EndOfStreamError();
|
|
41
|
-
return token.get(
|
|
41
|
+
return token.get(uint8Array, 0);
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
44
|
* Read a numeric token from the stream
|
|
@@ -62,8 +62,28 @@ class AbstractTokenizer {
|
|
|
62
62
|
throw new peek_readable_1.EndOfStreamError();
|
|
63
63
|
return token.get(this.numBuffer, 0);
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Ignore number of bytes, advances the pointer in under tokenizer-stream.
|
|
67
|
+
* @param length - Number of bytes to ignore
|
|
68
|
+
* @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available
|
|
69
|
+
*/
|
|
70
|
+
async ignore(length) {
|
|
71
|
+
const bytesLeft = this.fileInfo.size - this.position;
|
|
72
|
+
if (length <= bytesLeft) {
|
|
73
|
+
this.position += length;
|
|
74
|
+
return length;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.position += bytesLeft;
|
|
78
|
+
return bytesLeft;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
65
81
|
async close() {
|
|
66
82
|
// empty
|
|
67
83
|
}
|
|
84
|
+
normalizeOptions(uint8Array, options) {
|
|
85
|
+
options = Object.assign({ offset: 0, length: uint8Array.length - ((options && options.offset) ? options.offset : 0), position: this.position }, options);
|
|
86
|
+
return options;
|
|
87
|
+
}
|
|
68
88
|
}
|
|
69
89
|
exports.AbstractTokenizer = AbstractTokenizer;
|
package/lib/BufferTokenizer.d.ts
CHANGED
|
@@ -1,37 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
private buffer;
|
|
6
|
-
fileInfo: IFileInfo;
|
|
7
|
-
position: number;
|
|
1
|
+
import { IFileInfo, IReadChunkOptions } from './types';
|
|
2
|
+
import { AbstractTokenizer } from './AbstractTokenizer';
|
|
3
|
+
export declare class BufferTokenizer extends AbstractTokenizer {
|
|
4
|
+
private uint8Array;
|
|
8
5
|
/**
|
|
9
6
|
* Construct BufferTokenizer
|
|
10
|
-
* @param
|
|
7
|
+
* @param uint8Array - Uint8Array to tokenize
|
|
11
8
|
* @param fileInfo - Pass additional file information to the tokenizer
|
|
12
9
|
*/
|
|
13
|
-
constructor(
|
|
10
|
+
constructor(uint8Array: Uint8Array, fileInfo?: IFileInfo);
|
|
14
11
|
/**
|
|
15
12
|
* Read buffer from tokenizer
|
|
16
|
-
* @param
|
|
13
|
+
* @param uint8Array - Uint8Array to tokenize
|
|
17
14
|
* @param options - Read behaviour options
|
|
18
15
|
* @returns {Promise<number>}
|
|
19
16
|
*/
|
|
20
|
-
readBuffer(
|
|
17
|
+
readBuffer(uint8Array: Uint8Array, options?: IReadChunkOptions): Promise<number>;
|
|
21
18
|
/**
|
|
22
19
|
* Peek (read ahead) buffer from tokenizer
|
|
23
|
-
* @param
|
|
20
|
+
* @param uint8Array
|
|
24
21
|
* @param options - Read behaviour options
|
|
25
22
|
* @returns {Promise<number>}
|
|
26
23
|
*/
|
|
27
|
-
peekBuffer(
|
|
28
|
-
readToken<T>(token: IGetToken<T>, position?: number): Promise<T>;
|
|
29
|
-
peekToken<T>(token: IGetToken<T>, position?: number): Promise<T>;
|
|
30
|
-
readNumber(token: IToken<number>): Promise<number>;
|
|
31
|
-
peekNumber(token: IToken<number>): Promise<number>;
|
|
32
|
-
/**
|
|
33
|
-
* @return actual number of bytes ignored
|
|
34
|
-
*/
|
|
35
|
-
ignore(length: number): Promise<number>;
|
|
24
|
+
peekBuffer(uint8Array: Uint8Array, options?: IReadChunkOptions): Promise<number>;
|
|
36
25
|
close(): Promise<void>;
|
|
37
26
|
}
|
package/lib/BufferTokenizer.js
CHANGED
|
@@ -2,111 +2,52 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BufferTokenizer = void 0;
|
|
4
4
|
const peek_readable_1 = require("peek-readable");
|
|
5
|
-
|
|
5
|
+
const AbstractTokenizer_1 = require("./AbstractTokenizer");
|
|
6
|
+
class BufferTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
|
|
6
7
|
/**
|
|
7
8
|
* Construct BufferTokenizer
|
|
8
|
-
* @param
|
|
9
|
+
* @param uint8Array - Uint8Array to tokenize
|
|
9
10
|
* @param fileInfo - Pass additional file information to the tokenizer
|
|
10
11
|
*/
|
|
11
|
-
constructor(
|
|
12
|
-
|
|
13
|
-
this.
|
|
14
|
-
this.fileInfo = fileInfo ? fileInfo :
|
|
15
|
-
this.fileInfo.size = this.fileInfo.size ? this.fileInfo.size : buffer.length;
|
|
12
|
+
constructor(uint8Array, fileInfo) {
|
|
13
|
+
super(fileInfo);
|
|
14
|
+
this.uint8Array = uint8Array;
|
|
15
|
+
this.fileInfo.size = this.fileInfo.size ? this.fileInfo.size : uint8Array.length;
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* Read buffer from tokenizer
|
|
19
|
-
* @param
|
|
19
|
+
* @param uint8Array - Uint8Array to tokenize
|
|
20
20
|
* @param options - Read behaviour options
|
|
21
21
|
* @returns {Promise<number>}
|
|
22
22
|
*/
|
|
23
|
-
async readBuffer(
|
|
23
|
+
async readBuffer(uint8Array, options) {
|
|
24
24
|
if (options && options.position) {
|
|
25
25
|
if (options.position < this.position) {
|
|
26
26
|
throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
|
|
27
27
|
}
|
|
28
28
|
this.position = options.position;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
30
|
+
const bytesRead = await this.peekBuffer(uint8Array, options);
|
|
31
|
+
this.position += bytesRead;
|
|
32
|
+
return bytesRead;
|
|
34
33
|
}
|
|
35
34
|
/**
|
|
36
35
|
* Peek (read ahead) buffer from tokenizer
|
|
37
|
-
* @param
|
|
36
|
+
* @param uint8Array
|
|
38
37
|
* @param options - Read behaviour options
|
|
39
38
|
* @returns {Promise<number>}
|
|
40
39
|
*/
|
|
41
|
-
async peekBuffer(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (options) {
|
|
46
|
-
if (options.position) {
|
|
47
|
-
if (options.position < this.position) {
|
|
48
|
-
throw new Error('`options.position` can be less than `tokenizer.position`');
|
|
49
|
-
}
|
|
50
|
-
position = options.position;
|
|
51
|
-
}
|
|
52
|
-
if (Number.isInteger(options.length)) {
|
|
53
|
-
length = options.length;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
length -= options.offset || 0;
|
|
57
|
-
}
|
|
58
|
-
if (options.offset) {
|
|
59
|
-
offset = options.offset;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (length === 0) {
|
|
63
|
-
return Promise.resolve(0);
|
|
64
|
-
}
|
|
65
|
-
position = position || this.position;
|
|
66
|
-
if (!length) {
|
|
67
|
-
length = buffer.length;
|
|
68
|
-
}
|
|
69
|
-
const bytes2read = Math.min(this.buffer.length - position, length);
|
|
70
|
-
if ((!options || !options.mayBeLess) && bytes2read < length) {
|
|
40
|
+
async peekBuffer(uint8Array, options) {
|
|
41
|
+
options = this.normalizeOptions(uint8Array, options);
|
|
42
|
+
const bytes2read = Math.min(this.uint8Array.length - options.position, options.length);
|
|
43
|
+
if ((!options.mayBeLess) && bytes2read < options.length) {
|
|
71
44
|
throw new peek_readable_1.EndOfStreamError();
|
|
72
45
|
}
|
|
73
46
|
else {
|
|
74
|
-
this.
|
|
47
|
+
uint8Array.set(this.uint8Array.subarray(options.position, options.position + bytes2read), options.offset);
|
|
75
48
|
return bytes2read;
|
|
76
49
|
}
|
|
77
50
|
}
|
|
78
|
-
async readToken(token, position) {
|
|
79
|
-
this.position = position || this.position;
|
|
80
|
-
try {
|
|
81
|
-
const tv = this.peekToken(token, this.position);
|
|
82
|
-
this.position += token.len;
|
|
83
|
-
return tv;
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
this.position += this.buffer.length - position;
|
|
87
|
-
throw err;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
async peekToken(token, position = this.position) {
|
|
91
|
-
if (this.buffer.length - position < token.len) {
|
|
92
|
-
throw new peek_readable_1.EndOfStreamError();
|
|
93
|
-
}
|
|
94
|
-
return token.get(this.buffer, position);
|
|
95
|
-
}
|
|
96
|
-
async readNumber(token) {
|
|
97
|
-
return this.readToken(token);
|
|
98
|
-
}
|
|
99
|
-
async peekNumber(token) {
|
|
100
|
-
return this.peekToken(token);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* @return actual number of bytes ignored
|
|
104
|
-
*/
|
|
105
|
-
async ignore(length) {
|
|
106
|
-
const bytesIgnored = Math.min(this.buffer.length - this.position, length);
|
|
107
|
-
this.position += bytesIgnored;
|
|
108
|
-
return bytesIgnored;
|
|
109
|
-
}
|
|
110
51
|
async close() {
|
|
111
52
|
// empty
|
|
112
53
|
}
|
package/lib/FileTokenizer.d.ts
CHANGED
|
@@ -13,16 +13,11 @@ export declare class FileTokenizer extends AbstractTokenizer {
|
|
|
13
13
|
readBuffer(buffer: Buffer, options?: IReadChunkOptions): Promise<number>;
|
|
14
14
|
/**
|
|
15
15
|
* Peek buffer from file
|
|
16
|
-
* @param
|
|
16
|
+
* @param uint8Array - Uint8Array (or Buffer) to write data to
|
|
17
17
|
* @param options - Read behaviour options
|
|
18
18
|
* @returns Promise number of bytes read
|
|
19
19
|
*/
|
|
20
|
-
peekBuffer(
|
|
21
|
-
/**
|
|
22
|
-
* @param length - Number of bytes to ignore
|
|
23
|
-
* @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available
|
|
24
|
-
*/
|
|
25
|
-
ignore(length: number): Promise<number>;
|
|
20
|
+
peekBuffer(uint8Array: Uint8Array, options?: IReadChunkOptions): Promise<number>;
|
|
26
21
|
close(): Promise<void>;
|
|
27
22
|
}
|
|
28
23
|
export declare function fromFile(sourceFilePath: string): Promise<FileTokenizer>;
|
package/lib/FileTokenizer.js
CHANGED
|
@@ -47,55 +47,18 @@ class FileTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
|
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* Peek buffer from file
|
|
50
|
-
* @param
|
|
50
|
+
* @param uint8Array - Uint8Array (or Buffer) to write data to
|
|
51
51
|
* @param options - Read behaviour options
|
|
52
52
|
* @returns Promise number of bytes read
|
|
53
53
|
*/
|
|
54
|
-
async peekBuffer(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (options) {
|
|
59
|
-
if (options.position) {
|
|
60
|
-
if (options.position < this.position) {
|
|
61
|
-
throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
|
|
62
|
-
}
|
|
63
|
-
position = options.position;
|
|
64
|
-
}
|
|
65
|
-
if (Number.isInteger(options.length)) {
|
|
66
|
-
length = options.length;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
length -= options.offset || 0;
|
|
70
|
-
}
|
|
71
|
-
if (options.offset) {
|
|
72
|
-
offset = options.offset;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (length === 0) {
|
|
76
|
-
return Promise.resolve(0);
|
|
77
|
-
}
|
|
78
|
-
const res = await fs.read(this.fd, buffer, offset, length, position);
|
|
79
|
-
if ((!options || !options.mayBeLess) && res.bytesRead < length) {
|
|
54
|
+
async peekBuffer(uint8Array, options) {
|
|
55
|
+
options = this.normalizeOptions(uint8Array, options);
|
|
56
|
+
const res = await fs.read(this.fd, uint8Array, options.offset, options.length, options.position);
|
|
57
|
+
if ((!options.mayBeLess) && res.bytesRead < options.length) {
|
|
80
58
|
throw new peek_readable_1.EndOfStreamError();
|
|
81
59
|
}
|
|
82
60
|
return res.bytesRead;
|
|
83
61
|
}
|
|
84
|
-
/**
|
|
85
|
-
* @param length - Number of bytes to ignore
|
|
86
|
-
* @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available
|
|
87
|
-
*/
|
|
88
|
-
async ignore(length) {
|
|
89
|
-
const bytesLeft = this.fileInfo.size - this.position;
|
|
90
|
-
if (length <= bytesLeft) {
|
|
91
|
-
this.position += length;
|
|
92
|
-
return length;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this.position += bytesLeft;
|
|
96
|
-
return bytesLeft;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
62
|
async close() {
|
|
100
63
|
return fs.close(this.fd);
|
|
101
64
|
}
|
package/lib/FsPromise.d.ts
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
export interface IReadResult {
|
|
7
7
|
bytesRead: number;
|
|
8
|
-
buffer:
|
|
8
|
+
buffer: Uint8Array;
|
|
9
9
|
}
|
|
10
10
|
export declare const pathExists: typeof fs.existsSync;
|
|
11
11
|
export declare const createReadStream: typeof fs.createReadStream;
|
|
12
12
|
export declare function stat(path: fs.PathLike): Promise<fs.Stats>;
|
|
13
13
|
export declare function close(fd: number): Promise<void>;
|
|
14
14
|
export declare function open(path: fs.PathLike, mode?: string): Promise<number>;
|
|
15
|
-
export declare function read(fd: number, buffer:
|
|
15
|
+
export declare function read(fd: number, buffer: Uint8Array, offset: number, length: number, position: number): Promise<IReadResult>;
|
|
16
16
|
export declare function writeFile(path: fs.PathLike, data: Buffer | string): Promise<void>;
|
|
17
17
|
export declare function writeFileSync(path: fs.PathLike, data: Buffer | string): void;
|
|
18
18
|
export declare function readFile(path: fs.PathLike): Promise<Buffer>;
|
|
@@ -16,13 +16,13 @@ export declare class ReadStreamTokenizer extends AbstractTokenizer {
|
|
|
16
16
|
* @param options - Read behaviour options
|
|
17
17
|
* @returns Promise with number of bytes read
|
|
18
18
|
*/
|
|
19
|
-
readBuffer(buffer:
|
|
19
|
+
readBuffer(buffer: Uint8Array, options?: IReadChunkOptions): Promise<number>;
|
|
20
20
|
/**
|
|
21
21
|
* Peek (read ahead) buffer from tokenizer
|
|
22
|
-
* @param
|
|
22
|
+
* @param uint8Array - Uint8Array (or Buffer) to write data to
|
|
23
23
|
* @param options - Read behaviour options
|
|
24
24
|
* @returns Promise with number of bytes peeked
|
|
25
25
|
*/
|
|
26
|
-
peekBuffer(
|
|
26
|
+
peekBuffer(uint8Array: Uint8Array, options?: IReadChunkOptions): Promise<number>;
|
|
27
27
|
ignore(length: number): Promise<number>;
|
|
28
28
|
}
|
|
@@ -3,8 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ReadStreamTokenizer = void 0;
|
|
4
4
|
const AbstractTokenizer_1 = require("./AbstractTokenizer");
|
|
5
5
|
const peek_readable_1 = require("peek-readable");
|
|
6
|
-
// import * as _debug from 'debug';
|
|
7
|
-
// const debug = _debug('strtok3:ReadStreamTokenizer');
|
|
8
6
|
const maxBufferSize = 256000;
|
|
9
7
|
class ReadStreamTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
|
|
10
8
|
constructor(stream, fileInfo) {
|
|
@@ -62,57 +60,45 @@ class ReadStreamTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
|
|
|
62
60
|
}
|
|
63
61
|
/**
|
|
64
62
|
* Peek (read ahead) buffer from tokenizer
|
|
65
|
-
* @param
|
|
63
|
+
* @param uint8Array - Uint8Array (or Buffer) to write data to
|
|
66
64
|
* @param options - Read behaviour options
|
|
67
65
|
* @returns Promise with number of bytes peeked
|
|
68
66
|
*/
|
|
69
|
-
async peekBuffer(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
67
|
+
async peekBuffer(uint8Array, options) {
|
|
68
|
+
options = this.normalizeOptions(uint8Array, options);
|
|
69
|
+
let bytesRead = 0;
|
|
70
|
+
if (options.position) {
|
|
71
|
+
const skipBytes = options.position - this.position;
|
|
72
|
+
if (skipBytes > 0) {
|
|
73
|
+
const skipBuffer = new Uint8Array(options.length + skipBytes);
|
|
74
|
+
bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: options.mayBeLess });
|
|
75
|
+
uint8Array.set(skipBuffer.subarray(skipBytes), options.offset);
|
|
76
|
+
return bytesRead - skipBytes;
|
|
78
77
|
}
|
|
79
|
-
if (
|
|
80
|
-
|
|
78
|
+
else if (skipBytes < 0) {
|
|
79
|
+
throw new Error('Cannot peek from a negative offset in a stream');
|
|
81
80
|
}
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
}
|
|
82
|
+
if (options.length > 0) {
|
|
83
|
+
try {
|
|
84
|
+
bytesRead = await this.streamReader.peek(uint8Array, options.offset, options.length);
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const skipBuffer = Buffer.alloc(length + skipBytes);
|
|
89
|
-
bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: options.mayBeLess });
|
|
90
|
-
skipBuffer.copy(buffer, offset, skipBytes);
|
|
91
|
-
return bytesRead - skipBytes;
|
|
92
|
-
}
|
|
93
|
-
else if (skipBytes < 0) {
|
|
94
|
-
throw new Error('Cannot peek from a negative offset in a stream');
|
|
86
|
+
catch (err) {
|
|
87
|
+
if (options && options.mayBeLess && err instanceof peek_readable_1.EndOfStreamError) {
|
|
88
|
+
return 0;
|
|
95
89
|
}
|
|
90
|
+
throw err;
|
|
96
91
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
bytesRead = await this.streamReader.peek(buffer, offset, length);
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
if (options && options.mayBeLess && err instanceof peek_readable_1.EndOfStreamError) {
|
|
103
|
-
return 0;
|
|
92
|
+
if ((!options.mayBeLess) && bytesRead < options.length) {
|
|
93
|
+
throw new peek_readable_1.EndOfStreamError();
|
|
104
94
|
}
|
|
105
|
-
throw err;
|
|
106
|
-
}
|
|
107
|
-
if ((!options || !options.mayBeLess) && bytesRead < length) {
|
|
108
|
-
throw new peek_readable_1.EndOfStreamError();
|
|
109
95
|
}
|
|
110
96
|
return bytesRead;
|
|
111
97
|
}
|
|
112
98
|
async ignore(length) {
|
|
113
99
|
// debug(`ignore ${this.position}...${this.position + length - 1}`);
|
|
114
100
|
const bufSize = Math.min(maxBufferSize, length);
|
|
115
|
-
const buf =
|
|
101
|
+
const buf = new Uint8Array(bufSize);
|
|
116
102
|
let totBytesRead = 0;
|
|
117
103
|
while (totBytesRead < length) {
|
|
118
104
|
const remaining = length - totBytesRead;
|
package/lib/core.d.ts
CHANGED
|
@@ -16,8 +16,8 @@ export { IToken, IGetToken } from '@tokenizer/token';
|
|
|
16
16
|
export declare function fromStream(stream: Stream.Readable, fileInfo?: IFileInfo): ReadStreamTokenizer;
|
|
17
17
|
/**
|
|
18
18
|
* Construct ReadStreamTokenizer from given Buffer.
|
|
19
|
-
* @param
|
|
19
|
+
* @param uint8Array - Uint8Array to tokenize
|
|
20
20
|
* @param fileInfo - Pass additional file information to the tokenizer
|
|
21
21
|
* @returns BufferTokenizer
|
|
22
22
|
*/
|
|
23
|
-
export declare function fromBuffer(
|
|
23
|
+
export declare function fromBuffer(uint8Array: Uint8Array, fileInfo?: IFileInfo): BufferTokenizer;
|
package/lib/core.js
CHANGED
|
@@ -19,11 +19,11 @@ function fromStream(stream, fileInfo) {
|
|
|
19
19
|
exports.fromStream = fromStream;
|
|
20
20
|
/**
|
|
21
21
|
* Construct ReadStreamTokenizer from given Buffer.
|
|
22
|
-
* @param
|
|
22
|
+
* @param uint8Array - Uint8Array to tokenize
|
|
23
23
|
* @param fileInfo - Pass additional file information to the tokenizer
|
|
24
24
|
* @returns BufferTokenizer
|
|
25
25
|
*/
|
|
26
|
-
function fromBuffer(
|
|
27
|
-
return new BufferTokenizer_1.BufferTokenizer(
|
|
26
|
+
function fromBuffer(uint8Array, fileInfo) {
|
|
27
|
+
return new BufferTokenizer_1.BufferTokenizer(uint8Array, fileInfo);
|
|
28
28
|
}
|
|
29
29
|
exports.fromBuffer = fromBuffer;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "strtok3",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.2",
|
|
4
4
|
"description": "A promise based streaming tokenizer",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Borewit",
|
|
@@ -43,15 +43,17 @@
|
|
|
43
43
|
"url": "https://github.com/Borewit/strtok3/issues"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
+
"@tokenizer/token": "^0.3.0",
|
|
46
47
|
"@types/chai": "^4.2.21",
|
|
48
|
+
"@types/debug": "^4.1.6",
|
|
47
49
|
"@types/mocha": "^8.2.3",
|
|
48
|
-
"@types/node": "^16.3.
|
|
50
|
+
"@types/node": "^16.3.3",
|
|
49
51
|
"@typescript-eslint/eslint-plugin": "^2.34.0",
|
|
50
|
-
"@typescript-eslint/eslint-plugin-tslint": "^4.28.
|
|
52
|
+
"@typescript-eslint/eslint-plugin-tslint": "^4.28.3",
|
|
51
53
|
"@typescript-eslint/parser": "^2.34.0",
|
|
52
54
|
"chai": "^4.3.4",
|
|
53
55
|
"coveralls": "^3.1.1",
|
|
54
|
-
"del-cli": "^4.0.
|
|
56
|
+
"del-cli": "^4.0.1",
|
|
55
57
|
"eslint": "^6.8.0",
|
|
56
58
|
"eslint-plugin-import": "^2.23.4",
|
|
57
59
|
"eslint-plugin-prefer-arrow": "^1.2.3",
|
|
@@ -60,15 +62,13 @@
|
|
|
60
62
|
"remark-cli": "^9.0.0",
|
|
61
63
|
"remark-preset-lint-recommended": "^5.0.0",
|
|
62
64
|
"source-map-support": "^0.5.16",
|
|
63
|
-
"token-types": "^
|
|
65
|
+
"token-types": "^4.1.0",
|
|
64
66
|
"ts-node": "^10.1.0",
|
|
65
67
|
"tslint": "^6.1.3",
|
|
66
68
|
"typescript": "^4.3.5"
|
|
67
69
|
},
|
|
68
70
|
"dependencies": {
|
|
69
|
-
"
|
|
70
|
-
"@types/debug": "^4.1.6",
|
|
71
|
-
"peek-readable": "^3.1.4"
|
|
71
|
+
"peek-readable": "^4.0.0"
|
|
72
72
|
},
|
|
73
73
|
"keywords": [
|
|
74
74
|
"tokenizer",
|