@overkill-dev/resources 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/package.json +35 -6
- package/packages/resources/resources.entry-point.d.ts +22 -0
- package/packages/resources/resources.entry-point.d.ts.map +1 -0
- package/packages/resources/resources.entry-point.js +27 -0
- package/packages/resources/resources.entry-point.js.map +1 -0
- package/readme.md +139 -5
- package/resources/local-service-resource.d.ts +55 -0
- package/resources/local-service-resource.d.ts.map +1 -0
- package/resources/local-service-resource.js +66 -0
- package/resources/local-service-resource.js.map +1 -0
- package/resources/resource-definition-shape.d.ts +53 -0
- package/resources/resource-definition-shape.d.ts.map +1 -0
- package/resources/resource-graph.d.ts +23 -0
- package/resources/resource-graph.d.ts.map +1 -0
- package/resources/resource-graph.js +151 -0
- package/resources/resource-graph.js.map +1 -0
- package/resources/resource-lifecycle-error.d.ts +19 -0
- package/resources/resource-lifecycle-error.d.ts.map +1 -0
- package/resources/resource-lifecycle-error.js +32 -0
- package/resources/resource-lifecycle-error.js.map +1 -0
- package/resources/resource-session.d.ts +28 -0
- package/resources/resource-session.d.ts.map +1 -0
- package/resources/resource-session.js +182 -0
- package/resources/resource-session.js.map +1 -0
- package/resources/resources.d.ts +149 -0
- package/resources/resources.d.ts.map +1 -0
- package/resources/resources.js +99 -0
- package/resources/resources.js.map +1 -0
- package/resources/runtime-definition.d.ts +23 -0
- package/resources/runtime-definition.d.ts.map +1 -0
- package/resources/runtime-definition.js +19 -0
- package/resources/runtime-definition.js.map +1 -0
- package/resources/runtime-lifecycle.d.ts +14 -0
- package/resources/runtime-lifecycle.d.ts.map +1 -0
- package/resources/runtime-lifecycle.js +83 -0
- package/resources/runtime-lifecycle.js.map +1 -0
- package/resources/runtime-matrix-definition.d.ts +53 -0
- package/resources/runtime-matrix-definition.d.ts.map +1 -0
- package/resources/runtime-matrix-definition.js +159 -0
- package/resources/runtime-matrix-definition.js.map +1 -0
- package/resources/simulated-http-server-resource.d.ts +14 -0
- package/resources/simulated-http-server-resource.d.ts.map +1 -0
- package/resources/simulated-http-server-resource.js +26 -0
- package/resources/simulated-http-server-resource.js.map +1 -0
- package/sbom.cdx.json +50 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { isDefinedResource } from "./resources.js";
|
|
2
|
+
import { resourceLifecycleError } from "./resource-lifecycle-error.js";
|
|
3
|
+
const perRunScopeRank = 0;
|
|
4
|
+
const perFileScopeRank = 1;
|
|
5
|
+
const perSuiteScopeRank = 2;
|
|
6
|
+
const sharedPerWorkerScopeRank = 3;
|
|
7
|
+
const perCaseScopeRank = 4;
|
|
8
|
+
export function resourceEntries(resources) {
|
|
9
|
+
return Object.entries(resources);
|
|
10
|
+
}
|
|
11
|
+
function scopeDescription(scope) {
|
|
12
|
+
return scope === 'per-case'
|
|
13
|
+
? 'per-case scope'
|
|
14
|
+
: `${scope} scope, which direct execution wrappers do not support yet`;
|
|
15
|
+
}
|
|
16
|
+
function scopeRank(scope) {
|
|
17
|
+
if (scope === 'per-run') {
|
|
18
|
+
return perRunScopeRank;
|
|
19
|
+
}
|
|
20
|
+
if (scope === 'per-file') {
|
|
21
|
+
return perFileScopeRank;
|
|
22
|
+
}
|
|
23
|
+
if (scope === 'per-suite') {
|
|
24
|
+
return perSuiteScopeRank;
|
|
25
|
+
}
|
|
26
|
+
if (scope === 'shared-per-worker') {
|
|
27
|
+
return sharedPerWorkerScopeRank;
|
|
28
|
+
}
|
|
29
|
+
return perCaseScopeRank;
|
|
30
|
+
}
|
|
31
|
+
function dependencyScopeAllowed(resource, dependency) {
|
|
32
|
+
const resourceScope = resource.scope;
|
|
33
|
+
const dependencyScope = dependency.scope;
|
|
34
|
+
if (dependencyScope === 'shared-per-worker') {
|
|
35
|
+
return resource.scope === 'shared-per-worker' || resource.scope === 'per-case';
|
|
36
|
+
}
|
|
37
|
+
if (resourceScope === 'shared-per-worker') {
|
|
38
|
+
return dependency.scope === 'per-run' || dependency.scope === 'shared-per-worker';
|
|
39
|
+
}
|
|
40
|
+
return scopeRank(dependencyScope) <= scopeRank(resourceScope);
|
|
41
|
+
}
|
|
42
|
+
function hasCallableResourceCallbacks(resource) {
|
|
43
|
+
return isDefinedResource(resource) && typeof resource.acquire === 'function';
|
|
44
|
+
}
|
|
45
|
+
export function callableResourceDefinition(resource) {
|
|
46
|
+
if (hasCallableResourceCallbacks(resource)) {
|
|
47
|
+
return resource;
|
|
48
|
+
}
|
|
49
|
+
throw resourceLifecycleError('Resource descriptor is invalid.', [
|
|
50
|
+
{ cause: resource, phase: 'graph', resourceName: 'resource' }
|
|
51
|
+
], resource);
|
|
52
|
+
}
|
|
53
|
+
function assertUniqueResourceName(descriptorsByName, resource) {
|
|
54
|
+
const descriptorForName = descriptorsByName.get(resource.name);
|
|
55
|
+
if (descriptorForName !== undefined && descriptorForName !== resource) {
|
|
56
|
+
throw resourceLifecycleError(`Resource name "${resource.name}" is used by multiple descriptors.`, [
|
|
57
|
+
{ cause: resource, phase: 'graph', resourceName: resource.name }
|
|
58
|
+
], resource);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function assertResourceAcyclic(traversal, resource, path) {
|
|
62
|
+
if (traversal.has(resource)) {
|
|
63
|
+
throw resourceLifecycleError(`Resource dependency cycle detected: ${path.join(' -> ')}.`, [
|
|
64
|
+
{ cause: resource, phase: 'graph', resourceName: resource.name }
|
|
65
|
+
], resource);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function createResourceGraphBuilder() {
|
|
69
|
+
const descriptorsByName = new Map();
|
|
70
|
+
const nodesByDescriptor = new Map();
|
|
71
|
+
const order = [];
|
|
72
|
+
const traversal = new Set();
|
|
73
|
+
const builder = {
|
|
74
|
+
assertAcyclic(resource, path) {
|
|
75
|
+
assertResourceAcyclic(traversal, resource, path);
|
|
76
|
+
},
|
|
77
|
+
assertUniqueName(resource) {
|
|
78
|
+
assertUniqueResourceName(descriptorsByName, resource);
|
|
79
|
+
descriptorsByName.set(resource.name, resource);
|
|
80
|
+
},
|
|
81
|
+
build(resources) {
|
|
82
|
+
const topLevelEntries = resourceEntries(resources);
|
|
83
|
+
for (const [, resource] of topLevelEntries) {
|
|
84
|
+
builder.visit(resource, [resource.name]);
|
|
85
|
+
}
|
|
86
|
+
return { order, topLevelEntries };
|
|
87
|
+
},
|
|
88
|
+
record(resource, path) {
|
|
89
|
+
traversal.add(resource);
|
|
90
|
+
const dependencies = resourceEntries(resource.dependencies).map(function visitDependency([, dependency]) {
|
|
91
|
+
return builder.visit(dependency, [...path, dependency.name]);
|
|
92
|
+
});
|
|
93
|
+
const node = { dependencies, descriptor: resource };
|
|
94
|
+
traversal.delete(resource);
|
|
95
|
+
nodesByDescriptor.set(resource, node);
|
|
96
|
+
order.push(node);
|
|
97
|
+
return node;
|
|
98
|
+
},
|
|
99
|
+
visit(resource, path) {
|
|
100
|
+
const callableResource = callableResourceDefinition(resource);
|
|
101
|
+
const existingNode = nodesByDescriptor.get(callableResource);
|
|
102
|
+
builder.assertUniqueName(callableResource);
|
|
103
|
+
builder.assertAcyclic(callableResource, path);
|
|
104
|
+
if (existingNode !== undefined) {
|
|
105
|
+
return existingNode;
|
|
106
|
+
}
|
|
107
|
+
return builder.record(callableResource, path);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
return builder;
|
|
111
|
+
}
|
|
112
|
+
export function createResourceGraph(resources) {
|
|
113
|
+
return createResourceGraphBuilder().build(resources);
|
|
114
|
+
}
|
|
115
|
+
export function assertPerCaseResourceGraph(resources) {
|
|
116
|
+
const graph = createResourceGraph(resources);
|
|
117
|
+
const nonPerCaseResource = graph.order.find(function hasBroaderScope(node) {
|
|
118
|
+
return node.descriptor.scope !== 'per-case';
|
|
119
|
+
});
|
|
120
|
+
if (nonPerCaseResource === undefined) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
throw resourceLifecycleError(`Resource "${nonPerCaseResource.descriptor.name}" uses ${scopeDescription(nonPerCaseResource.descriptor.scope)}.`, [
|
|
124
|
+
{
|
|
125
|
+
cause: nonPerCaseResource.descriptor,
|
|
126
|
+
phase: 'graph',
|
|
127
|
+
resourceName: nonPerCaseResource.descriptor.name
|
|
128
|
+
}
|
|
129
|
+
], nonPerCaseResource.descriptor);
|
|
130
|
+
}
|
|
131
|
+
export function assertResourceDependencyScopes(resources) {
|
|
132
|
+
const graph = createResourceGraph(resources);
|
|
133
|
+
for (const node of graph.order) {
|
|
134
|
+
for (const dependency of node.dependencies) {
|
|
135
|
+
if (!dependencyScopeAllowed(node.descriptor, dependency.descriptor)) {
|
|
136
|
+
throw resourceLifecycleError([
|
|
137
|
+
`Resource "${node.descriptor.name}" uses ${node.descriptor.scope} scope and cannot depend on`,
|
|
138
|
+
`resource "${dependency.descriptor.name}" with ${dependency.descriptor.scope} scope.`
|
|
139
|
+
]
|
|
140
|
+
.join(' '), [
|
|
141
|
+
{
|
|
142
|
+
cause: dependency.descriptor,
|
|
143
|
+
phase: 'graph',
|
|
144
|
+
resourceName: node.descriptor.name
|
|
145
|
+
}
|
|
146
|
+
], dependency.descriptor);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=resource-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-graph.js","sourceRoot":"","sources":["../../../../source/resources/resource-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type ResourceLifecyclePhase = 'acquire' | 'dispose' | 'graph';
|
|
2
|
+
export type ResourceLifecycleFailure = {
|
|
3
|
+
readonly cause: unknown;
|
|
4
|
+
readonly phase: ResourceLifecyclePhase;
|
|
5
|
+
readonly resourceName: string;
|
|
6
|
+
};
|
|
7
|
+
type ResourceLifecycleErrorOptions = {
|
|
8
|
+
readonly cause: unknown;
|
|
9
|
+
readonly failures: readonly ResourceLifecycleFailure[];
|
|
10
|
+
};
|
|
11
|
+
export declare class ResourceLifecycleError extends Error {
|
|
12
|
+
private readonly lifecycleFailures;
|
|
13
|
+
constructor(message: string, options: ResourceLifecycleErrorOptions);
|
|
14
|
+
failures(): readonly ResourceLifecycleFailure[];
|
|
15
|
+
}
|
|
16
|
+
export declare function resourceLifecycleError(message: string, failures: readonly ResourceLifecycleFailure[], cause: unknown): ResourceLifecycleError;
|
|
17
|
+
export declare function lifecycleFailures(results: readonly PromiseSettledResult<unknown>[], fallbackResourceName: string): readonly ResourceLifecycleFailure[];
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=resource-lifecycle-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-lifecycle-error.d.ts","sourceRoot":"","sources":["../../../../source/resources/resource-lifecycle-error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,KAAK,6BAA6B,GAAG;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC1D,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,KAAK;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;gBAGpE,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,6BAA6B;IAOnC,QAAQ,IAAI,SAAS,wBAAwB,EAAE;CAGzD;AAED,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,wBAAwB,EAAE,EAC7C,KAAK,EAAE,OAAO,GACf,sBAAsB,CAExB;AAUD,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,SAAS,oBAAoB,CAAC,OAAO,CAAC,EAAE,EACjD,oBAAoB,EAAE,MAAM,GAC7B,SAAS,wBAAwB,EAAE,CAYrC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class ResourceLifecycleError extends Error {
|
|
2
|
+
lifecycleFailures;
|
|
3
|
+
constructor(message, options) {
|
|
4
|
+
super(message, options);
|
|
5
|
+
this.name = 'ResourceLifecycleError';
|
|
6
|
+
this.lifecycleFailures = options.failures;
|
|
7
|
+
}
|
|
8
|
+
failures() {
|
|
9
|
+
return this.lifecycleFailures;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function resourceLifecycleError(message, failures, cause) {
|
|
13
|
+
return new ResourceLifecycleError(message, { cause, failures });
|
|
14
|
+
}
|
|
15
|
+
function lifecycleFailuresFrom(reason, fallbackResourceName) {
|
|
16
|
+
if (reason instanceof ResourceLifecycleError) {
|
|
17
|
+
return reason.failures();
|
|
18
|
+
}
|
|
19
|
+
return [{ cause: reason, phase: 'acquire', resourceName: fallbackResourceName }];
|
|
20
|
+
}
|
|
21
|
+
export function lifecycleFailures(results, fallbackResourceName) {
|
|
22
|
+
const failures = new Set();
|
|
23
|
+
for (const result of results) {
|
|
24
|
+
if (result.status === 'rejected') {
|
|
25
|
+
for (const failure of lifecycleFailuresFrom(result.reason, fallbackResourceName)) {
|
|
26
|
+
failures.add(failure);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return Array.from(failures);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=resource-lifecycle-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-lifecycle-error.js","sourceRoot":"","sources":["../../../../source/resources/resource-lifecycle-error.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC5B,iBAAiB,CAAsC;IAExE,YACI,OAAe,EACf,OAAsC;QAEtC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9C,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,UAAU,sBAAsB,CAClC,OAAe,EACf,QAA6C,EAC7C,KAAc;IAEd,OAAO,IAAI,sBAAsB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAe,EAAE,oBAA4B;IACxE,IAAI,MAAM,YAAY,sBAAsB,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,CAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAE,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC7B,OAAiD,EACjD,oBAA4B;IAE5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAErD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,KAAK,MAAM,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,CAAC;gBAC/E,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AnyResourceDefinition, ResourceContext, ResourceDependencies } from './resources.ts';
|
|
2
|
+
import { type ResourceNode } from './resource-graph.ts';
|
|
3
|
+
import { type ResourceLifecycleFailure } from './resource-lifecycle-error.ts';
|
|
4
|
+
type ResourceAcquisitionContext = {
|
|
5
|
+
readonly acquisitionFailureMessage: string;
|
|
6
|
+
readonly fallbackResourceName: string;
|
|
7
|
+
};
|
|
8
|
+
export type StartResourcesRequest<Resources extends ResourceDependencies> = {
|
|
9
|
+
readonly resources: Resources;
|
|
10
|
+
readonly signal: AbortSignal;
|
|
11
|
+
};
|
|
12
|
+
export type ResourceSessionDisposalContext = {
|
|
13
|
+
readonly signal: AbortSignal;
|
|
14
|
+
};
|
|
15
|
+
export type ResourceSession<Resources extends ResourceDependencies> = AsyncDisposable & {
|
|
16
|
+
readonly context: ResourceContext<Resources>;
|
|
17
|
+
readonly disposeOnce: (context: ResourceSessionDisposalContext) => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
export declare function disposeResources(order: readonly ResourceNode[], handles: ReadonlyMap<AnyResourceDefinition, unknown>, signal: AbortSignal): Promise<readonly ResourceLifecycleFailure[]>;
|
|
20
|
+
export declare function runtimeAsyncDisposeSymbol(): symbol;
|
|
21
|
+
export declare function acquireResourceGraph<Resources extends ResourceDependencies>(request: StartResourcesRequest<Resources>, context: ResourceAcquisitionContext): Promise<{
|
|
22
|
+
readonly context: ResourceContext<Resources>;
|
|
23
|
+
readonly handles: ReadonlyMap<AnyResourceDefinition, unknown>;
|
|
24
|
+
readonly order: readonly ResourceNode[];
|
|
25
|
+
}>;
|
|
26
|
+
export declare function startResources<Resources extends ResourceDependencies>(request: StartResourcesRequest<Resources>): Promise<ResourceSession<Resources>>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=resource-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-session.d.ts","sourceRoot":"","sources":["../../../../source/resources/resource-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,qBAAqB,EAErB,eAAe,EAEf,oBAAoB,EAEvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAMH,KAAK,YAAY,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGH,KAAK,wBAAwB,EAChC,MAAM,+BAA+B,CAAC;AASvC,KAAK,0BAA0B,GAAG;IAC9B,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACzC,CAAC;AAiBF,MAAM,MAAM,qBAAqB,CAAC,SAAS,SAAS,oBAAoB,IAAI;IACxE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IACzC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,SAAS,SAAS,oBAAoB,IAAI,eAAe,GAAG;IACpF,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF,CAAC;AAsDF,wBAAsB,gBAAgB,CAClC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,OAAO,EAAE,WAAW,CAAC,qBAAqB,EAAE,OAAO,CAAC,EACpD,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAY9C;AAuID,wBAAgB,yBAAyB,IAAI,MAAM,CAQlD;AAQD,wBAAsB,oBAAoB,CAAC,SAAS,SAAS,oBAAoB,EAC7E,OAAO,EAAE,qBAAqB,CAAC,SAAS,CAAC,EACzC,OAAO,EAAE,0BAA0B,GACpC,OAAO,CAAC;IACP,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C,CAAC,CASD;AAED,wBAAsB,cAAc,CAAC,SAAS,SAAS,oBAAoB,EACvE,OAAO,EAAE,qBAAqB,CAAC,SAAS,CAAC,GAC1C,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CA4BrC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { callableResourceDefinition, createResourceGraph, resourceEntries } from "./resource-graph.js";
|
|
2
|
+
import { lifecycleFailures, resourceLifecycleError } from "./resource-lifecycle-error.js";
|
|
3
|
+
const directResourceAcquisitionContext = {
|
|
4
|
+
acquisitionFailureMessage: 'Resource acquisition failed.',
|
|
5
|
+
fallbackResourceName: 'resource'
|
|
6
|
+
};
|
|
7
|
+
function acquiredDependencyHandles(dependencies, handles) {
|
|
8
|
+
const context = {};
|
|
9
|
+
for (const [key, resource] of resourceEntries(dependencies)) {
|
|
10
|
+
context[key] = handles.get(resource);
|
|
11
|
+
}
|
|
12
|
+
return Object.freeze(context);
|
|
13
|
+
}
|
|
14
|
+
function acquireResourceHandle(resource, context) {
|
|
15
|
+
return callableResourceDefinition(resource).acquire(context);
|
|
16
|
+
}
|
|
17
|
+
function disposeResourceHandle(dispose, handle, context) {
|
|
18
|
+
return dispose(handle, context);
|
|
19
|
+
}
|
|
20
|
+
async function disposeResource(node, handles, signal) {
|
|
21
|
+
const handle = handles.get(node.descriptor);
|
|
22
|
+
const { dispose } = callableResourceDefinition(node.descriptor);
|
|
23
|
+
if (handle === undefined || dispose === null) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
await disposeResourceHandle(dispose, handle, {
|
|
28
|
+
dependencies: acquiredDependencyHandles(node.descriptor.dependencies, handles),
|
|
29
|
+
signal
|
|
30
|
+
});
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return { cause: error, phase: 'dispose', resourceName: node.descriptor.name };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function disposeResources(order, handles, signal) {
|
|
38
|
+
const failures = [];
|
|
39
|
+
for (const node of order.toReversed()) {
|
|
40
|
+
const failure = await disposeResource(node, handles, signal);
|
|
41
|
+
if (failure !== null) {
|
|
42
|
+
failures.push(failure);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return failures;
|
|
46
|
+
}
|
|
47
|
+
async function disposeResourceSession(order, handles, signal) {
|
|
48
|
+
const failures = await disposeResources(order, handles, signal);
|
|
49
|
+
if (failures.length > 0) {
|
|
50
|
+
throw resourceLifecycleError('Resource disposal failed.', failures, failures[0]?.cause);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function createResourceAcquisition(signal, acquisitionContext) {
|
|
54
|
+
const abortController = new AbortController();
|
|
55
|
+
const acquisitionSignal = AbortSignal.any([signal, abortController.signal]);
|
|
56
|
+
const acquisitions = new Map();
|
|
57
|
+
const handles = new Map();
|
|
58
|
+
const acquisition = {
|
|
59
|
+
async acquire(graph) {
|
|
60
|
+
const results = await Promise.allSettled(graph.topLevelEntries.map(async function acquireTopLevel([, resource]) {
|
|
61
|
+
return await acquisition.resource(resource);
|
|
62
|
+
}));
|
|
63
|
+
const failures = lifecycleFailures(results, acquisitionContext.fallbackResourceName);
|
|
64
|
+
if (failures.length > 0) {
|
|
65
|
+
return await acquisition.failStartup(graph, failures);
|
|
66
|
+
}
|
|
67
|
+
return { handles };
|
|
68
|
+
},
|
|
69
|
+
async dependencies(dependencies) {
|
|
70
|
+
const context = {};
|
|
71
|
+
await Promise.all(resourceEntries(dependencies).map(async function acquireDependency([key, dependency]) {
|
|
72
|
+
context[key] = await acquisition.resource(dependency);
|
|
73
|
+
}));
|
|
74
|
+
return Object.freeze(context);
|
|
75
|
+
},
|
|
76
|
+
async failStartup(graph, failures) {
|
|
77
|
+
abortController.abort(failures[0]?.cause);
|
|
78
|
+
const disposalFailures = await disposeResources(graph.order, handles, signal);
|
|
79
|
+
throw resourceLifecycleError(acquisitionContext.acquisitionFailureMessage, [
|
|
80
|
+
...failures,
|
|
81
|
+
...disposalFailures
|
|
82
|
+
], failures[0]?.cause);
|
|
83
|
+
},
|
|
84
|
+
async resource(resource) {
|
|
85
|
+
const existingAcquisition = acquisitions.get(resource);
|
|
86
|
+
if (existingAcquisition !== undefined) {
|
|
87
|
+
return await existingAcquisition;
|
|
88
|
+
}
|
|
89
|
+
const resourceAcquisition = acquisition.start(resource);
|
|
90
|
+
acquisitions.set(resource, resourceAcquisition);
|
|
91
|
+
return await resourceAcquisition;
|
|
92
|
+
},
|
|
93
|
+
async start(resource) {
|
|
94
|
+
const dependencies = await acquisition.dependencies(resource.dependencies);
|
|
95
|
+
try {
|
|
96
|
+
const handle = await acquireResourceHandle(resource, {
|
|
97
|
+
dependencies,
|
|
98
|
+
signal: acquisitionSignal
|
|
99
|
+
});
|
|
100
|
+
handles.set(resource, handle);
|
|
101
|
+
return handle;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
abortController.abort(error);
|
|
105
|
+
throw resourceLifecycleError(`Resource "${resource.name}" acquisition failed.`, [
|
|
106
|
+
{ cause: error, phase: 'acquire', resourceName: resource.name }
|
|
107
|
+
], error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return acquisition;
|
|
112
|
+
}
|
|
113
|
+
function isResourceContext(context, resources) {
|
|
114
|
+
for (const key of Object.keys(resources)) {
|
|
115
|
+
if (!Object.hasOwn(context, key)) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
function resourceContext(resources, handles) {
|
|
122
|
+
const context = {};
|
|
123
|
+
for (const [key, resource] of resourceEntries(resources)) {
|
|
124
|
+
context[key] = handles.get(resource);
|
|
125
|
+
}
|
|
126
|
+
const frozenContext = Object.freeze(context);
|
|
127
|
+
if (isResourceContext(frozenContext, resources)) {
|
|
128
|
+
return frozenContext;
|
|
129
|
+
}
|
|
130
|
+
throw resourceLifecycleError('Resource context is incomplete.', [
|
|
131
|
+
{ cause: resources, phase: 'graph', resourceName: 'resource' }
|
|
132
|
+
], resources);
|
|
133
|
+
}
|
|
134
|
+
function internalDisposalSignal() {
|
|
135
|
+
const controller = new AbortController();
|
|
136
|
+
return controller.signal;
|
|
137
|
+
}
|
|
138
|
+
export function runtimeAsyncDisposeSymbol() {
|
|
139
|
+
const value = Reflect.get(Symbol, 'asyncDispose');
|
|
140
|
+
if (typeof value !== 'symbol') {
|
|
141
|
+
throw new TypeError('Runtime does not provide Symbol.asyncDispose.');
|
|
142
|
+
}
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
function isResourceSession(session) {
|
|
146
|
+
return Reflect.has(session, runtimeAsyncDisposeSymbol());
|
|
147
|
+
}
|
|
148
|
+
export async function acquireResourceGraph(request, context) {
|
|
149
|
+
const graph = createResourceGraph(request.resources);
|
|
150
|
+
const acquisition = await createResourceAcquisition(request.signal, context).acquire(graph);
|
|
151
|
+
return {
|
|
152
|
+
context: resourceContext(request.resources, acquisition.handles),
|
|
153
|
+
handles: acquisition.handles,
|
|
154
|
+
order: graph.order
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export async function startResources(request) {
|
|
158
|
+
const acquisition = await acquireResourceGraph(request, directResourceAcquisitionContext);
|
|
159
|
+
let disposal = null;
|
|
160
|
+
const session = {
|
|
161
|
+
context: acquisition.context,
|
|
162
|
+
async disposeOnce(disposalContext) {
|
|
163
|
+
if (disposal === null) {
|
|
164
|
+
disposal = disposeResourceSession(acquisition.order, acquisition.handles, disposalContext.signal);
|
|
165
|
+
}
|
|
166
|
+
await disposal;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
Object.defineProperty(session, runtimeAsyncDisposeSymbol(), {
|
|
170
|
+
value: async function disposeResourcesWithInternalSignal() {
|
|
171
|
+
await session.disposeOnce({ signal: internalDisposalSignal() });
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
const frozenSession = Object.freeze(session);
|
|
175
|
+
if (isResourceSession(frozenSession)) {
|
|
176
|
+
return frozenSession;
|
|
177
|
+
}
|
|
178
|
+
throw resourceLifecycleError('Resource session is incomplete.', [
|
|
179
|
+
{ cause: session, phase: 'graph', resourceName: 'resource' }
|
|
180
|
+
], session);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=resource-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-session.js","sourceRoot":"","sources":["../../../../source/resources/resource-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { defineRuntime as createRuntimeDefinition, isDefinedRuntime as isRuntimeDefinition, type RuntimeDefinition as RuntimeDefinitionDescriptor, type RuntimeDefinitionInput as RuntimeDefinitionDescriptorInput, type RuntimeDimensions as RuntimeDimensionMap, type RuntimeId as RuntimeIdentity } from './runtime-definition.ts';
|
|
2
|
+
import { composeRuntimes as composeRuntimeGraphs, defineRuntimeMatrix as createRuntimeMatrixDefinition, isDefinedRuntimeMatrix as isRuntimeMatrixDefinition, type ComposedRuntimeGraph as ComposedRuntimeGraphDescriptor, type RuntimeGraph as RuntimeGraphDescriptor, type RuntimeGraphLeaf as RuntimeGraphLeafDescriptor, type RuntimeMatrixDefinition as RuntimeMatrixDescriptor, type RuntimeMatrixDefinitionInput as RuntimeMatrixDescriptorInput, type SharedRuntimeMatrixDefinitionInput as SharedRuntimeMatrixDescriptorInput, type RuntimeMatrixVariant as RuntimeMatrixVariantDescriptor } from './runtime-matrix-definition.ts';
|
|
3
|
+
import type { AnyResourceDefinition as AnyResourceDefinitionShape, Awaitable as AwaitableShape, EmptyResourceDependencies as EmptyResourceDependenciesShape, ExecutionRequirement as ExecutionRequirementShape, ResourceDependencies as ResourceDependenciesShape, ResourceProjectionPayload as ResourceProjectionPayloadShape, ResourceScope as ResourceScopeShape, RuntimeResourceMap as RuntimeResourceMapShape, ValueOf } from './resource-definition-shape.ts';
|
|
4
|
+
export type AnyResourceDefinition = AnyResourceDefinitionShape;
|
|
5
|
+
export type Awaitable<Value> = AwaitableShape<Value>;
|
|
6
|
+
export type EmptyResourceDependencies = EmptyResourceDependenciesShape;
|
|
7
|
+
export type ExecutionRequirement = ExecutionRequirementShape;
|
|
8
|
+
export type ResourceDependencies = ResourceDependenciesShape;
|
|
9
|
+
export type ResourceProjectionPayload = ResourceProjectionPayloadShape;
|
|
10
|
+
export type ResourceScope = ResourceScopeShape;
|
|
11
|
+
export type RuntimeResourceMap = RuntimeResourceMapShape;
|
|
12
|
+
export declare const defineRuntime: typeof createRuntimeDefinition;
|
|
13
|
+
export declare const isDefinedRuntime: typeof isRuntimeDefinition;
|
|
14
|
+
export declare const isDefinedRuntimeMatrix: typeof isRuntimeMatrixDefinition;
|
|
15
|
+
export declare const composeRuntimes: typeof composeRuntimeGraphs;
|
|
16
|
+
export type RuntimeDefinition<Name extends string = string, Dimensions extends RuntimeDimensionMap = RuntimeDimensionMap, Resources extends RuntimeResourceMap = RuntimeResourceMap> = RuntimeDefinitionDescriptor<Name, Dimensions, Resources>;
|
|
17
|
+
export type RuntimeDefinitionInput<Name extends string, Dimensions extends RuntimeDimensionMap, Resources extends RuntimeResourceMap> = RuntimeDefinitionDescriptorInput<Name, Dimensions, Resources>;
|
|
18
|
+
export type RuntimeDimensions = RuntimeDimensionMap;
|
|
19
|
+
export type RuntimeGraph = RuntimeGraphDescriptor;
|
|
20
|
+
export type RuntimeGraphLeaf = RuntimeGraphLeafDescriptor;
|
|
21
|
+
export type ComposedRuntimeGraph<Runtimes extends readonly RuntimeGraphLeaf[] = readonly RuntimeGraphLeaf[]> = ComposedRuntimeGraphDescriptor<Runtimes>;
|
|
22
|
+
export type RuntimeId<Name extends string = string, Dimensions extends RuntimeDimensions = RuntimeDimensions> = RuntimeIdentity<Name, Dimensions>;
|
|
23
|
+
export type RuntimeMatrixDefinition<Name extends string = string, Variants extends RuntimeMatrixVariantMap = RuntimeMatrixVariantMap> = RuntimeMatrixDescriptor<Name, Variants>;
|
|
24
|
+
export type RuntimeMatrixDefinitionInput<Name extends string, Variants extends Readonly<Record<string, RuntimeDefinition>>> = RuntimeMatrixDescriptorInput<Name, Variants>;
|
|
25
|
+
export type SharedRuntimeMatrixDefinitionInput<Name extends string, Shared, Variants extends Readonly<Record<string, RuntimeDefinition | ((shared: Shared) => RuntimeDefinition)>>> = SharedRuntimeMatrixDescriptorInput<Name, Shared, Variants>;
|
|
26
|
+
export type RuntimeMatrixVariant<VariantId extends string = string, Runtime extends RuntimeDefinition = RuntimeDefinition> = RuntimeMatrixVariantDescriptor<VariantId, Runtime>;
|
|
27
|
+
export type RuntimeMatrixVariantMap = Readonly<Record<string, RuntimeMatrixVariant>>;
|
|
28
|
+
declare const resourceDefinitionBrand: unique symbol;
|
|
29
|
+
export type ResourceProjectionContext<Dependencies extends ResourceDependencies = EmptyResourceDependencies> = {
|
|
30
|
+
readonly dependencies: ResourceContext<Dependencies>;
|
|
31
|
+
};
|
|
32
|
+
export type ResourceHandle<Resource extends AnyResourceDefinition> = Resource extends {
|
|
33
|
+
readonly deserializeHandle?: ((payload: never, context: never) => infer ConsumerHandle) | undefined;
|
|
34
|
+
} ? ConsumerHandle : Awaited<ReturnType<Resource['acquire']>>;
|
|
35
|
+
export type ResourceContext<Resources extends ResourceDependencies> = {
|
|
36
|
+
readonly [Key in keyof Resources]: ResourceHandle<Resources[Key]>;
|
|
37
|
+
};
|
|
38
|
+
export type ResourceCreationContext<Dependencies extends ResourceDependencies = EmptyResourceDependencies> = {
|
|
39
|
+
readonly dependencies: ResourceContext<Dependencies>;
|
|
40
|
+
readonly signal: AbortSignal;
|
|
41
|
+
};
|
|
42
|
+
export type ResourceDisposalContext<Dependencies extends ResourceDependencies = EmptyResourceDependencies> = {
|
|
43
|
+
readonly dependencies: ResourceContext<Dependencies>;
|
|
44
|
+
readonly signal: AbortSignal;
|
|
45
|
+
};
|
|
46
|
+
type ResourceDefinitionBaseInput<Name extends string, Handle, Scope extends ResourceScope, Dependencies extends ResourceDependencies = EmptyResourceDependencies> = {
|
|
47
|
+
readonly acquire: (context: ResourceCreationContext<Dependencies>) => Awaitable<Handle>;
|
|
48
|
+
readonly dependencies?: Dependencies;
|
|
49
|
+
readonly dispose: ((handle: Handle, context: ResourceDisposalContext<Dependencies>) => Awaitable<void>) | null;
|
|
50
|
+
readonly name: Name;
|
|
51
|
+
readonly requirements: readonly ExecutionRequirement[];
|
|
52
|
+
readonly scope: Scope;
|
|
53
|
+
};
|
|
54
|
+
type LocalOnlyResourceDefinitionInput<Name extends string, Handle, Scope extends ResourceScope, Dependencies extends ResourceDependencies = EmptyResourceDependencies> = ResourceDefinitionBaseInput<Name, Handle, Scope, Dependencies> & {
|
|
55
|
+
readonly deserializeHandle?: never;
|
|
56
|
+
readonly serializeHandle?: never;
|
|
57
|
+
};
|
|
58
|
+
type ProjectedResourceDefinitionInput<Name extends string, OwnerHandle, Projection extends ResourceProjectionPayload, ConsumerHandle, Scope extends 'per-file' | 'per-run' | 'per-suite', Dependencies extends ResourceDependencies = EmptyResourceDependencies> = ResourceDefinitionBaseInput<Name, OwnerHandle, Scope, Dependencies> & {
|
|
59
|
+
readonly deserializeHandle: (payload: Projection, context: ResourceProjectionContext<Dependencies>) => ConsumerHandle;
|
|
60
|
+
readonly serializeHandle: (handle: OwnerHandle, context: ResourceProjectionContext<Dependencies>) => Projection;
|
|
61
|
+
};
|
|
62
|
+
export type ResourceDefinitionInput<Name extends string, Handle, Dependencies extends ResourceDependencies = EmptyResourceDependencies, Projection extends ResourceProjectionPayload = ResourceProjectionPayload, ConsumerHandle = Handle> = ValueOf<ResourceDefinitionInputOptions<Name, Handle, Dependencies, Projection, ConsumerHandle>>;
|
|
63
|
+
type ResourceDefinitionInputOptions<Name extends string, Handle, Dependencies extends ResourceDependencies, Projection extends ResourceProjectionPayload, ConsumerHandle> = {
|
|
64
|
+
readonly local: LocalResourceDefinitionInput<Name, Handle, Dependencies>;
|
|
65
|
+
readonly projected: ProjectedResourceInput<Name, Handle, Projection, ConsumerHandle, Dependencies>;
|
|
66
|
+
};
|
|
67
|
+
type LocalResourceDefinitionInput<Name extends string, Handle, Dependencies extends ResourceDependencies> = LocalCaseResourceInput<Name, Handle, Dependencies> | LocalFileResourceInput<Name, Handle, Dependencies>;
|
|
68
|
+
type LocalCaseResourceInput<Name extends string, Handle, Dependencies extends ResourceDependencies> = LocalOnlyResourceDefinitionInput<Name, Handle, 'per-case' | 'shared-per-worker', Dependencies>;
|
|
69
|
+
type LocalFileResourceInput<Name extends string, Handle, Dependencies extends ResourceDependencies> = LocalOnlyResourceDefinitionInput<Name, Handle, 'per-file' | 'per-suite', Dependencies>;
|
|
70
|
+
type ProjectedResourceInput<Name extends string, Handle, Projection extends ResourceProjectionPayload, ConsumerHandle, Dependencies extends ResourceDependencies> = ValueOf<ProjectedResourceInputOptions<Name, Handle, Projection, ConsumerHandle, Dependencies>>;
|
|
71
|
+
type ProjectedResourceInputOptions<Name extends string, Handle, Projection extends ResourceProjectionPayload, ConsumerHandle, Dependencies extends ResourceDependencies> = {
|
|
72
|
+
readonly file: ProjectedFileResourceInput<Name, Handle, Projection, ConsumerHandle, Dependencies>;
|
|
73
|
+
readonly run: ProjectedRunResourceInput<Name, Handle, Projection, ConsumerHandle, Dependencies>;
|
|
74
|
+
};
|
|
75
|
+
type ProjectedFileResourceInput<Name extends string, Handle, Projection extends ResourceProjectionPayload, ConsumerHandle, Dependencies extends ResourceDependencies> = ProjectedResourceDefinitionInput<Name, Handle, Projection, ConsumerHandle, 'per-file' | 'per-suite', Dependencies>;
|
|
76
|
+
type ProjectedRunResourceInput<Name extends string, Handle, Projection extends ResourceProjectionPayload, ConsumerHandle, Dependencies extends ResourceDependencies> = ProjectedResourceDefinitionInput<Name, Handle, Projection, ConsumerHandle, 'per-run', Dependencies>;
|
|
77
|
+
export type ResourceDefinition<Name extends string = string, OwnerHandle = unknown, Dependencies extends ResourceDependencies = ResourceDependencies, ConsumerHandle = OwnerHandle> = {
|
|
78
|
+
readonly acquire: (context: ResourceCreationContext<Dependencies>) => Awaitable<OwnerHandle>;
|
|
79
|
+
readonly dependencies: Dependencies;
|
|
80
|
+
readonly deserializeHandle?: (payload: ResourceProjectionPayload, context: ResourceProjectionContext<Dependencies>) => ConsumerHandle;
|
|
81
|
+
readonly dispose: ((handle: OwnerHandle, context: ResourceDisposalContext<Dependencies>) => Awaitable<void>) | null;
|
|
82
|
+
readonly name: Name;
|
|
83
|
+
readonly requirements: readonly ExecutionRequirement[];
|
|
84
|
+
readonly scope: ResourceScope;
|
|
85
|
+
readonly serializeHandle?: (handle: OwnerHandle, context: ResourceProjectionContext<Dependencies>) => ResourceProjectionPayload;
|
|
86
|
+
readonly [resourceDefinitionBrand]: true;
|
|
87
|
+
};
|
|
88
|
+
type UnionToIntersection<Value> = (Value extends unknown ? (value: Value) => void : never) extends (value: infer Intersection) => void ? Intersection : never;
|
|
89
|
+
type RuntimeGraphName<Graph extends RuntimeGraph> = ComposedRuntimeNames<Graph> | NamedRuntimeGraphName<Graph>;
|
|
90
|
+
type ComposedRuntimeNames<Graph extends RuntimeGraph> = Graph extends ComposedRuntimeGraph<infer Runtimes> ? RuntimeGraphName<Runtimes[number]> : never;
|
|
91
|
+
type NamedRuntimeGraphName<Graph> = Graph extends {
|
|
92
|
+
readonly name: infer Name extends string;
|
|
93
|
+
} ? Name : never;
|
|
94
|
+
type RuntimeMatrixRuntime<Matrix extends RuntimeMatrixDefinition> = Matrix['variants'][keyof Matrix['variants']]['runtime'];
|
|
95
|
+
type RuntimeGraphRuntime<Graph extends RuntimeGraphLeaf> = {
|
|
96
|
+
readonly runtime: Extract<Graph, RuntimeDefinition>;
|
|
97
|
+
readonly 'runtime-matrix': RuntimeMatrixRuntime<Extract<Graph, RuntimeMatrixDefinition>>;
|
|
98
|
+
}[Graph['kind']];
|
|
99
|
+
type RuntimeGraphResources<Runtime extends RuntimeGraphLeaf> = RuntimeGraphRuntime<Runtime>['resources'];
|
|
100
|
+
export type RuntimeContext<Runtime extends RuntimeGraphLeaf> = {
|
|
101
|
+
readonly [Key in keyof RuntimeGraphResources<Runtime>]: ResourceHandle<RuntimeGraphResources<Runtime>[Key]>;
|
|
102
|
+
};
|
|
103
|
+
export type RuntimeGraphContext<Graph extends RuntimeGraph> = Graph extends ComposedRuntimeGraph ? RuntimeScopeContext<Graph> : RuntimeContext<Extract<Graph, RuntimeGraphLeaf>>;
|
|
104
|
+
export type RuntimeScopeContext<Runtime extends RuntimeGraph> = Readonly<Runtime extends ComposedRuntimeGraph<infer Runtimes> ? UnionToIntersection<RuntimeScopeContext<Runtimes[number]>> : Record<RuntimeGraphName<Runtime>, RuntimeContext<Extract<Runtime, RuntimeGraphLeaf>>>>;
|
|
105
|
+
type EmptyRuntimeScopes = Pick<Readonly<Record<string, never>>, never>;
|
|
106
|
+
type RuntimeScopeKey<Runtime extends RuntimeGraph> = RuntimeGraphName<Runtime>;
|
|
107
|
+
type RuntimeScopes<Context> = Context extends {
|
|
108
|
+
readonly runtimes: infer Runtimes extends Readonly<Record<string, unknown>>;
|
|
109
|
+
} ? Runtimes : EmptyRuntimeScopes;
|
|
110
|
+
type RuntimeScopeGuard<Context, Runtime extends RuntimeGraph> = Extract<RuntimeScopeKey<Runtime>, keyof RuntimeScopes<Context>> extends never ? unknown : never;
|
|
111
|
+
type RuntimeScopeBaseContext<Context> = {
|
|
112
|
+
readonly [Key in keyof Context as Key extends 'runtimes' ? never : Key]: Context[Key];
|
|
113
|
+
};
|
|
114
|
+
type ComposedRuntimeScopes<BaseContext, Runtime extends RuntimeGraph> = {
|
|
115
|
+
readonly runtimes: RuntimeScopeContext<Runtime> & RuntimeScopes<BaseContext>;
|
|
116
|
+
};
|
|
117
|
+
export type RuntimeContextComposition<BaseContext, Runtime extends RuntimeGraph> = Readonly<ComposedRuntimeScopes<BaseContext, Runtime> & RuntimeScopeBaseContext<BaseContext>>;
|
|
118
|
+
export type TemporaryDirectoryHandle = {
|
|
119
|
+
readonly path: string;
|
|
120
|
+
};
|
|
121
|
+
export type ResourcesModuleDependencies = {
|
|
122
|
+
readonly createTemporaryDirectory: (pathPrefix: string) => Awaitable<string>;
|
|
123
|
+
readonly removeDirectory: (path: string) => Awaitable<void>;
|
|
124
|
+
readonly temporaryDirectoryPathPrefix: string;
|
|
125
|
+
};
|
|
126
|
+
type CreateTemporaryDirectoryResource = <const Name extends string>(name: Name) => ResourceDefinition<Name, TemporaryDirectoryHandle, EmptyResourceDependencies>;
|
|
127
|
+
export type ResourcesModule = {
|
|
128
|
+
readonly composeRuntimeContext: typeof composeRuntimeContext;
|
|
129
|
+
readonly createTemporaryDirectoryResource: CreateTemporaryDirectoryResource;
|
|
130
|
+
readonly defineResource: typeof defineResource;
|
|
131
|
+
readonly defineRuntime: typeof defineRuntime;
|
|
132
|
+
readonly defineRuntimeMatrix: typeof createRuntimeMatrixDefinition;
|
|
133
|
+
readonly composeRuntimes: typeof composeRuntimeGraphs;
|
|
134
|
+
};
|
|
135
|
+
export declare function defineResource<const Name extends string, Handle, Scope extends Exclude<ResourceScope, 'per-run'>>(definition: LocalOnlyResourceDefinitionInput<Name, Handle, Scope>): ResourceDefinition<Name, Handle, EmptyResourceDependencies>;
|
|
136
|
+
export declare function defineResource<const Name extends string, OwnerHandle, Projection extends ResourceProjectionPayload, ConsumerHandle, Scope extends 'per-file' | 'per-run' | 'per-suite'>(definition: ProjectedResourceDefinitionInput<Name, OwnerHandle, Projection, ConsumerHandle, Scope>): ResourceDefinition<Name, OwnerHandle, EmptyResourceDependencies, ConsumerHandle>;
|
|
137
|
+
export declare function defineResource<const Name extends string, Handle, Scope extends Exclude<ResourceScope, 'per-run'>, const Dependencies extends ResourceDependencies>(definition: LocalOnlyResourceDefinitionInput<Name, Handle, Scope, Dependencies> & {
|
|
138
|
+
readonly dependencies: Dependencies;
|
|
139
|
+
}): ResourceDefinition<Name, Handle, Dependencies>;
|
|
140
|
+
export declare function defineResource<const Name extends string, OwnerHandle, Projection extends ResourceProjectionPayload, ConsumerHandle, Scope extends 'per-file' | 'per-run' | 'per-suite', const Dependencies extends ResourceDependencies>(definition: ProjectedResourceDefinitionInput<Name, OwnerHandle, Projection, ConsumerHandle, Scope, Dependencies> & {
|
|
141
|
+
readonly dependencies: Dependencies;
|
|
142
|
+
}): ResourceDefinition<Name, OwnerHandle, Dependencies, ConsumerHandle>;
|
|
143
|
+
declare function composeRuntimeContext<BaseContext extends Readonly<Record<string, unknown>>, Runtime extends RuntimeGraph>(context: BaseContext & RuntimeScopeGuard<BaseContext, Runtime>, runtime: Runtime, resourceHandles: RuntimeGraphContext<Runtime>): RuntimeContextComposition<BaseContext, Runtime>;
|
|
144
|
+
export declare function createResourcesModule(dependencies: ResourcesModuleDependencies): ResourcesModule;
|
|
145
|
+
export declare function isDefinedResource(resource: unknown): resource is AnyResourceDefinition;
|
|
146
|
+
export declare function isDefinedRuntimeGraph(runtime: unknown): runtime is RuntimeGraph;
|
|
147
|
+
export declare function runtimeGraphLeaves(runtime: RuntimeGraph): readonly RuntimeGraphLeaf[];
|
|
148
|
+
export {};
|
|
149
|
+
//# sourceMappingURL=resources.d.ts.map
|