@decohere/crucible 0.0.1-dev.3 → 0.0.1-dev.31
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/commonjs/src/const.js +33 -0
- package/commonjs/src/decorators/index.js +21 -0
- package/commonjs/src/decorators/inject.decorator.js +27 -0
- package/commonjs/src/decorators/injectable.dectorator.js +16 -0
- package/commonjs/src/index.js +22 -0
- package/commonjs/src/models/registration-key.model.js +31 -0
- package/commonjs/src/models/service-registration.model.js +30 -0
- package/commonjs/src/services/crucible-builder.js +68 -0
- package/commonjs/src/services/crucible.js +165 -0
- package/commonjs/src/services/index.js +21 -0
- package/commonjs/src/services/service-registry.js +50 -0
- package/commonjs/src/types/errors.js +29 -0
- package/commonjs/src/types/index.js +20 -0
- package/commonjs/src/types/types.js +6 -0
- package/{src → es6/src}/decorators/inject.decorator.js +2 -2
- package/es6/src/services/crucible.js +155 -0
- package/package.json +3 -3
- package/types/src/const.d.ts +9 -0
- package/types/src/decorators/index.d.ts +2 -0
- package/types/src/decorators/inject.decorator.d.ts +5 -0
- package/types/src/decorators/injectable.dectorator.d.ts +1 -0
- package/types/src/index.d.ts +3 -0
- package/types/src/models/registration-key.model.d.ts +7 -0
- package/types/src/models/service-registration.model.d.ts +11 -0
- package/types/src/services/crucible-builder.d.ts +26 -0
- package/types/src/services/crucible.d.ts +31 -0
- package/types/src/services/index.d.ts +2 -0
- package/types/src/services/service-registry.d.ts +16 -0
- package/types/src/types/errors.d.ts +6 -0
- package/types/src/types/index.d.ts +1 -0
- package/types/src/types/types.d.ts +1 -0
- package/src/services/crucible.js +0 -133
- package/tests/container.spec.js +0 -259
- /package/{src → es6/src}/const.js +0 -0
- /package/{src → es6/src}/decorators/index.js +0 -0
- /package/{src → es6/src}/decorators/injectable.dectorator.js +0 -0
- /package/{src → es6/src}/index.js +0 -0
- /package/{src → es6/src}/models/registration-key.model.js +0 -0
- /package/{src → es6/src}/models/service-registration.model.js +0 -0
- /package/{src → es6/src}/services/crucible-builder.js +0 -0
- /package/{src → es6/src}/services/index.js +0 -0
- /package/{src → es6/src}/services/service-registry.js +0 -0
- /package/{src → es6/src}/types/errors.js +0 -0
- /package/{src → es6/src}/types/index.js +0 -0
- /package/{src → es6/src}/types/types.js +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { getMeta, isArrayType, isConstructable, ReflectionMeta } from "@decohere/nexus/reflection";
|
|
2
|
+
import { scribe } from "@decohere/scribe";
|
|
3
|
+
import { CrucibleMeta, LifetimeScopeToken, Scopes } from "../const.js";
|
|
4
|
+
import { RegistrationKey } from "../models/registration-key.model.js";
|
|
5
|
+
import { DuplicateScopeError, ResolveError } from "../types/errors.js";
|
|
6
|
+
import { ServiceRegistry } from "./service-registry.js";
|
|
7
|
+
export class Crucible {
|
|
8
|
+
key;
|
|
9
|
+
instances = new Map();
|
|
10
|
+
serviceRegistry;
|
|
11
|
+
rootScope;
|
|
12
|
+
scopes = new Map();
|
|
13
|
+
logger = scribe.logger(Crucible.name);
|
|
14
|
+
isDisposed = false;
|
|
15
|
+
constructor(options){
|
|
16
|
+
this.key = options?.key;
|
|
17
|
+
this.serviceRegistry = new ServiceRegistry(options?.serviceRegistry);
|
|
18
|
+
this.registerLifetimeScope();
|
|
19
|
+
this.rootScope = options?.rootScope ?? this;
|
|
20
|
+
}
|
|
21
|
+
resolveMany(resolveRequest) {
|
|
22
|
+
const key = new RegistrationKey(resolveRequest);
|
|
23
|
+
const registrations = this.getRegistrationFrom(key) ?? [];
|
|
24
|
+
const services = Array.of();
|
|
25
|
+
for (const registration of registrations){
|
|
26
|
+
const service = this.resolveRegistration(registration);
|
|
27
|
+
services.push(service);
|
|
28
|
+
}
|
|
29
|
+
return services;
|
|
30
|
+
}
|
|
31
|
+
resolve(resolveRequest) {
|
|
32
|
+
const key = new RegistrationKey(resolveRequest);
|
|
33
|
+
const registration = this.getRegistrationFrom(key);
|
|
34
|
+
if (registration == null) {
|
|
35
|
+
this.logger.warn(`Cannot resolve dependency ${key.toString()}`);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (registration.length > 1) {
|
|
39
|
+
throw new ResolveError(`There are multiple services registered with key ${key.toString()}. Use resolveMany to resolve all implementations.`);
|
|
40
|
+
}
|
|
41
|
+
const service = this.resolveRegistration(registration[0]);
|
|
42
|
+
return service;
|
|
43
|
+
}
|
|
44
|
+
beginScope(name) {
|
|
45
|
+
if (this.scopes.has(name)) {
|
|
46
|
+
throw new DuplicateScopeError(`Cannot create duplicate scope. Scope with ${name} is already created and has not been disposed.`);
|
|
47
|
+
}
|
|
48
|
+
const scope = new Crucible({
|
|
49
|
+
key: name,
|
|
50
|
+
serviceRegistry: this.serviceRegistry,
|
|
51
|
+
rootScope: this
|
|
52
|
+
});
|
|
53
|
+
this.scopes.set(name, scope);
|
|
54
|
+
return scope;
|
|
55
|
+
}
|
|
56
|
+
[Symbol.dispose]() {
|
|
57
|
+
if (this.isDisposed) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.disposeSync();
|
|
61
|
+
}
|
|
62
|
+
async [Symbol.asyncDispose]() {
|
|
63
|
+
if (this.isDisposed) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await this.disposeAsync();
|
|
67
|
+
}
|
|
68
|
+
disposeSync() {
|
|
69
|
+
if (this.isDisposed) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.isDisposed = true;
|
|
73
|
+
for (const [, inst] of this.instances){
|
|
74
|
+
if (inst === this) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
inst[Symbol.dispose]?.();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async disposeAsync() {
|
|
81
|
+
if (this.isDisposed) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.isDisposed = true;
|
|
85
|
+
for (const [, inst] of this.instances){
|
|
86
|
+
if (inst === this) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (Symbol.asyncDispose in inst) {
|
|
90
|
+
await inst[Symbol.asyncDispose]();
|
|
91
|
+
} else {
|
|
92
|
+
inst[Symbol.dispose]?.();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
getRegistrationFrom(key) {
|
|
97
|
+
const registration = this.serviceRegistry.getRegistration(key.value);
|
|
98
|
+
return registration;
|
|
99
|
+
}
|
|
100
|
+
resolveRegistration(registration) {
|
|
101
|
+
const { scope } = registration;
|
|
102
|
+
switch(scope){
|
|
103
|
+
case Scopes.transient:
|
|
104
|
+
return this.createInstance(registration);
|
|
105
|
+
case Scopes.singleton:
|
|
106
|
+
return this.rootScope.getOrCreateInstance(registration);
|
|
107
|
+
case Scopes.request:
|
|
108
|
+
return this.getOrCreateInstance(registration);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
getOrCreateInstance(registration) {
|
|
112
|
+
if (this.isDisposed) {
|
|
113
|
+
throw new Error("This continer has been disposed");
|
|
114
|
+
}
|
|
115
|
+
const { key, type, isInstance } = registration;
|
|
116
|
+
const cacheKey = isInstance ? key.value : type;
|
|
117
|
+
const existingInstance = this.instances.get(cacheKey);
|
|
118
|
+
if (existingInstance != null) {
|
|
119
|
+
return existingInstance;
|
|
120
|
+
}
|
|
121
|
+
const instance = isInstance ? type : this.createInstance(registration);
|
|
122
|
+
this.instances.set(cacheKey, instance);
|
|
123
|
+
return instance;
|
|
124
|
+
}
|
|
125
|
+
createInstance(registration) {
|
|
126
|
+
const type = registration.type;
|
|
127
|
+
const canConstruct = isConstructable(type);
|
|
128
|
+
const deps = this.resolveDependencies(type);
|
|
129
|
+
const inst = canConstruct ? new type(...deps) : type();
|
|
130
|
+
return inst;
|
|
131
|
+
}
|
|
132
|
+
resolveDependencies(type) {
|
|
133
|
+
const params = getMeta(ReflectionMeta.paramtypes, type) ?? [];
|
|
134
|
+
const injectTokens = getMeta(CrucibleMeta.injecttoken, type) ?? new Map();
|
|
135
|
+
//TODO: put a try catch here so we can throw the name of the service
|
|
136
|
+
let resolved = [];
|
|
137
|
+
for(let i = 0; i < params.length; i++){
|
|
138
|
+
const token = injectTokens.get(i)?.key ?? params[i].name;
|
|
139
|
+
const dep = isArrayType(params[i]) ? this.resolveMany(token) : this.resolve(token);
|
|
140
|
+
resolved = [
|
|
141
|
+
...resolved,
|
|
142
|
+
dep
|
|
143
|
+
];
|
|
144
|
+
}
|
|
145
|
+
return resolved;
|
|
146
|
+
}
|
|
147
|
+
registerLifetimeScope() {
|
|
148
|
+
this.serviceRegistry.registerType(Scopes.request, {
|
|
149
|
+
typeOrKey: LifetimeScopeToken,
|
|
150
|
+
typeOrInstance: this
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHR0eXBlIENvbnN0cnVjdGFibGUsXG5cdHR5cGUgRnVuY3Rpb25UeXBlLFxuXHRnZXRNZXRhLFxuXHRpc0FycmF5VHlwZSxcblx0aXNDb25zdHJ1Y3RhYmxlLFxuXHRSZWZsZWN0aW9uTWV0YSxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhLCBMaWZldGltZVNjb3BlVG9rZW4sIFNjb3BlcyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25NZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbktleSB9IGZyb20gXCIuLi9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVnaXN0cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZXJ2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRHVwbGljYXRlU2NvcGVFcnJvciwgUmVzb2x2ZUVycm9yIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGFpbmVyLCBMaWZldGltZVNjb3BlLCBSZXNvbHZlUmVxdWVzdCB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENydWNpYmxlT3B0aW9ucyA9IHtcblx0a2V5Pzogc3RyaW5nO1xuXHRyb290U2NvcGU/OiBDcnVjaWJsZTtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGUgaW1wbGVtZW50cyBJQ29udGFpbmVyIHtcblx0cHVibGljIGtleTogc3RyaW5nO1xuXHRwcm90ZWN0ZWQgaW5zdGFuY2VzID0gbmV3IE1hcDx1bmtub3duLCBvYmplY3Q+KCk7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHByaXZhdGUgcm9vdFNjb3BlOiBDcnVjaWJsZTtcblx0cHJpdmF0ZSBzY29wZXMgPSBuZXcgTWFwPHN0cmluZywgTGlmZXRpbWVTY29wZT4oKTtcblx0cHJpdmF0ZSBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKENydWNpYmxlLm5hbWUpO1xuXHRwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDcnVjaWJsZU9wdGlvbnMpIHtcblx0XHR0aGlzLmtleSA9IG9wdGlvbnM/LmtleTtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG5ldyBTZXJ2aWNlUmVnaXN0cnkob3B0aW9ucz8uc2VydmljZVJlZ2lzdHJ5KTtcblx0XHR0aGlzLnJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpO1xuXHRcdHRoaXMucm9vdFNjb3BlID0gb3B0aW9ucz8ucm9vdFNjb3BlID8/IHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZU1hbnk8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ocmVzb2x2ZVJlcXVlc3Q6IFJlc29sdmVSZXF1ZXN0PFQ+KTogVFtdIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb25zID0gdGhpcy5nZXRSZWdpc3RyYXRpb25Gcm9tKGtleSkgPz8gW107XG5cblx0XHRjb25zdCBzZXJ2aWNlcyA9IEFycmF5Lm9mPFQ+KCk7XG5cdFx0Zm9yIChjb25zdCByZWdpc3RyYXRpb24gb2YgcmVnaXN0cmF0aW9ucykge1xuXHRcdFx0Y29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVJlZ2lzdHJhdGlvbjxUPihyZWdpc3RyYXRpb24pO1xuXHRcdFx0c2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlcnZpY2VzO1xuXHR9XG5cblx0cHVibGljIHJlc29sdmU8VCBleHRlbmRzIG9iamVjdCB8IG9iamVjdFtdPihyZXNvbHZlUmVxdWVzdDogUmVzb2x2ZVJlcXVlc3Q8VD4pOiBUIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmdldFJlZ2lzdHJhdGlvbkZyb20oa2V5KTtcblx0XHRpZiAocmVnaXN0cmF0aW9uID09IG51bGwpIHtcblx0XHRcdHRoaXMubG9nZ2VyLndhcm4oYENhbm5vdCByZXNvbHZlIGRlcGVuZGVuY3kgJHtrZXkudG9TdHJpbmcoKX1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChyZWdpc3RyYXRpb24ubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhyb3cgbmV3IFJlc29sdmVFcnJvcihcblx0XHRcdFx0YFRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyByZWdpc3RlcmVkIHdpdGgga2V5ICR7a2V5LnRvU3RyaW5nKCl9LiBVc2UgcmVzb2x2ZU1hbnkgdG8gcmVzb2x2ZSBhbGwgaW1wbGVtZW50YXRpb25zLmAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlcnZpY2UgPSB0aGlzLnJlc29sdmVSZWdpc3RyYXRpb248VD4ocmVnaXN0cmF0aW9uWzBdKTtcblx0XHRyZXR1cm4gc2VydmljZTtcblx0fVxuXG5cdHB1YmxpYyBiZWdpblNjb3BlKG5hbWU/OiBzdHJpbmcpIHtcblx0XHRpZiAodGhpcy5zY29wZXMuaGFzKG5hbWUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRHVwbGljYXRlU2NvcGVFcnJvcihcblx0XHRcdFx0YENhbm5vdCBjcmVhdGUgZHVwbGljYXRlIHNjb3BlLiBTY29wZSB3aXRoICR7bmFtZX0gaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBoYXMgbm90IGJlZW4gZGlzcG9zZWQuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2NvcGUgPSBuZXcgQ3J1Y2libGUoe1xuXHRcdFx0a2V5OiBuYW1lLFxuXHRcdFx0c2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSxcblx0XHRcdHJvb3RTY29wZTogdGhpcyxcblx0XHR9KTtcblxuXHRcdHRoaXMuc2NvcGVzLnNldChuYW1lLCBzY29wZSk7XG5cdFx0cmV0dXJuIHNjb3BlO1xuXHR9XG5cblx0cHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpc3Bvc2VTeW5jKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlQXN5bmMoKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzcG9zZVN5bmMoKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdFx0Zm9yIChjb25zdCBbLCBpbnN0XSBvZiB0aGlzLmluc3RhbmNlcykge1xuXHRcdFx0aWYgKGluc3QgPT09IHRoaXMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpbnN0W1N5bWJvbC5kaXNwb3NlXT8uKCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlQXN5bmMoKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cdFx0Zm9yIChjb25zdCBbLCBpbnN0XSBvZiB0aGlzLmluc3RhbmNlcykge1xuXHRcdFx0aWYgKGluc3QgPT09IHRoaXMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoU3ltYm9sLmFzeW5jRGlzcG9zZSBpbiBpbnN0KSB7XG5cdFx0XHRcdGF3YWl0IChpbnN0IGFzIEFzeW5jRGlzcG9zYWJsZSlbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdChpbnN0IGFzIFBhcnRpYWw8RGlzcG9zYWJsZT4pW1N5bWJvbC5kaXNwb3NlXT8uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZWdpc3RyYXRpb25Gcm9tKGtleTogUmVnaXN0cmF0aW9uS2V5KSB7XG5cdFx0Y29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkuZ2V0UmVnaXN0cmF0aW9uKGtleS52YWx1ZSk7XG5cdFx0cmV0dXJuIHJlZ2lzdHJhdGlvbjtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVJlZ2lzdHJhdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRjb25zdCB7IHNjb3BlIH0gPSByZWdpc3RyYXRpb247XG5cdFx0c3dpdGNoIChzY29wZSkge1xuXHRcdFx0Y2FzZSBTY29wZXMudHJhbnNpZW50OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMuc2luZ2xldG9uOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5yb290U2NvcGUuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdFx0Y2FzZSBTY29wZXMucmVxdWVzdDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVJbnN0YW5jZShyZWdpc3RyYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0T3JDcmVhdGVJbnN0YW5jZTxUIGV4dGVuZHMgb2JqZWN0PihyZWdpc3RyYXRpb246IFNlcnZpY2VSZWdpc3RyYXRpb24pOiBUIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRpbmVyIGhhcyBiZWVuIGRpc3Bvc2VkXCIpO1xuXHRcdH1cblx0XHRjb25zdCB7IGtleSwgdHlwZSwgaXNJbnN0YW5jZSB9ID0gcmVnaXN0cmF0aW9uO1xuXHRcdGNvbnN0IGNhY2hlS2V5ID0gaXNJbnN0YW5jZSA/IGtleS52YWx1ZSA6IHR5cGU7XG5cdFx0Y29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldChjYWNoZUtleSk7XG5cdFx0aWYgKGV4aXN0aW5nSW5zdGFuY2UgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nSW5zdGFuY2UgYXMgVDtcblx0XHR9XG5cblx0XHRjb25zdCBpbnN0YW5jZSA9IGlzSW5zdGFuY2UgPyAodHlwZSBhcyBUKSA6IHRoaXMuY3JlYXRlSW5zdGFuY2U8VD4ocmVnaXN0cmF0aW9uKTtcblx0XHR0aGlzLmluc3RhbmNlcy5zZXQoY2FjaGVLZXksIGluc3RhbmNlKTtcblx0XHRyZXR1cm4gaW5zdGFuY2U7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUluc3RhbmNlPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGNvbnN0IHR5cGUgPSByZWdpc3RyYXRpb24udHlwZSBhcyBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlO1xuXHRcdGNvbnN0IGNhbkNvbnN0cnVjdCA9IGlzQ29uc3RydWN0YWJsZSh0eXBlKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5yZXNvbHZlRGVwZW5kZW5jaWVzKHR5cGUpO1xuXHRcdGNvbnN0IGluc3QgPSAoY2FuQ29uc3RydWN0ID8gbmV3IHR5cGUoLi4uZGVwcykgOiB0eXBlKCkpIGFzIFQ7XG5cdFx0cmV0dXJuIGluc3Q7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVEZXBlbmRlbmNpZXModHlwZTogQ29uc3RydWN0YWJsZSB8IEZ1bmN0aW9uVHlwZSk6IHVua25vd25bXSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gZ2V0TWV0YTxBcnJheTxDb25zdHJ1Y3RhYmxlPj4oUmVmbGVjdGlvbk1ldGEucGFyYW10eXBlcywgdHlwZSkgPz8gW107XG5cblx0XHRjb25zdCBpbmplY3RUb2tlbnMgPVxuXHRcdFx0Z2V0TWV0YTxJbmplY3Rpb25NZXRhZGF0YT4oQ3J1Y2libGVNZXRhLmluamVjdHRva2VuLCB0eXBlKSA/PyBuZXcgTWFwKCk7XG5cblx0XHQvL1RPRE86IHB1dCBhIHRyeSBjYXRjaCBoZXJlIHNvIHdlIGNhbiB0aHJvdyB0aGUgbmFtZSBvZiB0aGUgc2VydmljZVxuXHRcdGxldCByZXNvbHZlZCA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCB0b2tlbiA9IGluamVjdFRva2Vucy5nZXQoaSk/LmtleSA/PyBwYXJhbXNbaV0ubmFtZTtcblx0XHRcdGNvbnN0IGRlcCA9IGlzQXJyYXlUeXBlKHBhcmFtc1tpXSkgPyB0aGlzLnJlc29sdmVNYW55KHRva2VuKSA6IHRoaXMucmVzb2x2ZSh0b2tlbik7XG5cdFx0XHRyZXNvbHZlZCA9IFsuLi5yZXNvbHZlZCwgZGVwXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc29sdmVkO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckxpZmV0aW1lU2NvcGUoKSB7XG5cdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy5yZXF1ZXN0LCB7XG5cdFx0XHR0eXBlT3JLZXk6IExpZmV0aW1lU2NvcGVUb2tlbixcblx0XHRcdHR5cGVPckluc3RhbmNlOiB0aGlzLFxuXHRcdH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiZ2V0TWV0YSIsImlzQXJyYXlUeXBlIiwiaXNDb25zdHJ1Y3RhYmxlIiwiUmVmbGVjdGlvbk1ldGEiLCJzY3JpYmUiLCJDcnVjaWJsZU1ldGEiLCJMaWZldGltZVNjb3BlVG9rZW4iLCJTY29wZXMiLCJSZWdpc3RyYXRpb25LZXkiLCJEdXBsaWNhdGVTY29wZUVycm9yIiwiUmVzb2x2ZUVycm9yIiwiU2VydmljZVJlZ2lzdHJ5IiwiQ3J1Y2libGUiLCJrZXkiLCJpbnN0YW5jZXMiLCJNYXAiLCJzZXJ2aWNlUmVnaXN0cnkiLCJyb290U2NvcGUiLCJzY29wZXMiLCJsb2dnZXIiLCJuYW1lIiwiaXNEaXNwb3NlZCIsIm9wdGlvbnMiLCJyZWdpc3RlckxpZmV0aW1lU2NvcGUiLCJyZXNvbHZlTWFueSIsInJlc29sdmVSZXF1ZXN0IiwicmVnaXN0cmF0aW9ucyIsImdldFJlZ2lzdHJhdGlvbkZyb20iLCJzZXJ2aWNlcyIsIkFycmF5Iiwib2YiLCJyZWdpc3RyYXRpb24iLCJzZXJ2aWNlIiwicmVzb2x2ZVJlZ2lzdHJhdGlvbiIsInB1c2giLCJyZXNvbHZlIiwid2FybiIsInRvU3RyaW5nIiwibGVuZ3RoIiwiYmVnaW5TY29wZSIsImhhcyIsInNjb3BlIiwic2V0IiwiU3ltYm9sIiwiZGlzcG9zZSIsImRpc3Bvc2VTeW5jIiwiYXN5bmNEaXNwb3NlIiwiZGlzcG9zZUFzeW5jIiwiaW5zdCIsImdldFJlZ2lzdHJhdGlvbiIsInZhbHVlIiwidHJhbnNpZW50IiwiY3JlYXRlSW5zdGFuY2UiLCJzaW5nbGV0b24iLCJnZXRPckNyZWF0ZUluc3RhbmNlIiwicmVxdWVzdCIsIkVycm9yIiwidHlwZSIsImlzSW5zdGFuY2UiLCJjYWNoZUtleSIsImV4aXN0aW5nSW5zdGFuY2UiLCJnZXQiLCJpbnN0YW5jZSIsImNhbkNvbnN0cnVjdCIsImRlcHMiLCJyZXNvbHZlRGVwZW5kZW5jaWVzIiwicGFyYW1zIiwicGFyYW10eXBlcyIsImluamVjdFRva2VucyIsImluamVjdHRva2VuIiwicmVzb2x2ZWQiLCJpIiwidG9rZW4iLCJkZXAiLCJyZWdpc3RlclR5cGUiLCJ0eXBlT3JLZXkiLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FHQ0EsT0FBTyxFQUNQQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsY0FBYyxRQUNSLDZCQUE2QjtBQUNwQyxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLFlBQVksRUFBRUMsa0JBQWtCLEVBQUVDLE1BQU0sUUFBUSxjQUFjO0FBRXZFLFNBQVNDLGVBQWUsUUFBUSxzQ0FBc0M7QUFFdEUsU0FBU0MsbUJBQW1CLEVBQUVDLFlBQVksUUFBUSxxQkFBcUI7QUFFdkUsU0FBU0MsZUFBZSxRQUFRLHdCQUF3QjtBQVF4RCxPQUFPLE1BQU1DO0lBQ0xDLElBQVk7SUFDVEMsWUFBWSxJQUFJQyxNQUF1QjtJQUN6Q0MsZ0JBQWlDO0lBQ2pDQyxVQUFvQjtJQUNwQkMsU0FBUyxJQUFJSCxNQUE2QjtJQUMxQ0ksU0FBU2YsT0FBT2UsTUFBTSxDQUFDUCxTQUFTUSxJQUFJLEVBQUU7SUFDdENDLGFBQWEsTUFBTTtJQUMzQixZQUFtQkMsT0FBeUIsQ0FBRTtRQUM3QyxJQUFJLENBQUNULEdBQUcsR0FBR1MsU0FBU1Q7UUFDcEIsSUFBSSxDQUFDRyxlQUFlLEdBQUcsSUFBSUwsZ0JBQWdCVyxTQUFTTjtRQUNwRCxJQUFJLENBQUNPLHFCQUFxQjtRQUMxQixJQUFJLENBQUNOLFNBQVMsR0FBR0ssU0FBU0wsYUFBYSxJQUFJO0lBQzVDO0lBRU9PLFlBQXVDQyxjQUFpQyxFQUFPO1FBQ3JGLE1BQU1aLE1BQU0sSUFBSUwsZ0JBQWdCaUI7UUFDaEMsTUFBTUMsZ0JBQWdCLElBQUksQ0FBQ0MsbUJBQW1CLENBQUNkLFFBQVEsRUFBRTtRQUV6RCxNQUFNZSxXQUFXQyxNQUFNQyxFQUFFO1FBQ3pCLEtBQUssTUFBTUMsZ0JBQWdCTCxjQUFlO1lBQ3pDLE1BQU1NLFVBQVUsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBSUY7WUFDNUNILFNBQVNNLElBQUksQ0FBQ0Y7UUFDZjtRQUNBLE9BQU9KO0lBQ1I7SUFFT08sUUFBcUNWLGNBQWlDLEVBQUs7UUFDakYsTUFBTVosTUFBTSxJQUFJTCxnQkFBZ0JpQjtRQUNoQyxNQUFNTSxlQUFlLElBQUksQ0FBQ0osbUJBQW1CLENBQUNkO1FBQzlDLElBQUlrQixnQkFBZ0IsTUFBTTtZQUN6QixJQUFJLENBQUNaLE1BQU0sQ0FBQ2lCLElBQUksQ0FBQyxDQUFDLDBCQUEwQixFQUFFdkIsSUFBSXdCLFFBQVEsSUFBSTtZQUM5RCxPQUFPO1FBQ1I7UUFFQSxJQUFJTixhQUFhTyxNQUFNLEdBQUcsR0FBRztZQUM1QixNQUFNLElBQUk1QixhQUNULENBQUMsZ0RBQWdELEVBQUVHLElBQUl3QixRQUFRLEdBQUcsaURBQWlELENBQUM7UUFFdEg7UUFFQSxNQUFNTCxVQUFVLElBQUksQ0FBQ0MsbUJBQW1CLENBQUlGLFlBQVksQ0FBQyxFQUFFO1FBQzNELE9BQU9DO0lBQ1I7SUFFT08sV0FBV25CLElBQWEsRUFBRTtRQUNoQyxJQUFJLElBQUksQ0FBQ0YsTUFBTSxDQUFDc0IsR0FBRyxDQUFDcEIsT0FBTztZQUMxQixNQUFNLElBQUlYLG9CQUNULENBQUMsMENBQTBDLEVBQUVXLEtBQUssOENBQThDLENBQUM7UUFFbkc7UUFFQSxNQUFNcUIsUUFBUSxJQUFJN0IsU0FBUztZQUMxQkMsS0FBS087WUFDTEosaUJBQWlCLElBQUksQ0FBQ0EsZUFBZTtZQUNyQ0MsV0FBVyxJQUFJO1FBQ2hCO1FBRUEsSUFBSSxDQUFDQyxNQUFNLENBQUN3QixHQUFHLENBQUN0QixNQUFNcUI7UUFDdEIsT0FBT0E7SUFDUjtJQUVPLENBQUNFLE9BQU9DLE9BQU8sQ0FBQyxHQUFHO1FBQ3pCLElBQUksSUFBSSxDQUFDdkIsVUFBVSxFQUFFO1lBQ3BCO1FBQ0Q7UUFDQSxJQUFJLENBQUN3QixXQUFXO0lBQ2pCO0lBRUEsTUFBYSxDQUFDRixPQUFPRyxZQUFZLENBQUMsR0FBRztRQUNwQyxJQUFJLElBQUksQ0FBQ3pCLFVBQVUsRUFBRTtZQUNwQjtRQUNEO1FBQ0EsTUFBTSxJQUFJLENBQUMwQixZQUFZO0lBQ3hCO0lBRVFGLGNBQWM7UUFDckIsSUFBSSxJQUFJLENBQUN4QixVQUFVLEVBQUU7WUFDcEI7UUFDRDtRQUVBLElBQUksQ0FBQ0EsVUFBVSxHQUFHO1FBQ2xCLEtBQUssTUFBTSxHQUFHMkIsS0FBSyxJQUFJLElBQUksQ0FBQ2xDLFNBQVMsQ0FBRTtZQUN0QyxJQUFJa0MsU0FBUyxJQUFJLEVBQUU7Z0JBQ2xCO1lBQ0Q7WUFDQUEsSUFBSSxDQUFDTCxPQUFPQyxPQUFPLENBQUM7UUFDckI7SUFDRDtJQUVBLE1BQWNHLGVBQWU7UUFDNUIsSUFBSSxJQUFJLENBQUMxQixVQUFVLEVBQUU7WUFDcEI7UUFDRDtRQUVBLElBQUksQ0FBQ0EsVUFBVSxHQUFHO1FBQ2xCLEtBQUssTUFBTSxHQUFHMkIsS0FBSyxJQUFJLElBQUksQ0FBQ2xDLFNBQVMsQ0FBRTtZQUN0QyxJQUFJa0MsU0FBUyxJQUFJLEVBQUU7Z0JBQ2xCO1lBQ0Q7WUFDQSxJQUFJTCxPQUFPRyxZQUFZLElBQUlFLE1BQU07Z0JBQ2hDLE1BQU0sQUFBQ0EsSUFBd0IsQ0FBQ0wsT0FBT0csWUFBWSxDQUFDO1lBQ3JELE9BQU87Z0JBQ0xFLElBQTRCLENBQUNMLE9BQU9DLE9BQU8sQ0FBQztZQUM5QztRQUNEO0lBQ0Q7SUFFUWpCLG9CQUFvQmQsR0FBb0IsRUFBRTtRQUNqRCxNQUFNa0IsZUFBZSxJQUFJLENBQUNmLGVBQWUsQ0FBQ2lDLGVBQWUsQ0FBQ3BDLElBQUlxQyxLQUFLO1FBQ25FLE9BQU9uQjtJQUNSO0lBRVFFLG9CQUFzQ0YsWUFBaUMsRUFBSztRQUNuRixNQUFNLEVBQUVVLEtBQUssRUFBRSxHQUFHVjtRQUNsQixPQUFRVTtZQUNQLEtBQUtsQyxPQUFPNEMsU0FBUztnQkFDcEIsT0FBTyxJQUFJLENBQUNDLGNBQWMsQ0FBQ3JCO1lBQzVCLEtBQUt4QixPQUFPOEMsU0FBUztnQkFDcEIsT0FBTyxJQUFJLENBQUNwQyxTQUFTLENBQUNxQyxtQkFBbUIsQ0FBQ3ZCO1lBQzNDLEtBQUt4QixPQUFPZ0QsT0FBTztnQkFDbEIsT0FBTyxJQUFJLENBQUNELG1CQUFtQixDQUFDdkI7UUFDbEM7SUFDRDtJQUVRdUIsb0JBQXNDdkIsWUFBaUMsRUFBSztRQUNuRixJQUFJLElBQUksQ0FBQ1YsVUFBVSxFQUFFO1lBQ3BCLE1BQU0sSUFBSW1DLE1BQU07UUFDakI7UUFDQSxNQUFNLEVBQUUzQyxHQUFHLEVBQUU0QyxJQUFJLEVBQUVDLFVBQVUsRUFBRSxHQUFHM0I7UUFDbEMsTUFBTTRCLFdBQVdELGFBQWE3QyxJQUFJcUMsS0FBSyxHQUFHTztRQUMxQyxNQUFNRyxtQkFBbUIsSUFBSSxDQUFDOUMsU0FBUyxDQUFDK0MsR0FBRyxDQUFDRjtRQUM1QyxJQUFJQyxvQkFBb0IsTUFBTTtZQUM3QixPQUFPQTtRQUNSO1FBRUEsTUFBTUUsV0FBV0osYUFBY0QsT0FBYSxJQUFJLENBQUNMLGNBQWMsQ0FBSXJCO1FBQ25FLElBQUksQ0FBQ2pCLFNBQVMsQ0FBQzRCLEdBQUcsQ0FBQ2lCLFVBQVVHO1FBQzdCLE9BQU9BO0lBQ1I7SUFFUVYsZUFBaUNyQixZQUFpQyxFQUFLO1FBQzlFLE1BQU0wQixPQUFPMUIsYUFBYTBCLElBQUk7UUFDOUIsTUFBTU0sZUFBZTdELGdCQUFnQnVEO1FBQ3JDLE1BQU1PLE9BQU8sSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ1I7UUFDdEMsTUFBTVQsT0FBUWUsZUFBZSxJQUFJTixRQUFRTyxRQUFRUDtRQUNqRCxPQUFPVDtJQUNSO0lBRVFpQixvQkFBb0JSLElBQWtDLEVBQWE7UUFDMUUsTUFBTVMsU0FBU2xFLFFBQThCRyxlQUFlZ0UsVUFBVSxFQUFFVixTQUFTLEVBQUU7UUFFbkYsTUFBTVcsZUFDTHBFLFFBQTJCSyxhQUFhZ0UsV0FBVyxFQUFFWixTQUFTLElBQUkxQztRQUVuRSxvRUFBb0U7UUFDcEUsSUFBSXVELFdBQVcsRUFBRTtRQUNqQixJQUFLLElBQUlDLElBQUksR0FBR0EsSUFBSUwsT0FBTzVCLE1BQU0sRUFBRWlDLElBQUs7WUFDdkMsTUFBTUMsUUFBUUosYUFBYVAsR0FBRyxDQUFDVSxJQUFJMUQsT0FBT3FELE1BQU0sQ0FBQ0ssRUFBRSxDQUFDbkQsSUFBSTtZQUN4RCxNQUFNcUQsTUFBTXhFLFlBQVlpRSxNQUFNLENBQUNLLEVBQUUsSUFBSSxJQUFJLENBQUMvQyxXQUFXLENBQUNnRCxTQUFTLElBQUksQ0FBQ3JDLE9BQU8sQ0FBQ3FDO1lBQzVFRixXQUFXO21CQUFJQTtnQkFBVUc7YUFBSTtRQUM5QjtRQUNBLE9BQU9IO0lBQ1I7SUFFUS9DLHdCQUF3QjtRQUMvQixJQUFJLENBQUNQLGVBQWUsQ0FBQzBELFlBQVksQ0FBQ25FLE9BQU9nRCxPQUFPLEVBQUU7WUFDakRvQixXQUFXckU7WUFDWHNFLGdCQUFnQixJQUFJO1FBQ3JCO0lBQ0Q7QUFDRCJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decohere/crucible",
|
|
3
|
-
"version": "0.0.1-dev.
|
|
3
|
+
"version": "0.0.1-dev.31",
|
|
4
4
|
"description": "Lightweight dependency injection container with decorator-based wiring",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@decohere/nexus": "0.0.1-dev.
|
|
34
|
-
"@decohere/scribe": "0.0.1-dev.
|
|
33
|
+
"@decohere/nexus": "0.0.1-dev.31",
|
|
34
|
+
"@decohere/scribe": "0.0.1-dev.31"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {}
|
|
37
37
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function injectable(): ClassDecorator;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Constructable, FunctionType } from "@decohere/nexus/reflection";
|
|
2
|
+
import type { Scope } from "../types/types.js";
|
|
3
|
+
import type { RegistrationKey } from "./registration-key.model.js";
|
|
4
|
+
export declare class ServiceRegistration {
|
|
5
|
+
key: RegistrationKey;
|
|
6
|
+
scope: Scope;
|
|
7
|
+
type: Constructable | FunctionType | object;
|
|
8
|
+
isInstance: boolean;
|
|
9
|
+
constructor(key: RegistrationKey, type: Constructable | FunctionType | object, scope: Scope, isInstance: boolean);
|
|
10
|
+
isEqual(other: ServiceRegistration): boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Constructable, FunctionType } from "@decohere/nexus/reflection";
|
|
2
|
+
import type { ServiceRegistration } from "../models/service-registration.model.js";
|
|
3
|
+
import type { ContainerBuilder, Scope } from "../types/types.js";
|
|
4
|
+
import { Crucible } from "./crucible.js";
|
|
5
|
+
import { ServiceRegistry } from "./service-registry.js";
|
|
6
|
+
type ContainerBuilderOptions = {
|
|
7
|
+
serviceRegistry: ServiceRegistry;
|
|
8
|
+
};
|
|
9
|
+
export declare class CrucibleBuilder implements ContainerBuilder {
|
|
10
|
+
private serviceRegistry;
|
|
11
|
+
constructor(options?: ContainerBuilderOptions);
|
|
12
|
+
registerType(type: Constructable, scope?: Scope): ServiceRegistration;
|
|
13
|
+
registerTypes(...types: Constructable[]): ServiceRegistration[];
|
|
14
|
+
registerTypes(scope: Scope, ...types: Constructable[]): ServiceRegistration[];
|
|
15
|
+
registerTransient(key: string | symbol, type: Constructable | FunctionType): ServiceRegistration;
|
|
16
|
+
registerTransient(type: Constructable): ServiceRegistration;
|
|
17
|
+
registerSingleton(key: string | symbol | Constructable | object, instance: object): ServiceRegistration;
|
|
18
|
+
registerSingleton(key: string | symbol, type: Constructable): ServiceRegistration;
|
|
19
|
+
registerSingleton(type: Constructable): ServiceRegistration;
|
|
20
|
+
registerRequestScoped<T>(type: () => T): ServiceRegistration;
|
|
21
|
+
registerRequestScoped<T>(key: string | symbol, type: () => T): ServiceRegistration;
|
|
22
|
+
registerRequestScoped(key: string | symbol, type: Constructable): ServiceRegistration;
|
|
23
|
+
registerRequestScoped(type: Constructable): ServiceRegistration;
|
|
24
|
+
build(): Crucible;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { IContainer, ResolveRequest } from "../types/types.js";
|
|
2
|
+
import { ServiceRegistry } from "./service-registry.js";
|
|
3
|
+
type CrucibleOptions = {
|
|
4
|
+
key?: string;
|
|
5
|
+
rootScope?: Crucible;
|
|
6
|
+
serviceRegistry: ServiceRegistry;
|
|
7
|
+
};
|
|
8
|
+
export declare class Crucible implements IContainer {
|
|
9
|
+
key: string;
|
|
10
|
+
protected instances: Map<unknown, object>;
|
|
11
|
+
private serviceRegistry;
|
|
12
|
+
private rootScope;
|
|
13
|
+
private scopes;
|
|
14
|
+
private logger;
|
|
15
|
+
private isDisposed;
|
|
16
|
+
constructor(options?: CrucibleOptions);
|
|
17
|
+
resolveMany<T extends object = object>(resolveRequest: ResolveRequest<T>): T[];
|
|
18
|
+
resolve<T extends object | object[]>(resolveRequest: ResolveRequest<T>): T;
|
|
19
|
+
beginScope(name?: string): Crucible;
|
|
20
|
+
[Symbol.dispose](): void;
|
|
21
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
22
|
+
private disposeSync;
|
|
23
|
+
private disposeAsync;
|
|
24
|
+
private getRegistrationFrom;
|
|
25
|
+
private resolveRegistration;
|
|
26
|
+
private getOrCreateInstance;
|
|
27
|
+
private createInstance;
|
|
28
|
+
private resolveDependencies;
|
|
29
|
+
private registerLifetimeScope;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Constructable, FunctionType } from "@decohere/nexus/reflection";
|
|
2
|
+
import { ServiceRegistration } from "../models/service-registration.model.js";
|
|
3
|
+
import type { Scope } from "../types/types.js";
|
|
4
|
+
export type RegisterTypeOptions = {
|
|
5
|
+
typeOrKey: string | symbol | Constructable | FunctionType;
|
|
6
|
+
typeOrInstance?: Constructable | FunctionType | object;
|
|
7
|
+
};
|
|
8
|
+
export declare class ServiceRegistry {
|
|
9
|
+
private readonly registrations;
|
|
10
|
+
constructor(parent?: ServiceRegistry);
|
|
11
|
+
registerType(scope: Scope, options: RegisterTypeOptions): ServiceRegistration;
|
|
12
|
+
getRegistration(key: string | symbol | Constructable): ServiceRegistration[];
|
|
13
|
+
private createRegistrationFrom;
|
|
14
|
+
private getRegistrations;
|
|
15
|
+
private setRegistration;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { ContainerBuilder, IContainer, LifetimeScope, ResolveRequest, Scope, ServiceProvider, } from "@decohere/nexus/composition";
|
package/src/services/crucible.js
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { getMeta, isArrayType, isConstructable, ReflectionMeta } from "../../../nexus/src/reflection/index.js";
|
|
2
|
-
import { scribe } from "../../../scribe/scribe/src/index.js";
|
|
3
|
-
import { CrucibleMeta, LifetimeScopeToken, Scopes } from "../const.js";
|
|
4
|
-
import { RegistrationKey } from "../models/registration-key.model.js";
|
|
5
|
-
import { DuplicateScopeError, ResolveError } from "../types/errors.js";
|
|
6
|
-
import { ServiceRegistry } from "./service-registry.js";
|
|
7
|
-
export class Crucible {
|
|
8
|
-
key;
|
|
9
|
-
instances = new Map();
|
|
10
|
-
serviceRegistry;
|
|
11
|
-
rootScope;
|
|
12
|
-
scopes = new Map();
|
|
13
|
-
logger = scribe.logger(Crucible.name);
|
|
14
|
-
isDisposed = false;
|
|
15
|
-
constructor(options){
|
|
16
|
-
this.key = options?.key;
|
|
17
|
-
this.serviceRegistry = new ServiceRegistry(options?.serviceRegistry);
|
|
18
|
-
this.registerLifetimeScope();
|
|
19
|
-
this.rootScope = options?.rootScope ?? this;
|
|
20
|
-
}
|
|
21
|
-
resolveMany(resolveRequest) {
|
|
22
|
-
const key = new RegistrationKey(resolveRequest);
|
|
23
|
-
const registrations = this.getRegistrationFrom(key) ?? [];
|
|
24
|
-
const services = Array.of();
|
|
25
|
-
for (const registration of registrations){
|
|
26
|
-
const service = this.resolveRegistration(registration);
|
|
27
|
-
services.push(service);
|
|
28
|
-
}
|
|
29
|
-
return services;
|
|
30
|
-
}
|
|
31
|
-
resolve(resolveRequest) {
|
|
32
|
-
const key = new RegistrationKey(resolveRequest);
|
|
33
|
-
const registration = this.getRegistrationFrom(key);
|
|
34
|
-
if (registration == null) {
|
|
35
|
-
this.logger.warn(`Cannot resolve dependency ${key.toString()}`);
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
if (registration.length > 1) {
|
|
39
|
-
throw new ResolveError(`There are multiple services registered with key ${key.toString()}. Use resolveMany to resolve all implementations.`);
|
|
40
|
-
}
|
|
41
|
-
const service = this.resolveRegistration(registration[0]);
|
|
42
|
-
return service;
|
|
43
|
-
}
|
|
44
|
-
beginScope(name) {
|
|
45
|
-
if (this.scopes.has(name)) {
|
|
46
|
-
throw new DuplicateScopeError(`Cannot create duplicate scope. Scope with ${name} is already created and has not been disposed.`);
|
|
47
|
-
}
|
|
48
|
-
const scope = new Crucible({
|
|
49
|
-
key: name,
|
|
50
|
-
serviceRegistry: this.serviceRegistry,
|
|
51
|
-
rootScope: this
|
|
52
|
-
});
|
|
53
|
-
this.scopes.set(name, scope);
|
|
54
|
-
return scope;
|
|
55
|
-
}
|
|
56
|
-
[Symbol.dispose]() {
|
|
57
|
-
if (this.isDisposed) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
this.dispose();
|
|
61
|
-
}
|
|
62
|
-
dispose() {
|
|
63
|
-
if (this.isDisposed) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
this.isDisposed = true;
|
|
67
|
-
for (const [, inst] of this.instances){
|
|
68
|
-
if (inst === this) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
inst[Symbol.dispose]?.();
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
getRegistrationFrom(key) {
|
|
75
|
-
const registration = this.serviceRegistry.getRegistration(key.value);
|
|
76
|
-
return registration;
|
|
77
|
-
}
|
|
78
|
-
resolveRegistration(registration) {
|
|
79
|
-
const { scope } = registration;
|
|
80
|
-
switch(scope){
|
|
81
|
-
case Scopes.transient:
|
|
82
|
-
return this.createInstance(registration);
|
|
83
|
-
case Scopes.singleton:
|
|
84
|
-
return this.rootScope.getOrCreateInstance(registration);
|
|
85
|
-
case Scopes.request:
|
|
86
|
-
return this.getOrCreateInstance(registration);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
getOrCreateInstance(registration) {
|
|
90
|
-
if (this.isDisposed) {
|
|
91
|
-
throw new Error("This continer has been disposed");
|
|
92
|
-
}
|
|
93
|
-
const { key, type, isInstance } = registration;
|
|
94
|
-
const cacheKey = isInstance ? key.value : type;
|
|
95
|
-
const existingInstance = this.instances.get(cacheKey);
|
|
96
|
-
if (existingInstance != null) {
|
|
97
|
-
return existingInstance;
|
|
98
|
-
}
|
|
99
|
-
const instance = isInstance ? type : this.createInstance(registration);
|
|
100
|
-
this.instances.set(cacheKey, instance);
|
|
101
|
-
return instance;
|
|
102
|
-
}
|
|
103
|
-
createInstance(registration) {
|
|
104
|
-
const type = registration.type;
|
|
105
|
-
const canConstruct = isConstructable(type);
|
|
106
|
-
const deps = this.resolveDependencies(type);
|
|
107
|
-
const inst = canConstruct ? new type(...deps) : type();
|
|
108
|
-
return inst;
|
|
109
|
-
}
|
|
110
|
-
resolveDependencies(type) {
|
|
111
|
-
const params = getMeta(ReflectionMeta.paramtypes, type) ?? [];
|
|
112
|
-
const injectTokens = getMeta(CrucibleMeta.injecttoken, type) ?? new Map();
|
|
113
|
-
//TODO: put a try catch here so we can throw the name of the service
|
|
114
|
-
let resolved = [];
|
|
115
|
-
for(let i = 0; i < params.length; i++){
|
|
116
|
-
const token = injectTokens.get(i)?.key ?? params[i].name;
|
|
117
|
-
const dep = isArrayType(params[i]) ? this.resolveMany(token) : this.resolve(token);
|
|
118
|
-
resolved = [
|
|
119
|
-
...resolved,
|
|
120
|
-
dep
|
|
121
|
-
];
|
|
122
|
-
}
|
|
123
|
-
return resolved;
|
|
124
|
-
}
|
|
125
|
-
registerLifetimeScope() {
|
|
126
|
-
this.serviceRegistry.registerType(Scopes.request, {
|
|
127
|
-
typeOrKey: LifetimeScopeToken,
|
|
128
|
-
typeOrInstance: this
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3NyYy9zZXJ2aWNlcy9jcnVjaWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHR0eXBlIENvbnN0cnVjdGFibGUsXG5cdHR5cGUgRnVuY3Rpb25UeXBlLFxuXHRnZXRNZXRhLFxuXHRpc0FycmF5VHlwZSxcblx0aXNDb25zdHJ1Y3RhYmxlLFxuXHRSZWZsZWN0aW9uTWV0YSxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgQ3J1Y2libGVNZXRhLCBMaWZldGltZVNjb3BlVG9rZW4sIFNjb3BlcyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmplY3Rpb25NZXRhZGF0YSB9IGZyb20gXCIuLi9kZWNvcmF0b3JzL2luamVjdC5kZWNvcmF0b3IuanNcIjtcbmltcG9ydCB7IFJlZ2lzdHJhdGlvbktleSB9IGZyb20gXCIuLi9tb2RlbHMvcmVnaXN0cmF0aW9uLWtleS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVnaXN0cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVscy9zZXJ2aWNlLXJlZ2lzdHJhdGlvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRHVwbGljYXRlU2NvcGVFcnJvciwgUmVzb2x2ZUVycm9yIH0gZnJvbSBcIi4uL3R5cGVzL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29udGFpbmVyLCBMaWZldGltZVNjb3BlLCBSZXNvbHZlUmVxdWVzdCB9IGZyb20gXCIuLi90eXBlcy90eXBlcy5qc1wiO1xuaW1wb3J0IHsgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vc2VydmljZS1yZWdpc3RyeS5qc1wiO1xuXG50eXBlIENydWNpYmxlT3B0aW9ucyA9IHtcblx0a2V5Pzogc3RyaW5nO1xuXHRyb290U2NvcGU/OiBDcnVjaWJsZTtcblx0c2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ3J1Y2libGUgaW1wbGVtZW50cyBJQ29udGFpbmVyIHtcblx0cHVibGljIGtleTogc3RyaW5nO1xuXHRwcm90ZWN0ZWQgaW5zdGFuY2VzID0gbmV3IE1hcDx1bmtub3duLCBvYmplY3Q+KCk7XG5cdHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnk7XG5cdHByaXZhdGUgcm9vdFNjb3BlOiBDcnVjaWJsZTtcblx0cHJpdmF0ZSBzY29wZXMgPSBuZXcgTWFwPHN0cmluZywgTGlmZXRpbWVTY29wZT4oKTtcblx0cHJpdmF0ZSBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKENydWNpYmxlLm5hbWUpO1xuXHRwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDcnVjaWJsZU9wdGlvbnMpIHtcblx0XHR0aGlzLmtleSA9IG9wdGlvbnM/LmtleTtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeSA9IG5ldyBTZXJ2aWNlUmVnaXN0cnkob3B0aW9ucz8uc2VydmljZVJlZ2lzdHJ5KTtcblx0XHR0aGlzLnJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpO1xuXHRcdHRoaXMucm9vdFNjb3BlID0gb3B0aW9ucz8ucm9vdFNjb3BlID8/IHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZU1hbnk8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ocmVzb2x2ZVJlcXVlc3Q6IFJlc29sdmVSZXF1ZXN0PFQ+KTogVFtdIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb25zID0gdGhpcy5nZXRSZWdpc3RyYXRpb25Gcm9tKGtleSkgPz8gW107XG5cblx0XHRjb25zdCBzZXJ2aWNlcyA9IEFycmF5Lm9mPFQ+KCk7XG5cdFx0Zm9yIChjb25zdCByZWdpc3RyYXRpb24gb2YgcmVnaXN0cmF0aW9ucykge1xuXHRcdFx0Y29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVJlZ2lzdHJhdGlvbjxUPihyZWdpc3RyYXRpb24pO1xuXHRcdFx0c2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlcnZpY2VzO1xuXHR9XG5cblx0cHVibGljIHJlc29sdmU8VCBleHRlbmRzIG9iamVjdCB8IG9iamVjdFtdPihyZXNvbHZlUmVxdWVzdDogUmVzb2x2ZVJlcXVlc3Q8VD4pOiBUIHtcblx0XHRjb25zdCBrZXkgPSBuZXcgUmVnaXN0cmF0aW9uS2V5KHJlc29sdmVSZXF1ZXN0KTtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLmdldFJlZ2lzdHJhdGlvbkZyb20oa2V5KTtcblx0XHRpZiAocmVnaXN0cmF0aW9uID09IG51bGwpIHtcblx0XHRcdHRoaXMubG9nZ2VyLndhcm4oYENhbm5vdCByZXNvbHZlIGRlcGVuZGVuY3kgJHtrZXkudG9TdHJpbmcoKX1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChyZWdpc3RyYXRpb24ubGVuZ3RoID4gMSkge1xuXHRcdFx0dGhyb3cgbmV3IFJlc29sdmVFcnJvcihcblx0XHRcdFx0YFRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyByZWdpc3RlcmVkIHdpdGgga2V5ICR7a2V5LnRvU3RyaW5nKCl9LiBVc2UgcmVzb2x2ZU1hbnkgdG8gcmVzb2x2ZSBhbGwgaW1wbGVtZW50YXRpb25zLmAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlcnZpY2UgPSB0aGlzLnJlc29sdmVSZWdpc3RyYXRpb248VD4ocmVnaXN0cmF0aW9uWzBdKTtcblx0XHRyZXR1cm4gc2VydmljZTtcblx0fVxuXG5cdHB1YmxpYyBiZWdpblNjb3BlKG5hbWU/OiBzdHJpbmcpIHtcblx0XHRpZiAodGhpcy5zY29wZXMuaGFzKG5hbWUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRHVwbGljYXRlU2NvcGVFcnJvcihcblx0XHRcdFx0YENhbm5vdCBjcmVhdGUgZHVwbGljYXRlIHNjb3BlLiBTY29wZSB3aXRoICR7bmFtZX0gaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBoYXMgbm90IGJlZW4gZGlzcG9zZWQuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2NvcGUgPSBuZXcgQ3J1Y2libGUoe1xuXHRcdFx0a2V5OiBuYW1lLFxuXHRcdFx0c2VydmljZVJlZ2lzdHJ5OiB0aGlzLnNlcnZpY2VSZWdpc3RyeSxcblx0XHRcdHJvb3RTY29wZTogdGhpcyxcblx0XHR9KTtcblxuXHRcdHRoaXMuc2NvcGVzLnNldChuYW1lLCBzY29wZSk7XG5cdFx0cmV0dXJuIHNjb3BlO1xuXHR9XG5cblx0cHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcblx0XHRmb3IgKGNvbnN0IFssIGluc3RdIG9mIHRoaXMuaW5zdGFuY2VzKSB7XG5cdFx0XHRpZiAoaW5zdCA9PT0gdGhpcykge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGluc3RbU3ltYm9sLmRpc3Bvc2VdPy4oKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldFJlZ2lzdHJhdGlvbkZyb20oa2V5OiBSZWdpc3RyYXRpb25LZXkpIHtcblx0XHRjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnNlcnZpY2VSZWdpc3RyeS5nZXRSZWdpc3RyYXRpb24oa2V5LnZhbHVlKTtcblx0XHRyZXR1cm4gcmVnaXN0cmF0aW9uO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUmVnaXN0cmF0aW9uPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGNvbnN0IHsgc2NvcGUgfSA9IHJlZ2lzdHJhdGlvbjtcblx0XHRzd2l0Y2ggKHNjb3BlKSB7XG5cdFx0XHRjYXNlIFNjb3Blcy50cmFuc2llbnQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRjYXNlIFNjb3Blcy5zaW5nbGV0b246XG5cdFx0XHRcdHJldHVybiB0aGlzLnJvb3RTY29wZS5nZXRPckNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0XHRjYXNlIFNjb3Blcy5yZXF1ZXN0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlKHJlZ2lzdHJhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRPckNyZWF0ZUluc3RhbmNlPFQgZXh0ZW5kcyBvYmplY3Q+KHJlZ2lzdHJhdGlvbjogU2VydmljZVJlZ2lzdHJhdGlvbik6IFQge1xuXHRcdGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoaXMgY29udGluZXIgaGFzIGJlZW4gZGlzcG9zZWRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHsga2V5LCB0eXBlLCBpc0luc3RhbmNlIH0gPSByZWdpc3RyYXRpb247XG5cdFx0Y29uc3QgY2FjaGVLZXkgPSBpc0luc3RhbmNlID8ga2V5LnZhbHVlIDogdHlwZTtcblx0XHRjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGNhY2hlS2V5KTtcblx0XHRpZiAoZXhpc3RpbmdJbnN0YW5jZSAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZXhpc3RpbmdJbnN0YW5jZSBhcyBUO1xuXHRcdH1cblxuXHRcdGNvbnN0IGluc3RhbmNlID0gaXNJbnN0YW5jZSA/ICh0eXBlIGFzIFQpIDogdGhpcy5jcmVhdGVJbnN0YW5jZTxUPihyZWdpc3RyYXRpb24pO1xuXHRcdHRoaXMuaW5zdGFuY2VzLnNldChjYWNoZUtleSwgaW5zdGFuY2UpO1xuXHRcdHJldHVybiBpbnN0YW5jZTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlSW5zdGFuY2U8VCBleHRlbmRzIG9iamVjdD4ocmVnaXN0cmF0aW9uOiBTZXJ2aWNlUmVnaXN0cmF0aW9uKTogVCB7XG5cdFx0Y29uc3QgdHlwZSA9IHJlZ2lzdHJhdGlvbi50eXBlIGFzIENvbnN0cnVjdGFibGUgfCBGdW5jdGlvblR5cGU7XG5cdFx0Y29uc3QgY2FuQ29uc3RydWN0ID0gaXNDb25zdHJ1Y3RhYmxlKHR5cGUpO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLnJlc29sdmVEZXBlbmRlbmNpZXModHlwZSk7XG5cdFx0Y29uc3QgaW5zdCA9IChjYW5Db25zdHJ1Y3QgPyBuZXcgdHlwZSguLi5kZXBzKSA6IHR5cGUoKSkgYXMgVDtcblx0XHRyZXR1cm4gaW5zdDtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZURlcGVuZGVuY2llcyh0eXBlOiBDb25zdHJ1Y3RhYmxlIHwgRnVuY3Rpb25UeXBlKTogdW5rbm93bltdIHtcblx0XHRjb25zdCBwYXJhbXMgPSBnZXRNZXRhPEFycmF5PENvbnN0cnVjdGFibGU+PihSZWZsZWN0aW9uTWV0YS5wYXJhbXR5cGVzLCB0eXBlKSA/PyBbXTtcblxuXHRcdGNvbnN0IGluamVjdFRva2VucyA9XG5cdFx0XHRnZXRNZXRhPEluamVjdGlvbk1ldGFkYXRhPihDcnVjaWJsZU1ldGEuaW5qZWN0dG9rZW4sIHR5cGUpID8/IG5ldyBNYXAoKTtcblxuXHRcdC8vVE9ETzogcHV0IGEgdHJ5IGNhdGNoIGhlcmUgc28gd2UgY2FuIHRocm93IHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG5cdFx0bGV0IHJlc29sdmVkID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHRva2VuID0gaW5qZWN0VG9rZW5zLmdldChpKT8ua2V5ID8/IHBhcmFtc1tpXS5uYW1lO1xuXHRcdFx0Y29uc3QgZGVwID0gaXNBcnJheVR5cGUocGFyYW1zW2ldKSA/IHRoaXMucmVzb2x2ZU1hbnkodG9rZW4pIDogdGhpcy5yZXNvbHZlKHRva2VuKTtcblx0XHRcdHJlc29sdmVkID0gWy4uLnJlc29sdmVkLCBkZXBdO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVyTGlmZXRpbWVTY29wZSgpIHtcblx0XHR0aGlzLnNlcnZpY2VSZWdpc3RyeS5yZWdpc3RlclR5cGUoU2NvcGVzLnJlcXVlc3QsIHtcblx0XHRcdHR5cGVPcktleTogTGlmZXRpbWVTY29wZVRva2VuLFxuXHRcdFx0dHlwZU9ySW5zdGFuY2U6IHRoaXMsXG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJnZXRNZXRhIiwiaXNBcnJheVR5cGUiLCJpc0NvbnN0cnVjdGFibGUiLCJSZWZsZWN0aW9uTWV0YSIsInNjcmliZSIsIkNydWNpYmxlTWV0YSIsIkxpZmV0aW1lU2NvcGVUb2tlbiIsIlNjb3BlcyIsIlJlZ2lzdHJhdGlvbktleSIsIkR1cGxpY2F0ZVNjb3BlRXJyb3IiLCJSZXNvbHZlRXJyb3IiLCJTZXJ2aWNlUmVnaXN0cnkiLCJDcnVjaWJsZSIsImtleSIsImluc3RhbmNlcyIsIk1hcCIsInNlcnZpY2VSZWdpc3RyeSIsInJvb3RTY29wZSIsInNjb3BlcyIsImxvZ2dlciIsIm5hbWUiLCJpc0Rpc3Bvc2VkIiwib3B0aW9ucyIsInJlZ2lzdGVyTGlmZXRpbWVTY29wZSIsInJlc29sdmVNYW55IiwicmVzb2x2ZVJlcXVlc3QiLCJyZWdpc3RyYXRpb25zIiwiZ2V0UmVnaXN0cmF0aW9uRnJvbSIsInNlcnZpY2VzIiwiQXJyYXkiLCJvZiIsInJlZ2lzdHJhdGlvbiIsInNlcnZpY2UiLCJyZXNvbHZlUmVnaXN0cmF0aW9uIiwicHVzaCIsInJlc29sdmUiLCJ3YXJuIiwidG9TdHJpbmciLCJsZW5ndGgiLCJiZWdpblNjb3BlIiwiaGFzIiwic2NvcGUiLCJzZXQiLCJTeW1ib2wiLCJkaXNwb3NlIiwiaW5zdCIsImdldFJlZ2lzdHJhdGlvbiIsInZhbHVlIiwidHJhbnNpZW50IiwiY3JlYXRlSW5zdGFuY2UiLCJzaW5nbGV0b24iLCJnZXRPckNyZWF0ZUluc3RhbmNlIiwicmVxdWVzdCIsIkVycm9yIiwidHlwZSIsImlzSW5zdGFuY2UiLCJjYWNoZUtleSIsImV4aXN0aW5nSW5zdGFuY2UiLCJnZXQiLCJpbnN0YW5jZSIsImNhbkNvbnN0cnVjdCIsImRlcHMiLCJyZXNvbHZlRGVwZW5kZW5jaWVzIiwicGFyYW1zIiwicGFyYW10eXBlcyIsImluamVjdFRva2VucyIsImluamVjdHRva2VuIiwicmVzb2x2ZWQiLCJpIiwidG9rZW4iLCJkZXAiLCJyZWdpc3RlclR5cGUiLCJ0eXBlT3JLZXkiLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FHQ0EsT0FBTyxFQUNQQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsY0FBYyxRQUNSLHlDQUE2QjtBQUNwQyxTQUFTQyxNQUFNLFFBQVEsc0NBQW1CO0FBQzFDLFNBQVNDLFlBQVksRUFBRUMsa0JBQWtCLEVBQUVDLE1BQU0sUUFBUSxjQUFjO0FBRXZFLFNBQVNDLGVBQWUsUUFBUSxzQ0FBc0M7QUFFdEUsU0FBU0MsbUJBQW1CLEVBQUVDLFlBQVksUUFBUSxxQkFBcUI7QUFFdkUsU0FBU0MsZUFBZSxRQUFRLHdCQUF3QjtBQVF4RCxPQUFPLE1BQU1DO0lBQ0xDLElBQVk7SUFDVEMsWUFBWSxJQUFJQyxNQUF1QjtJQUN6Q0MsZ0JBQWlDO0lBQ2pDQyxVQUFvQjtJQUNwQkMsU0FBUyxJQUFJSCxNQUE2QjtJQUMxQ0ksU0FBU2YsT0FBT2UsTUFBTSxDQUFDUCxTQUFTUSxJQUFJLEVBQUU7SUFDdENDLGFBQWEsTUFBTTtJQUMzQixZQUFtQkMsT0FBeUIsQ0FBRTtRQUM3QyxJQUFJLENBQUNULEdBQUcsR0FBR1MsU0FBU1Q7UUFDcEIsSUFBSSxDQUFD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
|