lemon-mse 0.3.7 → 0.3.9
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/flv.d.ts +638 -0
- package/dist/flv.js +7 -24
- package/dist/hls.d.ts +3 -0
- package/dist/hls.js +26 -31
- package/dist/hls_.d.ts +3718 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +33 -37
- package/dist/lemon/index-CfUqUxGr.js +3 -0
- package/dist/lemon/logo-Ch3azj_E.svg +1 -0
- package/package.json +6 -33
- package/dist/es/a.d.ts +0 -3105
- package/dist/es/flv.d.ts +0 -587
- package/dist/es/flv.js +0 -6
- package/dist/es/hls.d.ts +0 -3
- package/dist/es/hls.js +0 -14
- package/dist/es/index.d.ts +0 -4
- package/dist/es/index.js +0 -19
- package/dist/lemon.js +0 -1
- /package/dist/{lemon.css → lemon/index-DRP1g3d_.css} +0 -0
- /package/dist/{webmssdk.es5.js → lemon/webmssdk.es5.js} +0 -0
package/dist/flv.d.ts
ADDED
@@ -0,0 +1,638 @@
|
|
1
|
+
export { Flv };
|
2
|
+
/** 并非所有事件都可用 */
|
3
|
+
export type EventTypes =
|
4
|
+
| "loadstart"
|
5
|
+
| "loadeddata"
|
6
|
+
| "play"
|
7
|
+
| "pause"
|
8
|
+
| "ended"
|
9
|
+
| "error"
|
10
|
+
| "playing"
|
11
|
+
| "seeking"
|
12
|
+
| "seeked"
|
13
|
+
| "timeupdate"
|
14
|
+
| "waiting"
|
15
|
+
| "canplay"
|
16
|
+
| "canplaythrough"
|
17
|
+
| "durationchange"
|
18
|
+
| "volumechange"
|
19
|
+
| "ratechange"
|
20
|
+
| "video_resize"
|
21
|
+
| "definition_change"
|
22
|
+
| "user_action"
|
23
|
+
| "rotate"
|
24
|
+
| "definition_change"
|
25
|
+
| "retry"
|
26
|
+
| "replay"
|
27
|
+
| "destroy"
|
28
|
+
| "mini_state_change"
|
29
|
+
| "cssFullscreen_change"
|
30
|
+
| "fullscreen_change"
|
31
|
+
| "blur"
|
32
|
+
| "focus"
|
33
|
+
| "complete"
|
34
|
+
| "autoplay_started"
|
35
|
+
| "autoplay_was_prevented"
|
36
|
+
| "ready"
|
37
|
+
| "pip_change";
|
38
|
+
|
39
|
+
declare class Flv extends EventEmitter<EventTypes> {
|
40
|
+
static isSupported(mediaType: ("video" | "audio") | null): boolean;
|
41
|
+
static enableLogger(): void;
|
42
|
+
static disableLogger(): void;
|
43
|
+
|
44
|
+
constructor(opts: FlvOption);
|
45
|
+
media: HTMLMediaElement | null;
|
46
|
+
_loading: boolean;
|
47
|
+
_opts: FlvOption;
|
48
|
+
_bufferService: K.BufferService;
|
49
|
+
_gapService: K.GapService;
|
50
|
+
_stats: K.MediaStatsService;
|
51
|
+
_mediaLoader: K.NetLoader;
|
52
|
+
_maxChunkWaitTimer: any;
|
53
|
+
_tickTimer: any;
|
54
|
+
_tickInterval: number;
|
55
|
+
_urlSwitching: boolean;
|
56
|
+
_seamlessSwitching: boolean;
|
57
|
+
_disconnectRetryCount: number;
|
58
|
+
_preLoadEndPoint: number;
|
59
|
+
_keyframes: any;
|
60
|
+
_acceptRanges: boolean;
|
61
|
+
_firstProgressEmit: boolean;
|
62
|
+
_seiService: K.SeiService;
|
63
|
+
_bandwidthService: K.BandwidthService;
|
64
|
+
get version(): any;
|
65
|
+
get isLive(): boolean;
|
66
|
+
get baseDts(): number;
|
67
|
+
get seekable(): boolean;
|
68
|
+
get loader(): K.NetLoader;
|
69
|
+
get blobUrl(): any;
|
70
|
+
speedInfo(): {
|
71
|
+
speed: any;
|
72
|
+
avgSpeed: number;
|
73
|
+
};
|
74
|
+
getStats(): K.Stats;
|
75
|
+
bufferInfo(maxHole?: number): {
|
76
|
+
start: number;
|
77
|
+
end: number;
|
78
|
+
buffers: [number, number][];
|
79
|
+
remaining: number;
|
80
|
+
index?: number;
|
81
|
+
nextStart?: number;
|
82
|
+
nextEnd?: number;
|
83
|
+
prevStart?: number;
|
84
|
+
prevEnd?: number;
|
85
|
+
};
|
86
|
+
playbackQuality(): {
|
87
|
+
droppedVideoFrames?: undefined;
|
88
|
+
totalVideoFrames?: undefined;
|
89
|
+
creationTime?: undefined;
|
90
|
+
} | {
|
91
|
+
droppedVideoFrames: any;
|
92
|
+
totalVideoFrames: any;
|
93
|
+
creationTime: any;
|
94
|
+
};
|
95
|
+
load(url?: string, reuseMse?: boolean): Promise<any>;
|
96
|
+
replay(seamlesslyReload: boolean, isPlayEmit: any): Promise<any>;
|
97
|
+
disconnect(): Promise<void>;
|
98
|
+
switchURL(url: string, seamless?: boolean): Promise<void>;
|
99
|
+
destroy(): Promise<any>;
|
100
|
+
_emitError(error: any, endOfStream?: boolean): void;
|
101
|
+
_reset(reuseMse?: boolean): Promise<void>;
|
102
|
+
_loadData(url: any, range: any): Promise<void>;
|
103
|
+
/**
|
104
|
+
* startTime: 当前流式分段开始read时间
|
105
|
+
* endTime: 当前流式分段结束read时间
|
106
|
+
* st: 拉流开始时间
|
107
|
+
* firstByteTime: 首字节响应时间
|
108
|
+
*/
|
109
|
+
_onProgress: (
|
110
|
+
chunk: ArrayBuffer,
|
111
|
+
done: boolean,
|
112
|
+
{ startTime, endTime, st, firstByteTime }: {
|
113
|
+
startTime: number;
|
114
|
+
endTime: number;
|
115
|
+
st: number;
|
116
|
+
firstByteTime: number;
|
117
|
+
},
|
118
|
+
response: Response,
|
119
|
+
) => Promise<void>;
|
120
|
+
_onRetryError: (error: any, retryTime: any) => void;
|
121
|
+
_clear(): Promise<void>;
|
122
|
+
_end: () => void;
|
123
|
+
_resetDisconnectCount: () => void;
|
124
|
+
_tick: () => void;
|
125
|
+
_onPlay: () => void;
|
126
|
+
_onSeeking: () => Promise<void>;
|
127
|
+
_onTimeupdate: () => void;
|
128
|
+
_onWaiting: () => void;
|
129
|
+
_onBufferUpdate: () => void;
|
130
|
+
_checkPreload: () => Promise<void>;
|
131
|
+
_onFlvScriptData: (sample: any) => void;
|
132
|
+
}
|
133
|
+
|
134
|
+
export function getOption(opts: FlvOption): FlvOption;
|
135
|
+
export type FlvOption = {
|
136
|
+
media: HTMLMediaElement;
|
137
|
+
url?: string;
|
138
|
+
isLive?: boolean;
|
139
|
+
softDecode?: boolean;
|
140
|
+
analyzeDuration?: number;
|
141
|
+
maxJumpDistance?: number;
|
142
|
+
maxLatency?: number;
|
143
|
+
targetLatency?: number;
|
144
|
+
bufferBehind?: number;
|
145
|
+
retryCount?: number;
|
146
|
+
retryDelay?: number;
|
147
|
+
disconnectRetryCount?: number;
|
148
|
+
loadTimeout?: number;
|
149
|
+
maxReaderInterval?: number;
|
150
|
+
preloadTime?: number;
|
151
|
+
defaultVodLoadSize?: number;
|
152
|
+
disconnectTime?: number;
|
153
|
+
fetchOptions?: RequestInit;
|
154
|
+
seamlesslyReload: boolean;
|
155
|
+
keepStatusAfterSwitch?: boolean;
|
156
|
+
onlyVideo?: boolean;
|
157
|
+
onlyAudio?: boolean;
|
158
|
+
preferMMS?: boolean;
|
159
|
+
preProcessUrl?: (url: string, ext?: {
|
160
|
+
[propName: string]: any;
|
161
|
+
}) => {
|
162
|
+
[propName: string]: any;
|
163
|
+
url: string;
|
164
|
+
};
|
165
|
+
};
|
166
|
+
|
167
|
+
declare namespace K {
|
168
|
+
type StatsInfo = {
|
169
|
+
downloadSpeed: number;
|
170
|
+
avgSpeed: number;
|
171
|
+
currentTime: number;
|
172
|
+
bufferEnd: number;
|
173
|
+
decodeFps: number;
|
174
|
+
encodeType: string;
|
175
|
+
audioCodec: string;
|
176
|
+
videoCodec: string;
|
177
|
+
domain: string;
|
178
|
+
fps: number;
|
179
|
+
bitrate: number;
|
180
|
+
width: number;
|
181
|
+
height: number;
|
182
|
+
samplerate: number;
|
183
|
+
channelCount: number;
|
184
|
+
gop: number;
|
185
|
+
};
|
186
|
+
|
187
|
+
export class BufferService {
|
188
|
+
constructor(flv: Flv, softVideo?: any, opts?: any);
|
189
|
+
flv: Flv | null;
|
190
|
+
_demuxer: FlvDemuxer;
|
191
|
+
_remuxer: any;
|
192
|
+
_mse: any;
|
193
|
+
_softVideo: any;
|
194
|
+
_sourceCreated: boolean;
|
195
|
+
_needInitSegment: boolean;
|
196
|
+
_discontinuity: boolean;
|
197
|
+
_contiguous: boolean;
|
198
|
+
_initSegmentId: string;
|
199
|
+
_cachedBuffer: any;
|
200
|
+
_demuxStartTime: number;
|
201
|
+
_opts: any;
|
202
|
+
get baseDts(): number;
|
203
|
+
get blobUrl(): any;
|
204
|
+
isFull(mediaType?: string): any;
|
205
|
+
seamlessSwitch(): void;
|
206
|
+
unContiguous(startTime: any): void;
|
207
|
+
reset(reuseMse?: boolean): Promise<void>;
|
208
|
+
endOfStream(): Promise<void>;
|
209
|
+
updateDuration(duration: any): Promise<void>;
|
210
|
+
destroy(): Promise<void>;
|
211
|
+
appendBuffer(chunk: any): Promise<any[]>;
|
212
|
+
evictBuffer(bufferBehind: any): Promise<any>;
|
213
|
+
_emitMetaParsedEvent(videoTrack: any, audioTrack: any): void;
|
214
|
+
_fireEvents(videoTrack: any, audioTrack: any, metadataTrack: any): void;
|
215
|
+
}
|
216
|
+
|
217
|
+
export class FlvDemuxer {
|
218
|
+
static AUDIO_RATE: number[];
|
219
|
+
static probe(data: Uint8Array): boolean;
|
220
|
+
/**
|
221
|
+
* @param {VideoTrack} [videoTrack]
|
222
|
+
* @param {AudioTrack} [audioTrack]
|
223
|
+
* @param {MetadataTrack} [metadataTrack]
|
224
|
+
*/
|
225
|
+
constructor(
|
226
|
+
videoTrack?: VideoTrack,
|
227
|
+
audioTrack?: AudioTrack,
|
228
|
+
metadataTrack?: MetadataTrack,
|
229
|
+
);
|
230
|
+
_headerParsed: boolean;
|
231
|
+
_remainingData: any;
|
232
|
+
_gopId: number;
|
233
|
+
_needAddMetaBeforeKeyFrameNal: boolean;
|
234
|
+
videoTrack: VideoTrack;
|
235
|
+
audioTrack: AudioTrack;
|
236
|
+
metadataTrack: MetadataTrack;
|
237
|
+
_fixer: FlvFixer;
|
238
|
+
/**
|
239
|
+
* @param {Uint8Array} data
|
240
|
+
* @param {boolean} [discontinuity=false] 切流
|
241
|
+
* @param {boolean} [contiguous=true]
|
242
|
+
* @returns {DemuxResult}
|
243
|
+
*/
|
244
|
+
demux(
|
245
|
+
data: Uint8Array,
|
246
|
+
discontinuity?: boolean,
|
247
|
+
contiguous?: boolean,
|
248
|
+
): DemuxResult;
|
249
|
+
|
250
|
+
fix(
|
251
|
+
startTime?: number,
|
252
|
+
discontinuity?: boolean,
|
253
|
+
contiguous?: boolean,
|
254
|
+
): DemuxResult;
|
255
|
+
|
256
|
+
demuxAndFix(
|
257
|
+
data: Uint8Array,
|
258
|
+
discontinuity?: boolean,
|
259
|
+
contiguous?: boolean,
|
260
|
+
startTime?: number,
|
261
|
+
): DemuxResult;
|
262
|
+
_parseAudio(data: any, pts: any): void;
|
263
|
+
_parseG711(data: any, pts: any, format: any): void;
|
264
|
+
_parseAac(data: any, pts: any): void;
|
265
|
+
_parseVideo(data: any, dts: any): void;
|
266
|
+
_checkAddMetaNalToUnits(hevc: any, units: any, track: any): any;
|
267
|
+
_parseScript(data: any, pts: any): void;
|
268
|
+
}
|
269
|
+
|
270
|
+
export type DemuxResult = {
|
271
|
+
videoTrack: VideoTrack;
|
272
|
+
audioTrack: AudioTrack;
|
273
|
+
metadataTrack: MetadataTrack;
|
274
|
+
};
|
275
|
+
export class FlvFixer {
|
276
|
+
constructor(videoTrack: any, audioTrack: any, metadataTrack: any);
|
277
|
+
videoTrack: any;
|
278
|
+
audioTrack: any;
|
279
|
+
metadataTrack: any;
|
280
|
+
_baseDts: number;
|
281
|
+
_baseDtsInited: boolean;
|
282
|
+
_audioNextPts: any;
|
283
|
+
_videoNextDts: any;
|
284
|
+
_audioTimestampBreak: number;
|
285
|
+
_videoTimestampBreak: number;
|
286
|
+
_lastVideoDuration: number;
|
287
|
+
_keyFrameInNextChunk: boolean;
|
288
|
+
_lastAudioExceptionGapDot: number;
|
289
|
+
_lastAudioExceptionOverlapDot: number;
|
290
|
+
_lastAudioExceptionLargeGapDot: number;
|
291
|
+
_lastVideoExceptionLargeGapDot: number;
|
292
|
+
_lastVideoExceptionChunkFirstDtsDot: number;
|
293
|
+
/**
|
294
|
+
* @param {number} startTime 点播seek到的时间点
|
295
|
+
* @param {boolean} discontinuity 是否换流
|
296
|
+
* @param {boolean} contiguous 前后chunk时间戳是否连续
|
297
|
+
*/
|
298
|
+
fix(
|
299
|
+
startTime?: number,
|
300
|
+
discontinuity?: boolean,
|
301
|
+
contiguous?: boolean,
|
302
|
+
): void;
|
303
|
+
_videoLastSample: any;
|
304
|
+
_fixVideo(videoTrack: any): void;
|
305
|
+
_fixAudio(audioTrack: any): void;
|
306
|
+
_calculateBaseDts(audioTrack: any, videoTrack: any): boolean;
|
307
|
+
_resetBaseDtsWhenStreamBreaked(): void;
|
308
|
+
_doFixAudioInternal(audioTrack: any, samples: any, timescale: any): void;
|
309
|
+
_getG711Duration(track: any): number;
|
310
|
+
_getSilentFrame(track: any): Uint8Array;
|
311
|
+
}
|
312
|
+
|
313
|
+
class SeiService {
|
314
|
+
constructor(emitter: any);
|
315
|
+
_seiSet: Set<any>;
|
316
|
+
emitter: any;
|
317
|
+
throw(currentTime: any, isLive: any): void;
|
318
|
+
reset(): void;
|
319
|
+
}
|
320
|
+
|
321
|
+
export class BandwidthService {
|
322
|
+
_chunkSpeeds: any[];
|
323
|
+
_speeds: any[];
|
324
|
+
addRecord(totalByte: any, ms: any): void;
|
325
|
+
addChunkRecord(totalByte: any, ms: any): void;
|
326
|
+
getAvgSpeed(): number;
|
327
|
+
getLatestSpeed(): any;
|
328
|
+
reset(): void;
|
329
|
+
}
|
330
|
+
|
331
|
+
export class NetLoader {
|
332
|
+
static isFetchSupport(): boolean;
|
333
|
+
constructor(cfg: any);
|
334
|
+
type: string;
|
335
|
+
_queue: any[];
|
336
|
+
_alive: any[];
|
337
|
+
_currentTask: any;
|
338
|
+
_finnalUrl: string;
|
339
|
+
_config: any;
|
340
|
+
log: any;
|
341
|
+
isFetch(): boolean;
|
342
|
+
load(url: any, config?: {}): Promise<any>;
|
343
|
+
cancel(): Promise<void>;
|
344
|
+
_processTask(): void;
|
345
|
+
}
|
346
|
+
|
347
|
+
export class GapService {
|
348
|
+
_prevCurrentTime: number;
|
349
|
+
do(
|
350
|
+
media: any,
|
351
|
+
maxJumpDistance: number,
|
352
|
+
isLive: any,
|
353
|
+
seekThreshold?: number,
|
354
|
+
): void;
|
355
|
+
}
|
356
|
+
|
357
|
+
class MediaStatsService {
|
358
|
+
constructor(core: any, timescale?: number);
|
359
|
+
_core: any;
|
360
|
+
_samples: any[];
|
361
|
+
_timescale: number;
|
362
|
+
_stats: Stats;
|
363
|
+
getStats(): StatsInfo;
|
364
|
+
_bindEvents(): void;
|
365
|
+
reset(): void;
|
366
|
+
}
|
367
|
+
|
368
|
+
type Stats = StatsInfo;
|
369
|
+
|
370
|
+
class VideoTrack {
|
371
|
+
id: number;
|
372
|
+
/** @readonly */
|
373
|
+
readonly type: string;
|
374
|
+
codecType: string;
|
375
|
+
pid: number;
|
376
|
+
/** @type {Uint8Array | Object} */
|
377
|
+
hvcC: Uint8Array | any;
|
378
|
+
codec: string;
|
379
|
+
timescale: number;
|
380
|
+
formatTimescale: number;
|
381
|
+
sequenceNumber: number;
|
382
|
+
baseMediaDecodeTime: number;
|
383
|
+
baseDts: number;
|
384
|
+
duration: number;
|
385
|
+
warnings: any[];
|
386
|
+
// VideoSample
|
387
|
+
samples: any[];
|
388
|
+
/** @type {Uint8Array[]} */
|
389
|
+
pps: Uint8Array[];
|
390
|
+
/** @type {Uint8Array[]} */
|
391
|
+
sps: Uint8Array[];
|
392
|
+
/** @type {Uint8Array[]} */
|
393
|
+
vps: Uint8Array[];
|
394
|
+
fpsNum: number;
|
395
|
+
fpsDen: number;
|
396
|
+
/** @type {[number, number]} */
|
397
|
+
sarRatio: [number, number];
|
398
|
+
width: number;
|
399
|
+
height: number;
|
400
|
+
nalUnitSize: number;
|
401
|
+
present: boolean;
|
402
|
+
isVideoEncryption: boolean;
|
403
|
+
isAudioEncryption: boolean;
|
404
|
+
isVideo: boolean;
|
405
|
+
kid: any;
|
406
|
+
pssh: any;
|
407
|
+
/** @type {any} */
|
408
|
+
ext: any;
|
409
|
+
reset(): void;
|
410
|
+
/**
|
411
|
+
* @returns {boolean}
|
412
|
+
*/
|
413
|
+
exist(): boolean;
|
414
|
+
/**
|
415
|
+
* @returns {boolean}
|
416
|
+
*/
|
417
|
+
hasSample(): boolean;
|
418
|
+
get isEncryption(): boolean;
|
419
|
+
}
|
420
|
+
|
421
|
+
class AudioTrack {
|
422
|
+
id: number;
|
423
|
+
/** @readonly */
|
424
|
+
readonly type: string;
|
425
|
+
codecType: string;
|
426
|
+
pid: number;
|
427
|
+
codec: string;
|
428
|
+
sequenceNumber: number;
|
429
|
+
sampleDuration: number;
|
430
|
+
timescale: number;
|
431
|
+
formatTimescale: number;
|
432
|
+
baseMediaDecodeTime: number;
|
433
|
+
duration: number;
|
434
|
+
warnings: any[];
|
435
|
+
samples: AudioSample[];
|
436
|
+
baseDts: number;
|
437
|
+
sampleSize: number;
|
438
|
+
sampleRate: number;
|
439
|
+
channelCount: number;
|
440
|
+
objectType: number;
|
441
|
+
sampleRateIndex: number;
|
442
|
+
config: number[];
|
443
|
+
present: boolean;
|
444
|
+
isVideoEncryption: boolean;
|
445
|
+
isAudioEncryption: boolean;
|
446
|
+
kid: any;
|
447
|
+
/** @type {any} */
|
448
|
+
ext: any;
|
449
|
+
reset(): void;
|
450
|
+
/**
|
451
|
+
* @returns {boolean}
|
452
|
+
*/
|
453
|
+
exist(): boolean;
|
454
|
+
/**
|
455
|
+
* @returns {boolean}
|
456
|
+
*/
|
457
|
+
hasSample(): boolean;
|
458
|
+
get isEncryption(): boolean;
|
459
|
+
}
|
460
|
+
|
461
|
+
class AudioSample {
|
462
|
+
/**
|
463
|
+
* @param {number} pts
|
464
|
+
* @param {Uint8Array} data
|
465
|
+
* @param {number} [duration=1024]
|
466
|
+
*/
|
467
|
+
constructor(
|
468
|
+
pts: number,
|
469
|
+
data: Uint8Array,
|
470
|
+
duration?: number,
|
471
|
+
sampleOffset?: any,
|
472
|
+
);
|
473
|
+
duration: number;
|
474
|
+
flag: {
|
475
|
+
dependsOn: number;
|
476
|
+
isNonSyncSample: number;
|
477
|
+
};
|
478
|
+
keyframe: boolean;
|
479
|
+
originPts: number;
|
480
|
+
pts: number;
|
481
|
+
dts: number;
|
482
|
+
data: Uint8Array;
|
483
|
+
size: number;
|
484
|
+
sampleOffset: any;
|
485
|
+
}
|
486
|
+
|
487
|
+
class FlvScriptSample extends Sample {
|
488
|
+
}
|
489
|
+
class SeiSample extends Sample {
|
490
|
+
}
|
491
|
+
class MetadataTrack {
|
492
|
+
readonly id: 3;
|
493
|
+
readonly type: string;
|
494
|
+
timescale: number;
|
495
|
+
flvScriptSamples: FlvScriptSample[];
|
496
|
+
seiSamples: SeiSample[];
|
497
|
+
exist(): boolean;
|
498
|
+
reset(): void;
|
499
|
+
hasSample(): boolean;
|
500
|
+
}
|
501
|
+
class Sample {
|
502
|
+
constructor(data: any, pts: number);
|
503
|
+
time: number;
|
504
|
+
data: any;
|
505
|
+
originPts: number;
|
506
|
+
pts: number;
|
507
|
+
}
|
508
|
+
}
|
509
|
+
|
510
|
+
/**
|
511
|
+
* Minimal `EventEmitter` interface that is molded against the Node.js
|
512
|
+
* `EventEmitter` interface.
|
513
|
+
*/
|
514
|
+
declare class EventEmitter<
|
515
|
+
EventTypes extends E.ValidEventTypes = string | symbol,
|
516
|
+
Context extends any = any,
|
517
|
+
> {
|
518
|
+
static prefixed: string | boolean;
|
519
|
+
|
520
|
+
/**
|
521
|
+
* Return an array listing the events for which the emitter has registered
|
522
|
+
* listeners.
|
523
|
+
*/
|
524
|
+
eventNames(): Array<E.EventNames<EventTypes>>;
|
525
|
+
|
526
|
+
/**
|
527
|
+
* Return the listeners registered for a given event.
|
528
|
+
*/
|
529
|
+
listeners<T extends E.EventNames<EventTypes>>(
|
530
|
+
event: T,
|
531
|
+
): Array<E.EventListener<EventTypes, T>>;
|
532
|
+
|
533
|
+
/**
|
534
|
+
* Return the number of listeners listening to a given event.
|
535
|
+
*/
|
536
|
+
listenerCount(event: E.EventNames<EventTypes>): number;
|
537
|
+
|
538
|
+
/**
|
539
|
+
* Calls each of the listeners registered for a given event.
|
540
|
+
*/
|
541
|
+
emit<T extends E.EventNames<EventTypes>>(
|
542
|
+
event: T,
|
543
|
+
...args: E.EventArgs<EventTypes, T>
|
544
|
+
): boolean;
|
545
|
+
|
546
|
+
/**
|
547
|
+
* Add a listener for a given event.
|
548
|
+
*/
|
549
|
+
on<T extends E.EventNames<EventTypes>>(
|
550
|
+
event: T,
|
551
|
+
fn: E.EventListener<EventTypes, T>,
|
552
|
+
context?: Context,
|
553
|
+
): this;
|
554
|
+
addListener<T extends E.EventNames<EventTypes>>(
|
555
|
+
event: T,
|
556
|
+
fn: E.EventListener<EventTypes, T>,
|
557
|
+
context?: Context,
|
558
|
+
): this;
|
559
|
+
|
560
|
+
/**
|
561
|
+
* Add a one-time listener for a given event.
|
562
|
+
*/
|
563
|
+
once<T extends E.EventNames<EventTypes>>(
|
564
|
+
event: T,
|
565
|
+
fn: E.EventListener<EventTypes, T>,
|
566
|
+
context?: Context,
|
567
|
+
): this;
|
568
|
+
|
569
|
+
/**
|
570
|
+
* Remove the listeners of a given event.
|
571
|
+
*/
|
572
|
+
removeListener<T extends E.EventNames<EventTypes>>(
|
573
|
+
event: T,
|
574
|
+
fn?: E.EventListener<EventTypes, T>,
|
575
|
+
context?: Context,
|
576
|
+
once?: boolean,
|
577
|
+
): this;
|
578
|
+
off<T extends E.EventNames<EventTypes>>(
|
579
|
+
event: T,
|
580
|
+
fn?: E.EventListener<EventTypes, T>,
|
581
|
+
context?: Context,
|
582
|
+
once?: boolean,
|
583
|
+
): this;
|
584
|
+
|
585
|
+
/**
|
586
|
+
* Remove all listeners, or those of the specified event.
|
587
|
+
*/
|
588
|
+
removeAllListeners(event?: E.EventNames<EventTypes>): this;
|
589
|
+
}
|
590
|
+
|
591
|
+
declare namespace E {
|
592
|
+
export interface ListenerFn<Args extends any[] = any[]> {
|
593
|
+
(...args: Args): void;
|
594
|
+
}
|
595
|
+
|
596
|
+
export interface EventEmitterStatic {
|
597
|
+
new <
|
598
|
+
EventTypes extends ValidEventTypes = string | symbol,
|
599
|
+
Context = any,
|
600
|
+
>(): EventEmitter<EventTypes, Context>;
|
601
|
+
}
|
602
|
+
|
603
|
+
/**
|
604
|
+
* `object` should be in either of the following forms:
|
605
|
+
* ```
|
606
|
+
* interface EventTypes {
|
607
|
+
* 'event-with-parameters': any[]
|
608
|
+
* 'event-with-example-handler': (...args: any[]) => void
|
609
|
+
* }
|
610
|
+
* ```
|
611
|
+
*/
|
612
|
+
export type ValidEventTypes = string | symbol | object;
|
613
|
+
|
614
|
+
export type EventNames<T extends ValidEventTypes> = T extends string | symbol
|
615
|
+
? T
|
616
|
+
: keyof T;
|
617
|
+
|
618
|
+
export type ArgumentMap<T extends object> = {
|
619
|
+
[K in keyof T]: T[K] extends (...args: any[]) => void ? Parameters<T[K]>
|
620
|
+
: T[K] extends any[] ? T[K]
|
621
|
+
: any[];
|
622
|
+
};
|
623
|
+
|
624
|
+
export type EventListener<
|
625
|
+
T extends ValidEventTypes,
|
626
|
+
K extends EventNames<T>,
|
627
|
+
> = T extends string | symbol ? (...args: any[]) => void
|
628
|
+
: (
|
629
|
+
...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]
|
630
|
+
) => void;
|
631
|
+
|
632
|
+
export type EventArgs<
|
633
|
+
T extends ValidEventTypes,
|
634
|
+
K extends EventNames<T>,
|
635
|
+
> = Parameters<EventListener<T, K>>;
|
636
|
+
|
637
|
+
export const EventEmitter: EventEmitterStatic;
|
638
|
+
}
|