libpag
Version:
Portable Animated Graphics
62 lines (54 loc) • 2.42 kB
text/typescript
import { PAGModule } from '../pag-module';
export function wasmAwaitRewind(constructor: any) {
const ignoreStaticFunctions = ['length', 'name', 'prototype', 'wasmAsyncMethods'];
let staticFunctions = Object.getOwnPropertyNames(constructor).filter(
(name) => ignoreStaticFunctions.indexOf(name) === -1,
);
if (constructor.wasmAsyncMethods && constructor.wasmAsyncMethods.length > 0) {
staticFunctions = staticFunctions.filter((name) => constructor.wasmAsyncMethods.indexOf(name) === -1);
}
let functions = Object.getOwnPropertyNames(constructor.prototype).filter(
(name) => name !== 'constructor' && typeof constructor.prototype[name] === 'function',
);
if (constructor.prototype.wasmAsyncMethods && constructor.prototype.wasmAsyncMethods.length > 0) {
functions = functions.filter((name) => constructor.prototype.wasmAsyncMethods.indexOf(name) === -1);
}
const proxyFn = (target: { [prop: string]: (...args: any[]) => any }, methodName: string) => {
const fn = target[methodName];
target[methodName] = function (...args) {
if (PAGModule.Asyncify.currData !== null) {
const currData = PAGModule.Asyncify.currData;
PAGModule.Asyncify.currData = null;
const ret = fn.call(this, ...args);
PAGModule.Asyncify.currData = currData;
return ret;
} else {
return fn.call(this, ...args);
}
};
};
staticFunctions.forEach((name) => proxyFn(constructor, name));
functions.forEach((name) => proxyFn(constructor.prototype, name));
}
export function wasmAsyncMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
if (!target.wasmAsyncMethods) {
target.wasmAsyncMethods = [];
}
target.wasmAsyncMethods.push(propertyKey);
}
export function destroyVerify(constructor: any) {
let functions = Object.getOwnPropertyNames(constructor.prototype).filter(
(name) => name !== 'constructor' && typeof constructor.prototype[name] === 'function',
);
const proxyFn = (target: { [prop: string]: any }, methodName: string) => {
const fn = target[methodName];
target[methodName] = function (...args: any[]) {
if (this['isDestroyed']) {
console.error(`Don't call ${methodName} of the ${constructor.name} that is destroyed.`);
return;
}
return fn.call(this, ...args);
};
};
functions.forEach((name) => proxyFn(constructor.prototype, name));
}