From 5ecdc7da446120708c491e08253775281bdfab5d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:08:05 -0800 Subject: [PATCH 1/4] Make payload limit configurable by tests --- src/common/parser/ApcParser.ts | 4 +++- src/common/parser/DcsParser.ts | 4 +++- src/common/parser/OscParser.ts | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/common/parser/ApcParser.ts b/src/common/parser/ApcParser.ts index e5a82ce3..eff533e2 100644 --- a/src/common/parser/ApcParser.ts +++ b/src/common/parser/ApcParser.ts @@ -199,6 +199,8 @@ export class ApcParser implements IApcParser { * as APC handlers. */ export class ApcHandler implements IApcHandler { + private static PAYLOAD_LIMIT = PAYLOAD_LIMIT; + private _data = ''; private _hitLimit: boolean = false; @@ -214,7 +216,7 @@ export class ApcHandler implements IApcHandler { return; } this._data += utf32ToString(data, start, end); - if (this._data.length > PAYLOAD_LIMIT) { + if (this._data.length > ApcHandler.PAYLOAD_LIMIT) { this._data = ''; this._hitLimit = true; } diff --git a/src/common/parser/DcsParser.ts b/src/common/parser/DcsParser.ts index 182179b0..50253997 100644 --- a/src/common/parser/DcsParser.ts +++ b/src/common/parser/DcsParser.ts @@ -138,6 +138,8 @@ EMPTY_PARAMS.addParam(0); * Note: The payload is currently limited to 50 MB (hardcoded). */ export class DcsHandler implements IDcsHandler { + private static PAYLOAD_LIMIT = PAYLOAD_LIMIT; + private _data = ''; private _params: IParams = EMPTY_PARAMS; private _hitLimit: boolean = false; @@ -159,7 +161,7 @@ export class DcsHandler implements IDcsHandler { return; } this._data += utf32ToString(data, start, end); - if (this._data.length > PAYLOAD_LIMIT) { + if (this._data.length > DcsHandler.PAYLOAD_LIMIT) { this._data = ''; this._hitLimit = true; } diff --git a/src/common/parser/OscParser.ts b/src/common/parser/OscParser.ts index 2a829a8e..cea9e12c 100644 --- a/src/common/parser/OscParser.ts +++ b/src/common/parser/OscParser.ts @@ -192,6 +192,8 @@ export class OscParser implements IOscParser { * as OSC handlers. */ export class OscHandler implements IOscHandler { + private static PAYLOAD_LIMIT = PAYLOAD_LIMIT; + private _data = ''; private _hitLimit: boolean = false; @@ -207,7 +209,7 @@ export class OscHandler implements IOscHandler { return; } this._data += utf32ToString(data, start, end); - if (this._data.length > PAYLOAD_LIMIT) { + if (this._data.length > OscHandler.PAYLOAD_LIMIT) { this._data = ''; this._hitLimit = true; } From 7ceb15bb83273d5cb2f698b359cf540dd3b7a121 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:17:10 -0800 Subject: [PATCH 2/4] Reduce payload size to speed up unit tests Reduces 11s -> 8s for full run --- package.json | 1 + src/common/parser/ApcParser.test.ts | 26 ++++++++++++++++++++------ src/common/parser/DcsParser.test.ts | 26 ++++++++++++++++++++------ src/common/parser/OscParser.test.ts | 26 ++++++++++++++++++++------ 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index c319f0b3..bc66fbd4 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "lint-fix": "eslint --fix src/ addons/ demo/", "lint-api": "eslint --config eslint.config.typings.mjs --max-warnings 0 typings/", "test-unit": "node ./bin/test_unit.js", + "test-unit-slow-tests": "npm run test-unit | grep \"ms)\"", "test-unit-coverage": "node ./bin/test_unit.js --coverage", "test-unit-dev": "cross-env NODE_PATH='./out' mocha", "test-integration": "node ./bin/test_integration.js --workers=75%", diff --git a/src/common/parser/ApcParser.test.ts b/src/common/parser/ApcParser.test.ts index 3401baab..f337e5c0 100644 --- a/src/common/parser/ApcParser.test.ts +++ b/src/common/parser/ApcParser.test.ts @@ -6,7 +6,6 @@ import { assert } from 'chai'; import { ApcParser, ApcHandler } from 'common/parser/ApcParser'; import { StringToUtf32, utf32ToString } from 'common/input/TextDecoder'; import { IApcHandler } from 'common/parser/Types'; -import { PAYLOAD_LIMIT } from 'common/parser/Constants'; function toUtf32(s: string): Uint32Array { const utf32 = new Uint32Array(s.length); @@ -216,6 +215,21 @@ describe('ApcParser', () => { }); describe('ApcHandler convenience class', () => { + const TEST_PAYLOAD_LIMIT = 100; + const CHUNK_SIZE = 10; + let originalPayloadLimit: number; + + beforeEach(() => { + const handlerConstructor = ApcHandler as unknown as { PAYLOAD_LIMIT: number }; + originalPayloadLimit = handlerConstructor.PAYLOAD_LIMIT; + handlerConstructor.PAYLOAD_LIMIT = TEST_PAYLOAD_LIMIT; + }); + + afterEach(() => { + const handlerConstructor = ApcHandler as unknown as { PAYLOAD_LIMIT: number }; + handlerConstructor.PAYLOAD_LIMIT = originalPayloadLimit; + }); + it('should be called once on end(true)', () => { const G_CODE = 0x47; const results: [number, string][] = []; @@ -257,12 +271,12 @@ describe('ApcParser', () => { parser.start(); let data = toUtf32('G'); parser.put(data, 0, data.length); - data = toUtf32('A'.repeat(1000)); - for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) { + data = toUtf32('A'.repeat(CHUNK_SIZE)); + for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) { parser.put(data, 0, data.length); } parser.end(true); - assert.deepEqual(results, [[G_CODE, 'A'.repeat(PAYLOAD_LIMIT)]]); + assert.deepEqual(results, [[G_CODE, 'A'.repeat(TEST_PAYLOAD_LIMIT)]]); }); it('should abort for payload over limit', function(): void { @@ -276,8 +290,8 @@ describe('ApcParser', () => { parser.start(); let data = toUtf32('G'); parser.put(data, 0, data.length); - data = toUtf32('A'.repeat(1000)); - for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) { + data = toUtf32('A'.repeat(CHUNK_SIZE)); + for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) { parser.put(data, 0, data.length); } data = toUtf32('A'); diff --git a/src/common/parser/DcsParser.test.ts b/src/common/parser/DcsParser.test.ts index c6cc0994..0c09199a 100644 --- a/src/common/parser/DcsParser.test.ts +++ b/src/common/parser/DcsParser.test.ts @@ -7,7 +7,6 @@ import { DcsParser, DcsHandler } from 'common/parser/DcsParser'; import { IDcsHandler, IParams, IFunctionIdentifier } from 'common/parser/Types'; import { utf32ToString, StringToUtf32 } from 'common/input/TextDecoder'; import { Params } from 'common/parser/Params'; -import { PAYLOAD_LIMIT } from 'common/parser/Constants'; function toUtf32(s: string): Uint32Array { const utf32 = new Uint32Array(s.length); @@ -176,6 +175,21 @@ describe('DcsParser', () => { }); }); describe('DcsHandlerFactory', () => { + const TEST_PAYLOAD_LIMIT = 100; + const CHUNK_SIZE = 10; + let originalPayloadLimit: number; + + beforeEach(() => { + const handlerConstructor = DcsHandler as unknown as { PAYLOAD_LIMIT: number }; + originalPayloadLimit = handlerConstructor.PAYLOAD_LIMIT; + handlerConstructor.PAYLOAD_LIMIT = TEST_PAYLOAD_LIMIT; + }); + + afterEach(() => { + const handlerConstructor = DcsHandler as unknown as { PAYLOAD_LIMIT: number }; + handlerConstructor.PAYLOAD_LIMIT = originalPayloadLimit; + }); + it('should be called once on end(true)', () => { parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; })); parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3])); @@ -230,19 +244,19 @@ describe('DcsParser', () => { this.timeout(30000); parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; })); parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3])); - const data = toUtf32('A'.repeat(1000)); - for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) { + const data = toUtf32('A'.repeat(CHUNK_SIZE)); + for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) { parser.put(data, 0, data.length); } parser.unhook(true); - assert.deepEqual(reports, [[[1, 2, 3], 'A'.repeat(PAYLOAD_LIMIT)]]); + assert.deepEqual(reports, [[[1, 2, 3], 'A'.repeat(TEST_PAYLOAD_LIMIT)]]); }); it('should abort for payload limit +1', function(): void { this.timeout(30000); parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; })); parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3])); - let data = toUtf32('A'.repeat(1000)); - for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) { + let data = toUtf32('A'.repeat(CHUNK_SIZE)); + for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) { parser.put(data, 0, data.length); } data = toUtf32('A'); diff --git a/src/common/parser/OscParser.test.ts b/src/common/parser/OscParser.test.ts index b88171c8..cad73352 100644 --- a/src/common/parser/OscParser.test.ts +++ b/src/common/parser/OscParser.test.ts @@ -6,7 +6,6 @@ import { assert } from 'chai'; import { OscParser, OscHandler } from 'common/parser/OscParser'; import { StringToUtf32, utf32ToString } from 'common/input/TextDecoder'; import { IOscHandler } from 'common/parser/Types'; -import { PAYLOAD_LIMIT } from 'common/parser/Constants'; function toUtf32(s: string): Uint32Array { const utf32 = new Uint32Array(s.length); @@ -170,6 +169,21 @@ describe('OscParser', () => { }); }); describe('OscHandlerFactory', () => { + const TEST_PAYLOAD_LIMIT = 100; + const CHUNK_SIZE = 10; + let originalPayloadLimit: number; + + beforeEach(() => { + const handlerConstructor = OscHandler as unknown as { PAYLOAD_LIMIT: number }; + originalPayloadLimit = handlerConstructor.PAYLOAD_LIMIT; + handlerConstructor.PAYLOAD_LIMIT = TEST_PAYLOAD_LIMIT; + }); + + afterEach(() => { + const handlerConstructor = OscHandler as unknown as { PAYLOAD_LIMIT: number }; + handlerConstructor.PAYLOAD_LIMIT = originalPayloadLimit; + }); + it('should be called once on end(true)', () => { parser.registerHandler(1234, new OscHandler(data => { reports.push([1234, data]); return true; })); parser.start(); @@ -226,12 +240,12 @@ describe('OscParser', () => { parser.start(); let data = toUtf32('1234;'); parser.put(data, 0, data.length); - data = toUtf32('A'.repeat(1000)); - for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) { + data = toUtf32('A'.repeat(CHUNK_SIZE)); + for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) { parser.put(data, 0, data.length); } parser.end(true); - assert.deepEqual(reports, [[1234, 'A'.repeat(PAYLOAD_LIMIT)]]); + assert.deepEqual(reports, [[1234, 'A'.repeat(TEST_PAYLOAD_LIMIT)]]); }); it('should abort for payload limit +1', function(): void { this.timeout(30000); @@ -239,8 +253,8 @@ describe('OscParser', () => { parser.start(); let data = toUtf32('1234;'); parser.put(data, 0, data.length); - data = toUtf32('A'.repeat(1000)); - for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) { + data = toUtf32('A'.repeat(CHUNK_SIZE)); + for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) { parser.put(data, 0, data.length); } data = toUtf32('A'); From 0ca1bd48bec5d963d703777557a6ea2116c7c449 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:20:00 -0800 Subject: [PATCH 3/4] Inline payload limit --- src/common/parser/ApcParser.ts | 4 ++-- src/common/parser/Constants.ts | 4 +++- src/common/parser/DcsParser.ts | 4 ++-- src/common/parser/OscParser.ts | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/common/parser/ApcParser.ts b/src/common/parser/ApcParser.ts index eff533e2..f7d3e6ed 100644 --- a/src/common/parser/ApcParser.ts +++ b/src/common/parser/ApcParser.ts @@ -4,7 +4,7 @@ */ import { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from 'common/parser/Types'; -import { ApcState, PAYLOAD_LIMIT } from 'common/parser/Constants'; +import { ApcState, ParserConstants } from 'common/parser/Constants'; import { utf32ToString } from 'common/input/TextDecoder'; import { IDisposable } from 'common/Types'; @@ -199,7 +199,7 @@ export class ApcParser implements IApcParser { * as APC handlers. */ export class ApcHandler implements IApcHandler { - private static PAYLOAD_LIMIT = PAYLOAD_LIMIT; + private static PAYLOAD_LIMIT = ParserConstants.PAYLOAD_LIMIT; private _data = ''; private _hitLimit: boolean = false; diff --git a/src/common/parser/Constants.ts b/src/common/parser/Constants.ts index 547e5407..828d7ad6 100644 --- a/src/common/parser/Constants.ts +++ b/src/common/parser/Constants.ts @@ -71,4 +71,6 @@ export const enum ApcState { } // payload limit for OSC and DCS -export const PAYLOAD_LIMIT = 10000000; +export const enum ParserConstants { + PAYLOAD_LIMIT = 10000000 +} diff --git a/src/common/parser/DcsParser.ts b/src/common/parser/DcsParser.ts index 50253997..2478d94d 100644 --- a/src/common/parser/DcsParser.ts +++ b/src/common/parser/DcsParser.ts @@ -7,7 +7,7 @@ import { IDisposable } from 'common/Types'; import { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types'; import { utf32ToString } from 'common/input/TextDecoder'; import { Params } from 'common/parser/Params'; -import { PAYLOAD_LIMIT } from 'common/parser/Constants'; +import { ParserConstants } from 'common/parser/Constants'; const EMPTY_HANDLERS: IDcsHandler[] = []; @@ -138,7 +138,7 @@ EMPTY_PARAMS.addParam(0); * Note: The payload is currently limited to 50 MB (hardcoded). */ export class DcsHandler implements IDcsHandler { - private static PAYLOAD_LIMIT = PAYLOAD_LIMIT; + private static PAYLOAD_LIMIT = ParserConstants.PAYLOAD_LIMIT; private _data = ''; private _params: IParams = EMPTY_PARAMS; diff --git a/src/common/parser/OscParser.ts b/src/common/parser/OscParser.ts index cea9e12c..ff85d874 100644 --- a/src/common/parser/OscParser.ts +++ b/src/common/parser/OscParser.ts @@ -4,7 +4,7 @@ */ import { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types'; -import { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants'; +import { OscState, ParserConstants } from 'common/parser/Constants'; import { utf32ToString } from 'common/input/TextDecoder'; import { IDisposable } from 'common/Types'; @@ -192,7 +192,7 @@ export class OscParser implements IOscParser { * as OSC handlers. */ export class OscHandler implements IOscHandler { - private static PAYLOAD_LIMIT = PAYLOAD_LIMIT; + private static PAYLOAD_LIMIT = ParserConstants.PAYLOAD_LIMIT; private _data = ''; private _hitLimit: boolean = false; From ccbf612ddb51adf19c4b454eb13e482e9de8c005 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:33:49 -0800 Subject: [PATCH 4/4] Fix lint --- src/common/parser/ApcParser.test.ts | 10 +++++----- src/common/parser/ApcParser.ts | 4 ++-- src/common/parser/DcsParser.test.ts | 10 +++++----- src/common/parser/DcsParser.ts | 4 ++-- src/common/parser/OscParser.test.ts | 10 +++++----- src/common/parser/OscParser.ts | 4 ++-- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/common/parser/ApcParser.test.ts b/src/common/parser/ApcParser.test.ts index f337e5c0..9021fb38 100644 --- a/src/common/parser/ApcParser.test.ts +++ b/src/common/parser/ApcParser.test.ts @@ -220,14 +220,14 @@ describe('ApcParser', () => { let originalPayloadLimit: number; beforeEach(() => { - const handlerConstructor = ApcHandler as unknown as { PAYLOAD_LIMIT: number }; - originalPayloadLimit = handlerConstructor.PAYLOAD_LIMIT; - handlerConstructor.PAYLOAD_LIMIT = TEST_PAYLOAD_LIMIT; + const handlerConstructor = ApcHandler as unknown as { _payloadLimit: number }; + originalPayloadLimit = handlerConstructor._payloadLimit; + handlerConstructor._payloadLimit = TEST_PAYLOAD_LIMIT; }); afterEach(() => { - const handlerConstructor = ApcHandler as unknown as { PAYLOAD_LIMIT: number }; - handlerConstructor.PAYLOAD_LIMIT = originalPayloadLimit; + const handlerConstructor = ApcHandler as unknown as { _payloadLimit: number }; + handlerConstructor._payloadLimit = originalPayloadLimit; }); it('should be called once on end(true)', () => { diff --git a/src/common/parser/ApcParser.ts b/src/common/parser/ApcParser.ts index f7d3e6ed..dbcf0cce 100644 --- a/src/common/parser/ApcParser.ts +++ b/src/common/parser/ApcParser.ts @@ -199,7 +199,7 @@ export class ApcParser implements IApcParser { * as APC handlers. */ export class ApcHandler implements IApcHandler { - private static PAYLOAD_LIMIT = ParserConstants.PAYLOAD_LIMIT; + private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT; private _data = ''; private _hitLimit: boolean = false; @@ -216,7 +216,7 @@ export class ApcHandler implements IApcHandler { return; } this._data += utf32ToString(data, start, end); - if (this._data.length > ApcHandler.PAYLOAD_LIMIT) { + if (this._data.length > ApcHandler._payloadLimit) { this._data = ''; this._hitLimit = true; } diff --git a/src/common/parser/DcsParser.test.ts b/src/common/parser/DcsParser.test.ts index 0c09199a..b63917f4 100644 --- a/src/common/parser/DcsParser.test.ts +++ b/src/common/parser/DcsParser.test.ts @@ -180,14 +180,14 @@ describe('DcsParser', () => { let originalPayloadLimit: number; beforeEach(() => { - const handlerConstructor = DcsHandler as unknown as { PAYLOAD_LIMIT: number }; - originalPayloadLimit = handlerConstructor.PAYLOAD_LIMIT; - handlerConstructor.PAYLOAD_LIMIT = TEST_PAYLOAD_LIMIT; + const handlerConstructor = DcsHandler as unknown as { _payloadLimit: number }; + originalPayloadLimit = handlerConstructor._payloadLimit; + handlerConstructor._payloadLimit = TEST_PAYLOAD_LIMIT; }); afterEach(() => { - const handlerConstructor = DcsHandler as unknown as { PAYLOAD_LIMIT: number }; - handlerConstructor.PAYLOAD_LIMIT = originalPayloadLimit; + const handlerConstructor = DcsHandler as unknown as { _payloadLimit: number }; + handlerConstructor._payloadLimit = originalPayloadLimit; }); it('should be called once on end(true)', () => { diff --git a/src/common/parser/DcsParser.ts b/src/common/parser/DcsParser.ts index 2478d94d..69220023 100644 --- a/src/common/parser/DcsParser.ts +++ b/src/common/parser/DcsParser.ts @@ -138,7 +138,7 @@ EMPTY_PARAMS.addParam(0); * Note: The payload is currently limited to 50 MB (hardcoded). */ export class DcsHandler implements IDcsHandler { - private static PAYLOAD_LIMIT = ParserConstants.PAYLOAD_LIMIT; + private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT; private _data = ''; private _params: IParams = EMPTY_PARAMS; @@ -161,7 +161,7 @@ export class DcsHandler implements IDcsHandler { return; } this._data += utf32ToString(data, start, end); - if (this._data.length > DcsHandler.PAYLOAD_LIMIT) { + if (this._data.length > DcsHandler._payloadLimit) { this._data = ''; this._hitLimit = true; } diff --git a/src/common/parser/OscParser.test.ts b/src/common/parser/OscParser.test.ts index cad73352..8d5d4ace 100644 --- a/src/common/parser/OscParser.test.ts +++ b/src/common/parser/OscParser.test.ts @@ -174,14 +174,14 @@ describe('OscParser', () => { let originalPayloadLimit: number; beforeEach(() => { - const handlerConstructor = OscHandler as unknown as { PAYLOAD_LIMIT: number }; - originalPayloadLimit = handlerConstructor.PAYLOAD_LIMIT; - handlerConstructor.PAYLOAD_LIMIT = TEST_PAYLOAD_LIMIT; + const handlerConstructor = OscHandler as unknown as { _payloadLimit: number }; + originalPayloadLimit = handlerConstructor._payloadLimit; + handlerConstructor._payloadLimit = TEST_PAYLOAD_LIMIT; }); afterEach(() => { - const handlerConstructor = OscHandler as unknown as { PAYLOAD_LIMIT: number }; - handlerConstructor.PAYLOAD_LIMIT = originalPayloadLimit; + const handlerConstructor = OscHandler as unknown as { _payloadLimit: number }; + handlerConstructor._payloadLimit = originalPayloadLimit; }); it('should be called once on end(true)', () => { diff --git a/src/common/parser/OscParser.ts b/src/common/parser/OscParser.ts index ff85d874..1f0c8cb2 100644 --- a/src/common/parser/OscParser.ts +++ b/src/common/parser/OscParser.ts @@ -192,7 +192,7 @@ export class OscParser implements IOscParser { * as OSC handlers. */ export class OscHandler implements IOscHandler { - private static PAYLOAD_LIMIT = ParserConstants.PAYLOAD_LIMIT; + private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT; private _data = ''; private _hitLimit: boolean = false; @@ -209,7 +209,7 @@ export class OscHandler implements IOscHandler { return; } this._data += utf32ToString(data, start, end); - if (this._data.length > OscHandler.PAYLOAD_LIMIT) { + if (this._data.length > OscHandler._payloadLimit) { this._data = ''; this._hitLimit = true; }