hls.js 1.5.5 → 1.5.6-0.canary.10001
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 +1 -0
- package/dist/hls-demo.js +10 -0
- package/dist/hls-demo.js.map +1 -1
- package/dist/hls.js +2075 -1166
- package/dist/hls.js.d.ts +65 -50
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +1148 -859
- package/dist/hls.light.js.map +1 -1
- package/dist/hls.light.min.js +1 -1
- package/dist/hls.light.min.js.map +1 -1
- package/dist/hls.light.mjs +984 -696
- package/dist/hls.light.mjs.map +1 -1
- package/dist/hls.min.js +1 -1
- package/dist/hls.min.js.map +1 -1
- package/dist/hls.mjs +1757 -863
- package/dist/hls.mjs.map +1 -1
- package/dist/hls.worker.js +1 -1
- package/dist/hls.worker.js.map +1 -1
- package/package.json +20 -20
- package/src/config.ts +3 -2
- package/src/controller/abr-controller.ts +21 -20
- package/src/controller/audio-stream-controller.ts +15 -16
- package/src/controller/audio-track-controller.ts +1 -1
- package/src/controller/base-playlist-controller.ts +20 -8
- package/src/controller/base-stream-controller.ts +149 -33
- package/src/controller/buffer-controller.ts +11 -11
- package/src/controller/cap-level-controller.ts +1 -2
- package/src/controller/cmcd-controller.ts +27 -6
- package/src/controller/content-steering-controller.ts +8 -6
- package/src/controller/eme-controller.ts +9 -22
- package/src/controller/error-controller.ts +6 -8
- package/src/controller/fps-controller.ts +2 -3
- package/src/controller/gap-controller.ts +43 -16
- package/src/controller/latency-controller.ts +9 -11
- package/src/controller/level-controller.ts +12 -18
- package/src/controller/stream-controller.ts +25 -32
- package/src/controller/subtitle-stream-controller.ts +13 -14
- package/src/controller/subtitle-track-controller.ts +5 -3
- package/src/controller/timeline-controller.ts +23 -30
- package/src/crypt/aes-crypto.ts +21 -2
- package/src/crypt/decrypter-aes-mode.ts +4 -0
- package/src/crypt/decrypter.ts +32 -18
- package/src/crypt/fast-aes-key.ts +24 -5
- package/src/demux/audio/adts.ts +9 -4
- package/src/demux/sample-aes.ts +2 -0
- package/src/demux/transmuxer-interface.ts +4 -12
- package/src/demux/transmuxer-worker.ts +4 -4
- package/src/demux/transmuxer.ts +16 -3
- package/src/demux/tsdemuxer.ts +71 -37
- package/src/demux/video/avc-video-parser.ts +208 -119
- package/src/demux/video/base-video-parser.ts +134 -2
- package/src/demux/video/exp-golomb.ts +0 -208
- package/src/demux/video/hevc-video-parser.ts +746 -0
- package/src/events.ts +7 -0
- package/src/hls.ts +42 -34
- package/src/loader/fragment-loader.ts +9 -2
- package/src/loader/key-loader.ts +2 -0
- package/src/loader/level-key.ts +10 -9
- package/src/loader/playlist-loader.ts +4 -5
- package/src/remux/mp4-generator.ts +196 -1
- package/src/remux/mp4-remuxer.ts +23 -7
- package/src/task-loop.ts +5 -2
- package/src/types/component-api.ts +2 -0
- package/src/types/demuxer.ts +3 -0
- package/src/types/events.ts +4 -0
- package/src/utils/codecs.ts +33 -4
- package/src/utils/encryption-methods-util.ts +21 -0
- package/src/utils/logger.ts +54 -24
package/dist/hls.js.d.ts
CHANGED
@@ -6,7 +6,7 @@ export declare interface AbrComponentAPI extends ComponentAPI {
|
|
6
6
|
resetEstimator(abrEwmaDefaultEstimate: number): any;
|
7
7
|
}
|
8
8
|
|
9
|
-
export declare class AbrController implements AbrComponentAPI {
|
9
|
+
export declare class AbrController extends Logger implements AbrComponentAPI {
|
10
10
|
protected hls: Hls;
|
11
11
|
private lastLevelLoadSec;
|
12
12
|
private lastLoadedFragLevel;
|
@@ -111,8 +111,8 @@ export declare class AudioStreamController extends BaseStreamController implemen
|
|
111
111
|
private cachedTrackLoadedData;
|
112
112
|
constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
|
113
113
|
protected onHandlerDestroying(): void;
|
114
|
-
|
115
|
-
|
114
|
+
protected registerListeners(): void;
|
115
|
+
protected unregisterListeners(): void;
|
116
116
|
onInitPtsFound(event: Events.INIT_PTS_FOUND, { frag, id, initPTS, timescale }: InitPTSFoundData): void;
|
117
117
|
startLoad(startPosition: number): void;
|
118
118
|
doTick(): void;
|
@@ -132,7 +132,7 @@ export declare class AudioStreamController extends BaseStreamController implemen
|
|
132
132
|
onBufferReset(): void;
|
133
133
|
onBufferCreated(event: Events.BUFFER_CREATED, data: BufferCreatedData): void;
|
134
134
|
onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData): void;
|
135
|
-
|
135
|
+
protected onError(event: Events.ERROR, data: ErrorData): void;
|
136
136
|
private onBufferFlushing;
|
137
137
|
private onBufferFlushed;
|
138
138
|
private _handleTransmuxComplete;
|
@@ -187,13 +187,11 @@ export declare interface BackBufferData {
|
|
187
187
|
bufferEnd: number;
|
188
188
|
}
|
189
189
|
|
190
|
-
export declare class BasePlaylistController implements NetworkComponentAPI {
|
190
|
+
export declare class BasePlaylistController extends Logger implements NetworkComponentAPI {
|
191
191
|
protected hls: Hls;
|
192
192
|
protected timer: number;
|
193
193
|
protected requestScheduled: number;
|
194
194
|
protected canLoad: boolean;
|
195
|
-
protected log: (msg: any) => void;
|
196
|
-
protected warn: (msg: any) => void;
|
197
195
|
constructor(hls: Hls, logPrefix: string);
|
198
196
|
destroy(): void;
|
199
197
|
protected clearTimer(): void;
|
@@ -248,22 +246,25 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
|
|
248
246
|
protected startFragRequested: boolean;
|
249
247
|
protected decrypter: Decrypter;
|
250
248
|
protected initPTS: RationalTimestamp[];
|
251
|
-
protected
|
252
|
-
|
253
|
-
private readonly logPrefix;
|
254
|
-
protected log: (msg: any) => void;
|
255
|
-
protected warn: (msg: any) => void;
|
249
|
+
protected buffering: boolean;
|
250
|
+
private loadingParts;
|
256
251
|
constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, playlistType: PlaylistLevelType);
|
252
|
+
protected registerListeners(): void;
|
253
|
+
protected unregisterListeners(): void;
|
257
254
|
protected doTick(): void;
|
258
255
|
protected onTickEnd(): void;
|
259
256
|
startLoad(startPosition: number): void;
|
260
257
|
stopLoad(): void;
|
258
|
+
pauseBuffering(): void;
|
259
|
+
resumeBuffering(): void;
|
261
260
|
protected _streamEnded(bufferInfo: BufferInfo, levelDetails: LevelDetails): boolean;
|
262
261
|
protected getLevelDetails(): LevelDetails | undefined;
|
263
262
|
protected onMediaAttached(event: Events.MEDIA_ATTACHED, data: MediaAttachedData): void;
|
264
263
|
protected onMediaDetaching(): void;
|
265
|
-
protected
|
266
|
-
protected
|
264
|
+
protected onManifestLoading(): void;
|
265
|
+
protected onError(event: Events.ERROR, data: ErrorData): void;
|
266
|
+
protected onMediaSeeking: () => void;
|
267
|
+
protected onMediaEnded: () => void;
|
267
268
|
protected onManifestLoaded(event: Events.MANIFEST_LOADED, data: ManifestLoadedData): void;
|
268
269
|
protected onHandlerDestroying(): void;
|
269
270
|
protected onHandlerDestroyed(): void;
|
@@ -283,6 +284,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
|
|
283
284
|
private doFragPartsLoad;
|
284
285
|
private handleFragLoadError;
|
285
286
|
protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata): void;
|
287
|
+
private shouldLoadParts;
|
286
288
|
protected getCurrentContext(chunkMeta: ChunkMetadata): {
|
287
289
|
frag: Fragment;
|
288
290
|
part: Part | null;
|
@@ -352,7 +354,7 @@ export declare interface BufferCodecsData {
|
|
352
354
|
audio?: Track;
|
353
355
|
}
|
354
356
|
|
355
|
-
export declare class BufferController implements ComponentAPI {
|
357
|
+
export declare class BufferController extends Logger implements ComponentAPI {
|
356
358
|
private details;
|
357
359
|
private _objectUrl;
|
358
360
|
private operationQueue;
|
@@ -372,9 +374,6 @@ export declare class BufferController implements ComponentAPI {
|
|
372
374
|
tracks: TrackSet;
|
373
375
|
pendingTracks: TrackSet;
|
374
376
|
sourceBuffer: SourceBuffers;
|
375
|
-
protected log: (msg: any) => void;
|
376
|
-
protected warn: (msg: any, obj?: any) => void;
|
377
|
-
protected error: (msg: any, obj?: any) => void;
|
378
377
|
constructor(hls: Hls);
|
379
378
|
hasSourceTypes(): boolean;
|
380
379
|
destroy(): void;
|
@@ -601,6 +600,7 @@ export declare class CMCDController implements ComponentAPI {
|
|
601
600
|
* Apply CMCD data to a segment request
|
602
601
|
*/
|
603
602
|
private applyFragmentData;
|
603
|
+
private getNextFrag;
|
604
604
|
/**
|
605
605
|
* The CMCD object type.
|
606
606
|
*/
|
@@ -634,9 +634,8 @@ export declare interface ComponentAPI {
|
|
634
634
|
destroy(): void;
|
635
635
|
}
|
636
636
|
|
637
|
-
export declare class ContentSteeringController implements NetworkComponentAPI {
|
637
|
+
export declare class ContentSteeringController extends Logger implements NetworkComponentAPI {
|
638
638
|
private readonly hls;
|
639
|
-
private log;
|
640
639
|
private loader;
|
641
640
|
private uri;
|
642
641
|
private pathwayId;
|
@@ -726,6 +725,7 @@ declare class Decrypter {
|
|
726
725
|
private currentIV;
|
727
726
|
private currentResult;
|
728
727
|
private useSoftware;
|
728
|
+
private enableSoftwareAES;
|
729
729
|
constructor(config: HlsConfig, { removePKCS7Padding }?: {
|
730
730
|
removePKCS7Padding?: boolean | undefined;
|
731
731
|
});
|
@@ -733,14 +733,19 @@ declare class Decrypter {
|
|
733
733
|
isSync(): boolean;
|
734
734
|
flush(): Uint8Array | null;
|
735
735
|
reset(): void;
|
736
|
-
decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer>;
|
737
|
-
softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer): ArrayBuffer | null;
|
738
|
-
webCryptoDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer>;
|
736
|
+
decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
|
737
|
+
softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): ArrayBuffer | null;
|
738
|
+
webCryptoDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
|
739
739
|
private onWebCryptoError;
|
740
740
|
private getValidChunk;
|
741
741
|
private logOnce;
|
742
742
|
}
|
743
743
|
|
744
|
+
declare const enum DecrypterAesMode {
|
745
|
+
cbc = 0,
|
746
|
+
ctr = 1
|
747
|
+
}
|
748
|
+
|
744
749
|
declare type DRMSystemConfiguration = {
|
745
750
|
licenseUrl: string;
|
746
751
|
serverCertificateUrl?: string;
|
@@ -786,7 +791,7 @@ export declare const enum ElementaryStreamTypes {
|
|
786
791
|
* @class
|
787
792
|
* @constructor
|
788
793
|
*/
|
789
|
-
export declare class EMEController implements ComponentAPI {
|
794
|
+
export declare class EMEController extends Logger implements ComponentAPI {
|
790
795
|
static CDMCleanupPromise: Promise<void> | void;
|
791
796
|
private readonly hls;
|
792
797
|
private readonly config;
|
@@ -797,12 +802,6 @@ export declare class EMEController implements ComponentAPI {
|
|
797
802
|
private mediaKeySessions;
|
798
803
|
private keyIdToKeySessionPromise;
|
799
804
|
private setMediaKeysQueue;
|
800
|
-
private onMediaEncrypted;
|
801
|
-
private onWaitingForKey;
|
802
|
-
private debug;
|
803
|
-
private log;
|
804
|
-
private warn;
|
805
|
-
private error;
|
806
805
|
constructor(hls: Hls);
|
807
806
|
destroy(): void;
|
808
807
|
private registerListeners;
|
@@ -823,8 +822,8 @@ export declare class EMEController implements ComponentAPI {
|
|
823
822
|
private handleError;
|
824
823
|
private getKeySystemForKeyPromise;
|
825
824
|
private getKeySystemSelectionPromise;
|
826
|
-
private
|
827
|
-
private
|
825
|
+
private onMediaEncrypted;
|
826
|
+
private onWaitingForKey;
|
828
827
|
private attemptSetMediaKeys;
|
829
828
|
private generateRequestWithPreferredKeySession;
|
830
829
|
private onKeyStatusChange;
|
@@ -858,13 +857,10 @@ export declare const enum ErrorActionFlags {
|
|
858
857
|
SwitchToSDR = 4
|
859
858
|
}
|
860
859
|
|
861
|
-
export declare class ErrorController implements NetworkComponentAPI {
|
860
|
+
export declare class ErrorController extends Logger implements NetworkComponentAPI {
|
862
861
|
private readonly hls;
|
863
862
|
private playlistError;
|
864
863
|
private penalizedRenditions;
|
865
|
-
private log;
|
866
|
-
private warn;
|
867
|
-
private error;
|
868
864
|
constructor(hls: Hls);
|
869
865
|
private registerListeners;
|
870
866
|
private unregisterListeners;
|
@@ -974,6 +970,7 @@ export declare enum Events {
|
|
974
970
|
MEDIA_ATTACHED = "hlsMediaAttached",
|
975
971
|
MEDIA_DETACHING = "hlsMediaDetaching",
|
976
972
|
MEDIA_DETACHED = "hlsMediaDetached",
|
973
|
+
MEDIA_ENDED = "hlsMediaEnded",
|
977
974
|
BUFFER_RESET = "hlsBufferReset",
|
978
975
|
BUFFER_CODECS = "hlsBufferCodecs",
|
979
976
|
BUFFER_CREATED = "hlsBufferCreated",
|
@@ -1320,9 +1317,12 @@ declare class Hls implements HlsEventEmitter {
|
|
1320
1317
|
* The configuration object provided on player instantiation.
|
1321
1318
|
*/
|
1322
1319
|
readonly userConfig: Partial<HlsConfig>;
|
1320
|
+
/**
|
1321
|
+
* The logger functions used by this player instance, configured on player instantiation.
|
1322
|
+
*/
|
1323
|
+
readonly logger: ILogger;
|
1323
1324
|
private coreComponents;
|
1324
1325
|
private networkControllers;
|
1325
|
-
private started;
|
1326
1326
|
private _emitter;
|
1327
1327
|
private _autoLevelCapping;
|
1328
1328
|
private _maxHdcpLevel;
|
@@ -1409,11 +1409,11 @@ declare class Hls implements HlsEventEmitter {
|
|
1409
1409
|
*/
|
1410
1410
|
stopLoad(): void;
|
1411
1411
|
/**
|
1412
|
-
* Resumes stream controller segment loading
|
1412
|
+
* Resumes stream controller segment loading after `pauseBuffering` has been called.
|
1413
1413
|
*/
|
1414
1414
|
resumeBuffering(): void;
|
1415
1415
|
/**
|
1416
|
-
*
|
1416
|
+
* Prevents stream controller from loading new segments until `resumeBuffering` is called.
|
1417
1417
|
* This allows for media buffering to be paused without interupting playlist loading.
|
1418
1418
|
*/
|
1419
1419
|
pauseBuffering(): void;
|
@@ -1705,6 +1705,7 @@ export declare interface HlsListeners {
|
|
1705
1705
|
[Events.MEDIA_ATTACHED]: (event: Events.MEDIA_ATTACHED, data: MediaAttachedData) => void;
|
1706
1706
|
[Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void;
|
1707
1707
|
[Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void;
|
1708
|
+
[Events.MEDIA_ENDED]: (event: Events.MEDIA_ENDED, data: MediaEndedData) => void;
|
1708
1709
|
[Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;
|
1709
1710
|
[Events.BUFFER_CODECS]: (event: Events.BUFFER_CODECS, data: BufferCodecsData) => void;
|
1710
1711
|
[Events.BUFFER_CREATED]: (event: Events.BUFFER_CREATED, data: BufferCreatedData) => void;
|
@@ -2256,6 +2257,16 @@ export declare class LoadStats implements LoaderStats {
|
|
2256
2257
|
buffering: HlsProgressivePerformanceTiming;
|
2257
2258
|
}
|
2258
2259
|
|
2260
|
+
export declare class Logger implements ILogger {
|
2261
|
+
trace: ILogFunction;
|
2262
|
+
debug: ILogFunction;
|
2263
|
+
log: ILogFunction;
|
2264
|
+
warn: ILogFunction;
|
2265
|
+
info: ILogFunction;
|
2266
|
+
error: ILogFunction;
|
2267
|
+
constructor(label: string, logger: ILogger);
|
2268
|
+
}
|
2269
|
+
|
2259
2270
|
export declare type MainPlaylistType = AudioPlaylistType | 'VIDEO';
|
2260
2271
|
|
2261
2272
|
export declare interface ManifestLoadedData {
|
@@ -2331,6 +2342,10 @@ export declare type MediaDecodingInfo = {
|
|
2331
2342
|
error?: Error;
|
2332
2343
|
};
|
2333
2344
|
|
2345
|
+
export declare interface MediaEndedData {
|
2346
|
+
stalled: boolean;
|
2347
|
+
}
|
2348
|
+
|
2334
2349
|
export declare type MediaKeyFunc = (keySystem: KeySystems, supportedConfigurations: MediaKeySystemConfiguration[]) => Promise<MediaKeySystemAccess>;
|
2335
2350
|
|
2336
2351
|
export declare interface MediaKeySessionContext {
|
@@ -2400,6 +2415,8 @@ export declare type MP4RemuxerConfig = {
|
|
2400
2415
|
export declare interface NetworkComponentAPI extends ComponentAPI {
|
2401
2416
|
startLoad(startPosition: number): void;
|
2402
2417
|
stopLoad(): void;
|
2418
|
+
pauseBuffering?(): void;
|
2419
|
+
resumeBuffering?(): void;
|
2403
2420
|
}
|
2404
2421
|
|
2405
2422
|
export declare const enum NetworkErrorAction {
|
@@ -2639,16 +2656,14 @@ declare class StreamController extends BaseStreamController implements NetworkCo
|
|
2639
2656
|
private altAudio;
|
2640
2657
|
private audioOnly;
|
2641
2658
|
private fragPlaying;
|
2642
|
-
private onvplaying;
|
2643
|
-
private onvseeked;
|
2644
2659
|
private fragLastKbps;
|
2645
2660
|
private couldBacktrack;
|
2646
2661
|
private backtrackFragment;
|
2647
2662
|
private audioCodecSwitch;
|
2648
2663
|
private videoBuffer;
|
2649
2664
|
constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
|
2650
|
-
|
2651
|
-
protected
|
2665
|
+
protected registerListeners(): void;
|
2666
|
+
protected unregisterListeners(): void;
|
2652
2667
|
protected onHandlerDestroying(): void;
|
2653
2668
|
startLoad(startPosition: number): void;
|
2654
2669
|
stopLoad(): void;
|
@@ -2672,7 +2687,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
|
|
2672
2687
|
protected onMediaDetaching(): void;
|
2673
2688
|
private onMediaPlaying;
|
2674
2689
|
private onMediaSeeked;
|
2675
|
-
|
2690
|
+
protected onManifestLoading(): void;
|
2676
2691
|
private onManifestParsed;
|
2677
2692
|
private onLevelLoading;
|
2678
2693
|
private onLevelLoaded;
|
@@ -2681,7 +2696,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
|
|
2681
2696
|
private onAudioTrackSwitched;
|
2682
2697
|
private onBufferCreated;
|
2683
2698
|
private onFragBuffered;
|
2684
|
-
|
2699
|
+
protected onError(event: Events.ERROR, data: ErrorData): void;
|
2685
2700
|
private checkBuffer;
|
2686
2701
|
private onFragLoadEmergencyAborted;
|
2687
2702
|
private onBufferFlushed;
|
@@ -2767,8 +2782,8 @@ export declare class SubtitleStreamController extends BaseStreamController imple
|
|
2767
2782
|
private mainDetails;
|
2768
2783
|
constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
|
2769
2784
|
protected onHandlerDestroying(): void;
|
2770
|
-
|
2771
|
-
|
2785
|
+
protected registerListeners(): void;
|
2786
|
+
protected unregisterListeners(): void;
|
2772
2787
|
startLoad(startPosition: number): void;
|
2773
2788
|
onManifestLoading(): void;
|
2774
2789
|
onMediaDetaching(): void;
|
@@ -2796,10 +2811,10 @@ export declare class SubtitleTrackController extends BasePlaylistController {
|
|
2796
2811
|
private currentTrack;
|
2797
2812
|
private selectDefaultTrack;
|
2798
2813
|
private queuedDefaultTrack;
|
2799
|
-
private asyncPollTrackChange;
|
2800
2814
|
private useTextTrackPolling;
|
2801
2815
|
private subtitlePollingInterval;
|
2802
2816
|
private _subtitleDisplay;
|
2817
|
+
private asyncPollTrackChange;
|
2803
2818
|
constructor(hls: Hls);
|
2804
2819
|
destroy(): void;
|
2805
2820
|
get subtitleDisplay(): boolean;
|
@@ -2884,12 +2899,12 @@ export declare interface SubtitleTrackSwitchData {
|
|
2884
2899
|
* we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further
|
2885
2900
|
* task processing on the next main loop iteration (also known as "next tick" in the Node/JS runtime lingo).
|
2886
2901
|
*/
|
2887
|
-
declare class TaskLoop {
|
2902
|
+
declare class TaskLoop extends Logger {
|
2888
2903
|
private readonly _boundTick;
|
2889
2904
|
private _tickTimer;
|
2890
2905
|
private _tickInterval;
|
2891
2906
|
private _tickCallCount;
|
2892
|
-
constructor();
|
2907
|
+
constructor(label: string, logger: ILogger);
|
2893
2908
|
destroy(): void;
|
2894
2909
|
protected onHandlerDestroying(): void;
|
2895
2910
|
protected onHandlerDestroyed(): void;
|