feat: async event emitter
This commit is contained in:
parent
60fb90c5ff
commit
4886a8a3a0
@ -4,22 +4,22 @@ import { middlewares } from '@nocobase/server';
|
|||||||
(async () => {
|
(async () => {
|
||||||
api.resourcer.use(middlewares.actionParams());
|
api.resourcer.use(middlewares.actionParams());
|
||||||
|
|
||||||
await api.loadPlugins();
|
api.on('plugins.afterLoad', async () => {
|
||||||
|
console.log('plugins.afterLoad')
|
||||||
if (process.env.NOCOBASE_ENV === 'demo') {
|
if (process.env.NOCOBASE_ENV === 'demo') {
|
||||||
api.resourcer.use(middlewares.demoBlacklistedActions({
|
api.resourcer.use(middlewares.demoBlacklistedActions({
|
||||||
emails: [process.env.ADMIN_EMAIL],
|
emails: [process.env.ADMIN_EMAIL],
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
api.use(middlewares.appDistServe({
|
||||||
|
root: process.env.APP_DIST,
|
||||||
|
useStaticServer: !(process.env.APP_USE_STATIC_SERVER === 'false' || !process.env.APP_USE_STATIC_SERVER),
|
||||||
}));
|
}));
|
||||||
}
|
|
||||||
|
|
||||||
api.use(middlewares.appDistServe({
|
|
||||||
root: process.env.APP_DIST,
|
|
||||||
useStaticServer: !(process.env.APP_USE_STATIC_SERVER === 'false' || !process.env.APP_USE_STATIC_SERVER),
|
|
||||||
}));
|
|
||||||
|
|
||||||
await api.database.getModel('collections').load();
|
|
||||||
|
|
||||||
api.listen(process.env.API_PORT, () => {
|
|
||||||
console.log(`http://localhost:${process.env.API_PORT}/`);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const start = Date.now();
|
||||||
|
await api.start(process.env.API_PORT);
|
||||||
|
console.log(api.database.getTables().map(t => t.getName()));
|
||||||
|
console.log(`Start-up time: ${(Date.now() - start) / 1000}s`);
|
||||||
|
console.log(`http://localhost:${process.env.API_PORT}/`);
|
||||||
})();
|
})();
|
||||||
|
@ -11,6 +11,10 @@ export default async function (this: Application, options = {}) {
|
|||||||
database.import({
|
database.import({
|
||||||
directory: path.resolve(__dirname, 'collections'),
|
directory: path.resolve(__dirname, 'collections'),
|
||||||
});
|
});
|
||||||
|
this.on('server.beforeStart', async () => {
|
||||||
|
console.log('server.beforeStart');
|
||||||
|
await database.getModel('collections').load();
|
||||||
|
});
|
||||||
const [Collection, Field] = database.getModels(['collections', 'fields']);
|
const [Collection, Field] = database.getModels(['collections', 'fields']);
|
||||||
Field.beforeCreate(async (model) => {
|
Field.beforeCreate(async (model) => {
|
||||||
if (!model.get('name')) {
|
if (!model.get('name')) {
|
||||||
|
@ -23,6 +23,60 @@ export class Application extends Koa {
|
|||||||
// this.runHook('afterInit');
|
// this.runHook('afterInit');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async emitAsync(event: string | symbol, ...args: any[]): Promise<boolean> {
|
||||||
|
// @ts-ignore
|
||||||
|
const events = this._events;
|
||||||
|
let callbacks = events[event];
|
||||||
|
if (!callbacks) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// helper function to reuse as much code as possible
|
||||||
|
const run = (cb) => {
|
||||||
|
switch (args.length) {
|
||||||
|
// fast cases
|
||||||
|
case 0:
|
||||||
|
cb = cb.call(this);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
cb = cb.call(this, args[0]);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
cb = cb.call(this, args[0], args[1]);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
cb = cb.call(this, args[0], args[1], args[2]);
|
||||||
|
break;
|
||||||
|
// slower
|
||||||
|
default:
|
||||||
|
cb = cb.apply(this, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
cb && (
|
||||||
|
cb instanceof Promise ||
|
||||||
|
typeof cb.then === 'function'
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.resolve(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof callbacks === 'function') {
|
||||||
|
await run(callbacks);
|
||||||
|
} else if (typeof callbacks === 'object') {
|
||||||
|
callbacks = callbacks.slice().filter(Boolean);
|
||||||
|
await callbacks.reduce((prev, next) => {
|
||||||
|
return prev.then((res) => {
|
||||||
|
return run(next).then((result) => Promise.resolve(res.concat(result)));
|
||||||
|
});
|
||||||
|
}, Promise.resolve([]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
registerPlugin(key: string | object, plugin?: any) {
|
registerPlugin(key: string | object, plugin?: any) {
|
||||||
if (typeof key === 'object') {
|
if (typeof key === 'object') {
|
||||||
Object.keys(key).forEach((k) => {
|
Object.keys(key).forEach((k) => {
|
||||||
@ -46,10 +100,18 @@ export class Application extends Koa {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async loadPlugins() {
|
async loadPlugins() {
|
||||||
|
await this.emitAsync('plugins.beforeLoad');
|
||||||
const allPlugins = this.plugins.values();
|
const allPlugins = this.plugins.values();
|
||||||
for (const plugin of allPlugins) {
|
for (const plugin of allPlugins) {
|
||||||
plugin.instance = await this.loadPlugin(plugin);
|
plugin.instance = await this.loadPlugin(plugin);
|
||||||
}
|
}
|
||||||
|
await this.emitAsync('plugins.afterLoad');
|
||||||
|
}
|
||||||
|
|
||||||
|
async start(port) {
|
||||||
|
await this.loadPlugins();
|
||||||
|
await this.emitAsync('server.beforeStart');
|
||||||
|
this.listen(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async loadPlugin({ entry, options = {} }: { entry: string | Function, options: any }) {
|
protected async loadPlugin({ entry, options = {} }: { entry: string | Function, options: any }) {
|
||||||
|
Loading…
Reference in New Issue
Block a user