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