Skip to content

Commit d578ed2

Browse files
authored
Merge pull request #42 from hapinessjs/next
release(version): v2.0.0
2 parents 45ab6fc + 2ce18be commit d578ed2

17 files changed

Lines changed: 914 additions & 250 deletions

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
# Mongo Module
3535

36-
`Mongo` module for the Hapiness framework including a `mongoose` adapter and a `mongoose-gridfs` one.
36+
`Mongo` module for the Hapiness framework including `mongoose`, `mongoose-gridfs` (deprecated) and `mongoose-gridfs-bucket` adapter one.
3737

3838
## Table of contents
3939

@@ -112,7 +112,7 @@ Your adapter should be a class which inherits from `AbstractHapinessMongoAdapter
112112

113113
### Step 2
114114

115-
You absolutely need to implement a static function `getInterfaceName`, which will return a uniq string identifier for your adapter (**NOTE** `mongoose` and `mongoose-gridfs` are already used by adapters provided by this module).
115+
You absolutely need to implement a static function `getInterfaceName`, which will return a uniq string identifier for your adapter (**NOTE** `mongoose`, `mongoose-gridfs` and `mongoose-gridfs-bucket` are already used by adapters provided by this module).
116116

117117
### Step 3
118118

@@ -486,6 +486,11 @@ To set up your development environment:
486486

487487
## Change History
488488

489+
* v2.0.0
490+
* Updated mongoose to latest version
491+
* Removed the call to createConnection from the constructor of mongo adapter.
492+
* Now catch connection errors and pipe them out to be catch by user later on. No more waiting for timeout to realize there is a connection error.
493+
* MongooseGridfsAdapter is now deprecated. Use MongooseGridfsBucketAdapter
489494
* v1.2.0 (2018-04-05)
490495
* Updated packages' versions.
491496
* added support of `OnShutdown` of `hapiness Core`
@@ -520,7 +525,7 @@ To set up your development environment:
520525

521526
<table>
522527
<tr>
523-
<td colspan="4" align="center"><a href="https://www.tadaweb.com"><img src="http://bit.ly/2xHQkTi" width="117" alt="tadaweb" /></a></td>
528+
<td colspan="5" align="center"><a href="https://www.tadaweb.com"><img src="http://bit.ly/2xHQkTi" width="117" alt="tadaweb" /></a></td>
524529
</tr>
525530
<tr>
526531
<td align="center"><a href="https://github.com/Juneil"><img src="https://avatars3.githubusercontent.com/u/6546204?v=3&s=117" width="117"/></a></td>

package-lock.json

Lines changed: 64 additions & 122 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hapiness/mongo",
3-
"version": "1.2.0",
3+
"version": "2.0.0",
44
"description": "Hapiness Module for MongoDB usage",
55
"main": "commonjs/index.js",
66
"types": "index.d.ts",
@@ -71,11 +71,12 @@
7171
"homepage": "https://github.com/hapinessjs/mongo-module#readme",
7272
"dependencies": {
7373
"@types/gridfs-stream": "^0.5.30",
74-
"@types/mongoose": "^4.7.32",
75-
"@types/node": "^9.6.0",
74+
"@types/mongodb": "^3.0.9",
75+
"@types/mongoose": "^5.0.7",
76+
"@types/node": "^9.6.2",
7677
"debug": "^3.1.0",
7778
"gridfs-stream": "^1.1.1",
78-
"mongoose": "^4.13.9"
79+
"mongoose": "^5.0.12"
7980
},
8081
"devDependencies": {
8182
"@hapiness/core": "^1.5.0",

src/module/adapters/hapiness-mongo-adapter.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,10 @@ export class HapinessMongoAdapter extends EventEmitter {
4040
}
4141

4242
this._modelManager = new ModelManager();
43-
44-
this
45-
.connect()
46-
.subscribe(_ => {
47-
__debugger.debug('constructor', 'OK');
48-
}, (err) => {
49-
__debugger.debug('constructor', `Err catched :: ${err.message}`);
50-
__debugger.debug('constructor', `Err catched :: ${JSON.stringify(err, null, 2)}`);
51-
});
5243
}
5344

5445
public connect(): Observable<void> {
5546
this._connection = null;
56-
5747
const db = this._config.db || this._config.database;
5848

5949
if (this._config.url) {
@@ -64,7 +54,13 @@ export class HapinessMongoAdapter extends EventEmitter {
6454
return Observable.throw(new Error('No db name nor url provided'));
6555
}
6656

67-
return this.tryConnect();
57+
return this.tryConnect()
58+
.do(() => __debugger.debug('connect', 'OK'))
59+
.catch(err => {
60+
__debugger.debug('connect', `Err catched :: ${err.message}`);
61+
__debugger.debug('connect', `Err catched :: ${JSON.stringify(err, null, 2)}`);
62+
return Observable.throw(err);
63+
});
6864
}
6965

7066
public tryConnect(): Observable<void> {

src/module/adapters/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './hapiness-mongo-adapter';
22
export * from './mongoose-gridfs';
3+
export * from './mongoose-gridfs-bucket-adapter';
34
export * from './mongoose-adapter';
45
export * from './interfaces/index';

src/module/adapters/mongoose-adapter.ts

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,43 +23,26 @@ export class MongooseAdapter extends HapinessMongoAdapter {
2323
.create(observer => {
2424
this._isReady = false;
2525

26-
if (this._db && !this._db.close) {
27-
return observer.error(new Error('_db needs a close function.'));
28-
}
29-
30-
if (this._db) {
31-
__debugger.debug('_tryConnect', 'db already exists');
32-
this._db.close();
33-
}
34-
35-
const connectOptions = {
36-
server: {
37-
reconnectTries: Number.MAX_VALUE,
38-
reconnectInterval: 5000,
39-
},
26+
const connectOptions: mongoose.ConnectionOptions = {
27+
promiseLibrary: global.Promise,
28+
reconnectTries: Number.MAX_VALUE,
29+
reconnectInterval: 5000,
4030
};
4131

42-
this._connection = mongoose.createConnection(this._uri, connectOptions);
43-
44-
this._connection.once('connected', () => {
45-
__debugger.debug('_tryConnect', 'connection once connected');
32+
this._connection = mongoose.createConnection(this._uri, connectOptions)
4633

34+
// Seems that typings are not up to date at the moment
35+
this._connection['then'](() => {
4736
observer.next();
4837
observer.complete();
49-
});
50-
51-
this._connection.once('error', err => {
52-
__debugger.debug('_tryConnect', `connection once error ${JSON.stringify(err, null, 2)}`);
53-
54-
observer.error(err);
55-
});
38+
})
39+
.catch(err => observer.error(err));
5640
});
5741
}
5842

5943
protected _afterConnect(): Observable<void> {
6044
return Observable
6145
.create(observer => {
62-
this._db = this._connection.db;
6346

6447
this.onConnected().subscribe(_ => {
6548
__debugger.debug('_afterConnect', '(subscribe) On connected success');
@@ -100,6 +83,6 @@ export class MongooseAdapter extends HapinessMongoAdapter {
10083
}
10184

10285
public close(): Observable<void> {
103-
return Observable.fromPromise(this._db.close());
86+
return Observable.fromPromise(this._connection.client.close());
10487
}
10588
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import * as mongoose from 'mongoose';
2+
import * as mongo from 'mongodb';
3+
4+
import { Observable } from 'rxjs/Observable';
5+
import { HapinessMongoAdapter } from './hapiness-mongo-adapter';
6+
import { Debugger } from '../shared';
7+
8+
const __debugger = new Debugger('MongooseGridfsBucketAdapter');
9+
10+
(<any>mongoose).Promise = global.Promise;
11+
12+
export class MongooseGridFsBucketAdapter extends HapinessMongoAdapter {
13+
private _gridfsBucket: mongo.GridFSBucket;
14+
15+
public static getInterfaceName(): string {
16+
return 'mongoose-gridfs-bucket';
17+
}
18+
19+
constructor(options) {
20+
super(options);
21+
}
22+
23+
protected _tryConnect(): Observable<void> {
24+
return Observable
25+
.create(observer => {
26+
this._isReady = false;
27+
28+
const connectOptions: mongoose.ConnectionOptions = {
29+
reconnectTries: Number.MAX_VALUE,
30+
reconnectInterval: 5000,
31+
};
32+
33+
this._connection = mongoose.createConnection(this._uri, connectOptions);
34+
35+
// Seems that typings are not up to date at the moment
36+
this._connection['then'](connection => {
37+
observer.next();
38+
observer.complete();
39+
})
40+
.catch(err => {
41+
observer.error(err);
42+
});
43+
});
44+
}
45+
46+
protected _afterConnect(): Observable<void> {
47+
return Observable
48+
.create(observer => {
49+
this._gridfsBucket = new mongoose.mongo.GridFSBucket((<mongoose.Connection>this._connection).db);
50+
51+
this.onConnected().subscribe(_ => {
52+
__debugger.debug('_afterConnect', '(subscribe) On connected success');
53+
}, (e) => {
54+
__debugger.debug('_afterConnect', `(subscribe) On connected failed ${JSON.stringify(e, null, 2)}`);
55+
});
56+
57+
this._connection.once('error', err =>
58+
this.onError(err).subscribe(_ => {
59+
__debugger.debug('_afterConnect', '(subscribe) On connection error #success');
60+
}, (e) => {
61+
__debugger.debug('_afterConnect', `(subscribe) On connection error #failed ${JSON.stringify(e, null, 2)}`);
62+
})
63+
);
64+
65+
this._connection.once('disconnected', () =>
66+
this.onDisconnected().subscribe(_ => {
67+
__debugger.debug('_afterConnect', '(subscribe) On connection disconnected #success');
68+
}, (e) => {
69+
__debugger.debug('_afterConnect', `(subscribe) On connection disconnected #failed ${JSON.stringify(e, null, 2)}`);
70+
})
71+
);
72+
73+
observer.next();
74+
observer.complete();
75+
});
76+
}
77+
78+
public registerValue(schema: any, collection: string, collectionName?: string) {
79+
if (!!collectionName && collectionName.length) {
80+
return this._connection.model(collection, schema, collectionName);
81+
}
82+
return this._connection.model(collection, schema);
83+
}
84+
85+
public getLibrary(): any {
86+
return this._gridfsBucket;
87+
}
88+
89+
// It seems that there is a bug here and it never really close the connection it always try to reconnect afterwards.
90+
public close(): Observable<void> {
91+
return Observable.fromPromise(this._connection.client.close(true));
92+
}
93+
}
Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,61 @@
11
import * as mongoose from 'mongoose';
2+
import * as util from 'util';
3+
24
import { Observable } from 'rxjs/Observable';
35

46
import { CreateGridFsStream, GridFsStream } from '../shared/gridfs-stream';
57
import { HapinessMongoAdapter } from './hapiness-mongo-adapter';
68

9+
/**
10+
* Gridfs adapter using mongoose for connection purposes
11+
*
12+
* @deprecated
13+
* @export
14+
* @class MongooseGridFsAdapter
15+
* @extends {HapinessMongoAdapter}
16+
*/
717
export class MongooseGridFsAdapter extends HapinessMongoAdapter {
818

919
private _gridfs: GridFsStream.Grid;
20+
protected _client: any;
1021

1122
public static getInterfaceName(): string {
1223
return 'mongoose-gridfs';
1324
}
1425

1526
constructor(options) {
16-
super(options);
27+
super(options)
28+
util.deprecate((() => null), 'MongooseGridFsAdapter is deprecated use MongooseGridfsBucketAdapter instead.')();
1729
}
1830

1931
protected _tryConnect(): Observable<void> {
2032
return Observable
2133
.create(observer => {
2234
this._isReady = false;
2335

24-
if (this._db && !this._db.close) {
25-
return observer.error(new Error('_db needs a close function.'));
36+
if ((this._db && !this._db.close) || (this._client && !this._client.close)) {
37+
return observer.error(new Error('_db or _client needs a close function.'));
2638
}
2739

28-
if (this._db) {
40+
if (this._db && this._db.close) {
2941
this._db.close();
42+
} else if (this._client && this._client.close) {
43+
this._client.close();
3044
}
3145

3246
const connectOptions = {
33-
server: {
34-
reconnectTries: Number.MAX_VALUE,
35-
reconnectInterval: 5000,
36-
},
47+
reconnectTries: Number.MAX_VALUE,
48+
reconnectInterval: 5000,
3749
};
3850

3951
this._connection = mongoose.createConnection(this._uri, connectOptions);
4052

41-
this._connection.once('connected', () => {
53+
// Seems that typings are not up to date at the moment
54+
this._connection['then'](connection => {
4255
observer.next();
4356
observer.complete();
44-
});
45-
46-
this._connection.once('error', err => {
57+
})
58+
.catch(err => {
4759
observer.error(err);
4860
});
4961
});
@@ -53,10 +65,11 @@ export class MongooseGridFsAdapter extends HapinessMongoAdapter {
5365
return CreateGridFsStream(db, mongo);
5466
}
5567

56-
protected _afterConnect(): Observable<void> {
68+
protected _afterConnect(): Observable<void > {
5769
return Observable
5870
.create(observer => {
5971
this._db = this._connection.db;
72+
this._client = this._connection.client;
6073

6174
this._gridfs = this._createGridFsStream(this._db, mongoose.mongo);
6275

@@ -75,7 +88,7 @@ export class MongooseGridFsAdapter extends HapinessMongoAdapter {
7588
});
7689
}
7790

78-
public registerValue(schema: any, collection: string, collectionName?: string) {
91+
public registerValue(schema: any, collection: string, collectionName ?: string) {
7992
if (!!collectionName && collectionName.length) {
8093
return this._connection.model(collection, schema, collectionName);
8194
}
@@ -86,7 +99,7 @@ export class MongooseGridFsAdapter extends HapinessMongoAdapter {
8699
return this._gridfs;
87100
}
88101

89-
public close(): Observable<void> {
90-
return Observable.fromPromise(this._db.close());
102+
public close(): Observable<void > {
103+
return Observable.fromPromise(this._client.close());
91104
}
92105
}

src/module/managers/model-manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export class ModelManager {
1616
this.models.push(item);
1717
}
1818

19-
public get(token: Type<any>) {
19+
public get<T = any>(token: Type<any>): T | undefined {
2020
const item = this.models.find(_ => _.token === token);
2121
return item ? item.value : undefined;
2222
}

0 commit comments

Comments
 (0)