Skip to content

Commit

Permalink
feat(flv/utils/Observer): update Observer for compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
leonardoFu committed Aug 8, 2018
1 parent acef267 commit f51d878
Show file tree
Hide file tree
Showing 5 changed files with 1,635 additions and 29 deletions.
796 changes: 795 additions & 1 deletion packages/xgplayer-flv/browser/index.js

Large diffs are not rendered by default.

806 changes: 805 additions & 1 deletion packages/xgplayer-flv/dist/index.js

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions packages/xgplayer-flv/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class FlvPlayer extends Player {
this._options = options
this.__flv__ = null
this.init(options)

Object.defineProperty(this, 'src', {
set: (val) => {
if (typeof val === 'string' && val.startsWith('blob:')) {
Expand Down Expand Up @@ -41,6 +42,8 @@ class FlvPlayer extends Player {
this.once('destroy', () => {
VodTask.clear()
player.__flv__.destroy()
player.__flv__.mse = null
player.video.src = ''
player.__flv__ = null
})
}
Expand Down
57 changes: 31 additions & 26 deletions packages/xgplayer-flv/src/utils/Observer.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,74 +2,79 @@
* @author fuyuhao
*/

const nativeSlice = Array.prototype.slice

class Observer {
constructor () {
this.fnId = 0
this._listenerIdMap = new Map()
this._listeners = new Map()
this.fnId = 1
this._listenerIdMap = {}
this._listeners = {}
}
on (key, fn) {
const fnId = this.fnId++
const listeners = this._getListenersByKey(key)
this._listenerIdMap.set(fnId, fn)
this._listenerIdMap[fnId] = fn
if (listeners) {
listeners.unshift(fnId)
return
return fnId
}
this._listeners.set(key, [fnId])
this._listeners[key] = [fnId]
return fnId
}
emit (key, ...params) {
this._getListenersByKey(key).forEach(fnId => {
const fn = this._getListenerById(fnId)
fn && fn(...params)
})
emit (key) {
const args = nativeSlice.call(arguments, 1)
const listeners = this._getListenersByKey(key) || []
for (let i = 0, len = listeners.length; i < len; i++) {
const fn = this._getListenerById(listeners[i])
fn && fn.apply(null, args)
}
}
once (key, fn) {
const fnId = this.fnId++
const listeners = this._getListenersByKey(key)
this._listenerIdMap.set(fnId, (...params) => {
fn(...params)
this._listenerIdMap[fnId] = () => {
const args = nativeSlice.call(arguments)
fn.apply(null, args)
this.off(key, fnId)
})
}
if (listeners) {
listeners.unshift(fnId)
return
return fnId
}
this._listeners.set(key, [fnId])
this._listeners[key] = [fnId]
return fnId
}
off (key, fnId) {
const listeners = this._getListenersByKey(key)
const fn = this._getListenerById(fnId)
if (!fn || !listeners || !listeners.includes(fnId)) {
if (!fn || !listeners || listeners.indexOf(fnId) < 0) {
return
}
this._listenerIdMap.delete(fnId)
delete this._listenerIdMap[fnId]
if (listeners.length === 1) {
this._listeners.delete(key)
delete this._listeners[key]
} else {
listeners.splice(listeners.indexOf(fnId), 1)
listeners[listeners.indexOf(fnId)] = undefined
}
}
_getListenersByKey (key) {
return this._listeners.get(key)
return this._listeners[key]
}
_getListenerById (fnId) {
return this._listenerIdMap.get(fnId)
return this._listenerIdMap[fnId]
}
flush (key) {
const listeners = this._getListenersByKey(key)
if (listeners) {
listeners.forEach(fnId => {
this._listenerIdMap.delete(fnId)
delete this._listenerIdMap[fnId]
})
this._listeners.delete(key)
delete this._listeners[key]
}
}
destroy () {
this._listeners.clear()
this._listenerIdMap.clear()
this._listeners = null
this._listenerIdMap = null
}
}

Expand Down

0 comments on commit f51d878

Please sign in to comment.