strtok3 6.2.3 → 6.2.4

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.
@@ -1,5 +1,11 @@
1
1
  import { ITokenizer, IFileInfo, IReadChunkOptions } from './types';
2
2
  import { IGetToken, IToken } from '@tokenizer/token';
3
+ interface INormalizedReadChunkOptions extends IReadChunkOptions {
4
+ offset: number;
5
+ length: number;
6
+ position: number;
7
+ mayBeLess?: boolean;
8
+ }
3
9
  /**
4
10
  * Core tokenizer
5
11
  */
@@ -58,5 +64,6 @@ export declare abstract class AbstractTokenizer implements ITokenizer {
58
64
  */
59
65
  ignore(length: number): Promise<number>;
60
66
  close(): Promise<void>;
61
- protected normalizeOptions(uint8Array: Uint8Array, options?: IReadChunkOptions): IReadChunkOptions;
67
+ protected normalizeOptions(uint8Array: Uint8Array, options?: IReadChunkOptions): INormalizedReadChunkOptions;
62
68
  }
69
+ export {};
@@ -68,22 +68,37 @@ class AbstractTokenizer {
68
68
  * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available
69
69
  */
70
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;
71
+ if (this.fileInfo.size !== undefined) {
72
+ const bytesLeft = this.fileInfo.size - this.position;
73
+ if (length > bytesLeft) {
74
+ this.position += bytesLeft;
75
+ return bytesLeft;
76
+ }
79
77
  }
78
+ this.position += length;
79
+ return length;
80
80
  }
81
81
  async close() {
82
82
  // empty
83
83
  }
84
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;
85
+ if (options && options.position !== undefined && options.position < this.position) {
86
+ throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
87
+ }
88
+ if (options) {
89
+ return {
90
+ mayBeLess: options.mayBeLess === true,
91
+ offset: options.offset ? options.offset : 0,
92
+ length: options.length ? options.length : (uint8Array.length - (options.offset ? options.offset : 0)),
93
+ position: options.position ? options.position : this.position
94
+ };
95
+ }
96
+ return {
97
+ mayBeLess: false,
98
+ offset: 0,
99
+ length: uint8Array.length,
100
+ position: this.position
101
+ };
87
102
  }
88
103
  }
89
104
  exports.AbstractTokenizer = AbstractTokenizer;
@@ -38,13 +38,13 @@ class BufferTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
38
38
  * @returns {Promise<number>}
39
39
  */
40
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) {
41
+ const normOptions = this.normalizeOptions(uint8Array, options);
42
+ const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);
43
+ if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {
44
44
  throw new peek_readable_1.EndOfStreamError();
45
45
  }
46
46
  else {
47
- uint8Array.set(this.uint8Array.subarray(options.position, options.position + bytes2read), options.offset);
47
+ uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read), normOptions.offset);
48
48
  return bytes2read;
49
49
  }
50
50
  }
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { AbstractTokenizer } from './AbstractTokenizer';
3
2
  import { IFileInfo, IReadChunkOptions } from './types';
4
3
  export declare class FileTokenizer extends AbstractTokenizer {
@@ -6,11 +5,11 @@ export declare class FileTokenizer extends AbstractTokenizer {
6
5
  constructor(fd: number, fileInfo: IFileInfo);
7
6
  /**
8
7
  * Read buffer from file
9
- * @param buffer
8
+ * @param uint8Array - Uint8Array to write result to
10
9
  * @param options - Read behaviour options
11
10
  * @returns Promise number of bytes read
12
11
  */
13
- readBuffer(buffer: Buffer, options?: IReadChunkOptions): Promise<number>;
12
+ readBuffer(uint8Array: Uint8Array, options?: IReadChunkOptions): Promise<number>;
14
13
  /**
15
14
  * Peek buffer from file
16
15
  * @param uint8Array - Uint8Array (or Buffer) to write data to
@@ -11,36 +11,16 @@ class FileTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
11
11
  }
12
12
  /**
13
13
  * Read buffer from file
14
- * @param buffer
14
+ * @param uint8Array - Uint8Array to write result to
15
15
  * @param options - Read behaviour options
16
16
  * @returns Promise number of bytes read
17
17
  */
18
- async readBuffer(buffer, options) {
19
- let offset = 0;
20
- let length = buffer.length;
21
- if (options) {
22
- if (options.position) {
23
- if (options.position < this.position) {
24
- throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
25
- }
26
- this.position = options.position;
27
- }
28
- if (Number.isInteger(options.length)) {
29
- length = options.length;
30
- }
31
- else {
32
- length -= options.offset || 0;
33
- }
34
- if (options.offset) {
35
- offset = options.offset;
36
- }
37
- }
38
- if (length === 0) {
39
- return Promise.resolve(0);
40
- }
41
- const res = await fs.read(this.fd, buffer, offset, length, this.position);
18
+ async readBuffer(uint8Array, options) {
19
+ const normOptions = this.normalizeOptions(uint8Array, options);
20
+ this.position = normOptions.position;
21
+ const res = await fs.read(this.fd, uint8Array, normOptions.offset, normOptions.length, normOptions.position);
42
22
  this.position += res.bytesRead;
43
- if (res.bytesRead < length && (!options || !options.mayBeLess)) {
23
+ if (res.bytesRead < normOptions.length && (!options || !options.mayBeLess)) {
44
24
  throw new peek_readable_1.EndOfStreamError();
45
25
  }
46
26
  return res.bytesRead;
@@ -52,9 +32,9 @@ class FileTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
52
32
  * @returns Promise number of bytes read
53
33
  */
54
34
  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) {
35
+ const normOptions = this.normalizeOptions(uint8Array, options);
36
+ const res = await fs.read(this.fd, uint8Array, normOptions.offset, normOptions.length, normOptions.position);
37
+ if ((!normOptions.mayBeLess) && res.bytesRead < normOptions.length) {
58
38
  throw new peek_readable_1.EndOfStreamError();
59
39
  }
60
40
  return res.bytesRead;
@@ -11,7 +11,7 @@ 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
- export declare function open(path: fs.PathLike, mode?: string): Promise<number>;
14
+ export declare function open(path: fs.PathLike, mode: fs.Mode): Promise<number>;
15
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;
@@ -1,10 +1,10 @@
1
1
  /// <reference types="node" />
2
2
  import { AbstractTokenizer } from './AbstractTokenizer';
3
- import * as Stream from 'stream';
3
+ import { Readable } from 'stream';
4
4
  import { IFileInfo, IReadChunkOptions } from './types';
5
5
  export declare class ReadStreamTokenizer extends AbstractTokenizer {
6
6
  private streamReader;
7
- constructor(stream: Stream.Readable, fileInfo?: IFileInfo);
7
+ constructor(stream: Readable, fileInfo?: IFileInfo);
8
8
  /**
9
9
  * Get file information, an HTTP-client may implement this doing a HEAD request
10
10
  * @return Promise with file information
@@ -12,11 +12,11 @@ export declare class ReadStreamTokenizer extends AbstractTokenizer {
12
12
  getFileInfo(): Promise<IFileInfo>;
13
13
  /**
14
14
  * Read buffer from tokenizer
15
- * @param buffer - Target buffer to fill with data read from the tokenizer-stream
15
+ * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream
16
16
  * @param options - Read behaviour options
17
17
  * @returns Promise with number of bytes read
18
18
  */
19
- readBuffer(buffer: Uint8Array, options?: IReadChunkOptions): Promise<number>;
19
+ readBuffer(uint8Array: Uint8Array, options?: IReadChunkOptions): Promise<number>;
20
20
  /**
21
21
  * Peek (read ahead) buffer from tokenizer
22
22
  * @param uint8Array - Uint8Array (or Buffer) to write data to
@@ -18,42 +18,26 @@ class ReadStreamTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
18
18
  }
19
19
  /**
20
20
  * Read buffer from tokenizer
21
- * @param buffer - Target buffer to fill with data read from the tokenizer-stream
21
+ * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream
22
22
  * @param options - Read behaviour options
23
23
  * @returns Promise with number of bytes read
24
24
  */
25
- async readBuffer(buffer, options) {
26
- // const _offset = position ? position : this.position;
27
- // debug(`readBuffer ${_offset}...${_offset + length - 1}`);
28
- let offset = 0;
29
- let length = buffer.length;
30
- if (options) {
31
- if (Number.isInteger(options.length)) {
32
- length = options.length;
33
- }
34
- else {
35
- length -= options.offset || 0;
36
- }
37
- if (options.position) {
38
- const skipBytes = options.position - this.position;
39
- if (skipBytes > 0) {
40
- await this.ignore(skipBytes);
41
- return this.readBuffer(buffer, options);
42
- }
43
- else if (skipBytes < 0) {
44
- throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
45
- }
46
- }
47
- if (options.offset) {
48
- offset = options.offset;
49
- }
25
+ async readBuffer(uint8Array, options) {
26
+ const normOptions = this.normalizeOptions(uint8Array, options);
27
+ const skipBytes = normOptions.position - this.position;
28
+ if (skipBytes > 0) {
29
+ await this.ignore(skipBytes);
30
+ return this.readBuffer(uint8Array, options);
31
+ }
32
+ else if (skipBytes < 0) {
33
+ throw new Error('`options.position` must be equal or greater than `tokenizer.position`');
50
34
  }
51
- if (length === 0) {
35
+ if (normOptions.length === 0) {
52
36
  return 0;
53
37
  }
54
- const bytesRead = await this.streamReader.read(buffer, offset, length);
38
+ const bytesRead = await this.streamReader.read(uint8Array, normOptions.offset, normOptions.length);
55
39
  this.position += bytesRead;
56
- if ((!options || !options.mayBeLess) && bytesRead < length) {
40
+ if ((!options || !options.mayBeLess) && bytesRead < normOptions.length) {
57
41
  throw new peek_readable_1.EndOfStreamError();
58
42
  }
59
43
  return bytesRead;
@@ -65,23 +49,23 @@ class ReadStreamTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
65
49
  * @returns Promise with number of bytes peeked
66
50
  */
67
51
  async peekBuffer(uint8Array, options) {
68
- options = this.normalizeOptions(uint8Array, options);
52
+ const normOptions = this.normalizeOptions(uint8Array, options);
69
53
  let bytesRead = 0;
70
- if (options.position) {
71
- const skipBytes = options.position - this.position;
54
+ if (normOptions.position) {
55
+ const skipBytes = normOptions.position - this.position;
72
56
  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);
57
+ const skipBuffer = new Uint8Array(normOptions.length + skipBytes);
58
+ bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: normOptions.mayBeLess });
59
+ uint8Array.set(skipBuffer.subarray(skipBytes), normOptions.offset);
76
60
  return bytesRead - skipBytes;
77
61
  }
78
62
  else if (skipBytes < 0) {
79
63
  throw new Error('Cannot peek from a negative offset in a stream');
80
64
  }
81
65
  }
82
- if (options.length > 0) {
66
+ if (normOptions.length > 0) {
83
67
  try {
84
- bytesRead = await this.streamReader.peek(uint8Array, options.offset, options.length);
68
+ bytesRead = await this.streamReader.peek(uint8Array, normOptions.offset, normOptions.length);
85
69
  }
86
70
  catch (err) {
87
71
  if (options && options.mayBeLess && err instanceof peek_readable_1.EndOfStreamError) {
@@ -89,7 +73,7 @@ class ReadStreamTokenizer extends AbstractTokenizer_1.AbstractTokenizer {
89
73
  }
90
74
  throw err;
91
75
  }
92
- if ((!options.mayBeLess) && bytesRead < options.length) {
76
+ if ((!normOptions.mayBeLess) && bytesRead < normOptions.length) {
93
77
  throw new peek_readable_1.EndOfStreamError();
94
78
  }
95
79
  }
package/lib/core.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { ReadStreamTokenizer } from './ReadStreamTokenizer';
3
- import * as Stream from 'stream';
3
+ import { Readable } from 'stream';
4
4
  import { BufferTokenizer } from './BufferTokenizer';
5
5
  import { IFileInfo } from './types';
6
6
  export { EndOfStreamError } from 'peek-readable';
@@ -13,7 +13,7 @@ export { IToken, IGetToken } from '@tokenizer/token';
13
13
  * @param fileInfo - Pass the file information, like size and MIME-type of the correspnding stream.
14
14
  * @returns ReadStreamTokenizer
15
15
  */
16
- export declare function fromStream(stream: Stream.Readable, fileInfo?: IFileInfo): ReadStreamTokenizer;
16
+ export declare function fromStream(stream: Readable, fileInfo?: IFileInfo): ReadStreamTokenizer;
17
17
  /**
18
18
  * Construct ReadStreamTokenizer from given Buffer.
19
19
  * @param uint8Array - Uint8Array to tokenize
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import * as Stream from 'stream';
2
+ import { Readable } from 'stream';
3
3
  import { ReadStreamTokenizer } from './ReadStreamTokenizer';
4
4
  import * as core from './core';
5
5
  export { fromFile } from './FileTokenizer';
@@ -12,4 +12,4 @@ export { IToken, IGetToken } from '@tokenizer/token';
12
12
  * @param fileInfo - Pass additional file information to the tokenizer
13
13
  * @returns Tokenizer
14
14
  */
15
- export declare function fromStream(stream: Stream.Readable, fileInfo?: core.IFileInfo): Promise<ReadStreamTokenizer>;
15
+ export declare function fromStream(stream: Readable, fileInfo?: core.IFileInfo): Promise<ReadStreamTokenizer>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strtok3",
3
- "version": "6.2.3",
3
+ "version": "6.2.4",
4
4
  "description": "A promise based streaming tokenizer",
5
5
  "author": {
6
6
  "name": "Borewit",
@@ -19,6 +19,7 @@
19
19
  "eslint": "eslint lib test --ext .ts --ignore-pattern *.d.ts",
20
20
  "lint-md": "remark -u preset-lint-recommended .",
21
21
  "lint": "npm run lint-md && npm run eslint",
22
+ "fix": "eslint lib test --ext .ts --ignore-pattern *.d.ts --fix",
22
23
  "test": "mocha --require ts-node/register --require source-map-support/register --full-trace test/test.ts",
23
24
  "test-coverage": "nyc npm run test",
24
25
  "send-coveralls": "nyc report --reporter=text-lcov | coveralls",
@@ -44,9 +45,9 @@
44
45
  },
45
46
  "devDependencies": {
46
47
  "@types/chai": "^4.2.21",
47
- "@types/debug": "^4.1.6",
48
+ "@types/debug": "^4.1.7",
48
49
  "@types/mocha": "^9.0.0",
49
- "@types/node": "^16.4.6",
50
+ "@types/node": "^16.4.7",
50
51
  "@typescript-eslint/eslint-plugin": "^2.34.0",
51
52
  "@typescript-eslint/eslint-plugin-tslint": "^4.28.5",
52
53
  "@typescript-eslint/parser": "^2.34.0",
@@ -68,7 +69,7 @@
68
69
  },
69
70
  "dependencies": {
70
71
  "@tokenizer/token": "^0.3.0",
71
- "peek-readable": "^4.0.0"
72
+ "peek-readable": "^4.0.1"
72
73
  },
73
74
  "keywords": [
74
75
  "tokenizer",