Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,15 @@ $ yarn add @hapiness/core

```javascript
"dependencies": {
"@hapiness/core": "^1.0.0-rc.3",
"@hapiness/core": "^1.0.0-rc.4",
//...
}
//...
```

### Use Hapiness API

Actually, we're in **development** mode: **v1.0.0-rc.3**
Actually, we're in **development** mode: **v1.0.0-rc.4**

See [API](https://github.com/hapinessjs/hapiness/blob/master/API.md) Reference to know what's already implemented.

Expand All @@ -116,6 +116,9 @@ To set up your development environment:

## Change History

* v1.0.0-rc.4 (2017-07-10)
* Bootstrap hooks call order fix
* Hooks and create component errors fix
* v1.0.0-rc.3 (2017-07-03)
* Boostrap extension loader fix
* v1.0.0-rc.2 (2017-06-29)
Expand Down
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@hapiness/core",
"version": "1.0.0-rc.3",
"version": "1.0.0-rc.4",
"description": "Project to have a HapiJS (https://hapijs.com/) based framework to create easier NodeJS back-end with some awesome features",
"main": "index.js",
"types": "index.d.ts",
Expand Down Expand Up @@ -76,12 +76,12 @@
"@types/hapi": "^16.1.6",
"@types/hoek": "^4.1.3",
"@types/joi": "^10.4.0",
"@types/node": "^8.0.7",
"@types/node": "^8.0.9",
"@types/websocket": "^0.0.34",
"debug": "^2.6.8",
"hapi": "^16.4.3",
"reflect-metadata": "^0.1.10",
"rxjs": "^5.4.1",
"rxjs": "^5.4.2",
"websocket": "^1.0.24"
},
"devDependencies": {
Expand All @@ -90,10 +90,10 @@
"fs-extra": "^3.0.1",
"istanbul": "^1.1.0-alpha.1",
"mocha": "^3.4.2",
"mocha-typescript": "^1.1.5",
"mocha-typescript": "^1.1.7",
"rimraf": "^2.6.1",
"ts-node": "^3.1.0",
"tslint": "^5.4.3",
"ts-node": "^3.2.0",
"tslint": "^5.5.0",
"typescript": "^2.4.1",
"unit.js": "^2.0.0"
},
Expand Down
20 changes: 6 additions & 14 deletions src/core/bootstrap.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'rxjs/add/observable/forkJoin';
import { HapinessModule, Type } from './decorators';
import { Type } from './decorators';
import { ExtentionHooksEnum, ModuleEnum } from './enums';
import { HookManager } from './hook';
import { CoreModule, CoreProvide, ModuleManager } from './module';
Expand Down Expand Up @@ -79,25 +79,17 @@ export class Hapiness {
.filter(m => !!m.parent)
.filter(m => HookManager.hasLifecycleHook(ModuleEnum.OnRegister.toString(), m.token))
.map(m => HookManager.triggerHook(ModuleEnum.OnRegister.toString(), m.token, m.instance))
.concat(
HookManager.triggerHook(ModuleEnum.OnStart.toString(), this.module.token,
this.module.instance, null, false)
)
.concat(this.extensions.map(ext => this.moduleInstantiated(ext)))
).subscribe(_ => resolve(), _ => this.handleError(_, reject));
.concat(Observable.of(''))
)
.switchMap(_ => HookManager.triggerHook(ModuleEnum.OnStart.toString(), this.module.token,
this.module.instance, null, false))
.subscribe(_ => resolve(), _ => reject(_));
}, /* istanbul ignore next */ _ => reject(_));
});
});
}

private static handleError(error: Error, reject) {
debug('an error occured', error.message);
ModuleManager.instantiateModule(this.module).subscribe(_ => {
HookManager.triggerHook(ModuleEnum.OnError.toString(), _.token, _.instance, [ error ], false);
reject(error);
}, /* istanbul ignore next */ _ => reject(_));
}

/**
* Convert an extension type to ExtensionWithConfig
*
Expand Down
14 changes: 9 additions & 5 deletions src/core/di.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,15 @@ export class DependencyInjection {
* @returns T
*/
static instantiateComponent<T>(component: Type<T>, di: ReflectiveInjector): T {
const reflectiveDeps: ReflectiveDependency[] = ReflectiveInjector.resolve([component])
.reduce((a, x: ResolvedReflectiveProvider) => a.concat(x.resolvedFactories), [])
.reduce((a, r: ResolvedReflectiveFactory) => a.concat(r.dependencies), []);
const deps = reflectiveDeps.map(d => di['_getByReflectiveDependency'](d));
return Reflect.construct(component, deps);
try {
const reflectiveDeps: ReflectiveDependency[] = ReflectiveInjector.resolve([component])
.reduce((a, x: ResolvedReflectiveProvider) => a.concat(x.resolvedFactories), [])
.reduce((a, r: ResolvedReflectiveFactory) => a.concat(r.dependencies), []);
const deps = reflectiveDeps.map(d => di['_getByReflectiveDependency'](d));
return Reflect.construct(component, deps);
} catch (e) {
console.error.apply(console, e);
}
}

}
4 changes: 4 additions & 0 deletions src/core/hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export class HookManager {
debug('triggering hook', hook, token ? token.name : null);
Hoek.assert((!!token && !!instance), 'Cannot trigger without token/instance');
if (this.hasLifecycleHook<T>(hook, token)) {
try {
const result = Reflect.apply(instance[hook], instance, args || []);
if (result instanceof Observable) {
return result;
Expand All @@ -41,6 +42,9 @@ export class HookManager {
observer.complete();
});
}
} catch (e) {
console.error.apply(console, e);
}
}
return Observable.create((observer) => {
if (throwErr) {
Expand Down
1 change: 0 additions & 1 deletion src/core/metadata.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'reflect-metadata';
import * as Boom from 'boom';
import * as Debug from 'debug';
const debug = Debug('hapiness:metadata');

Expand Down
14 changes: 2 additions & 12 deletions src/core/module.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { extractMetadataByDecorator } from './metadata';
import { ReflectiveInjector } from '../externals/injection-js';
import { reflector } from '../externals/injection-js/reflection/reflection';
import { HapinessModule, Type, InjectionToken } from './decorators';
import { DependencyInjection } from './di';
import { Server } from 'hapi';
import * as Hoek from 'hoek';
import { Observable } from 'rxjs/Rx';
const debug = require('debug')('hapiness:module');
Expand Down Expand Up @@ -136,7 +134,7 @@ export class ModuleManager {
const lookup = (_module: CoreModule) => {
const els = [].concat((_module[element] && Array.isArray(_module[element])) ? _module[element] : []);
return (_module.modules || []).map(m => lookup(m)).reduce((acc, cur) => acc.concat(cur), []).concat(els).filter(_ => !!_);
}
};
return lookup(module);
}

Expand All @@ -149,7 +147,7 @@ export class ModuleManager {
public static getModules(module: CoreModule): CoreModule[] {
const lookup = (_module: CoreModule) => {
return [].concat(_module).concat((_module.modules || []).map(m => lookup(m)).reduce((a, c) => a.concat(c), []));
}
};
return lookup(module);
}

Expand Down Expand Up @@ -292,11 +290,3 @@ export interface OnRegister { onRegister(): void; }
*/
export interface OnStart { onStart(): void; }

/**
* Module Lifecycle Hook
* called when error are catched
*
* @param {Error} error
* @returns void
*/
export interface OnError { onError(error: Error): void; }
36 changes: 18 additions & 18 deletions src/extensions/http-server/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import { Extension, OnExtensionLoad, OnModuleInstantiated } from '../../core/boo
import { DependencyInjection } from '../../core/di';
import { HookManager } from '../../core/hook';
import { extractMetadataByDecorator } from '../../core/metadata';
import { CoreModule, ModuleLevel, ModuleManager } from '../../core/module';
import { CoreModule, ModuleManager } from '../../core/module';
import { Lifecycle } from './decorators';
import { enumByMethod, LifecycleComponentEnum, RouteMethodsEnum } from './enums';
import { enumByMethod, LifecycleComponentEnum } from './enums';
import { LifecycleManager } from './lifecycle';
import { CoreRoute, RouteBuilder } from './route';
import { Observable } from 'rxjs/Observable';
Expand Down Expand Up @@ -41,20 +41,12 @@ export class HttpServerExt implements OnExtensionLoad, OnModuleInstantiated {
).subscribe(routes => {
debug('routes and plugins registered');
LifecycleManager.routeLifecycle(this.server, routes.reduce((a, c) => a.concat(c), []));
this.server.start()
.then(() => {
debug('http server started', this.server.info.uri);
observer.next({
instance: this,
token: HttpServerExt,
value: this.server
});
observer.complete();
})
.catch(err => {
observer.error(err);
observer.complete();
});
observer.next({
instance: this,
token: HttpServerExt,
value: this.server
});
observer.complete();
}, err => {
observer.error(err);
observer.complete();
Expand All @@ -65,8 +57,16 @@ export class HttpServerExt implements OnExtensionLoad, OnModuleInstantiated {
onModuleInstantiated(module: CoreModule) {
return Observable.create(observer => {
this.instantiateLifecycle(this.server, module);
observer.next();
observer.complete();
this.server.start()
.then(() => {
debug('http server started', this.server.info.uri);
observer.next();
observer.complete();
})
.catch(err => {
observer.error(err);
observer.complete();
});
});
}

Expand Down
2 changes: 0 additions & 2 deletions src/extensions/http-server/lifecycle.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { HookManager } from '../../core/hook';
import { LifecycleEventsEnum, LifecycleHooksEnum } from './enums';
import { RouteBuilder, CoreRoute } from './route';
import { CoreModule, DependencyInjection } from '../../core';
import { Observable } from 'rxjs/Observable';
import { Request, ReplyWithContinue, Server } from 'hapi';
import * as Debug from 'debug';
const debug = Debug('lifecycle/hook');
Expand Down
6 changes: 1 addition & 5 deletions src/extensions/socket-server/extension.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { CoreModule, Extension, ExtensionWithConfig, OnExtensionLoad } from '../../core';
import { Observable } from 'rxjs/Observable';
import { server, connection, request } from 'websocket';
import { Socket } from './socket';
import { server } from 'websocket';
import { WebSocketServer } from './server';
import * as http from 'http';
import * as Debug from 'debug';
const debug = Debug('hapiness:extension:socketserver');

Expand All @@ -18,8 +16,6 @@ export interface SocketConfig {
export class SocketServerExt implements OnExtensionLoad {

private server: server;
private subscribers: Array<(socket: Socket) => void>;
private sockets: Socket[];

public static setConfig(config: SocketConfig): ExtensionWithConfig {
return {
Expand Down
23 changes: 10 additions & 13 deletions src/extensions/socket-server/server.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import { HookManager } from '../../core/hook';
import { CoreModule, ModuleLevel, ModuleManager } from '../../core/module';
import { Observable } from 'rxjs/Observable';
import { server, connection, request } from 'websocket';
import { server, request } from 'websocket';
import { Socket } from './socket';
import { SocketConfig } from './extension';
import * as http from 'http';
Expand All @@ -15,32 +12,32 @@ export class WebSocketServer {
private sockets: Socket[];

constructor(config: SocketConfig) {
const httpServer = http.createServer((request, response) => {
const httpServer = http.createServer((_request, _response) => {
/* istanbul ignore next */
response.writeHead(404);
_response.writeHead(404);
/* istanbul ignore next */
response.end();
_response.end();
});
httpServer.listen(config.port);
delete config.port;
const _config = Object.assign({ httpServer }, config);
this.server = new server(_config);
this.sockets = [];
this.subscribers = [];
this.server.on('request', request => {
this.onRequestHandler(request);
this.server.on('request', _request => {
this.onRequestHandler(_request);
});
}

/**
* Resquest handler
* Accept the request
*
* @param {request} request
* @param {request} _request
*/
private onRequestHandler(request: request) {
const connection = request.accept(null, request.origin);
const socket = new Socket(request, connection);
private onRequestHandler(_request: request) {
const connection = _request.accept(null, _request.origin);
const socket = new Socket(_request, connection);
const index = this.sockets.push(socket) - 1;
this.subscribers.forEach(sub => sub.apply(this, [ socket ]));
connection.on('close', conn => {
Expand Down
20 changes: 10 additions & 10 deletions src/extensions/socket-server/socket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { connection, request } from 'websocket';
export class Socket {

constructor(
private request: request,
private connection: connection
private _request: request,
private _connection: connection
) {}

/**
Expand All @@ -16,16 +16,16 @@ export class Socket {
on(event: string, callback: (data: any) => void) {
switch (event) {
case '*':
this.connection.on('message', callback);
this._connection.on('message', callback);
break;
case 'close':
this.connection.on(event, callback);
this._connection.on(event, callback);
break;
case 'error':
this.connection.on(event, callback);
this._connection.on(event, callback);
break;
default:
this.connection.on('message', message => {
this._connection.on('message', message => {
if (message.type === 'utf8') {
const parsed = this.getJSON(message.utf8Data);
if (parsed.event === event) { callback(parsed.data); }
Expand All @@ -40,7 +40,7 @@ export class Socket {
* @param {(data:Buffer)=>void} callback
*/
onBytes(callback: (data: Buffer) => void) {
this.connection.on('message', message => {
this._connection.on('message', message => {
if (message.type === 'binary') {
callback(message.binaryData);
}
Expand All @@ -54,7 +54,7 @@ export class Socket {
* @param {any} data
*/
emit(event: string, data: any) {
this.connection.sendUTF(JSON.stringify({
this._connection.sendUTF(JSON.stringify({
event,
data
}));
Expand All @@ -66,14 +66,14 @@ export class Socket {
* @param {Buffer} data
*/
emitBytes(data: Buffer) {
this.connection.sendBytes(data);
this._connection.sendBytes(data);
}

/**
* Close connection
*/
close() {
this.connection.close();
this._connection.close();
}

private getJSON(data: string) {
Expand Down
Loading