mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-10-16 07:51:59 +00:00
The Report Your Errors Update
* Add automatic error reporting with Sentry.io * Filter a bunch of bad errors from showing up on Sentry * Add module.hasModule method. * Fix deep_copy * Fix disallow mouse interaction with extensions * Add some new icons to the icon font for mod cards * Allow Ctrl-Shift-Clicking emotes. * Rarity sorting for experiments and unset display for unused experiments.
This commit is contained in:
parent
e3a7e3b64d
commit
d7a07a5612
32 changed files with 575 additions and 83 deletions
|
@ -119,7 +119,7 @@ export class EventEmitter {
|
|||
return list ? Array.from(list) : [];
|
||||
}
|
||||
|
||||
emit(event, ...args) {
|
||||
emitUnsafe(event, ...args) {
|
||||
const list = this.__listeners[event];
|
||||
if ( ! list )
|
||||
return;
|
||||
|
@ -160,28 +160,25 @@ export class EventEmitter {
|
|||
}
|
||||
}
|
||||
|
||||
emitSafe(event, ...args) {
|
||||
try {
|
||||
return [this.emit(event, ...args), undefined];
|
||||
|
||||
} catch(err) {
|
||||
return [null, err];
|
||||
}
|
||||
}
|
||||
|
||||
emitAsync(event, ...args) {
|
||||
emit(event, ...args) {
|
||||
const list = this.__listeners[event];
|
||||
if ( ! list )
|
||||
return Promise.resolve([]);
|
||||
return;
|
||||
|
||||
// Track removals separately to make iteration over the event list
|
||||
// much, much simpler.
|
||||
const removed = new Set,
|
||||
promises = [];
|
||||
const removed = new Set;
|
||||
|
||||
for(const item of list) {
|
||||
const [fn, ctx, ttl] = item;
|
||||
const ret = fn.apply(ctx, args);
|
||||
let ret;
|
||||
try {
|
||||
ret = fn.apply(ctx, args);
|
||||
} catch(err) {
|
||||
if ( this.log )
|
||||
this.log.capture(err, {tags: {event}, extra:{args}});
|
||||
}
|
||||
|
||||
if ( ret === Detach )
|
||||
removed.add(item);
|
||||
else if ( ttl !== false ) {
|
||||
|
@ -190,9 +187,6 @@ export class EventEmitter {
|
|||
else
|
||||
item[2] = ttl - 1;
|
||||
}
|
||||
|
||||
if ( ret !== Detach )
|
||||
promises.push(ret);
|
||||
}
|
||||
|
||||
if ( removed.size ) {
|
||||
|
@ -211,8 +205,72 @@ export class EventEmitter {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.all(promises);
|
||||
async emitAsync(event, ...args) {
|
||||
const list = this.__listeners[event];
|
||||
if ( ! list )
|
||||
return [];
|
||||
|
||||
// Track removals separately to make iteration over the event list
|
||||
// much, much simpler.
|
||||
const removed = new Set,
|
||||
promises = [];
|
||||
|
||||
for(const item of list) {
|
||||
const [fn, ctx] = item;
|
||||
let ret;
|
||||
try {
|
||||
ret = fn.apply(ctx, args);
|
||||
} catch(err) {
|
||||
if ( this.log )
|
||||
this.log.capture(err, {tags: {event}, extra: {args}});
|
||||
}
|
||||
|
||||
if ( !(ret instanceof Promise) )
|
||||
ret = Promise.resolve(ret);
|
||||
|
||||
promises.push(ret.then(r => {
|
||||
const new_ttl = item[2];
|
||||
if ( r === Detach )
|
||||
removed.add(item);
|
||||
else if ( new_ttl !== false ) {
|
||||
if ( new_ttl <= 1 )
|
||||
removed.add(item);
|
||||
else
|
||||
item[2] = new_ttl - 1;
|
||||
}
|
||||
|
||||
if ( ret !== Detach )
|
||||
return ret;
|
||||
}).catch(err => {
|
||||
if ( this.log )
|
||||
this.log.capture(err, {event, args});
|
||||
|
||||
return null;
|
||||
}));
|
||||
}
|
||||
|
||||
const out = await Promise.all(promises);
|
||||
|
||||
if ( removed.size ) {
|
||||
// Re-grab the list to make sure it wasn't removed mid-iteration.
|
||||
const new_list = this.__listeners[event];
|
||||
if ( new_list ) {
|
||||
for(const item of removed) {
|
||||
const idx = new_list.indexOf(item);
|
||||
if ( idx !== -1 )
|
||||
new_list.splice(idx, 1);
|
||||
}
|
||||
|
||||
if ( ! list.length ) {
|
||||
this.__listeners[event] = null;
|
||||
this.__dead_events++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue