better-effect 0.7.0 → 0.9.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/README.md +96 -1
- package/dist/adapters/iti.d.mts +1 -1
- package/dist/adapters/iti.mjs +2 -1
- package/dist/adapters/iti.mjs.map +1 -1
- package/dist/{internal-identity-Cm4-KIUj.mjs → errors-Dnjhzbt0.mjs} +2 -25
- package/dist/errors-Dnjhzbt0.mjs.map +1 -0
- package/dist/{index-BddlcJK6.d.mts → index-BSRPIYII.d.mts} +58 -3
- package/dist/index-BSRPIYII.d.mts.map +1 -0
- package/dist/index-yOfq7LKL.d.mts +406 -0
- package/dist/index-yOfq7LKL.d.mts.map +1 -0
- package/dist/index.d.mts +4 -303
- package/dist/index.mjs +382 -262
- package/dist/index.mjs.map +1 -1
- package/dist/internal-identity-DmUpBeeL.mjs +27 -0
- package/dist/internal-identity-DmUpBeeL.mjs.map +1 -0
- package/dist/{map-layer-backend-BodcEeNA.mjs → map-layer-backend-gal-mcRv.mjs} +3 -2
- package/dist/{map-layer-backend-BodcEeNA.mjs.map → map-layer-backend-gal-mcRv.mjs.map} +1 -1
- package/dist/signal-BgUtPQj5.mjs +271 -0
- package/dist/signal-BgUtPQj5.mjs.map +1 -0
- package/dist/standard-services.d.mts +116 -0
- package/dist/standard-services.d.mts.map +1 -0
- package/dist/standard-services.mjs +180 -0
- package/dist/standard-services.mjs.map +1 -0
- package/dist/testing.mjs +1 -1
- package/package.json +6 -2
- package/dist/index-BddlcJK6.d.mts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/internal-identity-Cm4-KIUj.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ bun add better-effect better-result
|
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
16
|
import { Result } from 'better-result'
|
|
17
|
-
import { Effect, Layer, Runtime, Service } from 'better-effect'
|
|
17
|
+
import { CurrentAbortSignal, Effect, Layer, Runtime, Service } from 'better-effect'
|
|
18
18
|
|
|
19
19
|
class Database extends Service<Database>()('Database') {
|
|
20
20
|
findUser(id: string) {
|
|
@@ -113,6 +113,11 @@ await runtime.run(inspectDatabase)
|
|
|
113
113
|
Scope. `Effect.fn` captures the generator as a lazy `Program` for Runtime
|
|
114
114
|
boundaries; the callback form remains supported for compatibility.
|
|
115
115
|
|
|
116
|
+
`Program.all` keeps a collection lazy until the returned Program is run. Pass
|
|
117
|
+
`{ concurrency: n }` for a positive bounded FIFO worker pool; values retain
|
|
118
|
+
input order, and already-started Programs remain owned by the enclosing Runtime
|
|
119
|
+
execution when one returns an error.
|
|
120
|
+
|
|
116
121
|
`Runtime.make(AppLive)` and `Runtime.run(AppLive, program)` use the built-in
|
|
117
122
|
`MapLayerBackend`. Pass `{ backend: new ItiLayerBackend() }` when an external
|
|
118
123
|
container is needed; `MemoryLayerBackend` remains its compatibility alias from
|
|
@@ -131,6 +136,58 @@ Or let `Runtime.use` own the lifetime:
|
|
|
131
136
|
const result = await Runtime.use(AppLive, (runtime) => runtime.run(program))
|
|
132
137
|
```
|
|
133
138
|
|
|
139
|
+
Layer providers remain lazy unless startup validation is requested. Warm them
|
|
140
|
+
all before accepting work with either form:
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
const runtime = await Runtime.make(AppLive, { warmup: true })
|
|
144
|
+
|
|
145
|
+
// or, after creating the Runtime
|
|
146
|
+
await runtime.warmup()
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Warmup failures include the Service and resolution path, release resources
|
|
150
|
+
already acquired, dispose the backend and reject the Runtime. Optional
|
|
151
|
+
observers expose Service resolution/acquisition, execution and Layer release
|
|
152
|
+
events without coupling the core to an observability SDK:
|
|
153
|
+
|
|
154
|
+
Missing, circular, and provider-construction failures use the logical Service
|
|
155
|
+
tags in `ServiceNotFoundError`, `CircularDependencyError`, and
|
|
156
|
+
`ServiceAcquisitionError`; the latter preserves the original provider cause.
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
const runtime = await Runtime.make(AppLive, {
|
|
160
|
+
observers: [
|
|
161
|
+
{
|
|
162
|
+
onServiceResolve: (event) => console.debug(event.service.serviceTag),
|
|
163
|
+
onExecutionEnd: (event) => console.debug(event.outcome.status)
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
})
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Cancellation is cooperative and uses `AbortSignal`; no scheduler or fibers are
|
|
170
|
+
created. Pass a signal to one execution and read it from the program when an
|
|
171
|
+
I/O operation supports cancellation:
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
const result = await runtime.run(program, { signal: request.signal })
|
|
175
|
+
|
|
176
|
+
const cancellableProgram = Effect.fn(async function* () {
|
|
177
|
+
const signal = yield* CurrentAbortSignal
|
|
178
|
+
return Result.ok(await fetchData({ signal }))
|
|
179
|
+
})
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
For request-local context or overrides, add a Layer only to that execution:
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
const result = await runtime.runWith(RequestLive, handleRequest)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
The request Layer may use root Services, while its scoped providers are closed
|
|
189
|
+
with the execution Scope and never change the shared Runtime environment.
|
|
190
|
+
|
|
134
191
|
Service and Scope access share one `RuntimeContext`. Node/Bun uses
|
|
135
192
|
`AsyncLocalStorage` by default; hosts without transparent async context can
|
|
136
193
|
pass `contextStorage: new ExplicitRuntimeContextStorage()` from
|
|
@@ -285,6 +342,25 @@ Dependency resolution stays behind a pluggable backend.
|
|
|
285
342
|
|
|
286
343
|
Your application can keep using ordinary Promises and existing libraries.
|
|
287
344
|
|
|
345
|
+
### Optional standard services
|
|
346
|
+
|
|
347
|
+
Small host-backed services live behind `better-effect/standard-services` so the
|
|
348
|
+
core package stays explicit:
|
|
349
|
+
|
|
350
|
+
```ts
|
|
351
|
+
import { Clock, ClockTest } from 'better-effect/standard-services'
|
|
352
|
+
import { Runtime, ServiceRuntime } from 'better-effect'
|
|
353
|
+
|
|
354
|
+
const ClockTestLive = ClockTest.layer(new Date('2025-01-01T00:00:00.000Z'))
|
|
355
|
+
const runtime = await Runtime.make(ClockTestLive)
|
|
356
|
+
const now = await runtime.run(async () => ServiceRuntime.resolve(Clock))
|
|
357
|
+
await runtime.dispose()
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
The entrypoint also provides `Random`/`RandomSeeded`, `Logger`/`LoggerTest`,
|
|
361
|
+
`CurrentRequest`, and the compatible `CurrentAbortSignal` bridge. None is
|
|
362
|
+
installed implicitly; compose a normal Layer or use the provided test helpers.
|
|
363
|
+
|
|
288
364
|
---
|
|
289
365
|
|
|
290
366
|
## How it compares
|
|
@@ -379,6 +455,25 @@ step after an `Ok`. Use `Effect.andThenAsync` when the next operation returns a
|
|
|
379
455
|
or already an `Err`. The pipeline carries the requirements of every step, so Runtime
|
|
380
456
|
still rejects it when its Layer does not provide every required Service.
|
|
381
457
|
|
|
458
|
+
Observation helpers such as `Effect.tap`, `Effect.tapError`, and `Effect.tapBoth`
|
|
459
|
+
run only the active branch and return the original Result, so logging or metrics
|
|
460
|
+
do not change the pipeline's value or requirement channel.
|
|
461
|
+
|
|
462
|
+
Use `Effect.recover` or `Effect.recoverAsync` for an explicit fallback Result;
|
|
463
|
+
the fallback is evaluated only when the input is an `Err`, and its Service
|
|
464
|
+
requirements are included in the resulting type.
|
|
465
|
+
|
|
466
|
+
`Effect.flatten` removes one nested Result layer. `Effect.as` and `Effect.asVoid`
|
|
467
|
+
replace successful values while leaving the error and requirement channels intact.
|
|
468
|
+
|
|
469
|
+
`Effect.match` supports ordinary branch values as well as branch Effects. Only
|
|
470
|
+
the selected handler runs; Effect-valued handlers contribute both possible
|
|
471
|
+
error and Service requirement channels to the result type.
|
|
472
|
+
|
|
473
|
+
`Effect.all` collects already-created Effects in input order, while `Effect.zip`
|
|
474
|
+
is the two-value form; both union every input's error and Service requirements
|
|
475
|
+
and retain `better-result` short-circuiting.
|
|
476
|
+
|
|
382
477
|
Use `Effect.gen` for larger workflows with several intermediate values, branches or
|
|
383
478
|
procedural logic that already has a resolver. Use `Effect.fn` when the workflow should
|
|
384
479
|
start at a Runtime boundary. Use `pipe` for concise, linear composition; all three
|
package/dist/adapters/iti.d.mts
CHANGED
package/dist/adapters/iti.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as ServiceTagCollisionError, c as ServiceNotFoundError, t as DuplicateServiceError } from "../errors-Dnjhzbt0.mjs";
|
|
2
|
+
import { t as assertServiceCompatibility } from "../internal-identity-DmUpBeeL.mjs";
|
|
2
3
|
import { t as isPromiseLike } from "../runtime-CDcCF5cb.mjs";
|
|
3
4
|
import { createContainer } from "iti";
|
|
4
5
|
//#region src/adapters/iti.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iti.mjs","names":[],"sources":["../../src/adapters/iti.ts"],"sourcesContent":["import { createContainer } from 'iti'\n\nimport {\n DuplicateServiceError,\n ServiceTagCollisionError,\n type LayerBackend,\n type LayerRegistration\n} from '../layer'\n\nimport { ServiceNotFoundError, type AnyServiceToken } from '../service'\n\nimport { assertServiceCompatibility } from '../layer/internal-identity'\nimport { isPromiseLike } from '../utils/runtime'\n\ntype LayerAcquiredValue = Awaited<ReturnType<LayerRegistration['acquire']>>\n\n/**\n * ITI-backed Layer backend.\n *\n * Install `iti` as the optional peer dependency and pass an instance to\n * `Runtime.make` when using ITI's container implementation.\n */\nexport class ItiLayerBackend implements LayerBackend {\n private container: any = createContainer()\n\n private readonly keys = new Map<string, string>()\n\n private readonly registered = new Map<string, AnyServiceToken>()\n\n private keyFor(token: AnyServiceToken): string {\n const tag = token.serviceTag\n const existing = this.keys.get(tag)\n\n if (existing) {\n return existing\n }\n\n const key = `better-effect:${tag}`\n\n this.keys.set(tag, key)\n\n return key\n }\n\n /** Register a Layer provider under its deterministic Service-tag key. */\n register(registration: LayerRegistration): void {\n const token = registration.service\n const tag = token.serviceTag\n const existing = this.registered.get(tag)\n\n if (existing === token) {\n throw new DuplicateServiceError(token)\n }\n\n if (existing) {\n throw new ServiceTagCollisionError(existing, token)\n }\n\n const key = this.keyFor(token)\n\n this.container = this.container.add({\n [key]: registration.acquire\n })\n\n this.registered.set(tag, token)\n }\n\n /** Resolve a registered Service through the ITI container. */\n resolve<T extends AnyServiceToken>(token: T): InstanceType<T> | PromiseLike<InstanceType<T>> {\n const registered = this.registered.get(token.serviceTag)\n\n if (registered === undefined) {\n throw new ServiceNotFoundError(token)\n }\n\n const key = this.keyFor(token)\n const resolved = this.container.get(key)\n\n const validate = (instance: LayerAcquiredValue): InstanceType<T> => {\n assertServiceCompatibility(token, registered, instance)\n\n // SAFETY: The registered tag and compatibility check establish the constructor-to-instance relationship after ITI erases it.\n return instance as InstanceType<T>\n }\n\n if (isPromiseLike(resolved)) {\n return Promise.resolve(resolved).then(validate)\n }\n\n return validate(resolved)\n }\n\n /** Dispose all ITI-managed provider instances. */\n async disposeAll(): Promise<void> {\n await this.container.disposeAll()\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"iti.mjs","names":[],"sources":["../../src/adapters/iti.ts"],"sourcesContent":["import { createContainer } from 'iti'\n\nimport {\n DuplicateServiceError,\n ServiceTagCollisionError,\n type LayerBackend,\n type LayerRegistration\n} from '../layer'\n\nimport { ServiceNotFoundError, type AnyServiceToken } from '../service'\n\nimport { assertServiceCompatibility } from '../layer/internal-identity'\nimport { isPromiseLike } from '../utils/runtime'\n\ntype LayerAcquiredValue = Awaited<ReturnType<LayerRegistration['acquire']>>\n\n/**\n * ITI-backed Layer backend.\n *\n * Install `iti` as the optional peer dependency and pass an instance to\n * `Runtime.make` when using ITI's container implementation.\n */\nexport class ItiLayerBackend implements LayerBackend {\n private container: any = createContainer()\n\n private readonly keys = new Map<string, string>()\n\n private readonly registered = new Map<string, AnyServiceToken>()\n\n private keyFor(token: AnyServiceToken): string {\n const tag = token.serviceTag\n const existing = this.keys.get(tag)\n\n if (existing) {\n return existing\n }\n\n const key = `better-effect:${tag}`\n\n this.keys.set(tag, key)\n\n return key\n }\n\n /** Register a Layer provider under its deterministic Service-tag key. */\n register(registration: LayerRegistration): void {\n const token = registration.service\n const tag = token.serviceTag\n const existing = this.registered.get(tag)\n\n if (existing === token) {\n throw new DuplicateServiceError(token)\n }\n\n if (existing) {\n throw new ServiceTagCollisionError(existing, token)\n }\n\n const key = this.keyFor(token)\n\n this.container = this.container.add({\n [key]: registration.acquire\n })\n\n this.registered.set(tag, token)\n }\n\n /** Resolve a registered Service through the ITI container. */\n resolve<T extends AnyServiceToken>(token: T): InstanceType<T> | PromiseLike<InstanceType<T>> {\n const registered = this.registered.get(token.serviceTag)\n\n if (registered === undefined) {\n throw new ServiceNotFoundError(token)\n }\n\n const key = this.keyFor(token)\n const resolved = this.container.get(key)\n\n const validate = (instance: LayerAcquiredValue): InstanceType<T> => {\n assertServiceCompatibility(token, registered, instance)\n\n // SAFETY: The registered tag and compatibility check establish the constructor-to-instance relationship after ITI erases it.\n return instance as InstanceType<T>\n }\n\n if (isPromiseLike(resolved)) {\n return Promise.resolve(resolved).then(validate)\n }\n\n return validate(resolved)\n }\n\n /** Dispose all ITI-managed provider instances. */\n async disposeAll(): Promise<void> {\n await this.container.disposeAll()\n }\n}\n"],"mappings":";;;;;;;;;;;AAsBA,IAAa,kBAAb,MAAqD;CACnD,YAAyB,gBAAgB;CAEzC,uBAAwB,IAAI,IAAoB;CAEhD,6BAA8B,IAAI,IAA6B;CAE/D,OAAe,OAAgC;EAC7C,MAAM,MAAM,MAAM;EAClB,MAAM,WAAW,KAAK,KAAK,IAAI,GAAG;EAElC,IAAI,UACF,OAAO;EAGT,MAAM,MAAM,iBAAiB;EAE7B,KAAK,KAAK,IAAI,KAAK,GAAG;EAEtB,OAAO;CACT;;CAGA,SAAS,cAAuC;EAC9C,MAAM,QAAQ,aAAa;EAC3B,MAAM,MAAM,MAAM;EAClB,MAAM,WAAW,KAAK,WAAW,IAAI,GAAG;EAExC,IAAI,aAAa,OACf,MAAM,IAAI,sBAAsB,KAAK;EAGvC,IAAI,UACF,MAAM,IAAI,yBAAyB,UAAU,KAAK;EAGpD,MAAM,MAAM,KAAK,OAAO,KAAK;EAE7B,KAAK,YAAY,KAAK,UAAU,IAAI,GACjC,MAAM,aAAa,QACtB,CAAC;EAED,KAAK,WAAW,IAAI,KAAK,KAAK;CAChC;;CAGA,QAAmC,OAA0D;EAC3F,MAAM,aAAa,KAAK,WAAW,IAAI,MAAM,UAAU;EAEvD,IAAI,eAAe,KAAA,GACjB,MAAM,IAAI,qBAAqB,KAAK;EAGtC,MAAM,MAAM,KAAK,OAAO,KAAK;EAC7B,MAAM,WAAW,KAAK,UAAU,IAAI,GAAG;EAEvC,MAAM,YAAY,aAAkD;GAClE,2BAA2B,OAAO,YAAY,QAAQ;GAGtD,OAAO;EACT;EAEA,IAAI,cAAc,QAAQ,GACxB,OAAO,QAAQ,QAAQ,QAAQ,CAAC,CAAC,KAAK,QAAQ;EAGhD,OAAO,SAAS,QAAQ;CAC1B;;CAGA,MAAM,aAA4B;EAChC,MAAM,KAAK,UAAU,WAAW;CAClC;AACF"}
|
|
@@ -94,29 +94,6 @@ var LayerGeneratorYieldError = class extends Error {
|
|
|
94
94
|
}
|
|
95
95
|
};
|
|
96
96
|
//#endregion
|
|
97
|
-
|
|
98
|
-
const serviceMemberNames = (token) => {
|
|
99
|
-
const names = /* @__PURE__ */ new Set();
|
|
100
|
-
let prototype = token.prototype;
|
|
101
|
-
while (prototype && prototype !== Object.prototype) {
|
|
102
|
-
for (const name of Object.getOwnPropertyNames(prototype)) if (name !== "constructor") names.add(name);
|
|
103
|
-
for (const symbol of Object.getOwnPropertySymbols(prototype)) names.add(symbol);
|
|
104
|
-
prototype = Object.getPrototypeOf(prototype);
|
|
105
|
-
}
|
|
106
|
-
return [...names];
|
|
107
|
-
};
|
|
108
|
-
/**
|
|
109
|
-
* Check the runtime portion of a same-tag association before returning it.
|
|
110
|
-
* TypeScript remains authoritative for full structural compatibility; this
|
|
111
|
-
* check catches the common incompatible-method collision after erasure.
|
|
112
|
-
*/
|
|
113
|
-
const assertServiceCompatibility = (requested, registered, instance) => {
|
|
114
|
-
if (requested === registered || requested.serviceTag !== registered.serviceTag) return;
|
|
115
|
-
const candidate = Object(instance);
|
|
116
|
-
if (candidate !== instance) throw new ServiceTagCollisionError(registered, requested);
|
|
117
|
-
for (const name of serviceMemberNames(requested)) if (!(name in candidate)) throw new ServiceTagCollisionError(registered, requested);
|
|
118
|
-
};
|
|
119
|
-
//#endregion
|
|
120
|
-
export { LayerRegistrationError as a, ServiceAcquisitionError as c, LayerGeneratorYieldError as i, ServiceNotFoundError as l, DuplicateServiceError as n, ServiceTagCollisionError as o, LayerDisposeError as r, CircularDependencyError as s, assertServiceCompatibility as t, ServiceRuntimeNotConfiguredError as u };
|
|
97
|
+
export { ServiceTagCollisionError as a, ServiceNotFoundError as c, LayerRegistrationError as i, ServiceRuntimeNotConfiguredError as l, LayerDisposeError as n, CircularDependencyError as o, LayerGeneratorYieldError as r, ServiceAcquisitionError as s, DuplicateServiceError as t };
|
|
121
98
|
|
|
122
|
-
//# sourceMappingURL=
|
|
99
|
+
//# sourceMappingURL=errors-Dnjhzbt0.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-Dnjhzbt0.mjs","names":[],"sources":["../src/service/errors.ts","../src/layer/errors.ts"],"sourcesContent":["import type { AnyServiceToken } from './types'\n\nconst formatResolutionPath = (path: readonly AnyServiceToken[]): string =>\n path.map((service) => service.serviceTag).join(' → ')\n\n/** Thrown when a Service is accessed without an active runtime resolver. */\nexport class ServiceRuntimeNotConfiguredError extends Error {\n constructor() {\n super('No ServiceResolver is available in the current runtime context')\n\n this.name = 'ServiceRuntimeNotConfiguredError'\n }\n}\n\n/** Thrown when a runtime has no provider for the requested Service tag. */\nexport class ServiceNotFoundError extends Error {\n constructor(readonly service: AnyServiceToken) {\n super(`Service \"${service.serviceTag}\" was not provided`)\n\n this.name = 'ServiceNotFoundError'\n }\n}\n\n/** Thrown when resolving a Service re-enters a Service already in its path. */\nexport class CircularDependencyError extends Error {\n readonly path: readonly AnyServiceToken[]\n\n constructor(path: readonly AnyServiceToken[]) {\n const normalizedPath = Object.freeze([...path])\n\n super(`Circular Service dependency detected:\\n${formatResolutionPath(normalizedPath)}`)\n\n this.name = 'CircularDependencyError'\n this.path = normalizedPath\n }\n}\n\n/** Thrown when a registered Service provider fails during lazy acquisition. */\nexport class ServiceAcquisitionError extends Error {\n override readonly cause: unknown\n\n constructor(\n readonly service: AnyServiceToken,\n resolutionPath: readonly AnyServiceToken[],\n cause: unknown\n ) {\n const normalizedPath = Object.freeze([...resolutionPath])\n\n super(\n `Failed to acquire Service \"${service.serviceTag}\"` +\n (normalizedPath.length > 0\n ? ` while resolving: ${formatResolutionPath(normalizedPath)}`\n : '')\n )\n\n this.name = 'ServiceAcquisitionError'\n this.cause = cause\n this.resolutionPath = normalizedPath\n }\n\n readonly resolutionPath: readonly AnyServiceToken[]\n}\n","import type { AnyServiceToken, ServiceClass } from '../service'\nimport type { ScopeOutcome } from '../scope'\n\ntype LayerCause = Extract<ScopeOutcome, { readonly status: 'failure' }>['cause']\n\n/** Thrown when a Layer registers the same Service tag more than once. */\nexport class DuplicateServiceError extends Error {\n constructor(readonly service: ServiceClass<any>) {\n super(`Duplicate service tag \"${service.serviceTag}\"`)\n\n this.name = 'DuplicateServiceError'\n }\n}\n\n/** Thrown when one Service tag is associated with incompatible constructors. */\nexport class ServiceTagCollisionError extends Error {\n constructor(\n readonly existing: AnyServiceToken,\n readonly incoming: AnyServiceToken\n ) {\n super(\n `Service tag \"${incoming.serviceTag}\" is already associated with \"${existing.name}\" ` +\n `and cannot be associated with \"${incoming.name}\"`\n )\n\n this.name = 'ServiceTagCollisionError'\n }\n}\n\n/** Thrown when a backend fails while registering a Layer provider. */\nexport class LayerRegistrationError extends Error {\n constructor(\n readonly service: ServiceClass<any> | undefined,\n readonly registrationCause: LayerCause,\n readonly cleanupCause?: LayerCause\n ) {\n super(\n service ? `Failed to register service \"${service.serviceTag}\"` : 'Failed to build Layer',\n {\n cause: registrationCause\n }\n )\n\n this.name = 'LayerRegistrationError'\n }\n}\n\n/** Thrown when one or more Layer-owned resources fail during disposal. */\nexport class LayerDisposeError extends Error {\n constructor(readonly causes: readonly unknown[]) {\n super(`Failed to dispose Layer (${causes.length} error${causes.length === 1 ? '' : 's'})`)\n\n this.name = 'LayerDisposeError'\n }\n}\n\n/** Thrown when a Layer generator yields a value other than a Service requirement. */\nexport class LayerGeneratorYieldError extends Error {\n constructor(readonly service: ServiceClass<any>) {\n super(`Layer.gen(\"${service.serviceTag}\") yielded an unsupported value`)\n\n this.name = 'LayerGeneratorYieldError'\n }\n}\n"],"mappings":";AAEA,MAAM,wBAAwB,SAC5B,KAAK,KAAK,YAAY,QAAQ,UAAU,CAAC,CAAC,KAAK,KAAK;;AAGtD,IAAa,mCAAb,cAAsD,MAAM;CAC1D,cAAc;EACZ,MAAM,gEAAgE;EAEtE,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,uBAAb,cAA0C,MAAM;CACzB;CAArB,YAAY,SAAmC;EAC7C,MAAM,YAAY,QAAQ,WAAW,mBAAmB;EADrC,KAAA,UAAA;EAGnB,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,0BAAb,cAA6C,MAAM;CACjD;CAEA,YAAY,MAAkC;EAC5C,MAAM,iBAAiB,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC;EAE9C,MAAM,0CAA0C,qBAAqB,cAAc,GAAG;EAEtF,KAAK,OAAO;EACZ,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,0BAAb,cAA6C,MAAM;CAItC;CAHX;CAEA,YACE,SACA,gBACA,OACA;EACA,MAAM,iBAAiB,OAAO,OAAO,CAAC,GAAG,cAAc,CAAC;EAExD,MACE,8BAA8B,QAAQ,WAAW,MAC9C,eAAe,SAAS,IACrB,qBAAqB,qBAAqB,cAAc,MACxD,GACR;EAXS,KAAA,UAAA;EAaT,KAAK,OAAO;EACZ,KAAK,QAAQ;EACb,KAAK,iBAAiB;CACxB;CAEA;AACF;;;;ACvDA,IAAa,wBAAb,cAA2C,MAAM;CAC1B;CAArB,YAAY,SAAqC;EAC/C,MAAM,0BAA0B,QAAQ,WAAW,EAAE;EADlC,KAAA,UAAA;EAGnB,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,2BAAb,cAA8C,MAAM;CAEvC;CACA;CAFX,YACE,UACA,UACA;EACA,MACE,gBAAgB,SAAS,WAAW,gCAAgC,SAAS,KAAK,mCAC9C,SAAS,KAAK,EACpD;EANS,KAAA,WAAA;EACA,KAAA,WAAA;EAOT,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,yBAAb,cAA4C,MAAM;CAErC;CACA;CACA;CAHX,YACE,SACA,mBACA,cACA;EACA,MACE,UAAU,+BAA+B,QAAQ,WAAW,KAAK,yBACjE,EACE,OAAO,kBACT,CACF;EATS,KAAA,UAAA;EACA,KAAA,oBAAA;EACA,KAAA,eAAA;EAST,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,oBAAb,cAAuC,MAAM;CACtB;CAArB,YAAY,QAAqC;EAC/C,MAAM,4BAA4B,OAAO,OAAO,QAAQ,OAAO,WAAW,IAAI,KAAK,IAAI,EAAE;EADtE,KAAA,SAAA;EAGnB,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,2BAAb,cAA8C,MAAM;CAC7B;CAArB,YAAY,SAAqC;EAC/C,MAAM,cAAc,QAAQ,WAAW,gCAAgC;EADpD,KAAA,UAAA;EAGnB,KAAK,OAAO;CACd;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as ServiceTagOf, F as ServiceContract, H as ServiceTokenOf, M as AnyService, N as AnyServiceToken, P as ServiceClass, R as ServiceRequirements, T as EffectRequirements, V as ServiceToken, c as RuntimeContextStorage, d as CleanupFailureDiagnostic, h as ScopeOutcome, j as ServiceRequirement, p as MaybePromise } from "./index-BFgG9zZC.mjs";
|
|
1
|
+
import { B as ServiceTagOf, F as ServiceContract, H as ServiceTokenOf, M as AnyService, N as AnyServiceToken, P as ServiceClass, R as ServiceRequirements, T as EffectRequirements, V as ServiceToken, c as RuntimeContextStorage, d as CleanupFailureDiagnostic, h as ScopeOutcome, j as ServiceRequirement, p as MaybePromise, u as Scope } from "./index-BFgG9zZC.mjs";
|
|
2
2
|
import { a as LayerRegistration, i as LayerGeneratorRequirements, n as LayerBackend, o as MaybePromise$1, r as LayerGenerator } from "./map-layer-backend-CGibcwkc.mjs";
|
|
3
3
|
//#region src/internal/variance.d.ts
|
|
4
4
|
/** Type-level marker for a value produced by `A`. */
|
|
@@ -124,6 +124,9 @@ type ValidateOneOverride<Current extends LayerInput, Replacement extends LayerIn
|
|
|
124
124
|
type ValidateOverrides<Base extends LayerInput, Overrides extends readonly LayerInput[]> = Overrides extends readonly [infer Head extends LayerInput, ...infer Tail extends readonly LayerInput[]] ? ValidateOneOverride<Base, Head> & ValidateOverrides<OverrideResult<Base, Head>, Tail> : unknown;
|
|
125
125
|
/** A Layer accepted by Runtime boundaries after completeness validation. */
|
|
126
126
|
type CompleteInput<L extends LayerInput> = ValidateLayerInput<L> & (LayerInputState<L> extends 'unchecked' ? L : LayerInputState<L> extends 'typed' ? [RequiredEnvironment<L>] extends [never] ? L : L & MissingDependencies<Extract<RequiredEnvironment<L>, AnyService>> : L);
|
|
127
|
+
type ExecutionRequirementsMissing<RootProvided extends AnyService, Request extends LayerInput> = MissingServices<Extract<RequiredEnvironment<Request>, AnyService>, Extract<RootProvided, AnyService>>;
|
|
128
|
+
/** Validate a per-execution Layer against the Runtime root environment. */
|
|
129
|
+
type CompleteExecutionLayer<RootProvided extends AnyService, Request extends LayerInput> = ValidateLayerInput<Request> & (LayerInputState<Request> extends 'unchecked' ? Request : LayerInputState<Request> extends 'typed' ? [ExecutionRequirementsMissing<RootProvided, Request>] extends [never] ? Request : Request & MissingDependencies<ExecutionRequirementsMissing<RootProvided, Request>> : Request);
|
|
127
130
|
type ExecutionProgram<A> = () => A | PromiseLike<A>;
|
|
128
131
|
type CompleteExecutionWithRequirements<Provided extends AnyService, A, Required extends AnyService> = [MissingServices<Required, Provided>] extends [never] ? ExecutionProgram<A> : ExecutionProgram<A> & MissingDependencies<MissingServices<Required, Provided>>;
|
|
129
132
|
/** Keep execution callbacks unchanged when their Effect requirements are met. */
|
|
@@ -228,6 +231,43 @@ declare class LayerGeneratorYieldError extends Error {
|
|
|
228
231
|
constructor(service: ServiceClass<any>);
|
|
229
232
|
}
|
|
230
233
|
//#endregion
|
|
234
|
+
//#region src/runtime/observer.d.ts
|
|
235
|
+
/** Event emitted after a Service resolution attempt settles. */
|
|
236
|
+
type RuntimeServiceResolveEvent = {
|
|
237
|
+
readonly service: AnyServiceToken;
|
|
238
|
+
readonly resolutionPath: readonly AnyServiceToken[];
|
|
239
|
+
readonly outcome: ScopeOutcome;
|
|
240
|
+
};
|
|
241
|
+
/** Event emitted after a provider acquisition attempt settles. */
|
|
242
|
+
type RuntimeServiceAcquireEvent = {
|
|
243
|
+
readonly service: AnyServiceToken;
|
|
244
|
+
readonly resolutionPath: readonly AnyServiceToken[];
|
|
245
|
+
readonly outcome: ScopeOutcome;
|
|
246
|
+
};
|
|
247
|
+
/** Event emitted immediately before a program starts in an execution Scope. */
|
|
248
|
+
type RuntimeExecutionStartEvent = {
|
|
249
|
+
readonly scope: Scope;
|
|
250
|
+
};
|
|
251
|
+
/** Event emitted after a program and its execution Scope settle. */
|
|
252
|
+
type RuntimeExecutionEndEvent = {
|
|
253
|
+
readonly scope: Scope;
|
|
254
|
+
readonly outcome: ScopeOutcome;
|
|
255
|
+
};
|
|
256
|
+
/** Event emitted after a Layer provider release callback settles. */
|
|
257
|
+
type RuntimeResourceReleaseEvent = {
|
|
258
|
+
readonly service: AnyServiceToken;
|
|
259
|
+
readonly outcome: ScopeOutcome;
|
|
260
|
+
readonly error?: unknown;
|
|
261
|
+
};
|
|
262
|
+
/** Optional best-effort hooks for Runtime lifecycle and resolution events. */
|
|
263
|
+
type RuntimeObserver = {
|
|
264
|
+
readonly onServiceResolve?: (event: RuntimeServiceResolveEvent) => MaybePromise$1<void>;
|
|
265
|
+
readonly onServiceAcquire?: (event: RuntimeServiceAcquireEvent) => MaybePromise$1<void>;
|
|
266
|
+
readonly onExecutionStart?: (event: RuntimeExecutionStartEvent) => MaybePromise$1<void>;
|
|
267
|
+
readonly onExecutionEnd?: (event: RuntimeExecutionEndEvent) => MaybePromise$1<void>;
|
|
268
|
+
readonly onResourceRelease?: (event: RuntimeResourceReleaseEvent) => MaybePromise$1<void>;
|
|
269
|
+
};
|
|
270
|
+
//#endregion
|
|
231
271
|
//#region src/runtime/outcome.d.ts
|
|
232
272
|
/** Aggregated cleanup information reported during Runtime shutdown. */
|
|
233
273
|
type RuntimeShutdownDiagnostic = {
|
|
@@ -242,6 +282,10 @@ type CleanupFailureObserver = (diagnostic: CleanupFailureDiagnostic | RuntimeShu
|
|
|
242
282
|
type RuntimeOptions = {
|
|
243
283
|
/** Backend used to register and resolve the Layer. Defaults to MapLayerBackend. */
|
|
244
284
|
readonly backend?: LayerBackend;
|
|
285
|
+
/** Resolve every Layer provider before Runtime.make resolves. */
|
|
286
|
+
readonly warmup?: boolean;
|
|
287
|
+
/** Best-effort lifecycle and Service resolution observers. */
|
|
288
|
+
readonly observers?: readonly RuntimeObserver[];
|
|
245
289
|
/** Optional observer for best-effort cleanup diagnostics. */
|
|
246
290
|
readonly onCleanupFailure?: CleanupFailureObserver;
|
|
247
291
|
/** Context storage used by Service, Scope and Layer resolution. */
|
|
@@ -249,6 +293,17 @@ type RuntimeOptions = {
|
|
|
249
293
|
/** Optional signal exposed through the RuntimeContext. */
|
|
250
294
|
readonly signal?: AbortSignal;
|
|
251
295
|
};
|
|
296
|
+
/** Optional signal supplied to one managed Runtime execution. */
|
|
297
|
+
type RuntimeRunOptions = {
|
|
298
|
+
readonly signal?: AbortSignal;
|
|
299
|
+
};
|
|
300
|
+
/** Cooperative shutdown policy for a managed Runtime. */
|
|
301
|
+
type RuntimeDisposeOptions = {
|
|
302
|
+
/** Time to let active executions settle before requesting cancellation. */
|
|
303
|
+
readonly gracePeriod?: number;
|
|
304
|
+
/** Abort active execution signals after the grace period expires. */
|
|
305
|
+
readonly abortAfterGracePeriod?: boolean;
|
|
306
|
+
};
|
|
252
307
|
//#endregion
|
|
253
|
-
export {
|
|
254
|
-
//# sourceMappingURL=index-
|
|
308
|
+
export { ProvidedEnvironment as C, LayerResult as S, Layer as _, RuntimeShutdownDiagnostic as a, CompleteInput as b, RuntimeObserver as c, RuntimeServiceResolveEvent as d, DuplicateServiceError as f, ServiceTagCollisionError as g, LayerRegistrationError as h, RuntimeRunOptions as i, RuntimeResourceReleaseEvent as l, LayerGeneratorYieldError as m, RuntimeDisposeOptions as n, RuntimeExecutionEndEvent as o, LayerDisposeError as p, RuntimeOptions as r, RuntimeExecutionStartEvent as s, CleanupFailureObserver as t, RuntimeServiceAcquireEvent as u, CompleteExecution as v, ProviderEntry as w, LayerInput as x, CompleteExecutionLayer as y };
|
|
309
|
+
//# sourceMappingURL=index-BSRPIYII.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BSRPIYII.d.mts","names":[],"sources":["../src/internal/variance.ts","../src/internal/missing-dependencies.ts","../src/layer/metadata.ts","../src/layer/inference.ts","../src/layer/layer.ts","../src/layer/errors.ts","../src/runtime/observer.ts","../src/runtime/outcome.ts"],"mappings":"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"}
|