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