jitar 0.3.1 → 0.3.2
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/dist/client.d.ts +3 -0
- package/dist/client.js +24 -0
- package/dist/core/Context.d.ts +5 -0
- package/dist/core/Context.js +7 -0
- package/dist/core/ErrorManager.d.ts +3 -0
- package/dist/core/ErrorManager.js +11 -0
- package/dist/core/Implementation.d.ts +10 -0
- package/dist/core/Implementation.js +44 -0
- package/dist/core/Procedure.d.ts +13 -0
- package/dist/core/Procedure.js +58 -0
- package/dist/core/Segment.d.ts +13 -0
- package/dist/core/Segment.js +36 -0
- package/dist/core/SegmentBuilder.d.ts +6 -0
- package/dist/core/SegmentBuilder.js +32 -0
- package/dist/core/Version.d.ts +13 -0
- package/dist/core/Version.js +50 -0
- package/dist/core/definitions/AccessLevel.d.ts +2 -0
- package/dist/core/definitions/AccessLevel.js +2 -0
- package/dist/core/errors/BadRequest.d.ts +3 -0
- package/dist/core/errors/BadRequest.js +6 -0
- package/dist/core/errors/Forbidden.d.ts +3 -0
- package/dist/core/errors/Forbidden.js +6 -0
- package/dist/core/errors/ImplementationNotFound.d.ts +4 -0
- package/dist/core/errors/ImplementationNotFound.js +7 -0
- package/dist/core/errors/InvalidVersionNumber.d.ts +4 -0
- package/dist/core/errors/InvalidVersionNumber.js +7 -0
- package/dist/core/errors/MissingParameterValue.d.ts +4 -0
- package/dist/core/errors/MissingParameterValue.js +7 -0
- package/dist/core/errors/NotFound.d.ts +3 -0
- package/dist/core/errors/NotFound.js +6 -0
- package/dist/core/errors/NotImplemented.d.ts +3 -0
- package/dist/core/errors/NotImplemented.js +6 -0
- package/dist/core/errors/PaymentRequired.d.ts +3 -0
- package/dist/core/errors/PaymentRequired.js +6 -0
- package/dist/core/errors/ProcedureNotFound.d.ts +4 -0
- package/dist/core/errors/ProcedureNotFound.js +7 -0
- package/dist/core/errors/Teapot.d.ts +3 -0
- package/dist/core/errors/Teapot.js +6 -0
- package/dist/core/errors/Unauthorized.d.ts +3 -0
- package/dist/core/errors/Unauthorized.js +6 -0
- package/dist/core/errors/UnknownParameter.d.ts +4 -0
- package/dist/core/errors/UnknownParameter.js +7 -0
- package/dist/core/interfaces/Runner.d.ts +4 -0
- package/dist/core/interfaces/Runner.js +1 -0
- package/dist/core/reflection/ParameterParser.d.ts +5 -0
- package/dist/core/reflection/ParameterParser.js +51 -0
- package/dist/core/reflection/ReflectionHelper.d.ts +13 -0
- package/dist/core/reflection/ReflectionHelper.js +69 -0
- package/dist/core/reflection/models/ReflectionField.d.ts +8 -0
- package/dist/core/reflection/models/ReflectionField.js +14 -0
- package/dist/core/reflection/models/ReflectionParameter.d.ts +7 -0
- package/dist/core/reflection/models/ReflectionParameter.js +11 -0
- package/dist/core/types/Component.d.ts +5 -0
- package/dist/core/types/Component.js +1 -0
- package/dist/core/types/FlexObject.d.ts +4 -0
- package/dist/core/types/FlexObject.js +1 -0
- package/dist/core/types/Module.d.ts +3 -0
- package/dist/core/types/Module.js +1 -0
- package/dist/core/types/SegmentImplementation.d.ts +6 -0
- package/dist/core/types/SegmentImplementation.js +1 -0
- package/dist/core/types/SegmentModule.d.ts +5 -0
- package/dist/core/types/SegmentModule.js +1 -0
- package/dist/core/types/SegmentProcedure.d.ts +7 -0
- package/dist/core/types/SegmentProcedure.js +1 -0
- package/dist/core/utils/FqnBuilder.d.ts +3 -0
- package/dist/core/utils/FqnBuilder.js +5 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.js +2 -0
- package/dist/lib.d.ts +35 -0
- package/dist/lib.js +30 -0
- package/dist/runtime/ClientId.d.ts +4 -0
- package/dist/runtime/ClientId.js +11 -0
- package/dist/runtime/Gateway.d.ts +5 -0
- package/dist/runtime/Gateway.js +3 -0
- package/dist/runtime/LocalGateway.d.ts +14 -0
- package/dist/runtime/LocalGateway.js +61 -0
- package/dist/runtime/LocalNode.d.ts +18 -0
- package/dist/runtime/LocalNode.js +75 -0
- package/dist/runtime/LocalRepository.d.ts +17 -0
- package/dist/runtime/LocalRepository.js +94 -0
- package/dist/runtime/Node.d.ts +3 -0
- package/dist/runtime/Node.js +3 -0
- package/dist/runtime/NodeBalancer.d.ts +9 -0
- package/dist/runtime/NodeBalancer.js +34 -0
- package/dist/runtime/NodeMonitor.d.ts +7 -0
- package/dist/runtime/NodeMonitor.js +38 -0
- package/dist/runtime/ProcedureRunner.d.ts +9 -0
- package/dist/runtime/ProcedureRunner.js +11 -0
- package/dist/runtime/ProcedureRuntime.d.ts +13 -0
- package/dist/runtime/ProcedureRuntime.js +25 -0
- package/dist/runtime/Proxy.d.ts +18 -0
- package/dist/runtime/Proxy.js +33 -0
- package/dist/runtime/Remote.d.ts +15 -0
- package/dist/runtime/Remote.js +102 -0
- package/dist/runtime/RemoteGateway.d.ts +11 -0
- package/dist/runtime/RemoteGateway.js +22 -0
- package/dist/runtime/RemoteNode.d.ts +12 -0
- package/dist/runtime/RemoteNode.js +29 -0
- package/dist/runtime/RemoteRepository.d.ts +14 -0
- package/dist/runtime/RemoteRepository.js +34 -0
- package/dist/runtime/Repository.d.ts +11 -0
- package/dist/runtime/Repository.js +3 -0
- package/dist/runtime/Runtime.d.ts +9 -0
- package/dist/runtime/Runtime.js +27 -0
- package/dist/runtime/caching/CacheBuilder.d.ts +6 -0
- package/dist/runtime/caching/CacheBuilder.js +249 -0
- package/dist/runtime/caching/ImportRewriter.d.ts +4 -0
- package/dist/runtime/caching/ImportRewriter.js +49 -0
- package/dist/runtime/caching/RemoteBuilder.d.ts +5 -0
- package/dist/runtime/caching/RemoteBuilder.js +31 -0
- package/dist/runtime/caching/SourceAppender.d.ts +5 -0
- package/dist/runtime/caching/SourceAppender.js +30 -0
- package/dist/runtime/caching/definitions/Keywords.d.ts +2 -0
- package/dist/runtime/caching/definitions/Keywords.js +2 -0
- package/dist/runtime/caching/errors/InvalidSegmentFilename.d.ts +3 -0
- package/dist/runtime/caching/errors/InvalidSegmentFilename.js +5 -0
- package/dist/runtime/caching/errors/MissingModuleExport.d.ts +3 -0
- package/dist/runtime/caching/errors/MissingModuleExport.js +5 -0
- package/dist/runtime/caching/errors/SegmentFileNotLoaded.d.ts +3 -0
- package/dist/runtime/caching/errors/SegmentFileNotLoaded.js +5 -0
- package/dist/runtime/caching/errors/SegmentModuleNotLoaded.d.ts +3 -0
- package/dist/runtime/caching/errors/SegmentModuleNotLoaded.js +5 -0
- package/dist/runtime/caching/models/ApplicationModule.d.ts +9 -0
- package/dist/runtime/caching/models/ApplicationModule.js +19 -0
- package/dist/runtime/caching/models/Implementation.d.ts +12 -0
- package/dist/runtime/caching/models/Implementation.js +27 -0
- package/dist/runtime/caching/models/Procedure.d.ts +9 -0
- package/dist/runtime/caching/models/Procedure.js +15 -0
- package/dist/runtime/caching/models/Segment.d.ts +10 -0
- package/dist/runtime/caching/models/Segment.js +16 -0
- package/dist/runtime/caching/models/SegmentModule.d.ts +10 -0
- package/dist/runtime/caching/models/SegmentModule.js +14 -0
- package/dist/runtime/caching/types/SegmentFile.d.ts +5 -0
- package/dist/runtime/caching/types/SegmentFile.js +1 -0
- package/dist/runtime/caching/types/SegmentImportProperties.d.ts +6 -0
- package/dist/runtime/caching/types/SegmentImportProperties.js +1 -0
- package/dist/runtime/caching/types/SegmentImports.d.ts +5 -0
- package/dist/runtime/caching/types/SegmentImports.js +1 -0
- package/dist/runtime/errors/ClientNotFound.d.ts +3 -0
- package/dist/runtime/errors/ClientNotFound.js +6 -0
- package/dist/runtime/errors/FileNotFound.d.ts +3 -0
- package/dist/runtime/errors/FileNotFound.js +6 -0
- package/dist/runtime/errors/InvalidClientId.d.ts +3 -0
- package/dist/runtime/errors/InvalidClientId.js +6 -0
- package/dist/runtime/errors/InvalidJitarHooks.d.ts +3 -0
- package/dist/runtime/errors/InvalidJitarHooks.js +6 -0
- package/dist/runtime/errors/InvalidSegmentFile.d.ts +3 -0
- package/dist/runtime/errors/InvalidSegmentFile.js +6 -0
- package/dist/runtime/errors/ModuleNotLoaded.d.ts +3 -0
- package/dist/runtime/errors/ModuleNotLoaded.js +6 -0
- package/dist/runtime/errors/NoNodeAvailable.d.ts +3 -0
- package/dist/runtime/errors/NoNodeAvailable.js +6 -0
- package/dist/runtime/errors/RepositoryNotAvaiable.d.ts +3 -0
- package/dist/runtime/errors/RepositoryNotAvaiable.js +6 -0
- package/dist/runtime/errors/RuntimeNotAvailable.d.ts +3 -0
- package/dist/runtime/errors/RuntimeNotAvailable.js +6 -0
- package/dist/runtime/errors/SegmentNotFound.d.ts +3 -0
- package/dist/runtime/errors/SegmentNotFound.js +6 -0
- package/dist/runtime/hooks/dependencies.d.ts +2 -0
- package/dist/runtime/hooks/dependencies.js +9 -0
- package/dist/runtime/hooks/runtime.d.ts +3 -0
- package/dist/runtime/hooks/runtime.js +16 -0
- package/dist/runtime/interfaces/FileManager.d.ts +11 -0
- package/dist/runtime/interfaces/FileManager.js +1 -0
- package/dist/runtime/interfaces/HealthCheck.d.ts +3 -0
- package/dist/runtime/interfaces/HealthCheck.js +1 -0
- package/dist/runtime/interfaces/Middleware.d.ts +5 -0
- package/dist/runtime/interfaces/Middleware.js +1 -0
- package/dist/runtime/middleware/CorsMiddleware.d.ts +8 -0
- package/dist/runtime/middleware/CorsMiddleware.js +16 -0
- package/dist/runtime/models/File.d.ts +9 -0
- package/dist/runtime/models/File.js +14 -0
- package/dist/runtime/serialization/ArrayBufferSerializer.d.ts +10 -0
- package/dist/runtime/serialization/ArrayBufferSerializer.js +54 -0
- package/dist/runtime/serialization/ArraySerializer.d.ts +7 -0
- package/dist/runtime/serialization/ArraySerializer.js +15 -0
- package/dist/runtime/serialization/ClassSerializer.d.ts +10 -0
- package/dist/runtime/serialization/ClassSerializer.js +74 -0
- package/dist/runtime/serialization/DateSerializer.d.ts +9 -0
- package/dist/runtime/serialization/DateSerializer.js +21 -0
- package/dist/runtime/serialization/MapSerializer.d.ts +9 -0
- package/dist/runtime/serialization/MapSerializer.js +35 -0
- package/dist/runtime/serialization/ObjectSerializer.d.ts +9 -0
- package/dist/runtime/serialization/ObjectSerializer.js +21 -0
- package/dist/runtime/serialization/SetSerializer.d.ts +9 -0
- package/dist/runtime/serialization/SetSerializer.js +23 -0
- package/dist/runtime/serialization/ValueSerializer.d.ts +8 -0
- package/dist/runtime/serialization/ValueSerializer.js +69 -0
- package/dist/runtime/serialization/errors/ClassNotFound.d.ts +3 -0
- package/dist/runtime/serialization/errors/ClassNotFound.js +6 -0
- package/dist/runtime/serialization/errors/InvalidClass.d.ts +3 -0
- package/dist/runtime/serialization/errors/InvalidClass.js +6 -0
- package/dist/runtime/serialization/errors/InvalidPropertyType.d.ts +4 -0
- package/dist/runtime/serialization/errors/InvalidPropertyType.js +7 -0
- package/dist/runtime/serialization/interfaces/Serializer.d.ts +4 -0
- package/dist/runtime/serialization/interfaces/Serializer.js +1 -0
- package/dist/runtime/serialization/types/SerializableObject.d.ts +3 -0
- package/dist/runtime/serialization/types/SerializableObject.js +1 -0
- package/dist/runtime/serialization/types/Serialized.d.ts +5 -0
- package/dist/runtime/serialization/types/Serialized.js +1 -0
- package/dist/runtime/serialization/types/SerializedArrayBuffer.d.ts +6 -0
- package/dist/runtime/serialization/types/SerializedArrayBuffer.js +1 -0
- package/dist/runtime/serialization/types/SerializedClass.d.ts +8 -0
- package/dist/runtime/serialization/types/SerializedClass.js +1 -0
- package/dist/runtime/serialization/types/SerializedDate.d.ts +5 -0
- package/dist/runtime/serialization/types/SerializedDate.js +1 -0
- package/dist/runtime/serialization/types/SerializedMap.d.ts +8 -0
- package/dist/runtime/serialization/types/SerializedMap.js +1 -0
- package/dist/runtime/serialization/types/SerializedObject.d.ts +4 -0
- package/dist/runtime/serialization/types/SerializedObject.js +1 -0
- package/dist/runtime/serialization/types/SerializedSet.d.ts +5 -0
- package/dist/runtime/serialization/types/SerializedSet.js +1 -0
- package/dist/runtime/serialization/types/TypedArray.d.ts +2 -0
- package/dist/runtime/serialization/types/TypedArray.js +1 -0
- package/dist/runtime/types/JitarHooks.d.ts +6 -0
- package/dist/runtime/types/JitarHooks.js +1 -0
- package/dist/runtime/types/ModuleImporter.d.ts +3 -0
- package/dist/runtime/types/ModuleImporter.js +1 -0
- package/dist/runtime/types/NextHandler.d.ts +2 -0
- package/dist/runtime/types/NextHandler.js +1 -0
- package/dist/runtime/utils/ModuleAnalyser.d.ts +7 -0
- package/dist/runtime/utils/ModuleAnalyser.js +34 -0
- package/dist/runtime/utils/ModuleLoader.d.ts +8 -0
- package/dist/runtime/utils/ModuleLoader.js +30 -0
- package/dist/runtime/utils/UrlRewriter.d.ts +4 -0
- package/dist/runtime/utils/UrlRewriter.js +36 -0
- package/package.json +1 -1
package/dist/client.d.ts
ADDED
package/dist/client.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import LocalNode from './runtime/LocalNode.js';
|
|
2
|
+
import RemoteGateway from './runtime/RemoteGateway.js';
|
|
3
|
+
import RemoteRepository from './runtime/RemoteRepository.js';
|
|
4
|
+
let client = undefined;
|
|
5
|
+
const resolvers = [];
|
|
6
|
+
export async function startClient(...segmentFiles) {
|
|
7
|
+
const remoteUrl = document.location.origin;
|
|
8
|
+
const node = new LocalNode();
|
|
9
|
+
const gateway = new RemoteGateway(remoteUrl);
|
|
10
|
+
const repository = new RemoteRepository(remoteUrl);
|
|
11
|
+
await node.setGateway(gateway);
|
|
12
|
+
await node.setRepository(repository, segmentFiles);
|
|
13
|
+
client = node;
|
|
14
|
+
resolvers.forEach((resolve) => resolve(node));
|
|
15
|
+
return node;
|
|
16
|
+
}
|
|
17
|
+
export async function getClient() {
|
|
18
|
+
if (client === undefined) {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
resolvers.push(resolve);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return client;
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export default class ErrorManager {
|
|
2
|
+
static handle(error, name, version) {
|
|
3
|
+
const parentMessage = error instanceof Error ? error.message : String(error);
|
|
4
|
+
const newMessage = `${parentMessage}\n[${name} | v${version}]`;
|
|
5
|
+
if (error instanceof Error) {
|
|
6
|
+
error.message = newMessage;
|
|
7
|
+
return error;
|
|
8
|
+
}
|
|
9
|
+
return new Error(newMessage);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import ReflectionParameter from './reflection/models/ReflectionParameter.js';
|
|
2
|
+
import Version from './Version.js';
|
|
3
|
+
export default class Implementation {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(version: Version, access: string, parameters: ReflectionParameter[], executable: Function);
|
|
6
|
+
get version(): Version;
|
|
7
|
+
get public(): boolean;
|
|
8
|
+
get parameters(): ReflectionParameter[];
|
|
9
|
+
run(args: Map<string, unknown>, headers: Map<string, string>): Promise<unknown>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import MissingParameterValue from './errors/MissingParameterValue.js';
|
|
2
|
+
import UnknownParameter from './errors/UnknownParameter.js';
|
|
3
|
+
import * as AccessLevel from './definitions/AccessLevel.js';
|
|
4
|
+
import Context from './Context.js';
|
|
5
|
+
export default class Implementation {
|
|
6
|
+
#version;
|
|
7
|
+
#access;
|
|
8
|
+
#parameters;
|
|
9
|
+
#executable;
|
|
10
|
+
constructor(version, access, parameters, executable) {
|
|
11
|
+
this.#version = version;
|
|
12
|
+
this.#access = access;
|
|
13
|
+
this.#parameters = parameters;
|
|
14
|
+
this.#executable = executable;
|
|
15
|
+
}
|
|
16
|
+
get version() { return this.#version; }
|
|
17
|
+
get public() { return this.#access === AccessLevel.PUBLIC; }
|
|
18
|
+
get parameters() { return this.#parameters; }
|
|
19
|
+
async run(args, headers) {
|
|
20
|
+
const context = this.#createContext(headers);
|
|
21
|
+
const values = this.#extractParameterValues(args);
|
|
22
|
+
return await this.#executable.call(context, ...values);
|
|
23
|
+
}
|
|
24
|
+
#createContext(headers) {
|
|
25
|
+
return new Context(headers);
|
|
26
|
+
}
|
|
27
|
+
#extractParameterValues(parameters) {
|
|
28
|
+
const values = [];
|
|
29
|
+
const incommingKeys = Array.from(parameters.keys());
|
|
30
|
+
const knownKeys = this.#parameters.map(parameter => parameter.name);
|
|
31
|
+
const additionalKeys = incommingKeys.filter(key => knownKeys.includes(key) === false);
|
|
32
|
+
if (additionalKeys.length !== 0) {
|
|
33
|
+
throw new UnknownParameter(additionalKeys[0]);
|
|
34
|
+
}
|
|
35
|
+
for (const parameter of this.#parameters) {
|
|
36
|
+
const value = parameters.get(parameter.name);
|
|
37
|
+
if (value === undefined && parameter.isOptional === false) {
|
|
38
|
+
throw new MissingParameterValue(parameter.name);
|
|
39
|
+
}
|
|
40
|
+
values.push(value);
|
|
41
|
+
}
|
|
42
|
+
return values;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Implementation from './Implementation.js';
|
|
2
|
+
import Version from './Version.js';
|
|
3
|
+
export default class Procedure {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(module: string, name: string);
|
|
6
|
+
get module(): string;
|
|
7
|
+
get name(): string;
|
|
8
|
+
get fqn(): string;
|
|
9
|
+
get public(): boolean;
|
|
10
|
+
addImplementation(implementation: Implementation): void;
|
|
11
|
+
getImplementation(version: Version): Implementation | undefined;
|
|
12
|
+
run(version: Version, args: Map<string, unknown>, headers: Map<string, string>): Promise<unknown>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import ImplementationNotFound from './errors/ImplementationNotFound.js';
|
|
2
|
+
import FqnBuilder from './utils/FqnBuilder.js';
|
|
3
|
+
import Version from './Version.js';
|
|
4
|
+
export default class Procedure {
|
|
5
|
+
#module;
|
|
6
|
+
#name;
|
|
7
|
+
#fqn;
|
|
8
|
+
#implementations = new Map();
|
|
9
|
+
#latestImplementation;
|
|
10
|
+
constructor(module, name) {
|
|
11
|
+
this.#module = module;
|
|
12
|
+
this.#name = name;
|
|
13
|
+
this.#fqn = FqnBuilder.build(module, name);
|
|
14
|
+
}
|
|
15
|
+
get module() { return this.#module; }
|
|
16
|
+
get name() { return this.#name; }
|
|
17
|
+
get fqn() { return this.#fqn; }
|
|
18
|
+
get public() {
|
|
19
|
+
const implementations = [...this.#implementations.values()];
|
|
20
|
+
return implementations.some(implementation => implementation.public);
|
|
21
|
+
}
|
|
22
|
+
addImplementation(implementation) {
|
|
23
|
+
this.#implementations.set(implementation.version, implementation);
|
|
24
|
+
if (this.#isNewLatestImplementation(implementation)) {
|
|
25
|
+
this.#latestImplementation = implementation;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
#isNewLatestImplementation(implementation) {
|
|
29
|
+
return this.#latestImplementation === undefined
|
|
30
|
+
|| implementation.version.greater(this.#latestImplementation.version);
|
|
31
|
+
}
|
|
32
|
+
getImplementation(version) {
|
|
33
|
+
const selectedVersion = this.#selectAvailableVersion(version);
|
|
34
|
+
return this.#implementations.get(selectedVersion);
|
|
35
|
+
}
|
|
36
|
+
#selectAvailableVersion(version) {
|
|
37
|
+
let selectedVersion = Version.DEFAULT;
|
|
38
|
+
for (const implementationVersion of this.#implementations.keys()) {
|
|
39
|
+
if (implementationVersion.equals(version)) {
|
|
40
|
+
return implementationVersion;
|
|
41
|
+
}
|
|
42
|
+
if (implementationVersion.greater(version)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (selectedVersion.less(implementationVersion)) {
|
|
46
|
+
selectedVersion = implementationVersion;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return selectedVersion;
|
|
50
|
+
}
|
|
51
|
+
async run(version, args, headers) {
|
|
52
|
+
const implementation = this.getImplementation(version);
|
|
53
|
+
if (implementation === undefined) {
|
|
54
|
+
throw new ImplementationNotFound(this.fqn, version.toString());
|
|
55
|
+
}
|
|
56
|
+
return implementation.run(args, headers);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Runner from './interfaces/Runner.js';
|
|
2
|
+
import Procedure from './Procedure.js';
|
|
3
|
+
import Version from './Version.js';
|
|
4
|
+
export default class Segment implements Runner {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(id: string);
|
|
7
|
+
get id(): string;
|
|
8
|
+
addProcedure(procedure: Procedure): void;
|
|
9
|
+
hasProcedure(fqn: string): boolean;
|
|
10
|
+
getProcedure(fqn: string): Procedure | undefined;
|
|
11
|
+
getPublicProcedures(): Procedure[];
|
|
12
|
+
run(fqn: string, version: Version, args: Map<string, unknown>, headers: Map<string, string>): Promise<unknown>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import ErrorManager from './ErrorManager.js';
|
|
2
|
+
import ProcedureNotFound from './errors/ProcedureNotFound.js';
|
|
3
|
+
export default class Segment {
|
|
4
|
+
#id;
|
|
5
|
+
#procedures = new Map();
|
|
6
|
+
constructor(id) {
|
|
7
|
+
this.#id = id;
|
|
8
|
+
}
|
|
9
|
+
get id() { return this.#id; }
|
|
10
|
+
addProcedure(procedure) {
|
|
11
|
+
this.#procedures.set(procedure.fqn, procedure);
|
|
12
|
+
}
|
|
13
|
+
hasProcedure(fqn) {
|
|
14
|
+
const procedure = this.getProcedure(fqn);
|
|
15
|
+
return procedure !== undefined;
|
|
16
|
+
}
|
|
17
|
+
getProcedure(fqn) {
|
|
18
|
+
return this.#procedures.get(fqn);
|
|
19
|
+
}
|
|
20
|
+
getPublicProcedures() {
|
|
21
|
+
const procedures = [...this.#procedures.values()];
|
|
22
|
+
return procedures.filter(procedure => procedure.public);
|
|
23
|
+
}
|
|
24
|
+
async run(fqn, version, args, headers) {
|
|
25
|
+
const procedure = this.getProcedure(fqn);
|
|
26
|
+
if (procedure === undefined) {
|
|
27
|
+
throw new ProcedureNotFound(fqn);
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return await procedure.run(version, args, headers);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
throw ErrorManager.handle(error, fqn, version.toString());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import ReflectionHelper from './reflection/ReflectionHelper.js';
|
|
2
|
+
import Implementation from './Implementation.js';
|
|
3
|
+
import Procedure from './Procedure.js';
|
|
4
|
+
import Segment from './Segment.js';
|
|
5
|
+
import Version from './Version.js';
|
|
6
|
+
export default class SegmentBuilder {
|
|
7
|
+
static build(id, module) {
|
|
8
|
+
const segment = new Segment(id);
|
|
9
|
+
for (const definition of module.procedures) {
|
|
10
|
+
const procedure = this.#buildProcedure(definition);
|
|
11
|
+
segment.addProcedure(procedure);
|
|
12
|
+
}
|
|
13
|
+
return segment;
|
|
14
|
+
}
|
|
15
|
+
static #buildProcedure(definition) {
|
|
16
|
+
const module = definition.module;
|
|
17
|
+
const name = definition.name;
|
|
18
|
+
const procedure = new Procedure(module, name);
|
|
19
|
+
for (const implementationDefinition of definition.implementations) {
|
|
20
|
+
const implementation = this.#buildImplementation(implementationDefinition);
|
|
21
|
+
procedure.addImplementation(implementation);
|
|
22
|
+
}
|
|
23
|
+
return procedure;
|
|
24
|
+
}
|
|
25
|
+
static #buildImplementation(definition) {
|
|
26
|
+
const version = Version.parse(definition.version);
|
|
27
|
+
const access = definition.access;
|
|
28
|
+
const executable = definition.executable;
|
|
29
|
+
const parameters = ReflectionHelper.getFunctionParameters(executable);
|
|
30
|
+
return new Implementation(version, access, parameters, executable);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default class Version {
|
|
2
|
+
#private;
|
|
3
|
+
static get DEFAULT(): Version;
|
|
4
|
+
constructor(major?: number, minor?: number, patch?: number);
|
|
5
|
+
get major(): number;
|
|
6
|
+
get minor(): number;
|
|
7
|
+
get patch(): number;
|
|
8
|
+
equals(version: Version): boolean;
|
|
9
|
+
greater(version: Version): boolean;
|
|
10
|
+
less(version: Version): boolean;
|
|
11
|
+
toString(): string;
|
|
12
|
+
static parse(number: string): Version;
|
|
13
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import InvalidVersionNumber from './errors/InvalidVersionNumber.js';
|
|
2
|
+
export default class Version {
|
|
3
|
+
static get DEFAULT() { return new Version(0, 0, 0); }
|
|
4
|
+
#major;
|
|
5
|
+
#minor;
|
|
6
|
+
#patch;
|
|
7
|
+
constructor(major = 0, minor = 0, patch = 0) {
|
|
8
|
+
this.#major = major;
|
|
9
|
+
this.#minor = minor;
|
|
10
|
+
this.#patch = patch;
|
|
11
|
+
}
|
|
12
|
+
get major() { return this.#major; }
|
|
13
|
+
get minor() { return this.#minor; }
|
|
14
|
+
get patch() { return this.#patch; }
|
|
15
|
+
equals(version) {
|
|
16
|
+
return this.#major === version.major
|
|
17
|
+
&& this.#minor === version.minor
|
|
18
|
+
&& this.#patch === version.patch;
|
|
19
|
+
}
|
|
20
|
+
greater(version) {
|
|
21
|
+
if (this.#major !== version.major)
|
|
22
|
+
return this.#major > version.major;
|
|
23
|
+
if (this.#minor !== version.minor)
|
|
24
|
+
return this.#minor > version.minor;
|
|
25
|
+
if (this.#patch !== version.patch)
|
|
26
|
+
return this.#patch > version.patch;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
less(version) {
|
|
30
|
+
if (this.#major !== version.major)
|
|
31
|
+
return this.#major < version.major;
|
|
32
|
+
if (this.#minor !== version.minor)
|
|
33
|
+
return this.#minor < version.minor;
|
|
34
|
+
if (this.#patch !== version.patch)
|
|
35
|
+
return this.#patch < version.patch;
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
toString() {
|
|
39
|
+
return `${this.#major}.${this.#minor}.${this.#patch}`;
|
|
40
|
+
}
|
|
41
|
+
static parse(number) {
|
|
42
|
+
const parts = number.split('.');
|
|
43
|
+
switch (parts.length) {
|
|
44
|
+
case 1: return new Version(Number.parseInt(parts[0]));
|
|
45
|
+
case 2: return new Version(Number.parseInt(parts[0]), Number.parseInt(parts[1]));
|
|
46
|
+
case 3: return new Version(Number.parseInt(parts[0]), Number.parseInt(parts[1]), Number.parseInt(parts[2]));
|
|
47
|
+
default: throw new InvalidVersionNumber(number);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import NotFound from './NotFound.js';
|
|
2
|
+
export default class ImplementationNotFound extends NotFound {
|
|
3
|
+
constructor(fqn, version) {
|
|
4
|
+
super(`No implementation found for procedure '${fqn}' with version '${version}'`);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
ImplementationNotFound.source = '/jitar/core/errors/ImplementationNotFound.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import BadRequest from './BadRequest.js';
|
|
2
|
+
export default class MissingParameterValue extends BadRequest {
|
|
3
|
+
constructor(parameterName) {
|
|
4
|
+
super(`Missing value for parameter '${parameterName}'`);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
MissingParameterValue.source = '/jitar/core/errors/MissingParameterValue.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import ReflectionParameter from './models/ReflectionParameter.js';
|
|
2
|
+
const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
|
|
3
|
+
export default class ParameterParser {
|
|
4
|
+
static parse(code, functionIndicator) {
|
|
5
|
+
const pureCode = this.#removeComments(code);
|
|
6
|
+
const parameterString = this.#extractParameterString(pureCode, functionIndicator);
|
|
7
|
+
const parameterList = this.#parseParamaterString(parameterString);
|
|
8
|
+
return parameterList.map(parameter => this.#extractParameter(parameter));
|
|
9
|
+
}
|
|
10
|
+
static #removeComments(code) {
|
|
11
|
+
return code.replace(STRIP_COMMENTS, '');
|
|
12
|
+
}
|
|
13
|
+
static #extractParameterString(code, functionIndicator) {
|
|
14
|
+
const indicatorPosition = code.indexOf(functionIndicator);
|
|
15
|
+
const bodyStart = code.indexOf('{', indicatorPosition);
|
|
16
|
+
const definition = code.substring(indicatorPosition, bodyStart).trim();
|
|
17
|
+
const startPosition = definition.indexOf('(') + 1;
|
|
18
|
+
const endPosition = definition.lastIndexOf(')', startPosition);
|
|
19
|
+
return definition.slice(startPosition, endPosition);
|
|
20
|
+
}
|
|
21
|
+
static #parseParamaterString(parameterString) {
|
|
22
|
+
const parameters = [];
|
|
23
|
+
let level = 0;
|
|
24
|
+
let buffer = '';
|
|
25
|
+
for (let character of parameterString) {
|
|
26
|
+
switch (character) {
|
|
27
|
+
case '(':
|
|
28
|
+
level++;
|
|
29
|
+
break;
|
|
30
|
+
case ')':
|
|
31
|
+
level--;
|
|
32
|
+
break;
|
|
33
|
+
case ',':
|
|
34
|
+
if (level === 0) {
|
|
35
|
+
parameters.push(buffer);
|
|
36
|
+
character = '';
|
|
37
|
+
buffer = '';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
buffer += character;
|
|
41
|
+
}
|
|
42
|
+
if (buffer !== '') {
|
|
43
|
+
parameters.push(buffer);
|
|
44
|
+
}
|
|
45
|
+
return parameters;
|
|
46
|
+
}
|
|
47
|
+
static #extractParameter(parameter) {
|
|
48
|
+
const [name, defaultValue] = parameter.split('=').map(part => part.trim());
|
|
49
|
+
return new ReflectionParameter(name, defaultValue);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import ReflectionField from './models/ReflectionField.js';
|
|
2
|
+
import ReflectionParameter from './models/ReflectionParameter.js';
|
|
3
|
+
export default class ReflectionHelper {
|
|
4
|
+
#private;
|
|
5
|
+
static createInstance(clazz: Function, args?: unknown[]): object;
|
|
6
|
+
static isClassObject(object: object): boolean;
|
|
7
|
+
static getObjectClass(object: object): Function;
|
|
8
|
+
static getParentClass(clazz: Function): Function;
|
|
9
|
+
static getFields(clazz: Function): ReflectionField[];
|
|
10
|
+
static getObjectFields(object: object): ReflectionField[];
|
|
11
|
+
static getConstructorParameters(clazz: Function): ReflectionParameter[];
|
|
12
|
+
static getFunctionParameters(funktion: Function): ReflectionParameter[];
|
|
13
|
+
}
|