better-effect 0.12.0 → 0.14.0
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/README.md +599 -30
- package/dist/adapters/iti.d.mts +2 -3
- package/dist/adapters/iti.d.mts.map +1 -1
- package/dist/adapters/iti.mjs +2 -2
- package/dist/bun.d.mts +95 -0
- package/dist/bun.d.mts.map +1 -0
- package/dist/bun.mjs +177 -0
- package/dist/bun.mjs.map +1 -0
- package/dist/{context-BUEf1qjL.mjs → context-DSGSqcJj.mjs} +14 -3
- package/dist/context-DSGSqcJj.mjs.map +1 -0
- package/dist/current-request-Bc1YHL0w.mjs +21 -0
- package/dist/current-request-Bc1YHL0w.mjs.map +1 -0
- package/dist/current-request-Dm-QQ3Xr.d.mts +22 -0
- package/dist/current-request-Dm-QQ3Xr.d.mts.map +1 -0
- package/dist/{effect-CK4YZaX0.mjs → effect-W0IQXY8P.mjs} +21 -2
- package/dist/effect-W0IQXY8P.mjs.map +1 -0
- package/dist/{errors-BKcsQ0ip.d.mts → errors-CpHMzPiP.d.mts} +6 -2
- package/dist/errors-CpHMzPiP.d.mts.map +1 -0
- package/dist/hono.d.mts +65 -27
- package/dist/hono.d.mts.map +1 -1
- package/dist/hono.mjs +177 -53
- package/dist/hono.mjs.map +1 -1
- package/dist/{index-CX6iAoCB.d.mts → index-3Bkl-sxS.d.mts} +7 -2
- package/dist/{index-CX6iAoCB.d.mts.map → index-3Bkl-sxS.d.mts.map} +1 -1
- package/dist/{index-B1nH4luq.d.mts → index-C2ed9Ilq.d.mts} +32 -21
- package/dist/index-C2ed9Ilq.d.mts.map +1 -0
- package/dist/{index-GYJ4qm9K.d.mts → index-ClNndn2-.d.mts} +93 -62
- package/dist/index-ClNndn2-.d.mts.map +1 -0
- package/dist/{index-BMdU_Z72.d.mts → index-Cy1VsU-u.d.mts} +2 -3
- package/dist/index-Cy1VsU-u.d.mts.map +1 -0
- package/dist/index.d.mts +6 -7
- package/dist/index.mjs +8 -8
- package/dist/{internal-identity-CbXoZIfw.mjs → internal-identity-BuHBtP0k.mjs} +2 -2
- package/dist/{internal-identity-CbXoZIfw.mjs.map → internal-identity-BuHBtP0k.mjs.map} +1 -1
- package/dist/layer-2kjHVv4N.mjs +343 -0
- package/dist/layer-2kjHVv4N.mjs.map +1 -0
- package/dist/{outcome-CB43bnFW.d.mts → layer-C2OaqTmB.d.mts} +683 -138
- package/dist/layer-C2OaqTmB.d.mts.map +1 -0
- package/dist/next.d.mts +192 -0
- package/dist/next.d.mts.map +1 -0
- package/dist/next.mjs +185 -0
- package/dist/next.mjs.map +1 -0
- package/dist/{node-context-DWsCUBRa.d.mts → node-context-1YEjrU9g.d.mts} +2 -2
- package/dist/{node-context-DWsCUBRa.d.mts.map → node-context-1YEjrU9g.d.mts.map} +1 -1
- package/dist/{node-context-lggRF4bR.mjs → node-context-g3bCcY9t.mjs} +2 -2
- package/dist/{node-context-lggRF4bR.mjs.map → node-context-g3bCcY9t.mjs.map} +1 -1
- package/dist/node.d.mts +11 -6
- package/dist/node.d.mts.map +1 -1
- package/dist/node.mjs +156 -10
- package/dist/node.mjs.map +1 -1
- package/dist/opentelemetry.d.mts +112 -0
- package/dist/opentelemetry.d.mts.map +1 -0
- package/dist/opentelemetry.mjs +871 -0
- package/dist/opentelemetry.mjs.map +1 -0
- package/dist/{registration-drnZk0SY.mjs → registration-Bwe2GbVu.mjs} +8 -2
- package/dist/registration-Bwe2GbVu.mjs.map +1 -0
- package/dist/runtime/explicit.d.mts +2 -2
- package/dist/runtime/explicit.mjs +1 -1
- package/dist/runtime/node.d.mts +3 -3
- package/dist/runtime/node.mjs +2 -2
- package/dist/runtime-qpcVwaz_.mjs +1680 -0
- package/dist/runtime-qpcVwaz_.mjs.map +1 -0
- package/dist/service-CO9VJQYa.mjs +74 -0
- package/dist/service-CO9VJQYa.mjs.map +1 -0
- package/dist/signal-5Rg9bUUe.mjs +52 -0
- package/dist/signal-5Rg9bUUe.mjs.map +1 -0
- package/dist/{standard-services-GBZ32tll.mjs → standard-services-B-iMM_W7.mjs} +39 -19
- package/dist/standard-services-B-iMM_W7.mjs.map +1 -0
- package/dist/standard-services.d.mts +4 -3
- package/dist/standard-services.mjs +3 -2
- package/dist/testing.d.mts +25 -6
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.mjs +51 -7
- package/dist/testing.mjs.map +1 -1
- package/dist/types-BFTqCCcw.d.mts +81 -0
- package/dist/types-BFTqCCcw.d.mts.map +1 -0
- package/dist/web-effect-B9hp9jIe.mjs +380 -0
- package/dist/web-effect-B9hp9jIe.mjs.map +1 -0
- package/dist/web.d.mts +56 -0
- package/dist/web.d.mts.map +1 -0
- package/dist/web.mjs +2 -0
- package/package.json +36 -11
- package/dist/context-BUEf1qjL.mjs.map +0 -1
- package/dist/effect-CK4YZaX0.mjs.map +0 -1
- package/dist/errors-BKcsQ0ip.d.mts.map +0 -1
- package/dist/index-B1nH4luq.d.mts.map +0 -1
- package/dist/index-BMdU_Z72.d.mts.map +0 -1
- package/dist/index-GYJ4qm9K.d.mts.map +0 -1
- package/dist/index-heuaRmXR.d.mts +0 -374
- package/dist/index-heuaRmXR.d.mts.map +0 -1
- package/dist/layer-D56fRdLt.mjs +0 -269
- package/dist/layer-D56fRdLt.mjs.map +0 -1
- package/dist/outcome-CB43bnFW.d.mts.map +0 -1
- package/dist/program-metadata-DhQCCirO.mjs +0 -260
- package/dist/program-metadata-DhQCCirO.mjs.map +0 -1
- package/dist/registration-drnZk0SY.mjs.map +0 -1
- package/dist/runtime-CBMrX8Wl.mjs +0 -776
- package/dist/runtime-CBMrX8Wl.mjs.map +0 -1
- package/dist/signal-D2UTcaaG.mjs +0 -105
- package/dist/signal-D2UTcaaG.mjs.map +0 -1
- package/dist/standard-services-GBZ32tll.mjs.map +0 -1
|
@@ -1,12 +1,313 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//#region src/
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
|
|
1
|
+
import { Err, InferErr, InferOk, Result } from "better-result";
|
|
2
|
+
//#region src/service/types.d.ts
|
|
3
|
+
/** Internal type-only identity for the branded Service instance. */
|
|
4
|
+
declare const ServiceIdentityTypeId: unique symbol;
|
|
5
|
+
/** A branded Service instance identity carried by the literal Service tag. */
|
|
6
|
+
interface ServiceIdentity<out Tag extends string = string> {
|
|
7
|
+
readonly [ServiceIdentityTypeId]: Tag;
|
|
8
|
+
}
|
|
9
|
+
/** The widened Service instance constraint used by contextual APIs. */
|
|
10
|
+
type AnyService = ServiceIdentity<string>;
|
|
11
|
+
/** Remove the internal Service identity marker from an implementation contract. */
|
|
12
|
+
type ServiceContract<S> = S extends unknown ? Omit<S, typeof ServiceIdentityTypeId> : never;
|
|
13
|
+
type ServiceStatics<out Tag extends string, in out Instance extends AnyService> = {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly serviceTag: Tag;
|
|
16
|
+
/** Yield this Service from a synchronous generator factory. */
|
|
17
|
+
readonly [Symbol.iterator]: () => Generator<ServiceRequirement<Instance>, Instance, unknown>;
|
|
18
|
+
/** Type-check a structural implementation and return it unchanged. */
|
|
19
|
+
readonly of: (this: void, implementation: ServiceContract<Instance>) => Instance;
|
|
20
|
+
};
|
|
21
|
+
type AbstractServiceConstructor<out Instance> = abstract new (...args: any[]) => Instance;
|
|
22
|
+
/** A class constructor carrying a Service tag and its instance contract. */
|
|
23
|
+
interface ServiceToken<out Tag extends string = string, in out Instance extends AnyService = any> extends AbstractServiceConstructor<Instance>, ServiceStatics<Tag, Instance> {}
|
|
24
|
+
/** The widened token constraint used by generic Service infrastructure. */
|
|
25
|
+
type AnyServiceToken = ServiceToken<string, any>;
|
|
26
|
+
/** A concrete, constructible Service class accepted by a Layer provider. */
|
|
27
|
+
type ServiceClass<Tag extends string = string, Instance extends AnyService = AnyService> = (new (...args: any[]) => Instance) & ServiceStatics<Tag, Instance>;
|
|
28
|
+
/** Extract the instance type represented by a Service token. */
|
|
29
|
+
type ServiceInstance<T extends AnyServiceToken> = InstanceType<T>;
|
|
30
|
+
/** Extract the literal identity tag represented by a branded Service instance. */
|
|
31
|
+
type ServiceTagOf<S extends AnyService> = S[typeof ServiceIdentityTypeId];
|
|
32
|
+
/** Extract the Service token represented by a branded Service instance. */
|
|
33
|
+
type ServiceTokenOf<S extends AnyService> = S extends AnyService ? ServiceToken<ServiceTagOf<S>, S> : never;
|
|
34
|
+
/** Extract the literal identity tag represented by a Service instance or token. */
|
|
35
|
+
type ServiceTag<T extends AnyService | AnyServiceToken> = T extends AnyService ? ServiceTagOf<T> : T extends AnyServiceToken ? T['serviceTag'] : never;
|
|
36
|
+
type MethodRequirements<T> = { [K in keyof T]: T[K] extends ((...args: any[]) => infer Return) ? EffectRequirements<Return> : never; }[keyof T];
|
|
37
|
+
/**
|
|
38
|
+
* Services required by the Effect-returning methods of a Service class.
|
|
39
|
+
*
|
|
40
|
+
* This type is used automatically by `Layer.make`, `Layer.gen`, and the other
|
|
41
|
+
* provider constructors.
|
|
42
|
+
*/
|
|
43
|
+
type ServiceRequirements<S extends AnyService> = MethodRequirements<S>;
|
|
7
44
|
//#endregion
|
|
8
|
-
//#region src/
|
|
9
|
-
type
|
|
45
|
+
//#region src/effect/types.d.ts
|
|
46
|
+
type ResultValue = Result<any, any>;
|
|
47
|
+
/** Keep nested Effect errors and Service requirements in one inferred yield. */
|
|
48
|
+
type EffectIterator<A, E, R extends AnyService> = {
|
|
49
|
+
[Symbol.iterator](): Generator<Err<never, E> & ServiceRequirement<R>, A, unknown>;
|
|
50
|
+
};
|
|
51
|
+
type EffectMethods<A, E, R extends AnyService> = {
|
|
52
|
+
map<B>(fn: (value: A) => B): Effect<B, E, R>;
|
|
53
|
+
mapError<E2>(fn: (error: E) => E2): Effect<A, E2, R>;
|
|
54
|
+
tryRecover<Next extends ResultValue>(fn: (error: E) => Next): Effect<A | EffectSuccess<Next>, EffectError<Next>, R | EffectRequirements<Next>>;
|
|
55
|
+
tryRecoverAsync<Next extends ResultValue>(fn: (error: E) => Promise<Next>): Promise<Effect<A | EffectSuccess<Next>, EffectError<Next>, R | EffectRequirements<Next>>>;
|
|
56
|
+
andThen<Next extends ResultValue>(fn: (value: A) => Next): Effect<EffectSuccess<Next>, E | EffectError<Next>, R | EffectRequirements<Next>>;
|
|
57
|
+
andThenAsync<Next extends ResultValue>(fn: (value: A) => Promise<Next>): Promise<Effect<EffectSuccess<Next>, E | EffectError<Next>, R | EffectRequirements<Next>>>;
|
|
58
|
+
tap(fn: (value: A) => void): Effect<A, E, R>;
|
|
59
|
+
tapAsync(fn: (value: A) => PromiseLike<void>): Promise<Effect<A, E, R>>;
|
|
60
|
+
tapError(fn: (error: E) => void): Effect<A, E, R>;
|
|
61
|
+
tapErrorAsync(fn: (error: E) => PromiseLike<void>): Promise<Effect<A, E, R>>;
|
|
62
|
+
tapBoth(handlers: {
|
|
63
|
+
ok: (value: A) => void;
|
|
64
|
+
err: (error: E) => void;
|
|
65
|
+
}): Effect<A, E, R>;
|
|
66
|
+
tapBothAsync(handlers: {
|
|
67
|
+
ok: (value: A) => PromiseLike<void>;
|
|
68
|
+
err: (error: E) => PromiseLike<void>;
|
|
69
|
+
}): Promise<Effect<A, E, R>>;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Type-only identity for a Service requirement yielded by a generator.
|
|
73
|
+
*
|
|
74
|
+
* The declaration has no runtime value. Service iterators return their
|
|
75
|
+
* resolved instances without yielding a marker at runtime.
|
|
76
|
+
*/
|
|
77
|
+
declare const ServiceRequirementTypeId: unique symbol;
|
|
78
|
+
/** Type-only identity for requirement metadata attached to Effect results. */
|
|
79
|
+
declare const EffectRequirementsTypeId: unique symbol;
|
|
80
|
+
/** Type-only identity for lazy Effect programs. */
|
|
81
|
+
declare const ProgramTypeId: unique symbol;
|
|
82
|
+
/** Required declaration-only variance carrier for Effect Service requirements. */
|
|
83
|
+
interface EffectVariance<out R extends AnyService> {
|
|
84
|
+
readonly requirements: R;
|
|
85
|
+
}
|
|
86
|
+
/** Required declaration-only variance carrier for a lazy Program. */
|
|
87
|
+
interface ProgramVariance<out A, out E, out R extends AnyService> {
|
|
88
|
+
readonly success: A;
|
|
89
|
+
readonly error: E;
|
|
90
|
+
readonly requirements: R;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Metadata carried by the yield type of a Service token.
|
|
94
|
+
*
|
|
95
|
+
* This interface is intentionally phantom: it is used only while TypeScript
|
|
96
|
+
* infers a generator's yielded values.
|
|
97
|
+
*/
|
|
98
|
+
interface ServiceRequirement<out T> {
|
|
99
|
+
readonly [ServiceRequirementTypeId]: T;
|
|
100
|
+
}
|
|
101
|
+
/** A `better-result` Result with required declaration-only metadata for Services. */
|
|
102
|
+
type Effect<A, E, R extends AnyService = never> = EffectMethods<A, E, R> & Result<A, E> & EffectIterator<A, E, R> & {
|
|
103
|
+
readonly [EffectRequirementsTypeId]: EffectVariance<R>;
|
|
104
|
+
};
|
|
105
|
+
/** A nominal lazy computation that produces an Effect when invoked. */
|
|
106
|
+
type Program<A, E, R extends AnyService = never> = {
|
|
107
|
+
(): Effect<A, E, R> | Promise<Effect<A, E, R>>;
|
|
108
|
+
readonly [ProgramTypeId]: ProgramVariance<A, E, R>;
|
|
109
|
+
};
|
|
110
|
+
/** An Effect with erased success, error, and Service requirements. */
|
|
111
|
+
type AnyEffect = Effect<unknown, unknown, AnyService>;
|
|
112
|
+
/** Values that an Effect generator may yield. */
|
|
113
|
+
type EffectYield = Err<never, unknown> | ServiceRequirement<unknown>;
|
|
114
|
+
/** Extract the error channel from Result values yielded by a generator. */
|
|
115
|
+
type InferYieldError<Y> = Y extends Err<never, infer E> ? E : never;
|
|
116
|
+
/** Extract branded Service instances carried by yielded Service requirements. */
|
|
117
|
+
type InferYieldRequirements<Y> = Y extends ServiceRequirement<infer Requirement> ? Requirement extends AnyService ? Requirement : never : never;
|
|
118
|
+
type InferEffectRequirements<T> = T extends unknown ? typeof EffectRequirementsTypeId extends keyof T ? T extends {
|
|
119
|
+
readonly [EffectRequirementsTypeId]: EffectVariance<infer Requirements extends AnyService>;
|
|
120
|
+
} ? Requirements : never : never : never;
|
|
121
|
+
type InferProgramSuccess<T> = T extends {
|
|
122
|
+
readonly [ProgramTypeId]: ProgramVariance<infer Success, any, any>;
|
|
123
|
+
} ? Success : never;
|
|
124
|
+
type InferProgramError<T> = T extends {
|
|
125
|
+
readonly [ProgramTypeId]: ProgramVariance<any, infer Error, any>;
|
|
126
|
+
} ? Error : never;
|
|
127
|
+
type InferProgramRequirements<T> = T extends {
|
|
128
|
+
readonly [ProgramTypeId]: ProgramVariance<any, any, infer Requirements>;
|
|
129
|
+
} ? Requirements : never;
|
|
130
|
+
/** Extract declaration-only Service requirements from an Effect or Promise. */
|
|
131
|
+
type EffectRequirements<T> = T extends unknown ? InferProgramRequirements<T> extends never ? InferEffectRequirements<Awaited<T>> : InferProgramRequirements<T> : never;
|
|
132
|
+
/** Extract the success value from an Effect or Promise. */
|
|
133
|
+
type EffectSuccess<T> = T extends unknown ? InferProgramSuccess<T> extends never ? Awaited<T> extends Result<infer A, unknown> ? A : never : InferProgramSuccess<T> : never;
|
|
134
|
+
/** Extract the error value from an Effect or Promise. */
|
|
135
|
+
type EffectError<T> = T extends unknown ? InferProgramError<T> extends never ? Awaited<T> extends Result<unknown, infer E> ? E : never : InferProgramError<T> : never;
|
|
136
|
+
/** Build the public Effect type produced from a generator. */
|
|
137
|
+
type EffectFromGenerator<Yield, Returned extends Result<any, any>> = Effect<InferOk<Returned>, InferYieldError<Yield> | InferErr<Returned>, InferYieldRequirements<Yield> | EffectRequirements<Returned>>;
|
|
138
|
+
/** Build the nominal lazy Program produced from a generator. */
|
|
139
|
+
type ProgramFromGenerator<Yield, Returned extends Result<any, any>> = Program<InferOk<Returned>, InferYieldError<Yield> | InferErr<Returned>, InferYieldRequirements<Yield> | EffectRequirements<Returned>>;
|
|
140
|
+
//#endregion
|
|
141
|
+
//#region src/service/service.d.ts
|
|
142
|
+
type ServiceTagLiteral<Tag extends string> = string extends Tag ? never : Tag extends '' ? never : Tag;
|
|
143
|
+
interface ServiceFactory<Self> {
|
|
144
|
+
<const Tag extends string>(tag: ServiceTagLiteral<Tag>): (abstract new () => ServiceIdentity<Tag>) & {
|
|
145
|
+
readonly name: string;
|
|
146
|
+
readonly serviceTag: Tag;
|
|
147
|
+
} & {
|
|
148
|
+
readonly of: Service.FactoryOf<Self, Tag>;
|
|
149
|
+
readonly [Symbol.iterator]: (this: ServiceToken<Tag, Self & ServiceIdentity<Tag>>) => Generator<ServiceRequirement<Self>, Self, unknown>;
|
|
150
|
+
readonly [Symbol.asyncIterator]: (this: ServiceToken<Tag, Self & ServiceIdentity<Tag>>) => AsyncGenerator<ServiceRequirement<Self>, Self, unknown>;
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Declare a class-backed Service with a stable string-literal identity.
|
|
155
|
+
*
|
|
156
|
+
* The returned class is simultaneously the implementation type, the runtime
|
|
157
|
+
* dependency token, and the value yielded by `yield*` in an Effect generator.
|
|
158
|
+
* The explicit self type preserves exact instance inference, while the second
|
|
159
|
+
* call captures the tag as a literal for Layer composition and diagnostics.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```ts
|
|
163
|
+
* class Database extends Service<Database>()('Database') {
|
|
164
|
+
* query(): string {
|
|
165
|
+
* return 'ok'
|
|
166
|
+
* }
|
|
167
|
+
* }
|
|
168
|
+
*
|
|
169
|
+
* const database = yield* Database
|
|
170
|
+
* database.query()
|
|
171
|
+
* ```
|
|
172
|
+
*
|
|
173
|
+
* @typeParam Self The instance type implemented by the declared Service.
|
|
174
|
+
*/
|
|
175
|
+
declare function Service<Self>(): ServiceFactory<Self>;
|
|
176
|
+
/** Type-level aliases for Service tokens and their instance contracts. */
|
|
177
|
+
declare namespace Service {
|
|
178
|
+
/** The widened Service instance constraint. */
|
|
179
|
+
type Any = AnyService;
|
|
180
|
+
/** A class-backed Service token with a stable tag and instance contract. */
|
|
181
|
+
type Token<Tag extends string = string, Instance extends AnyService = any> = ServiceToken<Tag, Instance>;
|
|
182
|
+
/** A constructible Service class with a stable tag and instance contract. */
|
|
183
|
+
type Class<Tag extends string = string, Instance extends AnyService = AnyService> = ServiceClass<Tag, Instance>;
|
|
184
|
+
/** Extract the instance represented by a Service token. */
|
|
185
|
+
type Instance<T extends AnyServiceToken> = ServiceInstance<T>;
|
|
186
|
+
/** Extract the stable tag represented by a Service instance. */
|
|
187
|
+
type Tag<S extends AnyService> = ServiceTag<S>;
|
|
188
|
+
/** A branded Service instance identity with a stable tag. */
|
|
189
|
+
type Identity<Tag extends string = string> = ServiceIdentity<Tag>;
|
|
190
|
+
/** Remove the internal identity marker from a Service implementation contract. */
|
|
191
|
+
type Contract<S extends AnyService> = ServiceContract<S>;
|
|
192
|
+
/** Extract the Service token represented by a branded Service instance. */
|
|
193
|
+
type TokenOf<S extends AnyService> = ServiceTokenOf<S>;
|
|
194
|
+
/** Declaration bridge for the recursive structural `Service.of` signature. */
|
|
195
|
+
type FactoryOf<Self, Tag extends string> = (this: void, implementation: ServiceContract<Self & ServiceIdentity<Tag>>) => Self;
|
|
196
|
+
/** Extract Effect Service requirements from a Service instance. */
|
|
197
|
+
type Requirements<S extends AnyService> = ServiceRequirements<S>;
|
|
198
|
+
}
|
|
199
|
+
//#endregion
|
|
200
|
+
//#region src/scope/errors.d.ts
|
|
201
|
+
/** Thrown when Scope context is accessed outside an active Scope execution. */
|
|
202
|
+
declare class ScopeRuntimeNotConfiguredError extends Error {
|
|
203
|
+
constructor();
|
|
204
|
+
}
|
|
205
|
+
/** Thrown when a resource or finalizer is added after Scope closure begins. */
|
|
206
|
+
declare class ScopeClosedError extends Error {
|
|
207
|
+
constructor();
|
|
208
|
+
}
|
|
209
|
+
/** Aggregates finalizer failures encountered while closing a Scope. */
|
|
210
|
+
declare class ScopeCloseError extends Error {
|
|
211
|
+
readonly causes: readonly unknown[];
|
|
212
|
+
constructor(causes: readonly unknown[]);
|
|
213
|
+
}
|
|
214
|
+
/** Thrown when a value has neither Symbol.dispose nor Symbol.asyncDispose. */
|
|
215
|
+
declare class ResourceNotDisposableError extends Error {
|
|
216
|
+
constructor();
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/scope/types.d.ts
|
|
220
|
+
/** A value that may be returned synchronously or asynchronously. */
|
|
221
|
+
type MaybePromise$1<T> = T | PromiseLike<T>;
|
|
222
|
+
/** Final outcome supplied to Scope finalizers and resource releases. */
|
|
223
|
+
type ScopeOutcome = {
|
|
224
|
+
/** Indicates that the owning program completed successfully. */
|
|
225
|
+
readonly status: 'success';
|
|
226
|
+
} | {
|
|
227
|
+
/** Indicates that the owning program failed or was interrupted. */
|
|
228
|
+
readonly status: 'failure';
|
|
229
|
+
/** The original program or execution failure. */
|
|
230
|
+
readonly cause: unknown;
|
|
231
|
+
};
|
|
232
|
+
/** Cleanup callback registered with a Scope. */
|
|
233
|
+
type ScopeFinalizer = (outcome: ScopeOutcome) => MaybePromise$1<void>;
|
|
234
|
+
/** Aggregated cleanup information reported at an execution boundary. */
|
|
235
|
+
type CleanupFailureDiagnostic = {
|
|
236
|
+
/** Outcome used for the Scope close that triggered cleanup. */
|
|
237
|
+
readonly outcome: ScopeOutcome;
|
|
238
|
+
/** Aggregated finalizer failure. */
|
|
239
|
+
readonly error: ScopeCloseError;
|
|
240
|
+
};
|
|
241
|
+
type SyncDisposableResource = {
|
|
242
|
+
[Symbol.dispose]: () => void;
|
|
243
|
+
[Symbol.asyncDispose]?: () => MaybePromise$1<void>;
|
|
244
|
+
};
|
|
245
|
+
type AsyncDisposableResource = {
|
|
246
|
+
[Symbol.dispose]?: () => void;
|
|
247
|
+
[Symbol.asyncDispose]: () => MaybePromise$1<void>;
|
|
248
|
+
};
|
|
249
|
+
/** A value implementing at least one JavaScript disposal protocol. */
|
|
250
|
+
type DisposableResource = SyncDisposableResource | AsyncDisposableResource;
|
|
251
|
+
//#endregion
|
|
252
|
+
//#region src/scope/scope.d.ts
|
|
253
|
+
/**
|
|
254
|
+
* Non-owning lifecycle context for finalizers and child Scopes.
|
|
255
|
+
*
|
|
256
|
+
* A Scope can register cleanup and create children, but it cannot close
|
|
257
|
+
* itself. Use `Scope.make()` or `Scope.run()` when your code owns the Scope.
|
|
258
|
+
*/
|
|
259
|
+
interface Scope {
|
|
260
|
+
/** Register a finalizer that runs when the owning Scope closes. */
|
|
261
|
+
addFinalizer(finalizer: ScopeFinalizer): void;
|
|
262
|
+
/** Acquire a resource and register its outcome-aware release callback. */
|
|
263
|
+
acquire<R>(acquire: () => MaybePromise$1<R>, release: (resource: R, outcome: ScopeOutcome) => MaybePromise$1<void>): Promise<R>;
|
|
264
|
+
/** Register an already-acquired disposable resource. */
|
|
265
|
+
add<R extends DisposableResource>(resource: R): Promise<R>;
|
|
266
|
+
/** Create a child Scope owned by this Scope. */
|
|
267
|
+
fork(): CloseableScope;
|
|
268
|
+
}
|
|
269
|
+
/** A Scope whose owner is responsible for calling `close()`. */
|
|
270
|
+
interface CloseableScope extends Scope {
|
|
271
|
+
/** Close the Scope and run children and finalizers in child-first LIFO order. */
|
|
272
|
+
close(outcome?: ScopeOutcome): Promise<void>;
|
|
273
|
+
}
|
|
274
|
+
declare const Scope: {
|
|
275
|
+
/** Create an owned, initially open Scope. */
|
|
276
|
+
readonly make: () => CloseableScope;
|
|
277
|
+
/** Return the non-owning Scope available in the current execution context. */
|
|
278
|
+
readonly current: () => Scope;
|
|
279
|
+
/** Run a callback with an existing Scope supplied as the current context. */
|
|
280
|
+
readonly provide: <A>(scope: Scope, program: () => A) => A;
|
|
281
|
+
/** Resolve the current Scope through `yield* Scope` inside an Effect. */
|
|
282
|
+
readonly [Symbol.iterator]: () => Generator<never, Scope, unknown>;
|
|
283
|
+
/**
|
|
284
|
+
* Run a program in a newly owned Scope.
|
|
285
|
+
*
|
|
286
|
+
* Scope is independent from `better-result`, so returned values—including
|
|
287
|
+
* `Result.err`—close this Scope with a successful outcome. Result-aware
|
|
288
|
+
* outcome classification belongs to `Runtime.run`.
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```ts
|
|
292
|
+
* await Scope.run(async (scope) => {
|
|
293
|
+
* const connection = await scope.acquire(connect, (connection) => connection.close())
|
|
294
|
+
* return connection.query()
|
|
295
|
+
* })
|
|
296
|
+
* ```
|
|
297
|
+
*/
|
|
298
|
+
readonly run: <A>(program: (scope: Scope) => A | PromiseLike<A>) => Promise<Awaited<A>>;
|
|
299
|
+
};
|
|
300
|
+
/** Type-level aliases for Scope ownership, outcomes, and cleanup contracts. */
|
|
301
|
+
declare namespace Scope {
|
|
302
|
+
/** A Scope whose owner is responsible for calling `close()`. */
|
|
303
|
+
type Closeable = CloseableScope;
|
|
304
|
+
/** The outcome supplied to Scope finalizers and resource releases. */
|
|
305
|
+
type Outcome = ScopeOutcome;
|
|
306
|
+
/** A cleanup callback registered with a Scope. */
|
|
307
|
+
type Finalizer = ScopeFinalizer;
|
|
308
|
+
/** A value implementing a JavaScript disposal protocol. */
|
|
309
|
+
type Disposable = DisposableResource;
|
|
310
|
+
}
|
|
10
311
|
//#endregion
|
|
11
312
|
//#region src/internal/missing-dependencies.d.ts
|
|
12
313
|
type MissingDependencies<Missing extends AnyService> = {
|
|
@@ -182,11 +483,54 @@ type CompleteExecutionWithRequirements<Provided extends AnyService, A, Required
|
|
|
182
483
|
/** Keep execution callbacks unchanged when their Effect requirements are met. */
|
|
183
484
|
type CompleteExecution<Provided extends AnyService, A> = CompleteExecutionWithRequirements<Provided, A, EffectRequirements<A>>;
|
|
184
485
|
//#endregion
|
|
486
|
+
//#region src/layer/errors.d.ts
|
|
487
|
+
type LayerCause = Extract<ScopeOutcome, {
|
|
488
|
+
readonly status: 'failure';
|
|
489
|
+
}>['cause'];
|
|
490
|
+
/** Thrown when a Layer registers the same Service tag more than once. */
|
|
491
|
+
declare class DuplicateServiceError extends Error {
|
|
492
|
+
readonly service: AnyServiceToken;
|
|
493
|
+
constructor(service: AnyServiceToken);
|
|
494
|
+
}
|
|
495
|
+
/** Thrown when one Service tag is associated with incompatible constructors. */
|
|
496
|
+
declare class ServiceTagCollisionError extends Error {
|
|
497
|
+
readonly existing: AnyServiceToken;
|
|
498
|
+
readonly incoming: AnyServiceToken;
|
|
499
|
+
constructor(existing: AnyServiceToken, incoming: AnyServiceToken);
|
|
500
|
+
}
|
|
501
|
+
/** Thrown when a backend fails while registering a Layer provider. */
|
|
502
|
+
declare class LayerRegistrationError extends Error {
|
|
503
|
+
readonly service: AnyServiceToken | undefined;
|
|
504
|
+
readonly registrationCause: LayerCause;
|
|
505
|
+
readonly cleanupCause?: LayerCause;
|
|
506
|
+
constructor(service: AnyServiceToken | undefined, registrationCause: LayerCause, cleanupCause?: LayerCause);
|
|
507
|
+
}
|
|
508
|
+
/** Thrown when one or more Layer-owned resources fail during disposal. */
|
|
509
|
+
declare class LayerDisposeError extends Error {
|
|
510
|
+
readonly causes: readonly unknown[];
|
|
511
|
+
constructor(causes: readonly unknown[]);
|
|
512
|
+
}
|
|
513
|
+
/** Thrown when a Layer generator yields a value other than a Service requirement. */
|
|
514
|
+
declare class LayerGeneratorYieldError extends Error {
|
|
515
|
+
readonly service: AnyServiceToken;
|
|
516
|
+
constructor(service: AnyServiceToken);
|
|
517
|
+
}
|
|
518
|
+
//#endregion
|
|
519
|
+
//#region src/utils/types.d.ts
|
|
520
|
+
type MaybePromise<T> = T | PromiseLike<T>;
|
|
521
|
+
//#endregion
|
|
185
522
|
//#region src/layer/types.d.ts
|
|
523
|
+
/** Callback that stops a resource from admitting new work. */
|
|
524
|
+
type LayerQuiesce<Instance = unknown> = (instance: Instance, reason: RuntimeShutdownReason) => MaybePromise<void>;
|
|
525
|
+
/** Lifecycle callbacks for a resource owned by a Runtime root Scope. */
|
|
526
|
+
type LayerLifecycle<Instance> = {
|
|
527
|
+
readonly quiesce?: LayerQuiesce<Instance>;
|
|
528
|
+
readonly release: (instance: Instance, outcome: ScopeOutcome) => MaybePromise<void>;
|
|
529
|
+
};
|
|
186
530
|
/** Runtime-facing provider registration supplied by a Layer backend. */
|
|
187
531
|
interface LayerRegistration {
|
|
188
532
|
/** The class-backed Service token provided by this registration. */
|
|
189
|
-
readonly service:
|
|
533
|
+
readonly service: ServiceToken<any, any>;
|
|
190
534
|
/**
|
|
191
535
|
* The canonical tag captured when the provider was created.
|
|
192
536
|
*
|
|
@@ -197,104 +541,17 @@ interface LayerRegistration {
|
|
|
197
541
|
readonly serviceTag?: string;
|
|
198
542
|
/** Lazily acquire the Service instance; concrete types are erased at this backend boundary. */
|
|
199
543
|
readonly acquire: () => MaybePromise<unknown>;
|
|
544
|
+
/** Optional Runtime-root quiesce hook retained by Layer-created registrations. */
|
|
545
|
+
readonly quiesce?: LayerQuiesce;
|
|
200
546
|
}
|
|
201
547
|
/** Generator shape used by `Layer.gen` and `Layer.scopedGen`. */
|
|
202
|
-
type LayerGenerator<S extends
|
|
548
|
+
type LayerGenerator<S extends ServiceToken<any, any>, Yield extends ServiceRequirement<unknown> = ServiceRequirement<unknown>> = () => Generator<Yield, ServiceContract<InstanceType<S>>, unknown> | AsyncGenerator<Yield, ServiceContract<InstanceType<S>>, unknown>;
|
|
203
549
|
/** Service requirements inferred from a provider's methods and generator. */
|
|
204
|
-
type LayerGeneratorRequirements<S extends
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
readonly _Provided: Invariant<Provided>;
|
|
210
|
-
readonly _Required: Covariant<Required>;
|
|
211
|
-
}
|
|
212
|
-
type CapturedLayerAcquisition = {
|
|
213
|
-
readonly instance: unknown;
|
|
214
|
-
readonly release: ScopeFinalizer;
|
|
215
|
-
};
|
|
216
|
-
interface LayerProvider extends LayerRegistration {
|
|
217
|
-
/** The tag captured before this provider can cross an asynchronous boundary. */
|
|
218
|
-
readonly serviceTag: string;
|
|
219
|
-
/** Provider storage deliberately erases the concrete instance type. */
|
|
220
|
-
readonly release?: (instance: unknown, outcome: ScopeOutcome) => MaybePromise<void>;
|
|
221
|
-
/** Capture acquisition-local cleanup without retaining the acquired instance. */
|
|
222
|
-
readonly acquireWithRelease?: () => MaybePromise<CapturedLayerAcquisition>;
|
|
223
|
-
}
|
|
224
|
-
/** A Service class whose constructor can be called without arguments. */
|
|
225
|
-
type DefaultConstructibleServiceClass<Tag extends string = string, Instance extends AnyService = AnyService> = ServiceClass<Tag, Instance> & (new () => Instance);
|
|
226
|
-
type IsUnion<Type, Candidate = Type> = Type extends unknown ? [Candidate] extends [Type] ? false : true : never;
|
|
227
|
-
type InvalidUnionAliasToken = {
|
|
228
|
-
readonly __betterEffectUnionLayerAliasToken: unique symbol;
|
|
229
|
-
};
|
|
230
|
-
type RejectUnionAliasToken<Token> = IsUnion<Token> extends true ? InvalidUnionAliasToken : unknown;
|
|
231
|
-
type LayerAliasOptions<From extends ServiceClass<any, any>, To extends ServiceClass<any, any>> = {
|
|
232
|
-
readonly from: From;
|
|
233
|
-
readonly to: To;
|
|
234
|
-
} & RejectUnionAliasToken<From> & RejectUnionAliasToken<To> & ([ServiceContract<InstanceType<From>>] extends [ServiceContract<InstanceType<To>>] ? unknown : {
|
|
235
|
-
readonly __betterEffectIncompatibleLayerAlias: unique symbol;
|
|
236
|
-
});
|
|
237
|
-
/**
|
|
238
|
-
* Declarative collection of Service providers.
|
|
239
|
-
*
|
|
240
|
-
* A Layer describes how to acquire implementations; it does not execute
|
|
241
|
-
* providers until a `Runtime` is created. Use `merge` to compose distinct
|
|
242
|
-
* providers and `override` when replacing an existing provider intentionally.
|
|
243
|
-
*
|
|
244
|
-
* @example
|
|
245
|
-
* ```ts
|
|
246
|
-
* const AppLive = Layer.merge(
|
|
247
|
-
* Layer.succeed(Database, database),
|
|
248
|
-
* Layer.make(UserRepository)
|
|
249
|
-
* )
|
|
250
|
-
*
|
|
251
|
-
* const runtime = await Runtime.make(AppLive, backend)
|
|
252
|
-
* ```
|
|
253
|
-
*/
|
|
254
|
-
declare class Layer<in out Provided extends AnyService = AnyService, out Required extends AnyService = AnyService> {
|
|
255
|
-
readonly [LayerTypeId]: LayerVariance<Provided, Required>;
|
|
256
|
-
/** The provider registrations retained by this Layer. */
|
|
257
|
-
readonly providers: readonly LayerProvider[];
|
|
258
|
-
private constructor();
|
|
259
|
-
/** A stable provider-free Layer for composition roots with no Services. */
|
|
260
|
-
static readonly empty: Layer<never, never>;
|
|
261
|
-
/** Create a Layer that lazily acquires a Service instance. */
|
|
262
|
-
static make<S extends DefaultConstructibleServiceClass<any, any>>(service: S): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
263
|
-
static make<S extends ServiceClass<any, any>>(service: S, acquire: () => MaybePromise<ServiceContract<InstanceType<S>>>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
264
|
-
/** Create a Layer from an already-constructed Service instance. */
|
|
265
|
-
static succeed<S extends ServiceClass<any, any>>(service: S, instance: ServiceContract<InstanceType<S>>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
266
|
-
/** Alias a source Service under a compatible target contract. */
|
|
267
|
-
static alias<From extends ServiceClass<any, any>, To extends ServiceClass<any, any>>(options: LayerAliasOptions<From, To>): LayerResult<ProviderEntry<InstanceType<To>, InstanceType<From> | ServiceRequirements<InstanceType<To>>>>;
|
|
268
|
-
/** Define a provider with Runtime-root cleanup. */
|
|
269
|
-
static scoped<S extends ServiceClass<any, any>>(service: S, acquire: () => MaybePromise<ServiceContract<InstanceType<S>>>, release: (instance: InstanceType<S>, outcome: ScopeOutcome) => MaybePromise<void>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
270
|
-
/** Define a provider with Runtime-root cleanup through its disposal protocol. */
|
|
271
|
-
static scopedDisposable<S extends ServiceClass<any, any>>(service: S, acquire: () => MaybePromise<ServiceContract<InstanceType<S>> & DisposableResource>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
272
|
-
/** Define a provider whose acquisition can yield contextual Services. */
|
|
273
|
-
static scopedGen<S extends ServiceClass<any, any>, Yield extends ServiceRequirement<unknown>>(service: S, factory: LayerGenerator<S, Yield>, release: (instance: InstanceType<S>, outcome: ScopeOutcome) => MaybePromise<void>): LayerResult<ProviderEntry<InstanceType<S>, LayerGeneratorRequirements<S, Yield>>>;
|
|
274
|
-
/** Define a provider whose acquisition can yield contextual Services. */
|
|
275
|
-
static gen<S extends ServiceClass<any, any>, Yield extends ServiceRequirement<unknown>>(service: S, factory: LayerGenerator<S, Yield>): LayerResult<ProviderEntry<InstanceType<S>, LayerGeneratorRequirements<S, Yield>>>;
|
|
276
|
-
/** Compose Layers without replacing providers. */
|
|
277
|
-
static merge<const Layers extends readonly LayerInput[]>(...layers: Layers & ValidateLayerTuple<Layers>): MergeResult<Layers>;
|
|
278
|
-
/** Mark a Layer composition root as complete without changing its runtime value. */
|
|
279
|
-
static complete<L extends LayerInput>(layer: L & CompleteInput<L>): L;
|
|
280
|
-
/** Replace providers in a base Layer, using tag identity and compatible contracts. */
|
|
281
|
-
static override<Base extends LayerInput>(base: Base & ValidateLayerInput<Base>): OverrideLayerResult<Base, readonly []>;
|
|
282
|
-
static override<Base extends LayerInput, const Overrides extends readonly [LayerInput, ...LayerInput[]]>(base: Base & ValidateLayerInput<Base>, ...overrides: Overrides & ValidateOverrides<Base, Overrides>): OverrideLayerResult<Base, Overrides>;
|
|
283
|
-
static override<Base extends LayerInput, const Overrides extends readonly LayerInput[]>(base: Base & ValidateLayerInput<Base>, ...overrides: Overrides & ValidateOverrides<Base, Overrides>): OverrideLayerResult<Base, Overrides>;
|
|
284
|
-
}
|
|
285
|
-
/** Type-level aliases for inspecting Layer environments and completeness. */
|
|
286
|
-
declare namespace Layer {
|
|
287
|
-
/** The widened Layer shape accepted by generic Layer infrastructure. */
|
|
288
|
-
type Any = LayerInput;
|
|
289
|
-
/** Extract the branded Service instances provided by a Layer. */
|
|
290
|
-
type Provided<L extends LayerInput> = ProvidedEnvironment<L>;
|
|
291
|
-
/** Extract the external Service requirements of a Layer. */
|
|
292
|
-
type Required<L extends LayerInput> = RequiredEnvironment<L>;
|
|
293
|
-
/** Extract the Services still missing from a Layer composition. */
|
|
294
|
-
type Missing<L extends LayerInput> = RequiredEnvironment<L>;
|
|
295
|
-
/** Validate a Layer's requirements and input shape. */
|
|
296
|
-
type Complete<L extends LayerInput> = CompleteInput<L>;
|
|
297
|
-
}
|
|
550
|
+
type LayerGeneratorRequirements<S extends ServiceToken<any, any>, Yield extends ServiceRequirement<unknown>> = ServiceRequirements<InstanceType<S>> | InferYieldRequirements<Yield>;
|
|
551
|
+
/** Generator shape used by lifecycle-only Layer entries. */
|
|
552
|
+
type LayerDiscardGenerator<Yield extends ServiceRequirement<unknown>, Acquired> = () => Generator<Yield, Acquired, unknown> | AsyncGenerator<Yield, Acquired, unknown>;
|
|
553
|
+
/** Service requirements inferred from a lifecycle-only generator. */
|
|
554
|
+
type LayerDiscardRequirements<Yield extends ServiceRequirement<unknown>> = InferYieldRequirements<Yield>;
|
|
298
555
|
//#endregion
|
|
299
556
|
//#region src/layer/backend.d.ts
|
|
300
557
|
/** Observation hook invoked for acquisitions that disposal will await. */
|
|
@@ -313,51 +570,64 @@ interface LayerBackend extends ServiceResolver {
|
|
|
313
570
|
disposeAll(options?: LayerBackendDisposeOptions): MaybePromise<void>;
|
|
314
571
|
}
|
|
315
572
|
//#endregion
|
|
316
|
-
//#region src/
|
|
317
|
-
type
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
|
|
322
|
-
readonly
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
readonly
|
|
328
|
-
readonly
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
readonly
|
|
335
|
-
readonly
|
|
336
|
-
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
|
|
340
|
-
readonly
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
}
|
|
573
|
+
//#region src/effect/task.d.ts
|
|
574
|
+
type AnyProgram$1 = Program<any, any, AnyService>;
|
|
575
|
+
/** The live state of a Scope-owned task. */
|
|
576
|
+
type ScopedTaskState = 'running' | 'succeeded' | 'failed' | 'defected' | 'interrupted';
|
|
577
|
+
/** The terminal observation of a Scope-owned task. */
|
|
578
|
+
type ScopedTaskExit<A, E> = {
|
|
579
|
+
readonly status: 'succeeded';
|
|
580
|
+
readonly value: A;
|
|
581
|
+
readonly cleanupFailure?: ScopeCloseError;
|
|
582
|
+
} | {
|
|
583
|
+
readonly status: 'failed';
|
|
584
|
+
readonly error: E;
|
|
585
|
+
readonly cleanupFailure?: ScopeCloseError;
|
|
586
|
+
} | {
|
|
587
|
+
readonly status: 'defected';
|
|
588
|
+
readonly cause: unknown;
|
|
589
|
+
readonly cleanupFailure?: ScopeCloseError;
|
|
590
|
+
} | {
|
|
591
|
+
readonly status: 'interrupted';
|
|
592
|
+
readonly reason: unknown;
|
|
593
|
+
readonly cleanupFailure?: ScopeCloseError;
|
|
594
|
+
};
|
|
595
|
+
/** A small, immutable handle for a task owned by the current Scope. */
|
|
596
|
+
type ScopedTask<out A, out E> = {
|
|
597
|
+
readonly state: ScopedTaskState;
|
|
598
|
+
await(): Promise<Result<A, E>>;
|
|
599
|
+
awaitExit(): Promise<ScopedTaskExit<A, E>>;
|
|
600
|
+
interrupt(reason?: unknown): Promise<void>;
|
|
601
|
+
};
|
|
602
|
+
/** Start a nominal Program as a child task supervised by the current Scope. */
|
|
603
|
+
declare function forkScoped<Input extends AnyProgram$1>(program: Input): Effect<ScopedTask<EffectSuccess<Input>, EffectError<Input>>, never, EffectRequirements<Input>>;
|
|
348
604
|
//#endregion
|
|
349
605
|
//#region src/runtime/observer.d.ts
|
|
606
|
+
/** Observable Runtime shutdown phase. */
|
|
607
|
+
type RuntimeShutdownPhase = 'shutdown-requested' | 'quiesce-start' | 'quiesce-end' | 'drain-start' | 'drain-end' | 'abort-active' | 'release-start' | 'release-end' | 'shutdown-complete' | 'shutdown-failure';
|
|
608
|
+
/** Detached metadata for one Runtime shutdown phase. */
|
|
609
|
+
type RuntimeShutdownEvent = {
|
|
610
|
+
readonly phase: RuntimeShutdownPhase;
|
|
611
|
+
readonly reason: RuntimeShutdownReason;
|
|
612
|
+
readonly activeExecutions?: number;
|
|
613
|
+
readonly durationMs?: number;
|
|
614
|
+
readonly error?: unknown;
|
|
615
|
+
};
|
|
350
616
|
/** Event emitted after a Service resolution attempt settles. */
|
|
351
617
|
type RuntimeServiceResolveEvent = {
|
|
352
618
|
readonly service: AnyServiceToken;
|
|
353
619
|
readonly resolutionPath: readonly AnyServiceToken[];
|
|
354
620
|
readonly outcome: ScopeOutcome;
|
|
621
|
+
/** Runtime execution owner, omitted for warmup and other root activity. */
|
|
622
|
+
readonly executionId?: string;
|
|
355
623
|
};
|
|
356
624
|
/** Event emitted after a provider acquisition attempt settles. */
|
|
357
625
|
type RuntimeServiceAcquireEvent = {
|
|
358
626
|
readonly service: AnyServiceToken;
|
|
359
627
|
readonly resolutionPath: readonly AnyServiceToken[];
|
|
360
628
|
readonly outcome: ScopeOutcome;
|
|
629
|
+
/** Runtime execution owner, omitted for warmup and other root activity. */
|
|
630
|
+
readonly executionId?: string;
|
|
361
631
|
};
|
|
362
632
|
/** Values supplied to one Runtime execution for diagnostic correlation. */
|
|
363
633
|
type RuntimeExecutionAttributes = Readonly<Record<string, unknown>>;
|
|
@@ -376,15 +646,57 @@ type RuntimeExecutionStartEvent = RuntimeExecutionMetadata & {
|
|
|
376
646
|
/** Event emitted after a program and its execution Scope settle. */
|
|
377
647
|
type RuntimeExecutionEndEvent = RuntimeExecutionMetadata & {
|
|
378
648
|
readonly scope: Scope;
|
|
649
|
+
/** The program outcome used to run execution-scope cleanup. */
|
|
379
650
|
readonly outcome: ScopeOutcome;
|
|
651
|
+
/** Execution-scope cleanup failure, without changing the primary program outcome. */
|
|
652
|
+
readonly cleanupFailure?: ScopeCloseError;
|
|
380
653
|
/** Monotonic elapsed time for the Program and its execution cleanup. */
|
|
381
654
|
readonly durationMs: number;
|
|
382
655
|
};
|
|
656
|
+
/** Metadata shared by the start and end events for one Scope-owned task. */
|
|
657
|
+
type RuntimeTaskMetadata = {
|
|
658
|
+
readonly taskId: string;
|
|
659
|
+
/** The execution that created the task, omitted for root lifecycle tasks. */
|
|
660
|
+
readonly parentExecutionId?: string;
|
|
661
|
+
readonly name?: string;
|
|
662
|
+
readonly startedAt: number;
|
|
663
|
+
};
|
|
664
|
+
/** Event emitted immediately before a Scope-owned task starts. */
|
|
665
|
+
type RuntimeTaskStartEvent = RuntimeTaskMetadata & {
|
|
666
|
+
readonly state: 'running';
|
|
667
|
+
};
|
|
668
|
+
/** Event emitted after a Scope-owned task settles and its child Scope closes. */
|
|
669
|
+
type RuntimeTaskEndEvent = RuntimeTaskMetadata & {
|
|
670
|
+
readonly state: Exclude<ScopedTaskState, 'running'>;
|
|
671
|
+
/** Child Scope cleanup failure, without changing the task's primary state. */
|
|
672
|
+
readonly cleanupFailure?: ScopeCloseError;
|
|
673
|
+
};
|
|
383
674
|
/** Event emitted after a Layer provider release callback settles. */
|
|
384
675
|
type RuntimeResourceReleaseEvent = {
|
|
385
676
|
readonly service: AnyServiceToken;
|
|
386
677
|
readonly outcome: ScopeOutcome;
|
|
387
678
|
readonly error?: unknown;
|
|
679
|
+
/** Runtime execution owner, omitted for Runtime-root cleanup. */
|
|
680
|
+
readonly executionId?: string;
|
|
681
|
+
};
|
|
682
|
+
/** Metadata shared by lifecycle-only Layer events. */
|
|
683
|
+
type RuntimeLifecycleEventMetadata = {
|
|
684
|
+
readonly kind: 'lifecycle';
|
|
685
|
+
/** Stable identity for one lifecycle entry; no acquired resource is retained. */
|
|
686
|
+
readonly lifecycleId: symbol;
|
|
687
|
+
readonly name?: string;
|
|
688
|
+
};
|
|
689
|
+
/** Event emitted immediately before a lifecycle-only entry is acquired. */
|
|
690
|
+
type RuntimeLifecycleStartEvent = RuntimeLifecycleEventMetadata;
|
|
691
|
+
/** Event emitted after a lifecycle-only entry's acquisition settles. */
|
|
692
|
+
type RuntimeLifecycleEndEvent = RuntimeLifecycleEventMetadata & {
|
|
693
|
+
readonly outcome: ScopeOutcome;
|
|
694
|
+
readonly error?: unknown;
|
|
695
|
+
};
|
|
696
|
+
/** Event emitted after a lifecycle-only entry's release callback settles. */
|
|
697
|
+
type RuntimeLifecycleReleaseEvent = RuntimeLifecycleEventMetadata & {
|
|
698
|
+
readonly outcome: ScopeOutcome;
|
|
699
|
+
readonly error?: unknown;
|
|
388
700
|
};
|
|
389
701
|
/** Optional best-effort hooks for Runtime lifecycle and resolution events. */
|
|
390
702
|
type RuntimeObserver = {
|
|
@@ -392,7 +704,13 @@ type RuntimeObserver = {
|
|
|
392
704
|
readonly onServiceAcquire?: (event: RuntimeServiceAcquireEvent) => MaybePromise<void>;
|
|
393
705
|
readonly onExecutionStart?: (event: RuntimeExecutionStartEvent) => MaybePromise<void>;
|
|
394
706
|
readonly onExecutionEnd?: (event: RuntimeExecutionEndEvent) => MaybePromise<void>;
|
|
707
|
+
readonly onTaskStart?: (event: RuntimeTaskStartEvent) => MaybePromise<void>;
|
|
708
|
+
readonly onTaskEnd?: (event: RuntimeTaskEndEvent) => MaybePromise<void>;
|
|
395
709
|
readonly onResourceRelease?: (event: RuntimeResourceReleaseEvent) => MaybePromise<void>;
|
|
710
|
+
readonly onLifecycleStart?: (event: RuntimeLifecycleStartEvent) => MaybePromise<void>;
|
|
711
|
+
readonly onLifecycleEnd?: (event: RuntimeLifecycleEndEvent) => MaybePromise<void>;
|
|
712
|
+
readonly onLifecycleRelease?: (event: RuntimeLifecycleReleaseEvent) => MaybePromise<void>;
|
|
713
|
+
readonly onShutdown?: (event: RuntimeShutdownEvent) => MaybePromise<void>;
|
|
396
714
|
};
|
|
397
715
|
/** Compose best-effort Runtime observers into one observer. */
|
|
398
716
|
declare const RuntimeObserver: {
|
|
@@ -400,6 +718,12 @@ declare const RuntimeObserver: {
|
|
|
400
718
|
};
|
|
401
719
|
//#endregion
|
|
402
720
|
//#region src/runtime/outcome.d.ts
|
|
721
|
+
/** Metadata explaining why a Runtime shutdown was requested. */
|
|
722
|
+
type RuntimeShutdownReason = {
|
|
723
|
+
readonly kind: 'dispose' | 'signal' | 'external-abort' | 'main-settled';
|
|
724
|
+
readonly signal?: 'SIGINT' | 'SIGTERM';
|
|
725
|
+
readonly cause?: unknown;
|
|
726
|
+
};
|
|
403
727
|
/** Aggregated cleanup information reported during Runtime shutdown. */
|
|
404
728
|
type RuntimeShutdownDiagnostic = {
|
|
405
729
|
/** Final outcome supplied to the Runtime root Scope. */
|
|
@@ -436,7 +760,228 @@ type RuntimeDisposeOptions = {
|
|
|
436
760
|
readonly gracePeriod?: number;
|
|
437
761
|
/** Abort active execution signals after the grace period expires. */
|
|
438
762
|
readonly abortAfterGracePeriod?: boolean;
|
|
763
|
+
/** Boundary metadata supplied to Layer quiesce callbacks. */
|
|
764
|
+
readonly reason?: RuntimeShutdownReason;
|
|
765
|
+
};
|
|
766
|
+
//#endregion
|
|
767
|
+
//#region src/runtime/executor.d.ts
|
|
768
|
+
/** The value published by one managed execution before its work completes. */
|
|
769
|
+
type RuntimeManagedPlan<A> = {
|
|
770
|
+
readonly readiness: A | PromiseLike<A>;
|
|
771
|
+
readonly completion: PromiseLike<void>;
|
|
772
|
+
readonly cancel?: (reason?: unknown) => PromiseLike<void>;
|
|
439
773
|
};
|
|
774
|
+
/** A non-owning handle for an execution whose readiness is separate from completion. */
|
|
775
|
+
type RuntimeManagedExecution<A> = {
|
|
776
|
+
readonly readiness: Promise<Awaited<A>>;
|
|
777
|
+
readonly completion: Promise<void>;
|
|
778
|
+
readonly signal: AbortSignal;
|
|
779
|
+
readonly run: <B>(program: () => B | PromiseLike<B>) => Promise<Awaited<B>>;
|
|
780
|
+
readonly cancel: (reason?: unknown) => Promise<void>;
|
|
781
|
+
};
|
|
782
|
+
/**
|
|
783
|
+
* A non-owning view of a Runtime that can start isolated executions.
|
|
784
|
+
*
|
|
785
|
+
* The view deliberately contains only execution operations. Runtime disposal,
|
|
786
|
+
* warmup, inspection, backend access and Scope ownership stay on `Runtime`.
|
|
787
|
+
*/
|
|
788
|
+
interface RuntimeExecutor<in out Provided extends AnyService = any> {
|
|
789
|
+
readonly run: <A>(program: CompleteExecution<Provided, A>, options?: RuntimeRunOptions) => Promise<Awaited<A>>;
|
|
790
|
+
readonly runWith: <Request extends LayerInput, A>(layer: Request & CompleteExecutionLayer<Provided, Request>, program: CompleteExecution<Provided | ProvidedEnvironment<Request>, A>, options?: RuntimeRunOptions) => Promise<Awaited<A>>;
|
|
791
|
+
readonly runWithManaged: <Request extends LayerInput, A>(layer: Request & CompleteExecutionLayer<Provided, Request>, program: CompleteExecution<Provided | ProvidedEnvironment<Request>, RuntimeManagedPlan<A>>, options?: RuntimeRunOptions) => RuntimeManagedExecution<A>;
|
|
792
|
+
}
|
|
793
|
+
/** Yieldable request for the executor active in the current Runtime context. */
|
|
794
|
+
interface RuntimeExecutorRequest<Provided extends AnyService> {
|
|
795
|
+
[Symbol.iterator](): Generator<ServiceRequirement<Provided>, RuntimeExecutor<Provided>, unknown>;
|
|
796
|
+
[Symbol.asyncIterator](): AsyncGenerator<ServiceRequirement<Provided>, RuntimeExecutor<Provided>, unknown>;
|
|
797
|
+
}
|
|
798
|
+
//#endregion
|
|
799
|
+
//#region src/runtime/context.d.ts
|
|
800
|
+
/** Contextual state shared by Service, Scope and Layer resolution. */
|
|
801
|
+
interface RuntimeContext {
|
|
802
|
+
readonly resolver?: ServiceResolver;
|
|
803
|
+
readonly scope?: Scope;
|
|
804
|
+
readonly signal?: AbortSignal;
|
|
805
|
+
/** Non-owning executor view for the Runtime root of this context. */
|
|
806
|
+
readonly executor?: RuntimeExecutor<AnyService>;
|
|
807
|
+
readonly resolutionPath: readonly AnyServiceToken[];
|
|
808
|
+
/** Runtime execution owner, omitted for warmup and Runtime-root activity. */
|
|
809
|
+
readonly executionId?: string;
|
|
810
|
+
}
|
|
811
|
+
/** Host-specific storage for the current RuntimeContext. */
|
|
812
|
+
interface RuntimeContextStorage {
|
|
813
|
+
run<A>(context: RuntimeContext, program: () => A): A;
|
|
814
|
+
current(): RuntimeContext;
|
|
815
|
+
}
|
|
816
|
+
//#endregion
|
|
817
|
+
//#region src/service/runtime.d.ts
|
|
818
|
+
/** Resolves class-backed Service tokens for a runtime execution. */
|
|
819
|
+
interface ServiceResolver {
|
|
820
|
+
/** Resolve a token to its corresponding Service instance. */
|
|
821
|
+
resolve<T extends AnyServiceToken>(token: T): InstanceType<T> | PromiseLike<InstanceType<T>>;
|
|
822
|
+
}
|
|
823
|
+
/** Provides the resolver context used by Service tokens during execution. */
|
|
824
|
+
declare class ServiceRuntime {
|
|
825
|
+
/**
|
|
826
|
+
* Run a callback with a resolver available to `yield* Service` expressions.
|
|
827
|
+
*
|
|
828
|
+
* The context is scoped to the callback and is restored afterward.
|
|
829
|
+
*
|
|
830
|
+
* @example
|
|
831
|
+
* ```ts
|
|
832
|
+
* const value = ServiceRuntime.run(resolver, () => {
|
|
833
|
+
* return ServiceRuntime.resolve(Database)
|
|
834
|
+
* })
|
|
835
|
+
* ```
|
|
836
|
+
*/
|
|
837
|
+
static run<A>(resolver: ServiceResolver, program: () => A, storage?: RuntimeContextStorage): A;
|
|
838
|
+
/** Return the resolver active in the current execution context. */
|
|
839
|
+
static current(): ServiceResolver;
|
|
840
|
+
/** Resolve a Service token using the active resolver. */
|
|
841
|
+
static resolve<T extends AnyServiceToken>(token: T): Promise<InstanceType<T>>;
|
|
842
|
+
}
|
|
843
|
+
//#endregion
|
|
844
|
+
//#region src/service/errors.d.ts
|
|
845
|
+
/** Thrown when a Service is accessed without an active runtime resolver. */
|
|
846
|
+
declare class ServiceRuntimeNotConfiguredError extends Error {
|
|
847
|
+
constructor();
|
|
848
|
+
}
|
|
849
|
+
/** Thrown when a runtime has no provider for the requested Service tag. */
|
|
850
|
+
declare class ServiceNotFoundError extends Error {
|
|
851
|
+
readonly service: AnyServiceToken;
|
|
852
|
+
constructor(service: AnyServiceToken);
|
|
853
|
+
}
|
|
854
|
+
/** Thrown when resolving a Service re-enters a Service already in its path. */
|
|
855
|
+
declare class CircularDependencyError extends Error {
|
|
856
|
+
readonly path: readonly AnyServiceToken[];
|
|
857
|
+
constructor(path: readonly AnyServiceToken[]);
|
|
858
|
+
}
|
|
859
|
+
/** Thrown when a registered Service provider fails during lazy acquisition. */
|
|
860
|
+
declare class ServiceAcquisitionError extends Error {
|
|
861
|
+
readonly service: AnyServiceToken;
|
|
862
|
+
readonly cause: unknown;
|
|
863
|
+
constructor(service: AnyServiceToken, resolutionPath: readonly AnyServiceToken[], cause: unknown);
|
|
864
|
+
readonly resolutionPath: readonly AnyServiceToken[];
|
|
865
|
+
}
|
|
866
|
+
//#endregion
|
|
867
|
+
//#region src/internal/variance.d.ts
|
|
868
|
+
/** Type-level marker for a value produced by `A`. */
|
|
869
|
+
type Covariant<A> = () => A;
|
|
870
|
+
/** Type-level marker that both consumes and produces `A`. */
|
|
871
|
+
type Invariant<A> = (value: A) => A;
|
|
872
|
+
//#endregion
|
|
873
|
+
//#region src/layer/layer.d.ts
|
|
874
|
+
declare const LayerTypeId: unique symbol;
|
|
875
|
+
interface LayerVariance<in out Provided, out Required> {
|
|
876
|
+
readonly _Provided: Invariant<Provided>;
|
|
877
|
+
readonly _Required: Covariant<Required>;
|
|
878
|
+
}
|
|
879
|
+
type CapturedLayerAcquisition = {
|
|
880
|
+
readonly instance: unknown;
|
|
881
|
+
readonly release: ScopeFinalizer;
|
|
882
|
+
};
|
|
883
|
+
interface LayerProvider extends LayerRegistration {
|
|
884
|
+
/** The tag captured before this provider can cross an asynchronous boundary. */
|
|
885
|
+
readonly serviceTag: string;
|
|
886
|
+
/** Provider storage deliberately erases the concrete instance type. */
|
|
887
|
+
readonly release?: (instance: unknown, outcome: ScopeOutcome) => MaybePromise<void>;
|
|
888
|
+
readonly quiesce?: LayerQuiesce;
|
|
889
|
+
/** Capture acquisition-local cleanup without retaining the acquired instance. */
|
|
890
|
+
readonly acquireWithRelease?: () => MaybePromise<CapturedLayerAcquisition>;
|
|
891
|
+
}
|
|
892
|
+
type AnyProgram = Program<any, any, AnyService>;
|
|
893
|
+
type EffectDiscardValidation<P extends AnyProgram> = [EffectSuccess<P>] extends [void] ? [EffectError<P>] extends [never] ? unknown : {
|
|
894
|
+
readonly __betterEffectDiscardTypedFailure: unique symbol;
|
|
895
|
+
} : {
|
|
896
|
+
readonly __betterEffectDiscardSuccessMustBeVoid: unique symbol;
|
|
897
|
+
};
|
|
898
|
+
/** A Service class whose constructor can be called without arguments. */
|
|
899
|
+
type DefaultConstructibleServiceClass<Tag extends string = string, Instance extends AnyService = AnyService> = ServiceClass<Tag, Instance> & (new () => Instance);
|
|
900
|
+
type IsUnion<Type, Candidate = Type> = Type extends unknown ? [Candidate] extends [Type] ? false : true : never;
|
|
901
|
+
type InvalidUnionAliasToken = {
|
|
902
|
+
readonly __betterEffectUnionLayerAliasToken: unique symbol;
|
|
903
|
+
};
|
|
904
|
+
type RejectUnionAliasToken<Token> = IsUnion<Token> extends true ? InvalidUnionAliasToken : unknown;
|
|
905
|
+
type LayerAliasOptions<From extends ServiceToken<any, any>, To extends ServiceToken<any, any>> = {
|
|
906
|
+
readonly from: From;
|
|
907
|
+
readonly to: To;
|
|
908
|
+
} & RejectUnionAliasToken<From> & RejectUnionAliasToken<To> & ([ServiceContract<InstanceType<From>>] extends [ServiceContract<InstanceType<To>>] ? unknown : {
|
|
909
|
+
readonly __betterEffectIncompatibleLayerAlias: unique symbol;
|
|
910
|
+
});
|
|
911
|
+
/**
|
|
912
|
+
* Declarative collection of Service providers.
|
|
913
|
+
*
|
|
914
|
+
* A Layer describes how to acquire implementations; it does not execute
|
|
915
|
+
* providers until a `Runtime` is created. Use `merge` to compose distinct
|
|
916
|
+
* providers and `override` when replacing an existing provider intentionally.
|
|
917
|
+
*
|
|
918
|
+
* @example
|
|
919
|
+
* ```ts
|
|
920
|
+
* const AppLive = Layer.merge(
|
|
921
|
+
* Layer.succeed(Database, database),
|
|
922
|
+
* Layer.make(UserRepository)
|
|
923
|
+
* )
|
|
924
|
+
*
|
|
925
|
+
* const runtime = await Runtime.make(AppLive, backend)
|
|
926
|
+
* ```
|
|
927
|
+
*/
|
|
928
|
+
declare class Layer<in out Provided extends AnyService = AnyService, out Required extends AnyService = AnyService> {
|
|
929
|
+
readonly [LayerTypeId]: LayerVariance<Provided, Required>;
|
|
930
|
+
/** The Service provider registrations retained by this Layer. */
|
|
931
|
+
readonly providers: readonly LayerProvider[];
|
|
932
|
+
private constructor();
|
|
933
|
+
private static makeLifecycleLayer;
|
|
934
|
+
/** A stable provider-free Layer for composition roots with no Services. */
|
|
935
|
+
static readonly empty: Layer<never, never>;
|
|
936
|
+
/** Create a Layer that lazily acquires a Service instance. */
|
|
937
|
+
static make<S extends DefaultConstructibleServiceClass<any, any>>(service: S): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
938
|
+
static make<S extends ServiceToken<any, any>>(service: S, acquire: () => MaybePromise<ServiceContract<InstanceType<S>>>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
939
|
+
/** Create a Layer from an already-constructed Service instance. */
|
|
940
|
+
static succeed<S extends ServiceToken<any, any>>(service: S, instance: ServiceContract<InstanceType<S>>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
941
|
+
/** Alias a source Service under a compatible target contract. */
|
|
942
|
+
static alias<From extends ServiceToken<any, any>, To extends ServiceToken<any, any>>(options: LayerAliasOptions<From, To>): LayerResult<ProviderEntry<InstanceType<To>, InstanceType<From> | ServiceRequirements<InstanceType<To>>>>;
|
|
943
|
+
/** Define a provider with Runtime-root cleanup. */
|
|
944
|
+
static scoped<S extends ServiceToken<any, any>>(service: S, acquire: () => MaybePromise<ServiceContract<InstanceType<S>>>, release: (instance: InstanceType<S>, outcome: ScopeOutcome) => MaybePromise<void>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
945
|
+
static scoped<S extends ServiceToken<any, any>>(service: S, acquire: () => MaybePromise<ServiceContract<InstanceType<S>>>, lifecycle: LayerLifecycle<InstanceType<S>>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
946
|
+
/** Define a provider with Runtime-root cleanup through its disposal protocol. */
|
|
947
|
+
static scopedDisposable<S extends ServiceToken<any, any>>(service: S, acquire: () => MaybePromise<ServiceContract<InstanceType<S>> & DisposableResource>): LayerResult<ProviderEntry<InstanceType<S>, ServiceRequirements<InstanceType<S>>>>;
|
|
948
|
+
/** Define a provider whose acquisition can yield contextual Services. */
|
|
949
|
+
static scopedGen<S extends ServiceToken<any, any>, Yield extends ServiceRequirement<unknown>>(service: S, factory: LayerGenerator<S, Yield>, release: (instance: InstanceType<S>, outcome: ScopeOutcome) => MaybePromise<void>): LayerResult<ProviderEntry<InstanceType<S>, LayerGeneratorRequirements<S, Yield>>>;
|
|
950
|
+
static scopedGen<S extends ServiceToken<any, any>, Yield extends ServiceRequirement<unknown>>(service: S, factory: LayerGenerator<S, Yield>, lifecycle: LayerLifecycle<InstanceType<S>>): LayerResult<ProviderEntry<InstanceType<S>, LayerGeneratorRequirements<S, Yield>>>;
|
|
951
|
+
/** Define a provider whose acquisition can yield contextual Services. */
|
|
952
|
+
static gen<S extends ServiceToken<any, any>, Yield extends ServiceRequirement<unknown>>(service: S, factory: LayerGenerator<S, Yield>): LayerResult<ProviderEntry<InstanceType<S>, LayerGeneratorRequirements<S, Yield>>>;
|
|
953
|
+
/** Define a lifecycle-only entry with direct acquisition and root cleanup. */
|
|
954
|
+
static scopedDiscard<Yield extends ServiceRequirement<unknown>, Acquired>(acquire: LayerDiscardGenerator<Yield, Acquired>, release: (instance: Acquired, outcome: ScopeOutcome) => MaybePromise<void>): LayerResult<ProviderEntry<never, LayerDiscardRequirements<Yield>>>;
|
|
955
|
+
static scopedDiscard<Yield extends ServiceRequirement<unknown>, Acquired>(acquire: LayerDiscardGenerator<Yield, Acquired>, lifecycle: LayerLifecycle<Acquired>): LayerResult<ProviderEntry<never, LayerDiscardRequirements<Yield>>>;
|
|
956
|
+
static scopedDiscard<Acquired>(acquire: () => MaybePromise<Acquired>, release: (instance: Acquired, outcome: ScopeOutcome) => MaybePromise<void>): LayerResult<ProviderEntry<never, never>>;
|
|
957
|
+
static scopedDiscard<Acquired>(acquire: () => MaybePromise<Acquired>, lifecycle: LayerLifecycle<Acquired>): LayerResult<ProviderEntry<never, never>>;
|
|
958
|
+
/** Define a lifecycle-only entry whose acquisition can yield contextual Services. */
|
|
959
|
+
static scopedDiscardGen<Yield extends ServiceRequirement<unknown>, Acquired>(acquire: LayerDiscardGenerator<Yield, Acquired>, release: (instance: Acquired, outcome: ScopeOutcome) => MaybePromise<void>): LayerResult<ProviderEntry<never, LayerDiscardRequirements<Yield>>>;
|
|
960
|
+
static scopedDiscardGen<Yield extends ServiceRequirement<unknown>, Acquired>(acquire: LayerDiscardGenerator<Yield, Acquired>, lifecycle: LayerLifecycle<Acquired>): LayerResult<ProviderEntry<never, LayerDiscardRequirements<Yield>>>;
|
|
961
|
+
/** Run a no-failure Effect Program as a lifecycle-only entry. */
|
|
962
|
+
static effectDiscard<P extends AnyProgram>(program: P & EffectDiscardValidation<P>): LayerResult<ProviderEntry<never, Extract<EffectRequirements<P>, AnyService>>>;
|
|
963
|
+
/** Compose Layers without replacing providers. */
|
|
964
|
+
static merge<const Layers extends readonly LayerInput[]>(...layers: Layers & ValidateLayerTuple<Layers>): MergeResult<Layers>;
|
|
965
|
+
/** Mark a Layer composition root as complete without changing its runtime value. */
|
|
966
|
+
static complete<L extends LayerInput>(layer: L & CompleteInput<L>): L;
|
|
967
|
+
/** Replace providers in a base Layer, using tag identity and compatible contracts. */
|
|
968
|
+
static override<Base extends LayerInput>(base: Base & ValidateLayerInput<Base>): OverrideLayerResult<Base, readonly []>;
|
|
969
|
+
static override<Base extends LayerInput, const Overrides extends readonly [LayerInput, ...LayerInput[]]>(base: Base & ValidateLayerInput<Base>, ...overrides: Overrides & ValidateOverrides<Base, Overrides>): OverrideLayerResult<Base, Overrides>;
|
|
970
|
+
static override<Base extends LayerInput, const Overrides extends readonly LayerInput[]>(base: Base & ValidateLayerInput<Base>, ...overrides: Overrides & ValidateOverrides<Base, Overrides>): OverrideLayerResult<Base, Overrides>;
|
|
971
|
+
}
|
|
972
|
+
/** Type-level aliases for inspecting Layer environments and completeness. */
|
|
973
|
+
declare namespace Layer {
|
|
974
|
+
/** The widened Layer shape accepted by generic Layer infrastructure. */
|
|
975
|
+
type Any = LayerInput;
|
|
976
|
+
/** Extract the branded Service instances provided by a Layer. */
|
|
977
|
+
type Provided<L extends LayerInput> = ProvidedEnvironment<L>;
|
|
978
|
+
/** Extract the external Service requirements of a Layer. */
|
|
979
|
+
type Required<L extends LayerInput> = RequiredEnvironment<L>;
|
|
980
|
+
/** Extract the Services still missing from a Layer composition. */
|
|
981
|
+
type Missing<L extends LayerInput> = RequiredEnvironment<L>;
|
|
982
|
+
/** Validate a Layer's requirements and input shape. */
|
|
983
|
+
type Complete<L extends LayerInput> = CompleteInput<L>;
|
|
984
|
+
}
|
|
440
985
|
//#endregion
|
|
441
|
-
export {
|
|
442
|
-
//# sourceMappingURL=
|
|
986
|
+
export { CompleteInput as $, RuntimeServiceAcquireEvent as A, EffectRequirements as At, forkScoped as B, ServiceContract as Bt, RuntimeExecutionStartEvent as C, ScopeClosedError as Ct, RuntimeLifecycleStartEvent as D, Effect as Dt, RuntimeLifecycleReleaseEvent as E, AnyEffect as Et, RuntimeTaskMetadata as F, ProgramFromGenerator as Ft, LayerRegistration as G, ServiceTagOf as Gt, LayerBackendDisposeOptions as H, ServiceInstance as Ht, RuntimeTaskStartEvent as I, ServiceRequirement as It, LayerGeneratorYieldError as J, DuplicateServiceError as K, ServiceToken as Kt, ScopedTask as L, AnyService as Lt, RuntimeShutdownEvent as M, EffectYield as Mt, RuntimeShutdownPhase as N, InferYieldRequirements as Nt, RuntimeObserver as O, EffectError as Ot, RuntimeTaskEndEvent as P, Program as Pt, CompleteExecutionLayer as Q, ScopedTaskExit as R, AnyServiceToken as Rt, RuntimeExecutionMetadata as S, ScopeCloseError as St, RuntimeLifecycleEventMetadata as T, Service as Tt, LayerLifecycle as U, ServiceRequirements as Ut, LayerBackend as V, ServiceIdentity as Vt, LayerQuiesce as W, ServiceTag as Wt, ServiceTagCollisionError as X, LayerRegistrationError as Y, CompleteExecution as Z, RuntimeRunOptions as _, DisposableResource as _t, ServiceRuntimeNotConfiguredError as a, OverrideLayerResult as at, RuntimeExecutionAttributes as b, ScopeOutcome as bt, RuntimeContext as c, ValidateLayerInput as ct, RuntimeExecutorRequest as d, ValidateOverridesWitness as dt, ExecutionMissing as et, RuntimeManagedExecution as f, ProviderEntry as ft, RuntimeOptions as g, CleanupFailureDiagnostic as gt, RuntimeDisposeOptions as h, Scope as ht, ServiceNotFoundError as i, MissingServices as it, RuntimeServiceResolveEvent as j, EffectSuccess as jt, RuntimeResourceReleaseEvent as k, EffectFromGenerator as kt, RuntimeContextStorage as l, ValidateOneOverride as lt, CleanupFailureObserver as m, CloseableScope as mt, CircularDependencyError as n, LayerInputState as nt, ServiceResolver as o, ProvidedEnvironment as ot, RuntimeManagedPlan as p, MissingDependencies as pt, LayerDisposeError as q, ServiceTokenOf as qt, ServiceAcquisitionError as r, LayerResult as rt, ServiceRuntime as s, RequiredEnvironment as st, Layer as t, LayerInput as tt, RuntimeExecutor as u, ValidateOverrides as ut, RuntimeShutdownDiagnostic as v, MaybePromise$1 as vt, RuntimeLifecycleEndEvent as w, ScopeRuntimeNotConfiguredError as wt, RuntimeExecutionEndEvent as x, ResourceNotDisposableError as xt, RuntimeShutdownReason as y, ScopeFinalizer as yt, ScopedTaskState as z, ServiceClass as zt };
|
|
987
|
+
//# sourceMappingURL=layer-C2OaqTmB.d.mts.map
|