@dronedeploy/rocos-js-sdk 3.0.1-alpha.5 → 3.0.1-alpha.7
Sign up to get free protection for your applications and to get access to all the features.
- package/cjs/RocosSDK.d.ts +2 -1
- package/cjs/RocosSDK.js +38 -26
- package/cjs/api/streams/caller/CallerStream.js +2 -1
- package/cjs/api/streams/command/CommandStream.js +2 -1
- package/cjs/api/streams/control/ControlStream.js +2 -1
- package/cjs/api/streams/fileAccessor/FileAccessorStream.js +2 -1
- package/cjs/api/streams/search/SearchStream.js +2 -1
- package/cjs/api/streams/telemetry/TelemetryStream.js +2 -1
- package/cjs/api/streams/webRTCSignalling/WebRTCSignallingStream.js +2 -1
- package/cjs/constants/api.d.ts +1 -0
- package/cjs/constants/api.js +2 -1
- package/cjs/helpers/getSha256Hex.d.ts +1 -0
- package/cjs/helpers/getSha256Hex.js +9 -0
- package/cjs/helpers/getSha256Hex.spec.d.ts +1 -0
- package/cjs/helpers/getSha256Hex.spec.js +19 -0
- package/cjs/helpers/getSha256HexNode.d.ts +1 -0
- package/cjs/helpers/getSha256HexNode.js +13 -0
- package/cjs/helpers/getSha256HexNode.spec.d.ts +1 -0
- package/cjs/helpers/getSha256HexNode.spec.js +10 -0
- package/cjs/models/IRocosSDKConfig.d.ts +8 -4
- package/cjs/models/workflow/Workflow.d.ts +69 -11
- package/cjs/node/RocosSDKNode.d.ts +1 -2
- package/cjs/node/RocosSDKNode.js +54 -65
- package/cjs/services/AssetStorageService.js +1 -1
- package/cjs/services/BaseStreamService.js +2 -0
- package/cjs/services/WorkflowService.d.ts +11 -16
- package/cjs/services/WorkflowService.js +32 -15
- package/cjs/services/WorkflowServiceNode.d.ts +4 -0
- package/cjs/services/WorkflowServiceNode.js +12 -0
- package/esm/RocosSDK.d.ts +2 -1
- package/esm/RocosSDK.js +38 -26
- package/esm/api/streams/caller/CallerStream.js +2 -1
- package/esm/api/streams/command/CommandStream.js +2 -1
- package/esm/api/streams/control/ControlStream.js +2 -1
- package/esm/api/streams/fileAccessor/FileAccessorStream.js +2 -1
- package/esm/api/streams/search/SearchStream.js +2 -1
- package/esm/api/streams/telemetry/TelemetryStream.js +2 -1
- package/esm/api/streams/webRTCSignalling/WebRTCSignallingStream.js +2 -1
- package/esm/constants/api.d.ts +1 -0
- package/esm/constants/api.js +1 -0
- package/esm/helpers/getSha256Hex.d.ts +1 -0
- package/esm/helpers/getSha256Hex.js +5 -0
- package/esm/helpers/getSha256Hex.spec.d.ts +1 -0
- package/esm/helpers/getSha256Hex.spec.js +14 -0
- package/esm/helpers/getSha256HexNode.d.ts +1 -0
- package/esm/helpers/getSha256HexNode.js +6 -0
- package/esm/helpers/getSha256HexNode.spec.d.ts +1 -0
- package/esm/helpers/getSha256HexNode.spec.js +8 -0
- package/esm/models/IRocosSDKConfig.d.ts +8 -4
- package/esm/models/workflow/Workflow.d.ts +69 -11
- package/esm/node/RocosSDKNode.d.ts +1 -2
- package/esm/node/RocosSDKNode.js +26 -37
- package/esm/services/AssetStorageService.js +3 -3
- package/esm/services/BaseStreamService.js +2 -0
- package/esm/services/WorkflowService.d.ts +11 -16
- package/esm/services/WorkflowService.js +33 -16
- package/esm/services/WorkflowServiceNode.d.ts +4 -0
- package/esm/services/WorkflowServiceNode.js +8 -0
- package/package.json +1 -1
@@ -0,0 +1,6 @@
|
|
1
|
+
import crypto from 'crypto';
|
2
|
+
export const getSha256HexNode = async (arrayBuffer) => {
|
3
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
|
4
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
5
|
+
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
6
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { getSha256HexNode } from './getSha256HexNode';
|
2
|
+
describe('getSha256HexNode', () => {
|
3
|
+
it('should return the correct SHA-256 hash', async () => {
|
4
|
+
const buffer = new TextEncoder().encode('Hello, World!');
|
5
|
+
const hash = await getSha256HexNode(buffer);
|
6
|
+
expect(hash).toBe('dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f');
|
7
|
+
});
|
8
|
+
});
|
@@ -1,6 +1,9 @@
|
|
1
1
|
import { IStreamOptions } from './IStreamOptions';
|
2
|
-
|
3
|
-
|
2
|
+
import { ServiceEnum } from './ServiceEnum';
|
3
|
+
export type IRocosSDKConfig = AuthorisedConfig & {
|
4
|
+
overrides?: Partial<Record<ServiceEnum, Partial<AuthorisedConfig>>>;
|
5
|
+
};
|
6
|
+
interface ConfigBase {
|
4
7
|
url: string;
|
5
8
|
token?: string;
|
6
9
|
refreshToken?: string;
|
@@ -8,12 +11,13 @@ interface IRocosSDKConfigBase {
|
|
8
11
|
port?: number;
|
9
12
|
insecure?: boolean;
|
10
13
|
}
|
11
|
-
export interface IRocosSDKConfigApp extends
|
14
|
+
export interface IRocosSDKConfigApp extends ConfigBase {
|
12
15
|
appId: string;
|
13
16
|
appKey: string;
|
14
17
|
}
|
15
|
-
export interface IRocosSDKConfigToken extends
|
18
|
+
export interface IRocosSDKConfigToken extends ConfigBase {
|
16
19
|
token: string;
|
17
20
|
refreshToken?: string;
|
18
21
|
}
|
22
|
+
export type AuthorisedConfig = IRocosSDKConfigApp | IRocosSDKConfigToken;
|
19
23
|
export {};
|
@@ -1,12 +1,12 @@
|
|
1
|
-
export type ResourceType = 'Manifest' | 'AgentGraph' | 'Javascript' | 'NodeDefinition';
|
1
|
+
export type ResourceType = 'Manifest' | 'AgentGraph' | 'Javascript' | 'NodeDefinition' | 'Other';
|
2
2
|
export interface Resource {
|
3
3
|
type: ResourceType;
|
4
4
|
data: string;
|
5
|
-
contentLink: string;
|
6
5
|
hash: string;
|
7
6
|
link: string;
|
8
|
-
|
9
|
-
size
|
7
|
+
contentLink?: string;
|
8
|
+
size?: number;
|
9
|
+
path?: string;
|
10
10
|
}
|
11
11
|
export interface Resources {
|
12
12
|
[key: string]: Resource;
|
@@ -16,21 +16,79 @@ export interface Author {
|
|
16
16
|
name: string;
|
17
17
|
email: string;
|
18
18
|
}
|
19
|
+
interface ResponseBase {
|
20
|
+
id: string;
|
21
|
+
createdBy: string;
|
22
|
+
updatedBy: string;
|
23
|
+
dateCreated: number;
|
24
|
+
dateUpdated: number;
|
25
|
+
}
|
19
26
|
export interface WorkflowBase {
|
20
27
|
flowId: string;
|
21
28
|
name: string;
|
22
|
-
description
|
29
|
+
description?: string;
|
23
30
|
resources?: Resources;
|
24
31
|
type?: string;
|
25
32
|
}
|
26
|
-
export interface Workflow extends WorkflowBase {
|
27
|
-
id: string;
|
33
|
+
export interface Workflow extends WorkflowBase, ResponseBase {
|
28
34
|
projectId: string;
|
29
|
-
createdBy: string;
|
30
|
-
updatedBy: string;
|
31
35
|
author: Author;
|
32
|
-
dateCreated: number;
|
33
|
-
dateUpdated: number;
|
34
36
|
latestVersion: string;
|
35
37
|
type: string;
|
36
38
|
}
|
39
|
+
export interface DeployedFlow {
|
40
|
+
flowId: string;
|
41
|
+
flow?: Workflow;
|
42
|
+
deployed?: boolean;
|
43
|
+
}
|
44
|
+
export interface WorkflowList extends Omit<WorkflowBase, 'resources'>, ResponseBase {
|
45
|
+
type?: 'cloud';
|
46
|
+
author: {
|
47
|
+
id: string;
|
48
|
+
name: string;
|
49
|
+
email: string;
|
50
|
+
} | Record<string, never>;
|
51
|
+
}
|
52
|
+
export interface WorkflowRevision {
|
53
|
+
id: string;
|
54
|
+
version: number;
|
55
|
+
authorName: string;
|
56
|
+
createdBy: string;
|
57
|
+
dateCreated: number;
|
58
|
+
description: string;
|
59
|
+
selected?: boolean;
|
60
|
+
}
|
61
|
+
export interface ManifestResource {
|
62
|
+
path: string;
|
63
|
+
provider: string;
|
64
|
+
runtime: string;
|
65
|
+
options: string[];
|
66
|
+
}
|
67
|
+
export interface ManifestArgument {
|
68
|
+
default?: string;
|
69
|
+
description?: string;
|
70
|
+
type: string;
|
71
|
+
}
|
72
|
+
export interface Manifest {
|
73
|
+
main: [string, string];
|
74
|
+
signals?: {
|
75
|
+
main: {
|
76
|
+
args: string[];
|
77
|
+
entry: [string, string];
|
78
|
+
};
|
79
|
+
};
|
80
|
+
arguments?: unknown | Record<string, ManifestArgument>;
|
81
|
+
resources: ManifestResource[];
|
82
|
+
mode?: 'cloud';
|
83
|
+
}
|
84
|
+
export interface CreateAssetResponse {
|
85
|
+
id: string;
|
86
|
+
name: string;
|
87
|
+
path: string;
|
88
|
+
dateCreated: number;
|
89
|
+
hash: string;
|
90
|
+
postContentLink: string;
|
91
|
+
type: 'file';
|
92
|
+
workflow: string;
|
93
|
+
}
|
94
|
+
export {};
|
@@ -1,12 +1,11 @@
|
|
1
1
|
import { EvaluatorService, ScheduleService } from '../services';
|
2
|
+
import { IBaseService, ServiceEnum } from '../models';
|
2
3
|
import { CallerServiceNode } from '../services/CallerServiceNode';
|
3
4
|
import { CommandServiceNode } from '../services/CommandServiceNode';
|
4
5
|
import { ControlServiceNode } from '../services/ControlServiceNode';
|
5
6
|
import { FileAccessorServiceNode } from '../services/FileAccessorServiceNode';
|
6
|
-
import { IBaseService } from '../models/IBaseService';
|
7
7
|
import { RocosSDK } from '../RocosSDK';
|
8
8
|
import { SearchServiceNode } from '../services/SearchServiceNode';
|
9
|
-
import { ServiceEnum } from '../models/ServiceEnum';
|
10
9
|
import { TelemetryServiceNode } from '../services/TelemetryServiceNode';
|
11
10
|
export declare class RocosSDKNode extends RocosSDK {
|
12
11
|
getService<T extends IBaseService>(name: ServiceEnum): T;
|
package/esm/node/RocosSDKNode.js
CHANGED
@@ -1,96 +1,85 @@
|
|
1
|
-
import { MapService, ScheduleService, SpotProvisioningServiceNode } from '../services';
|
2
|
-
import {
|
3
|
-
import { AuthService } from '../services/AuthService';
|
1
|
+
import { AssetStorageService, AuthService, ConfigGroupService, DashboardService, EventService, FunctionService, IntegrationService, MapService, ProfileService, ProjectService, RobotService, ScheduleService, SpotProvisioningServiceNode, StreamService, UserService, } from '../services';
|
2
|
+
import { ServiceEnum } from '../models';
|
4
3
|
import { CallerServiceNode } from '../services/CallerServiceNode';
|
5
4
|
import { CommandServiceNode } from '../services/CommandServiceNode';
|
6
|
-
import { ConfigGroupService } from '../services/ConfigGroupService';
|
7
5
|
import { ControlServiceNode } from '../services/ControlServiceNode';
|
8
|
-
import { DashboardService } from '../services/DashboardService';
|
9
|
-
import { EventService } from '../services/EventService';
|
10
6
|
import { FileAccessorServiceNode } from '../services/FileAccessorServiceNode';
|
11
|
-
import { FunctionService } from '../services/FunctionService';
|
12
|
-
import { IntegrationService } from '../services/IntegrationService';
|
13
|
-
import { ProfileService } from '../services/ProfileService';
|
14
|
-
import { ProjectService } from '../services/ProjectService';
|
15
|
-
import { RobotService } from '../services/RobotService';
|
16
7
|
import { RocosSDK } from '../RocosSDK';
|
17
8
|
import { SearchServiceNode } from '../services/SearchServiceNode';
|
18
|
-
import { ServiceEnum } from '../models/ServiceEnum';
|
19
|
-
import { StreamService } from '../services/StreamService';
|
20
9
|
import { TelemetryServiceNode } from '../services/TelemetryServiceNode';
|
21
|
-
import {
|
22
|
-
import { WorkflowService } from '../services/WorkflowService';
|
10
|
+
import { WorkflowServiceNode } from '../services/WorkflowServiceNode';
|
23
11
|
export class RocosSDKNode extends RocosSDK {
|
24
12
|
// eslint-disable-next-line max-lines-per-function
|
25
13
|
getService(name) {
|
26
14
|
if (!this.services?.[name]) {
|
27
15
|
this.logger.info(`Service ${name} does not exist, creating it now.`);
|
16
|
+
const config = this.overrideConfig(name);
|
28
17
|
switch (name) {
|
29
18
|
case ServiceEnum.AUTH:
|
30
|
-
this.services[name] = new AuthService(
|
19
|
+
this.services[name] = new AuthService(config);
|
31
20
|
break;
|
32
21
|
case ServiceEnum.TELEMETRY:
|
33
|
-
this.services[name] = new TelemetryServiceNode(
|
22
|
+
this.services[name] = new TelemetryServiceNode(config);
|
34
23
|
break;
|
35
24
|
case ServiceEnum.ROBOT:
|
36
|
-
this.services[name] = new RobotService(
|
25
|
+
this.services[name] = new RobotService(config);
|
37
26
|
break;
|
38
27
|
case ServiceEnum.EVENT:
|
39
|
-
this.services[name] = new EventService(
|
28
|
+
this.services[name] = new EventService(config);
|
40
29
|
break;
|
41
30
|
case ServiceEnum.PROJECT:
|
42
|
-
this.services[name] = new ProjectService(
|
31
|
+
this.services[name] = new ProjectService(config);
|
43
32
|
break;
|
44
33
|
case ServiceEnum.CALLER:
|
45
|
-
this.services[name] = new CallerServiceNode(
|
34
|
+
this.services[name] = new CallerServiceNode(config);
|
46
35
|
break;
|
47
36
|
case ServiceEnum.COMMAND:
|
48
|
-
this.services[name] = new CommandServiceNode(
|
37
|
+
this.services[name] = new CommandServiceNode(config);
|
49
38
|
break;
|
50
39
|
case ServiceEnum.CONTROL:
|
51
|
-
this.services[name] = new ControlServiceNode(
|
40
|
+
this.services[name] = new ControlServiceNode(config);
|
52
41
|
break;
|
53
42
|
case ServiceEnum.SEARCH:
|
54
|
-
this.services[name] = new SearchServiceNode(
|
43
|
+
this.services[name] = new SearchServiceNode(config);
|
55
44
|
break;
|
56
45
|
case ServiceEnum.CONFIG_GROUP:
|
57
|
-
this.services[name] = new ConfigGroupService(
|
46
|
+
this.services[name] = new ConfigGroupService(config);
|
58
47
|
break;
|
59
48
|
case ServiceEnum.DASHBOARD:
|
60
|
-
this.services[name] = new DashboardService(
|
49
|
+
this.services[name] = new DashboardService(config);
|
61
50
|
break;
|
62
51
|
case ServiceEnum.FUNCTION:
|
63
|
-
this.services[name] = new FunctionService(
|
52
|
+
this.services[name] = new FunctionService(config);
|
64
53
|
break;
|
65
54
|
case ServiceEnum.STREAM:
|
66
|
-
this.services[name] = new StreamService(
|
55
|
+
this.services[name] = new StreamService(config);
|
67
56
|
break;
|
68
57
|
case ServiceEnum.USER:
|
69
|
-
this.services[name] = new UserService(
|
58
|
+
this.services[name] = new UserService(config);
|
70
59
|
break;
|
71
60
|
case ServiceEnum.WORKFLOW:
|
72
|
-
this.services[name] = new
|
61
|
+
this.services[name] = new WorkflowServiceNode(config);
|
73
62
|
break;
|
74
63
|
case ServiceEnum.ASSET_STORAGE:
|
75
|
-
this.services[name] = new AssetStorageService(
|
64
|
+
this.services[name] = new AssetStorageService(config);
|
76
65
|
break;
|
77
66
|
case ServiceEnum.PROFILE:
|
78
|
-
this.services[name] = new ProfileService(
|
67
|
+
this.services[name] = new ProfileService(config);
|
79
68
|
break;
|
80
69
|
case ServiceEnum.FILE_ACCESSOR:
|
81
|
-
this.services[name] = new FileAccessorServiceNode(
|
70
|
+
this.services[name] = new FileAccessorServiceNode(config);
|
82
71
|
break;
|
83
72
|
case ServiceEnum.SPOT_PROVISIONER:
|
84
|
-
this.services[name] = new SpotProvisioningServiceNode(
|
73
|
+
this.services[name] = new SpotProvisioningServiceNode(config);
|
85
74
|
break;
|
86
75
|
case ServiceEnum.SCHEDULE:
|
87
|
-
this.services[name] = new ScheduleService(
|
76
|
+
this.services[name] = new ScheduleService(config);
|
88
77
|
break;
|
89
78
|
case ServiceEnum.INTEGRATION:
|
90
|
-
this.services[name] = new IntegrationService(
|
79
|
+
this.services[name] = new IntegrationService(config);
|
91
80
|
break;
|
92
81
|
case ServiceEnum.MAP:
|
93
|
-
this.services[name] = new MapService(
|
82
|
+
this.services[name] = new MapService(config);
|
94
83
|
break;
|
95
84
|
}
|
96
85
|
}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { API_PROJECT_ASSET_INTEGRATION_PATH_URL, API_PROJECT_ASSET_INTEGRATION_PROVIDERS_PATH_URL,
|
2
|
-
import {
|
1
|
+
import { API_PROJECT_ASSET_INTEGRATIONS_PATH_URL, API_PROJECT_ASSET_INTEGRATION_PATH_URL, API_PROJECT_ASSET_INTEGRATION_PROVIDERS_PATH_URL, API_PROJECT_ASSET_PATH_URL, API_PROJECT_ASSET_PROFILES_SYNC_DEFINITION_PATH_URL, API_PROJECT_ASSET_ROBOTS_SYNC_DEFINITION_PATH_URL, API_PROJECT_ASSET_URL, API_PROJECT_FLOW_ASSET_PATH_URL, API_PROJECT_MAPPED_ASSETS_PATH_URL, API_PROJECT_MISSION_ASSETS_PATH_URL, API_PROJECT_MISSION_ASSET_PATH_URL, API_PROJECT_ROBOT_ASSET_PATH_URL, } from '../constants/api';
|
2
|
+
import { RocosError, errorCodes } from '../models/RocosError';
|
3
3
|
import { BaseServiceAbstract } from './BaseServiceAbstract';
|
4
4
|
import { RocosLogger } from '../logger/RocosLogger';
|
5
5
|
import { formatServiceUrl } from '../helpers/formatServiceUrl';
|
@@ -208,7 +208,7 @@ export class AssetStorageService extends BaseServiceAbstract {
|
|
208
208
|
* @param integration
|
209
209
|
*/
|
210
210
|
updateSyncIntegration(projectId, integrationId, integration) {
|
211
|
-
return this.callPut(formatServiceUrl(API_PROJECT_ASSET_INTEGRATION_PATH_URL, { url: this.config.url, projectId, integrationId
|
211
|
+
return this.callPut(formatServiceUrl(API_PROJECT_ASSET_INTEGRATION_PATH_URL, { url: this.config.url, projectId, integrationId }, this.config.insecure), integration, `Failed to update asset sync integrations for ${projectId}.`);
|
212
212
|
}
|
213
213
|
/**
|
214
214
|
* Delete a Sync Integration
|
@@ -14,6 +14,8 @@ export class BaseStreamService {
|
|
14
14
|
return this.status;
|
15
15
|
}
|
16
16
|
async initStream(stream) {
|
17
|
+
if (this.config.insecure)
|
18
|
+
return; // no need to init auth for insecure connections
|
17
19
|
const authService = RocosStore.getSDKInstance(this.config).getAuthService();
|
18
20
|
if (!this.config.token || !authService.isTokenValid(new Token(this.config.token))) {
|
19
21
|
try {
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { RocosError } from '../models/RocosError';
|
2
1
|
import type { Workflow, WorkflowBase } from '../models/workflow/Workflow';
|
2
|
+
import { RocosError } from '../models/RocosError';
|
3
3
|
import { BaseServiceAbstract } from './BaseServiceAbstract';
|
4
4
|
import { IBaseService } from '../models/IBaseService';
|
5
5
|
import { IRocosSDKConfig } from '../models/IRocosSDKConfig';
|
@@ -13,11 +13,6 @@ export declare class WorkflowService extends BaseServiceAbstract implements IBas
|
|
13
13
|
* @param projectId - Project Id
|
14
14
|
*/
|
15
15
|
list(projectId: string): Promise<Workflow[]>;
|
16
|
-
/**
|
17
|
-
* @deprecated This method is deprecated and will be removed in a future version.
|
18
|
-
* Use list instead.
|
19
|
-
*/
|
20
|
-
getAll: (projectId: string) => Promise<Workflow[]>;
|
21
16
|
/**
|
22
17
|
* Create a workflow
|
23
18
|
*
|
@@ -32,11 +27,6 @@ export declare class WorkflowService extends BaseServiceAbstract implements IBas
|
|
32
27
|
* @param workflowId - Workflow Id
|
33
28
|
*/
|
34
29
|
get(projectId: string, workflowId: string): Promise<Workflow>;
|
35
|
-
/**
|
36
|
-
* @deprecated This method is deprecated and will be removed in a future version.
|
37
|
-
* Use get instead.
|
38
|
-
*/
|
39
|
-
getOne: (projectId: string, workflowId: string) => Promise<Workflow>;
|
40
30
|
/**
|
41
31
|
* Update a workflow
|
42
32
|
*
|
@@ -45,6 +35,16 @@ export declare class WorkflowService extends BaseServiceAbstract implements IBas
|
|
45
35
|
* @param model - Workflow
|
46
36
|
*/
|
47
37
|
update(projectId: string, workflowId: string, model: Workflow): Promise<Workflow>;
|
38
|
+
/**
|
39
|
+
* Upload workflow asset
|
40
|
+
*
|
41
|
+
* @param projectId - Project Id
|
42
|
+
* @param workflowId - Workflow Id
|
43
|
+
* @param fileName - Name of file including extension
|
44
|
+
* @param arrayBuffer - data to upload
|
45
|
+
*/
|
46
|
+
uploadAsset(projectId: string, workflowId: string, fileName: string, arrayBuffer: ArrayBuffer): Promise<void>;
|
47
|
+
protected uploadAssetWithHash(projectId: string, workflowId: string, fileName: string, arrayBuffer: ArrayBuffer, hash: string): Promise<void>;
|
48
48
|
/**
|
49
49
|
* Delete a workflow
|
50
50
|
*
|
@@ -59,9 +59,4 @@ export declare class WorkflowService extends BaseServiceAbstract implements IBas
|
|
59
59
|
* @param callsign - Robot callsign
|
60
60
|
*/
|
61
61
|
getDeployedWorkflows(projectId: string, callsign: string): Promise<Workflow[]>;
|
62
|
-
/**
|
63
|
-
* @deprecated This method is deprecated and will be removed in a future version.
|
64
|
-
* Use getDeployedWorkflow instead.
|
65
|
-
*/
|
66
|
-
getDeployedOnRobot: (projectId: string, callsign: string) => Promise<Workflow[]>;
|
67
62
|
}
|
@@ -1,26 +1,12 @@
|
|
1
|
-
import { API_PROJECT_DEPLOYED_WORKFLOW_URL, API_PROJECT_WORKFLOW_ID_URL, API_PROJECT_WORKFLOW_URL, } from '../constants/api';
|
1
|
+
import { API_PROJECT_DEPLOYED_WORKFLOW_URL, API_PROJECT_WORKFLOW_ASSET_URL, API_PROJECT_WORKFLOW_ID_URL, API_PROJECT_WORKFLOW_URL, } from '../constants/api';
|
2
2
|
import { RocosError, errorCodes } from '../models/RocosError';
|
3
3
|
import { BaseServiceAbstract } from './BaseServiceAbstract';
|
4
4
|
import { RocosLogger } from '../logger/RocosLogger';
|
5
5
|
import { formatServiceUrl } from '../helpers/formatServiceUrl';
|
6
|
+
import { getSha256Hex } from '../helpers/getSha256Hex';
|
6
7
|
export class WorkflowService extends BaseServiceAbstract {
|
7
8
|
constructor(config) {
|
8
9
|
super(config);
|
9
|
-
/**
|
10
|
-
* @deprecated This method is deprecated and will be removed in a future version.
|
11
|
-
* Use list instead.
|
12
|
-
*/
|
13
|
-
this.getAll = this.list;
|
14
|
-
/**
|
15
|
-
* @deprecated This method is deprecated and will be removed in a future version.
|
16
|
-
* Use get instead.
|
17
|
-
*/
|
18
|
-
this.getOne = this.get;
|
19
|
-
/**
|
20
|
-
* @deprecated This method is deprecated and will be removed in a future version.
|
21
|
-
* Use getDeployedWorkflow instead.
|
22
|
-
*/
|
23
|
-
this.getDeployedOnRobot = this.getDeployedWorkflows;
|
24
10
|
this.logger = RocosLogger.getInstance(`WorkflowService(${this.config.url})`);
|
25
11
|
}
|
26
12
|
getError(e) {
|
@@ -65,6 +51,37 @@ export class WorkflowService extends BaseServiceAbstract {
|
|
65
51
|
async update(projectId, workflowId, model) {
|
66
52
|
return this.callPut(formatServiceUrl(API_PROJECT_WORKFLOW_ID_URL, { url: this.config.url, projectId, workflowId }, this.config.insecure), model, `Failed to update workflow for ${projectId}, workflowId ${workflowId}.`);
|
67
53
|
}
|
54
|
+
/**
|
55
|
+
* Upload workflow asset
|
56
|
+
*
|
57
|
+
* @param projectId - Project Id
|
58
|
+
* @param workflowId - Workflow Id
|
59
|
+
* @param fileName - Name of file including extension
|
60
|
+
* @param arrayBuffer - data to upload
|
61
|
+
*/
|
62
|
+
async uploadAsset(projectId, workflowId, fileName, arrayBuffer) {
|
63
|
+
const hash = await getSha256Hex(arrayBuffer);
|
64
|
+
return this.uploadAssetWithHash(projectId, workflowId, fileName, arrayBuffer, hash);
|
65
|
+
}
|
66
|
+
async uploadAssetWithHash(projectId, workflowId, fileName, arrayBuffer, hash) {
|
67
|
+
// Get asset upload link
|
68
|
+
const createAssetResponse = await this.callPost(formatServiceUrl(API_PROJECT_WORKFLOW_ASSET_URL, { url: this.config.url, projectId, workflowId }, this.config.insecure), { name: fileName, type: 'file', hash }, `Failed to create asset for ${projectId}, workflowId ${workflowId}.`);
|
69
|
+
const { postContentLink } = createAssetResponse;
|
70
|
+
if (!postContentLink)
|
71
|
+
throw new Error('postContentLink is undefined');
|
72
|
+
// Get Google upload location
|
73
|
+
const postFileResponse = await fetch(postContentLink, {
|
74
|
+
method: 'POST',
|
75
|
+
headers: { 'x-goog-resumable': 'start' },
|
76
|
+
});
|
77
|
+
const putLocation = postFileResponse.headers.get('location');
|
78
|
+
if (!putLocation)
|
79
|
+
throw new Error('putLocation is undefined');
|
80
|
+
// Upload file to Google
|
81
|
+
const uploadResponse = await fetch(putLocation, { method: 'PUT', body: arrayBuffer });
|
82
|
+
if (uploadResponse.status !== 200)
|
83
|
+
throw new Error(`Failed to upload file: ${uploadResponse.statusText}`);
|
84
|
+
}
|
68
85
|
/**
|
69
86
|
* Delete a workflow
|
70
87
|
*
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { WorkflowService } from './WorkflowService';
|
2
|
+
import { getSha256HexNode } from '../helpers/getSha256HexNode';
|
3
|
+
export class WorkflowServiceNode extends WorkflowService {
|
4
|
+
async uploadAsset(projectId, workflowId, fileName, arrayBuffer) {
|
5
|
+
const hash = await getSha256HexNode(arrayBuffer);
|
6
|
+
return this.uploadAssetWithHash(projectId, workflowId, fileName, arrayBuffer, hash);
|
7
|
+
}
|
8
|
+
}
|