@nmtjs/core 0.16.0 → 0.17.0-beta.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/LICENSE.md +1 -1
- package/README.md +41 -1
- package/dist/container.d.ts +3 -3
- package/dist/container.js +3 -5
- package/dist/container.js.map +1 -1
- package/dist/execution-environment.d.ts +15 -0
- package/dist/execution-environment.js +30 -0
- package/dist/execution-environment.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/injectables.d.ts +16 -7
- package/dist/injectables.js +16 -6
- package/dist/injectables.js.map +1 -1
- package/dist/logger.d.ts +2 -1
- package/dist/logger.js +15 -7
- package/dist/logger.js.map +1 -1
- package/dist/metadata.d.ts +4 -6
- package/dist/metadata.js +2 -3
- package/dist/metadata.js.map +1 -1
- package/package.json +6 -9
- package/src/container.ts +6 -9
- package/src/execution-environment.ts +50 -0
- package/src/index.ts +1 -1
- package/src/injectables.ts +65 -15
- package/src/logger.ts +24 -9
- package/src/metadata.ts +11 -32
- package/dist/utils/functions.d.ts +0 -7
- package/dist/utils/functions.js +0 -18
- package/dist/utils/functions.js.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.js +0 -4
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/pool.d.ts +0 -18
- package/dist/utils/pool.js +0 -106
- package/dist/utils/pool.js.map +0 -1
- package/dist/utils/semaphore.d.ts +0 -13
- package/dist/utils/semaphore.js +0 -56
- package/dist/utils/semaphore.js.map +0 -1
- package/src/utils/functions.ts +0 -31
- package/src/utils/index.ts +0 -3
- package/src/utils/pool.ts +0 -111
- package/src/utils/semaphore.ts +0 -63
package/src/container.ts
CHANGED
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
Dependencies,
|
|
9
9
|
DependencyContext,
|
|
10
10
|
Provision,
|
|
11
|
+
ProvisionValue,
|
|
11
12
|
ResolveInjectableType,
|
|
12
13
|
} from './injectables.ts'
|
|
13
14
|
import type { Logger } from './logger.ts'
|
|
@@ -121,7 +122,7 @@ export class Container {
|
|
|
121
122
|
this.disposing = false
|
|
122
123
|
}
|
|
123
124
|
|
|
124
|
-
|
|
125
|
+
owns(injectable: AnyInjectable) {
|
|
125
126
|
return (
|
|
126
127
|
this.provisions.has(injectable) ||
|
|
127
128
|
this.instances.has(injectable) ||
|
|
@@ -130,10 +131,7 @@ export class Container {
|
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
contains(injectable: AnyInjectable): boolean {
|
|
133
|
-
return (
|
|
134
|
-
this.containsWithinSelf(injectable) ||
|
|
135
|
-
(this.parent?.contains(injectable) ?? false)
|
|
136
|
-
)
|
|
134
|
+
return this.owns(injectable) || (this.parent?.contains(injectable) ?? false)
|
|
137
135
|
}
|
|
138
136
|
|
|
139
137
|
get<T extends AnyInjectable>(injectable: T): ResolveInjectableType<T> {
|
|
@@ -175,11 +173,11 @@ export class Container {
|
|
|
175
173
|
provide<T extends Provision[]>(provisions: T): void
|
|
176
174
|
provide<T extends AnyInjectable>(
|
|
177
175
|
injectable: T,
|
|
178
|
-
value:
|
|
176
|
+
value: ProvisionValue<T>,
|
|
179
177
|
): void
|
|
180
178
|
provide<T extends AnyInjectable | Provision[]>(
|
|
181
179
|
injectable: T,
|
|
182
|
-
...[value]: T extends AnyInjectable ? [value:
|
|
180
|
+
...[value]: T extends AnyInjectable ? [value: ProvisionValue<T>] : []
|
|
183
181
|
) {
|
|
184
182
|
const provisions = Array.isArray(injectable)
|
|
185
183
|
? injectable
|
|
@@ -341,7 +339,6 @@ export class Container {
|
|
|
341
339
|
).finally(() => {
|
|
342
340
|
this.resolvers.delete(injectable)
|
|
343
341
|
|
|
344
|
-
// biome-ignore lint: false
|
|
345
342
|
// @ts-ignore
|
|
346
343
|
if (measurements && measure) measurements.push(measure)
|
|
347
344
|
})
|
|
@@ -371,7 +368,7 @@ export class Container {
|
|
|
371
368
|
}
|
|
372
369
|
if (isFactoryInjectable(injectable)) {
|
|
373
370
|
wrapper.private = await Promise.resolve(
|
|
374
|
-
injectable.
|
|
371
|
+
injectable.create(wrapper.context),
|
|
375
372
|
)
|
|
376
373
|
wrapper.public = injectable.pick(wrapper.private)
|
|
377
374
|
} else {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Container } from './container.ts'
|
|
2
|
+
import type { AnyInjectable, Dependant } from './injectables.ts'
|
|
3
|
+
import type { Logger } from './logger.ts'
|
|
4
|
+
import { Container as CoreContainer } from './container.ts'
|
|
5
|
+
import { Scope } from './enums.ts'
|
|
6
|
+
import {
|
|
7
|
+
CoreInjectables,
|
|
8
|
+
getDepedencencyInjectable,
|
|
9
|
+
provision,
|
|
10
|
+
} from './injectables.ts'
|
|
11
|
+
import { forkLogger } from './logger.ts'
|
|
12
|
+
|
|
13
|
+
export type ExecutionEnvironmentOptions = {
|
|
14
|
+
logger: Logger
|
|
15
|
+
container?: Container
|
|
16
|
+
label?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class ExecutionEnvironment {
|
|
20
|
+
readonly logger: Logger
|
|
21
|
+
readonly container: Container
|
|
22
|
+
|
|
23
|
+
constructor(options: ExecutionEnvironmentOptions) {
|
|
24
|
+
this.logger = options.label
|
|
25
|
+
? forkLogger(options.logger, options.label)
|
|
26
|
+
: options.logger
|
|
27
|
+
|
|
28
|
+
this.container = options.container
|
|
29
|
+
? options.container.fork(Scope.Global)
|
|
30
|
+
: new CoreContainer({ logger: this.logger })
|
|
31
|
+
|
|
32
|
+
this.container.provide([provision(CoreInjectables.logger, this.logger)])
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async initialize(dependants: Iterable<Dependant> = []): Promise<void> {
|
|
36
|
+
const dependencies = new Set<AnyInjectable>()
|
|
37
|
+
|
|
38
|
+
for (const dependant of dependants) {
|
|
39
|
+
for (const dependency of Object.values(dependant.dependencies)) {
|
|
40
|
+
dependencies.add(getDepedencencyInjectable(dependency))
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
await this.container.initialize(dependencies)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async dispose(): Promise<void> {
|
|
48
|
+
await this.container.dispose()
|
|
49
|
+
}
|
|
50
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export * from './constants.ts'
|
|
2
2
|
export * from './container.ts'
|
|
3
3
|
export * from './enums.ts'
|
|
4
|
+
export * from './execution-environment.ts'
|
|
4
5
|
export * from './hooks.ts'
|
|
5
6
|
export * from './injectables.ts'
|
|
6
7
|
export * from './logger.ts'
|
|
7
8
|
export * from './metadata.ts'
|
|
8
9
|
export * from './plugin.ts'
|
|
9
10
|
export * from './types.ts'
|
|
10
|
-
export * from './utils/index.ts'
|
package/src/injectables.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
kValueInjectable,
|
|
12
12
|
} from './constants.ts'
|
|
13
13
|
import { Scope } from './enums.ts'
|
|
14
|
+
import { forkLogger } from './logger.ts'
|
|
14
15
|
|
|
15
16
|
const ScopeStrictness = {
|
|
16
17
|
[Scope.Transient]: Number.NaN, // this should make it always fail to compare with other scopes
|
|
@@ -57,6 +58,46 @@ export type DependencyContext<Deps extends Dependencies> = {
|
|
|
57
58
|
: never
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
export type HandlerFn<
|
|
62
|
+
Deps extends Dependencies,
|
|
63
|
+
Args extends readonly unknown[],
|
|
64
|
+
Return,
|
|
65
|
+
> = (context: DependencyContext<Deps>, ...args: Args) => MaybePromise<Return>
|
|
66
|
+
|
|
67
|
+
export interface Handler<
|
|
68
|
+
Deps extends Dependencies,
|
|
69
|
+
Args extends readonly unknown[],
|
|
70
|
+
Return,
|
|
71
|
+
> extends Dependant<Deps> {
|
|
72
|
+
handler: HandlerFn<Deps, Args, Return>
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export type HandlerInput<
|
|
76
|
+
Deps extends Dependencies,
|
|
77
|
+
Args extends readonly unknown[],
|
|
78
|
+
Return,
|
|
79
|
+
> =
|
|
80
|
+
| HandlerFn<{}, Args, Return>
|
|
81
|
+
| {
|
|
82
|
+
dependencies?: Deps
|
|
83
|
+
handler: HandlerFn<Deps, Args, Return>
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function createHandler<
|
|
87
|
+
Args extends readonly unknown[],
|
|
88
|
+
Return,
|
|
89
|
+
Deps extends Dependencies = {},
|
|
90
|
+
>(
|
|
91
|
+
paramsOrHandler: HandlerInput<Deps, Args, Return>,
|
|
92
|
+
): Handler<Deps, Args, Return> {
|
|
93
|
+
const { dependencies = {} as Deps, handler } =
|
|
94
|
+
typeof paramsOrHandler === 'function'
|
|
95
|
+
? { handler: paramsOrHandler }
|
|
96
|
+
: paramsOrHandler
|
|
97
|
+
|
|
98
|
+
return Object.freeze({ dependencies, handler }) as Handler<Deps, Args, Return>
|
|
99
|
+
}
|
|
100
|
+
|
|
60
101
|
export type InjectableFactoryType<
|
|
61
102
|
InjectableType,
|
|
62
103
|
InjectableDeps extends Dependencies,
|
|
@@ -72,11 +113,12 @@ export type InjectableDisposeType<
|
|
|
72
113
|
context: DependencyContext<InjectableDeps>,
|
|
73
114
|
) => any
|
|
74
115
|
|
|
75
|
-
export interface LazyInjectable<
|
|
76
|
-
|
|
116
|
+
export interface LazyInjectable<
|
|
117
|
+
T,
|
|
118
|
+
S extends Scope = Scope.Global,
|
|
119
|
+
> extends Dependant<{}> {
|
|
77
120
|
scope: S
|
|
78
121
|
$withType<O extends T>(): LazyInjectable<O, S>
|
|
79
|
-
optional(): DependencyOptional<LazyInjectable<T, S>>
|
|
80
122
|
[kInjectable]: any
|
|
81
123
|
[kLazyInjectable]: T
|
|
82
124
|
}
|
|
@@ -95,10 +137,9 @@ export interface FactoryInjectable<
|
|
|
95
137
|
P = T,
|
|
96
138
|
> extends Dependant<D> {
|
|
97
139
|
scope: S
|
|
98
|
-
|
|
140
|
+
create: InjectableFactoryType<P, D>
|
|
99
141
|
pick: InjectablePickType<P, T>
|
|
100
142
|
dispose?: InjectableDisposeType<P, D>
|
|
101
|
-
optional(): DependencyOptional<FactoryInjectable<T, D, S, P>>
|
|
102
143
|
[kInjectable]: any
|
|
103
144
|
[kFactoryInjectable]: any
|
|
104
145
|
}
|
|
@@ -162,7 +203,7 @@ export function getDepedencencyInjectable(
|
|
|
162
203
|
return dependency
|
|
163
204
|
}
|
|
164
205
|
|
|
165
|
-
export function createOptionalInjectable<T extends
|
|
206
|
+
export function createOptionalInjectable<T extends LazyInjectable<any, any>>(
|
|
166
207
|
injectable: T,
|
|
167
208
|
) {
|
|
168
209
|
return Object.freeze({
|
|
@@ -171,6 +212,15 @@ export function createOptionalInjectable<T extends AnyInjectable>(
|
|
|
171
212
|
}) as DependencyOptional<T>
|
|
172
213
|
}
|
|
173
214
|
|
|
215
|
+
export function optional<T, S extends Scope>(
|
|
216
|
+
injectable: LazyInjectable<T, S>,
|
|
217
|
+
): DependencyOptional<LazyInjectable<T, S>> {
|
|
218
|
+
if (!isLazyInjectable(injectable)) {
|
|
219
|
+
throw new TypeError('Optional dependencies can only wrap lazy injectables')
|
|
220
|
+
}
|
|
221
|
+
return createOptionalInjectable(injectable)
|
|
222
|
+
}
|
|
223
|
+
|
|
174
224
|
export function createLazyInjectable<T, S extends Scope = Scope.Global>(
|
|
175
225
|
scope = Scope.Global as S,
|
|
176
226
|
label?: string,
|
|
@@ -181,7 +231,6 @@ export function createLazyInjectable<T, S extends Scope = Scope.Global>(
|
|
|
181
231
|
dependencies: {},
|
|
182
232
|
label,
|
|
183
233
|
stack: tryCaptureStackTrace(stackTraceDepth),
|
|
184
|
-
optional: () => createOptionalInjectable(injectable),
|
|
185
234
|
$withType: () => injectable as any,
|
|
186
235
|
[kInjectable]: true,
|
|
187
236
|
[kLazyInjectable]: true as unknown as T,
|
|
@@ -216,7 +265,7 @@ export function createFactoryInjectable<
|
|
|
216
265
|
dependencies?: D
|
|
217
266
|
scope?: S
|
|
218
267
|
pick?: InjectablePickType<P, T>
|
|
219
|
-
|
|
268
|
+
create: InjectableFactoryType<P, D>
|
|
220
269
|
dispose?: InjectableDisposeType<P, D>
|
|
221
270
|
}
|
|
222
271
|
| InjectableFactoryType<P, D>,
|
|
@@ -224,16 +273,15 @@ export function createFactoryInjectable<
|
|
|
224
273
|
stackTraceDepth = 0,
|
|
225
274
|
): FactoryInjectable<null extends T ? P : T, D, S, P> {
|
|
226
275
|
const isFactory = typeof paramsOrFactory === 'function'
|
|
227
|
-
const params = isFactory ? {
|
|
276
|
+
const params = isFactory ? { create: paramsOrFactory } : paramsOrFactory
|
|
228
277
|
const injectable = {
|
|
229
278
|
dependencies: (params.dependencies ?? {}) as D,
|
|
230
279
|
scope: (params.scope ?? Scope.Global) as S,
|
|
231
|
-
|
|
280
|
+
create: params.create,
|
|
232
281
|
dispose: params.dispose,
|
|
233
282
|
pick: params.pick ?? ((instance: P) => instance as unknown as T),
|
|
234
283
|
label,
|
|
235
284
|
stack: tryCaptureStackTrace(stackTraceDepth),
|
|
236
|
-
optional: () => createOptionalInjectable(injectable),
|
|
237
285
|
[kInjectable]: true,
|
|
238
286
|
[kFactoryInjectable]: true,
|
|
239
287
|
}
|
|
@@ -308,11 +356,10 @@ export function compareScope(
|
|
|
308
356
|
|
|
309
357
|
const loggerInjectable = Object.assign(
|
|
310
358
|
(label: string | undefined, options?: ChildLoggerOptions) => {
|
|
311
|
-
const bindings = label ? { $label: label } : {}
|
|
312
359
|
return createFactoryInjectable({
|
|
313
360
|
dependencies: { logger: loggerInjectable },
|
|
314
361
|
scope: Scope.Global,
|
|
315
|
-
|
|
362
|
+
create: ({ logger }) => forkLogger(logger, label, options),
|
|
316
363
|
})
|
|
317
364
|
},
|
|
318
365
|
createLazyInjectable<Logger>(Scope.Global, 'Logger'),
|
|
@@ -348,13 +395,16 @@ export namespace CoreInjectables {
|
|
|
348
395
|
export const dispose = disposeFnInjectable
|
|
349
396
|
}
|
|
350
397
|
|
|
398
|
+
export type ProvisionValue<T extends AnyInjectable<any, any>> =
|
|
399
|
+
T extends AnyInjectable<infer R, Scope> ? R | AnyInjectable<R> : never
|
|
400
|
+
|
|
351
401
|
export type Provision<
|
|
352
402
|
T extends AnyInjectable<any, any> = AnyInjectable<any, any>,
|
|
353
|
-
> = { token: T; value: T
|
|
403
|
+
> = { token: T; value: ProvisionValue<T> }
|
|
354
404
|
|
|
355
405
|
export const provision = <
|
|
356
406
|
T extends AnyInjectable<any, any>,
|
|
357
|
-
V extends T
|
|
407
|
+
V extends ProvisionValue<T>,
|
|
358
408
|
>(
|
|
359
409
|
token: T,
|
|
360
410
|
value: V,
|
package/src/logger.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { AsyncLocalStorage } from 'node:async_hooks'
|
|
|
2
2
|
import { threadId } from 'node:worker_threads'
|
|
3
3
|
|
|
4
4
|
import type {
|
|
5
|
+
Bindings,
|
|
5
6
|
ChildLoggerOptions,
|
|
6
7
|
DestinationStream,
|
|
7
8
|
Level,
|
|
@@ -52,13 +53,12 @@ export const loggerLocalStorage = new AsyncLocalStorage<object | undefined>({
|
|
|
52
53
|
})
|
|
53
54
|
|
|
54
55
|
export const createLogger = (options: LoggingOptions = {}, $label: string) => {
|
|
55
|
-
let { destinations
|
|
56
|
+
let { destinations } = options
|
|
57
|
+
const { pinoOptions } = options
|
|
56
58
|
|
|
57
|
-
if (!destinations
|
|
59
|
+
if (!destinations?.length) {
|
|
58
60
|
destinations = [
|
|
59
|
-
createConsolePrettyDestination(
|
|
60
|
-
(options.pinoOptions?.level || 'info') as Level,
|
|
61
|
-
),
|
|
61
|
+
createConsolePrettyDestination((pinoOptions?.level || 'info') as Level),
|
|
62
62
|
]
|
|
63
63
|
}
|
|
64
64
|
|
|
@@ -101,9 +101,21 @@ export const createLogger = (options: LoggingOptions = {}, $label: string) => {
|
|
|
101
101
|
return object
|
|
102
102
|
},
|
|
103
103
|
},
|
|
104
|
+
base: { $label, $threadId: threadId },
|
|
104
105
|
},
|
|
105
106
|
multistream(destinations!),
|
|
106
|
-
)
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const forkLogger = (
|
|
111
|
+
logger: Logger,
|
|
112
|
+
label: string | undefined,
|
|
113
|
+
options?: ChildLoggerOptions,
|
|
114
|
+
bindings?: Bindings,
|
|
115
|
+
) => {
|
|
116
|
+
const _bindings = { ...bindings }
|
|
117
|
+
if (label !== undefined) _bindings.$label = label
|
|
118
|
+
return logger.child(_bindings, options)
|
|
107
119
|
}
|
|
108
120
|
|
|
109
121
|
export type CreateConsolePrettyDestination = (
|
|
@@ -121,9 +133,12 @@ export const createConsolePrettyDestination: CreateConsolePrettyDestination = (
|
|
|
121
133
|
ignore: 'hostname,$label,$threadId',
|
|
122
134
|
errorLikeObjectKeys: ['err', 'error', 'cause'],
|
|
123
135
|
messageFormat: (log, messageKey) => {
|
|
124
|
-
const group = fg(`[${log.$label}]`, 11)
|
|
125
|
-
const msg = fg(
|
|
126
|
-
|
|
136
|
+
const group = fg(`[${String(log.$label)}]`, 11)
|
|
137
|
+
const msg = fg(
|
|
138
|
+
String(log[messageKey]),
|
|
139
|
+
messageColors[log.level as number],
|
|
140
|
+
)
|
|
141
|
+
const thread = fg(`(T-${String(log.$threadId)})`, 89)
|
|
127
142
|
return `\x1b[0m${thread} ${group} ${msg}`
|
|
128
143
|
},
|
|
129
144
|
customPrettifiers: {
|
package/src/metadata.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import type { MaybePromise } from '@nmtjs/common'
|
|
2
|
-
|
|
3
1
|
import type {
|
|
4
2
|
Dependant,
|
|
5
3
|
Dependencies,
|
|
6
|
-
|
|
4
|
+
Handler,
|
|
5
|
+
HandlerFn,
|
|
7
6
|
LazyInjectable,
|
|
8
7
|
ResolveInjectableType,
|
|
9
8
|
} from './injectables.ts'
|
|
10
9
|
import { kMetaBinding, kMetadata } from './constants.ts'
|
|
11
10
|
import { Scope } from './enums.ts'
|
|
12
|
-
import {
|
|
13
|
-
createLazyInjectable,
|
|
14
|
-
createOptionalInjectable,
|
|
15
|
-
} from './injectables.ts'
|
|
11
|
+
import { createLazyInjectable } from './injectables.ts'
|
|
16
12
|
|
|
17
13
|
export enum MetadataKind {
|
|
18
14
|
STATIC = 'STATIC',
|
|
@@ -55,8 +51,7 @@ type MetaBindingToken<T extends AnyMeta = AnyMeta> = {
|
|
|
55
51
|
}
|
|
56
52
|
|
|
57
53
|
export interface StaticMetaBinding<T extends AnyMeta = AnyMeta>
|
|
58
|
-
extends Dependant<{}>,
|
|
59
|
-
MetaBindingToken<T> {
|
|
54
|
+
extends Dependant<{}>, MetaBindingToken<T> {
|
|
60
55
|
readonly kind: MetadataKind.STATIC
|
|
61
56
|
readonly value: ResolveInjectableType<T>
|
|
62
57
|
}
|
|
@@ -67,15 +62,12 @@ export interface MetaFactoryBinding<
|
|
|
67
62
|
Phase extends MetaPhase = MetaPhase,
|
|
68
63
|
Call = unknown,
|
|
69
64
|
Input = unknown,
|
|
70
|
-
>
|
|
65
|
+
>
|
|
66
|
+
extends
|
|
67
|
+
Handler<Deps, [call: Call, input: Input], ResolveInjectableType<T>>,
|
|
71
68
|
MetaBindingToken<T> {
|
|
72
69
|
readonly kind: MetadataKind.FACTORY
|
|
73
70
|
readonly phase: Phase
|
|
74
|
-
readonly resolve: (
|
|
75
|
-
context: DependencyContext<Deps>,
|
|
76
|
-
call: Call,
|
|
77
|
-
input: Input,
|
|
78
|
-
) => MaybePromise<ResolveInjectableType<T>>
|
|
79
71
|
}
|
|
80
72
|
|
|
81
73
|
export type BeforeDecodeMetaBinding<
|
|
@@ -107,20 +99,12 @@ export type MetaFactoryMethod<Value, Call = unknown> = {
|
|
|
107
99
|
<Deps extends Dependencies = {}>(params: {
|
|
108
100
|
dependencies?: Deps
|
|
109
101
|
phase?: 'beforeDecode'
|
|
110
|
-
|
|
111
|
-
context: DependencyContext<Deps>,
|
|
112
|
-
call: Call,
|
|
113
|
-
payload: unknown,
|
|
114
|
-
) => MaybePromise<Value>
|
|
102
|
+
handler: HandlerFn<Deps, [call: Call, payload: unknown], Value>
|
|
115
103
|
}): BeforeDecodeMetaBinding<MetaToken<Value>, Deps, Call>
|
|
116
104
|
<Deps extends Dependencies = {}, Input = unknown>(params: {
|
|
117
105
|
dependencies?: Deps
|
|
118
106
|
phase: 'afterDecode'
|
|
119
|
-
|
|
120
|
-
context: DependencyContext<Deps>,
|
|
121
|
-
call: Call,
|
|
122
|
-
input: Input,
|
|
123
|
-
) => MaybePromise<Value>
|
|
107
|
+
handler: HandlerFn<Deps, [call: Call, input: Input], Value>
|
|
124
108
|
}): AfterDecodeMetaBinding<MetaToken<Value>, Deps, Call, Input>
|
|
125
109
|
}
|
|
126
110
|
|
|
@@ -153,7 +137,6 @@ export function createMeta<
|
|
|
153
137
|
...injectable,
|
|
154
138
|
[kMetadata]: true as const,
|
|
155
139
|
$withType: () => meta as any,
|
|
156
|
-
optional: () => createOptionalInjectable(meta),
|
|
157
140
|
static: (value: Value) =>
|
|
158
141
|
Object.freeze({
|
|
159
142
|
dependencies: {},
|
|
@@ -164,17 +147,13 @@ export function createMeta<
|
|
|
164
147
|
factory: ((params: {
|
|
165
148
|
dependencies?: Dependencies
|
|
166
149
|
phase?: MetaPhase
|
|
167
|
-
|
|
168
|
-
context: DependencyContext<any>,
|
|
169
|
-
call: Call,
|
|
170
|
-
input: unknown,
|
|
171
|
-
) => unknown
|
|
150
|
+
handler: HandlerFn<any, [call: Call, input: unknown], unknown>
|
|
172
151
|
}) => {
|
|
173
152
|
return Object.freeze({
|
|
174
153
|
dependencies: params.dependencies ?? {},
|
|
154
|
+
handler: params.handler,
|
|
175
155
|
kind: MetadataKind.FACTORY,
|
|
176
156
|
phase: params.phase ?? 'beforeDecode',
|
|
177
|
-
resolve: params.resolve,
|
|
178
157
|
[kMetaBinding]: meta,
|
|
179
158
|
})
|
|
180
159
|
}) as MetaFactoryMethod<Value, Call>,
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { match } from '@nmtjs/common';
|
|
2
|
-
export declare function isJsFile(name: string): boolean;
|
|
3
|
-
export declare function pick<T extends object, K extends {
|
|
4
|
-
[KK in keyof T as T[KK] extends (...args: any[]) => any ? never : KK]?: true;
|
|
5
|
-
}>(obj: T, keys: K): Pick<T, keyof {
|
|
6
|
-
[KK in keyof K as K[KK] extends true ? KK : never]: K[KK];
|
|
7
|
-
}>;
|
package/dist/utils/functions.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export { match } from '@nmtjs/common';
|
|
2
|
-
export function isJsFile(name) {
|
|
3
|
-
if (name.endsWith('.d.ts'))
|
|
4
|
-
return false;
|
|
5
|
-
const leading = name.split('.').slice(1);
|
|
6
|
-
const ext = leading.join('.');
|
|
7
|
-
return ['js', 'mjs', 'cjs', 'ts', 'mts', 'cts'].includes(ext);
|
|
8
|
-
}
|
|
9
|
-
export function pick(obj, keys) {
|
|
10
|
-
const result = {};
|
|
11
|
-
for (const key in keys) {
|
|
12
|
-
if (key in obj) {
|
|
13
|
-
result[key] = obj[key];
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
return result;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=functions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/utils/functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAErC,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAA;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,IAAI,CAMlB,GAAM,EACN,IAAO;IAOP,MAAM,MAAM,GAAG,EAAS,CAAA;IACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAkC,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/dist/utils/index.d.ts
DELETED
package/dist/utils/index.js
DELETED
package/dist/utils/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA"}
|
package/dist/utils/pool.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
interface PoolOptions {
|
|
2
|
-
timeout?: number;
|
|
3
|
-
}
|
|
4
|
-
export declare class PoolError extends Error {
|
|
5
|
-
}
|
|
6
|
-
export declare class Pool<T = unknown> {
|
|
7
|
-
#private;
|
|
8
|
-
private readonly options;
|
|
9
|
-
constructor(options?: PoolOptions);
|
|
10
|
-
add(item: T): void;
|
|
11
|
-
remove(item: T): void;
|
|
12
|
-
capture(timeout?: number | undefined): Promise<T>;
|
|
13
|
-
next(exclusive?: boolean, timeout?: number | undefined): Promise<T>;
|
|
14
|
-
release(item: T): void;
|
|
15
|
-
isFree(item: T): boolean;
|
|
16
|
-
get items(): T[];
|
|
17
|
-
}
|
|
18
|
-
export {};
|
package/dist/utils/pool.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
export class PoolError extends Error {
|
|
2
|
-
}
|
|
3
|
-
// Fixed pool from https://github.com/metarhia/metautil
|
|
4
|
-
export class Pool {
|
|
5
|
-
options;
|
|
6
|
-
#items = [];
|
|
7
|
-
#free = [];
|
|
8
|
-
#queue = [];
|
|
9
|
-
#current = 0;
|
|
10
|
-
#size = 0;
|
|
11
|
-
#available = 0;
|
|
12
|
-
constructor(options = {}) {
|
|
13
|
-
this.options = options;
|
|
14
|
-
}
|
|
15
|
-
add(item) {
|
|
16
|
-
if (this.#items.includes(item))
|
|
17
|
-
throw new PoolError('Item already exists');
|
|
18
|
-
this.#size++;
|
|
19
|
-
this.#available++;
|
|
20
|
-
this.#items.push(item);
|
|
21
|
-
this.#free.push(true);
|
|
22
|
-
}
|
|
23
|
-
remove(item) {
|
|
24
|
-
if (this.#size === 0)
|
|
25
|
-
throw new PoolError('Pool is empty');
|
|
26
|
-
const index = this.#items.indexOf(item);
|
|
27
|
-
if (index < 0)
|
|
28
|
-
throw new PoolError('Item is not in the pool');
|
|
29
|
-
const isCaptured = this.isFree(item);
|
|
30
|
-
if (isCaptured)
|
|
31
|
-
this.#available--;
|
|
32
|
-
this.#size--;
|
|
33
|
-
this.#current--;
|
|
34
|
-
this.#items.splice(index, 1);
|
|
35
|
-
this.#free.splice(index, 1);
|
|
36
|
-
}
|
|
37
|
-
capture(timeout = this.options.timeout) {
|
|
38
|
-
return this.next(true, timeout);
|
|
39
|
-
}
|
|
40
|
-
async next(exclusive = false, timeout = this.options.timeout) {
|
|
41
|
-
if (this.#size === 0)
|
|
42
|
-
throw new PoolError('Pool is empty');
|
|
43
|
-
if (this.#available === 0) {
|
|
44
|
-
return new Promise((resolve, reject) => {
|
|
45
|
-
const waiting = {
|
|
46
|
-
resolve: (item) => {
|
|
47
|
-
if (exclusive)
|
|
48
|
-
this.#capture(item);
|
|
49
|
-
resolve(item);
|
|
50
|
-
},
|
|
51
|
-
timer: undefined,
|
|
52
|
-
};
|
|
53
|
-
if (timeout) {
|
|
54
|
-
waiting.timer = setTimeout(() => {
|
|
55
|
-
waiting.resolve = undefined;
|
|
56
|
-
this.#queue.shift();
|
|
57
|
-
reject(new PoolError('Next item timeout'));
|
|
58
|
-
}, timeout);
|
|
59
|
-
}
|
|
60
|
-
this.#queue.push(waiting);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
let item;
|
|
64
|
-
let free = false;
|
|
65
|
-
do {
|
|
66
|
-
item = this.#items[this.#current];
|
|
67
|
-
free = this.#free[this.#current];
|
|
68
|
-
this.#current++;
|
|
69
|
-
if (this.#current >= this.#size)
|
|
70
|
-
this.#current = 0;
|
|
71
|
-
} while (typeof item === 'undefined' || !free);
|
|
72
|
-
if (exclusive)
|
|
73
|
-
this.#capture(item);
|
|
74
|
-
return item;
|
|
75
|
-
}
|
|
76
|
-
release(item) {
|
|
77
|
-
const index = this.#items.indexOf(item);
|
|
78
|
-
if (index < 0)
|
|
79
|
-
throw new PoolError('Unexpected item');
|
|
80
|
-
if (this.#free[index])
|
|
81
|
-
throw new PoolError('Unable to release not captured item');
|
|
82
|
-
this.#free[index] = true;
|
|
83
|
-
this.#available++;
|
|
84
|
-
if (this.#queue.length > 0) {
|
|
85
|
-
const { resolve, timer } = this.#queue.shift();
|
|
86
|
-
clearTimeout(timer);
|
|
87
|
-
if (resolve)
|
|
88
|
-
setTimeout(resolve, 0, item);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
isFree(item) {
|
|
92
|
-
const index = this.#items.indexOf(item);
|
|
93
|
-
if (index < 0)
|
|
94
|
-
return false;
|
|
95
|
-
return this.#free[index];
|
|
96
|
-
}
|
|
97
|
-
get items() {
|
|
98
|
-
return [...this.#items];
|
|
99
|
-
}
|
|
100
|
-
#capture(item) {
|
|
101
|
-
const index = this.#items.indexOf(item);
|
|
102
|
-
this.#free[index] = false;
|
|
103
|
-
this.#available--;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=pool.js.map
|
package/dist/utils/pool.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/utils/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export declare class SemaphoreError extends Error {
|
|
2
|
-
}
|
|
3
|
-
export declare class Semaphore {
|
|
4
|
-
private readonly size;
|
|
5
|
-
private readonly timeout;
|
|
6
|
-
private counter;
|
|
7
|
-
private readonly queue;
|
|
8
|
-
constructor(concurrency: number, size?: number, timeout?: number);
|
|
9
|
-
enter(): Promise<void>;
|
|
10
|
-
leave(): void;
|
|
11
|
-
get isEmpty(): boolean;
|
|
12
|
-
get queueLength(): number;
|
|
13
|
-
}
|