@decohere/crucible 0.0.1-dev.4 → 0.0.1-dev.40

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.
Files changed (45) hide show
  1. package/commonjs/src/const.js +33 -0
  2. package/commonjs/src/decorators/index.js +21 -0
  3. package/commonjs/src/decorators/inject.decorator.js +27 -0
  4. package/commonjs/src/decorators/injectable.dectorator.js +16 -0
  5. package/commonjs/src/index.js +22 -0
  6. package/commonjs/src/models/registration-key.model.js +31 -0
  7. package/commonjs/src/models/service-registration.model.js +30 -0
  8. package/commonjs/src/services/crucible-builder.js +68 -0
  9. package/commonjs/src/services/crucible.js +165 -0
  10. package/commonjs/src/services/index.js +21 -0
  11. package/commonjs/src/services/service-registry.js +50 -0
  12. package/commonjs/src/types/errors.js +29 -0
  13. package/commonjs/src/types/index.js +20 -0
  14. package/commonjs/src/types/types.js +6 -0
  15. package/{src → es6/src}/decorators/inject.decorator.js +2 -2
  16. package/es6/src/services/crucible.js +155 -0
  17. package/package.json +3 -3
  18. package/types/src/const.d.ts +9 -0
  19. package/types/src/decorators/index.d.ts +2 -0
  20. package/types/src/decorators/inject.decorator.d.ts +5 -0
  21. package/types/src/decorators/injectable.dectorator.d.ts +1 -0
  22. package/types/src/index.d.ts +3 -0
  23. package/types/src/models/registration-key.model.d.ts +7 -0
  24. package/types/src/models/service-registration.model.d.ts +11 -0
  25. package/types/src/services/crucible-builder.d.ts +26 -0
  26. package/types/src/services/crucible.d.ts +31 -0
  27. package/types/src/services/index.d.ts +2 -0
  28. package/types/src/services/service-registry.d.ts +16 -0
  29. package/types/src/types/errors.d.ts +6 -0
  30. package/types/src/types/index.d.ts +1 -0
  31. package/types/src/types/types.d.ts +1 -0
  32. package/src/services/crucible.js +0 -133
  33. package/tests/container.spec.js +0 -259
  34. /package/{src → es6/src}/const.js +0 -0
  35. /package/{src → es6/src}/decorators/index.js +0 -0
  36. /package/{src → es6/src}/decorators/injectable.dectorator.js +0 -0
  37. /package/{src → es6/src}/index.js +0 -0
  38. /package/{src → es6/src}/models/registration-key.model.js +0 -0
  39. /package/{src → es6/src}/models/service-registration.model.js +0 -0
  40. /package/{src → es6/src}/services/crucible-builder.js +0 -0
  41. /package/{src → es6/src}/services/index.js +0 -0
  42. /package/{src → es6/src}/services/service-registry.js +0 -0
  43. /package/{src → es6/src}/types/errors.js +0 -0
  44. /package/{src → es6/src}/types/index.js +0 -0
  45. /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/PyBwYXJhbXNbaV0ubmFtZTtcblx0XHRcdGNvbnN0IGRlcCA9IGlzQXJyYXlUeXBlKHBhcmFtc1tpXSkgPyB0aGlzLnJlc29sdmVNYW55KHRva2VuKSA6IHRoaXMucmVzb2x2ZSh0b2tlbik7XG5cdFx0XHRyZXNvbHZlZCA9IFsuLi5yZXNvbHZlZCwgZGVwXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc29sdmVkO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3RlckxpZmV0aW1lU2NvcGUoKSB7XG5cdFx0dGhpcy5zZXJ2aWNlUmVnaXN0cnkucmVnaXN0ZXJUeXBlKFNjb3Blcy5yZXF1ZXN0LCB7XG5cdFx0XHR0eXBlT3JLZXk6IExpZmV0aW1lU2NvcGVUb2tlbixcblx0XHRcdHR5cGVPckluc3RhbmNlOiB0aGlzLFxuXHRcdH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiZ2V0TWV0YSIsImlzQXJyYXlUeXBlIiwiaXNDb25zdHJ1Y3RhYmxlIiwiUmVmbGVjdGlvbk1ldGEiLCJzY3JpYmUiLCJDcnVjaWJsZU1ldGEiLCJMaWZldGltZVNjb3BlVG9rZW4iLCJTY29wZXMiLCJSZWdpc3RyYXRpb25LZXkiLCJEdXBsaWNhdGVTY29wZUVycm9yIiwiUmVzb2x2ZUVycm9yIiwiU2VydmljZVJlZ2lzdHJ5IiwiQ3J1Y2libGUiLCJrZXkiLCJpbnN0YW5jZXMiLCJNYXAiLCJzZXJ2aWNlUmVnaXN0cnkiLCJyb290U2NvcGUiLCJzY29wZXMiLCJsb2dnZXIiLCJuYW1lIiwiaXNEaXNwb3NlZCIsIm9wdGlvbnMiLCJyZWdpc3RlckxpZmV0aW1lU2NvcGUiLCJyZXNvbHZlTWFueSIsInJlc29sdmVSZXF1ZXN0IiwicmVnaXN0cmF0aW9ucyIsImdldFJlZ2lzdHJhdGlvbkZyb20iLCJzZXJ2aWNlcyIsIkFycmF5Iiwib2YiLCJyZWdpc3RyYXRpb24iLCJzZXJ2aWNlIiwicmVzb2x2ZVJlZ2lzdHJhdGlvbiIsInB1c2giLCJyZXNvbHZlIiwid2FybiIsInRvU3RyaW5nIiwibGVuZ3RoIiwiYmVnaW5TY29wZSIsImhhcyIsInNjb3BlIiwic2V0IiwiU3ltYm9sIiwiZGlzcG9zZSIsImRpc3Bvc2VTeW5jIiwiYXN5bmNEaXNwb3NlIiwiZGlzcG9zZUFzeW5jIiwiaW5zdCIsImdldFJlZ2lzdHJhdGlvbiIsInZhbHVlIiwidHJhbnNpZW50IiwiY3JlYXRlSW5zdGFuY2UiLCJzaW5nbGV0b24iLCJnZXRPckNyZWF0ZUluc3RhbmNlIiwicmVxdWVzdCIsIkVycm9yIiwidHlwZSIsImlzSW5zdGFuY2UiLCJjYWNoZUtleSIsImV4aXN0aW5nSW5zdGFuY2UiLCJnZXQiLCJpbnN0YW5jZSIsImNhbkNvbnN0cnVjdCIsImRlcHMiLCJyZXNvbHZlRGVwZW5kZW5jaWVzIiwicGFyYW1zIiwicGFyYW10eXBlcyIsImluamVjdFRva2VucyIsImluamVjdHRva2VuIiwicmVzb2x2ZWQiLCJpIiwidG9rZW4iLCJkZXAiLCJyZWdpc3RlclR5cGUiLCJ0eXBlT3JLZXkiLCJ0eXBlT3JJbnN0YW5jZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FHQ0EsT0FBTyxFQUNQQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsY0FBYyxRQUNSLDZCQUE2QjtBQUNwQyxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLFlBQVksRUFBRUMsa0JBQWtCLEVBQUVDLE1BQU0sUUFBUSxjQUFjO0FBRXZFLFNBQVNDLGVBQWUsUUFBUSxzQ0FBc0M7QUFFdEUsU0FBU0MsbUJBQW1CLEVBQUVDLFlBQVksUUFBUSxxQkFBcUI7QUFFdkUsU0FBU0MsZUFBZSxRQUFRLHdCQUF3QjtBQVF4RCxPQUFPLE1BQU1DO0lBQ0xDLElBQVk7SUFDVEMsWUFBWSxJQUFJQyxNQUF1QjtJQUN6Q0MsZ0JBQWlDO0lBQ2pDQyxVQUFvQjtJQUNwQkMsU0FBUyxJQUFJSCxNQUE2QjtJQUMxQ0ksU0FBU2YsT0FBT2UsTUFBTSxDQUFDUCxTQUFTUSxJQUFJLEVBQUU7SUFDdENDLGFBQWEsTUFBTTtJQUMzQixZQUFtQkMsT0FBeUIsQ0FBRTtRQUM3QyxJQUFJLENBQUNULEdBQUcsR0FBR1MsU0FBU1Q7UUFDcEIsSUFBSSxDQUFDRyxlQUFlLEdBQUcsSUFBSUwsZ0JBQWdCVyxTQUFTTjtRQUNwRCxJQUFJLENBQUNPLHFCQUFxQjtRQUMxQixJQUFJLENBQUNOLFNBQVMsR0FBR0ssU0FBU0wsYUFBYSxJQUFJO0lBQzVDO0lBRU9PLFlBQXVDQyxjQUFpQyxFQUFPO1FBQ3JGLE1BQU1aLE1BQU0sSUFBSUwsZ0JBQWdCaUI7UUFDaEMsTUFBTUMsZ0JBQWdCLElBQUksQ0FBQ0MsbUJBQW1CLENBQUNkLFFBQVEsRUFBRTtRQUV6RCxNQUFNZSxXQUFXQyxNQUFNQyxFQUFFO1FBQ3pCLEtBQUssTUFBTUMsZ0JBQWdCTCxjQUFlO1lBQ3pDLE1BQU1NLFVBQVUsSUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decohere/crucible",
3
- "version": "0.0.1-dev.4",
3
+ "version": "0.0.1-dev.40",
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.4",
34
- "@decohere/scribe": "0.0.1-dev.4"
33
+ "@decohere/nexus": "0.0.1-dev.40",
34
+ "@decohere/scribe": "0.0.1-dev.40"
35
35
  },
36
36
  "devDependencies": {}
37
37
  }
@@ -0,0 +1,9 @@
1
+ export declare const LifetimeScopeToken: unique symbol;
2
+ export declare const CrucibleMeta: {
3
+ injecttoken: string;
4
+ };
5
+ export declare const Scopes: {
6
+ request: "request";
7
+ singleton: "single-instance";
8
+ transient: "transient";
9
+ };
@@ -0,0 +1,2 @@
1
+ export * from "./inject.decorator.js";
2
+ export * from "./injectable.dectorator.js";
@@ -0,0 +1,5 @@
1
+ export type InjectionMetadata = Map<number, InjectionToken>;
2
+ export type InjectionToken = {
3
+ key: string | symbol;
4
+ };
5
+ export declare function inject(key: string | symbol): (target: object, _propertyKey: string | symbol | undefined, idx: number) => void;
@@ -0,0 +1 @@
1
+ export declare function injectable(): ClassDecorator;
@@ -0,0 +1,3 @@
1
+ export * from "./const.js";
2
+ export * from "./services/index.js";
3
+ export * from "./types/index.js";
@@ -0,0 +1,7 @@
1
+ import type { Constructable } from "@decohere/nexus/reflection";
2
+ export declare class RegistrationKey {
3
+ constructor(key: string | symbol | Constructable);
4
+ value: string;
5
+ private getValue;
6
+ toString(): string;
7
+ }
@@ -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,2 @@
1
+ export * from "./crucible.js";
2
+ export * from "./crucible-builder.js";
@@ -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,6 @@
1
+ export declare class ResolveError extends Error {
2
+ }
3
+ export declare class DuplicateScopeError extends Error {
4
+ }
5
+ export declare class RegistrationError extends Error {
6
+ }
@@ -0,0 +1 @@
1
+ export * from "./types.js";
@@ -0,0 +1 @@
1
+ export type { ContainerBuilder, IContainer, LifetimeScope, ResolveRequest, Scope, ServiceProvider, } from "@decohere/nexus/composition";
@@ -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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