@transai/connector-runner-file 0.1.0 → 0.2.0
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/index.cjs +58 -0
- package/index.cjs.map +7 -0
- package/index.js +58 -0
- package/index.js.map +7 -0
- package/libs/connector-runner-file/src/lib/actions-handler.d.ts +7 -0
- package/libs/connector-runner-file/src/lib/connector-runner-file.d.ts +8 -0
- package/libs/connector-runner-file/src/lib/processor.d.ts +9 -0
- package/libs/connector-runner-file/src/lib/types.d.ts +40 -0
- package/libs/connector-runtime-sdk/src/index.d.ts +3 -0
- package/libs/connector-runtime-sdk/src/lib/connector-runtime.d.ts +16 -0
- package/libs/connector-runtime-sdk/src/lib/connector-runtime.interface.d.ts +5 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/files.sdk.interface.d.ts +18 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/http-client.interface.d.ts +38 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/index.d.ts +10 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/logger.sdk.interface.d.ts +7 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/offset-store.sdk.interface.d.ts +12 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/processing.sdk.interface.d.ts +13 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/receiver.sdk.interface.d.ts +14 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/sdk.interface.d.ts +31 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/sender.sdk.interface.d.ts +22 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/telemetry.sdk.interface.d.ts +15 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/templating.sdk.interface.d.ts +12 -0
- package/libs/file-handler/src/index.d.ts +2 -0
- package/libs/file-handler/src/lib/file-handler.d.ts +23 -0
- package/libs/file-handler/src/lib/types.d.ts +6 -0
- package/libs/logger/src/index.d.ts +1 -0
- package/libs/logger/src/lib/logger.d.ts +28 -0
- package/libs/types/src/index.d.ts +7 -0
- package/libs/types/src/lib/cube-query-config.types.d.ts +20 -0
- package/libs/types/src/lib/file-action.types.d.ts +5 -0
- package/libs/types/src/lib/http-status-codes.enum.d.ts +64 -0
- package/libs/types/src/lib/management-api/action-definition.interface.d.ts +12 -0
- package/libs/types/src/lib/management-api/chart.interface.d.ts +9 -0
- package/libs/types/src/lib/management-api/connector/connector.interface.d.ts +140 -0
- package/libs/types/src/lib/management-api/connector/connectors.interface.d.ts +126 -0
- package/libs/types/src/lib/management-api/connector-orchestrator-config.interface.d.ts +14 -0
- package/libs/types/src/lib/management-api/cube-dataset.interface.d.ts +93 -0
- package/libs/types/src/lib/management-api/dashboard.interface.d.ts +35 -0
- package/libs/types/src/lib/management-api/dataset/collection.interface.d.ts +16 -0
- package/libs/types/src/lib/management-api/dataset/dataset-record.interface.d.ts +5 -0
- package/libs/types/src/lib/management-api/dataset/dataset.interface.d.ts +730 -0
- package/libs/types/src/lib/management-api/dataset/datasets.interface.d.ts +710 -0
- package/libs/types/src/lib/management-api/dataset/dimension.interface.d.ts +205 -0
- package/libs/types/src/lib/management-api/dataset/dimensions.interface.d.ts +186 -0
- package/libs/types/src/lib/management-api/dataset/filter-group.interface.d.ts +8 -0
- package/libs/types/src/lib/management-api/dataset/filter.interface.d.ts +34 -0
- package/libs/types/src/lib/management-api/dataset/filters.interface.d.ts +7 -0
- package/libs/types/src/lib/management-api/dataset/measure.interface.d.ts +65 -0
- package/libs/types/src/lib/management-api/dataset/measures.interface.d.ts +56 -0
- package/libs/types/src/lib/management-api/dataset/meta.interface.d.ts +9 -0
- package/libs/types/src/lib/management-api/dataset/pre-aggregate.interface.d.ts +69 -0
- package/libs/types/src/lib/management-api/dataset/pre-aggregations.interface.d.ts +54 -0
- package/libs/types/src/lib/management-api/dataset/relation.interface.d.ts +40 -0
- package/libs/types/src/lib/management-api/dataset/relations.interface.d.ts +36 -0
- package/libs/types/src/lib/management-api/dataset/segment.interface.d.ts +45 -0
- package/libs/types/src/lib/management-api/dataset/segments.interface.d.ts +43 -0
- package/libs/types/src/lib/management-api/dataset/switch.interface.d.ts +70 -0
- package/libs/types/src/lib/management-api/dataset/when-item.interface.d.ts +41 -0
- package/libs/types/src/lib/management-api/dataset/when-items.interface.d.ts +40 -0
- package/libs/types/src/lib/management-api/event-origin.interface.d.ts +24 -0
- package/libs/types/src/lib/management-api/index.d.ts +39 -0
- package/libs/types/src/lib/management-api/semantic-trigger/custom-cron-trigger-record.interface.d.ts +6 -0
- package/libs/types/src/lib/management-api/semantic-trigger/index.d.ts +6 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-filter.interface.d.ts +20 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-filters.interface.d.ts +18 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-record.interface.d.ts +6 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger.interface.d.ts +75 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-triggers.interface.d.ts +62 -0
- package/libs/types/src/lib/management-api/template-implementation-overrides.interface.d.ts +1152 -0
- package/libs/types/src/lib/management-api/template-implementation.interface.d.ts +2860 -0
- package/libs/types/src/lib/management-api/template.interface.d.ts +1191 -0
- package/libs/types/src/lib/management-api/tenant.interface.d.ts +8 -0
- package/libs/types/src/lib/management-api/type-enums.d.ts +85 -0
- package/libs/types/src/lib/management-api/web/generic-filter.dto.d.ts +37 -0
- package/libs/types/src/lib/management-api/web/index.d.ts +2 -0
- package/libs/types/src/lib/management-api/web/paginated-response.interface.d.ts +17 -0
- package/libs/types/src/lib/management-api/workflow/action.interface.d.ts +85 -0
- package/libs/types/src/lib/management-api/workflow/index.d.ts +6 -0
- package/libs/types/src/lib/management-api/workflow/offset.interface.d.ts +14 -0
- package/libs/types/src/lib/management-api/workflow/trigger-types.interface.d.ts +14 -0
- package/libs/types/src/lib/management-api/workflow/workflow-definition.interface.d.ts +57 -0
- package/libs/types/src/lib/management-api/workflow/workflow-run.d.ts +70 -0
- package/libs/types/src/lib/management-api/workflow/workflow.drawing.d.ts +102 -0
- package/libs/types/src/lib/message.types.d.ts +59 -0
- package/libs/types/src/lib/response.types.d.ts +27 -0
- package/libs/types/src/lib/types.d.ts +116 -0
- package/package.json +1 -1
- package/.eslintrc.json +0 -18
- package/jest.config.ts +0 -10
- package/project.json +0 -33
- package/src/lib/actions-handler.spec.ts +0 -121
- package/src/lib/actions-handler.ts +0 -82
- package/src/lib/connector-runner-file.spec.ts +0 -73
- package/src/lib/connector-runner-file.ts +0 -50
- package/src/lib/processor.spec.ts +0 -119
- package/src/lib/processor.ts +0 -186
- package/src/lib/types.ts +0 -51
- package/tsconfig.json +0 -22
- package/tsconfig.lib.json +0 -10
- package/tsconfig.spec.json +0 -14
- /package/{src/index.ts → libs/connector-runner-file/src/index.d.ts} +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export interface MessageMonitorConfig {
|
|
2
|
+
type: 'in-memory' | 'redis' | 'disabled';
|
|
3
|
+
}
|
|
4
|
+
export declare enum ConfiguredConnectorTypes {
|
|
5
|
+
API = "api",
|
|
6
|
+
API_SINK = "api-sink",
|
|
7
|
+
API_SOURCE = "api-source",
|
|
8
|
+
DUMMY_NODE = "dummy-node",
|
|
9
|
+
FILE_COPY = "file-copy",
|
|
10
|
+
FILE = "file",
|
|
11
|
+
FILE_SINK = "file-sink",
|
|
12
|
+
FILE_SOURCE = "file-source",
|
|
13
|
+
SAMBA_SINK = "samba-sink",
|
|
14
|
+
SAMBA_SOURCE = "samba-source",
|
|
15
|
+
SQL_SINK = "sql-sink",
|
|
16
|
+
SQL_SOURCE = "sql-source",
|
|
17
|
+
MQTT = "mqtt",
|
|
18
|
+
CUBE_QUERY_RUNNER = "cube-query-runner",
|
|
19
|
+
FACTORY_NEBULA_SOURCE = "factory-nebula-source",
|
|
20
|
+
BYSTRONIC = "bystronic",
|
|
21
|
+
IMAP_SOURCE = "imap-source",
|
|
22
|
+
IMAP_SINK = "imap-sink",
|
|
23
|
+
OPCUA_SOURCE = "opcua-source",
|
|
24
|
+
OPCUA_SINK = "opcua-sink",
|
|
25
|
+
AI_AGENT = "ai-agent",
|
|
26
|
+
MICROSOFT_OFFICE365_EMAIL = "microsoft-office365-email",
|
|
27
|
+
MKG = "mkg"
|
|
28
|
+
}
|
|
29
|
+
export interface ConnectorConfig {
|
|
30
|
+
type: ConfiguredConnectorTypes;
|
|
31
|
+
identifier: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RedisMessageMonitorConfig extends MessageMonitorConfig {
|
|
34
|
+
type: 'redis';
|
|
35
|
+
url: string;
|
|
36
|
+
ttl?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface InMemoryMessageMonitorConfig extends MessageMonitorConfig {
|
|
39
|
+
type: 'in-memory';
|
|
40
|
+
messagesToKeep: number;
|
|
41
|
+
}
|
|
42
|
+
export interface DisabledMessageMonitorConfig extends MessageMonitorConfig {
|
|
43
|
+
type: 'disabled';
|
|
44
|
+
}
|
|
45
|
+
export interface TopicRegex {
|
|
46
|
+
pattern: string;
|
|
47
|
+
flags: string;
|
|
48
|
+
}
|
|
49
|
+
export interface FileRegex {
|
|
50
|
+
pattern: string;
|
|
51
|
+
flags: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function isTopicRegex(obj: TopicRegex | string): obj is TopicRegex;
|
|
54
|
+
export interface CubeConfigHeaders {
|
|
55
|
+
Authorization: string;
|
|
56
|
+
}
|
|
57
|
+
export interface CubeConfig {
|
|
58
|
+
auth0_client_secret?: string;
|
|
59
|
+
auth0_client_id?: string;
|
|
60
|
+
auth0_audience?: string;
|
|
61
|
+
auth0_token_url?: string;
|
|
62
|
+
authorization?: string;
|
|
63
|
+
apiUrl: string;
|
|
64
|
+
headers?: CubeConfigHeaders;
|
|
65
|
+
redis_url?: string;
|
|
66
|
+
}
|
|
67
|
+
export declare function isCubeConfigType(obj: CubeConfig): obj is CubeConfig;
|
|
68
|
+
export interface AwsKafkaSaslConfig {
|
|
69
|
+
region?: string;
|
|
70
|
+
accessKeyId?: string;
|
|
71
|
+
secretAccessKey?: string;
|
|
72
|
+
mechanism: 'aws';
|
|
73
|
+
}
|
|
74
|
+
export declare function isAwsKafkaSalsConfig(obj: AwsKafkaSaslConfig): obj is AwsKafkaSaslConfig;
|
|
75
|
+
export interface DatabaseConfig {
|
|
76
|
+
uri: string;
|
|
77
|
+
ssl?: boolean;
|
|
78
|
+
tenantPassword?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface ActionConfig {
|
|
81
|
+
timeSensitive: boolean;
|
|
82
|
+
}
|
|
83
|
+
export interface KafkaBrokerConfig {
|
|
84
|
+
groupId: string;
|
|
85
|
+
clientId: string;
|
|
86
|
+
brokers: Array<string>;
|
|
87
|
+
consumerTopics?: Array<string | TopicRegex>;
|
|
88
|
+
sasl?: AwsKafkaSaslConfig;
|
|
89
|
+
intervalCheckForNewTopics?: number;
|
|
90
|
+
disableLogs?: boolean;
|
|
91
|
+
autoCommitThreshold?: number;
|
|
92
|
+
autoCommitInterval?: number;
|
|
93
|
+
partitionsConsumedConcurrently?: number;
|
|
94
|
+
messageMonitor?: RedisMessageMonitorConfig | InMemoryMessageMonitorConfig | DisabledMessageMonitorConfig;
|
|
95
|
+
useConfluentLibrary?: boolean;
|
|
96
|
+
newConsumerProtocol?: boolean;
|
|
97
|
+
}
|
|
98
|
+
export declare function isKafkaBrokerConfigType(obj: KafkaBrokerConfig): obj is KafkaBrokerConfig;
|
|
99
|
+
export declare function isActionConfigType(obj: any): obj is ActionConfig;
|
|
100
|
+
export declare function isDatabaseConfigType(obj: DatabaseConfig): obj is DatabaseConfig;
|
|
101
|
+
export interface BaseConnectorConfig {
|
|
102
|
+
processIdentifier: string;
|
|
103
|
+
tenantIdentifier: string;
|
|
104
|
+
datasourceIdentifier: string;
|
|
105
|
+
kafka: KafkaBrokerConfig;
|
|
106
|
+
action?: ActionConfig;
|
|
107
|
+
}
|
|
108
|
+
export declare function isBaseConnectorConfigType(obj: BaseConnectorConfig): obj is BaseConnectorConfig;
|
|
109
|
+
export interface AiAgentConfig {
|
|
110
|
+
openai: {
|
|
111
|
+
apiKey: string;
|
|
112
|
+
model: 'gpt-3.5-turbo' | 'gpt-4' | 'gpt-4-turbo' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1-mini';
|
|
113
|
+
temperature?: number;
|
|
114
|
+
timeout?: number;
|
|
115
|
+
};
|
|
116
|
+
}
|
package/package.json
CHANGED
package/.eslintrc.json
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": ["../../.eslintrc.json"],
|
|
3
|
-
"ignorePatterns": ["!**/*"],
|
|
4
|
-
"overrides": [
|
|
5
|
-
{
|
|
6
|
-
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
|
|
7
|
-
"rules": {}
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"files": ["*.ts", "*.tsx"],
|
|
11
|
-
"rules": {}
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"files": ["*.js", "*.jsx"],
|
|
15
|
-
"rules": {}
|
|
16
|
-
}
|
|
17
|
-
]
|
|
18
|
-
}
|
package/jest.config.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
displayName: 'connector-runner-file',
|
|
3
|
-
preset: '../../jest.preset.js',
|
|
4
|
-
testEnvironment: 'node',
|
|
5
|
-
transform: {
|
|
6
|
-
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
|
|
7
|
-
},
|
|
8
|
-
moduleFileExtensions: ['ts', 'js', 'html'],
|
|
9
|
-
coverageDirectory: '../../coverage/libs/connector-runner-file',
|
|
10
|
-
};
|
package/project.json
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "connector-runner-file",
|
|
3
|
-
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "libs/connector-runner-file/src",
|
|
5
|
-
"projectType": "library",
|
|
6
|
-
"tags": [
|
|
7
|
-
"connector:runner",
|
|
8
|
-
"connector:runner-sdk",
|
|
9
|
-
"connector:file",
|
|
10
|
-
"connector:source",
|
|
11
|
-
"connector:sink",
|
|
12
|
-
"provider:@transai"
|
|
13
|
-
],
|
|
14
|
-
"targets": {
|
|
15
|
-
"build": {
|
|
16
|
-
"executor": "@transai/tools:connector",
|
|
17
|
-
"outputs": ["{options.outputPath}"],
|
|
18
|
-
"options": {
|
|
19
|
-
"external": ["cpu-features", "ssh2"]
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"lint": {
|
|
23
|
-
"executor": "@nx/eslint:lint"
|
|
24
|
-
},
|
|
25
|
-
"test": {
|
|
26
|
-
"executor": "@nx/jest:jest",
|
|
27
|
-
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
|
28
|
-
"options": {
|
|
29
|
-
"jestConfig": "libs/connector-runner-file/jest.config.ts"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ConnectorSDKInterface,
|
|
3
|
-
FilesSDKInterface,
|
|
4
|
-
} from '@transai/connector-runtime-sdk';
|
|
5
|
-
import { ActionInterface, XodJobType } from '@xip-online-data/types';
|
|
6
|
-
|
|
7
|
-
import { ActionsHandler } from './actions-handler';
|
|
8
|
-
import { FileConfig } from './types';
|
|
9
|
-
|
|
10
|
-
describe('FileActionsHandler', () => {
|
|
11
|
-
let handler: ActionsHandler;
|
|
12
|
-
|
|
13
|
-
const sdkMock = {
|
|
14
|
-
logger: {
|
|
15
|
-
warn: jest.fn(),
|
|
16
|
-
info: jest.fn(),
|
|
17
|
-
debug: jest.fn(),
|
|
18
|
-
error: jest.fn(),
|
|
19
|
-
verbose: jest.fn(),
|
|
20
|
-
},
|
|
21
|
-
receiver: {
|
|
22
|
-
responses: {
|
|
23
|
-
created: jest.fn().mockReturnValue(
|
|
24
|
-
jest.fn().mockReturnValue({
|
|
25
|
-
statusCode: 201,
|
|
26
|
-
}),
|
|
27
|
-
),
|
|
28
|
-
badRequest: jest.fn().mockReturnValue(
|
|
29
|
-
jest.fn().mockReturnValue({
|
|
30
|
-
statusCode: 400,
|
|
31
|
-
}),
|
|
32
|
-
),
|
|
33
|
-
internalServerError: jest.fn().mockReturnValue(
|
|
34
|
-
jest.fn().mockReturnValue({
|
|
35
|
-
statusCode: 500,
|
|
36
|
-
}),
|
|
37
|
-
),
|
|
38
|
-
},
|
|
39
|
-
emitEventType: jest.fn().mockReturnValue(
|
|
40
|
-
jest.fn().mockReturnValue({
|
|
41
|
-
statusCode: 201,
|
|
42
|
-
}),
|
|
43
|
-
),
|
|
44
|
-
},
|
|
45
|
-
} as unknown as ConnectorSDKInterface<FileConfig>;
|
|
46
|
-
let fileHandlerMock: FilesSDKInterface;
|
|
47
|
-
|
|
48
|
-
beforeEach(() => {
|
|
49
|
-
fileHandlerMock = {
|
|
50
|
-
write: jest.fn(),
|
|
51
|
-
} as unknown as FilesSDKInterface;
|
|
52
|
-
|
|
53
|
-
handler = new ActionsHandler(sdkMock, fileHandlerMock);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
afterEach(() => {
|
|
57
|
-
jest.clearAllMocks();
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('should be defined', () => {
|
|
61
|
-
expect(handler).toBeDefined();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe('JOB actions', () => {
|
|
65
|
-
const action = {
|
|
66
|
-
identifier: 'action-1',
|
|
67
|
-
version: '2.0',
|
|
68
|
-
config: {
|
|
69
|
-
parsedTemplates: {
|
|
70
|
-
filename: jest.fn().mockReturnValue('test-file.txt'),
|
|
71
|
-
contents: jest.fn().mockReturnValue('file contents here'),
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
} as unknown as ActionInterface;
|
|
75
|
-
|
|
76
|
-
const jobMessage = {
|
|
77
|
-
type: 'JOB',
|
|
78
|
-
actionIdentifier: 'action-1',
|
|
79
|
-
actionVersion: 'latest',
|
|
80
|
-
payload: { some: 'data' },
|
|
81
|
-
} as unknown as XodJobType;
|
|
82
|
-
|
|
83
|
-
it('should write file on action', async () => {
|
|
84
|
-
const response = await handler.callbackFunctionChain(jobMessage, action);
|
|
85
|
-
|
|
86
|
-
expect(fileHandlerMock.write).toHaveBeenCalledWith(
|
|
87
|
-
'test-file.txt',
|
|
88
|
-
'file contents here',
|
|
89
|
-
);
|
|
90
|
-
expect(response.statusCode).toBe(201);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('should handle errors during file write', async () => {
|
|
94
|
-
fileHandlerMock.write = jest
|
|
95
|
-
.fn()
|
|
96
|
-
.mockRejectedValue(new Error('Write error'));
|
|
97
|
-
|
|
98
|
-
const response = await handler.callbackFunctionChain(jobMessage, action);
|
|
99
|
-
|
|
100
|
-
expect(response.statusCode).toBe(500);
|
|
101
|
-
expect(
|
|
102
|
-
sdkMock.receiver.responses.internalServerError,
|
|
103
|
-
).toHaveBeenCalledWith('Write error');
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('should handle test run without writing file', async () => {
|
|
107
|
-
const testRunMessage = {
|
|
108
|
-
...jobMessage,
|
|
109
|
-
testRun: true,
|
|
110
|
-
} as XodJobType;
|
|
111
|
-
|
|
112
|
-
const response = await handler.callbackFunctionChain(
|
|
113
|
-
testRunMessage,
|
|
114
|
-
action,
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
expect(fileHandlerMock.write).not.toHaveBeenCalled();
|
|
118
|
-
expect(response.statusCode).toBe(201);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CompileDelegate,
|
|
3
|
-
ConnectorSDKInterface,
|
|
4
|
-
FilesSDKInterface,
|
|
5
|
-
} from '@transai/connector-runtime-sdk';
|
|
6
|
-
import {
|
|
7
|
-
ActionInterface,
|
|
8
|
-
KafkaCallbackResponse,
|
|
9
|
-
XodJobType,
|
|
10
|
-
} from '@xip-online-data/types';
|
|
11
|
-
|
|
12
|
-
export class ActionsHandler {
|
|
13
|
-
readonly #connectorSDK: ConnectorSDKInterface;
|
|
14
|
-
|
|
15
|
-
readonly #fileHandler: FilesSDKInterface;
|
|
16
|
-
|
|
17
|
-
constructor(
|
|
18
|
-
connectorSDK: ConnectorSDKInterface,
|
|
19
|
-
fileHandler: FilesSDKInterface,
|
|
20
|
-
) {
|
|
21
|
-
this.#connectorSDK = connectorSDK;
|
|
22
|
-
this.#fileHandler = fileHandler;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
get callbackFunctionChain(): (
|
|
26
|
-
message: XodJobType,
|
|
27
|
-
action: ActionInterface,
|
|
28
|
-
) => Promise<KafkaCallbackResponse> {
|
|
29
|
-
return this.#jobCallbackFunction(
|
|
30
|
-
this.#connectorSDK.receiver.emitEventType(
|
|
31
|
-
this.#connectorSDK.receiver.responses.created(),
|
|
32
|
-
),
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
#jobCallbackFunction(
|
|
37
|
-
callbackFunction: (message: XodJobType) => Promise<KafkaCallbackResponse>,
|
|
38
|
-
) {
|
|
39
|
-
return async (
|
|
40
|
-
message: XodJobType,
|
|
41
|
-
action: ActionInterface,
|
|
42
|
-
): Promise<KafkaCallbackResponse> => {
|
|
43
|
-
this.#connectorSDK.logger.debug(
|
|
44
|
-
`Apply templates on payload: ${JSON.stringify(message.payload)}, action: ${JSON.stringify(action)}`,
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
const handleBars = action.config['parsedTemplates'] as {
|
|
48
|
-
filename: CompileDelegate;
|
|
49
|
-
contents: CompileDelegate;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
const parsedFilename = handleBars
|
|
54
|
-
.filename({
|
|
55
|
-
inputs: message.payload,
|
|
56
|
-
})
|
|
57
|
-
.trim();
|
|
58
|
-
|
|
59
|
-
const parsedContent = handleBars
|
|
60
|
-
.contents({
|
|
61
|
-
inputs: message.payload,
|
|
62
|
-
})
|
|
63
|
-
.trim();
|
|
64
|
-
|
|
65
|
-
if (message.testRun) {
|
|
66
|
-
this.#connectorSDK.logger.debug(
|
|
67
|
-
`Test run for ${message.eventId} with parsedContent ${parsedContent}, parsedFilename ${parsedFilename}`,
|
|
68
|
-
);
|
|
69
|
-
return callbackFunction(message);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
await this.#fileHandler.write(parsedFilename, parsedContent);
|
|
73
|
-
} catch (error) {
|
|
74
|
-
return this.#connectorSDK.receiver.responses.internalServerError(
|
|
75
|
-
error instanceof Error ? error.message : 'Unknown error occurred',
|
|
76
|
-
)(message);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return callbackFunction(message);
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ConnectorSDKInterface,
|
|
3
|
-
FilesSDKInterface,
|
|
4
|
-
} from '@transai/connector-runtime-sdk';
|
|
5
|
-
import { ConnectorInterface } from '@xip-online-data/types';
|
|
6
|
-
|
|
7
|
-
import { ConnectorRunnerFile } from './connector-runner-file';
|
|
8
|
-
import { Processor } from './processor';
|
|
9
|
-
import { FileConfig } from './types';
|
|
10
|
-
|
|
11
|
-
jest.mock('./processor');
|
|
12
|
-
|
|
13
|
-
describe('ConnectorRunnerFile', () => {
|
|
14
|
-
let runner: ConnectorRunnerFile;
|
|
15
|
-
|
|
16
|
-
let sdkMock: ConnectorSDKInterface<FileConfig>;
|
|
17
|
-
const processorMock = {} as unknown as Processor;
|
|
18
|
-
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
(Processor as unknown as jest.Mock).mockImplementation(() => processorMock);
|
|
21
|
-
|
|
22
|
-
sdkMock = {
|
|
23
|
-
logger: {
|
|
24
|
-
warn: jest.fn(),
|
|
25
|
-
info: jest.fn(),
|
|
26
|
-
debug: jest.fn(),
|
|
27
|
-
error: jest.fn(),
|
|
28
|
-
},
|
|
29
|
-
config: {
|
|
30
|
-
dsn: 'dummy://path/to/files',
|
|
31
|
-
fileSelectors: [{ selector: 'some-file-.+' }],
|
|
32
|
-
},
|
|
33
|
-
receiver: {
|
|
34
|
-
emitEventType: jest.fn(),
|
|
35
|
-
responses: {
|
|
36
|
-
created: jest.fn(),
|
|
37
|
-
},
|
|
38
|
-
registerCallback: jest.fn(),
|
|
39
|
-
},
|
|
40
|
-
processing: {
|
|
41
|
-
registerInterval: jest.fn(),
|
|
42
|
-
},
|
|
43
|
-
files: jest.fn().mockReturnValue({
|
|
44
|
-
pathAsDsn: (path: string) => `dummy:${path}`,
|
|
45
|
-
}),
|
|
46
|
-
} as unknown as ConnectorSDKInterface<FileConfig>;
|
|
47
|
-
|
|
48
|
-
runner = new ConnectorRunnerFile({} as ConnectorInterface, sdkMock);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('should be defined', () => {
|
|
52
|
-
expect(runner).toBeDefined();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should initialize file selector processes', async () => {
|
|
56
|
-
(Processor as unknown as jest.Mock).mockImplementation(
|
|
57
|
-
(sdk, fileSelector, fileHandler: FilesSDKInterface) => {
|
|
58
|
-
expect(sdk).toBe(sdkMock);
|
|
59
|
-
expect(fileSelector).toEqual({ selector: 'some-file-.+' });
|
|
60
|
-
expect(fileHandler.pathAsDsn('/')).toEqual('dummy:/');
|
|
61
|
-
|
|
62
|
-
return processorMock;
|
|
63
|
-
},
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
await runner.init();
|
|
67
|
-
|
|
68
|
-
expect(sdkMock.processing.registerInterval).toHaveBeenCalledWith(
|
|
69
|
-
60,
|
|
70
|
-
processorMock,
|
|
71
|
-
);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ConnectorRuntimeSDK,
|
|
3
|
-
ConnectorSDKInterface,
|
|
4
|
-
FilesSDKInterface,
|
|
5
|
-
} from '@transai/connector-runtime-sdk';
|
|
6
|
-
import { ConnectorInterface } from '@xip-online-data/types';
|
|
7
|
-
|
|
8
|
-
import { ActionsHandler } from './actions-handler';
|
|
9
|
-
import { Processor } from './processor';
|
|
10
|
-
import { FileConfig } from './types';
|
|
11
|
-
|
|
12
|
-
export class ConnectorRunnerFile extends ConnectorRuntimeSDK<FileConfig> {
|
|
13
|
-
readonly #fileHandler: FilesSDKInterface;
|
|
14
|
-
|
|
15
|
-
constructor(
|
|
16
|
-
connector: ConnectorInterface,
|
|
17
|
-
connectorSDK: ConnectorSDKInterface,
|
|
18
|
-
) {
|
|
19
|
-
super(connector, connectorSDK);
|
|
20
|
-
|
|
21
|
-
const { config } = this.connectorSDK;
|
|
22
|
-
this.#fileHandler = this.connectorSDK.files(config.dsn);
|
|
23
|
-
|
|
24
|
-
const actionsHandler = new ActionsHandler(
|
|
25
|
-
this.connectorSDK,
|
|
26
|
-
this.#fileHandler,
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
this.callbackFunction = actionsHandler.callbackFunctionChain;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
override init = async (): Promise<void> => {
|
|
33
|
-
const { config } = this.connectorSDK;
|
|
34
|
-
|
|
35
|
-
await Promise.all(
|
|
36
|
-
(config.fileSelectors ?? []).map(async (fileSelector) => {
|
|
37
|
-
const processor = new Processor(
|
|
38
|
-
this.connectorSDK,
|
|
39
|
-
fileSelector,
|
|
40
|
-
this.#fileHandler,
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
await this.connectorSDK.processing.registerInterval(
|
|
44
|
-
fileSelector.intervalSeconds ?? Processor.DEFAULT_INTERVAL_SECONDS,
|
|
45
|
-
processor,
|
|
46
|
-
);
|
|
47
|
-
}),
|
|
48
|
-
);
|
|
49
|
-
};
|
|
50
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ConnectorSDKInterface,
|
|
3
|
-
FilesSDKInterface,
|
|
4
|
-
} from '@transai/connector-runtime-sdk';
|
|
5
|
-
// eslint-disable-next-line @nx/enforce-module-boundaries
|
|
6
|
-
import { FileHandler } from '@xip-online-data/file-handler';
|
|
7
|
-
|
|
8
|
-
import { Processor } from './processor';
|
|
9
|
-
import { FileConfig } from './types';
|
|
10
|
-
|
|
11
|
-
jest.mock('@xip-online-data/file-handler');
|
|
12
|
-
|
|
13
|
-
describe('FileProcessor', () => {
|
|
14
|
-
let processor: Processor;
|
|
15
|
-
|
|
16
|
-
const sourceDsn = 'dummy://source/path';
|
|
17
|
-
const destinationDsn = 'dummy://destination/path';
|
|
18
|
-
|
|
19
|
-
const readFile = {
|
|
20
|
-
get: jest.fn().mockReturnValue(Buffer.from('some-string')),
|
|
21
|
-
close: jest.fn().mockReturnValue(true),
|
|
22
|
-
};
|
|
23
|
-
const parsedFile = { foo: 'bar' };
|
|
24
|
-
|
|
25
|
-
const fileHandlerMock = {
|
|
26
|
-
list: jest.fn().mockResolvedValue([
|
|
27
|
-
{ type: 'FILE', name: 'test-file-001.csv' },
|
|
28
|
-
{ type: 'FILE', name: 'other-file.txt' },
|
|
29
|
-
{ type: 'DIRECTORY', name: 'some-dir' },
|
|
30
|
-
]),
|
|
31
|
-
read: jest.fn().mockResolvedValue(readFile),
|
|
32
|
-
delete: jest.fn(),
|
|
33
|
-
} as unknown as FilesSDKInterface;
|
|
34
|
-
const destinationFileHandlerMock = {
|
|
35
|
-
write: jest.fn(),
|
|
36
|
-
pathAsDsn: jest.fn(),
|
|
37
|
-
} as unknown as FilesSDKInterface;
|
|
38
|
-
const fileReaderMock = {
|
|
39
|
-
handleBuffer: jest.fn().mockResolvedValue(parsedFile),
|
|
40
|
-
} as unknown as FileHandler;
|
|
41
|
-
|
|
42
|
-
const sdkMock = {
|
|
43
|
-
logger: {
|
|
44
|
-
warn: jest.fn(),
|
|
45
|
-
info: jest.fn(),
|
|
46
|
-
debug: jest.fn(),
|
|
47
|
-
error: jest.fn(),
|
|
48
|
-
verbose: jest.fn(),
|
|
49
|
-
},
|
|
50
|
-
config: {
|
|
51
|
-
dsn: sourceDsn,
|
|
52
|
-
},
|
|
53
|
-
telemetry: {
|
|
54
|
-
increment: jest.fn(),
|
|
55
|
-
},
|
|
56
|
-
sender: {
|
|
57
|
-
documents: jest.fn(),
|
|
58
|
-
},
|
|
59
|
-
files: jest.fn().mockImplementation(() => destinationFileHandlerMock),
|
|
60
|
-
} as unknown as ConnectorSDKInterface<FileConfig>;
|
|
61
|
-
|
|
62
|
-
beforeEach(() => {
|
|
63
|
-
(FileHandler as unknown as jest.Mock).mockImplementation(
|
|
64
|
-
() => fileReaderMock,
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
processor = new Processor(
|
|
68
|
-
sdkMock,
|
|
69
|
-
{
|
|
70
|
-
selector: 'test-file-.+\\.csv',
|
|
71
|
-
delimiter: ',',
|
|
72
|
-
action: 'move',
|
|
73
|
-
destinationDsn,
|
|
74
|
-
},
|
|
75
|
-
fileHandlerMock,
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('should be defined', () => {
|
|
80
|
-
expect(processor).toBeDefined();
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('should give the correct name', () => {
|
|
84
|
-
expect(processor.name).toBe('file-processor-test-file-.+\\.csv');
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('should process files correctly', async () => {
|
|
88
|
-
await processor.onRun();
|
|
89
|
-
|
|
90
|
-
expect(fileHandlerMock.read).toHaveBeenCalledWith('/test-file-001.csv');
|
|
91
|
-
expect(fileReaderMock.handleBuffer).toHaveBeenCalledWith(
|
|
92
|
-
'/test-file-001.csv',
|
|
93
|
-
readFile.get(),
|
|
94
|
-
[],
|
|
95
|
-
undefined,
|
|
96
|
-
);
|
|
97
|
-
expect(sdkMock.sender.documents).toHaveBeenCalledWith(
|
|
98
|
-
[
|
|
99
|
-
{
|
|
100
|
-
foo: 'bar',
|
|
101
|
-
_filename: 'test-file-001.csv',
|
|
102
|
-
},
|
|
103
|
-
],
|
|
104
|
-
{
|
|
105
|
-
keyField: '_filename',
|
|
106
|
-
collection: 'file_test-file-.+\\.csv',
|
|
107
|
-
},
|
|
108
|
-
);
|
|
109
|
-
expect(destinationFileHandlerMock.write).toHaveBeenCalledWith(
|
|
110
|
-
'test-file-001.csv',
|
|
111
|
-
readFile,
|
|
112
|
-
);
|
|
113
|
-
expect(fileHandlerMock.delete).toHaveBeenCalledWith('/test-file-001.csv');
|
|
114
|
-
expect(sdkMock.telemetry.increment).toHaveBeenCalledWith(
|
|
115
|
-
'files.processed.count',
|
|
116
|
-
1,
|
|
117
|
-
);
|
|
118
|
-
});
|
|
119
|
-
});
|