donobu 3.19.3 → 3.20.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/dist/apis/ToolsApi.d.ts.map +1 -1
- package/dist/apis/ToolsApi.js +0 -4
- package/dist/apis/ToolsApi.js.map +1 -1
- package/dist/cli/install-donobu-plugin.js +1 -1
- package/dist/cli/install-donobu-plugin.js.map +1 -1
- package/dist/envVars.d.ts +2 -8
- package/dist/envVars.d.ts.map +1 -1
- package/dist/envVars.js +5 -5
- package/dist/envVars.js.map +1 -1
- package/dist/esm/apis/ToolsApi.d.ts.map +1 -1
- package/dist/esm/apis/ToolsApi.js +0 -4
- package/dist/esm/apis/ToolsApi.js.map +1 -1
- package/dist/esm/cli/install-donobu-plugin.js +1 -1
- package/dist/esm/cli/install-donobu-plugin.js.map +1 -1
- package/dist/esm/envVars.d.ts +2 -8
- package/dist/esm/envVars.d.ts.map +1 -1
- package/dist/esm/envVars.js +5 -5
- package/dist/esm/envVars.js.map +1 -1
- package/dist/esm/lib/page/extendPage.d.ts.map +1 -1
- package/dist/esm/lib/page/extendPage.js +2 -2
- package/dist/esm/lib/page/extendPage.js.map +1 -1
- package/dist/esm/lib/test/testExtension.js +2 -2
- package/dist/esm/lib/test/testExtension.js.map +1 -1
- package/dist/esm/lib/test/utils/donobuTestStack.d.ts.map +1 -1
- package/dist/esm/lib/test/utils/donobuTestStack.js +1 -1
- package/dist/esm/lib/test/utils/donobuTestStack.js.map +1 -1
- package/dist/esm/lib/test/utils/selfHealing.d.ts.map +1 -1
- package/dist/esm/lib/test/utils/selfHealing.js +0 -2
- package/dist/esm/lib/test/utils/selfHealing.js.map +1 -1
- package/dist/esm/main.d.ts +9 -1
- package/dist/esm/main.d.ts.map +1 -1
- package/dist/esm/main.js +14 -4
- package/dist/esm/main.js.map +1 -1
- package/dist/esm/managers/AdminApiController.d.ts +1 -1
- package/dist/esm/managers/AdminApiController.d.ts.map +1 -1
- package/dist/esm/managers/AdminApiController.js.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlowsManager.js +2 -2
- package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/esm/managers/DonobuStack.d.ts +2 -16
- package/dist/esm/managers/DonobuStack.d.ts.map +1 -1
- package/dist/esm/managers/DonobuStack.js +1 -1
- package/dist/esm/managers/DonobuStack.js.map +1 -1
- package/dist/esm/managers/PluginLoader.d.ts +9 -4
- package/dist/esm/managers/PluginLoader.d.ts.map +1 -1
- package/dist/esm/managers/PluginLoader.js +24 -9
- package/dist/esm/managers/PluginLoader.js.map +1 -1
- package/dist/esm/managers/ToolManager.d.ts +5 -0
- package/dist/esm/managers/ToolManager.d.ts.map +1 -1
- package/dist/esm/managers/ToolManager.js +9 -5
- package/dist/esm/managers/ToolManager.js.map +1 -1
- package/dist/esm/persistence/PersistencePlugin.d.ts +29 -0
- package/dist/esm/persistence/PersistencePlugin.d.ts.map +1 -0
- package/dist/esm/persistence/PersistencePlugin.js +21 -0
- package/dist/esm/persistence/PersistencePlugin.js.map +1 -0
- package/dist/esm/persistence/env/EnvPersistenceRegistry.d.ts +1 -1
- package/dist/esm/persistence/env/EnvPersistenceRegistry.d.ts.map +1 -1
- package/dist/esm/persistence/env/EnvPersistenceRegistry.js +11 -15
- package/dist/esm/persistence/env/EnvPersistenceRegistry.js.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.d.ts +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.d.ts.map +1 -1
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.js +11 -15
- package/dist/esm/persistence/flows/FlowsPersistenceRegistry.js.map +1 -1
- package/dist/esm/utils/MiscUtils.js +2 -2
- package/dist/esm/utils/MiscUtils.js.map +1 -1
- package/dist/lib/page/extendPage.d.ts.map +1 -1
- package/dist/lib/page/extendPage.js +2 -2
- package/dist/lib/page/extendPage.js.map +1 -1
- package/dist/lib/test/testExtension.js +2 -2
- package/dist/lib/test/testExtension.js.map +1 -1
- package/dist/lib/test/utils/donobuTestStack.d.ts.map +1 -1
- package/dist/lib/test/utils/donobuTestStack.js +1 -1
- package/dist/lib/test/utils/donobuTestStack.js.map +1 -1
- package/dist/lib/test/utils/selfHealing.d.ts.map +1 -1
- package/dist/lib/test/utils/selfHealing.js +0 -2
- package/dist/lib/test/utils/selfHealing.js.map +1 -1
- package/dist/main.d.ts +9 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +14 -4
- package/dist/main.js.map +1 -1
- package/dist/managers/AdminApiController.d.ts +1 -1
- package/dist/managers/AdminApiController.d.ts.map +1 -1
- package/dist/managers/AdminApiController.js.map +1 -1
- package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
- package/dist/managers/DonobuFlowsManager.js +2 -2
- package/dist/managers/DonobuFlowsManager.js.map +1 -1
- package/dist/managers/DonobuStack.d.ts +2 -16
- package/dist/managers/DonobuStack.d.ts.map +1 -1
- package/dist/managers/DonobuStack.js +1 -1
- package/dist/managers/DonobuStack.js.map +1 -1
- package/dist/managers/PluginLoader.d.ts +9 -4
- package/dist/managers/PluginLoader.d.ts.map +1 -1
- package/dist/managers/PluginLoader.js +24 -9
- package/dist/managers/PluginLoader.js.map +1 -1
- package/dist/managers/ToolManager.d.ts +5 -0
- package/dist/managers/ToolManager.d.ts.map +1 -1
- package/dist/managers/ToolManager.js +9 -5
- package/dist/managers/ToolManager.js.map +1 -1
- package/dist/persistence/PersistencePlugin.d.ts +29 -0
- package/dist/persistence/PersistencePlugin.d.ts.map +1 -0
- package/dist/persistence/PersistencePlugin.js +21 -0
- package/dist/persistence/PersistencePlugin.js.map +1 -0
- package/dist/persistence/env/EnvPersistenceRegistry.d.ts +1 -1
- package/dist/persistence/env/EnvPersistenceRegistry.d.ts.map +1 -1
- package/dist/persistence/env/EnvPersistenceRegistry.js +11 -15
- package/dist/persistence/env/EnvPersistenceRegistry.js.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceRegistry.d.ts +1 -1
- package/dist/persistence/flows/FlowsPersistenceRegistry.d.ts.map +1 -1
- package/dist/persistence/flows/FlowsPersistenceRegistry.js +11 -15
- package/dist/persistence/flows/FlowsPersistenceRegistry.js.map +1 -1
- package/dist/utils/MiscUtils.js +2 -2
- package/dist/utils/MiscUtils.js.map +1 -1
- package/package.json +2 -7
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.d.ts +0 -31
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.d.ts.map +0 -1
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.js +0 -117
- package/dist/esm/persistence/env/EnvPersistenceAwsS3.js.map +0 -1
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts +0 -30
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.js +0 -131
- package/dist/esm/persistence/env/EnvPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts +0 -71
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js +0 -487
- package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +0 -71
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +0 -444
- package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/esm/tools/SolveCaptcha.d.ts +0 -19
- package/dist/esm/tools/SolveCaptcha.d.ts.map +0 -1
- package/dist/esm/tools/SolveCaptcha.js +0 -36
- package/dist/esm/tools/SolveCaptcha.js.map +0 -1
- package/dist/esm/tools/SolveMfaChallenge.d.ts +0 -45
- package/dist/esm/tools/SolveMfaChallenge.d.ts.map +0 -1
- package/dist/esm/tools/SolveMfaChallenge.js +0 -214
- package/dist/esm/tools/SolveMfaChallenge.js.map +0 -1
- package/dist/persistence/env/EnvPersistenceAwsS3.d.ts +0 -31
- package/dist/persistence/env/EnvPersistenceAwsS3.d.ts.map +0 -1
- package/dist/persistence/env/EnvPersistenceAwsS3.js +0 -117
- package/dist/persistence/env/EnvPersistenceAwsS3.js.map +0 -1
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts +0 -30
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.js +0 -131
- package/dist/persistence/env/EnvPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts +0 -71
- package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceAwsS3.js +0 -487
- package/dist/persistence/flows/FlowsPersistenceAwsS3.js.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +0 -71
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +0 -1
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +0 -444
- package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +0 -1
- package/dist/tools/SolveCaptcha.d.ts +0 -19
- package/dist/tools/SolveCaptcha.d.ts.map +0 -1
- package/dist/tools/SolveCaptcha.js +0 -36
- package/dist/tools/SolveCaptcha.js.map +0 -1
- package/dist/tools/SolveMfaChallenge.d.ts +0 -45
- package/dist/tools/SolveMfaChallenge.d.ts.map +0 -1
- package/dist/tools/SolveMfaChallenge.js +0 -214
- package/dist/tools/SolveMfaChallenge.js.map +0 -1
|
@@ -1,487 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FlowsPersistenceAwsS3 = void 0;
|
|
4
|
-
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
5
|
-
const FlowNotFoundException_1 = require("../../exceptions/FlowNotFoundException");
|
|
6
|
-
const BrowserStorageState_1 = require("../../models/BrowserStorageState");
|
|
7
|
-
const Logger_1 = require("../../utils/Logger");
|
|
8
|
-
const MiscUtils_1 = require("../../utils/MiscUtils");
|
|
9
|
-
/**
|
|
10
|
-
* A persistence implementation that uses AWS S3.
|
|
11
|
-
* Ensure AWS credentials are properly configured in your environment,
|
|
12
|
-
* or provide them directly in the constructor.
|
|
13
|
-
*/
|
|
14
|
-
class FlowsPersistenceAwsS3 {
|
|
15
|
-
/**
|
|
16
|
-
* Creates a new instance of the AWS S3 persistence layer.
|
|
17
|
-
*
|
|
18
|
-
* @param bucketName The name of the S3 bucket to use for storage
|
|
19
|
-
* @param region AWS region (defaults to 'us-east-1')
|
|
20
|
-
* @param credentials Optional AWS credentials (if not provided, will use environment variables)
|
|
21
|
-
*/
|
|
22
|
-
constructor(bucketName, region, credentials) {
|
|
23
|
-
this.bucketName = bucketName;
|
|
24
|
-
this.s3Client = new client_s3_1.S3Client({
|
|
25
|
-
region,
|
|
26
|
-
credentials,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
async setFlowMetadata(flowMetadata) {
|
|
30
|
-
const objectKey = `${flowMetadata.id}/${FlowsPersistenceAwsS3.METADATA_FILENAME}`;
|
|
31
|
-
// Save the main metadata file.
|
|
32
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
33
|
-
Bucket: this.bucketName,
|
|
34
|
-
Key: objectKey,
|
|
35
|
-
Body: JSON.stringify(flowMetadata, null, 2),
|
|
36
|
-
ContentType: 'application/json',
|
|
37
|
-
}));
|
|
38
|
-
// Update the name index if a name exists.
|
|
39
|
-
if (flowMetadata.name) {
|
|
40
|
-
await this.updateNameIndex(flowMetadata.id, flowMetadata.name);
|
|
41
|
-
}
|
|
42
|
-
// Update runMode index
|
|
43
|
-
await this.updateRunModeIndex(flowMetadata.id, flowMetadata.runMode);
|
|
44
|
-
// Update state index
|
|
45
|
-
await this.updateStateIndex(flowMetadata.id, flowMetadata.state);
|
|
46
|
-
// Update combined runMode+state index
|
|
47
|
-
await this.updateRunModeStateIndex(flowMetadata.id, flowMetadata.runMode, flowMetadata.state);
|
|
48
|
-
}
|
|
49
|
-
async getFlowMetadataById(flowId) {
|
|
50
|
-
const objectKey = `${flowId}/${FlowsPersistenceAwsS3.METADATA_FILENAME}`;
|
|
51
|
-
const response = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
52
|
-
Bucket: this.bucketName,
|
|
53
|
-
Key: objectKey,
|
|
54
|
-
}));
|
|
55
|
-
if (!response.Body) {
|
|
56
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
57
|
-
}
|
|
58
|
-
const data = await this.streamToBuffer(response.Body);
|
|
59
|
-
return JSON.parse(data.toString('utf-8'));
|
|
60
|
-
}
|
|
61
|
-
async getFlowMetadataByName(flowName) {
|
|
62
|
-
if (!flowName) {
|
|
63
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName('null');
|
|
64
|
-
}
|
|
65
|
-
const indexKey = `${FlowsPersistenceAwsS3.NAME_INDEX_PREFIX}${encodeURIComponent(flowName)}`;
|
|
66
|
-
// Look up the flow ID in the name index
|
|
67
|
-
const response = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
68
|
-
Bucket: this.bucketName,
|
|
69
|
-
Key: indexKey,
|
|
70
|
-
}));
|
|
71
|
-
if (!response.Body) {
|
|
72
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forName(flowName);
|
|
73
|
-
}
|
|
74
|
-
// Extract the flow ID from the index entry
|
|
75
|
-
const data = await this.streamToBuffer(response.Body);
|
|
76
|
-
const flowId = data.toString('utf-8');
|
|
77
|
-
// Get the flow metadata using the ID
|
|
78
|
-
return await this.getFlowMetadataById(flowId);
|
|
79
|
-
}
|
|
80
|
-
async getFlowsMetadata(query) {
|
|
81
|
-
const { limit = 20, pageToken, name, runMode, state, startedAfter, startedBefore, } = query || {};
|
|
82
|
-
const validLimit = Math.min(Math.max(1, limit), 100);
|
|
83
|
-
// Determine which index to use based on query params
|
|
84
|
-
let prefix = '';
|
|
85
|
-
let usedIndex = false;
|
|
86
|
-
if (name) {
|
|
87
|
-
// If querying by name, directly fetch that specific flow
|
|
88
|
-
try {
|
|
89
|
-
const flow = await this.getFlowMetadataByName(name);
|
|
90
|
-
// Apply other filters
|
|
91
|
-
let includeFlow = true;
|
|
92
|
-
if (runMode && flow.runMode !== runMode) {
|
|
93
|
-
includeFlow = false;
|
|
94
|
-
}
|
|
95
|
-
if (state && flow.state !== state) {
|
|
96
|
-
includeFlow = false;
|
|
97
|
-
}
|
|
98
|
-
// Apply date range filters
|
|
99
|
-
if (startedAfter !== undefined &&
|
|
100
|
-
(flow.startedAt || 0) < startedAfter) {
|
|
101
|
-
includeFlow = false;
|
|
102
|
-
}
|
|
103
|
-
if (startedBefore !== undefined &&
|
|
104
|
-
(flow.startedAt || 0) > startedBefore) {
|
|
105
|
-
includeFlow = false;
|
|
106
|
-
}
|
|
107
|
-
if (includeFlow) {
|
|
108
|
-
return { items: [flow], nextPageToken: undefined };
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return { items: [], nextPageToken: undefined };
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
catch (_error) {
|
|
115
|
-
return { items: [], nextPageToken: undefined };
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
else if (runMode && state) {
|
|
119
|
-
// Use combined index if both runMode and state are specified
|
|
120
|
-
prefix = `${FlowsPersistenceAwsS3.RUN_MODE_STATE_INDEX_PREFIX}${runMode}_${state}/`;
|
|
121
|
-
usedIndex = true;
|
|
122
|
-
}
|
|
123
|
-
else if (runMode) {
|
|
124
|
-
// Use runMode index
|
|
125
|
-
prefix = `${FlowsPersistenceAwsS3.RUN_MODE_INDEX_PREFIX}${runMode}/`;
|
|
126
|
-
usedIndex = true;
|
|
127
|
-
}
|
|
128
|
-
else if (state) {
|
|
129
|
-
// Use state index
|
|
130
|
-
prefix = `${FlowsPersistenceAwsS3.STATE_INDEX_PREFIX}${state}/`;
|
|
131
|
-
usedIndex = true;
|
|
132
|
-
}
|
|
133
|
-
// Configure the list command
|
|
134
|
-
const listCommand = new client_s3_1.ListObjectsV2Command({
|
|
135
|
-
Bucket: this.bucketName,
|
|
136
|
-
MaxKeys: validLimit * 2, // Request more than needed for filtering
|
|
137
|
-
ContinuationToken: pageToken,
|
|
138
|
-
Prefix: usedIndex ? prefix : undefined,
|
|
139
|
-
});
|
|
140
|
-
const response = await this.s3Client.send(listCommand);
|
|
141
|
-
if (!response.Contents) {
|
|
142
|
-
return { items: [] };
|
|
143
|
-
}
|
|
144
|
-
// Process objects based on whether we're using an index or not
|
|
145
|
-
let flowIds = [];
|
|
146
|
-
if (usedIndex) {
|
|
147
|
-
// If using an index, extract flow IDs from index file keys
|
|
148
|
-
flowIds = response.Contents.filter((item) => item.Key).map((item) => {
|
|
149
|
-
const key = item.Key;
|
|
150
|
-
return key.substring(prefix.length);
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
// If not using an index, filter to metadata files
|
|
155
|
-
const metadataFiles = response.Contents.filter((item) => item.Key?.endsWith(`/${FlowsPersistenceAwsS3.METADATA_FILENAME}`));
|
|
156
|
-
// Extract flow IDs from metadata file paths
|
|
157
|
-
flowIds = metadataFiles.map((file) => {
|
|
158
|
-
const key = file.Key;
|
|
159
|
-
return key.substring(0, key.indexOf('/'));
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
// Fetch metadata for each flow and apply remaining filters
|
|
163
|
-
const flows = [];
|
|
164
|
-
for (const flowId of flowIds) {
|
|
165
|
-
try {
|
|
166
|
-
const flowMetadata = await this.getFlowMetadataById(flowId);
|
|
167
|
-
// Apply remaining filters
|
|
168
|
-
let includeFlow = true;
|
|
169
|
-
// Apply date range filters
|
|
170
|
-
if (startedAfter !== undefined &&
|
|
171
|
-
(flowMetadata.startedAt || 0) < startedAfter) {
|
|
172
|
-
includeFlow = false;
|
|
173
|
-
}
|
|
174
|
-
if (startedBefore !== undefined &&
|
|
175
|
-
(flowMetadata.startedAt || 0) > startedBefore) {
|
|
176
|
-
includeFlow = false;
|
|
177
|
-
}
|
|
178
|
-
// Double-check indexed fields (in case index is out of sync)
|
|
179
|
-
if (runMode && flowMetadata.runMode !== runMode) {
|
|
180
|
-
includeFlow = false;
|
|
181
|
-
}
|
|
182
|
-
if (state && flowMetadata.state !== state) {
|
|
183
|
-
includeFlow = false;
|
|
184
|
-
}
|
|
185
|
-
if (includeFlow) {
|
|
186
|
-
flows.push(flowMetadata);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
catch (e) {
|
|
190
|
-
Logger_1.appLogger.warn(`Flow not found: ${flowId}`, e);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
// Sort by creation date (newest first) - fixing the sort order
|
|
194
|
-
flows.sort((a, b) => (b.startedAt || 0) - (a.startedAt || 0));
|
|
195
|
-
// Apply limit
|
|
196
|
-
const limitedFlows = flows.slice(0, validLimit);
|
|
197
|
-
const hasMore = flows.length > validLimit;
|
|
198
|
-
return {
|
|
199
|
-
items: limitedFlows,
|
|
200
|
-
nextPageToken: hasMore ? response.NextContinuationToken : undefined,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
async saveScreenShot(flowId, bytes) {
|
|
204
|
-
const imageType = MiscUtils_1.MiscUtils.detectImageType(bytes);
|
|
205
|
-
const mimeType = `image/${imageType}`;
|
|
206
|
-
const filename = `${new Date().toISOString()}.screenshot.${imageType}`;
|
|
207
|
-
const objectKey = `${flowId}/${filename}`;
|
|
208
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
209
|
-
Bucket: this.bucketName,
|
|
210
|
-
Key: objectKey,
|
|
211
|
-
Body: bytes,
|
|
212
|
-
ContentType: mimeType,
|
|
213
|
-
}));
|
|
214
|
-
return filename;
|
|
215
|
-
}
|
|
216
|
-
async getScreenShot(flowId, screenShotId) {
|
|
217
|
-
const objectKey = `${flowId}/${screenShotId}`;
|
|
218
|
-
try {
|
|
219
|
-
const response = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
220
|
-
Bucket: this.bucketName,
|
|
221
|
-
Key: objectKey,
|
|
222
|
-
}));
|
|
223
|
-
if (!response.Body || !response.ContentType?.startsWith('image')) {
|
|
224
|
-
return null;
|
|
225
|
-
}
|
|
226
|
-
return await this.streamToBuffer(response.Body);
|
|
227
|
-
}
|
|
228
|
-
catch (_error) {
|
|
229
|
-
return null;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
async setToolCall(flowId, toolCall) {
|
|
233
|
-
const filename = `${toolCall.startedAt}${FlowsPersistenceAwsS3.TOOL_CALL_FILENAME_SUFFIX}`;
|
|
234
|
-
const objectKey = `${flowId}/${filename}`;
|
|
235
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
236
|
-
Bucket: this.bucketName,
|
|
237
|
-
Key: objectKey,
|
|
238
|
-
Body: JSON.stringify(toolCall, null, 2),
|
|
239
|
-
ContentType: 'application/json',
|
|
240
|
-
}));
|
|
241
|
-
}
|
|
242
|
-
async getToolCalls(flowId) {
|
|
243
|
-
const prefix = `${flowId}/`;
|
|
244
|
-
const response = await this.s3Client.send(new client_s3_1.ListObjectsV2Command({
|
|
245
|
-
Bucket: this.bucketName,
|
|
246
|
-
Prefix: prefix,
|
|
247
|
-
}));
|
|
248
|
-
if (!response.Contents || response.Contents.length === 0) {
|
|
249
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
250
|
-
}
|
|
251
|
-
const toolCallFiles = response.Contents.filter((item) => item.Key?.endsWith(FlowsPersistenceAwsS3.TOOL_CALL_FILENAME_SUFFIX));
|
|
252
|
-
if (toolCallFiles.length === 0) {
|
|
253
|
-
return [];
|
|
254
|
-
}
|
|
255
|
-
const toolCalls = await Promise.all(toolCallFiles.map(async (file) => {
|
|
256
|
-
const response = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
257
|
-
Bucket: this.bucketName,
|
|
258
|
-
Key: file.Key,
|
|
259
|
-
}));
|
|
260
|
-
if (!response.Body) {
|
|
261
|
-
return null;
|
|
262
|
-
}
|
|
263
|
-
const data = await this.streamToBuffer(response.Body);
|
|
264
|
-
return JSON.parse(data.toString('utf-8'));
|
|
265
|
-
}));
|
|
266
|
-
return toolCalls
|
|
267
|
-
.filter((toolCall) => toolCall !== null)
|
|
268
|
-
.sort((a, b) => (a.startedAt || 0) - (b.startedAt || 0));
|
|
269
|
-
}
|
|
270
|
-
async deleteToolCall(flowId, toolCallId) {
|
|
271
|
-
const prefix = `${flowId}/`;
|
|
272
|
-
let continuationToken = undefined;
|
|
273
|
-
let hasFlowData = false;
|
|
274
|
-
do {
|
|
275
|
-
const response = await this.s3Client.send(new client_s3_1.ListObjectsV2Command({
|
|
276
|
-
Bucket: this.bucketName,
|
|
277
|
-
Prefix: prefix,
|
|
278
|
-
ContinuationToken: continuationToken,
|
|
279
|
-
}));
|
|
280
|
-
if (response.Contents && response.Contents.length > 0) {
|
|
281
|
-
hasFlowData = true;
|
|
282
|
-
for (const object of response.Contents) {
|
|
283
|
-
const key = object.Key;
|
|
284
|
-
if (!key?.endsWith(FlowsPersistenceAwsS3.TOOL_CALL_FILENAME_SUFFIX)) {
|
|
285
|
-
continue;
|
|
286
|
-
}
|
|
287
|
-
try {
|
|
288
|
-
const existingToolCall = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
289
|
-
Bucket: this.bucketName,
|
|
290
|
-
Key: key,
|
|
291
|
-
}));
|
|
292
|
-
if (!existingToolCall.Body) {
|
|
293
|
-
continue;
|
|
294
|
-
}
|
|
295
|
-
const data = await this.streamToBuffer(existingToolCall.Body);
|
|
296
|
-
const toolCall = JSON.parse(data.toString('utf-8'));
|
|
297
|
-
if (toolCall.id === toolCallId) {
|
|
298
|
-
await this.s3Client.send(new client_s3_1.DeleteObjectCommand({
|
|
299
|
-
Bucket: this.bucketName,
|
|
300
|
-
Key: key,
|
|
301
|
-
}));
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
catch (error) {
|
|
306
|
-
Logger_1.appLogger.warn(`Failed to inspect tool call object ${key} for deletion`, error);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
continuationToken = response.IsTruncated
|
|
311
|
-
? response.NextContinuationToken
|
|
312
|
-
: undefined;
|
|
313
|
-
} while (continuationToken);
|
|
314
|
-
if (!hasFlowData) {
|
|
315
|
-
throw FlowNotFoundException_1.FlowNotFoundException.forId(flowId);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
async setVideo(flowId, bytes) {
|
|
319
|
-
const objectKey = `${flowId}/${FlowsPersistenceAwsS3.VIDEO_FILENAME}`;
|
|
320
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
321
|
-
Bucket: this.bucketName,
|
|
322
|
-
Key: objectKey,
|
|
323
|
-
Body: bytes,
|
|
324
|
-
ContentType: 'video/webm',
|
|
325
|
-
}));
|
|
326
|
-
}
|
|
327
|
-
async getVideoSegment(flowId, startOffset, length) {
|
|
328
|
-
const objectKey = `${flowId}/${FlowsPersistenceAwsS3.VIDEO_FILENAME}`;
|
|
329
|
-
// First, get the total size of the video file
|
|
330
|
-
const headResponse = await this.s3Client.send(new client_s3_1.HeadObjectCommand({
|
|
331
|
-
Bucket: this.bucketName,
|
|
332
|
-
Key: objectKey,
|
|
333
|
-
}));
|
|
334
|
-
const totalLength = headResponse.ContentLength || 0;
|
|
335
|
-
const adjustedLength = Math.min(length, totalLength - startOffset);
|
|
336
|
-
if (adjustedLength <= 0) {
|
|
337
|
-
return null;
|
|
338
|
-
}
|
|
339
|
-
const range = `bytes=${startOffset}-${startOffset + adjustedLength - 1}`;
|
|
340
|
-
const response = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
341
|
-
Bucket: this.bucketName,
|
|
342
|
-
Key: objectKey,
|
|
343
|
-
Range: range,
|
|
344
|
-
}));
|
|
345
|
-
if (!response.Body) {
|
|
346
|
-
return null;
|
|
347
|
-
}
|
|
348
|
-
const buffer = await this.streamToBuffer(response.Body);
|
|
349
|
-
return {
|
|
350
|
-
bytes: buffer,
|
|
351
|
-
totalLength: totalLength,
|
|
352
|
-
startOffset: startOffset,
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
async getFlowFile(flowId, fileId) {
|
|
356
|
-
const objectKey = `${flowId}/${fileId}`;
|
|
357
|
-
const response = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
358
|
-
Bucket: this.bucketName,
|
|
359
|
-
Key: objectKey,
|
|
360
|
-
}));
|
|
361
|
-
if (!response.Body) {
|
|
362
|
-
return null;
|
|
363
|
-
}
|
|
364
|
-
return await this.streamToBuffer(response.Body);
|
|
365
|
-
}
|
|
366
|
-
async setFlowFile(flowId, fileId, fileBytes) {
|
|
367
|
-
const objectKey = `${flowId}/${fileId}`;
|
|
368
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
369
|
-
Bucket: this.bucketName,
|
|
370
|
-
Key: objectKey,
|
|
371
|
-
Body: fileBytes,
|
|
372
|
-
ContentType: 'application/octet-stream',
|
|
373
|
-
}));
|
|
374
|
-
}
|
|
375
|
-
async setBrowserState(flowId, browserState) {
|
|
376
|
-
const serializedBrowserState = Buffer.from(JSON.stringify(browserState), 'utf-8');
|
|
377
|
-
await this.setFlowFile(flowId, FlowsPersistenceAwsS3.BROWSER_STATE_FILENAME, serializedBrowserState);
|
|
378
|
-
}
|
|
379
|
-
async getBrowserState(flowId) {
|
|
380
|
-
const browserStateRaw = await this.getFlowFile(flowId, FlowsPersistenceAwsS3.BROWSER_STATE_FILENAME);
|
|
381
|
-
if (browserStateRaw) {
|
|
382
|
-
return BrowserStorageState_1.BrowserStorageStateSchema.parse(JSON.parse(browserStateRaw.toString('utf-8')));
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
return null;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
async deleteFlow(flowId) {
|
|
389
|
-
// Get flow metadata to find its name.
|
|
390
|
-
const metadata = await this.getFlowMetadataById(flowId);
|
|
391
|
-
// Delete the name index entry if name exists.
|
|
392
|
-
if (metadata.name) {
|
|
393
|
-
const indexKey = `${FlowsPersistenceAwsS3.NAME_INDEX_PREFIX}${encodeURIComponent(metadata.name)}`;
|
|
394
|
-
await this.s3Client.send(new client_s3_1.DeleteObjectCommand({
|
|
395
|
-
Bucket: this.bucketName,
|
|
396
|
-
Key: indexKey,
|
|
397
|
-
}));
|
|
398
|
-
}
|
|
399
|
-
const prefix = `${flowId}/`;
|
|
400
|
-
// List all objects with the flow prefix.
|
|
401
|
-
const response = await this.s3Client.send(new client_s3_1.ListObjectsV2Command({
|
|
402
|
-
Bucket: this.bucketName,
|
|
403
|
-
Prefix: prefix,
|
|
404
|
-
}));
|
|
405
|
-
if (!response.Contents || response.Contents.length === 0) {
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
// Delete each object.
|
|
409
|
-
for (const object of response.Contents) {
|
|
410
|
-
if (object.Key) {
|
|
411
|
-
await this.s3Client.send(new client_s3_1.DeleteObjectCommand({
|
|
412
|
-
Bucket: this.bucketName,
|
|
413
|
-
Key: object.Key,
|
|
414
|
-
}));
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Utility method to stream S3 object data to a Buffer
|
|
420
|
-
*/
|
|
421
|
-
async streamToBuffer(stream) {
|
|
422
|
-
return new Promise((resolve, reject) => {
|
|
423
|
-
const chunks = [];
|
|
424
|
-
stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
425
|
-
stream.on('error', reject);
|
|
426
|
-
stream.on('end', () => resolve(Buffer.concat(chunks)));
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Update name-to-id index.
|
|
431
|
-
*/
|
|
432
|
-
async updateNameIndex(flowId, flowName) {
|
|
433
|
-
const indexKey = `${FlowsPersistenceAwsS3.NAME_INDEX_PREFIX}${encodeURIComponent(flowName)}`;
|
|
434
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
435
|
-
Bucket: this.bucketName,
|
|
436
|
-
Key: indexKey,
|
|
437
|
-
Body: flowId,
|
|
438
|
-
ContentType: 'text/plain',
|
|
439
|
-
}));
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Update runMode-to-id index.
|
|
443
|
-
*/
|
|
444
|
-
async updateRunModeIndex(flowId, runMode) {
|
|
445
|
-
const indexKey = `${FlowsPersistenceAwsS3.RUN_MODE_INDEX_PREFIX}${runMode}/${flowId}`;
|
|
446
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
447
|
-
Bucket: this.bucketName,
|
|
448
|
-
Key: indexKey,
|
|
449
|
-
Body: flowId,
|
|
450
|
-
ContentType: 'text/plain',
|
|
451
|
-
}));
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Update state-to-id index.
|
|
455
|
-
*/
|
|
456
|
-
async updateStateIndex(flowId, state) {
|
|
457
|
-
const indexKey = `${FlowsPersistenceAwsS3.STATE_INDEX_PREFIX}${state}/${flowId}`;
|
|
458
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
459
|
-
Bucket: this.bucketName,
|
|
460
|
-
Key: indexKey,
|
|
461
|
-
Body: flowId,
|
|
462
|
-
ContentType: 'text/plain',
|
|
463
|
-
}));
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Update combined runMode+state-to-id index.
|
|
467
|
-
*/
|
|
468
|
-
async updateRunModeStateIndex(flowId, runMode, state) {
|
|
469
|
-
const indexKey = `${FlowsPersistenceAwsS3.RUN_MODE_STATE_INDEX_PREFIX}${runMode}_${state}/${flowId}`;
|
|
470
|
-
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
471
|
-
Bucket: this.bucketName,
|
|
472
|
-
Key: indexKey,
|
|
473
|
-
Body: flowId,
|
|
474
|
-
ContentType: 'text/plain',
|
|
475
|
-
}));
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
exports.FlowsPersistenceAwsS3 = FlowsPersistenceAwsS3;
|
|
479
|
-
FlowsPersistenceAwsS3.NAME_INDEX_PREFIX = '_name-index/';
|
|
480
|
-
FlowsPersistenceAwsS3.RUN_MODE_INDEX_PREFIX = '_run-mode-index/';
|
|
481
|
-
FlowsPersistenceAwsS3.STATE_INDEX_PREFIX = '_state-index/';
|
|
482
|
-
FlowsPersistenceAwsS3.RUN_MODE_STATE_INDEX_PREFIX = '_run-mode-state-index/';
|
|
483
|
-
FlowsPersistenceAwsS3.METADATA_FILENAME = 'metadata.json';
|
|
484
|
-
FlowsPersistenceAwsS3.BROWSER_STATE_FILENAME = 'browserstate.json';
|
|
485
|
-
FlowsPersistenceAwsS3.TOOL_CALL_FILENAME_SUFFIX = '.tool-call.json';
|
|
486
|
-
FlowsPersistenceAwsS3.VIDEO_FILENAME = 'video.webm';
|
|
487
|
-
//# sourceMappingURL=FlowsPersistenceAwsS3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsPersistenceAwsS3.js","sourceRoot":"","sources":["../../../src/persistence/flows/FlowsPersistenceAwsS3.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { type BrowserStorageState } from '../../models/BrowserStorageState';
|
|
2
|
-
import type { FlowMetadata, FlowsQuery } from '../../models/FlowMetadata';
|
|
3
|
-
import type { PaginatedResult } from '../../models/PaginatedResult';
|
|
4
|
-
import type { ToolCall } from '../../models/ToolCall';
|
|
5
|
-
import type { VideoSegment } from '../../models/VideoSegment';
|
|
6
|
-
import type { FlowsPersistence } from './FlowsPersistence';
|
|
7
|
-
/**
|
|
8
|
-
* A persistence implementation that uses Google Cloud Storage.
|
|
9
|
-
*
|
|
10
|
-
* If you are running locally, be sure to have the Google Cloud CLI installed
|
|
11
|
-
* so that you can authenticate using `gcloud auth application-default login`
|
|
12
|
-
* before running Donobu.
|
|
13
|
-
*
|
|
14
|
-
* If Donobu is being run in the Google cloud, be sure that the service account
|
|
15
|
-
* in which it is being run has permissions to read and write the Google Cloud
|
|
16
|
-
* Storage bucket specified as a constructor argument.
|
|
17
|
-
*/
|
|
18
|
-
export declare class FlowsPersistenceGoogleCloudStorage implements FlowsPersistence {
|
|
19
|
-
private readonly bucket;
|
|
20
|
-
private static readonly NAME_INDEX_PREFIX;
|
|
21
|
-
private static readonly RUN_MODE_INDEX_PREFIX;
|
|
22
|
-
private static readonly STATE_INDEX_PREFIX;
|
|
23
|
-
private static readonly RUN_MODE_STATE_INDEX_PREFIX;
|
|
24
|
-
private static readonly METADATA_FILENAME;
|
|
25
|
-
private static readonly BROWSER_STATE_FILENAME;
|
|
26
|
-
private static readonly TOOL_CALL_FILENAME_SUFFIX;
|
|
27
|
-
private static readonly VIDEO_FILENAME;
|
|
28
|
-
/**
|
|
29
|
-
* Dynamically imports the Google Cloud Storage library.
|
|
30
|
-
* This helps to delay loading the library until it's actually needed.
|
|
31
|
-
*/
|
|
32
|
-
private static importGoogleCloudStorage;
|
|
33
|
-
static create(bucketName: string): Promise<FlowsPersistenceGoogleCloudStorage>;
|
|
34
|
-
private constructor();
|
|
35
|
-
setFlowMetadata(flowMetadata: FlowMetadata): Promise<void>;
|
|
36
|
-
getFlowMetadataById(flowId: string): Promise<FlowMetadata>;
|
|
37
|
-
getFlowMetadataByName(flowName: string): Promise<FlowMetadata>;
|
|
38
|
-
getFlowsMetadata(query: FlowsQuery): Promise<PaginatedResult<FlowMetadata>>;
|
|
39
|
-
saveScreenShot(flowId: string, bytes: Buffer): Promise<string>;
|
|
40
|
-
getScreenShot(flowId: string, screenShotId: string): Promise<Buffer | null>;
|
|
41
|
-
setToolCall(flowId: string, toolCall: ToolCall): Promise<void>;
|
|
42
|
-
getToolCalls(flowId: string): Promise<ToolCall[]>;
|
|
43
|
-
deleteToolCall(flowId: string, toolCallId: string): Promise<void>;
|
|
44
|
-
setVideo(flowId: string, bytes: Buffer): Promise<void>;
|
|
45
|
-
getVideoSegment(flowId: string, startOffset: number, length: number): Promise<VideoSegment | null>;
|
|
46
|
-
getFlowFile(flowId: string, fileId: string): Promise<Buffer | null>;
|
|
47
|
-
setFlowFile(flowId: string, fileId: string, fileBytes: Buffer): Promise<void>;
|
|
48
|
-
setBrowserState(flowId: string, browserState: BrowserStorageState): Promise<void>;
|
|
49
|
-
getBrowserState(flowId: string): Promise<BrowserStorageState | null>;
|
|
50
|
-
deleteFlow(flowId: string): Promise<void>;
|
|
51
|
-
private uploadString;
|
|
52
|
-
private uploadBytes;
|
|
53
|
-
private downloadString;
|
|
54
|
-
/**
|
|
55
|
-
* Update name-to-id index.
|
|
56
|
-
*/
|
|
57
|
-
private updateNameIndex;
|
|
58
|
-
/**
|
|
59
|
-
* Update runMode-to-id index.
|
|
60
|
-
*/
|
|
61
|
-
private updateRunModeIndex;
|
|
62
|
-
/**
|
|
63
|
-
* Update state-to-id index.
|
|
64
|
-
*/
|
|
65
|
-
private updateStateIndex;
|
|
66
|
-
/**
|
|
67
|
-
* Update combined runMode+state-to-id index.
|
|
68
|
-
*/
|
|
69
|
-
private updateRunModeStateIndex;
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=FlowsPersistenceGoogleCloudStorage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlowsPersistenceGoogleCloudStorage.d.ts","sourceRoot":"","sources":["../../../src/persistence/flows/FlowsPersistenceGoogleCloudStorage.ts"],"names":[],"mappings":"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"}
|