@tstdl/base 0.86.0 → 0.86.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/application/application.js +0 -1
- package/browser/browser-context-controller.d.ts +2 -2
- package/browser/browser-context-controller.js +6 -7
- package/browser/browser-controller.js +6 -7
- package/core.d.ts +2 -4
- package/core.js +2 -9
- package/database/mongo/module.js +8 -8
- package/disposable/async-disposer.d.ts +8 -7
- package/disposable/async-disposer.js +49 -23
- package/disposable/disposable.d.ts +5 -4
- package/disposable/disposable.js +9 -5
- package/injector/injector.d.ts +5 -2
- package/injector/injector.js +59 -23
- package/injector/interfaces.d.ts +4 -3
- package/injector/provider.d.ts +12 -12
- package/injector/resolve.error.d.ts +1 -1
- package/injector/types.d.ts +16 -7
- package/logger/console/logger.js +2 -2
- package/package.json +6 -5
- package/polyfills.d.ts +159 -0
- package/polyfills.js +2 -0
- package/queue/mongo/mongo-job.repository.js +3 -4
- package/search-index/elastic/module.js +4 -4
- package/tsconfig.json +1 -1
- package/utils/cancellation-token.d.ts +19 -17
- package/utils/cancellation-token.js +20 -19
- package/global-this.d.ts +0 -1
- package/global-this.js +0 -37
|
@@ -137,7 +137,6 @@ let Application = class Application2 {
|
|
|
137
137
|
this.#logger.info("Shutting down");
|
|
138
138
|
await this.stopModules(modules);
|
|
139
139
|
await this.#injector.dispose();
|
|
140
|
-
await (0, import_core.disposeInstances)();
|
|
141
140
|
this.#logger.info("Bye");
|
|
142
141
|
}
|
|
143
142
|
this.#shutdownPromise.resolve();
|
|
@@ -5,7 +5,7 @@ import type { Resolvable } from '../injector/interfaces.js';
|
|
|
5
5
|
import { resolveArgumentType } from '../injector/interfaces.js';
|
|
6
6
|
import type { Logger } from '../logger/logger.js';
|
|
7
7
|
import type { Record } from '../types.js';
|
|
8
|
-
import type {
|
|
8
|
+
import type { Tagged } from 'type-fest';
|
|
9
9
|
import type { NewBrowserContextOptions } from './browser-controller.js';
|
|
10
10
|
import type { PageControllerOptions } from './page-controller.js';
|
|
11
11
|
import { PageController } from './page-controller.js';
|
|
@@ -16,7 +16,7 @@ export type NewPageOptions = {
|
|
|
16
16
|
extraHttpHeaders?: Record<string, string>;
|
|
17
17
|
controllerOptions?: PageControllerOptions;
|
|
18
18
|
};
|
|
19
|
-
export type BrowserContextState =
|
|
19
|
+
export type BrowserContextState = Tagged<Record<string | number, unknown>, 'BrowserContextState'>;
|
|
20
20
|
export type BrowserContextControllerArgument = NewBrowserContextOptions;
|
|
21
21
|
export declare class BrowserContextController implements AsyncDisposable, Resolvable<BrowserContextControllerArgument> {
|
|
22
22
|
/** @deprecated should be avoided */
|
|
@@ -43,8 +43,7 @@ var __metadata = function(k, v) {
|
|
|
43
43
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
44
44
|
return Reflect.metadata(k, v);
|
|
45
45
|
};
|
|
46
|
-
|
|
47
|
-
let BrowserContextController = BrowserContextController_1 = class BrowserContextController2 {
|
|
46
|
+
let BrowserContextController = class BrowserContextController2 {
|
|
48
47
|
/** @deprecated should be avoided */
|
|
49
48
|
context;
|
|
50
49
|
options;
|
|
@@ -95,15 +94,15 @@ let BrowserContextController = BrowserContextController_1 = class BrowserContext
|
|
|
95
94
|
(0, import_utils.attachLogger)(this.context, logger);
|
|
96
95
|
}
|
|
97
96
|
};
|
|
98
|
-
BrowserContextController =
|
|
97
|
+
BrowserContextController = __decorate([
|
|
99
98
|
(0, import_decorators.Injectable)({
|
|
100
99
|
provider: {
|
|
101
100
|
useFactory: (_, context) => {
|
|
102
|
-
context.
|
|
103
|
-
return new
|
|
101
|
+
context.data.browserController = context.resolve(import_browser_controller.BrowserController);
|
|
102
|
+
return new BrowserContextController(null);
|
|
104
103
|
},
|
|
105
|
-
async afterResolve(value, argument,
|
|
106
|
-
const { context: browserContext, controllerOptions } = await
|
|
104
|
+
async afterResolve(value, argument, { data: { browserController } }) {
|
|
105
|
+
const { context: browserContext, controllerOptions } = await browserController.newRawContext(argument);
|
|
107
106
|
value.context = browserContext;
|
|
108
107
|
value.options = controllerOptions;
|
|
109
108
|
}
|
|
@@ -44,8 +44,7 @@ var __metadata = function(k, v) {
|
|
|
44
44
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
45
45
|
return Reflect.metadata(k, v);
|
|
46
46
|
};
|
|
47
|
-
|
|
48
|
-
let BrowserController = BrowserController_1 = class BrowserController2 {
|
|
47
|
+
let BrowserController = class BrowserController2 {
|
|
49
48
|
/** @deprecated should be avoided */
|
|
50
49
|
browser;
|
|
51
50
|
options;
|
|
@@ -103,15 +102,15 @@ let BrowserController = BrowserController_1 = class BrowserController2 {
|
|
|
103
102
|
});
|
|
104
103
|
}
|
|
105
104
|
};
|
|
106
|
-
BrowserController =
|
|
105
|
+
BrowserController = __decorate([
|
|
107
106
|
(0, import_decorators.Injectable)({
|
|
108
107
|
provider: {
|
|
109
108
|
useFactory: (_argument, context) => {
|
|
110
|
-
context.
|
|
111
|
-
return new
|
|
109
|
+
context.data.browserService = (0, import_inject.inject)(import_browser_service.BrowserService);
|
|
110
|
+
return new BrowserController(null);
|
|
112
111
|
},
|
|
113
|
-
async afterResolve(value, argument,
|
|
114
|
-
const { browser, controllerOptions } = await
|
|
112
|
+
async afterResolve(value, argument, { data: { browserService } }) {
|
|
113
|
+
const { browser, controllerOptions } = await browserService.newRawBrowser(argument);
|
|
115
114
|
value.browser = browser;
|
|
116
115
|
value.options = controllerOptions;
|
|
117
116
|
}
|
package/core.d.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import { AsyncDisposer } from './disposable/async-disposer.js';
|
|
2
1
|
import { Injector } from './injector/injector.js';
|
|
3
2
|
import type { InjectionToken } from './injector/token.js';
|
|
4
3
|
import type { LoggerArgument } from './logger/index.js';
|
|
5
4
|
import { LogLevel, Logger } from './logger/index.js';
|
|
5
|
+
import type { ReadonlyCancellationToken } from './utils/cancellation-token.js';
|
|
6
6
|
export declare const CORE_LOGGER: InjectionToken<Logger, never>;
|
|
7
7
|
export declare const rootInjector: Injector;
|
|
8
|
-
export declare const disposer: AsyncDisposer;
|
|
9
8
|
export declare function isDevMode(): boolean;
|
|
10
9
|
export declare function isProdMode(): boolean;
|
|
11
10
|
export declare function enableProdMode(): void;
|
|
12
|
-
export declare function connect(name: string, connectFunction: (() => Promise<any>), logger: Logger, maxTries?: number): Promise<void>;
|
|
13
|
-
export declare function disposeInstances(): Promise<void>;
|
|
11
|
+
export declare function connect(name: string, connectFunction: (() => Promise<any>), logger: Logger, cancellationToken: ReadonlyCancellationToken, maxTries?: number): Promise<void>;
|
|
14
12
|
export type CoreConfiguration = {
|
|
15
13
|
production?: boolean;
|
|
16
14
|
logger?: InjectionToken<Logger, LoggerArgument>;
|
package/core.js
CHANGED
|
@@ -21,15 +21,12 @@ __export(core_exports, {
|
|
|
21
21
|
CORE_LOGGER: () => CORE_LOGGER,
|
|
22
22
|
configureTstdl: () => configureTstdl,
|
|
23
23
|
connect: () => connect,
|
|
24
|
-
disposeInstances: () => disposeInstances,
|
|
25
|
-
disposer: () => disposer,
|
|
26
24
|
enableProdMode: () => enableProdMode,
|
|
27
25
|
isDevMode: () => isDevMode,
|
|
28
26
|
isProdMode: () => isProdMode,
|
|
29
27
|
rootInjector: () => rootInjector
|
|
30
28
|
});
|
|
31
29
|
module.exports = __toCommonJS(core_exports);
|
|
32
|
-
var import_async_disposer = require("./disposable/async-disposer.js");
|
|
33
30
|
var import_injector = require("./injector/injector.js");
|
|
34
31
|
var import_token = require("./injector/token.js");
|
|
35
32
|
var import_logger = require("./logger/console/logger.js");
|
|
@@ -39,7 +36,6 @@ var import_timing = require("./utils/timing.js");
|
|
|
39
36
|
var import_type_guards = require("./utils/type-guards.js");
|
|
40
37
|
const CORE_LOGGER = (0, import_token.injectionToken)("core logger");
|
|
41
38
|
const rootInjector = new import_injector.Injector("RootInjector");
|
|
42
|
-
const disposer = new import_async_disposer.AsyncDisposer();
|
|
43
39
|
let _isDevMode = true;
|
|
44
40
|
function isDevMode() {
|
|
45
41
|
return _isDevMode;
|
|
@@ -50,10 +46,10 @@ function isProdMode() {
|
|
|
50
46
|
function enableProdMode() {
|
|
51
47
|
_isDevMode = false;
|
|
52
48
|
}
|
|
53
|
-
async function connect(name, connectFunction, logger, maxTries = 5) {
|
|
49
|
+
async function connect(name, connectFunction, logger, cancellationToken, maxTries = 5) {
|
|
54
50
|
let triesLeft = maxTries;
|
|
55
51
|
let success = false;
|
|
56
|
-
while (!success &&
|
|
52
|
+
while (!success && cancellationToken.isUnset && triesLeft-- > 0) {
|
|
57
53
|
try {
|
|
58
54
|
logger.verbose(`connecting to ${name}...`);
|
|
59
55
|
await connectFunction();
|
|
@@ -69,9 +65,6 @@ async function connect(name, connectFunction, logger, maxTries = 5) {
|
|
|
69
65
|
}
|
|
70
66
|
}
|
|
71
67
|
}
|
|
72
|
-
async function disposeInstances() {
|
|
73
|
-
await disposer.dispose();
|
|
74
|
-
}
|
|
75
68
|
let coreLogPrefix;
|
|
76
69
|
function configureTstdl(config = {}) {
|
|
77
70
|
if (config.production == true) {
|
package/database/mongo/module.js
CHANGED
|
@@ -45,12 +45,12 @@ import_injector.Injector.registerSingleton(import_classes.MongoClient, {
|
|
|
45
45
|
const client = new import_classes.MongoClient(url, options);
|
|
46
46
|
client.on("fullsetup", () => logger.verbose("connection setup")).on("reconnect", () => logger.warn("reconnected")).on("timeout", () => logger.warn("connection timed out")).on("close", () => logger.verbose("connection closed"));
|
|
47
47
|
context.addDisposeHandler(async () => client.close());
|
|
48
|
-
context.
|
|
49
|
-
context.
|
|
48
|
+
context.data.logger = logger;
|
|
49
|
+
context.data.url = url;
|
|
50
50
|
return client;
|
|
51
51
|
},
|
|
52
|
-
async afterResolve(client, _argument,
|
|
53
|
-
await (0, import_core.connect)(`mongo at ${
|
|
52
|
+
async afterResolve(client, _argument, { cancellationToken, data: { url, logger } }) {
|
|
53
|
+
await (0, import_core.connect)(`mongo at ${url}`, async () => client.connect(), logger, cancellationToken);
|
|
54
54
|
}
|
|
55
55
|
}, {
|
|
56
56
|
defaultArgumentProvider: () => mongoModuleConfig.defaultConnection,
|
|
@@ -71,17 +71,17 @@ import_injector.Injector.registerSingleton(import_classes.Collection, {
|
|
|
71
71
|
useFactory: (config, context) => {
|
|
72
72
|
(0, import_type_guards.assertDefined)(config, "mongo repository config resolve argument missing");
|
|
73
73
|
const database = context.resolve(import_classes.Database, config);
|
|
74
|
-
context.
|
|
74
|
+
context.data.database = database;
|
|
75
75
|
return database.collection(config.collection);
|
|
76
76
|
},
|
|
77
|
-
async afterResolve(_, config,
|
|
78
|
-
const existingCollections = await
|
|
77
|
+
async afterResolve(_, config, { data: { database } }) {
|
|
78
|
+
const existingCollections = await database.collections();
|
|
79
79
|
for (const collection of existingCollections) {
|
|
80
80
|
if (collection.collectionName == config.collection) {
|
|
81
81
|
return;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
await
|
|
84
|
+
await database.createCollection(config.collection);
|
|
85
85
|
}
|
|
86
86
|
}, {
|
|
87
87
|
argumentIdentityProvider: JSON.stringify
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { ReadonlyCancellationToken } from '../utils/cancellation-token.js';
|
|
2
2
|
import { CancellationToken } from '../utils/cancellation-token.js';
|
|
3
3
|
import type { AsyncDisposable, Disposable } from './disposable.js';
|
|
4
|
-
import { disposeAsync } from './disposable.js';
|
|
5
4
|
declare const deferrerToken: unique symbol;
|
|
6
5
|
export type AsyncDisposeTaskFunction = () => any;
|
|
7
6
|
export type AsyncDisposeHandler = AsyncDisposeTaskFunction | Disposable | AsyncDisposable;
|
|
@@ -12,16 +11,17 @@ export type Deferrer = {
|
|
|
12
11
|
[deferrerToken]: CancellationToken;
|
|
13
12
|
yield(): void;
|
|
14
13
|
};
|
|
15
|
-
export declare class AsyncDisposer implements AsyncDisposable {
|
|
16
|
-
private
|
|
17
|
-
private readonly tasks;
|
|
18
|
-
readonly _disposingToken: CancellationToken;
|
|
19
|
-
readonly _disposedToken: CancellationToken;
|
|
14
|
+
export declare class AsyncDisposer implements AsyncDisposable, AsyncDisposableStack {
|
|
15
|
+
#private;
|
|
20
16
|
get disposingToken(): ReadonlyCancellationToken;
|
|
21
17
|
get disposedToken(): ReadonlyCancellationToken;
|
|
22
18
|
get disposing(): boolean;
|
|
23
19
|
get disposed(): boolean;
|
|
20
|
+
readonly [Symbol.toStringTag] = "AsyncDisposable";
|
|
24
21
|
constructor();
|
|
22
|
+
use<T extends globalThis.AsyncDisposable | globalThis.Disposable | null | undefined>(value: T): T;
|
|
23
|
+
adopt<T>(value: T, onDisposeAsync: (value: T) => void | PromiseLike<void>): T;
|
|
24
|
+
move(): AsyncDisposableStack;
|
|
25
25
|
getDeferrer(): Deferrer;
|
|
26
26
|
defer<T>(func: () => Promise<T>): Promise<T>;
|
|
27
27
|
/**
|
|
@@ -29,7 +29,8 @@ export declare class AsyncDisposer implements AsyncDisposable {
|
|
|
29
29
|
* @param fnOrDisposable
|
|
30
30
|
*/
|
|
31
31
|
add(fnOrDisposable: AsyncDisposeHandler): void;
|
|
32
|
+
disposeAsync(): Promise<void>;
|
|
32
33
|
dispose(): Promise<void>;
|
|
33
|
-
[
|
|
34
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
34
35
|
}
|
|
35
36
|
export {};
|
|
@@ -27,37 +27,59 @@ var import_cancellation_token = require("../utils/cancellation-token.js");
|
|
|
27
27
|
var import_disposable = require("./disposable.js");
|
|
28
28
|
const deferrerToken = Symbol("DeferrerToken");
|
|
29
29
|
class AsyncDisposer {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
#disposingToken;
|
|
31
|
+
#disposedToken;
|
|
32
|
+
#deferrers;
|
|
33
|
+
#tasks;
|
|
34
34
|
get disposingToken() {
|
|
35
|
-
return this
|
|
35
|
+
return this.#disposingToken;
|
|
36
36
|
}
|
|
37
37
|
get disposedToken() {
|
|
38
|
-
return this
|
|
38
|
+
return this.#disposedToken;
|
|
39
39
|
}
|
|
40
40
|
get disposing() {
|
|
41
|
-
return this.
|
|
41
|
+
return this.#disposingToken.isSet;
|
|
42
42
|
}
|
|
43
43
|
get disposed() {
|
|
44
|
-
return this.
|
|
44
|
+
return this.#disposedToken.isSet;
|
|
45
45
|
}
|
|
46
|
+
[Symbol.toStringTag] = "AsyncDisposable";
|
|
46
47
|
constructor() {
|
|
47
|
-
this
|
|
48
|
-
this
|
|
49
|
-
this
|
|
50
|
-
this
|
|
48
|
+
this.#deferrers = /* @__PURE__ */ new Set();
|
|
49
|
+
this.#tasks = [];
|
|
50
|
+
this.#disposingToken = new import_cancellation_token.CancellationToken();
|
|
51
|
+
this.#disposedToken = new import_cancellation_token.CancellationToken();
|
|
52
|
+
}
|
|
53
|
+
use(value) {
|
|
54
|
+
if ((0, import_type_guards.isNullOrUndefined)(value)) {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
this.add(value);
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
adopt(value, onDisposeAsync) {
|
|
61
|
+
this.add(async () => onDisposeAsync(value));
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
move() {
|
|
65
|
+
const disposer = new AsyncDisposer();
|
|
66
|
+
disposer.#tasks = this.#tasks;
|
|
67
|
+
disposer.#deferrers = this.#deferrers;
|
|
68
|
+
this.#tasks = [];
|
|
69
|
+
this.#deferrers = /* @__PURE__ */ new Set();
|
|
70
|
+
this.#disposingToken.set();
|
|
71
|
+
this.#disposedToken.set();
|
|
72
|
+
return disposer;
|
|
51
73
|
}
|
|
52
74
|
getDeferrer() {
|
|
53
75
|
const deferrer = {
|
|
54
76
|
[deferrerToken]: new import_cancellation_token.CancellationToken(),
|
|
55
77
|
yield: () => {
|
|
56
78
|
deferrer[deferrerToken].set();
|
|
57
|
-
this
|
|
79
|
+
this.#deferrers.delete(deferrer);
|
|
58
80
|
}
|
|
59
81
|
};
|
|
60
|
-
this
|
|
82
|
+
this.#deferrers.add(deferrer);
|
|
61
83
|
return deferrer;
|
|
62
84
|
}
|
|
63
85
|
async defer(func) {
|
|
@@ -75,24 +97,27 @@ class AsyncDisposer {
|
|
|
75
97
|
*/
|
|
76
98
|
add(fnOrDisposable) {
|
|
77
99
|
const fn = (0, import_disposable.isAsyncDisposable)(fnOrDisposable) ? async () => fnOrDisposable[import_disposable.disposeAsync]() : (0, import_disposable.isDisposable)(fnOrDisposable) ? () => fnOrDisposable[import_disposable.dispose]() : fnOrDisposable;
|
|
78
|
-
this
|
|
100
|
+
this.#tasks.push({ taskFunction: fn });
|
|
101
|
+
}
|
|
102
|
+
async disposeAsync() {
|
|
103
|
+
await this.dispose();
|
|
79
104
|
}
|
|
80
105
|
async dispose() {
|
|
81
106
|
if (this.disposing) {
|
|
82
|
-
return this
|
|
107
|
+
return this.#disposedToken.$set;
|
|
83
108
|
}
|
|
84
|
-
this.
|
|
109
|
+
this.#disposingToken.set();
|
|
85
110
|
const errors = [];
|
|
86
|
-
for (const deferrer of this
|
|
111
|
+
for (const deferrer of this.#deferrers) {
|
|
87
112
|
try {
|
|
88
113
|
await deferrer[deferrerToken];
|
|
89
114
|
} catch (error2) {
|
|
90
115
|
errors.push(error2);
|
|
91
116
|
}
|
|
92
117
|
}
|
|
93
|
-
for (let i = this
|
|
118
|
+
for (let i = this.#tasks.length - 1; i >= 0; i--) {
|
|
94
119
|
try {
|
|
95
|
-
const task = this
|
|
120
|
+
const task = this.#tasks[i];
|
|
96
121
|
await task.taskFunction();
|
|
97
122
|
} catch (error2) {
|
|
98
123
|
errors.push(error2);
|
|
@@ -100,12 +125,13 @@ class AsyncDisposer {
|
|
|
100
125
|
}
|
|
101
126
|
const error = errors.length == 1 ? errors[0] : errors.length > 1 ? new import_multi_error.MultiError(errors, "dispose errors") : void 0;
|
|
102
127
|
if ((0, import_type_guards.isDefined)(error)) {
|
|
103
|
-
this.
|
|
128
|
+
this.#disposedToken.error(error);
|
|
104
129
|
throw error;
|
|
105
130
|
}
|
|
106
|
-
this.
|
|
131
|
+
this.#disposedToken.set();
|
|
132
|
+
return void 0;
|
|
107
133
|
}
|
|
108
|
-
async [
|
|
134
|
+
async [Symbol.asyncDispose]() {
|
|
109
135
|
return this.dispose();
|
|
110
136
|
}
|
|
111
137
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
export declare const dispose:
|
|
2
|
-
export declare const disposeAsync:
|
|
1
|
+
export declare const dispose: typeof Symbol.dispose;
|
|
2
|
+
export declare const disposeAsync: typeof Symbol.asyncDispose;
|
|
3
3
|
export interface Disposable {
|
|
4
|
-
[dispose](): void;
|
|
4
|
+
[Symbol.dispose](): void;
|
|
5
5
|
}
|
|
6
6
|
export interface AsyncDisposable {
|
|
7
|
-
[
|
|
7
|
+
[Symbol.asyncDispose](): PromiseLike<void>;
|
|
8
8
|
}
|
|
9
9
|
export declare function isDisposable(object: any): object is Disposable;
|
|
10
10
|
export declare function isAsyncDisposable(object: any): object is AsyncDisposable;
|
|
11
|
+
export declare function isSyncOrAsyncDisposable(object: any): object is Disposable | AsyncDisposable;
|
package/disposable/disposable.js
CHANGED
|
@@ -21,15 +21,19 @@ __export(disposable_exports, {
|
|
|
21
21
|
dispose: () => dispose,
|
|
22
22
|
disposeAsync: () => disposeAsync,
|
|
23
23
|
isAsyncDisposable: () => isAsyncDisposable,
|
|
24
|
-
isDisposable: () => isDisposable
|
|
24
|
+
isDisposable: () => isDisposable,
|
|
25
|
+
isSyncOrAsyncDisposable: () => isSyncOrAsyncDisposable
|
|
25
26
|
});
|
|
26
27
|
module.exports = __toCommonJS(disposable_exports);
|
|
27
28
|
var import_type_guards = require("../utils/type-guards.js");
|
|
28
|
-
const dispose = Symbol
|
|
29
|
-
const disposeAsync = Symbol
|
|
29
|
+
const dispose = Symbol.dispose;
|
|
30
|
+
const disposeAsync = Symbol.asyncDispose;
|
|
30
31
|
function isDisposable(object) {
|
|
31
|
-
return (0, import_type_guards.isFunction)(object?.[dispose]);
|
|
32
|
+
return (0, import_type_guards.isFunction)(object?.[Symbol.dispose]);
|
|
32
33
|
}
|
|
33
34
|
function isAsyncDisposable(object) {
|
|
34
|
-
return (0, import_type_guards.isFunction)(object?.[
|
|
35
|
+
return (0, import_type_guards.isFunction)(object?.[Symbol.asyncDispose]);
|
|
36
|
+
}
|
|
37
|
+
function isSyncOrAsyncDisposable(object) {
|
|
38
|
+
return (0, import_type_guards.isFunction)(object?.[Symbol.dispose] ?? object?.[Symbol.asyncDispose]);
|
|
35
39
|
}
|
package/injector/injector.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { AsyncDisposable } from '../disposable/disposable.js';
|
|
2
|
-
import { disposeAsync } from '../disposable/disposable.js';
|
|
3
2
|
import type { OneOrMany, Record, TypedOmit } from '../types.js';
|
|
4
3
|
import type { ResolveArgument } from './interfaces.js';
|
|
5
4
|
import { type Provider } from './provider.js';
|
|
@@ -17,9 +16,11 @@ export type GetRegistrationOptions = {
|
|
|
17
16
|
skipSelf?: boolean;
|
|
18
17
|
onlySelf?: boolean;
|
|
19
18
|
};
|
|
19
|
+
export type AddDisposeHandler = (handler: Disposable | AsyncDisposable | (() => any)) => void;
|
|
20
20
|
export declare class Injector implements AsyncDisposable {
|
|
21
21
|
#private;
|
|
22
22
|
readonly name: string;
|
|
23
|
+
get disposed(): boolean;
|
|
23
24
|
constructor(name: string, parent?: Injector | null);
|
|
24
25
|
/**
|
|
25
26
|
* Globally register a provider for a token
|
|
@@ -36,7 +37,7 @@ export declare class Injector implements AsyncDisposable {
|
|
|
36
37
|
*/
|
|
37
38
|
static registerSingleton<T, A = any, C extends Record = Record>(token: InjectionToken<T, A>, providers: OneOrMany<Provider<T, A, C>>, options?: TypedOmit<RegistrationOptions<T, A, C>, 'lifecycle'>): void;
|
|
38
39
|
dispose(): Promise<void>;
|
|
39
|
-
[
|
|
40
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
40
41
|
fork(name: string): Injector;
|
|
41
42
|
/**
|
|
42
43
|
* Register a provider for a token
|
|
@@ -87,5 +88,7 @@ export declare class Injector implements AsyncDisposable {
|
|
|
87
88
|
private resolveInjectionAll;
|
|
88
89
|
private resolveInjectionAllAsync;
|
|
89
90
|
private getResolveContext;
|
|
91
|
+
private getAfterResolveContext;
|
|
90
92
|
private getInjectionContext;
|
|
93
|
+
private assertNotDisposed;
|
|
91
94
|
}
|
package/injector/injector.js
CHANGED
|
@@ -23,11 +23,11 @@ __export(injector_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(injector_exports);
|
|
24
24
|
var import_circular_buffer = require("../data-structures/circular-buffer.js");
|
|
25
25
|
var import_multi_key_map = require("../data-structures/multi-key-map.js");
|
|
26
|
-
var import_async_disposer = require("../disposable/async-disposer.js");
|
|
27
26
|
var import_disposable = require("../disposable/disposable.js");
|
|
28
27
|
var import_deferred_promise = require("../promise/deferred-promise.js");
|
|
29
28
|
var import_registry = require("../reflection/registry.js");
|
|
30
29
|
var import_array = require("../utils/array/array.js");
|
|
30
|
+
var import_cancellation_token = require("../utils/cancellation-token.js");
|
|
31
31
|
var import_factory_map = require("../utils/factory-map.js");
|
|
32
32
|
var import_forward_ref = require("../utils/object/forward-ref.js");
|
|
33
33
|
var import_object = require("../utils/object/object.js");
|
|
@@ -43,14 +43,29 @@ class Injector {
|
|
|
43
43
|
static #globalRegistrations = /* @__PURE__ */ new Map();
|
|
44
44
|
#parent;
|
|
45
45
|
#children = [];
|
|
46
|
-
#
|
|
46
|
+
#disposeToken = new import_cancellation_token.CancellationToken();
|
|
47
|
+
#disposableStack = new AsyncDisposableStack();
|
|
47
48
|
#registrations = /* @__PURE__ */ new Map();
|
|
48
49
|
#injectorScopedResolutions = new import_multi_key_map.MultiKeyMap();
|
|
50
|
+
#addDisposeHandler;
|
|
49
51
|
name;
|
|
52
|
+
get disposed() {
|
|
53
|
+
return this.#disposableStack.disposed;
|
|
54
|
+
}
|
|
50
55
|
constructor(name, parent = null) {
|
|
51
56
|
this.name = name;
|
|
52
57
|
this.#parent = parent;
|
|
53
58
|
this.register(Injector, { useValue: this });
|
|
59
|
+
this.register(import_cancellation_token.CancellationToken, { useValue: this.#disposeToken });
|
|
60
|
+
this.#addDisposeHandler = (handler) => {
|
|
61
|
+
if ((0, import_disposable.isSyncOrAsyncDisposable)(handler)) {
|
|
62
|
+
this.#disposableStack.use(handler);
|
|
63
|
+
} else {
|
|
64
|
+
this.#disposableStack.defer(handler);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
this.#disposableStack.defer(() => this.#registrations.clear());
|
|
68
|
+
this.#disposableStack.defer(() => this.#injectorScopedResolutions.clear());
|
|
54
69
|
}
|
|
55
70
|
/**
|
|
56
71
|
* Globally register a provider for a token
|
|
@@ -78,15 +93,16 @@ class Injector {
|
|
|
78
93
|
Injector.register(token, providers, { ...options, lifecycle: "singleton" });
|
|
79
94
|
}
|
|
80
95
|
async dispose() {
|
|
81
|
-
|
|
96
|
+
this.#disposeToken.set();
|
|
97
|
+
await this.#disposableStack.disposeAsync();
|
|
82
98
|
}
|
|
83
|
-
async [
|
|
99
|
+
async [Symbol.asyncDispose]() {
|
|
84
100
|
await this.dispose();
|
|
85
101
|
}
|
|
86
102
|
fork(name) {
|
|
87
103
|
const child = new Injector(name, this);
|
|
88
104
|
this.#children.push(child);
|
|
89
|
-
this.#
|
|
105
|
+
this.#disposableStack.use(child);
|
|
90
106
|
return child;
|
|
91
107
|
}
|
|
92
108
|
/**
|
|
@@ -96,6 +112,7 @@ class Injector {
|
|
|
96
112
|
* @param options registration options
|
|
97
113
|
*/
|
|
98
114
|
register(token, providers, options = {}) {
|
|
115
|
+
this.assertNotDisposed();
|
|
99
116
|
for (const provider of (0, import_array.toArray)(providers)) {
|
|
100
117
|
const registration = {
|
|
101
118
|
token,
|
|
@@ -184,6 +201,7 @@ class Injector {
|
|
|
184
201
|
return values;
|
|
185
202
|
}
|
|
186
203
|
_resolve(token, argument, options, context, chain) {
|
|
204
|
+
this.assertNotDisposed();
|
|
187
205
|
if ((0, import_type_guards.isUndefined)(token)) {
|
|
188
206
|
throw new import_resolve_error.ResolveError("Token is undefined - this might be because of circular dependencies, use alias or forwardRef in this case.", chain);
|
|
189
207
|
}
|
|
@@ -201,6 +219,7 @@ class Injector {
|
|
|
201
219
|
return this._resolveRegistration(singleRegistration, argument, options, context, chain);
|
|
202
220
|
}
|
|
203
221
|
_resolveAll(token, argument, options, context, chain) {
|
|
222
|
+
this.assertNotDisposed();
|
|
204
223
|
if ((0, import_type_guards.isUndefined)(token)) {
|
|
205
224
|
throw new import_resolve_error.ResolveError("Token is undefined - this might be because of circular dependencies, use alias or forwardRef in this case.", chain);
|
|
206
225
|
}
|
|
@@ -237,7 +256,14 @@ class Injector {
|
|
|
237
256
|
return registration.resolutions.get(argumentIdentity);
|
|
238
257
|
}
|
|
239
258
|
const value = this._resolveProvider(resolutionTag, registration, resolveArgument, options, context, injectionContext, chain);
|
|
240
|
-
const resolution = {
|
|
259
|
+
const resolution = {
|
|
260
|
+
tag: resolutionTag,
|
|
261
|
+
registration,
|
|
262
|
+
value,
|
|
263
|
+
argument: injectionContext.argument,
|
|
264
|
+
afterResolveContext: this.getAfterResolveContext(resolutionTag, context),
|
|
265
|
+
chain
|
|
266
|
+
};
|
|
241
267
|
context.resolutions.push(resolution);
|
|
242
268
|
if (resolutionScoped) {
|
|
243
269
|
context.resolutionScopedResolutions.setFlat(token, argumentIdentity, resolution);
|
|
@@ -293,7 +319,7 @@ class Injector {
|
|
|
293
319
|
throw new Error("Unsupported provider.");
|
|
294
320
|
}
|
|
295
321
|
if ((0, import_disposable.isDisposable)(result.value) || (0, import_disposable.isAsyncDisposable)(result.value)) {
|
|
296
|
-
this.#
|
|
322
|
+
this.#disposableStack.use(result.value);
|
|
297
323
|
}
|
|
298
324
|
return result.value;
|
|
299
325
|
} finally {
|
|
@@ -363,9 +389,20 @@ class Injector {
|
|
|
363
389
|
const context = {
|
|
364
390
|
resolve: (token, argument, options) => this._resolve(token, argument, options ?? {}, resolveContext, chain.addToken(token)),
|
|
365
391
|
resolveAll: (token, argument, options) => this._resolveAll(token, argument, options ?? {}, resolveContext, chain.addToken(token)),
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
392
|
+
cancellationToken: this.#disposeToken,
|
|
393
|
+
addDisposeHandler: this.#addDisposeHandler,
|
|
394
|
+
get data() {
|
|
395
|
+
return resolveContext.resolutionContextData.get(resolutionTag);
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
return context;
|
|
399
|
+
}
|
|
400
|
+
getAfterResolveContext(resolutionTag, resolveContext) {
|
|
401
|
+
const context = {
|
|
402
|
+
cancellationToken: this.#disposeToken,
|
|
403
|
+
addDisposeHandler: this.#addDisposeHandler,
|
|
404
|
+
get data() {
|
|
405
|
+
return resolveContext.resolutionContextData.get(resolutionTag);
|
|
369
406
|
}
|
|
370
407
|
};
|
|
371
408
|
return context;
|
|
@@ -381,6 +418,11 @@ class Injector {
|
|
|
381
418
|
};
|
|
382
419
|
return context;
|
|
383
420
|
}
|
|
421
|
+
assertNotDisposed() {
|
|
422
|
+
if (this.disposed) {
|
|
423
|
+
throw new Error("Injector is disposed.");
|
|
424
|
+
}
|
|
425
|
+
}
|
|
384
426
|
}
|
|
385
427
|
function addRegistration(registrations, registration) {
|
|
386
428
|
if ((0, import_provider.isClassProvider)(registration.provider)) {
|
|
@@ -408,7 +450,7 @@ function newInternalResolveContext() {
|
|
|
408
450
|
resolving: /* @__PURE__ */ new Set(),
|
|
409
451
|
resolutionScopedResolutions: new import_multi_key_map.MultiKeyMap(),
|
|
410
452
|
resolutions: [],
|
|
411
|
-
|
|
453
|
+
resolutionContextData: new import_factory_map.FactoryMap(() => ({})),
|
|
412
454
|
forwardRefQueue: new import_circular_buffer.CircularBuffer(),
|
|
413
455
|
forwardRefs: /* @__PURE__ */ new Set(),
|
|
414
456
|
$done: new import_deferred_promise.DeferredPromise()
|
|
@@ -421,18 +463,15 @@ function postProcess(context) {
|
|
|
421
463
|
derefForwardRefs(context);
|
|
422
464
|
for (const resolution of context.resolutions) {
|
|
423
465
|
if ((0, import_type_guards.isFunction)(resolution.value?.[import_interfaces.afterResolve])) {
|
|
424
|
-
const
|
|
425
|
-
const returnValue = resolution.value[import_interfaces.afterResolve](resolution.argument, resolutionContext);
|
|
466
|
+
const returnValue = resolution.value[import_interfaces.afterResolve](resolution.argument, resolution.afterResolveContext);
|
|
426
467
|
throwOnPromise(returnValue, "[afterResolve]", resolution.chain);
|
|
427
468
|
}
|
|
428
469
|
if ((0, import_provider.isProviderWithInitializer)(resolution.registration.provider)) {
|
|
429
|
-
const
|
|
430
|
-
const returnValue = resolution.registration.provider.afterResolve?.(resolution.value, resolution.argument, resolutionContext);
|
|
470
|
+
const returnValue = resolution.registration.provider.afterResolve?.(resolution.value, resolution.argument, resolution.afterResolveContext);
|
|
431
471
|
throwOnPromise(returnValue, "provider afterResolve handler", resolution.chain);
|
|
432
472
|
}
|
|
433
473
|
if ((0, import_type_guards.isDefined)(resolution.registration.options.afterResolve)) {
|
|
434
|
-
const
|
|
435
|
-
const returnValue = resolution.registration.options.afterResolve(resolution.value, resolution.argument, resolutionContext);
|
|
474
|
+
const returnValue = resolution.registration.options.afterResolve(resolution.value, resolution.argument, resolution.afterResolveContext);
|
|
436
475
|
throwOnPromise(returnValue, "registration afterResolve handler", resolution.chain);
|
|
437
476
|
}
|
|
438
477
|
}
|
|
@@ -444,16 +483,13 @@ async function postProcessAsync(context) {
|
|
|
444
483
|
derefForwardRefs(context);
|
|
445
484
|
for (const resolution of context.resolutions) {
|
|
446
485
|
if ((0, import_type_guards.isFunction)(resolution.value?.[import_interfaces.afterResolve])) {
|
|
447
|
-
|
|
448
|
-
await resolution.value[import_interfaces.afterResolve](resolution.argument, resolutionContext);
|
|
486
|
+
await resolution.value[import_interfaces.afterResolve](resolution.argument, resolution.afterResolveContext);
|
|
449
487
|
}
|
|
450
488
|
if ((0, import_provider.isProviderWithInitializer)(resolution.registration.provider)) {
|
|
451
|
-
|
|
452
|
-
await resolution.registration.provider.afterResolve?.(resolution.value, resolution.argument, resolutionContext);
|
|
489
|
+
await resolution.registration.provider.afterResolve?.(resolution.value, resolution.argument, resolution.afterResolveContext);
|
|
453
490
|
}
|
|
454
491
|
if ((0, import_type_guards.isDefined)(resolution.registration.options.afterResolve)) {
|
|
455
|
-
|
|
456
|
-
await resolution.registration.options.afterResolve(resolution.value, resolution.argument, resolutionContext);
|
|
492
|
+
await resolution.registration.options.afterResolve(resolution.value, resolution.argument, resolution.afterResolveContext);
|
|
457
493
|
}
|
|
458
494
|
}
|
|
459
495
|
}
|
package/injector/interfaces.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import type { Record, Type } from '../types.js';
|
|
2
2
|
import type { ArgumentedInjectionToken, InjectionTokenArgument, ReifyingInjectionToken } from './token.js';
|
|
3
|
+
import type { AfterResolveContext } from './types.js';
|
|
3
4
|
export declare const resolveArgumentType: unique symbol;
|
|
4
5
|
export declare const afterResolve: unique symbol;
|
|
5
6
|
export type ResolveArgumentType = typeof resolveArgumentType;
|
|
6
7
|
export type ResolveArgument<T, Fallback = undefined> = undefined | (T extends Resolvable<infer U> ? U : T extends Type<Resolvable<infer U>> ? U : T extends (ArgumentedInjectionToken<any, any> | ReifyingInjectionToken) ? InjectionTokenArgument<T> : Fallback);
|
|
7
|
-
export interface Resolvable<A = unknown,
|
|
8
|
+
export interface Resolvable<A = unknown, D extends Record = Record> extends Partial<AfterResolve<A, D>> {
|
|
8
9
|
/**
|
|
9
10
|
* type of resolve argument
|
|
10
11
|
* @deprecated only used for type inference
|
|
11
12
|
*/
|
|
12
13
|
readonly [resolveArgumentType]: A;
|
|
13
14
|
}
|
|
14
|
-
export interface AfterResolve<A = unknown,
|
|
15
|
-
[afterResolve](argument: A, context:
|
|
15
|
+
export interface AfterResolve<A = unknown, D extends Record = Record> {
|
|
16
|
+
[afterResolve](argument: A, context: AfterResolveContext<D>): void | Promise<void>;
|
|
16
17
|
}
|
package/injector/provider.d.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import type { Constructor, Record, TypedOmit } from '../types.js';
|
|
2
2
|
import type { ResolveArgument } from './interfaces.js';
|
|
3
3
|
import type { InjectionToken } from './token.js';
|
|
4
|
-
import type { ResolveContext } from './types.js';
|
|
5
|
-
export type Factory<T, A = any,
|
|
4
|
+
import type { AfterResolveContext, ResolveContext } from './types.js';
|
|
5
|
+
export type Factory<T, A = any, D extends Record = Record> = (argument: ResolveArgument<T, A>, context: ResolveContext<D>) => T;
|
|
6
6
|
export type ProviderWithArgument<T, A> = {
|
|
7
7
|
defaultArgument?: ResolveArgument<T, A>;
|
|
8
8
|
defaultArgumentProvider?: () => ResolveArgument<T, A>;
|
|
9
9
|
};
|
|
10
|
-
export type ProviderWithInitializer<T, A,
|
|
11
|
-
afterResolve?: (value: T, argument: A, context:
|
|
10
|
+
export type ProviderWithInitializer<T, A, D extends Record> = {
|
|
11
|
+
afterResolve?: (value: T, argument: A, context: AfterResolveContext<D>) => void | Promise<void>;
|
|
12
12
|
};
|
|
13
|
-
export type Provider<T = any, A = any,
|
|
14
|
-
export type ClassProvider<T = any, A = any,
|
|
13
|
+
export type Provider<T = any, A = any, D extends Record = Record> = ClassProvider<T, A, D> | ValueProvider<T> | TokenProvider<T, A, D> | FactoryProvider<T, A, D>;
|
|
14
|
+
export type ClassProvider<T = any, A = any, D extends Record = Record> = ProviderWithArgument<T, A> & ProviderWithInitializer<T, A, D> & {
|
|
15
15
|
useClass: Constructor<T>;
|
|
16
16
|
};
|
|
17
17
|
export type ValueProvider<T = any> = {
|
|
18
18
|
useValue: T;
|
|
19
19
|
};
|
|
20
|
-
export type TokenProvider<T = any, A = any,
|
|
20
|
+
export type TokenProvider<T = any, A = any, D extends Record = Record> = ProviderWithArgument<T, A> & ProviderWithInitializer<T, A, D> & ({
|
|
21
21
|
useToken: InjectionToken<T, A>;
|
|
22
22
|
useTokenProvider?: undefined;
|
|
23
23
|
} | {
|
|
@@ -29,13 +29,13 @@ export type TokenProvider<T = any, A = any, C extends Record = Record> = Provide
|
|
|
29
29
|
*/
|
|
30
30
|
resolveAll?: boolean;
|
|
31
31
|
};
|
|
32
|
-
export type FactoryProvider<T = any, A = unknown,
|
|
33
|
-
useFactory: Factory<T, A,
|
|
32
|
+
export type FactoryProvider<T = any, A = unknown, D extends Record = Record> = ProviderWithArgument<T, A> & ProviderWithInitializer<T, A, D> & {
|
|
33
|
+
useFactory: Factory<T, A, D>;
|
|
34
34
|
};
|
|
35
|
-
export declare function classProvider<T, A,
|
|
35
|
+
export declare function classProvider<T, A, D extends Record>(constructor: Constructor<T>, options?: TypedOmit<ClassProvider<T, A, D>, 'useClass'>): ClassProvider<T, A, D>;
|
|
36
36
|
export declare function valueProvider<T>(value: T, options?: TypedOmit<ValueProvider<T>, 'useValue'>): ValueProvider<T>;
|
|
37
|
-
export declare function tokenProvider<T, A,
|
|
38
|
-
export declare function factoryProvider<T, A,
|
|
37
|
+
export declare function tokenProvider<T, A, D extends Record>(token: InjectionToken<T, A>, options?: TypedOmit<TokenProvider<T, A, D>, 'useToken' | 'useTokenProvider'>): TokenProvider<T>;
|
|
38
|
+
export declare function factoryProvider<T, A, D extends Record>(factory: Factory<T, A, D>, options?: TypedOmit<FactoryProvider<T, A, D>, 'useFactory'>): FactoryProvider<T, A, D>;
|
|
39
39
|
export declare function isClassProvider<T, A>(value: Provider<T, A>): value is ClassProvider<T, A>;
|
|
40
40
|
export declare function isClassProvider<T, A>(value: unknown): value is ClassProvider<T, A>;
|
|
41
41
|
export declare function isValueProvider<T>(value: Provider<T>): value is ValueProvider<T>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CustomError } from '../error/custom.error.js';
|
|
2
|
-
import { ResolveChain } from './resolve-chain.js';
|
|
2
|
+
import type { ResolveChain } from './resolve-chain.js';
|
|
3
3
|
export declare class ResolveError extends CustomError {
|
|
4
4
|
constructor(message: string, chain: ResolveChain, cause?: Error);
|
|
5
5
|
}
|
package/injector/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AsyncDisposeHandler } from '../disposable/async-disposer.js';
|
|
2
2
|
import type { Record } from '../types.js';
|
|
3
|
+
import type { ReadonlyCancellationToken } from '../utils/cancellation-token.js';
|
|
3
4
|
import type { Injector } from './injector.js';
|
|
4
5
|
import type { ResolveArgument } from './interfaces.js';
|
|
5
6
|
import type { InjectionToken } from './token.js';
|
|
@@ -10,12 +11,18 @@ import type { InjectionToken } from './token.js';
|
|
|
10
11
|
* singleton: one resolution at injector where token is registered
|
|
11
12
|
*/
|
|
12
13
|
export type Lifecycle = 'transient' | 'resolution' | 'injector' | 'singleton';
|
|
13
|
-
export type ResolveContext<
|
|
14
|
-
|
|
14
|
+
export type ResolveContext<D extends Record> = Pick<Injector, 'resolve' | 'resolveAll'> & {
|
|
15
|
+
readonly data: ResolveContextData<D>;
|
|
16
|
+
readonly cancellationToken: ReadonlyCancellationToken;
|
|
17
|
+
addDisposeHandler(handler: AsyncDisposeHandler): void;
|
|
18
|
+
};
|
|
19
|
+
export type AfterResolveContext<D extends Record> = {
|
|
20
|
+
readonly data: ResolveContextData<D>;
|
|
21
|
+
readonly cancellationToken: ReadonlyCancellationToken;
|
|
15
22
|
addDisposeHandler(handler: AsyncDisposeHandler): void;
|
|
16
23
|
};
|
|
17
24
|
export type Mapper<T = any, U = unknown> = (value: T) => U;
|
|
18
|
-
export type ArgumentProvider<T = unknown,
|
|
25
|
+
export type ArgumentProvider<T = unknown, D extends Record = Record> = (context: ResolveContext<D>) => T;
|
|
19
26
|
export type ForwardRefInjectionToken<T = any, A = any> = Exclude<InjectionToken<T, A>, Function> | (() => InjectionToken<T, A>);
|
|
20
27
|
export type ResolveOptions = {
|
|
21
28
|
optional?: boolean;
|
|
@@ -25,13 +32,13 @@ export type ResolveOptions = {
|
|
|
25
32
|
/**
|
|
26
33
|
* data to store between different stages like resolve and afterResolve
|
|
27
34
|
*/
|
|
28
|
-
export type
|
|
29
|
-
export type RegistrationOptions<T, A = unknown,
|
|
35
|
+
export type ResolveContextData<T extends Record> = T;
|
|
36
|
+
export type RegistrationOptions<T, A = unknown, D extends Record = Record> = {
|
|
30
37
|
lifecycle?: Lifecycle;
|
|
31
38
|
/** Default resolve argument used when neither token nor explicit resolve argument is provided */
|
|
32
39
|
defaultArgument?: ResolveArgument<T, A>;
|
|
33
40
|
/** Default resolve argument used when neither token nor explicit resolve argument is provided */
|
|
34
|
-
defaultArgumentProvider?: ArgumentProvider<ResolveArgument<T, A>,
|
|
41
|
+
defaultArgumentProvider?: ArgumentProvider<ResolveArgument<T, A>, D>;
|
|
35
42
|
/**
|
|
36
43
|
* Value to distinguish scoped and singleton instances based on argument
|
|
37
44
|
* by default it uses strict equality (===) on the original argument,
|
|
@@ -43,7 +50,9 @@ export type RegistrationOptions<T, A = unknown, C extends Record = Record> = {
|
|
|
43
50
|
*/
|
|
44
51
|
argumentIdentityProvider?: Mapper<ResolveArgument<T, A>>;
|
|
45
52
|
/** Function which gets called after a resolve */
|
|
46
|
-
afterResolve?: (instance: T, argument: ResolveArgument<T, A>, context:
|
|
53
|
+
afterResolve?: (instance: T, argument: ResolveArgument<T, A>, context: AfterResolveContext<D>) => any;
|
|
47
54
|
/** Whether multiple values can be resolved or not (used with {@link Injector.resolveAll}). If false, previous registrations are removed */
|
|
48
55
|
multi?: boolean;
|
|
56
|
+
/** custom metadata */
|
|
57
|
+
metadata?: Record;
|
|
49
58
|
};
|
package/logger/console/logger.js
CHANGED
|
@@ -79,9 +79,9 @@ ConsoleLogger = ConsoleLogger_1 = __decorate([
|
|
|
79
79
|
provider: {
|
|
80
80
|
useFactory: (argument, context) => {
|
|
81
81
|
if ((0, import_type_guards.isObject)(argument)) {
|
|
82
|
-
return new
|
|
82
|
+
return new ConsoleLogger(argument.level ?? context.resolve(import_level.LogLevel), argument.module, argument.prefix);
|
|
83
83
|
}
|
|
84
|
-
return new
|
|
84
|
+
return new ConsoleLogger(context.resolve(import_level.LogLevel), argument, void 0);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
}),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tstdl/base",
|
|
3
|
-
"version": "0.86.
|
|
3
|
+
"version": "0.86.1",
|
|
4
4
|
"author": "Patrick Hein",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -20,10 +20,11 @@
|
|
|
20
20
|
"tsc-alias:watch": "tsc-alias --watch"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
+
"disposablestack": "^1.1.1",
|
|
23
24
|
"luxon": "^3.4",
|
|
24
25
|
"reflect-metadata": "^0.1",
|
|
25
26
|
"rxjs": "^7.8",
|
|
26
|
-
"type-fest": "^4.
|
|
27
|
+
"type-fest": "^4.3"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
29
30
|
"@types/chroma-js": "2.4",
|
|
@@ -37,12 +38,12 @@
|
|
|
37
38
|
"@typescript-eslint/parser": "6.4",
|
|
38
39
|
"concurrently": "8.2",
|
|
39
40
|
"esbuild": "0.19",
|
|
40
|
-
"eslint": "8.
|
|
41
|
+
"eslint": "8.48",
|
|
41
42
|
"eslint-import-resolver-typescript": "3.6",
|
|
42
43
|
"eslint-plugin-import": "2.28",
|
|
43
44
|
"tsc-alias": "1.8",
|
|
44
|
-
"typedoc": "0.
|
|
45
|
-
"typescript": "5.
|
|
45
|
+
"typedoc": "0.25",
|
|
46
|
+
"typescript": "5.2"
|
|
46
47
|
},
|
|
47
48
|
"peerDependencies": {
|
|
48
49
|
"@elastic/elasticsearch": "^8.9",
|
package/polyfills.d.ts
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import 'disposablestack/auto';
|
|
2
|
+
declare global {
|
|
3
|
+
interface SymbolConstructor {
|
|
4
|
+
/**
|
|
5
|
+
* A method that is used to release resources held by an object. Called by the semantics of the `using` statement.
|
|
6
|
+
*/
|
|
7
|
+
readonly dispose: unique symbol;
|
|
8
|
+
/**
|
|
9
|
+
* A method that is used to asynchronously release resources held by an object. Called by the semantics of the `await using` statement.
|
|
10
|
+
*/
|
|
11
|
+
readonly asyncDispose: unique symbol;
|
|
12
|
+
}
|
|
13
|
+
interface Disposable {
|
|
14
|
+
[Symbol.dispose](): void;
|
|
15
|
+
}
|
|
16
|
+
interface AsyncDisposable {
|
|
17
|
+
[Symbol.asyncDispose](): PromiseLike<void>;
|
|
18
|
+
}
|
|
19
|
+
interface SuppressedError extends Error {
|
|
20
|
+
error: any;
|
|
21
|
+
suppressed: any;
|
|
22
|
+
}
|
|
23
|
+
interface SuppressedErrorConstructor extends ErrorConstructor {
|
|
24
|
+
new (error: any, suppressed: any, message?: string): SuppressedError;
|
|
25
|
+
(error: any, suppressed: any, message?: string): SuppressedError;
|
|
26
|
+
readonly prototype: SuppressedError;
|
|
27
|
+
}
|
|
28
|
+
var SuppressedError: SuppressedErrorConstructor;
|
|
29
|
+
interface DisposableStack {
|
|
30
|
+
/**
|
|
31
|
+
* Returns a value indicating whether this stack has been disposed.
|
|
32
|
+
*/
|
|
33
|
+
readonly disposed: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Disposes each resource in the stack in the reverse order that they were added.
|
|
36
|
+
*/
|
|
37
|
+
dispose(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Adds a disposable resource to the stack, returning the resource.
|
|
40
|
+
* @param value The resource to add. `null` and `undefined` will not be added, but will be returned.
|
|
41
|
+
* @returns The provided {@link value}.
|
|
42
|
+
*/
|
|
43
|
+
use<T extends Disposable | null | undefined>(value: T): T;
|
|
44
|
+
/**
|
|
45
|
+
* Adds a value and associated disposal callback as a resource to the stack.
|
|
46
|
+
* @param value The value to add.
|
|
47
|
+
* @param onDispose The callback to use in place of a `[Symbol.dispose]()` method. Will be invoked with `value`
|
|
48
|
+
* as the first parameter.
|
|
49
|
+
* @returns The provided {@link value}.
|
|
50
|
+
*/
|
|
51
|
+
adopt<T>(value: T, onDispose: (value: T) => void): T;
|
|
52
|
+
/**
|
|
53
|
+
* Adds a callback to be invoked when the stack is disposed.
|
|
54
|
+
*/
|
|
55
|
+
defer(onDispose: () => void): void;
|
|
56
|
+
/**
|
|
57
|
+
* Move all resources out of this stack and into a new `DisposableStack`, and marks this stack as disposed.
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* class C {
|
|
61
|
+
* #res1: Disposable;
|
|
62
|
+
* #res2: Disposable;
|
|
63
|
+
* #disposables: DisposableStack;
|
|
64
|
+
* constructor() {
|
|
65
|
+
* // stack will be disposed when exiting constructor for any reason
|
|
66
|
+
* using stack = new DisposableStack();
|
|
67
|
+
*
|
|
68
|
+
* // get first resource
|
|
69
|
+
* this.#res1 = stack.use(getResource1());
|
|
70
|
+
*
|
|
71
|
+
* // get second resource. If this fails, both `stack` and `#res1` will be disposed.
|
|
72
|
+
* this.#res2 = stack.use(getResource2());
|
|
73
|
+
*
|
|
74
|
+
* // all operations succeeded, move resources out of `stack` so that they aren't disposed
|
|
75
|
+
* // when constructor exits
|
|
76
|
+
* this.#disposables = stack.move();
|
|
77
|
+
* }
|
|
78
|
+
*
|
|
79
|
+
* [Symbol.dispose]() {
|
|
80
|
+
* this.#disposables.dispose();
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
move(): DisposableStack;
|
|
86
|
+
[Symbol.dispose](): void;
|
|
87
|
+
readonly [Symbol.toStringTag]: string;
|
|
88
|
+
}
|
|
89
|
+
interface DisposableStackConstructor {
|
|
90
|
+
new (): DisposableStack;
|
|
91
|
+
readonly prototype: DisposableStack;
|
|
92
|
+
}
|
|
93
|
+
var DisposableStack: DisposableStackConstructor;
|
|
94
|
+
interface AsyncDisposableStack {
|
|
95
|
+
/**
|
|
96
|
+
* Returns a value indicating whether this stack has been disposed.
|
|
97
|
+
*/
|
|
98
|
+
readonly disposed: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Disposes each resource in the stack in the reverse order that they were added.
|
|
101
|
+
*/
|
|
102
|
+
disposeAsync(): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Adds a disposable resource to the stack, returning the resource.
|
|
105
|
+
* @param value The resource to add. `null` and `undefined` will not be added, but will be returned.
|
|
106
|
+
* @returns The provided {@link value}.
|
|
107
|
+
*/
|
|
108
|
+
use<T extends AsyncDisposable | Disposable | null | undefined>(value: T): T;
|
|
109
|
+
/**
|
|
110
|
+
* Adds a value and associated disposal callback as a resource to the stack.
|
|
111
|
+
* @param value The value to add.
|
|
112
|
+
* @param onDisposeAsync The callback to use in place of a `[Symbol.asyncDispose]()` method. Will be invoked with `value`
|
|
113
|
+
* as the first parameter.
|
|
114
|
+
* @returns The provided {@link value}.
|
|
115
|
+
*/
|
|
116
|
+
adopt<T>(value: T, onDisposeAsync: (value: T) => PromiseLike<void> | void): T;
|
|
117
|
+
/**
|
|
118
|
+
* Adds a callback to be invoked when the stack is disposed.
|
|
119
|
+
*/
|
|
120
|
+
defer(onDisposeAsync: () => PromiseLike<void> | void): void;
|
|
121
|
+
/**
|
|
122
|
+
* Move all resources out of this stack and into a new `DisposableStack`, and marks this stack as disposed.
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* class C {
|
|
126
|
+
* #res1: Disposable;
|
|
127
|
+
* #res2: Disposable;
|
|
128
|
+
* #disposables: DisposableStack;
|
|
129
|
+
* constructor() {
|
|
130
|
+
* // stack will be disposed when exiting constructor for any reason
|
|
131
|
+
* using stack = new DisposableStack();
|
|
132
|
+
*
|
|
133
|
+
* // get first resource
|
|
134
|
+
* this.#res1 = stack.use(getResource1());
|
|
135
|
+
*
|
|
136
|
+
* // get second resource. If this fails, both `stack` and `#res1` will be disposed.
|
|
137
|
+
* this.#res2 = stack.use(getResource2());
|
|
138
|
+
*
|
|
139
|
+
* // all operations succeeded, move resources out of `stack` so that they aren't disposed
|
|
140
|
+
* // when constructor exits
|
|
141
|
+
* this.#disposables = stack.move();
|
|
142
|
+
* }
|
|
143
|
+
*
|
|
144
|
+
* [Symbol.dispose]() {
|
|
145
|
+
* this.#disposables.dispose();
|
|
146
|
+
* }
|
|
147
|
+
* }
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
move(): AsyncDisposableStack;
|
|
151
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
152
|
+
readonly [Symbol.toStringTag]: string;
|
|
153
|
+
}
|
|
154
|
+
interface AsyncDisposableStackConstructor {
|
|
155
|
+
new (): AsyncDisposableStack;
|
|
156
|
+
readonly prototype: AsyncDisposableStack;
|
|
157
|
+
}
|
|
158
|
+
var AsyncDisposableStack: AsyncDisposableStackConstructor;
|
|
159
|
+
}
|
package/polyfills.js
ADDED
|
@@ -45,7 +45,6 @@ var __param = function(paramIndex, decorator) {
|
|
|
45
45
|
decorator(target, key, paramIndex);
|
|
46
46
|
};
|
|
47
47
|
};
|
|
48
|
-
var MongoJobRepository_1;
|
|
49
48
|
const indexes = [
|
|
50
49
|
{ key: { queue: 1, jobId: 1 }, unique: true },
|
|
51
50
|
{ key: { queue: 1, priority: 1, enqueueTimestamp: 1, lastDequeueTimestamp: 1, tries: 1 } },
|
|
@@ -53,7 +52,7 @@ const indexes = [
|
|
|
53
52
|
{ key: { queue: 1, batch: 1 } },
|
|
54
53
|
{ key: { queue: 1, tries: 1 } }
|
|
55
54
|
];
|
|
56
|
-
let MongoJobRepository =
|
|
55
|
+
let MongoJobRepository = class MongoJobRepository2 extends import_mongo.MongoEntityRepository {
|
|
57
56
|
constructor(collection, logger) {
|
|
58
57
|
super(collection, import_mongo.noopTransformer, { indexes, logger });
|
|
59
58
|
}
|
|
@@ -72,9 +71,9 @@ let MongoJobRepository = MongoJobRepository_1 = class MongoJobRepository2 extend
|
|
|
72
71
|
await bulk.execute(false);
|
|
73
72
|
}
|
|
74
73
|
};
|
|
75
|
-
MongoJobRepository =
|
|
74
|
+
MongoJobRepository = __decorate([
|
|
76
75
|
(0, import_injector.Singleton)(),
|
|
77
76
|
__param(0, (0, import_injector.ForwardArg)()),
|
|
78
|
-
__param(1, (0, import_injector.ResolveArg)(
|
|
77
|
+
__param(1, (0, import_injector.ResolveArg)(MongoJobRepository.name)),
|
|
79
78
|
__metadata("design:paramtypes", [import_mongo.Collection, import_logger.Logger])
|
|
80
79
|
], MongoJobRepository);
|
|
@@ -43,14 +43,14 @@ function configureElasticsearch(config = {}) {
|
|
|
43
43
|
import_injector.Injector.registerSingleton(import_elasticsearch.Client, {
|
|
44
44
|
useFactory: (argument, context) => {
|
|
45
45
|
(0, import_type_guards.assertDefined)(argument, "missing elasticsearch client options");
|
|
46
|
-
context.
|
|
46
|
+
context.data.logger = (0, import_inject.inject)(import_logger.Logger, elasticsearchModuleConfig.logPrefix);
|
|
47
47
|
const client = new import_elasticsearch.Client(argument);
|
|
48
|
-
context.addDisposeHandler(async () => client.close().then(() => context.
|
|
48
|
+
context.addDisposeHandler(async () => client.close().then(() => context.data.logger.info("closed connection")));
|
|
49
49
|
return client;
|
|
50
50
|
},
|
|
51
|
-
async afterResolve(client, options,
|
|
51
|
+
async afterResolve(client, options, { cancellationToken, data: { logger } }) {
|
|
52
52
|
const url = getUrl(options.node ?? options.nodes);
|
|
53
|
-
await (0, import_core.connect)(`elasticsearch (${url})`, async () => client.ping().then((alive) => (0, import_type_guards.assert)(alive, "failed to connect")),
|
|
53
|
+
await (0, import_core.connect)(`elasticsearch (${url})`, async () => client.ping().then((alive) => (0, import_type_guards.assert)(alive, "failed to connect")), logger, cancellationToken);
|
|
54
54
|
},
|
|
55
55
|
defaultArgumentProvider() {
|
|
56
56
|
return elasticsearchModuleConfig.defaultOptions;
|
package/tsconfig.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Observable, Observer, Subscribable, Subscription } from 'rxjs';
|
|
1
|
+
import type { Observable, Observer, Subscribable, Subscription, Unsubscribable } from 'rxjs';
|
|
2
2
|
export type ConnectConfig = {
|
|
3
3
|
/**
|
|
4
4
|
* Propagate parent set to child.
|
|
@@ -31,59 +31,61 @@ export type ConnectConfig = {
|
|
|
31
31
|
*/
|
|
32
32
|
once?: boolean;
|
|
33
33
|
};
|
|
34
|
-
export
|
|
34
|
+
export declare abstract class ReadonlyCancellationToken implements PromiseLike<void>, Subscribable<void> {
|
|
35
35
|
/**
|
|
36
36
|
* Returns whether this token set.
|
|
37
37
|
*/
|
|
38
|
-
readonly isSet: boolean;
|
|
38
|
+
abstract readonly isSet: boolean;
|
|
39
39
|
/**
|
|
40
40
|
* Returns whether this token unset.
|
|
41
41
|
*/
|
|
42
|
-
readonly isUnset: boolean;
|
|
42
|
+
abstract readonly isUnset: boolean;
|
|
43
43
|
/**
|
|
44
44
|
* Observable which emits the current state and every state change.
|
|
45
45
|
*/
|
|
46
|
-
readonly state$: Observable<boolean>;
|
|
46
|
+
abstract readonly state$: Observable<boolean>;
|
|
47
47
|
/**
|
|
48
48
|
* Observable which emits when this token is set.
|
|
49
49
|
*/
|
|
50
|
-
readonly set$: Observable<void>;
|
|
50
|
+
abstract readonly set$: Observable<void>;
|
|
51
51
|
/**
|
|
52
52
|
* Observable which emits when this token is unset.
|
|
53
53
|
*/
|
|
54
|
-
readonly unset$: Observable<void>;
|
|
54
|
+
abstract readonly unset$: Observable<void>;
|
|
55
55
|
/**
|
|
56
56
|
* Returns a promise which is resolved when this token is set.
|
|
57
57
|
*/
|
|
58
|
-
readonly $set: Promise<void>;
|
|
58
|
+
abstract readonly $set: Promise<void>;
|
|
59
59
|
/**
|
|
60
60
|
* Returns a promise which is resolved when this token is unset.
|
|
61
61
|
*/
|
|
62
|
-
readonly $unset: Promise<void>;
|
|
62
|
+
abstract readonly $unset: Promise<void>;
|
|
63
63
|
/**
|
|
64
64
|
* Returns a promise which is resolved when this token changes its state.
|
|
65
65
|
*/
|
|
66
|
-
readonly $state: Promise<boolean>;
|
|
66
|
+
abstract readonly $state: Promise<boolean>;
|
|
67
67
|
/**
|
|
68
68
|
* Returns an AbortSignal.
|
|
69
69
|
*/
|
|
70
|
-
asAbortSignal(): AbortSignal;
|
|
70
|
+
abstract asAbortSignal(): AbortSignal;
|
|
71
71
|
/**
|
|
72
72
|
* Create a new token and connect it to this instance.
|
|
73
73
|
* @see {@link connect}
|
|
74
74
|
*/
|
|
75
|
-
createChild(config?: ConnectConfig): CancellationToken;
|
|
75
|
+
abstract createChild(config?: ConnectConfig): CancellationToken;
|
|
76
76
|
/**
|
|
77
77
|
* Propagate events from this instance to the `child`. Events from the `child` are *not* propagated to this instance.
|
|
78
78
|
* @param child child to connect
|
|
79
79
|
*/
|
|
80
|
-
connect(child: CancellationToken, config?: ConnectConfig): void;
|
|
80
|
+
abstract connect(child: CancellationToken, config?: ConnectConfig): void;
|
|
81
|
+
abstract subscribe(observer: Partial<Observer<void>>): Unsubscribable;
|
|
82
|
+
abstract then<TResult>(onfulfilled?: ((value: void) => TResult | PromiseLike<TResult>) | undefined | null): Promise<TResult>;
|
|
81
83
|
}
|
|
82
|
-
export declare class CancellationToken
|
|
83
|
-
private
|
|
84
|
+
export declare class CancellationToken extends ReadonlyCancellationToken {
|
|
85
|
+
#private;
|
|
84
86
|
readonly state$: Observable<boolean>;
|
|
85
|
-
readonly set$: Observable<
|
|
86
|
-
readonly unset$: Observable<
|
|
87
|
+
readonly set$: Observable<undefined>;
|
|
88
|
+
readonly unset$: Observable<undefined>;
|
|
87
89
|
get isSet(): boolean;
|
|
88
90
|
get isUnset(): boolean;
|
|
89
91
|
get $set(): Promise<void>;
|
|
@@ -18,23 +18,26 @@ var __copyProps = (to, from2, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var cancellation_token_exports = {};
|
|
20
20
|
__export(cancellation_token_exports, {
|
|
21
|
-
CancellationToken: () => CancellationToken
|
|
21
|
+
CancellationToken: () => CancellationToken,
|
|
22
|
+
ReadonlyCancellationToken: () => ReadonlyCancellationToken
|
|
22
23
|
});
|
|
23
24
|
module.exports = __toCommonJS(cancellation_token_exports);
|
|
24
|
-
var import_noop = require("../rxjs/noop.js");
|
|
25
25
|
var import_rxjs = require("rxjs");
|
|
26
|
+
var import_noop = require("../rxjs/noop.js");
|
|
26
27
|
var import_noop2 = require("./noop.js");
|
|
27
28
|
var import_type_guards = require("./type-guards.js");
|
|
28
|
-
class
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
class ReadonlyCancellationToken {
|
|
30
|
+
}
|
|
31
|
+
class CancellationToken extends ReadonlyCancellationToken {
|
|
32
|
+
#stateSubject = new import_rxjs.BehaviorSubject(false);
|
|
33
|
+
state$ = this.#stateSubject.pipe((0, import_rxjs.distinctUntilChanged)());
|
|
34
|
+
set$ = this.state$.pipe((0, import_rxjs.filter)((state) => state), (0, import_rxjs.map)(() => void 0));
|
|
35
|
+
unset$ = this.state$.pipe((0, import_rxjs.filter)((state) => !state), (0, import_rxjs.map)(() => void 0));
|
|
33
36
|
get isSet() {
|
|
34
|
-
return this
|
|
37
|
+
return this.#stateSubject.value;
|
|
35
38
|
}
|
|
36
39
|
get isUnset() {
|
|
37
|
-
return !this
|
|
40
|
+
return !this.#stateSubject.value;
|
|
38
41
|
}
|
|
39
42
|
get $set() {
|
|
40
43
|
return (0, import_rxjs.firstValueFrom)(this.set$);
|
|
@@ -52,10 +55,8 @@ class CancellationToken {
|
|
|
52
55
|
* @default false
|
|
53
56
|
*/
|
|
54
57
|
constructor(initialState = false) {
|
|
55
|
-
|
|
56
|
-
this
|
|
57
|
-
this.set$ = this.state$.pipe((0, import_rxjs.filter)((state) => state), (0, import_rxjs.map)(() => void 0));
|
|
58
|
-
this.unset$ = this.state$.pipe((0, import_rxjs.filter)((state) => !state), (0, import_rxjs.map)(() => void 0));
|
|
58
|
+
super();
|
|
59
|
+
this.#stateSubject.next(initialState);
|
|
59
60
|
}
|
|
60
61
|
static from(source, config) {
|
|
61
62
|
const source$ = source instanceof AbortSignal ? (0, import_rxjs.fromEvent)(source, "abort", () => true) : (0, import_rxjs.isObservable)(source) ? source.pipe((0, import_rxjs.map)((state) => (0, import_type_guards.isBoolean)(state) ? state : true)) : (0, import_rxjs.from)(source).pipe((0, import_rxjs.map)(() => true));
|
|
@@ -71,7 +72,7 @@ class CancellationToken {
|
|
|
71
72
|
error: error ? (errorValue) => target.error(errorValue) : import_noop2.noop,
|
|
72
73
|
complete: complete ? () => target.complete() : import_noop2.noop
|
|
73
74
|
});
|
|
74
|
-
target
|
|
75
|
+
target.#stateSubject.subscribe({
|
|
75
76
|
error: () => subscription.unsubscribe(),
|
|
76
77
|
complete: () => subscription.unsubscribe()
|
|
77
78
|
});
|
|
@@ -103,25 +104,25 @@ class CancellationToken {
|
|
|
103
104
|
* Set this token.
|
|
104
105
|
*/
|
|
105
106
|
set() {
|
|
106
|
-
this
|
|
107
|
+
this.#stateSubject.next(true);
|
|
107
108
|
}
|
|
108
109
|
/**
|
|
109
110
|
* Unset this token.
|
|
110
111
|
*/
|
|
111
112
|
unset() {
|
|
112
|
-
this
|
|
113
|
+
this.#stateSubject.next(false);
|
|
113
114
|
}
|
|
114
115
|
/**
|
|
115
116
|
* Set the state.
|
|
116
117
|
*/
|
|
117
118
|
setState(state) {
|
|
118
|
-
this
|
|
119
|
+
this.#stateSubject.next(state);
|
|
119
120
|
}
|
|
120
121
|
/**
|
|
121
122
|
* Errors the token.
|
|
122
123
|
*/
|
|
123
124
|
error(error) {
|
|
124
|
-
this
|
|
125
|
+
this.#stateSubject.error(error);
|
|
125
126
|
}
|
|
126
127
|
/**
|
|
127
128
|
* Clean up subscriptions.
|
|
@@ -129,7 +130,7 @@ class CancellationToken {
|
|
|
129
130
|
* Keep in mind that *active* awaits (promise) on this token will throw.
|
|
130
131
|
*/
|
|
131
132
|
complete() {
|
|
132
|
-
this
|
|
133
|
+
this.#stateSubject.complete();
|
|
133
134
|
}
|
|
134
135
|
async then(onfulfilled) {
|
|
135
136
|
await this.$set;
|
package/global-this.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function ensureGlobalThis(): void;
|
package/global-this.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var global_this_exports = {};
|
|
20
|
-
__export(global_this_exports, {
|
|
21
|
-
ensureGlobalThis: () => ensureGlobalThis
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(global_this_exports);
|
|
24
|
-
function ensureGlobalThis() {
|
|
25
|
-
if (typeof globalThis === "object") {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
Object.defineProperty(Object.prototype, "__magic__", {
|
|
29
|
-
get() {
|
|
30
|
-
return this;
|
|
31
|
-
},
|
|
32
|
-
configurable: true
|
|
33
|
-
// this makes it possible to `delete` the getter later.
|
|
34
|
-
});
|
|
35
|
-
__magic__.globalThis = __magic__;
|
|
36
|
-
delete Object.prototype["__magic__"];
|
|
37
|
-
}
|