@shrub/express 0.5.62 → 0.5.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/app.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Application } from "express";
2
2
  export declare const IExpressApplication: import("@shrub/core").IService<IExpressApplication>;
3
3
  export interface IExpressApplication extends Application {
4
+ dispose(): Promise<void>;
4
5
  }
@@ -1,7 +1,13 @@
1
1
  import { ModuleLoader } from "@shrub/core";
2
+ import { IHttpServer } from "@shrub/http";
3
+ import { createHttpTerminator } from "http-terminator";
2
4
  import { IExpressApplication } from "./app";
3
5
  import { ExpressModule } from "./module";
4
- /** A factory class for registering modules within an Express application context. */
6
+ /**
7
+ * A factory class for registering and managing modules within an Express application context. The factory
8
+ * will provide an Express app instance, automatically close open connections, and dispose the modules when
9
+ * the server has been terminated.
10
+ */
5
11
  export class ExpressFactory {
6
12
  constructor() {
7
13
  this.modules = [ExpressModule];
@@ -27,7 +33,15 @@ export class ExpressFactory {
27
33
  .configureServices(this.configureCallback)
28
34
  .useModules(this.modules);
29
35
  this.settings.forEach(cur => loader.useSettings(cur));
30
- return loader.load().then(modules => modules.services.get(IExpressApplication));
36
+ return loader.load().then(modules => {
37
+ // grab the http server instance used by the app
38
+ const server = modules.services.get(IHttpServer);
39
+ // the http terminator will monitor connections so they can be closed when terminating the process
40
+ const httpTerminator = createHttpTerminator({ server });
41
+ const app = modules.services.get(IExpressApplication);
42
+ app.dispose = () => httpTerminator.terminate().then(() => modules.dispose());
43
+ return app;
44
+ });
31
45
  }
32
46
  configureServices(callback) {
33
47
  const base = this.configureCallback;
@@ -46,4 +60,4 @@ export class ExpressFactory {
46
60
  return this;
47
61
  }
48
62
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0YsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLHFGQUFxRjtBQUNyRixNQUFNLE9BQU8sY0FBYztJQUEzQjtRQUNxQixZQUFPLEdBQWtDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekQsYUFBUSxHQUFnQyxFQUFFLENBQUM7UUFDcEQsc0JBQWlCLEdBQWlELEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQWlEdkYsQ0FBQztJQTlDRyxzQ0FBc0M7SUFDdEMsTUFBTSxDQUFDLE1BQU07UUFDVCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFzRDtRQUMzRSxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBc0M7UUFDcEQsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFtQztRQUNsRCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCw2SEFBNkg7SUFDN0gsTUFBTTtRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFO2FBQzVCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBc0Q7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBc0M7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiJ9
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0YsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekM7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQTNCO1FBQ3FCLFlBQU8sR0FBa0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQWdDLEVBQUUsQ0FBQztRQUNwRCxzQkFBaUIsR0FBaUQsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBMER2RixDQUFDO0lBdkRHLHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTTtRQUNULE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQXNEO1FBQzNFLE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFzQztRQUNwRCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQW1DO1FBQ2xELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDZIQUE2SDtJQUM3SCxNQUFNO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUU7YUFDNUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLGdEQUFnRDtZQUNoRCxNQUFNLE1BQU0sR0FBUSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0RCxrR0FBa0c7WUFDbEcsTUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBRXhELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDaEQsR0FBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBc0Q7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBc0M7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiJ9
@@ -19,6 +19,8 @@ export class ExpressModule {
19
19
  registration.registerSingleton(IExpressApplication, {
20
20
  create: services => {
21
21
  const app = express();
22
+ // add an empty dispose, the express factory will override this
23
+ app.dispose = () => Promise.resolve();
22
24
  app.use(requestContext(services));
23
25
  this.overrideListen(services, app);
24
26
  return app;
@@ -39,4 +41,4 @@ export class ExpressModule {
39
41
  };
40
42
  }
41
43
  }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBOEYsTUFBTSxhQUFhLENBQUM7QUFDdkksT0FBTyxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU1QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLEVBQXlCLENBQUM7QUFJM0UsTUFBTSxPQUFPLGFBQWE7SUFBMUI7UUFDYSxTQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQWlDekMsQ0FBQztJQS9CRyxVQUFVLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUF3QixRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsWUFBa0M7UUFDaEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNFLFlBQVksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RixZQUFZLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUU7WUFDaEQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sR0FBRyxHQUFHLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxHQUFHLENBQUM7WUFDZixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXVCO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQTRCLEVBQUUsR0FBb0I7UUFDckUsMEVBQTBFO1FBQzFFLG1GQUFtRjtRQUNuRiw0RUFBNEU7UUFDNUUsc0NBQXNDO1FBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNO1lBQ3hCLE1BQU0sTUFBTSxHQUFRLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztDQUNKIn0=
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBOEYsTUFBTSxhQUFhLENBQUM7QUFDdkksT0FBTyxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU1QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLEVBQXlCLENBQUM7QUFJM0UsTUFBTSxPQUFPLGFBQWE7SUFBMUI7UUFDYSxTQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQW1DekMsQ0FBQztJQWpDRyxVQUFVLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUF3QixRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsWUFBa0M7UUFDaEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNFLFlBQVksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RixZQUFZLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUU7WUFDaEQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sR0FBRyxHQUFHLE9BQU8sRUFBRSxDQUFDO2dCQUN0QiwrREFBK0Q7Z0JBQ3pELEdBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbkMsT0FBcUMsR0FBRyxDQUFDO1lBQzdDLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBdUI7UUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBNEIsRUFBRSxHQUFvQjtRQUNyRSwwRUFBMEU7UUFDMUUsbUZBQW1GO1FBQ25GLDRFQUE0RTtRQUM1RSxzQ0FBc0M7UUFDdEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU07WUFDeEIsTUFBTSxNQUFNLEdBQVEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM5QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQ0oifQ==
package/dist/factory.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  import { IModuleSettingsCollection, IServiceRegistration, ModuleInstanceOrConstructor } from "@shrub/core";
2
2
  import { IExpressApplication } from "./app";
3
- /** A factory class for registering modules within an Express application context. */
3
+ /**
4
+ * A factory class for registering and managing modules within an Express application context. The factory
5
+ * will provide an Express app instance, automatically close open connections, and dispose the modules when
6
+ * the server has been terminated.
7
+ */
4
8
  export declare class ExpressFactory {
5
9
  private readonly modules;
6
10
  private readonly settings;
package/dist/factory.js CHANGED
@@ -2,9 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExpressFactory = void 0;
4
4
  const core_1 = require("@shrub/core");
5
+ const http_1 = require("@shrub/http");
6
+ const http_terminator_1 = require("http-terminator");
5
7
  const app_1 = require("./app");
6
8
  const module_1 = require("./module");
7
- /** A factory class for registering modules within an Express application context. */
9
+ /**
10
+ * A factory class for registering and managing modules within an Express application context. The factory
11
+ * will provide an Express app instance, automatically close open connections, and dispose the modules when
12
+ * the server has been terminated.
13
+ */
8
14
  class ExpressFactory {
9
15
  constructor() {
10
16
  this.modules = [module_1.ExpressModule];
@@ -30,7 +36,15 @@ class ExpressFactory {
30
36
  .configureServices(this.configureCallback)
31
37
  .useModules(this.modules);
32
38
  this.settings.forEach(cur => loader.useSettings(cur));
33
- return loader.load().then(modules => modules.services.get(app_1.IExpressApplication));
39
+ return loader.load().then(modules => {
40
+ // grab the http server instance used by the app
41
+ const server = modules.services.get(http_1.IHttpServer);
42
+ // the http terminator will monitor connections so they can be closed when terminating the process
43
+ const httpTerminator = http_terminator_1.createHttpTerminator({ server });
44
+ const app = modules.services.get(app_1.IExpressApplication);
45
+ app.dispose = () => httpTerminator.terminate().then(() => modules.dispose());
46
+ return app;
47
+ });
34
48
  }
35
49
  configureServices(callback) {
36
50
  const base = this.configureCallback;
@@ -50,4 +64,4 @@ class ExpressFactory {
50
64
  }
51
65
  }
52
66
  exports.ExpressFactory = ExpressFactory;
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUF5SDtBQUN6SCwrQkFBNEM7QUFDNUMscUNBQXlDO0FBRXpDLHFGQUFxRjtBQUNyRixNQUFhLGNBQWM7SUFBM0I7UUFDcUIsWUFBTyxHQUFrQyxDQUFDLHNCQUFhLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQWdDLEVBQUUsQ0FBQztRQUNwRCxzQkFBaUIsR0FBaUQsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBaUR2RixDQUFDO0lBOUNHLHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTTtRQUNULE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQXNEO1FBQzNFLE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFzQztRQUNwRCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQW1DO1FBQ2xELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDZIQUE2SDtJQUM3SCxNQUFNO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQkFBWSxFQUFFO2FBQzVCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHlCQUFtQixDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBc0Q7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBc0M7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjtBQXBERCx3Q0FvREMifQ==
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUF5SDtBQUN6SCxzQ0FBMEM7QUFDMUMscURBQXVEO0FBQ3ZELCtCQUE0QztBQUM1QyxxQ0FBeUM7QUFFekM7Ozs7R0FJRztBQUNILE1BQWEsY0FBYztJQUEzQjtRQUNxQixZQUFPLEdBQWtDLENBQUMsc0JBQWEsQ0FBQyxDQUFDO1FBQ3pELGFBQVEsR0FBZ0MsRUFBRSxDQUFDO1FBQ3BELHNCQUFpQixHQUFpRCxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUEwRHZGLENBQUM7SUF2REcsc0NBQXNDO0lBQ3RDLE1BQU0sQ0FBQyxNQUFNO1FBQ1QsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBc0Q7UUFDM0UsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQXNDO1FBQ3BELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBbUM7UUFDbEQsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsNkhBQTZIO0lBQzdILE1BQU07UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFZLEVBQUU7YUFDNUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLGdEQUFnRDtZQUNoRCxNQUFNLE1BQU0sR0FBUSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxrQkFBVyxDQUFDLENBQUM7WUFDdEQsa0dBQWtHO1lBQ2xHLE1BQU0sY0FBYyxHQUFHLHNDQUFvQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUV4RCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyx5QkFBbUIsQ0FBQyxDQUFDO1lBQ2hELEdBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNwRixPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGlCQUFpQixDQUFDLFFBQXNEO1FBQ3BFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDLEVBQUU7WUFDcEMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXNDO1FBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUFtQztRQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0o7QUE3REQsd0NBNkRDIn0=
package/dist/module.js CHANGED
@@ -25,6 +25,8 @@ class ExpressModule {
25
25
  registration.registerSingleton(app_1.IExpressApplication, {
26
26
  create: services => {
27
27
  const app = express_1.default();
28
+ // add an empty dispose, the express factory will override this
29
+ app.dispose = () => Promise.resolve();
28
30
  app.use(request_context_1.requestContext(services));
29
31
  this.overrideListen(services, app);
30
32
  return app;
@@ -46,4 +48,4 @@ class ExpressModule {
46
48
  }
47
49
  }
48
50
  exports.ExpressModule = ExpressModule;
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBOEI7QUFDOUIsc0NBQXVJO0FBQ3ZJLHNDQUFnRjtBQUNoRiw2REFBMkY7QUFDM0YsdURBQWtHO0FBQ2xHLCtCQUE0QztBQUUvQixRQUFBLHFCQUFxQixHQUFHLG1CQUFZLEVBQXlCLENBQUM7QUFJM0UsTUFBYSxhQUFhO0lBQTFCO1FBQ2EsU0FBSSxHQUFHLFNBQVMsQ0FBQztRQUNqQixpQkFBWSxHQUFHLENBQUMsaUJBQVUsQ0FBQyxDQUFDO0lBaUN6QyxDQUFDO0lBL0JHLFVBQVUsQ0FBQyxJQUF3QjtRQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLDZCQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQXdCLFFBQVEsQ0FBQyxHQUFHLENBQUMseUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxZQUFrQztRQUNoRCxZQUFZLENBQUMsUUFBUSxDQUFDLDhDQUF5QixFQUFFLDZDQUF3QixDQUFDLENBQUM7UUFDM0UsWUFBWSxDQUFDLFFBQVEsQ0FBQyx3Q0FBc0IsRUFBRSx1Q0FBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBbUIsRUFBRTtZQUNoRCxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0JBQ2YsTUFBTSxHQUFHLEdBQUcsaUJBQU8sRUFBRSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLGdDQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sR0FBRyxDQUFDO1lBQ2YsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUF1QjtRQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLCtCQUF3QixDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyx5QkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVPLGNBQWMsQ0FBQyxRQUE0QixFQUFFLEdBQW9CO1FBQ3JFLDBFQUEwRTtRQUMxRSxtRkFBbUY7UUFDbkYsNEVBQTRFO1FBQzVFLHNDQUFzQztRQUN0QyxHQUFHLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTTtZQUN4QixNQUFNLE1BQU0sR0FBUSxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFXLENBQUMsQ0FBQztZQUM5QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQ0o7QUFuQ0Qsc0NBbUNDIn0=
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBOEI7QUFDOUIsc0NBQXVJO0FBQ3ZJLHNDQUFnRjtBQUNoRiw2REFBMkY7QUFDM0YsdURBQWtHO0FBQ2xHLCtCQUE0QztBQUUvQixRQUFBLHFCQUFxQixHQUFHLG1CQUFZLEVBQXlCLENBQUM7QUFJM0UsTUFBYSxhQUFhO0lBQTFCO1FBQ2EsU0FBSSxHQUFHLFNBQVMsQ0FBQztRQUNqQixpQkFBWSxHQUFHLENBQUMsaUJBQVUsQ0FBQyxDQUFDO0lBbUN6QyxDQUFDO0lBakNHLFVBQVUsQ0FBQyxJQUF3QjtRQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLDZCQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQXdCLFFBQVEsQ0FBQyxHQUFHLENBQUMseUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxZQUFrQztRQUNoRCxZQUFZLENBQUMsUUFBUSxDQUFDLDhDQUF5QixFQUFFLDZDQUF3QixDQUFDLENBQUM7UUFDM0UsWUFBWSxDQUFDLFFBQVEsQ0FBQyx3Q0FBc0IsRUFBRSx1Q0FBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBbUIsRUFBRTtZQUNoRCxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0JBQ2YsTUFBTSxHQUFHLEdBQUcsaUJBQU8sRUFBRSxDQUFDO2dCQUN0QiwrREFBK0Q7Z0JBQ3pELEdBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QyxHQUFHLENBQUMsR0FBRyxDQUFDLGdDQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLE9BQXFDLEdBQUcsQ0FBQztZQUM3QyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXVCO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQXdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHlCQUFtQixDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQTRCLEVBQUUsR0FBb0I7UUFDckUsMEVBQTBFO1FBQzFFLG1GQUFtRjtRQUNuRiw0RUFBNEU7UUFDNUUsc0NBQXNDO1FBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNO1lBQ3hCLE1BQU0sTUFBTSxHQUFRLFFBQVEsQ0FBQyxHQUFHLENBQUMsa0JBQVcsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FDSjtBQXJDRCxzQ0FxQ0MifQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shrub/express",
3
3
  "description": "A module that adds support for Express based apps.",
4
- "version": "0.5.62",
4
+ "version": "0.5.65",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -25,12 +25,13 @@
25
25
  "test": "jest"
26
26
  },
27
27
  "dependencies": {
28
- "@shrub/core": "0.5.62",
29
- "@shrub/http": "0.5.62",
30
- "express": "^4.17.1"
28
+ "@shrub/core": "0.5.65",
29
+ "@shrub/http": "0.5.65",
30
+ "express": "^4.17.1",
31
+ "http-terminator": "^3.2.0"
31
32
  },
32
33
  "devDependencies": {
33
34
  "@types/express": "4.17.9"
34
35
  },
35
- "gitHead": "6f71a2e83f1609ac912e5bcda23cfe2ad41cb90e"
36
+ "gitHead": "d5842abfd26415d89ee4fc70106115a438f9f4ba"
36
37
  }