@xterm/xterm 6.1.0-beta.28 → 6.1.0-beta.280
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 +62 -38
- package/css/xterm.css +29 -22
- package/lib/xterm.js +1 -1
- package/lib/xterm.js.map +1 -1
- package/lib/xterm.mjs +8 -34
- package/lib/xterm.mjs.map +4 -4
- package/package.json +56 -45
- package/src/browser/AccessibilityManager.ts +18 -13
- package/src/browser/Clipboard.ts +8 -5
- package/src/browser/ColorContrastCache.ts +3 -3
- package/src/browser/CoreBrowserTerminal.ts +179 -348
- package/src/browser/Dom.ts +178 -0
- package/src/browser/Linkifier.ts +14 -14
- package/src/browser/OscLinkProvider.ts +86 -18
- package/src/browser/RenderDebouncer.ts +7 -9
- package/src/browser/TimeBasedDebouncer.ts +12 -5
- package/src/browser/Types.ts +16 -14
- package/src/browser/Viewport.ts +58 -23
- package/src/browser/decorations/BufferDecorationRenderer.ts +3 -3
- package/src/browser/decorations/ColorZoneStore.ts +1 -1
- package/src/browser/decorations/OverviewRulerRenderer.ts +36 -20
- package/src/browser/input/CompositionHelper.ts +47 -11
- package/src/browser/input/Mouse.ts +5 -9
- package/src/browser/input/MoveToCell.ts +3 -3
- package/src/browser/public/Terminal.ts +33 -36
- package/src/browser/renderer/dom/DomRenderer.ts +265 -89
- package/src/browser/renderer/dom/DomRendererRowFactory.ts +34 -27
- package/src/browser/renderer/dom/WidthCache.ts +57 -55
- package/src/browser/renderer/shared/Constants.ts +7 -0
- package/src/browser/renderer/shared/RendererUtils.ts +1 -1
- package/src/browser/renderer/shared/SelectionRenderModel.ts +2 -2
- package/src/browser/renderer/shared/TextBlinkStateManager.ts +97 -0
- package/src/browser/renderer/shared/Types.ts +10 -4
- package/src/browser/scrollable/abstractScrollbar.ts +300 -0
- package/src/browser/scrollable/fastDomNode.ts +126 -0
- package/src/browser/scrollable/globalPointerMoveMonitor.ts +90 -0
- package/src/browser/scrollable/horizontalScrollbar.ts +85 -0
- package/src/browser/scrollable/mouseEvent.ts +292 -0
- package/src/browser/scrollable/scrollable.ts +486 -0
- package/src/browser/scrollable/scrollableElement.ts +581 -0
- package/src/browser/scrollable/scrollableElementOptions.ts +161 -0
- package/src/browser/scrollable/scrollbarArrow.ts +110 -0
- package/src/browser/scrollable/scrollbarState.ts +246 -0
- package/src/browser/scrollable/scrollbarVisibilityController.ts +113 -0
- package/src/browser/scrollable/touch.ts +485 -0
- package/src/browser/scrollable/verticalScrollbar.ts +143 -0
- package/src/browser/scrollable/widget.ts +23 -0
- package/src/browser/selection/SelectionModel.ts +1 -1
- package/src/browser/services/CharSizeService.ts +4 -4
- package/src/browser/services/CharacterJoinerService.ts +13 -11
- package/src/browser/services/CoreBrowserService.ts +7 -5
- package/src/browser/services/KeyboardService.ts +67 -0
- package/src/browser/services/LinkProviderService.ts +3 -3
- package/src/browser/services/MouseCoordsService.ts +47 -0
- package/src/browser/services/MouseService.ts +619 -23
- package/src/browser/services/RenderService.ts +33 -21
- package/src/browser/services/SelectionService.ts +72 -54
- package/src/browser/services/Services.ts +44 -21
- package/src/browser/services/ThemeService.ts +9 -9
- package/src/common/Async.ts +141 -0
- package/src/common/CircularList.ts +24 -3
- package/src/common/Color.ts +13 -5
- package/src/common/CoreTerminal.ts +61 -35
- package/src/common/Event.ts +118 -0
- package/src/common/InputHandler.ts +286 -105
- package/src/common/Lifecycle.ts +113 -0
- package/src/common/Platform.ts +15 -5
- package/src/common/SortedList.ts +8 -4
- package/src/common/StringBuilder.ts +67 -0
- package/src/common/TaskQueue.ts +17 -8
- package/src/common/Types.ts +68 -206
- package/src/common/Version.ts +1 -1
- package/src/common/WindowsMode.ts +2 -2
- package/src/common/buffer/AttributeData.ts +3 -2
- package/src/common/buffer/Buffer.ts +47 -32
- package/src/common/buffer/BufferLine.ts +175 -100
- package/src/common/buffer/BufferLineStringCache.ts +69 -0
- package/src/common/buffer/BufferReflow.ts +7 -4
- package/src/common/buffer/BufferSet.ts +13 -9
- package/src/common/buffer/CellData.ts +61 -4
- package/src/common/buffer/Constants.ts +13 -13
- package/src/common/buffer/Marker.ts +4 -4
- package/src/common/buffer/Types.ts +153 -3
- package/src/common/data/Charsets.ts +4 -7
- package/src/common/data/EscapeSequences.ts +71 -70
- package/src/common/input/Keyboard.ts +17 -10
- package/src/common/input/KittyKeyboard.ts +526 -0
- package/src/common/input/TextDecoder.ts +3 -3
- package/src/common/input/UnicodeV6.ts +3 -2
- package/src/common/input/Win32InputMode.ts +297 -0
- package/src/common/input/WriteBuffer.ts +108 -39
- package/src/common/input/XParseColor.ts +2 -2
- package/src/common/parser/ApcParser.ts +196 -0
- package/src/common/parser/Constants.ts +14 -4
- package/src/common/parser/DcsParser.ts +15 -16
- package/src/common/parser/EscapeSequenceParser.ts +214 -72
- package/src/common/parser/OscParser.ts +14 -15
- package/src/common/parser/Params.ts +31 -12
- package/src/common/parser/Types.ts +40 -30
- package/src/common/public/BufferApiView.ts +3 -3
- package/src/common/public/BufferLineApiView.ts +4 -4
- package/src/common/public/BufferNamespaceApi.ts +5 -5
- package/src/common/public/ParserApi.ts +5 -2
- package/src/common/public/UnicodeApi.ts +1 -1
- package/src/common/services/BufferService.ts +17 -13
- package/src/common/services/CharsetService.ts +6 -2
- package/src/common/services/CoreService.ts +23 -10
- package/src/common/services/DecorationService.ts +260 -15
- package/src/common/services/InstantiationService.ts +2 -2
- package/src/common/services/LogService.ts +2 -32
- package/src/common/services/{CoreMouseService.ts → MouseStateService.ts} +22 -133
- package/src/common/services/OptionsService.ts +17 -7
- package/src/common/services/OscLinkService.ts +3 -2
- package/src/common/services/ServiceRegistry.ts +14 -8
- package/src/common/services/Services.ts +54 -50
- package/src/common/services/UnicodeService.ts +6 -11
- package/typings/xterm.d.ts +329 -34
- package/src/common/Clone.ts +0 -23
- package/src/common/TypedArrayUtils.ts +0 -17
- package/src/vs/base/browser/browser.ts +0 -141
- package/src/vs/base/browser/canIUse.ts +0 -49
- package/src/vs/base/browser/dom.ts +0 -2369
- package/src/vs/base/browser/fastDomNode.ts +0 -316
- package/src/vs/base/browser/globalPointerMoveMonitor.ts +0 -112
- package/src/vs/base/browser/iframe.ts +0 -135
- package/src/vs/base/browser/keyboardEvent.ts +0 -213
- package/src/vs/base/browser/mouseEvent.ts +0 -229
- package/src/vs/base/browser/touch.ts +0 -372
- package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +0 -303
- package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +0 -114
- package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +0 -720
- package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +0 -165
- package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +0 -114
- package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +0 -243
- package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +0 -118
- package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +0 -116
- package/src/vs/base/browser/ui/widget.ts +0 -57
- package/src/vs/base/browser/window.ts +0 -14
- package/src/vs/base/common/arrays.ts +0 -887
- package/src/vs/base/common/arraysFind.ts +0 -202
- package/src/vs/base/common/assert.ts +0 -71
- package/src/vs/base/common/async.ts +0 -1992
- package/src/vs/base/common/cancellation.ts +0 -148
- package/src/vs/base/common/charCode.ts +0 -450
- package/src/vs/base/common/collections.ts +0 -140
- package/src/vs/base/common/decorators.ts +0 -130
- package/src/vs/base/common/equals.ts +0 -146
- package/src/vs/base/common/errors.ts +0 -303
- package/src/vs/base/common/event.ts +0 -1778
- package/src/vs/base/common/functional.ts +0 -32
- package/src/vs/base/common/hash.ts +0 -316
- package/src/vs/base/common/iterator.ts +0 -159
- package/src/vs/base/common/keyCodes.ts +0 -526
- package/src/vs/base/common/keybindings.ts +0 -284
- package/src/vs/base/common/lazy.ts +0 -47
- package/src/vs/base/common/lifecycle.ts +0 -801
- package/src/vs/base/common/linkedList.ts +0 -142
- package/src/vs/base/common/map.ts +0 -202
- package/src/vs/base/common/numbers.ts +0 -98
- package/src/vs/base/common/observable.ts +0 -76
- package/src/vs/base/common/observableInternal/api.ts +0 -31
- package/src/vs/base/common/observableInternal/autorun.ts +0 -281
- package/src/vs/base/common/observableInternal/base.ts +0 -489
- package/src/vs/base/common/observableInternal/debugName.ts +0 -145
- package/src/vs/base/common/observableInternal/derived.ts +0 -428
- package/src/vs/base/common/observableInternal/lazyObservableValue.ts +0 -146
- package/src/vs/base/common/observableInternal/logging.ts +0 -328
- package/src/vs/base/common/observableInternal/promise.ts +0 -209
- package/src/vs/base/common/observableInternal/utils.ts +0 -610
- package/src/vs/base/common/platform.ts +0 -281
- package/src/vs/base/common/scrollable.ts +0 -522
- package/src/vs/base/common/sequence.ts +0 -34
- package/src/vs/base/common/stopwatch.ts +0 -43
- package/src/vs/base/common/strings.ts +0 -557
- package/src/vs/base/common/symbols.ts +0 -9
- package/src/vs/base/common/uint.ts +0 -59
- package/src/vs/patches/nls.ts +0 -90
- package/src/vs/typings/base-common.d.ts +0 -20
- package/src/vs/typings/require.d.ts +0 -42
- package/src/vs/typings/vscode-globals-nls.d.ts +0 -36
- package/src/vs/typings/vscode-globals-product.d.ts +0 -33
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';
|
|
7
|
+
import { ParserConstants } from './Constants';
|
|
8
|
+
import { utf32ToString } from '../input/TextDecoder';
|
|
9
|
+
import { IDisposable } from '../Types';
|
|
10
|
+
import { LimitedStringBuilder } from '../StringBuilder';
|
|
11
|
+
|
|
12
|
+
const EMPTY_HANDLERS: IApcHandler[] = [];
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* APC Parser for handling Application Program Command sequences.
|
|
16
|
+
* APC sequences use the format: ESC _ <identifier><data> ESC \
|
|
17
|
+
*
|
|
18
|
+
* Unlike OSC which uses numeric identifiers (e.g., OSC 1337),
|
|
19
|
+
* APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).
|
|
20
|
+
* The identifier is the character code of the first byte after ESC _.
|
|
21
|
+
*/
|
|
22
|
+
export class ApcParser implements IApcParser {
|
|
23
|
+
private _handlers: IHandlerCollection<IApcHandler> = Object.create(null);
|
|
24
|
+
private _active = EMPTY_HANDLERS;
|
|
25
|
+
private _ident: number = 0;
|
|
26
|
+
private _handlerFb: ApcFallbackHandlerType = () => { };
|
|
27
|
+
private _stack: ISubParserStackState = {
|
|
28
|
+
paused: false,
|
|
29
|
+
loopPosition: 0,
|
|
30
|
+
fallThrough: false
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Register an APC handler for a specific identifier.
|
|
35
|
+
* @param ident The character code of the first byte (e.g., 0x47 for 'G')
|
|
36
|
+
* @param handler The handler to register
|
|
37
|
+
*/
|
|
38
|
+
public registerHandler(ident: number, handler: IApcHandler): IDisposable {
|
|
39
|
+
this._handlers[ident] ??= [];
|
|
40
|
+
const handlerList = this._handlers[ident];
|
|
41
|
+
handlerList.push(handler);
|
|
42
|
+
return {
|
|
43
|
+
dispose: () => {
|
|
44
|
+
const handlerIndex = handlerList.indexOf(handler);
|
|
45
|
+
if (handlerIndex !== -1) {
|
|
46
|
+
handlerList.splice(handlerIndex, 1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public clearHandler(ident: number): void {
|
|
53
|
+
if (this._handlers[ident]) delete this._handlers[ident];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public setHandlerFallback(handler: ApcFallbackHandlerType): void {
|
|
57
|
+
this._handlerFb = handler;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public dispose(): void {
|
|
61
|
+
this._handlers = Object.create(null);
|
|
62
|
+
this._handlerFb = () => { };
|
|
63
|
+
this._active = EMPTY_HANDLERS;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public reset(): void {
|
|
67
|
+
// force cleanup handlers
|
|
68
|
+
if (this._active.length) {
|
|
69
|
+
for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {
|
|
70
|
+
this._active[j].end(false);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
this._stack.paused = false;
|
|
74
|
+
this._active = EMPTY_HANDLERS;
|
|
75
|
+
this._ident = 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public start(ident: number): void {
|
|
79
|
+
// always reset leftover handlers
|
|
80
|
+
this.reset();
|
|
81
|
+
this._ident = ident;
|
|
82
|
+
this._active = this._handlers[ident] || EMPTY_HANDLERS;
|
|
83
|
+
if (!this._active.length) {
|
|
84
|
+
this._handlerFb(this._ident, 'START');
|
|
85
|
+
} else {
|
|
86
|
+
for (let j = this._active.length - 1; j >= 0; j--) {
|
|
87
|
+
this._active[j].start();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public put(data: Uint32Array, start: number, end: number): void {
|
|
93
|
+
if (!this._active.length) {
|
|
94
|
+
this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));
|
|
95
|
+
} else {
|
|
96
|
+
for (let j = this._active.length - 1; j >= 0; j--) {
|
|
97
|
+
this._active[j].put(data, start, end);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Indicates end of an APC command.
|
|
104
|
+
* Whether the APC got aborted or finished normally
|
|
105
|
+
* is indicated by `success`.
|
|
106
|
+
*/
|
|
107
|
+
public end(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {
|
|
108
|
+
if (!this._active.length) {
|
|
109
|
+
this._handlerFb(this._ident, 'END', success);
|
|
110
|
+
} else {
|
|
111
|
+
let handlerResult: boolean | Promise<boolean> = false;
|
|
112
|
+
let j = this._active.length - 1;
|
|
113
|
+
let fallThrough = false;
|
|
114
|
+
if (this._stack.paused) {
|
|
115
|
+
j = this._stack.loopPosition - 1;
|
|
116
|
+
handlerResult = promiseResult;
|
|
117
|
+
fallThrough = this._stack.fallThrough;
|
|
118
|
+
this._stack.paused = false;
|
|
119
|
+
}
|
|
120
|
+
if (!fallThrough && handlerResult === false) {
|
|
121
|
+
for (; j >= 0; j--) {
|
|
122
|
+
handlerResult = this._active[j].end(success);
|
|
123
|
+
if (handlerResult === true) {
|
|
124
|
+
break;
|
|
125
|
+
} else if (handlerResult instanceof Promise) {
|
|
126
|
+
this._stack.paused = true;
|
|
127
|
+
this._stack.loopPosition = j;
|
|
128
|
+
this._stack.fallThrough = false;
|
|
129
|
+
return handlerResult;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
j--;
|
|
133
|
+
}
|
|
134
|
+
// cleanup left over handlers (fallThrough for async)
|
|
135
|
+
for (; j >= 0; j--) {
|
|
136
|
+
handlerResult = this._active[j].end(false);
|
|
137
|
+
if (handlerResult instanceof Promise) {
|
|
138
|
+
this._stack.paused = true;
|
|
139
|
+
this._stack.loopPosition = j;
|
|
140
|
+
this._stack.fallThrough = true;
|
|
141
|
+
return handlerResult;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
this._active = EMPTY_HANDLERS;
|
|
146
|
+
this._ident = 0;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Convenient class to allow attaching string based handler functions
|
|
152
|
+
* as APC handlers.
|
|
153
|
+
*/
|
|
154
|
+
export class ApcHandler implements IApcHandler {
|
|
155
|
+
private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;
|
|
156
|
+
|
|
157
|
+
private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);
|
|
158
|
+
private _hitLimit: boolean = false;
|
|
159
|
+
|
|
160
|
+
constructor(private _handler: (data: string) => boolean | Promise<boolean>) { }
|
|
161
|
+
|
|
162
|
+
public start(): void {
|
|
163
|
+
this._data.reset();
|
|
164
|
+
this._hitLimit = false;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
public put(data: Uint32Array, start: number, end: number): void {
|
|
168
|
+
if (this._hitLimit) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (this._data.append(utf32ToString(data, start, end))) {
|
|
172
|
+
this._hitLimit = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public end(success: boolean): boolean | Promise<boolean> {
|
|
177
|
+
let ret: boolean | Promise<boolean> = false;
|
|
178
|
+
if (this._hitLimit) {
|
|
179
|
+
ret = false;
|
|
180
|
+
} else if (success) {
|
|
181
|
+
ret = this._handler(this._data.toString());
|
|
182
|
+
if (ret instanceof Promise) {
|
|
183
|
+
// need to hold data until `ret` got resolved
|
|
184
|
+
// dont care for errors, data will be freed anyway on next start
|
|
185
|
+
return ret.then(res => {
|
|
186
|
+
this._data.reset();
|
|
187
|
+
this._hitLimit = false;
|
|
188
|
+
return res;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
this._data.reset();
|
|
193
|
+
this._hitLimit = false;
|
|
194
|
+
return ret;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -14,13 +14,18 @@ export const enum ParserState {
|
|
|
14
14
|
CSI_PARAM = 4,
|
|
15
15
|
CSI_INTERMEDIATE = 5,
|
|
16
16
|
CSI_IGNORE = 6,
|
|
17
|
-
|
|
17
|
+
SOS_PM_STRING = 7,
|
|
18
18
|
OSC_STRING = 8,
|
|
19
19
|
DCS_ENTRY = 9,
|
|
20
20
|
DCS_PARAM = 10,
|
|
21
21
|
DCS_IGNORE = 11,
|
|
22
22
|
DCS_INTERMEDIATE = 12,
|
|
23
|
-
DCS_PASSTHROUGH = 13
|
|
23
|
+
DCS_PASSTHROUGH = 13,
|
|
24
|
+
APC_ENTRY = 14,
|
|
25
|
+
APC_INTERMEDIATE = 15,
|
|
26
|
+
APC_PASSTHROUGH = 16,
|
|
27
|
+
// Number of states, meaning LAST_STATE + 1.
|
|
28
|
+
STATE_LENGTH = 17
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
/**
|
|
@@ -41,7 +46,10 @@ export const enum ParserAction {
|
|
|
41
46
|
CLEAR = 11,
|
|
42
47
|
DCS_HOOK = 12,
|
|
43
48
|
DCS_PUT = 13,
|
|
44
|
-
DCS_UNHOOK = 14
|
|
49
|
+
DCS_UNHOOK = 14,
|
|
50
|
+
APC_START = 15,
|
|
51
|
+
APC_PUT = 16,
|
|
52
|
+
APC_END = 17
|
|
45
53
|
}
|
|
46
54
|
|
|
47
55
|
/**
|
|
@@ -55,4 +63,6 @@ export const enum OscState {
|
|
|
55
63
|
}
|
|
56
64
|
|
|
57
65
|
// payload limit for OSC and DCS
|
|
58
|
-
export const
|
|
66
|
+
export const enum ParserConstants {
|
|
67
|
+
PAYLOAD_LIMIT = 10000000
|
|
68
|
+
}
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* @license MIT
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { IDisposable } from '
|
|
7
|
-
import { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from '
|
|
8
|
-
import { utf32ToString } from '
|
|
9
|
-
import { Params } from '
|
|
10
|
-
import {
|
|
6
|
+
import { IDisposable } from '../Types';
|
|
7
|
+
import { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';
|
|
8
|
+
import { utf32ToString } from '../input/TextDecoder';
|
|
9
|
+
import { Params } from './Params';
|
|
10
|
+
import { ParserConstants } from './Constants';
|
|
11
|
+
import { LimitedStringBuilder } from '../StringBuilder';
|
|
11
12
|
|
|
12
13
|
const EMPTY_HANDLERS: IDcsHandler[] = [];
|
|
13
14
|
|
|
@@ -29,9 +30,7 @@ export class DcsParser implements IDcsParser {
|
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
public registerHandler(ident: number, handler: IDcsHandler): IDisposable {
|
|
32
|
-
|
|
33
|
-
this._handlers[ident] = [];
|
|
34
|
-
}
|
|
33
|
+
this._handlers[ident] ??= [];
|
|
35
34
|
const handlerList = this._handlers[ident];
|
|
36
35
|
handlerList.push(handler);
|
|
37
36
|
return {
|
|
@@ -140,7 +139,9 @@ EMPTY_PARAMS.addParam(0);
|
|
|
140
139
|
* Note: The payload is currently limited to 50 MB (hardcoded).
|
|
141
140
|
*/
|
|
142
141
|
export class DcsHandler implements IDcsHandler {
|
|
143
|
-
private
|
|
142
|
+
private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;
|
|
143
|
+
|
|
144
|
+
private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);
|
|
144
145
|
private _params: IParams = EMPTY_PARAMS;
|
|
145
146
|
private _hitLimit: boolean = false;
|
|
146
147
|
|
|
@@ -152,7 +153,7 @@ export class DcsHandler implements IDcsHandler {
|
|
|
152
153
|
// perf optimization:
|
|
153
154
|
// clone only, if we have non empty params, otherwise stick with default
|
|
154
155
|
this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;
|
|
155
|
-
this._data
|
|
156
|
+
this._data.reset();
|
|
156
157
|
this._hitLimit = false;
|
|
157
158
|
}
|
|
158
159
|
|
|
@@ -160,9 +161,7 @@ export class DcsHandler implements IDcsHandler {
|
|
|
160
161
|
if (this._hitLimit) {
|
|
161
162
|
return;
|
|
162
163
|
}
|
|
163
|
-
this._data
|
|
164
|
-
if (this._data.length > PAYLOAD_LIMIT) {
|
|
165
|
-
this._data = '';
|
|
164
|
+
if (this._data.append(utf32ToString(data, start, end))) {
|
|
166
165
|
this._hitLimit = true;
|
|
167
166
|
}
|
|
168
167
|
}
|
|
@@ -172,20 +171,20 @@ export class DcsHandler implements IDcsHandler {
|
|
|
172
171
|
if (this._hitLimit) {
|
|
173
172
|
ret = false;
|
|
174
173
|
} else if (success) {
|
|
175
|
-
ret = this._handler(this._data, this._params);
|
|
174
|
+
ret = this._handler(this._data.toString(), this._params);
|
|
176
175
|
if (ret instanceof Promise) {
|
|
177
176
|
// need to hold data and params until `ret` got resolved
|
|
178
177
|
// dont care for errors, data will be freed anyway on next start
|
|
179
178
|
return ret.then(res => {
|
|
180
179
|
this._params = EMPTY_PARAMS;
|
|
181
|
-
this._data
|
|
180
|
+
this._data.reset();
|
|
182
181
|
this._hitLimit = false;
|
|
183
182
|
return res;
|
|
184
183
|
});
|
|
185
184
|
}
|
|
186
185
|
}
|
|
187
186
|
this._params = EMPTY_PARAMS;
|
|
188
|
-
this._data
|
|
187
|
+
this._data.reset();
|
|
189
188
|
this._hitLimit = false;
|
|
190
189
|
return ret;
|
|
191
190
|
}
|