1
+ import { EMPTY_FUNCTION } from '../../constant' ;
2
+ interface Options {
3
+ src : string ,
4
+ autoPlay : boolean ,
5
+ loop : boolean ,
6
+ onPlay : Function ,
7
+ onPause : Function ,
8
+ onEnded : Function
9
+ } ;
10
+
11
+ export default class Audio {
12
+ static readonly defaultOptions : Options = {
13
+ src : '' ,
14
+ autoPlay : false ,
15
+ loop : false ,
16
+ onPlay : EMPTY_FUNCTION ,
17
+ onPause : EMPTY_FUNCTION ,
18
+ onEnded : EMPTY_FUNCTION
19
+ }
20
+
21
+ public isPlaying : boolean = false ;
22
+ private element : HTMLAudioElement ;
23
+
24
+ constructor ( options : Options ) {
25
+ options = { ...options , ...Audio . defaultOptions } ;
26
+ this . element = this . createAudioElement ( options ) ;
27
+ }
28
+
29
+ private createAudioElement ( options : Options ) : HTMLAudioElement {
30
+ const wrapEvent = ( userEvent = EMPTY_FUNCTION , proxyEvent = EMPTY_FUNCTION ) => {
31
+ return ( event : Event ) => {
32
+ try {
33
+ proxyEvent ( event ) ;
34
+ }
35
+ finally
36
+ {
37
+ userEvent ( event ) ;
38
+ }
39
+ } ;
40
+ } ;
41
+
42
+ const onPlay = ( ) => {
43
+ this . isPlaying = true ;
44
+ } ;
45
+ const onPause = ( ) => {
46
+ this . isPlaying = false ;
47
+ } ;
48
+ const onEnded = ( ) => {
49
+ this . isPlaying = ! options . loop ;
50
+ }
51
+
52
+ let element = document . createElement ( 'audio' ) ;
53
+ element . autoplay = options . autoPlay ;
54
+ element . setAttribute ( 'src' , options . src ) ;
55
+ element . setAttribute ( 'loop' , options . loop ? 'loop' : '' ) ;
56
+
57
+ // events for audio
58
+ element . onplay = wrapEvent ( options . onPlay , onPlay ) ;
59
+ element . onpause = wrapEvent ( options . onPause , onPause ) ;
60
+ element . onended = wrapEvent ( options . onEnded , onEnded ) ;
61
+
62
+ return element ;
63
+ }
64
+
65
+ public play ( ) {
66
+ this . element . play ( ) ;
67
+ }
68
+
69
+ public pause ( ) {
70
+ this . element . pause ( ) ;
71
+ }
72
+ }
0 commit comments