@furystack/mongodb-store 10.0.41 → 10.1.1
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/CHANGELOG.md +30 -0
- package/esm/mongo-client-factory.d.ts +12 -1
- package/esm/mongo-client-factory.d.ts.map +1 -1
- package/esm/mongo-client-factory.js +5 -1
- package/esm/mongo-client-factory.js.map +1 -1
- package/esm/mongodb-store.spec.js +29 -1
- package/esm/mongodb-store.spec.js.map +1 -1
- package/package.json +4 -4
- package/src/mongo-client-factory.ts +14 -1
- package/src/mongodb-store.spec.ts +33 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [10.1.1] - 2026-03-06
|
|
4
|
+
|
|
5
|
+
### ⬆️ Dependencies
|
|
6
|
+
|
|
7
|
+
- Updated internal FuryStack dependencies
|
|
8
|
+
|
|
9
|
+
## [10.1.0] - 2026-03-03
|
|
10
|
+
|
|
11
|
+
### ✨ Features
|
|
12
|
+
|
|
13
|
+
### Lifecycle events in `MongoClientFactory`
|
|
14
|
+
|
|
15
|
+
`MongoClientFactory` now extends `EventHub` and emits events for client lifecycle:
|
|
16
|
+
|
|
17
|
+
- `onClientCreated` — emitted when a new MongoDB client is created, with `{ url }`
|
|
18
|
+
- `onDisposed` — emitted when the factory is disposed
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
const factory = injector.getInstance(MongoClientFactory)
|
|
22
|
+
|
|
23
|
+
factory.addListener('onClientCreated', ({ url }) => {
|
|
24
|
+
console.log(`MongoDB client created for ${url}`)
|
|
25
|
+
})
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 🧪 Tests
|
|
29
|
+
|
|
30
|
+
- Added tests for `onClientCreated` event emission on new client creation
|
|
31
|
+
- Added test verifying `onClientCreated` is not emitted when returning a cached client
|
|
32
|
+
|
|
3
33
|
## [10.0.41] - 2026-02-26
|
|
4
34
|
|
|
5
35
|
### ⬆️ Dependencies
|
|
@@ -1,9 +1,20 @@
|
|
|
1
|
+
import { EventHub, type ListenerErrorPayload } from '@furystack/utils';
|
|
1
2
|
import type { MongoClientOptions } from 'mongodb';
|
|
2
3
|
import { MongoClient } from 'mongodb';
|
|
4
|
+
/**
|
|
5
|
+
* Events emitted by the {@link MongoClientFactory}
|
|
6
|
+
*/
|
|
7
|
+
export type MongoClientFactoryEvents = {
|
|
8
|
+
onClientCreated: {
|
|
9
|
+
url: string;
|
|
10
|
+
};
|
|
11
|
+
onDisposed: undefined;
|
|
12
|
+
onListenerError: ListenerErrorPayload;
|
|
13
|
+
};
|
|
3
14
|
/**
|
|
4
15
|
* Factory for instantiating MongoDb clients
|
|
5
16
|
*/
|
|
6
|
-
export declare class MongoClientFactory implements AsyncDisposable {
|
|
17
|
+
export declare class MongoClientFactory extends EventHub<MongoClientFactoryEvents> implements AsyncDisposable {
|
|
7
18
|
private connections;
|
|
8
19
|
[Symbol.asyncDispose](): Promise<void>;
|
|
9
20
|
getClientFor(url: string, options?: MongoClientOptions): MongoClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo-client-factory.d.ts","sourceRoot":"","sources":["../src/mongo-client-factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC;;GAEG;AACH,qBACa,kBAAmB,YAAW,eAAe;
|
|
1
|
+
{"version":3,"file":"mongo-client-factory.d.ts","sourceRoot":"","sources":["../src/mongo-client-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,eAAe,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAChC,UAAU,EAAE,SAAS,CAAA;IACrB,eAAe,EAAE,oBAAoB,CAAA;CACtC,CAAA;AAED;;GAEG;AACH,qBACa,kBAAmB,SAAQ,QAAQ,CAAC,wBAAwB,CAAE,YAAW,eAAe;IACnG,OAAO,CAAC,WAAW,CAAsC;IAE5C,CAAC,MAAM,CAAC,YAAY,CAAC;IAO3B,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;CAW9D"}
|
|
@@ -5,15 +5,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { Injectable } from '@furystack/inject';
|
|
8
|
+
import { EventHub } from '@furystack/utils';
|
|
8
9
|
import { MongoClient } from 'mongodb';
|
|
9
10
|
/**
|
|
10
11
|
* Factory for instantiating MongoDb clients
|
|
11
12
|
*/
|
|
12
|
-
let MongoClientFactory = class MongoClientFactory {
|
|
13
|
+
let MongoClientFactory = class MongoClientFactory extends EventHub {
|
|
13
14
|
connections = new Map();
|
|
14
15
|
async [Symbol.asyncDispose]() {
|
|
15
16
|
await Promise.all([...this.connections.values()].map((c) => c.close(true)));
|
|
16
17
|
this.connections.clear();
|
|
18
|
+
this.emit('onDisposed', undefined);
|
|
19
|
+
super[Symbol.dispose]();
|
|
17
20
|
}
|
|
18
21
|
getClientFor(url, options) {
|
|
19
22
|
const existing = this.connections.get(url);
|
|
@@ -22,6 +25,7 @@ let MongoClientFactory = class MongoClientFactory {
|
|
|
22
25
|
}
|
|
23
26
|
const client = new MongoClient(url, options);
|
|
24
27
|
this.connections.set(url, client);
|
|
28
|
+
this.emit('onClientCreated', { url });
|
|
25
29
|
return client;
|
|
26
30
|
}
|
|
27
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo-client-factory.js","sourceRoot":"","sources":["../src/mongo-client-factory.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"mongo-client-factory.js","sourceRoot":"","sources":["../src/mongo-client-factory.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAA6B,MAAM,kBAAkB,CAAA;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAWrC;;GAEG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,QAAkC;IAChE,WAAW,GAA6B,IAAI,GAAG,EAAE,CAAA;IAElD,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAChC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC3E,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;QAClC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;IACzB,CAAC;IAEM,YAAY,CAAC,GAAW,EAAE,OAA4B;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QACrC,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CAAA;AArBY,kBAAkB;IAD9B,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,kBAAkB,CAqB9B"}
|
|
@@ -2,7 +2,7 @@ import { StoreManager } from '@furystack/core';
|
|
|
2
2
|
import { TestClass, createStoreTest } from '@furystack/core/create-physical-store-tests';
|
|
3
3
|
import { Injector } from '@furystack/inject';
|
|
4
4
|
import { usingAsync } from '@furystack/utils';
|
|
5
|
-
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
6
6
|
import { MongoClientFactory } from './mongo-client-factory.js';
|
|
7
7
|
import { useMongoDb } from './store-manager-helpers.js';
|
|
8
8
|
class TestClassWithId {
|
|
@@ -115,4 +115,32 @@ describe('MongoDB Store', () => {
|
|
|
115
115
|
});
|
|
116
116
|
});
|
|
117
117
|
});
|
|
118
|
+
describe('MongoClientFactory EventHub', () => {
|
|
119
|
+
it('should emit onClientCreated when a new client is created', async () => {
|
|
120
|
+
const factory = new MongoClientFactory();
|
|
121
|
+
try {
|
|
122
|
+
const handler = vi.fn();
|
|
123
|
+
factory.addListener('onClientCreated', handler);
|
|
124
|
+
factory.getClientFor('mongodb://localhost:27017/test-db');
|
|
125
|
+
expect(handler).toHaveBeenCalledTimes(1);
|
|
126
|
+
expect(handler).toHaveBeenCalledWith({ url: 'mongodb://localhost:27017/test-db' });
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
await factory[Symbol.asyncDispose]();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
it('should not emit onClientCreated when returning an existing client', async () => {
|
|
133
|
+
const factory = new MongoClientFactory();
|
|
134
|
+
try {
|
|
135
|
+
const handler = vi.fn();
|
|
136
|
+
factory.getClientFor('mongodb://localhost:27017/test-db');
|
|
137
|
+
factory.addListener('onClientCreated', handler);
|
|
138
|
+
factory.getClientFor('mongodb://localhost:27017/test-db');
|
|
139
|
+
expect(handler).not.toHaveBeenCalled();
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
await factory[Symbol.asyncDispose]();
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
118
146
|
//# sourceMappingURL=mongodb-store.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-store.spec.js","sourceRoot":"","sources":["../src/mongodb-store.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"mongodb-store.spec.js","sourceRoot":"","sources":["../src/mongodb-store.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/mongodb-store",
|
|
3
|
-
"version": "10.
|
|
3
|
+
"version": "10.1.1",
|
|
4
4
|
"description": "MongoDB Store implementation for FuryStack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://github.com/furystack/furystack",
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@furystack/core": "^15.2.
|
|
42
|
-
"@furystack/inject": "^12.0.
|
|
43
|
-
"@furystack/utils": "^8.1
|
|
41
|
+
"@furystack/core": "^15.2.4",
|
|
42
|
+
"@furystack/inject": "^12.0.32",
|
|
43
|
+
"@furystack/utils": "^8.2.1",
|
|
44
44
|
"mongodb": "7.1.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
import { Injectable } from '@furystack/inject'
|
|
2
|
+
import { EventHub, type ListenerErrorPayload } from '@furystack/utils'
|
|
2
3
|
import type { MongoClientOptions } from 'mongodb'
|
|
3
4
|
import { MongoClient } from 'mongodb'
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Events emitted by the {@link MongoClientFactory}
|
|
8
|
+
*/
|
|
9
|
+
export type MongoClientFactoryEvents = {
|
|
10
|
+
onClientCreated: { url: string }
|
|
11
|
+
onDisposed: undefined
|
|
12
|
+
onListenerError: ListenerErrorPayload
|
|
13
|
+
}
|
|
14
|
+
|
|
5
15
|
/**
|
|
6
16
|
* Factory for instantiating MongoDb clients
|
|
7
17
|
*/
|
|
8
18
|
@Injectable({ lifetime: 'singleton' })
|
|
9
|
-
export class MongoClientFactory implements AsyncDisposable {
|
|
19
|
+
export class MongoClientFactory extends EventHub<MongoClientFactoryEvents> implements AsyncDisposable {
|
|
10
20
|
private connections: Map<string, MongoClient> = new Map()
|
|
11
21
|
|
|
12
22
|
public async [Symbol.asyncDispose]() {
|
|
13
23
|
await Promise.all([...this.connections.values()].map((c) => c.close(true)))
|
|
14
24
|
this.connections.clear()
|
|
25
|
+
this.emit('onDisposed', undefined)
|
|
26
|
+
super[Symbol.dispose]()
|
|
15
27
|
}
|
|
16
28
|
|
|
17
29
|
public getClientFor(url: string, options?: MongoClientOptions) {
|
|
@@ -22,6 +34,7 @@ export class MongoClientFactory implements AsyncDisposable {
|
|
|
22
34
|
|
|
23
35
|
const client = new MongoClient(url, options)
|
|
24
36
|
this.connections.set(url, client)
|
|
37
|
+
this.emit('onClientCreated', { url })
|
|
25
38
|
return client
|
|
26
39
|
}
|
|
27
40
|
}
|
|
@@ -2,7 +2,7 @@ import { StoreManager } from '@furystack/core'
|
|
|
2
2
|
import { TestClass, createStoreTest } from '@furystack/core/create-physical-store-tests'
|
|
3
3
|
import { Injector } from '@furystack/inject'
|
|
4
4
|
import { usingAsync } from '@furystack/utils'
|
|
5
|
-
import { describe, expect, it } from 'vitest'
|
|
5
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
6
6
|
import { MongoClientFactory } from './mongo-client-factory.js'
|
|
7
7
|
import { useMongoDb } from './store-manager-helpers.js'
|
|
8
8
|
|
|
@@ -132,3 +132,35 @@ describe('MongoDB Store', () => {
|
|
|
132
132
|
})
|
|
133
133
|
})
|
|
134
134
|
})
|
|
135
|
+
|
|
136
|
+
describe('MongoClientFactory EventHub', () => {
|
|
137
|
+
it('should emit onClientCreated when a new client is created', async () => {
|
|
138
|
+
const factory = new MongoClientFactory()
|
|
139
|
+
try {
|
|
140
|
+
const handler = vi.fn()
|
|
141
|
+
factory.addListener('onClientCreated', handler)
|
|
142
|
+
|
|
143
|
+
factory.getClientFor('mongodb://localhost:27017/test-db')
|
|
144
|
+
|
|
145
|
+
expect(handler).toHaveBeenCalledTimes(1)
|
|
146
|
+
expect(handler).toHaveBeenCalledWith({ url: 'mongodb://localhost:27017/test-db' })
|
|
147
|
+
} finally {
|
|
148
|
+
await factory[Symbol.asyncDispose]()
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('should not emit onClientCreated when returning an existing client', async () => {
|
|
153
|
+
const factory = new MongoClientFactory()
|
|
154
|
+
try {
|
|
155
|
+
const handler = vi.fn()
|
|
156
|
+
|
|
157
|
+
factory.getClientFor('mongodb://localhost:27017/test-db')
|
|
158
|
+
factory.addListener('onClientCreated', handler)
|
|
159
|
+
factory.getClientFor('mongodb://localhost:27017/test-db')
|
|
160
|
+
|
|
161
|
+
expect(handler).not.toHaveBeenCalled()
|
|
162
|
+
} finally {
|
|
163
|
+
await factory[Symbol.asyncDispose]()
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
})
|