@wendongfly/myhi 1.0.2 → 1.0.3
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/dist/index.js +1 -1
- package/dist/lib/xterm/LICENSE +21 -0
- package/dist/lib/xterm/README.md +225 -0
- package/dist/lib/xterm/css/xterm.css +190 -0
- package/dist/lib/xterm/lib/xterm.js +2 -0
- package/dist/lib/xterm/lib/xterm.js.map +1 -0
- package/dist/lib/xterm/package.json +90 -0
- package/dist/lib/xterm/src/browser/AccessibilityManager.ts +301 -0
- package/dist/lib/xterm/src/browser/Clipboard.ts +99 -0
- package/dist/lib/xterm/src/browser/ColorContrastCache.ts +39 -0
- package/dist/lib/xterm/src/browser/ColorManager.ts +268 -0
- package/dist/lib/xterm/src/browser/Dom.ts +10 -0
- package/dist/lib/xterm/src/browser/Lifecycle.ts +30 -0
- package/dist/lib/xterm/src/browser/Linkifier.ts +356 -0
- package/dist/lib/xterm/src/browser/Linkifier2.ts +397 -0
- package/dist/lib/xterm/src/browser/LocalizableStrings.ts +10 -0
- package/dist/lib/xterm/src/browser/MouseZoneManager.ts +236 -0
- package/dist/lib/xterm/src/browser/RenderDebouncer.ts +82 -0
- package/dist/lib/xterm/src/browser/ScreenDprMonitor.ts +69 -0
- package/dist/lib/xterm/src/browser/Terminal.ts +1447 -0
- package/dist/lib/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
- package/dist/lib/xterm/src/browser/Types.d.ts +317 -0
- package/dist/lib/xterm/src/browser/Viewport.ts +276 -0
- package/dist/lib/xterm/src/browser/decorations/BufferDecorationRenderer.ts +131 -0
- package/dist/lib/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
- package/dist/lib/xterm/src/browser/decorations/OverviewRulerRenderer.ts +228 -0
- package/dist/lib/xterm/src/browser/input/CompositionHelper.ts +237 -0
- package/dist/lib/xterm/src/browser/input/Mouse.ts +64 -0
- package/dist/lib/xterm/src/browser/input/MoveToCell.ts +249 -0
- package/dist/lib/xterm/src/browser/public/Terminal.ts +298 -0
- package/dist/lib/xterm/src/browser/renderer/BaseRenderLayer.ts +582 -0
- package/dist/lib/xterm/src/browser/renderer/CursorRenderLayer.ts +378 -0
- package/dist/lib/xterm/src/browser/renderer/CustomGlyphs.ts +632 -0
- package/dist/lib/xterm/src/browser/renderer/GridCache.ts +33 -0
- package/dist/lib/xterm/src/browser/renderer/LinkRenderLayer.ts +84 -0
- package/dist/lib/xterm/src/browser/renderer/Renderer.ts +219 -0
- package/dist/lib/xterm/src/browser/renderer/RendererUtils.ts +26 -0
- package/dist/lib/xterm/src/browser/renderer/SelectionRenderLayer.ts +131 -0
- package/dist/lib/xterm/src/browser/renderer/TextRenderLayer.ts +344 -0
- package/dist/lib/xterm/src/browser/renderer/Types.d.ts +109 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/BaseCharAtlas.ts +58 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasCache.ts +95 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasUtils.ts +54 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/Constants.ts +15 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/DynamicCharAtlas.ts +404 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/LRUMap.ts +136 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/Types.d.ts +29 -0
- package/dist/lib/xterm/src/browser/renderer/dom/DomRenderer.ts +403 -0
- package/dist/lib/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +344 -0
- package/dist/lib/xterm/src/browser/selection/SelectionModel.ts +144 -0
- package/dist/lib/xterm/src/browser/selection/Types.d.ts +15 -0
- package/dist/lib/xterm/src/browser/services/CharSizeService.ts +87 -0
- package/dist/lib/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
- package/dist/lib/xterm/src/browser/services/CoreBrowserService.ts +20 -0
- package/dist/lib/xterm/src/browser/services/MouseService.ts +36 -0
- package/dist/lib/xterm/src/browser/services/RenderService.ts +237 -0
- package/dist/lib/xterm/src/browser/services/SelectionService.ts +1027 -0
- package/dist/lib/xterm/src/browser/services/Services.ts +123 -0
- package/dist/lib/xterm/src/browser/services/SoundService.ts +63 -0
- package/dist/lib/xterm/src/common/CircularList.ts +239 -0
- package/dist/lib/xterm/src/common/Clone.ts +23 -0
- package/dist/lib/xterm/src/common/Color.ts +285 -0
- package/dist/lib/xterm/src/common/CoreTerminal.ts +300 -0
- package/dist/lib/xterm/src/common/EventEmitter.ts +69 -0
- package/dist/lib/xterm/src/common/InputHandler.ts +3230 -0
- package/dist/lib/xterm/src/common/Lifecycle.ts +68 -0
- package/dist/lib/xterm/src/common/Platform.ts +31 -0
- package/dist/lib/xterm/src/common/SortedList.ts +88 -0
- package/dist/lib/xterm/src/common/TypedArrayUtils.ts +50 -0
- package/dist/lib/xterm/src/common/Types.d.ts +489 -0
- package/dist/lib/xterm/src/common/WindowsMode.ts +27 -0
- package/dist/lib/xterm/src/common/buffer/AttributeData.ts +148 -0
- package/dist/lib/xterm/src/common/buffer/Buffer.ts +711 -0
- package/dist/lib/xterm/src/common/buffer/BufferLine.ts +441 -0
- package/dist/lib/xterm/src/common/buffer/BufferRange.ts +13 -0
- package/dist/lib/xterm/src/common/buffer/BufferReflow.ts +220 -0
- package/dist/lib/xterm/src/common/buffer/BufferSet.ts +131 -0
- package/dist/lib/xterm/src/common/buffer/CellData.ts +94 -0
- package/dist/lib/xterm/src/common/buffer/Constants.ts +139 -0
- package/dist/lib/xterm/src/common/buffer/Marker.ts +37 -0
- package/dist/lib/xterm/src/common/buffer/Types.d.ts +64 -0
- package/dist/lib/xterm/src/common/data/Charsets.ts +256 -0
- package/dist/lib/xterm/src/common/data/EscapeSequences.ts +153 -0
- package/dist/lib/xterm/src/common/input/Keyboard.ts +398 -0
- package/dist/lib/xterm/src/common/input/TextDecoder.ts +346 -0
- package/dist/lib/xterm/src/common/input/UnicodeV6.ts +133 -0
- package/dist/lib/xterm/src/common/input/WriteBuffer.ts +229 -0
- package/dist/lib/xterm/src/common/input/XParseColor.ts +80 -0
- package/dist/lib/xterm/src/common/parser/Constants.ts +58 -0
- package/dist/lib/xterm/src/common/parser/DcsParser.ts +192 -0
- package/dist/lib/xterm/src/common/parser/EscapeSequenceParser.ts +796 -0
- package/dist/lib/xterm/src/common/parser/OscParser.ts +238 -0
- package/dist/lib/xterm/src/common/parser/Params.ts +229 -0
- package/dist/lib/xterm/src/common/parser/Types.d.ts +274 -0
- package/dist/lib/xterm/src/common/public/AddonManager.ts +56 -0
- package/dist/lib/xterm/src/common/public/BufferApiView.ts +35 -0
- package/dist/lib/xterm/src/common/public/BufferLineApiView.ts +29 -0
- package/dist/lib/xterm/src/common/public/BufferNamespaceApi.ts +33 -0
- package/dist/lib/xterm/src/common/public/ParserApi.ts +37 -0
- package/dist/lib/xterm/src/common/public/UnicodeApi.ts +27 -0
- package/dist/lib/xterm/src/common/services/BufferService.ts +185 -0
- package/dist/lib/xterm/src/common/services/CharsetService.ts +34 -0
- package/dist/lib/xterm/src/common/services/CoreMouseService.ts +309 -0
- package/dist/lib/xterm/src/common/services/CoreService.ts +92 -0
- package/dist/lib/xterm/src/common/services/DecorationService.ts +139 -0
- package/dist/lib/xterm/src/common/services/DirtyRowService.ts +53 -0
- package/dist/lib/xterm/src/common/services/InstantiationService.ts +83 -0
- package/dist/lib/xterm/src/common/services/LogService.ts +88 -0
- package/dist/lib/xterm/src/common/services/OptionsService.ts +178 -0
- package/dist/lib/xterm/src/common/services/ServiceRegistry.ts +49 -0
- package/dist/lib/xterm/src/common/services/Services.ts +323 -0
- package/dist/lib/xterm/src/common/services/UnicodeService.ts +82 -0
- package/dist/lib/xterm/src/headless/Terminal.ts +170 -0
- package/dist/lib/xterm/src/headless/Types.d.ts +31 -0
- package/dist/lib/xterm/src/headless/public/Terminal.ts +216 -0
- package/dist/lib/xterm/typings/xterm.d.ts +1872 -0
- package/dist/lib/xterm-fit/LICENSE +19 -0
- package/dist/lib/xterm-fit/README.md +24 -0
- package/dist/lib/xterm-fit/lib/xterm-addon-fit.js +2 -0
- package/dist/lib/xterm-fit/lib/xterm-addon-fit.js.map +1 -0
- package/dist/lib/xterm-fit/out/FitAddon.js +58 -0
- package/dist/lib/xterm-fit/out/FitAddon.js.map +1 -0
- package/dist/lib/xterm-fit/out-test/FitAddon.api.js.map +1 -0
- package/dist/lib/xterm-fit/package.json +21 -0
- package/dist/lib/xterm-fit/src/FitAddon.ts +86 -0
- package/dist/lib/xterm-fit/typings/xterm-addon-fit.d.ts +55 -0
- package/dist/lib/xterm-links/LICENSE +19 -0
- package/dist/lib/xterm-links/README.md +21 -0
- package/dist/lib/xterm-links/lib/xterm-addon-web-links.js +2 -0
- package/dist/lib/xterm-links/lib/xterm-addon-web-links.js.map +1 -0
- package/dist/lib/xterm-links/package.json +26 -0
- package/dist/lib/xterm-links/src/WebLinkProvider.ts +145 -0
- package/dist/lib/xterm-links/src/WebLinksAddon.ts +77 -0
- package/dist/lib/xterm-links/typings/xterm-addon-web-links.d.ts +58 -0
- package/package.json +1 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2021 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)
|
|
8
|
+
const RGB_REX = /^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/;
|
|
9
|
+
// '#...' rule - matching any hex digits
|
|
10
|
+
const HASH_REX = /^[\da-f]+$/;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Parse color spec to RGB values (8 bit per channel).
|
|
14
|
+
* See `man xparsecolor` for details about certain format specifications.
|
|
15
|
+
*
|
|
16
|
+
* Supported formats:
|
|
17
|
+
* - rgb:<red>/<green>/<blue> with <red>, <green>, <blue> in h | hh | hhh | hhhh
|
|
18
|
+
* - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB
|
|
19
|
+
*
|
|
20
|
+
* All other formats like rgbi: or device-independent string specifications
|
|
21
|
+
* with float numbering are not supported.
|
|
22
|
+
*/
|
|
23
|
+
export function parseColor(data: string): [number, number, number] | undefined {
|
|
24
|
+
if (!data) return;
|
|
25
|
+
// also handle uppercases
|
|
26
|
+
let low = data.toLowerCase();
|
|
27
|
+
if (low.indexOf('rgb:') === 0) {
|
|
28
|
+
// 'rgb:' specifier
|
|
29
|
+
low = low.slice(4);
|
|
30
|
+
const m = RGB_REX.exec(low);
|
|
31
|
+
if (m) {
|
|
32
|
+
const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;
|
|
33
|
+
return [
|
|
34
|
+
Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),
|
|
35
|
+
Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),
|
|
36
|
+
Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
} else if (low.indexOf('#') === 0) {
|
|
40
|
+
// '#' specifier
|
|
41
|
+
low = low.slice(1);
|
|
42
|
+
if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {
|
|
43
|
+
const adv = low.length / 3;
|
|
44
|
+
const result: [number, number, number] = [0, 0, 0];
|
|
45
|
+
for (let i = 0; i < 3; ++i) {
|
|
46
|
+
const c = parseInt(low.slice(adv * i, adv * i + adv), 16);
|
|
47
|
+
result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Named colors are currently not supported due to the large addition to the xterm.js bundle size
|
|
54
|
+
// they would add. In order to support named colors, we would need some way of optionally loading
|
|
55
|
+
// additional payloads so startup/download time is not bloated (see #3530).
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// pad hex output to requested bit width
|
|
59
|
+
function pad(n: number, bits: number): string {
|
|
60
|
+
const s = n.toString(16);
|
|
61
|
+
const s2 = s.length < 2 ? '0' + s : s;
|
|
62
|
+
switch (bits) {
|
|
63
|
+
case 4:
|
|
64
|
+
return s[0];
|
|
65
|
+
case 8:
|
|
66
|
+
return s2;
|
|
67
|
+
case 12:
|
|
68
|
+
return (s2 + s2).slice(0, 3);
|
|
69
|
+
default:
|
|
70
|
+
return s2 + s2;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Convert a given color to rgb:../../.. string of `bits` depth.
|
|
76
|
+
*/
|
|
77
|
+
export function toRgbString(color: [number, number, number], bits: number = 16): string {
|
|
78
|
+
const [r, g, b] = color;
|
|
79
|
+
return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;
|
|
80
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2017 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Internal states of EscapeSequenceParser.
|
|
8
|
+
*/
|
|
9
|
+
export const enum ParserState {
|
|
10
|
+
GROUND = 0,
|
|
11
|
+
ESCAPE = 1,
|
|
12
|
+
ESCAPE_INTERMEDIATE = 2,
|
|
13
|
+
CSI_ENTRY = 3,
|
|
14
|
+
CSI_PARAM = 4,
|
|
15
|
+
CSI_INTERMEDIATE = 5,
|
|
16
|
+
CSI_IGNORE = 6,
|
|
17
|
+
SOS_PM_APC_STRING = 7,
|
|
18
|
+
OSC_STRING = 8,
|
|
19
|
+
DCS_ENTRY = 9,
|
|
20
|
+
DCS_PARAM = 10,
|
|
21
|
+
DCS_IGNORE = 11,
|
|
22
|
+
DCS_INTERMEDIATE = 12,
|
|
23
|
+
DCS_PASSTHROUGH = 13
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Internal actions of EscapeSequenceParser.
|
|
28
|
+
*/
|
|
29
|
+
export const enum ParserAction {
|
|
30
|
+
IGNORE = 0,
|
|
31
|
+
ERROR = 1,
|
|
32
|
+
PRINT = 2,
|
|
33
|
+
EXECUTE = 3,
|
|
34
|
+
OSC_START = 4,
|
|
35
|
+
OSC_PUT = 5,
|
|
36
|
+
OSC_END = 6,
|
|
37
|
+
CSI_DISPATCH = 7,
|
|
38
|
+
PARAM = 8,
|
|
39
|
+
COLLECT = 9,
|
|
40
|
+
ESC_DISPATCH = 10,
|
|
41
|
+
CLEAR = 11,
|
|
42
|
+
DCS_HOOK = 12,
|
|
43
|
+
DCS_PUT = 13,
|
|
44
|
+
DCS_UNHOOK = 14
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Internal states of OscParser.
|
|
49
|
+
*/
|
|
50
|
+
export const enum OscState {
|
|
51
|
+
START = 0,
|
|
52
|
+
ID = 1,
|
|
53
|
+
PAYLOAD = 2,
|
|
54
|
+
ABORT = 3
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// payload limit for OSC and DCS
|
|
58
|
+
export const PAYLOAD_LIMIT = 10000000;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IDisposable } from 'common/Types';
|
|
7
|
+
import { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';
|
|
8
|
+
import { utf32ToString } from 'common/input/TextDecoder';
|
|
9
|
+
import { Params } from 'common/parser/Params';
|
|
10
|
+
import { PAYLOAD_LIMIT } from 'common/parser/Constants';
|
|
11
|
+
|
|
12
|
+
const EMPTY_HANDLERS: IDcsHandler[] = [];
|
|
13
|
+
|
|
14
|
+
export class DcsParser implements IDcsParser {
|
|
15
|
+
private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);
|
|
16
|
+
private _active: IDcsHandler[] = EMPTY_HANDLERS;
|
|
17
|
+
private _ident: number = 0;
|
|
18
|
+
private _handlerFb: DcsFallbackHandlerType = () => { };
|
|
19
|
+
private _stack: ISubParserStackState = {
|
|
20
|
+
paused: false,
|
|
21
|
+
loopPosition: 0,
|
|
22
|
+
fallThrough: false
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
public dispose(): void {
|
|
26
|
+
this._handlers = Object.create(null);
|
|
27
|
+
this._handlerFb = () => { };
|
|
28
|
+
this._active = EMPTY_HANDLERS;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public registerHandler(ident: number, handler: IDcsHandler): IDisposable {
|
|
32
|
+
if (this._handlers[ident] === undefined) {
|
|
33
|
+
this._handlers[ident] = [];
|
|
34
|
+
}
|
|
35
|
+
const handlerList = this._handlers[ident];
|
|
36
|
+
handlerList.push(handler);
|
|
37
|
+
return {
|
|
38
|
+
dispose: () => {
|
|
39
|
+
const handlerIndex = handlerList.indexOf(handler);
|
|
40
|
+
if (handlerIndex !== -1) {
|
|
41
|
+
handlerList.splice(handlerIndex, 1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public clearHandler(ident: number): void {
|
|
48
|
+
if (this._handlers[ident]) delete this._handlers[ident];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public setHandlerFallback(handler: DcsFallbackHandlerType): void {
|
|
52
|
+
this._handlerFb = handler;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public reset(): void {
|
|
56
|
+
// force cleanup leftover handlers
|
|
57
|
+
if (this._active.length) {
|
|
58
|
+
for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {
|
|
59
|
+
this._active[j].unhook(false);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
this._stack.paused = false;
|
|
63
|
+
this._active = EMPTY_HANDLERS;
|
|
64
|
+
this._ident = 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public hook(ident: number, params: IParams): void {
|
|
68
|
+
// always reset leftover handlers
|
|
69
|
+
this.reset();
|
|
70
|
+
this._ident = ident;
|
|
71
|
+
this._active = this._handlers[ident] || EMPTY_HANDLERS;
|
|
72
|
+
if (!this._active.length) {
|
|
73
|
+
this._handlerFb(this._ident, 'HOOK', params);
|
|
74
|
+
} else {
|
|
75
|
+
for (let j = this._active.length - 1; j >= 0; j--) {
|
|
76
|
+
this._active[j].hook(params);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public put(data: Uint32Array, start: number, end: number): void {
|
|
82
|
+
if (!this._active.length) {
|
|
83
|
+
this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));
|
|
84
|
+
} else {
|
|
85
|
+
for (let j = this._active.length - 1; j >= 0; j--) {
|
|
86
|
+
this._active[j].put(data, start, end);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public unhook(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {
|
|
92
|
+
if (!this._active.length) {
|
|
93
|
+
this._handlerFb(this._ident, 'UNHOOK', success);
|
|
94
|
+
} else {
|
|
95
|
+
let handlerResult: boolean | Promise<boolean> = false;
|
|
96
|
+
let j = this._active.length - 1;
|
|
97
|
+
let fallThrough = false;
|
|
98
|
+
if (this._stack.paused) {
|
|
99
|
+
j = this._stack.loopPosition - 1;
|
|
100
|
+
handlerResult = promiseResult;
|
|
101
|
+
fallThrough = this._stack.fallThrough;
|
|
102
|
+
this._stack.paused = false;
|
|
103
|
+
}
|
|
104
|
+
if (!fallThrough && handlerResult === false) {
|
|
105
|
+
for (; j >= 0; j--) {
|
|
106
|
+
handlerResult = this._active[j].unhook(success);
|
|
107
|
+
if (handlerResult === true) {
|
|
108
|
+
break;
|
|
109
|
+
} else if (handlerResult instanceof Promise) {
|
|
110
|
+
this._stack.paused = true;
|
|
111
|
+
this._stack.loopPosition = j;
|
|
112
|
+
this._stack.fallThrough = false;
|
|
113
|
+
return handlerResult;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
j--;
|
|
117
|
+
}
|
|
118
|
+
// cleanup left over handlers (fallThrough for async)
|
|
119
|
+
for (; j >= 0; j--) {
|
|
120
|
+
handlerResult = this._active[j].unhook(false);
|
|
121
|
+
if (handlerResult instanceof Promise) {
|
|
122
|
+
this._stack.paused = true;
|
|
123
|
+
this._stack.loopPosition = j;
|
|
124
|
+
this._stack.fallThrough = true;
|
|
125
|
+
return handlerResult;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
this._active = EMPTY_HANDLERS;
|
|
130
|
+
this._ident = 0;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// predefine empty params as [0] (ZDM)
|
|
135
|
+
const EMPTY_PARAMS = new Params();
|
|
136
|
+
EMPTY_PARAMS.addParam(0);
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Convenient class to create a DCS handler from a single callback function.
|
|
140
|
+
* Note: The payload is currently limited to 50 MB (hardcoded).
|
|
141
|
+
*/
|
|
142
|
+
export class DcsHandler implements IDcsHandler {
|
|
143
|
+
private _data = '';
|
|
144
|
+
private _params: IParams = EMPTY_PARAMS;
|
|
145
|
+
private _hitLimit: boolean = false;
|
|
146
|
+
|
|
147
|
+
constructor(private _handler: (data: string, params: IParams) => boolean | Promise<boolean>) { }
|
|
148
|
+
|
|
149
|
+
public hook(params: IParams): void {
|
|
150
|
+
// since we need to preserve params until `unhook`, we have to clone it
|
|
151
|
+
// (only borrowed from parser and spans multiple parser states)
|
|
152
|
+
// perf optimization:
|
|
153
|
+
// clone only, if we have non empty params, otherwise stick with default
|
|
154
|
+
this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;
|
|
155
|
+
this._data = '';
|
|
156
|
+
this._hitLimit = false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public put(data: Uint32Array, start: number, end: number): void {
|
|
160
|
+
if (this._hitLimit) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this._data += utf32ToString(data, start, end);
|
|
164
|
+
if (this._data.length > PAYLOAD_LIMIT) {
|
|
165
|
+
this._data = '';
|
|
166
|
+
this._hitLimit = true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
public unhook(success: boolean): boolean | Promise<boolean> {
|
|
171
|
+
let ret: boolean | Promise<boolean> = false;
|
|
172
|
+
if (this._hitLimit) {
|
|
173
|
+
ret = false;
|
|
174
|
+
} else if (success) {
|
|
175
|
+
ret = this._handler(this._data, this._params);
|
|
176
|
+
if (ret instanceof Promise) {
|
|
177
|
+
// need to hold data and params until `ret` got resolved
|
|
178
|
+
// dont care for errors, data will be freed anyway on next start
|
|
179
|
+
return ret.then(res => {
|
|
180
|
+
this._params = EMPTY_PARAMS;
|
|
181
|
+
this._data = '';
|
|
182
|
+
this._hitLimit = false;
|
|
183
|
+
return res;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
this._params = EMPTY_PARAMS;
|
|
188
|
+
this._data = '';
|
|
189
|
+
this._hitLimit = false;
|
|
190
|
+
return ret;
|
|
191
|
+
}
|
|
192
|
+
}
|