@furystack/core 14.0.5 → 15.0.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/esm/create-physical-store-tests.d.ts +1 -1
- package/esm/create-physical-store-tests.d.ts.map +1 -1
- package/esm/global-disposable.spec.js +5 -5
- package/esm/global-disposable.spec.js.map +1 -1
- package/esm/global-disposables.d.ts +2 -3
- package/esm/global-disposables.d.ts.map +1 -1
- package/esm/global-disposables.js +19 -6
- package/esm/global-disposables.js.map +1 -1
- package/esm/helpers.d.ts +2 -3
- package/esm/helpers.d.ts.map +1 -1
- package/esm/helpers.js.map +1 -1
- package/esm/identity-context.spec.js +5 -5
- package/esm/identity-context.spec.js.map +1 -1
- package/esm/in-memory-store.d.ts +2 -2
- package/esm/in-memory-store.d.ts.map +1 -1
- package/esm/in-memory-store.js +3 -2
- package/esm/in-memory-store.js.map +1 -1
- package/esm/in-memory-store.spec.js +1 -1
- package/esm/in-memory-store.spec.js.map +1 -1
- package/esm/models/physical-store.d.ts +3 -3
- package/esm/models/physical-store.d.ts.map +1 -1
- package/esm/store-manager.d.ts +2 -3
- package/esm/store-manager.d.ts.map +1 -1
- package/esm/store-manager.js +11 -3
- package/esm/store-manager.js.map +1 -1
- package/esm/store-manager.spec.js +38 -16
- package/esm/store-manager.spec.js.map +1 -1
- package/package.json +6 -6
- package/src/global-disposable.spec.ts +5 -5
- package/src/global-disposables.ts +22 -8
- package/src/helpers.ts +2 -3
- package/src/identity-context.spec.ts +5 -5
- package/src/in-memory-store.spec.ts +1 -1
- package/src/in-memory-store.ts +4 -3
- package/src/store-manager.spec.ts +41 -16
- package/src/store-manager.ts +15 -6
|
@@ -16,5 +16,5 @@ export interface StoreTestOptions<T, TPrimaryKey extends keyof T> {
|
|
|
16
16
|
skipRegexTests?: boolean;
|
|
17
17
|
skipStringTests?: boolean;
|
|
18
18
|
}
|
|
19
|
-
export declare const createStoreTest: (options: StoreTestOptions<TestClass,
|
|
19
|
+
export declare const createStoreTest: (options: StoreTestOptions<TestClass, "id">) => void;
|
|
20
20
|
//# sourceMappingURL=create-physical-store-tests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-physical-store-tests.d.ts","sourceRoot":"","sources":["../src/create-physical-store-tests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,qBAAa,SAAS;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,IAAI,CAAA;CACxB;AAGD,eAAO,MAAM,gBAAgB,UAAW,
|
|
1
|
+
{"version":3,"file":"create-physical-store-tests.d.ts","sourceRoot":"","sources":["../src/create-physical-store-tests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,qBAAa,SAAS;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,IAAI,CAAA;CACxB;AAGD,eAAO,MAAM,gBAAgB,UAAW,OAAO,CAAC,SAAS,CAAC,KAAG,SAS3D,CAAA;AAEF,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC;IAC9D,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,eAAO,MAAM,eAAe,YAAa,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAgoBzE,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject';
|
|
2
|
-
import {
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { exitHandler, globalDisposables } from './global-disposables.js';
|
|
3
4
|
import { disposeOnProcessExit } from './helpers.js';
|
|
4
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
5
5
|
describe('Global Disposables', () => {
|
|
6
6
|
it('Should be empty by default', () => {
|
|
7
7
|
expect(globalDisposables.size).toBe(0);
|
|
@@ -18,14 +18,14 @@ describe('Global Disposables', () => {
|
|
|
18
18
|
disposeOnProcessExit(i);
|
|
19
19
|
expect(globalDisposables).toContain(i);
|
|
20
20
|
globalDisposables.delete(i);
|
|
21
|
-
await i.
|
|
21
|
+
await i[Symbol.asyncDispose]();
|
|
22
22
|
});
|
|
23
23
|
it('Should dispose the injector on exit', async () => {
|
|
24
24
|
const i = new Injector();
|
|
25
|
-
i.
|
|
25
|
+
i[Symbol.asyncDispose] = vi.fn(i[Symbol.asyncDispose]);
|
|
26
26
|
disposeOnProcessExit(i);
|
|
27
27
|
await exitHandler();
|
|
28
|
-
expect(i.
|
|
28
|
+
expect(i[Symbol.asyncDispose]).toBeCalled();
|
|
29
29
|
globalDisposables.delete(i);
|
|
30
30
|
});
|
|
31
31
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-disposable.spec.js","sourceRoot":"","sources":["../src/global-disposable.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"global-disposable.spec.js","sourceRoot":"","sources":["../src/global-disposable.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAEnD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QACxD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC1D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC3D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC3D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAA;QACxB,oBAAoB,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACtC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;IAChC,CAAC,CAAC,CAAA;IACF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAA;QACxB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;QACtD,oBAAoB,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,WAAW,EAAE,CAAA;QACnB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAC3C,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type { Disposable } from '@furystack/utils';
|
|
2
1
|
/**
|
|
3
2
|
* Readonly set that stores references of the disposables that should be disposed on process exit
|
|
4
3
|
*/
|
|
5
|
-
export declare const globalDisposables: Set<Disposable>;
|
|
4
|
+
export declare const globalDisposables: Set<Disposable | AsyncDisposable>;
|
|
6
5
|
/**
|
|
7
6
|
* Will be triggered via process event listeners
|
|
8
7
|
*/
|
|
9
|
-
export declare const exitHandler: () =>
|
|
8
|
+
export declare const exitHandler: () => void;
|
|
10
9
|
//# sourceMappingURL=global-disposables.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-disposables.d.ts","sourceRoot":"","sources":["../src/global-disposables.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"global-disposables.d.ts","sourceRoot":"","sources":["../src/global-disposables.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,GAAG,CAAC,UAAU,GAAG,eAAe,CAAa,CAAA;AAE7E;;GAEG;AACH,eAAO,MAAM,WAAW,YAoBX,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isAsyncDisposable, isDisposable } from '@furystack/utils';
|
|
1
2
|
/**
|
|
2
3
|
* Readonly set that stores references of the disposables that should be disposed on process exit
|
|
3
4
|
*/
|
|
@@ -5,12 +6,24 @@ export const globalDisposables = new Set();
|
|
|
5
6
|
/**
|
|
6
7
|
* Will be triggered via process event listeners
|
|
7
8
|
*/
|
|
8
|
-
export const exitHandler = (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
export const exitHandler = (() => {
|
|
10
|
+
Promise.allSettled([...globalDisposables].map(async (d) => {
|
|
11
|
+
if (isAsyncDisposable(d)) {
|
|
12
|
+
await d[Symbol.asyncDispose]();
|
|
13
|
+
}
|
|
14
|
+
if (isDisposable(d)) {
|
|
15
|
+
d[Symbol.dispose]();
|
|
16
|
+
}
|
|
17
|
+
}))
|
|
18
|
+
.then((result) => {
|
|
19
|
+
const fails = result.filter((r) => r.status === 'rejected');
|
|
20
|
+
if (fails && fails.length) {
|
|
21
|
+
console.warn(`There was an error during disposing '${fails.length}' global disposable objects`, fails);
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
.catch((error) => {
|
|
25
|
+
console.error('Error during disposing global disposables', error);
|
|
26
|
+
});
|
|
14
27
|
}).bind(null);
|
|
15
28
|
// do something when app is closing
|
|
16
29
|
globalThis.process?.on?.('exit', exitHandler);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-disposables.js","sourceRoot":"","sources":["../src/global-disposables.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"global-disposables.js","sourceRoot":"","sources":["../src/global-disposables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsC,IAAI,GAAG,EAAE,CAAA;AAE7E;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IAC/B,OAAO,CAAC,UAAU,CAChB,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACrC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;QAChC,CAAC;QACD,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CACH;SACE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAA;QAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,wCAAwC,KAAK,CAAC,MAAM,6BAA6B,EAAE,KAAK,CAAC,CAAA;QACxG,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEb,mCAAmC;AACnC,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAE7C,uBAAuB;AACvB,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;AAE/C,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAA;AAEtD,oDAAoD;AACpD,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;AAChD,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;AAEhD,8BAA8B;AAC9B,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAGzD;AAAC,UAAkB,CAAC,MAAM,EAAE,gBAAgB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA"}
|
package/esm/helpers.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { Injector } from '@furystack/inject';
|
|
2
|
-
import type { Disposable } from '@furystack/utils';
|
|
3
|
-
import { StoreManager } from './store-manager.js';
|
|
4
2
|
import type { PhysicalStore } from './models/physical-store.js';
|
|
3
|
+
import { StoreManager } from './store-manager.js';
|
|
5
4
|
/**
|
|
6
5
|
* The disposable will be disposed on process exit
|
|
7
6
|
* @param disposable The Disposable object to dispose on process exit
|
|
8
7
|
* @returns A set of global disposables
|
|
9
8
|
*/
|
|
10
|
-
export declare const disposeOnProcessExit: (disposable: Disposable) => Set<Disposable>;
|
|
9
|
+
export declare const disposeOnProcessExit: (disposable: Disposable | AsyncDisposable) => Set<Disposable | AsyncDisposable>;
|
|
11
10
|
/**
|
|
12
11
|
* @param injector The Injector instance
|
|
13
12
|
* @returns the current authentication status from the identity context
|
package/esm/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,eAAgB,UAAU,GAAG,eAAe,sCAAsC,CAAA;AAEnH;;;GAGG;AACH,eAAO,MAAM,eAAe,aAAoB,QAAQ,qBAA4D,CAAA;AAEpH;;;;GAIG;AACH,eAAO,MAAM,YAAY,aAAoB,QAAQ,YAAY,MAAM,EAAE,qBACX,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,cAAc,aAAoB,QAAQ,uCAA2D,CAAA;AAElH;;;GAGG;AACH,eAAO,MAAM,eAAe,aAAc,QAAQ,iBAAuC,CAAA;AAEzF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,YAAY,QAAQ,SAAS,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,iBACtE,CAAA"}
|
package/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAAwC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;AAEnH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,QAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,eAAe,EAAE,CAAA;AAEpH;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,QAAkB,EAAE,GAAG,KAAe,EAAE,EAAE,CAC3E,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAA;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,QAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,cAAc,EAAE,CAAA;AAElH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;AAEzF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAiC,QAAkB,EAAE,KAAoC,EAAE,EAAE,CACnH,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject';
|
|
2
|
-
import {
|
|
2
|
+
import { usingAsync } from '@furystack/utils';
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { getCurrentUser, isAuthenticated, isAuthorized } from './helpers.js';
|
|
3
5
|
import { IdentityContext } from './identity-context.js';
|
|
4
|
-
import { isAuthorized, isAuthenticated, getCurrentUser } from './helpers.js';
|
|
5
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
6
6
|
describe('IdentityContext', () => {
|
|
7
|
-
it('Should be retrieved from an Injector', () => {
|
|
8
|
-
|
|
7
|
+
it('Should be retrieved from an Injector', async () => {
|
|
8
|
+
await usingAsync(new Injector(), async (i) => {
|
|
9
9
|
const ctx = i.getInstance(IdentityContext);
|
|
10
10
|
expect(ctx).toBeInstanceOf(IdentityContext);
|
|
11
11
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-context.spec.js","sourceRoot":"","sources":["../src/identity-context.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"identity-context.spec.js","sourceRoot":"","sources":["../src/identity-context.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;YAC5C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAA;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAA;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;YAC3C,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/esm/in-memory-store.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Constructable } from '@furystack/inject';
|
|
2
|
-
import type { PhysicalStore, FindOptions, PartialResult, FilterType, CreateResult } from './models/physical-store.js';
|
|
3
2
|
import { EventHub } from '@furystack/utils';
|
|
3
|
+
import type { CreateResult, FilterType, FindOptions, PartialResult, PhysicalStore } from './models/physical-store.js';
|
|
4
4
|
export declare class InMemoryStore<T, TPrimaryKey extends keyof T> extends EventHub<{
|
|
5
5
|
onEntityAdded: {
|
|
6
6
|
entity: T;
|
|
@@ -26,7 +26,7 @@ export declare class InMemoryStore<T, TPrimaryKey extends keyof T> extends Event
|
|
|
26
26
|
find<TFields extends Array<keyof T>>(searchOptions: FindOptions<T, TFields>): Promise<PartialResult<T, TFields>[]>;
|
|
27
27
|
count(filter?: FilterType<T>): Promise<number>;
|
|
28
28
|
update(id: T[TPrimaryKey], data: T): Promise<void>;
|
|
29
|
-
dispose(): void;
|
|
29
|
+
[Symbol.dispose](): void;
|
|
30
30
|
readonly primaryKey: TPrimaryKey;
|
|
31
31
|
readonly model: Constructable<T>;
|
|
32
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-store.d.ts","sourceRoot":"","sources":["../src/in-memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"in-memory-store.d.ts","sourceRoot":"","sources":["../src/in-memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAGrH,qBAAa,aAAa,CAAC,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,CACvD,SAAQ,QAAQ,CAAC;IACf,aAAa,EAAE;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAA;IAC5B,eAAe,EAAE;QAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,CAAA;IAC3D,eAAe,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;KAAE,CAAA;CACzC,CACD,YAAW,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAE3C;;;OAGG;IACU,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAapD,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAY;IACzC,GAAG,QAAS,CAAC,CAAC,WAAW,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,CAAC,qCAGzD;IAED,OAAO,CAAC,YAAY,CAGnB;IAED,OAAO,CAAC,cAAc;IAwGT,IAAI,CAAC,OAAO,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;IA2B3E,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAI5B,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;IAWxC,CAAC,MAAM,CAAC,OAAO,CAAC;IAKvB,SAAgB,UAAU,EAAE,WAAW,CAAA;IACvC,SAAgB,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IAEvC;;;;;OAKG;gBACS,OAAO,EAAE;QACnB;;WAEG;QACH,UAAU,EAAE,WAAW,CAAA;QACvB;;WAEG;QACH,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;KACxB;CAKF"}
|
package/esm/in-memory-store.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { selectFields, isOperator, isLogicalOperator } from './models/physical-store.js';
|
|
2
1
|
import { EventHub } from '@furystack/utils';
|
|
2
|
+
import { isLogicalOperator, isOperator, selectFields } from './models/physical-store.js';
|
|
3
3
|
export class InMemoryStore extends EventHub {
|
|
4
4
|
/**
|
|
5
5
|
*
|
|
@@ -174,8 +174,9 @@ export class InMemoryStore extends EventHub {
|
|
|
174
174
|
});
|
|
175
175
|
this.emit('onEntityUpdated', { id, change: data });
|
|
176
176
|
}
|
|
177
|
-
dispose() {
|
|
177
|
+
[Symbol.dispose]() {
|
|
178
178
|
this.cache.clear();
|
|
179
|
+
super[Symbol.dispose]();
|
|
179
180
|
}
|
|
180
181
|
primaryKey;
|
|
181
182
|
model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../src/in-memory-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../src/in-memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-store.spec.js","sourceRoot":"","sources":["../src/in-memory-store.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnF,eAAe,CAAC;QACd,WAAW;QACX,QAAQ,EAAE,eAAe;QACzB,mCAAmC;KACpC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,CAAC,GAAG,WAAW,EAAE,CAAA;QACvB,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAA;QAC/B,CAAC,CAAC,OAAO,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"in-memory-store.spec.js","sourceRoot":"","sources":["../src/in-memory-store.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnF,eAAe,CAAC;QACd,WAAW;QACX,QAAQ,EAAE,eAAe;QACzB,mCAAmC;KACpC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,CAAC,GAAG,WAAW,EAAE,CAAA;QACvB,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAA;QAC/B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -19,8 +19,8 @@ export type FilterType<T> = {
|
|
|
19
19
|
} & {
|
|
20
20
|
[LO in (typeof LogicalOperators)[number]]?: Array<FilterType<T>>;
|
|
21
21
|
};
|
|
22
|
-
export declare const isLogicalOperator: (propertyString: string) => propertyString is
|
|
23
|
-
export declare const isOperator: (propertyString: string) => propertyString is
|
|
22
|
+
export declare const isLogicalOperator: (propertyString: string) => propertyString is (typeof LogicalOperators)[number];
|
|
23
|
+
export declare const isOperator: (propertyString: string) => propertyString is (typeof allOperators)[number];
|
|
24
24
|
export declare const t: FilterType<{
|
|
25
25
|
a: number;
|
|
26
26
|
b: string;
|
|
@@ -60,7 +60,7 @@ export interface FindOptions<T, TSelect extends Array<keyof T>> {
|
|
|
60
60
|
filter?: FilterType<T>;
|
|
61
61
|
}
|
|
62
62
|
export type PartialResult<T, TFields extends Array<keyof T>> = Pick<T, TFields[number]>;
|
|
63
|
-
export declare const selectFields: <T extends object, TField extends
|
|
63
|
+
export declare const selectFields: <T extends object, TField extends Array<keyof T>>(entry: T, ...fields: TField) => PartialResult<T, TField>;
|
|
64
64
|
/**
|
|
65
65
|
* Interface that defines a physical store implementation
|
|
66
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"physical-store.d.ts","sourceRoot":"","sources":["../../src/models/physical-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,eAAO,MAAM,yBAAyB,yCAA0C,CAAA;AAEhF,eAAO,MAAM,yBAAyB,0DAA2D,CAAA;AACjG,eAAO,MAAM,yBAAyB,yBAA0B,CAAA;AAEhE,eAAO,MAAM,wBAAwB,0BAA2B,CAAA;AAChE,eAAO,MAAM,gBAAgB,0CAA2C,CAAA;AAExE,eAAO,MAAM,YAAY,oJAMf,CAAA;AAEV,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;KACzB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EACX,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG;SAAG,GAAG,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,GAAG,KAAK,CAAC,GAC9F,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG;SAAG,GAAG,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,GAAG,KAAK,CAAC,GAC9F;SAAG,GAAG,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,GAC9D;SAAG,GAAG,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE;CACzE,GAAG;KAAG,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAExE,eAAO,MAAM,iBAAiB,mBAAoB,MAAM,
|
|
1
|
+
{"version":3,"file":"physical-store.d.ts","sourceRoot":"","sources":["../../src/models/physical-store.ts"],"names":[],"mappings":"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"}
|
package/esm/store-manager.d.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import type { Constructable } from '@furystack/inject';
|
|
2
|
-
import type { Disposable } from '@furystack/utils';
|
|
3
2
|
import type { PhysicalStore } from './models/physical-store.js';
|
|
4
3
|
/**
|
|
5
4
|
* Manager class for store instances
|
|
6
5
|
*/
|
|
7
|
-
export declare class StoreManager implements
|
|
6
|
+
export declare class StoreManager implements AsyncDisposable {
|
|
8
7
|
/**
|
|
9
8
|
* Disposes the StoreManager and all store instances
|
|
10
9
|
*/
|
|
11
|
-
|
|
10
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
12
11
|
private stores;
|
|
13
12
|
/**
|
|
14
13
|
* Returns a store model for a constructable object.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D;;GAEG;AACH,qBACa,YAAa,YAAW,eAAe;IAClD;;OAEG;IACU,CAAC,MAAM,CAAC,YAAY,CAAC;IAoBlC,OAAO,CAAC,MAAM,CAAkE;IAEhF;;;;;;;OAOG;IACI,WAAW,CAAC,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,EAAE,KAAK,SAAS,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,EAC5F,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,UAAU,EAAE,WAAW,GASJ,KAAK;IAG1B;;;;OAIG;IACI,QAAQ,CAAC,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC;CAIrF"}
|
package/esm/store-manager.js
CHANGED
|
@@ -5,6 +5,7 @@ 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 { isAsyncDisposable, isDisposable } from '@furystack/utils';
|
|
8
9
|
import { AggregatedError } from './errors/aggregated-error.js';
|
|
9
10
|
/**
|
|
10
11
|
* Manager class for store instances
|
|
@@ -13,11 +14,18 @@ let StoreManager = class StoreManager {
|
|
|
13
14
|
/**
|
|
14
15
|
* Disposes the StoreManager and all store instances
|
|
15
16
|
*/
|
|
16
|
-
async
|
|
17
|
-
const result = await Promise.allSettled([...this.stores.entries()].map(async ([_model, store]) =>
|
|
17
|
+
async [Symbol.asyncDispose]() {
|
|
18
|
+
const result = await Promise.allSettled([...this.stores.entries()].map(async ([_model, store]) => {
|
|
19
|
+
if (isDisposable(store)) {
|
|
20
|
+
store[Symbol.dispose]();
|
|
21
|
+
}
|
|
22
|
+
if (isAsyncDisposable(store)) {
|
|
23
|
+
await store[Symbol.asyncDispose]();
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
18
26
|
const fails = result.filter((r) => r.status === 'rejected');
|
|
19
27
|
if (fails && fails.length) {
|
|
20
|
-
const error = new AggregatedError(`There was an error during disposing ${fails.length} stores: ${fails.map((f) => f.reason)}`, fails);
|
|
28
|
+
const error = new AggregatedError(`There was an error during disposing ${fails.length} stores: ${fails.map((f) => f.reason).join(', ')}`, fails);
|
|
21
29
|
throw error;
|
|
22
30
|
}
|
|
23
31
|
}
|
package/esm/store-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager.js","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"store-manager.js","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D;;GAEG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB;;OAEG;IACI,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CACrC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACzB,CAAC;YACD,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;YACpC,CAAC;QACH,CAAC,CAAC,CACH,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAA;QAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,uCAAuC,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChH,KAAK,CACN,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IACO,MAAM,GAAyD,IAAI,GAAG,EAAE,CAAA;IAEhF;;;;;;;OAOG;IACI,WAAW,CAChB,KAAuB,EACvB,UAAuB;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAA;QACvC,CAAC;QACD,OAAO,QAAiB,CAAA;IAC1B,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAiC,KAAoC;QAClF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAgC,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AAzDY,YAAY;IADxB,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,YAAY,CAyDxB"}
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import { using, usingAsync } from '@furystack/utils';
|
|
2
1
|
import { Injector } from '@furystack/inject';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { AggregatedError } from './errors/aggregated-error.js';
|
|
2
|
+
import { usingAsync } from '@furystack/utils';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
6
4
|
import { TestClass } from './create-physical-store-tests.js';
|
|
7
|
-
import {
|
|
5
|
+
import { AggregatedError } from './errors/aggregated-error.js';
|
|
6
|
+
import { InMemoryStore } from './in-memory-store.js';
|
|
7
|
+
import { StoreManager } from './store-manager.js';
|
|
8
8
|
class Test {
|
|
9
9
|
}
|
|
10
10
|
describe('StoreManager', () => {
|
|
11
|
-
it('Can be retrieved from an injector', () => {
|
|
12
|
-
|
|
11
|
+
it('Can be retrieved from an injector', async () => {
|
|
12
|
+
await usingAsync(new Injector(), async (i) => {
|
|
13
13
|
expect(i.getInstance(StoreManager)).toBeInstanceOf(StoreManager);
|
|
14
14
|
});
|
|
15
15
|
});
|
|
16
|
-
it('Should throw if trying to retrieve a non-existing store', () => {
|
|
17
|
-
|
|
16
|
+
it('Should throw if trying to retrieve a non-existing store', async () => {
|
|
17
|
+
await usingAsync(new Injector(), async (i) => {
|
|
18
18
|
const sm = i.getInstance(StoreManager);
|
|
19
19
|
expect(() => sm.getStoreFor(class {
|
|
20
20
|
t;
|
|
21
21
|
}, 't')).toThrow();
|
|
22
22
|
});
|
|
23
23
|
});
|
|
24
|
-
it('Should throw if trying to retrieve an existing store with a different primary key', () => {
|
|
25
|
-
|
|
24
|
+
it('Should throw if trying to retrieve an existing store with a different primary key', async () => {
|
|
25
|
+
await usingAsync(new Injector(), async (i) => {
|
|
26
26
|
const sm = i.getInstance(StoreManager);
|
|
27
27
|
sm.addStore(new InMemoryStore({ model: TestClass, primaryKey: 'id' }));
|
|
28
28
|
expect(() => sm.getStoreFor(TestClass, 'booleanValue')).toThrowError('Primary keys not match');
|
|
29
29
|
});
|
|
30
30
|
});
|
|
31
|
-
it('Can set up stores with an extension method', () => {
|
|
32
|
-
|
|
31
|
+
it('Can set up stores with an extension method', async () => {
|
|
32
|
+
await usingAsync(new Injector(), async (i) => {
|
|
33
33
|
i.getInstance(StoreManager).addStore(new InMemoryStore({
|
|
34
34
|
model: Test,
|
|
35
35
|
primaryKey: 'id',
|
|
@@ -37,18 +37,40 @@ describe('StoreManager', () => {
|
|
|
37
37
|
expect(i.getInstance(StoreManager).getStoreFor(Test, 'id')).toBeInstanceOf(InMemoryStore);
|
|
38
38
|
});
|
|
39
39
|
});
|
|
40
|
-
it('
|
|
40
|
+
it('should throw if failed to dispose async one or more store', async () => {
|
|
41
|
+
await usingAsync(new Injector(), async (i) => {
|
|
42
|
+
const sm = i.getInstance(StoreManager);
|
|
43
|
+
const MockStore = class extends InMemoryStore {
|
|
44
|
+
[Symbol.asyncDispose] = () => Promise.reject(':(');
|
|
45
|
+
};
|
|
46
|
+
sm.addStore(new MockStore({
|
|
47
|
+
model: Test,
|
|
48
|
+
primaryKey: 'id',
|
|
49
|
+
}));
|
|
50
|
+
try {
|
|
51
|
+
await sm[Symbol.asyncDispose]();
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
expect(error).toBeInstanceOf(AggregatedError);
|
|
55
|
+
expect(error.rejections).toHaveLength(1);
|
|
56
|
+
}
|
|
57
|
+
i.cachedSingletons.clear();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it('should throw if failed to dispose one or more store', async () => {
|
|
41
61
|
await usingAsync(new Injector(), async (i) => {
|
|
42
62
|
const sm = i.getInstance(StoreManager);
|
|
43
63
|
const MockStore = class extends InMemoryStore {
|
|
44
|
-
dispose = () =>
|
|
64
|
+
[Symbol.dispose] = () => {
|
|
65
|
+
throw new Error(':(');
|
|
66
|
+
};
|
|
45
67
|
};
|
|
46
68
|
sm.addStore(new MockStore({
|
|
47
69
|
model: Test,
|
|
48
70
|
primaryKey: 'id',
|
|
49
71
|
}));
|
|
50
72
|
try {
|
|
51
|
-
await sm.
|
|
73
|
+
await sm[Symbol.asyncDispose]();
|
|
52
74
|
}
|
|
53
75
|
catch (error) {
|
|
54
76
|
expect(error).toBeInstanceOf(AggregatedError);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager.spec.js","sourceRoot":"","sources":["../src/store-manager.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"store-manager.spec.js","sourceRoot":"","sources":["../src/store-manager.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "15.0.1",
|
|
4
4
|
"description": "Core FuryStack package",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -40,13 +40,13 @@
|
|
|
40
40
|
},
|
|
41
41
|
"homepage": "https://github.com/furystack/furystack",
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@types/node": "^20.14.
|
|
44
|
-
"typescript": "^5.
|
|
45
|
-
"vitest": "^
|
|
43
|
+
"@types/node": "^20.14.11",
|
|
44
|
+
"typescript": "^5.5.3",
|
|
45
|
+
"vitest": "^2.0.3"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@furystack/inject": "^
|
|
49
|
-
"@furystack/utils": "^
|
|
48
|
+
"@furystack/inject": "^12.0.1",
|
|
49
|
+
"@furystack/utils": "^8.0.1"
|
|
50
50
|
},
|
|
51
51
|
"gitHead": "1045d854bfd8c475b7035471d130d401417a2321"
|
|
52
52
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject'
|
|
2
|
-
import {
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
3
|
+
import { exitHandler, globalDisposables } from './global-disposables.js'
|
|
3
4
|
import { disposeOnProcessExit } from './helpers.js'
|
|
4
|
-
import { describe, it, expect, vi } from 'vitest'
|
|
5
5
|
|
|
6
6
|
describe('Global Disposables', () => {
|
|
7
7
|
it('Should be empty by default', () => {
|
|
@@ -21,14 +21,14 @@ describe('Global Disposables', () => {
|
|
|
21
21
|
disposeOnProcessExit(i)
|
|
22
22
|
expect(globalDisposables).toContain(i)
|
|
23
23
|
globalDisposables.delete(i)
|
|
24
|
-
await i.
|
|
24
|
+
await i[Symbol.asyncDispose]()
|
|
25
25
|
})
|
|
26
26
|
it('Should dispose the injector on exit', async () => {
|
|
27
27
|
const i = new Injector()
|
|
28
|
-
i.
|
|
28
|
+
i[Symbol.asyncDispose] = vi.fn(i[Symbol.asyncDispose])
|
|
29
29
|
disposeOnProcessExit(i)
|
|
30
30
|
await exitHandler()
|
|
31
|
-
expect(i.
|
|
31
|
+
expect(i[Symbol.asyncDispose]).toBeCalled()
|
|
32
32
|
globalDisposables.delete(i)
|
|
33
33
|
})
|
|
34
34
|
})
|
|
@@ -1,19 +1,33 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { isAsyncDisposable, isDisposable } from '@furystack/utils'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Readonly set that stores references of the disposables that should be disposed on process exit
|
|
5
5
|
*/
|
|
6
|
-
export const globalDisposables: Set<Disposable> = new Set()
|
|
6
|
+
export const globalDisposables: Set<Disposable | AsyncDisposable> = new Set()
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Will be triggered via process event listeners
|
|
10
10
|
*/
|
|
11
|
-
export const exitHandler = (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
export const exitHandler = (() => {
|
|
12
|
+
Promise.allSettled(
|
|
13
|
+
[...globalDisposables].map(async (d) => {
|
|
14
|
+
if (isAsyncDisposable(d)) {
|
|
15
|
+
await d[Symbol.asyncDispose]()
|
|
16
|
+
}
|
|
17
|
+
if (isDisposable(d)) {
|
|
18
|
+
d[Symbol.dispose]()
|
|
19
|
+
}
|
|
20
|
+
}),
|
|
21
|
+
)
|
|
22
|
+
.then((result) => {
|
|
23
|
+
const fails = result.filter((r) => r.status === 'rejected')
|
|
24
|
+
if (fails && fails.length) {
|
|
25
|
+
console.warn(`There was an error during disposing '${fails.length}' global disposable objects`, fails)
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
.catch((error) => {
|
|
29
|
+
console.error('Error during disposing global disposables', error)
|
|
30
|
+
})
|
|
17
31
|
}).bind(null)
|
|
18
32
|
|
|
19
33
|
// do something when app is closing
|
package/src/helpers.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import type { Injector } from '@furystack/inject'
|
|
2
2
|
import { globalDisposables } from './global-disposables.js'
|
|
3
3
|
import { IdentityContext } from './identity-context.js'
|
|
4
|
-
import type { Disposable } from '@furystack/utils'
|
|
5
|
-
import { StoreManager } from './store-manager.js'
|
|
6
4
|
import type { PhysicalStore } from './models/physical-store.js'
|
|
5
|
+
import { StoreManager } from './store-manager.js'
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* The disposable will be disposed on process exit
|
|
10
9
|
* @param disposable The Disposable object to dispose on process exit
|
|
11
10
|
* @returns A set of global disposables
|
|
12
11
|
*/
|
|
13
|
-
export const disposeOnProcessExit = (disposable: Disposable) => globalDisposables.add(disposable)
|
|
12
|
+
export const disposeOnProcessExit = (disposable: Disposable | AsyncDisposable) => globalDisposables.add(disposable)
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* @param injector The Injector instance
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject'
|
|
2
|
-
import {
|
|
2
|
+
import { usingAsync } from '@furystack/utils'
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
4
|
+
import { getCurrentUser, isAuthenticated, isAuthorized } from './helpers.js'
|
|
3
5
|
import { IdentityContext } from './identity-context.js'
|
|
4
|
-
import { isAuthorized, isAuthenticated, getCurrentUser } from './helpers.js'
|
|
5
|
-
import { describe, it, expect, vi } from 'vitest'
|
|
6
6
|
|
|
7
7
|
describe('IdentityContext', () => {
|
|
8
|
-
it('Should be retrieved from an Injector', () => {
|
|
9
|
-
|
|
8
|
+
it('Should be retrieved from an Injector', async () => {
|
|
9
|
+
await usingAsync(new Injector(), async (i) => {
|
|
10
10
|
const ctx = i.getInstance(IdentityContext)
|
|
11
11
|
expect(ctx).toBeInstanceOf(IdentityContext)
|
|
12
12
|
})
|
package/src/in-memory-store.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Constructable } from '@furystack/inject'
|
|
2
|
-
import type { PhysicalStore, FindOptions, PartialResult, FilterType, CreateResult } from './models/physical-store.js'
|
|
3
|
-
import { selectFields, isOperator, isLogicalOperator } from './models/physical-store.js'
|
|
4
2
|
import { EventHub } from '@furystack/utils'
|
|
3
|
+
import type { CreateResult, FilterType, FindOptions, PartialResult, PhysicalStore } from './models/physical-store.js'
|
|
4
|
+
import { isLogicalOperator, isOperator, selectFields } from './models/physical-store.js'
|
|
5
5
|
|
|
6
6
|
export class InMemoryStore<T, TPrimaryKey extends keyof T>
|
|
7
7
|
extends EventHub<{
|
|
@@ -192,8 +192,9 @@ export class InMemoryStore<T, TPrimaryKey extends keyof T>
|
|
|
192
192
|
this.emit('onEntityUpdated', { id, change: data })
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
-
public dispose() {
|
|
195
|
+
public [Symbol.dispose]() {
|
|
196
196
|
this.cache.clear()
|
|
197
|
+
super[Symbol.dispose]()
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
public readonly primaryKey: TPrimaryKey
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { using, usingAsync } from '@furystack/utils'
|
|
2
1
|
import { Injector } from '@furystack/inject'
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { AggregatedError } from './errors/aggregated-error.js'
|
|
2
|
+
import { usingAsync } from '@furystack/utils'
|
|
3
|
+
import { describe, expect, it } from 'vitest'
|
|
6
4
|
import { TestClass } from './create-physical-store-tests.js'
|
|
7
|
-
import {
|
|
5
|
+
import { AggregatedError } from './errors/aggregated-error.js'
|
|
6
|
+
import { InMemoryStore } from './in-memory-store.js'
|
|
7
|
+
import { StoreManager } from './store-manager.js'
|
|
8
8
|
|
|
9
9
|
class Test {
|
|
10
10
|
declare id: number
|
|
@@ -12,14 +12,14 @@ class Test {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
describe('StoreManager', () => {
|
|
15
|
-
it('Can be retrieved from an injector', () => {
|
|
16
|
-
|
|
15
|
+
it('Can be retrieved from an injector', async () => {
|
|
16
|
+
await usingAsync(new Injector(), async (i) => {
|
|
17
17
|
expect(i.getInstance(StoreManager)).toBeInstanceOf(StoreManager)
|
|
18
18
|
})
|
|
19
19
|
})
|
|
20
20
|
|
|
21
|
-
it('Should throw if trying to retrieve a non-existing store', () => {
|
|
22
|
-
|
|
21
|
+
it('Should throw if trying to retrieve a non-existing store', async () => {
|
|
22
|
+
await usingAsync(new Injector(), async (i) => {
|
|
23
23
|
const sm = i.getInstance(StoreManager)
|
|
24
24
|
expect(() =>
|
|
25
25
|
sm.getStoreFor(
|
|
@@ -32,16 +32,16 @@ describe('StoreManager', () => {
|
|
|
32
32
|
})
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
it('Should throw if trying to retrieve an existing store with a different primary key', () => {
|
|
36
|
-
|
|
35
|
+
it('Should throw if trying to retrieve an existing store with a different primary key', async () => {
|
|
36
|
+
await usingAsync(new Injector(), async (i) => {
|
|
37
37
|
const sm = i.getInstance(StoreManager)
|
|
38
38
|
sm.addStore(new InMemoryStore({ model: TestClass, primaryKey: 'id' }))
|
|
39
39
|
expect(() => sm.getStoreFor(TestClass, 'booleanValue')).toThrowError('Primary keys not match')
|
|
40
40
|
})
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
it('Can set up stores with an extension method', () => {
|
|
44
|
-
|
|
43
|
+
it('Can set up stores with an extension method', async () => {
|
|
44
|
+
await usingAsync(new Injector(), async (i) => {
|
|
45
45
|
i.getInstance(StoreManager).addStore(
|
|
46
46
|
new InMemoryStore({
|
|
47
47
|
model: Test,
|
|
@@ -53,11 +53,36 @@ describe('StoreManager', () => {
|
|
|
53
53
|
})
|
|
54
54
|
})
|
|
55
55
|
|
|
56
|
-
it('
|
|
56
|
+
it('should throw if failed to dispose async one or more store', async () => {
|
|
57
|
+
await usingAsync(new Injector(), async (i) => {
|
|
58
|
+
const sm = i.getInstance(StoreManager)
|
|
59
|
+
const MockStore = class extends InMemoryStore<any, any> {
|
|
60
|
+
public [Symbol.asyncDispose] = () => Promise.reject(':(')
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
sm.addStore(
|
|
64
|
+
new MockStore({
|
|
65
|
+
model: Test,
|
|
66
|
+
primaryKey: 'id',
|
|
67
|
+
}),
|
|
68
|
+
)
|
|
69
|
+
try {
|
|
70
|
+
await sm[Symbol.asyncDispose]()
|
|
71
|
+
} catch (error) {
|
|
72
|
+
expect(error).toBeInstanceOf(AggregatedError)
|
|
73
|
+
expect((error as AggregatedError).rejections).toHaveLength(1)
|
|
74
|
+
}
|
|
75
|
+
i.cachedSingletons.clear()
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('should throw if failed to dispose one or more store', async () => {
|
|
57
80
|
await usingAsync(new Injector(), async (i) => {
|
|
58
81
|
const sm = i.getInstance(StoreManager)
|
|
59
82
|
const MockStore = class extends InMemoryStore<any, any> {
|
|
60
|
-
public dispose = () =>
|
|
83
|
+
public [Symbol.dispose] = () => {
|
|
84
|
+
throw new Error(':(')
|
|
85
|
+
}
|
|
61
86
|
}
|
|
62
87
|
|
|
63
88
|
sm.addStore(
|
|
@@ -67,7 +92,7 @@ describe('StoreManager', () => {
|
|
|
67
92
|
}),
|
|
68
93
|
)
|
|
69
94
|
try {
|
|
70
|
-
await sm.
|
|
95
|
+
await sm[Symbol.asyncDispose]()
|
|
71
96
|
} catch (error) {
|
|
72
97
|
expect(error).toBeInstanceOf(AggregatedError)
|
|
73
98
|
expect((error as AggregatedError).rejections).toHaveLength(1)
|
package/src/store-manager.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Constructable } from '@furystack/inject'
|
|
2
2
|
import { Injectable } from '@furystack/inject'
|
|
3
|
-
import
|
|
3
|
+
import { isAsyncDisposable, isDisposable } from '@furystack/utils'
|
|
4
4
|
import { AggregatedError } from './errors/aggregated-error.js'
|
|
5
5
|
import type { PhysicalStore } from './models/physical-store.js'
|
|
6
6
|
|
|
@@ -8,16 +8,25 @@ import type { PhysicalStore } from './models/physical-store.js'
|
|
|
8
8
|
* Manager class for store instances
|
|
9
9
|
*/
|
|
10
10
|
@Injectable({ lifetime: 'singleton' })
|
|
11
|
-
export class StoreManager implements
|
|
11
|
+
export class StoreManager implements AsyncDisposable {
|
|
12
12
|
/**
|
|
13
13
|
* Disposes the StoreManager and all store instances
|
|
14
14
|
*/
|
|
15
|
-
public async
|
|
16
|
-
const result = await Promise.allSettled(
|
|
17
|
-
|
|
15
|
+
public async [Symbol.asyncDispose]() {
|
|
16
|
+
const result = await Promise.allSettled(
|
|
17
|
+
[...this.stores.entries()].map(async ([_model, store]) => {
|
|
18
|
+
if (isDisposable(store)) {
|
|
19
|
+
store[Symbol.dispose]()
|
|
20
|
+
}
|
|
21
|
+
if (isAsyncDisposable(store)) {
|
|
22
|
+
await store[Symbol.asyncDispose]()
|
|
23
|
+
}
|
|
24
|
+
}),
|
|
25
|
+
)
|
|
26
|
+
const fails = result.filter((r) => r.status === 'rejected')
|
|
18
27
|
if (fails && fails.length) {
|
|
19
28
|
const error = new AggregatedError(
|
|
20
|
-
`There was an error during disposing ${fails.length} stores: ${fails.map((f) => f.reason)}`,
|
|
29
|
+
`There was an error during disposing ${fails.length} stores: ${fails.map((f) => f.reason as string).join(', ')}`,
|
|
21
30
|
fails,
|
|
22
31
|
)
|
|
23
32
|
throw error
|