@hapiness/proxy
Version:
Proxy extension for Hapiness
200 lines (159 loc) • 4.94 kB
Markdown
# API Reference
## Hapiness
The Hapiness object is used to bootstrap a module as Web Server.
### bootstrap(module, [ Extensions ])
Bootstrap a module and start the web server.
## HapinessModule
Declare an Hapiness module with the providers, routes and libs.
```javascript
({metadata})
class MyClass {}
```
- metadata
- `version` - module version
- `options`
- bootstrapped module :
- `host` - server host
- `port` - http server port
- `socketPort` - websocket server port
- `declarations` - Routes | Libs to declare in the module
- `providers` - Providers to add in the DI
- `imports` - Modules to import
- `exports` - Providers to export and will be available in the module that import it
- interfaces
- `OnStart` - Only for the bootstrapped module, called when the web server is started.
- `OnError` - Only for the bootstrapped module, it is the error handler.
- arguments: (error: Error)
- `OnRegister` - Called when the module is registered
- `OnModuleResolved` - Called when imported module is resolved
- arguments: (module: string)
## Provide config through a module
When you import a module, you can provide data.
```javascript
// external-module.ts
import {
HapinessModule,
CoreModuleWithProviders,
InjectionToken,
Inject,
Optional,
} from '/core';
const CONFIG = new InjectionToken('config');
interface Config {
baseUrl: string;
}
({
...
})
export class ExternalModule {
static setConfig(config: Config): CoreModuleWithProviders {
return {
module: ExternalModule,
providers: [{ provide: CONFIG, useValue: config }]
};
}
}
export class Service {
constructor(() (CONFIG) config) { // @Optional to not throw errors if config is not passed
...
}
}
```
```javascript
// main-module.ts
import {
HapinessModule,
} from '/core';
import { ExternalModule } from 'external-module';
({
...
imports: [ ExternalModule.setConfig({ hello: 'world!' }) ]
})
...
```
## Injectable
Declare an injectable provider
```javascript
()
class MyService {}
```
## Lib
Declare an empty component for any use
```javascript
()
class MyLib {}
```
## Optional
When you ask for a dependency, Optional tell to the DI to not throw an error if the dependency is not available.
```javascript
...
constructor(() dep: MyDep) {
if (dep) {
...
}
}
...
```
## Inject & InjectionToken
Create custom token for the DI
```javascript
const MY_CUSTOM_TOKEN = new InjectionToken('my-token');
({
...
imports: [{ provide: MY_CUSTOM_TOKEN, useValue: 'abcdef' }]
...
})
class MyModule {
constructor((MY_CUSTOM_TOKEN) myValue) {
console.log(myValue) // ouput: 'abcdef'
}
}
```
## Extensions
An extension is a class provided to the boostrap.
```javascript
class ExampleExt implements OnExtensionLoad {
public static setConfig(config: any): ExtensionWithConfig {
return {
token: HttpServerExt,
config
};
}
onExtensionLoad(module: CoreModule, config: any) {
...
}
}
```
Methods to implement:
- `onExtensionLoad` - Called while bootstrapping
- arguments: (module: CoreModule, config: any)
- returns: Observable<Extension>
- `OnModuleInstantiated` - (Optional) Called once the bootstrapped module is instanciated
- arguments: (module: CoreModule, extension value)
- returns: void
- `OnShutdown` - (Optional) Called once the process catch a `SIGTERM` or a `SIGINT` event
- arguments: (module: CoreModule, extension value)
- returns: ExtensionShutdown {
priority: ExtensionShutdownPriority.IMPORTANT | ExtensionShutdownPriority.NORMAL,
resolver: Observable<boolean>
}
The shutdown feature allow to stop gracefully the service.
the `IMPORTANT` priority is for the extensions that needs to process ongoing requests.
The `NORMAL` priority is for extensions that can be stopped directly.
Extension:
```javascript
{
value: any;
instance: any;
token: Type<any>;
}
```
- `value` - It's the value provided through the DI
- `instance` - Extension instance, `this`
- `token` - Class token (ex: ExampleExt)
# HTTP Server Extension
See the documentation: [here](src/extensions/http-server/README.md)
# Socket Server Extension
See the documentation: [here](src/extensions/socket-server/README.md)
# EventManager Extension
See the documentation: [here](src/extensions/event-manager/README.md)