@hahnpro/flow-sdk 4.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/FlowApplication.d.ts +35 -0
- package/dist/FlowApplication.js +270 -0
- package/dist/FlowElement.d.ts +50 -0
- package/dist/FlowElement.js +143 -0
- package/dist/FlowEvent.d.ts +19 -0
- package/dist/FlowEvent.js +71 -0
- package/dist/FlowLogger.d.ts +23 -0
- package/dist/FlowLogger.js +57 -0
- package/dist/FlowModule.d.ts +7 -0
- package/dist/FlowModule.js +14 -0
- package/dist/RpcClient.d.ts +11 -0
- package/dist/RpcClient.js +70 -0
- package/dist/TestModule.d.ts +2 -0
- package/dist/TestModule.js +27 -0
- package/dist/amqp.d.ts +33 -0
- package/dist/amqp.js +12 -0
- package/dist/api/Queue.d.ts +15 -0
- package/dist/api/Queue.js +27 -0
- package/dist/api/api.d.ts +62 -0
- package/dist/api/api.js +52 -0
- package/dist/api/asset.interface.d.ts +54 -0
- package/dist/api/asset.interface.js +2 -0
- package/dist/api/asset.service.d.ts +10 -0
- package/dist/api/asset.service.js +21 -0
- package/dist/api/assettypes.service.d.ts +6 -0
- package/dist/api/assettypes.service.js +10 -0
- package/dist/api/content.interface.d.ts +35 -0
- package/dist/api/content.interface.js +12 -0
- package/dist/api/content.service.d.ts +17 -0
- package/dist/api/content.service.js +39 -0
- package/dist/api/data.interface.d.ts +29 -0
- package/dist/api/data.interface.js +2 -0
- package/dist/api/data.service.d.ts +15 -0
- package/dist/api/data.service.js +49 -0
- package/dist/api/endpoint.interface.d.ts +22 -0
- package/dist/api/endpoint.interface.js +2 -0
- package/dist/api/endpoint.service.d.ts +8 -0
- package/dist/api/endpoint.service.js +17 -0
- package/dist/api/events.interface.d.ts +16 -0
- package/dist/api/events.interface.js +2 -0
- package/dist/api/events.service.d.ts +7 -0
- package/dist/api/events.service.js +13 -0
- package/dist/api/http.service.d.ts +26 -0
- package/dist/api/http.service.js +74 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/api/index.js +16 -0
- package/dist/api/mock/api.mock.d.ts +158 -0
- package/dist/api/mock/api.mock.js +111 -0
- package/dist/api/mock/asset.mock.service.d.ts +12 -0
- package/dist/api/mock/asset.mock.service.js +21 -0
- package/dist/api/mock/assetTypes.mock.service.d.ts +6 -0
- package/dist/api/mock/assetTypes.mock.service.js +11 -0
- package/dist/api/mock/content.mock.service.d.ts +18 -0
- package/dist/api/mock/content.mock.service.js +64 -0
- package/dist/api/mock/data.mock.service.d.ts +13 -0
- package/dist/api/mock/data.mock.service.js +52 -0
- package/dist/api/mock/endpoint.mock.service.d.ts +15 -0
- package/dist/api/mock/endpoint.mock.service.js +24 -0
- package/dist/api/mock/events.mock.service.d.ts +7 -0
- package/dist/api/mock/events.mock.service.js +14 -0
- package/dist/api/mock/index.d.ts +9 -0
- package/dist/api/mock/index.js +12 -0
- package/dist/api/mock/secret.mock.service.d.ts +6 -0
- package/dist/api/mock/secret.mock.service.js +11 -0
- package/dist/api/mock/task.mock.service.d.ts +7 -0
- package/dist/api/mock/task.mock.service.js +15 -0
- package/dist/api/mock/timeseries.mock.service.d.ts +19 -0
- package/dist/api/mock/timeseries.mock.service.js +69 -0
- package/dist/api/mock/user.mock.service.d.ts +7 -0
- package/dist/api/mock/user.mock.service.js +14 -0
- package/dist/api/proxy.service.d.ts +11 -0
- package/dist/api/proxy.service.js +17 -0
- package/dist/api/secret.interface.d.ts +7 -0
- package/dist/api/secret.interface.js +2 -0
- package/dist/api/secret.service.d.ts +6 -0
- package/dist/api/secret.service.js +10 -0
- package/dist/api/sidriveiq.interface.d.ts +104 -0
- package/dist/api/sidriveiq.interface.js +2 -0
- package/dist/api/sidriveiq.service.d.ts +97 -0
- package/dist/api/sidriveiq.service.js +97 -0
- package/dist/api/task.interface.d.ts +22 -0
- package/dist/api/task.interface.js +2 -0
- package/dist/api/task.service.d.ts +7 -0
- package/dist/api/task.service.js +13 -0
- package/dist/api/timeseries.interface.d.ts +39 -0
- package/dist/api/timeseries.interface.js +2 -0
- package/dist/api/timeseries.service.d.ts +17 -0
- package/dist/api/timeseries.service.js +38 -0
- package/dist/api/user.service.d.ts +6 -0
- package/dist/api/user.service.js +21 -0
- package/dist/extra-validators.d.ts +1 -0
- package/dist/extra-validators.js +52 -0
- package/dist/flow.interface.d.ts +41 -0
- package/dist/flow.interface.js +2 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +16 -0
- package/dist/rpc_server.py +115 -0
- package/dist/unit-decorators.d.ts +39 -0
- package/dist/unit-decorators.js +157 -0
- package/dist/unit-utils.d.ts +8 -0
- package/dist/unit-utils.js +143 -0
- package/dist/units.d.ts +31 -0
- package/dist/units.js +570 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +106 -0
- package/package.json +64 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlowLogger = exports.defaultLogger = void 0;
|
|
4
|
+
const FlowEvent_1 = require("./FlowEvent");
|
|
5
|
+
exports.defaultLogger = {
|
|
6
|
+
debug: (msg, metadata) => console.debug(msg),
|
|
7
|
+
error: (msg, metadata) => console.error(msg),
|
|
8
|
+
log: (msg, metadata) => console.log(msg),
|
|
9
|
+
warn: (msg, metadata) => console.warn(msg),
|
|
10
|
+
verbose: (msg, metadata) => console.log(msg, metadata),
|
|
11
|
+
};
|
|
12
|
+
class FlowLogger {
|
|
13
|
+
constructor(metadata, logger = exports.defaultLogger, publishEvent) {
|
|
14
|
+
this.metadata = metadata;
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
this.publishEvent = publishEvent;
|
|
17
|
+
this.debug = (message) => this.publish(message, 'debug');
|
|
18
|
+
this.error = (message) => this.publish(message, 'error');
|
|
19
|
+
this.log = (message) => this.publish(message, 'info');
|
|
20
|
+
this.warn = (message) => this.publish(message, 'warn');
|
|
21
|
+
this.verbose = (message) => this.publish(message, 'verbose');
|
|
22
|
+
}
|
|
23
|
+
static getStackTrace() {
|
|
24
|
+
let stack;
|
|
25
|
+
try {
|
|
26
|
+
throw new Error('');
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
stack = error.stack || '';
|
|
30
|
+
}
|
|
31
|
+
stack = stack
|
|
32
|
+
.split('\n')
|
|
33
|
+
.map((line) => line.trim())
|
|
34
|
+
.filter((value) => !value.includes('Logger'));
|
|
35
|
+
return stack.splice(1).join('\n');
|
|
36
|
+
}
|
|
37
|
+
publish(message, level) {
|
|
38
|
+
var _a;
|
|
39
|
+
if (this.publishEvent) {
|
|
40
|
+
const event = new FlowEvent_1.FlowEvent(this.metadata, message, `flow.log.${level}`);
|
|
41
|
+
(_a = this.publishEvent(event)) === null || _a === void 0 ? void 0 : _a.catch((err) => this.logger.error(err, this.metadata));
|
|
42
|
+
}
|
|
43
|
+
switch (level) {
|
|
44
|
+
case 'debug':
|
|
45
|
+
return this.logger.debug(message, this.metadata);
|
|
46
|
+
case 'error':
|
|
47
|
+
return this.logger.error(message, this.metadata);
|
|
48
|
+
case 'warn':
|
|
49
|
+
return this.logger.warn(message, this.metadata);
|
|
50
|
+
case 'verbose':
|
|
51
|
+
return this.logger.verbose(message, this.metadata);
|
|
52
|
+
default:
|
|
53
|
+
this.logger.log(message, this.metadata);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.FlowLogger = FlowLogger;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlowModule = void 0;
|
|
4
|
+
function FlowModule(metadata) {
|
|
5
|
+
const fqnRegExp = new RegExp('^([a-zA-Z][a-zA-Z0-9]*[.-])*[a-zA-Z][a-zA-Z0-9]*$');
|
|
6
|
+
if (!fqnRegExp.test(metadata.name)) {
|
|
7
|
+
throw new Error(`Flow Module name (${metadata.name}) is not valid`);
|
|
8
|
+
}
|
|
9
|
+
return (target) => {
|
|
10
|
+
Reflect.defineMetadata('module:name', metadata.name, target);
|
|
11
|
+
Reflect.defineMetadata('module:declarations', metadata.declarations, target);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
exports.FlowModule = FlowModule;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AmqpConnectionManager } from 'amqp-connection-manager';
|
|
2
|
+
export declare class RpcClient {
|
|
3
|
+
private channel;
|
|
4
|
+
private openRequests;
|
|
5
|
+
constructor(connection: AmqpConnectionManager);
|
|
6
|
+
private onMessage;
|
|
7
|
+
callFunction: (routingKey: string, functionName: string, ...args: any[]) => Promise<unknown>;
|
|
8
|
+
declareFunction: (routingKey: string, name: string) => (...args: any[]) => Promise<unknown>;
|
|
9
|
+
close(): Promise<void>;
|
|
10
|
+
static formatTrace(stack?: string): string;
|
|
11
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RpcClient = void 0;
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
class RpcClient {
|
|
6
|
+
constructor(connection) {
|
|
7
|
+
this.openRequests = new Map();
|
|
8
|
+
this.onMessage = (msg) => {
|
|
9
|
+
if (this.openRequests.has(msg.properties.correlationId)) {
|
|
10
|
+
const { resolve, reject, trace } = this.openRequests.get(msg.properties.correlationId);
|
|
11
|
+
const response = JSON.parse(msg.content.toString());
|
|
12
|
+
switch (response.type) {
|
|
13
|
+
case 'reply':
|
|
14
|
+
resolve(response.value);
|
|
15
|
+
break;
|
|
16
|
+
case 'error': {
|
|
17
|
+
const err = new Error(response.message);
|
|
18
|
+
if (response.stack) {
|
|
19
|
+
const stack = RpcClient.formatTrace(response.stack);
|
|
20
|
+
err.stack = 'Remote Stack\n'.concat(stack, '\nLocal Stack\n', trace);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
err.stack = trace;
|
|
24
|
+
}
|
|
25
|
+
reject(err);
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
default:
|
|
29
|
+
reject(response);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const message = `received unexpected response correlationID: ${msg.properties.correlationId}`;
|
|
35
|
+
console.warn(message);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
this.callFunction = (routingKey, functionName, ...args) => {
|
|
39
|
+
const stack = new Error('test').stack;
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const call = { functionName, arguments: args };
|
|
42
|
+
const correlationId = (0, uuid_1.v4)();
|
|
43
|
+
this.openRequests.set(correlationId, { resolve, reject, trace: RpcClient.formatTrace(stack) });
|
|
44
|
+
this.channel
|
|
45
|
+
.publish('rpc_direct_exchange', routingKey, call, { correlationId, replyTo: 'amq.rabbitmq.reply-to' })
|
|
46
|
+
.catch((err) => reject(err));
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
this.declareFunction = (routingKey, name) => {
|
|
50
|
+
return (...args) => this.callFunction(routingKey, name, ...args);
|
|
51
|
+
};
|
|
52
|
+
if (!connection) {
|
|
53
|
+
throw new Error('currently no amqp connection available');
|
|
54
|
+
}
|
|
55
|
+
this.channel = connection.createChannel({
|
|
56
|
+
json: true,
|
|
57
|
+
setup: (channel) => Promise.all([
|
|
58
|
+
channel.assertExchange('rpc_direct_exchange', 'direct', { durable: false }),
|
|
59
|
+
channel.consume('amq.rabbitmq.reply-to', this.onMessage, { noAck: true }),
|
|
60
|
+
]),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
close() {
|
|
64
|
+
return this.channel.close();
|
|
65
|
+
}
|
|
66
|
+
static formatTrace(stack = '') {
|
|
67
|
+
return stack.split('\n').splice(1).join('\n');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.RpcClient = RpcClient;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TestModule = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const FlowElement_1 = require("./FlowElement");
|
|
6
|
+
const FlowEvent_1 = require("./FlowEvent");
|
|
7
|
+
const FlowModule_1 = require("./FlowModule");
|
|
8
|
+
let TestTrigger = class TestTrigger extends FlowElement_1.FlowTask {
|
|
9
|
+
async onDefault(event) {
|
|
10
|
+
return this.emitOutput(event.getData());
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
(0, tslib_1.__decorate)([
|
|
14
|
+
(0, FlowElement_1.InputStream)('default'),
|
|
15
|
+
(0, tslib_1.__metadata)("design:type", Function),
|
|
16
|
+
(0, tslib_1.__metadata)("design:paramtypes", [FlowEvent_1.FlowEvent]),
|
|
17
|
+
(0, tslib_1.__metadata)("design:returntype", Promise)
|
|
18
|
+
], TestTrigger.prototype, "onDefault", null);
|
|
19
|
+
TestTrigger = (0, tslib_1.__decorate)([
|
|
20
|
+
(0, FlowElement_1.FlowFunction)('test.task.Trigger')
|
|
21
|
+
], TestTrigger);
|
|
22
|
+
let TestModule = class TestModule {
|
|
23
|
+
};
|
|
24
|
+
TestModule = (0, tslib_1.__decorate)([
|
|
25
|
+
(0, FlowModule_1.FlowModule)({ name: 'test', declarations: [TestTrigger] })
|
|
26
|
+
], TestModule);
|
|
27
|
+
exports.TestModule = TestModule;
|
package/dist/amqp.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AmqpConnectionManager, ChannelWrapper } from 'amqp-connection-manager';
|
|
2
|
+
import type { Channel, Connection, ConsumeMessage, Options } from 'amqplib';
|
|
3
|
+
export interface AmqpConnection {
|
|
4
|
+
channel: Channel;
|
|
5
|
+
connection: Connection;
|
|
6
|
+
managedChannel: ChannelWrapper;
|
|
7
|
+
managedConnection: AmqpConnectionManager;
|
|
8
|
+
createSubscriber<T>(handler: (msg: T | undefined, rawMessage?: ConsumeMessage) => Promise<any | undefined>, msgOptions: MessageHandlerOptions): Promise<void>;
|
|
9
|
+
publish(exchange: string, routingKey: string, message: any, options?: Options.Publish): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare class Nack {
|
|
12
|
+
private readonly _requeue;
|
|
13
|
+
constructor(_requeue?: boolean);
|
|
14
|
+
get requeue(): boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface MessageHandlerOptions {
|
|
17
|
+
exchange: string;
|
|
18
|
+
routingKey: string | string[];
|
|
19
|
+
queue?: string;
|
|
20
|
+
queueOptions?: QueueOptions;
|
|
21
|
+
}
|
|
22
|
+
export interface QueueOptions {
|
|
23
|
+
durable?: boolean;
|
|
24
|
+
exclusive?: boolean;
|
|
25
|
+
autoDelete?: boolean;
|
|
26
|
+
arguments?: any;
|
|
27
|
+
messageTtl?: number;
|
|
28
|
+
expires?: number;
|
|
29
|
+
deadLetterExchange?: string;
|
|
30
|
+
deadLetterRoutingKey?: string;
|
|
31
|
+
maxLength?: number;
|
|
32
|
+
maxPriority?: number;
|
|
33
|
+
}
|
package/dist/amqp.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Nack = void 0;
|
|
4
|
+
class Nack {
|
|
5
|
+
constructor(_requeue = false) {
|
|
6
|
+
this._requeue = _requeue;
|
|
7
|
+
}
|
|
8
|
+
get requeue() {
|
|
9
|
+
return this._requeue;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.Nack = Nack;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import PQueue from 'p-queue';
|
|
2
|
+
export declare class Queue extends PQueue {
|
|
3
|
+
private peak;
|
|
4
|
+
private total;
|
|
5
|
+
constructor(options?: QueueOptions);
|
|
6
|
+
getStats(): {
|
|
7
|
+
peak: number;
|
|
8
|
+
pending: number;
|
|
9
|
+
size: number;
|
|
10
|
+
total: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface QueueOptions {
|
|
14
|
+
concurrent?: number;
|
|
15
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Queue = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const p_queue_1 = (0, tslib_1.__importDefault)(require("p-queue"));
|
|
6
|
+
class Queue extends p_queue_1.default {
|
|
7
|
+
constructor(options = { concurrent: 1 }) {
|
|
8
|
+
super({ concurrency: options.concurrent || 1 });
|
|
9
|
+
this.peak = 0;
|
|
10
|
+
this.total = 0;
|
|
11
|
+
this.on('add', () => {
|
|
12
|
+
this.peak = Math.max(this.peak, this.size);
|
|
13
|
+
});
|
|
14
|
+
this.on('active', () => {
|
|
15
|
+
this.total++;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
getStats() {
|
|
19
|
+
return {
|
|
20
|
+
peak: this.peak,
|
|
21
|
+
pending: this.pending,
|
|
22
|
+
size: this.size,
|
|
23
|
+
total: this.total,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.Queue = Queue;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { AssetService } from './asset.service';
|
|
2
|
+
import { AssetTypesService } from './assettypes.service';
|
|
3
|
+
import { ContentService } from './content.service';
|
|
4
|
+
import { EndpointService } from './endpoint.service';
|
|
5
|
+
import { EventsService } from './events.service';
|
|
6
|
+
import { HttpClient } from './http.service';
|
|
7
|
+
import { ProxyService } from './proxy.service';
|
|
8
|
+
import { SecretService } from './secret.service';
|
|
9
|
+
import { SiDriveIqService } from './sidriveiq.service';
|
|
10
|
+
import { TaskService } from './task.service';
|
|
11
|
+
import { TimeSeriesService } from './timeseries.service';
|
|
12
|
+
import { UserService } from './user.service';
|
|
13
|
+
export declare class API {
|
|
14
|
+
httpClient: HttpClient;
|
|
15
|
+
assets: AssetService;
|
|
16
|
+
assetTypes: AssetTypesService;
|
|
17
|
+
contents: ContentService;
|
|
18
|
+
endpoints: EndpointService;
|
|
19
|
+
events: EventsService;
|
|
20
|
+
proxy: ProxyService;
|
|
21
|
+
secrets: SecretService;
|
|
22
|
+
tasks: TaskService;
|
|
23
|
+
timeSeries: TimeSeriesService;
|
|
24
|
+
users: UserService;
|
|
25
|
+
/**
|
|
26
|
+
* @deprecated use "assets" instead
|
|
27
|
+
*/
|
|
28
|
+
assetManager: AssetService;
|
|
29
|
+
/**
|
|
30
|
+
* @deprecated use "contents" instead
|
|
31
|
+
*/
|
|
32
|
+
contentManager: ContentService;
|
|
33
|
+
/**
|
|
34
|
+
* @deprecated use "endpoints" instead
|
|
35
|
+
*/
|
|
36
|
+
endpointManager: EndpointService;
|
|
37
|
+
/**
|
|
38
|
+
* @deprecated use "events" instead
|
|
39
|
+
*/
|
|
40
|
+
eventsManager: EventsService;
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated use "secrets" instead
|
|
43
|
+
*/
|
|
44
|
+
secretsManager: SecretService;
|
|
45
|
+
/**
|
|
46
|
+
* @deprecated use proxy service instead
|
|
47
|
+
*/
|
|
48
|
+
siDrive: SiDriveIqService;
|
|
49
|
+
/**
|
|
50
|
+
* @deprecated use "tasks" instead
|
|
51
|
+
*/
|
|
52
|
+
taskManager: TaskService;
|
|
53
|
+
/**
|
|
54
|
+
* @deprecated use "timeSeries" instead
|
|
55
|
+
*/
|
|
56
|
+
timeSeriesManager: TimeSeriesService;
|
|
57
|
+
/**
|
|
58
|
+
* @deprecated use "users" instead
|
|
59
|
+
*/
|
|
60
|
+
userManager: UserService;
|
|
61
|
+
constructor();
|
|
62
|
+
}
|
package/dist/api/api.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.API = void 0;
|
|
4
|
+
const asset_service_1 = require("./asset.service");
|
|
5
|
+
const assettypes_service_1 = require("./assettypes.service");
|
|
6
|
+
const content_service_1 = require("./content.service");
|
|
7
|
+
const endpoint_service_1 = require("./endpoint.service");
|
|
8
|
+
const events_service_1 = require("./events.service");
|
|
9
|
+
const http_service_1 = require("./http.service");
|
|
10
|
+
const proxy_service_1 = require("./proxy.service");
|
|
11
|
+
const secret_service_1 = require("./secret.service");
|
|
12
|
+
const sidriveiq_service_1 = require("./sidriveiq.service");
|
|
13
|
+
const task_service_1 = require("./task.service");
|
|
14
|
+
const timeseries_service_1 = require("./timeseries.service");
|
|
15
|
+
const user_service_1 = require("./user.service");
|
|
16
|
+
class API {
|
|
17
|
+
constructor() {
|
|
18
|
+
let apiBaseUrl = process.env.API_BASE_URL || 'https://testing.hahnpro.com';
|
|
19
|
+
if (!apiBaseUrl.startsWith('https') && !apiBaseUrl.startsWith('http')) {
|
|
20
|
+
console.info('no protocol specified - using HTTPS');
|
|
21
|
+
apiBaseUrl = `https://${apiBaseUrl}`;
|
|
22
|
+
}
|
|
23
|
+
const authBaseUrl = process.env.AUTH_BASE_URL || apiBaseUrl;
|
|
24
|
+
const realm = process.env.AUTH_REALM || 'hpc';
|
|
25
|
+
const client = process.env.API_USER || 'flow-executor-service';
|
|
26
|
+
const secret = process.env.AUTH_SECRET;
|
|
27
|
+
if (!secret) {
|
|
28
|
+
throw new Error('"API_BASE_URL", "API_USER", "AUTH_REALM" and "AUTH_SECRET" environment variables must be set');
|
|
29
|
+
}
|
|
30
|
+
this.httpClient = new http_service_1.HttpClient(apiBaseUrl, authBaseUrl, realm, client, secret);
|
|
31
|
+
this.assets = new asset_service_1.AssetService(this.httpClient);
|
|
32
|
+
this.assetTypes = new assettypes_service_1.AssetTypesService(this.httpClient);
|
|
33
|
+
this.contents = new content_service_1.ContentService(this.httpClient);
|
|
34
|
+
this.endpoints = new endpoint_service_1.EndpointService(this.httpClient);
|
|
35
|
+
this.events = new events_service_1.EventsService(this.httpClient);
|
|
36
|
+
this.proxy = new proxy_service_1.ProxyService(this.httpClient);
|
|
37
|
+
this.secrets = new secret_service_1.SecretService(this.httpClient);
|
|
38
|
+
this.tasks = new task_service_1.TaskService(this.httpClient);
|
|
39
|
+
this.timeSeries = new timeseries_service_1.TimeSeriesService(this.httpClient);
|
|
40
|
+
this.users = new user_service_1.UserService(this.httpClient);
|
|
41
|
+
this.assetManager = this.assets;
|
|
42
|
+
this.contentManager = this.contents;
|
|
43
|
+
this.endpointManager = this.endpoints;
|
|
44
|
+
this.eventsManager = this.events;
|
|
45
|
+
this.secretsManager = this.secrets;
|
|
46
|
+
this.siDrive = new sidriveiq_service_1.SiDriveIqService(this.httpClient);
|
|
47
|
+
this.taskManager = this.tasks;
|
|
48
|
+
this.timeSeriesManager = this.timeSeries;
|
|
49
|
+
this.userManager = this.users;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.API = API;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export interface Asset {
|
|
2
|
+
id?: string;
|
|
3
|
+
name: string;
|
|
4
|
+
type: string | AssetType;
|
|
5
|
+
type$name?: string;
|
|
6
|
+
readPermissions: string[];
|
|
7
|
+
readWritePermissions: string[];
|
|
8
|
+
tags?: string[];
|
|
9
|
+
parent?: any | Asset;
|
|
10
|
+
parent$name?: string;
|
|
11
|
+
data?: any;
|
|
12
|
+
attachments?: string[];
|
|
13
|
+
image?: string;
|
|
14
|
+
actions?: string[];
|
|
15
|
+
notificationEndpoints?: string[];
|
|
16
|
+
createdAt?: string;
|
|
17
|
+
updatedAt?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface AssetType {
|
|
20
|
+
id?: string;
|
|
21
|
+
name: string;
|
|
22
|
+
allowedParent?: string;
|
|
23
|
+
allowedParent$name?: string;
|
|
24
|
+
readPermissions: string[];
|
|
25
|
+
readWritePermissions: string[];
|
|
26
|
+
typeSchema: any;
|
|
27
|
+
supertype?: string;
|
|
28
|
+
supertype$name?: string;
|
|
29
|
+
uiSchema: any;
|
|
30
|
+
actions?: string[];
|
|
31
|
+
createdAt?: string;
|
|
32
|
+
updatedAt?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface Attachment {
|
|
35
|
+
id?: string;
|
|
36
|
+
filename: string;
|
|
37
|
+
metadata: {
|
|
38
|
+
mimetype: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface Action {
|
|
42
|
+
id?: string;
|
|
43
|
+
name?: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
type?: string;
|
|
46
|
+
method?: string;
|
|
47
|
+
authToken?: string;
|
|
48
|
+
isAuthFromAsset?: boolean;
|
|
49
|
+
url?: string;
|
|
50
|
+
data?: string;
|
|
51
|
+
responseType?: string;
|
|
52
|
+
readPermissions: string[];
|
|
53
|
+
readWritePermissions: string[];
|
|
54
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import FormData from 'form-data';
|
|
2
|
+
import { Asset } from './asset.interface';
|
|
3
|
+
import { Paginated, RequestParameter } from './data.interface';
|
|
4
|
+
import { DataService } from './data.service';
|
|
5
|
+
import { HttpClient } from './http.service';
|
|
6
|
+
export declare class AssetService extends DataService<Asset> {
|
|
7
|
+
constructor(httpClient: HttpClient);
|
|
8
|
+
addAttachment: (id: string, form: FormData) => Promise<Asset>;
|
|
9
|
+
getChildren(assetId: string, params?: RequestParameter): Promise<Paginated<Asset[]>>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AssetService = void 0;
|
|
4
|
+
const data_service_1 = require("./data.service");
|
|
5
|
+
class AssetService extends data_service_1.DataService {
|
|
6
|
+
constructor(httpClient) {
|
|
7
|
+
super(httpClient, process.env.DEBUG_ASSET_URL || 'api/assets');
|
|
8
|
+
this.addAttachment = (id, form) => {
|
|
9
|
+
const headers = Object.assign({}, form.getHeaders());
|
|
10
|
+
return this.httpClient.post(`${this.basePath}/${id}/attachment`, form, {
|
|
11
|
+
headers,
|
|
12
|
+
maxBodyLength: Infinity,
|
|
13
|
+
maxContentLength: Infinity,
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
getChildren(assetId, params = {}) {
|
|
18
|
+
return this.getManyFiltered({ parent: assetId }, params);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.AssetService = AssetService;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AssetTypesService = void 0;
|
|
4
|
+
const data_service_1 = require("./data.service");
|
|
5
|
+
class AssetTypesService extends data_service_1.DataService {
|
|
6
|
+
constructor(httpClient) {
|
|
7
|
+
super(httpClient, 'api/assettypes');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.AssetTypesService = AssetTypesService;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
declare type FileType = 'original' | 'preview-sm' | 'preview-md' | 'preview-lg';
|
|
2
|
+
declare type StorageProvider = 's3' | 'mongo';
|
|
3
|
+
export interface Storage {
|
|
4
|
+
id: string;
|
|
5
|
+
filename: string;
|
|
6
|
+
mimetype: string;
|
|
7
|
+
size: number;
|
|
8
|
+
createdAt: string;
|
|
9
|
+
provider?: StorageProvider;
|
|
10
|
+
type?: FileType;
|
|
11
|
+
md5?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface Content {
|
|
14
|
+
id?: string;
|
|
15
|
+
fileId: string;
|
|
16
|
+
filename: string;
|
|
17
|
+
mimetype: string;
|
|
18
|
+
size: number;
|
|
19
|
+
readPermissions: string[];
|
|
20
|
+
readWritePermissions: string[];
|
|
21
|
+
tags?: string[];
|
|
22
|
+
assets?: string[];
|
|
23
|
+
files?: Storage[];
|
|
24
|
+
createdAt?: string;
|
|
25
|
+
updatedAt?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare enum ReturnType {
|
|
28
|
+
TEXT = 0,
|
|
29
|
+
JSON = 1,
|
|
30
|
+
NODEBUFFER = 2,
|
|
31
|
+
BLOB = 3,
|
|
32
|
+
ARRAYBUFFER = 4,
|
|
33
|
+
NODESTREAM = 5
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReturnType = void 0;
|
|
4
|
+
var ReturnType;
|
|
5
|
+
(function (ReturnType) {
|
|
6
|
+
ReturnType[ReturnType["TEXT"] = 0] = "TEXT";
|
|
7
|
+
ReturnType[ReturnType["JSON"] = 1] = "JSON";
|
|
8
|
+
ReturnType[ReturnType["NODEBUFFER"] = 2] = "NODEBUFFER";
|
|
9
|
+
ReturnType[ReturnType["BLOB"] = 3] = "BLOB";
|
|
10
|
+
ReturnType[ReturnType["ARRAYBUFFER"] = 4] = "ARRAYBUFFER";
|
|
11
|
+
ReturnType[ReturnType["NODESTREAM"] = 5] = "NODESTREAM";
|
|
12
|
+
})(ReturnType = exports.ReturnType || (exports.ReturnType = {}));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import FormData from 'form-data';
|
|
3
|
+
import { Content, ReturnType } from './content.interface';
|
|
4
|
+
import { DataService } from './data.service';
|
|
5
|
+
import { HttpClient } from './http.service';
|
|
6
|
+
import { Readable } from 'stream';
|
|
7
|
+
export declare class ContentService extends DataService<Content> {
|
|
8
|
+
constructor(httpClient: HttpClient);
|
|
9
|
+
upload: (form: FormData) => Promise<Content>;
|
|
10
|
+
download(id: string, raw?: boolean): Promise<Blob | ArrayBuffer>;
|
|
11
|
+
download(id: string, returnType: ReturnType.TEXT): Promise<string>;
|
|
12
|
+
download(id: string, returnType: ReturnType.JSON): Promise<Record<string, unknown>>;
|
|
13
|
+
download(id: string, returnType: ReturnType.NODEBUFFER): Promise<Buffer>;
|
|
14
|
+
download(id: string, returnType: ReturnType.BLOB): Promise<Blob>;
|
|
15
|
+
download(id: string, returnType: ReturnType.ARRAYBUFFER): Promise<ArrayBuffer>;
|
|
16
|
+
download(id: string, returnType: ReturnType.NODESTREAM): Promise<Readable>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContentService = void 0;
|
|
4
|
+
const content_interface_1 = require("./content.interface");
|
|
5
|
+
const data_service_1 = require("./data.service");
|
|
6
|
+
class ContentService extends data_service_1.DataService {
|
|
7
|
+
constructor(httpClient) {
|
|
8
|
+
super(httpClient, process.env.DEBUG_CONTENT_URL || 'api/contents');
|
|
9
|
+
this.upload = (form) => {
|
|
10
|
+
const headers = Object.assign({}, form.getHeaders());
|
|
11
|
+
return this.httpClient.post(`${this.basePath}`, form, { headers, maxBodyLength: Infinity, maxContentLength: Infinity });
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async download(id, second) {
|
|
15
|
+
let returnType;
|
|
16
|
+
if (typeof second === 'boolean' || !second) {
|
|
17
|
+
returnType = second ? content_interface_1.ReturnType.ARRAYBUFFER : content_interface_1.ReturnType.BLOB;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
returnType = second;
|
|
21
|
+
}
|
|
22
|
+
const url = `${this.basePath}/${id}/download`;
|
|
23
|
+
switch (returnType) {
|
|
24
|
+
case content_interface_1.ReturnType.TEXT:
|
|
25
|
+
return this.httpClient.get(url, { responseType: 'text' });
|
|
26
|
+
case content_interface_1.ReturnType.JSON:
|
|
27
|
+
return this.httpClient.get(url, { responseType: 'json' });
|
|
28
|
+
case content_interface_1.ReturnType.NODEBUFFER:
|
|
29
|
+
return Buffer.from(new Uint8Array(await this.httpClient.get(url, { responseType: 'arraybuffer' })));
|
|
30
|
+
case content_interface_1.ReturnType.BLOB:
|
|
31
|
+
return this.httpClient.get(url, { responseType: 'blob' });
|
|
32
|
+
case content_interface_1.ReturnType.ARRAYBUFFER:
|
|
33
|
+
return this.httpClient.get(url, { responseType: 'arraybuffer' });
|
|
34
|
+
case content_interface_1.ReturnType.NODESTREAM:
|
|
35
|
+
return this.httpClient.get(url, { responseType: 'stream' });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.ContentService = ContentService;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface Paginated<T> {
|
|
2
|
+
docs: T;
|
|
3
|
+
total: number;
|
|
4
|
+
limit: number;
|
|
5
|
+
page?: number;
|
|
6
|
+
pages?: number;
|
|
7
|
+
offset?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RequestParameter {
|
|
10
|
+
filter?: string;
|
|
11
|
+
limit?: number;
|
|
12
|
+
page?: number;
|
|
13
|
+
populate?: string;
|
|
14
|
+
sort?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface Filter {
|
|
17
|
+
tags?: string[];
|
|
18
|
+
type?: string;
|
|
19
|
+
parent?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DataInterface<T> {
|
|
22
|
+
addOne(dto: any): Promise<T>;
|
|
23
|
+
addMany(dto: any[]): Promise<T[]>;
|
|
24
|
+
getOne(id: string, options?: any): Promise<T>;
|
|
25
|
+
getMany(params?: RequestParameter, parentId?: string): Promise<Paginated<T[]>>;
|
|
26
|
+
getManyFiltered(filter: Filter, params?: RequestParameter, parentId?: string): Promise<Paginated<T[]>>;
|
|
27
|
+
updateOne(id: string, dto: any): Promise<T>;
|
|
28
|
+
deleteOne(id: string): Promise<any>;
|
|
29
|
+
}
|