@devrev/airsync-sdk 2.0.0-beta.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/README.md +31 -0
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +16 -0
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -0
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +9 -0
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -0
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.js +2 -0
- package/dist/attachments-streaming/attachments-streaming-pool.js +97 -0
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +2 -0
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +1 -0
- package/dist/attachments-streaming/attachments-streaming-pool.test.js +267 -0
- package/dist/common/constants.d.ts +25 -0
- package/dist/common/constants.d.ts.map +1 -0
- package/dist/common/constants.js +58 -0
- package/dist/common/control-protocol.d.ts +10 -0
- package/dist/common/control-protocol.d.ts.map +1 -0
- package/dist/common/control-protocol.js +31 -0
- package/dist/common/errors.d.ts +6 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +4 -0
- package/dist/common/event-type-translation.d.ts +24 -0
- package/dist/common/event-type-translation.d.ts.map +1 -0
- package/dist/common/event-type-translation.js +117 -0
- package/dist/common/helpers.d.ts +41 -0
- package/dist/common/helpers.d.ts.map +1 -0
- package/dist/common/helpers.js +124 -0
- package/dist/common/install-initial-domain-mapping.d.ts +4 -0
- package/dist/common/install-initial-domain-mapping.d.ts.map +1 -0
- package/dist/common/install-initial-domain-mapping.js +58 -0
- package/dist/common/install-initial-domain-mapping.test.d.ts +2 -0
- package/dist/common/install-initial-domain-mapping.test.d.ts.map +1 -0
- package/dist/common/install-initial-domain-mapping.test.js +207 -0
- package/dist/deprecated/adapter/index.d.ts +62 -0
- package/dist/deprecated/adapter/index.d.ts.map +1 -0
- package/dist/deprecated/adapter/index.js +151 -0
- package/dist/deprecated/common/helpers.d.ts +7 -0
- package/dist/deprecated/common/helpers.d.ts.map +1 -0
- package/dist/deprecated/common/helpers.js +47 -0
- package/dist/deprecated/demo-extractor/external_domain_metadata.json +38 -0
- package/dist/deprecated/demo-extractor/index.d.ts +18 -0
- package/dist/deprecated/demo-extractor/index.d.ts.map +1 -0
- package/dist/deprecated/demo-extractor/index.js +161 -0
- package/dist/deprecated/http/client.d.ts +22 -0
- package/dist/deprecated/http/client.d.ts.map +1 -0
- package/dist/deprecated/http/client.js +161 -0
- package/dist/deprecated/uploader/index.d.ts +35 -0
- package/dist/deprecated/uploader/index.d.ts.map +1 -0
- package/dist/deprecated/uploader/index.js +161 -0
- package/dist/http/axios-client-internal.d.ts +3 -0
- package/dist/http/axios-client-internal.d.ts.map +1 -0
- package/dist/http/axios-client-internal.js +66 -0
- package/dist/http/axios-client-internal.test.d.ts +2 -0
- package/dist/http/axios-client-internal.test.d.ts.map +1 -0
- package/dist/http/axios-client-internal.test.js +154 -0
- package/dist/http/axios-client.d.ts +27 -0
- package/dist/http/axios-client.d.ts.map +1 -0
- package/dist/http/axios-client.js +57 -0
- package/dist/http/constants.d.ts +4 -0
- package/dist/http/constants.d.ts.map +1 -0
- package/dist/http/constants.js +6 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +18 -0
- package/dist/http/types.d.ts +17 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +2 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/logger/logger.constants.d.ts +6 -0
- package/dist/logger/logger.constants.d.ts.map +1 -0
- package/dist/logger/logger.constants.js +13 -0
- package/dist/logger/logger.context.d.ts +58 -0
- package/dist/logger/logger.context.d.ts.map +1 -0
- package/dist/logger/logger.context.js +86 -0
- package/dist/logger/logger.d.ts +89 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.interfaces.d.ts +43 -0
- package/dist/logger/logger.interfaces.d.ts.map +1 -0
- package/dist/logger/logger.interfaces.js +9 -0
- package/dist/logger/logger.js +196 -0
- package/dist/logger/logger.test.d.ts +2 -0
- package/dist/logger/logger.test.d.ts.map +1 -0
- package/dist/logger/logger.test.js +490 -0
- package/dist/mappers/mappers.d.ts +52 -0
- package/dist/mappers/mappers.d.ts.map +1 -0
- package/dist/mappers/mappers.interface.d.ts +294 -0
- package/dist/mappers/mappers.interface.d.ts.map +1 -0
- package/dist/mappers/mappers.interface.js +48 -0
- package/dist/mappers/mappers.js +83 -0
- package/dist/mappers/mappers.test.d.ts +2 -0
- package/dist/mappers/mappers.test.d.ts.map +1 -0
- package/dist/mappers/mappers.test.js +107 -0
- package/dist/multithreading/create-worker.d.ts +5 -0
- package/dist/multithreading/create-worker.d.ts.map +1 -0
- package/dist/multithreading/create-worker.js +28 -0
- package/dist/multithreading/create-worker.test.d.ts +2 -0
- package/dist/multithreading/create-worker.test.d.ts.map +1 -0
- package/dist/multithreading/create-worker.test.js +89 -0
- package/dist/multithreading/process-task.d.ts +3 -0
- package/dist/multithreading/process-task.d.ts.map +1 -0
- package/dist/multithreading/process-task.js +58 -0
- package/dist/multithreading/spawn/spawn.d.ts +30 -0
- package/dist/multithreading/spawn/spawn.d.ts.map +1 -0
- package/dist/multithreading/spawn/spawn.helpers.d.ts +21 -0
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -0
- package/dist/multithreading/spawn/spawn.helpers.js +114 -0
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts +2 -0
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +1 -0
- package/dist/multithreading/spawn/spawn.helpers.test.js +293 -0
- package/dist/multithreading/spawn/spawn.js +249 -0
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +127 -0
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts +91 -0
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts +22 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.js +64 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.js +514 -0
- package/dist/multithreading/worker-adapter/worker-adapter.js +747 -0
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.test.js +483 -0
- package/dist/multithreading/worker.d.ts +2 -0
- package/dist/multithreading/worker.d.ts.map +1 -0
- package/dist/multithreading/worker.js +9 -0
- package/dist/repo/repo.d.ts +18 -0
- package/dist/repo/repo.d.ts.map +1 -0
- package/dist/repo/repo.interfaces.d.ts +46 -0
- package/dist/repo/repo.interfaces.d.ts.map +1 -0
- package/dist/repo/repo.interfaces.js +2 -0
- package/dist/repo/repo.js +75 -0
- package/dist/repo/repo.test.d.ts +2 -0
- package/dist/repo/repo.test.d.ts.map +1 -0
- package/dist/repo/repo.test.js +131 -0
- package/dist/state/state.d.ts +30 -0
- package/dist/state/state.d.ts.map +1 -0
- package/dist/state/state.interfaces.d.ts +51 -0
- package/dist/state/state.interfaces.d.ts.map +1 -0
- package/dist/state/state.interfaces.js +21 -0
- package/dist/state/state.js +166 -0
- package/dist/state/state.test.d.ts +2 -0
- package/dist/state/state.test.d.ts.map +1 -0
- package/dist/state/state.test.js +224 -0
- package/dist/types/common.d.ts +50 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +25 -0
- package/dist/types/extraction.d.ts +417 -0
- package/dist/types/extraction.d.ts.map +1 -0
- package/dist/types/extraction.js +170 -0
- package/dist/types/extraction.test.d.ts +2 -0
- package/dist/types/extraction.test.d.ts.map +1 -0
- package/dist/types/extraction.test.js +70 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/loading.d.ts +147 -0
- package/dist/types/loading.d.ts.map +1 -0
- package/dist/types/loading.js +48 -0
- package/dist/types/workers.d.ts +161 -0
- package/dist/types/workers.d.ts.map +1 -0
- package/dist/types/workers.js +22 -0
- package/dist/uploader/uploader.d.ts +92 -0
- package/dist/uploader/uploader.d.ts.map +1 -0
- package/dist/uploader/uploader.helpers.d.ts +33 -0
- package/dist/uploader/uploader.helpers.d.ts.map +1 -0
- package/dist/uploader/uploader.helpers.js +139 -0
- package/dist/uploader/uploader.helpers.test.d.ts +2 -0
- package/dist/uploader/uploader.helpers.test.d.ts.map +1 -0
- package/dist/uploader/uploader.helpers.test.js +267 -0
- package/dist/uploader/uploader.interfaces.d.ts +95 -0
- package/dist/uploader/uploader.interfaces.d.ts.map +1 -0
- package/dist/uploader/uploader.interfaces.js +2 -0
- package/dist/uploader/uploader.js +305 -0
- package/dist/uploader/uploader.test.d.ts +2 -0
- package/dist/uploader/uploader.test.d.ts.map +1 -0
- package/dist/uploader/uploader.test.js +589 -0
- package/package.json +60 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Uploader = void 0;
|
|
7
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
8
|
+
const js_jsonl_1 = require("js-jsonl");
|
|
9
|
+
const axios_client_internal_1 = require("../http/axios-client-internal");
|
|
10
|
+
const constants_1 = require("../common/constants");
|
|
11
|
+
const logger_1 = require("../logger/logger");
|
|
12
|
+
const uploader_helpers_1 = require("./uploader.helpers");
|
|
13
|
+
class Uploader {
|
|
14
|
+
constructor({ event, options }) {
|
|
15
|
+
this.devrevApiEndpoint = event.execution_metadata.devrev_endpoint;
|
|
16
|
+
this.devrevApiToken = event.context.secrets.service_account_token;
|
|
17
|
+
this.requestId = event.payload.event_context.request_id;
|
|
18
|
+
this.isLocalDevelopment = options === null || options === void 0 ? void 0 : options.isLocalDevelopment;
|
|
19
|
+
this.defaultHeaders = {
|
|
20
|
+
Authorization: `Bearer ${this.devrevApiToken}`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Uploads the fetched objects to the DevRev platform. Fetched objects are compressed to a gzipped jsonl object and uploaded to the platform.
|
|
25
|
+
* @param {string} itemType - The type of the item to be uploaded
|
|
26
|
+
* @param {object[] | object} fetchedObjects - The objects to be uploaded
|
|
27
|
+
* @returns {Promise<UploadResponse>} - The response object containing the artifact information or error information if there was an error
|
|
28
|
+
*/
|
|
29
|
+
async upload(itemType, fetchedObjects) {
|
|
30
|
+
if (this.isLocalDevelopment) {
|
|
31
|
+
await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects);
|
|
32
|
+
}
|
|
33
|
+
// Compress the fetched objects to a gzipped jsonl object
|
|
34
|
+
const { response: file, error: fileError } = (0, uploader_helpers_1.compressGzip)(js_jsonl_1.jsonl.stringify(fetchedObjects));
|
|
35
|
+
if (fileError) {
|
|
36
|
+
return {
|
|
37
|
+
error: new Error('Error while compressing jsonl object. ' + (0, logger_1.serializeError)(fileError)),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const filename = itemType + '.jsonl.gz';
|
|
41
|
+
const fileType = 'application/x-gzip';
|
|
42
|
+
// Get upload url
|
|
43
|
+
const { error: preparedArtifactError, response: preparedArtifact } = await this.getArtifactUploadUrl(filename, fileType);
|
|
44
|
+
if (preparedArtifactError) {
|
|
45
|
+
return {
|
|
46
|
+
error: new Error('Error while getting artifact upload URL.'),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Upload prepared artifact to the given url
|
|
50
|
+
const { error: uploadItemError } = await this.uploadArtifact(preparedArtifact, file);
|
|
51
|
+
if (uploadItemError) {
|
|
52
|
+
return {
|
|
53
|
+
error: new Error('Error while uploading artifact.'),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Confirm upload
|
|
57
|
+
const { error: confirmArtifactUploadError } = await this.confirmArtifactUpload(preparedArtifact.artifact_id);
|
|
58
|
+
if (confirmArtifactUploadError) {
|
|
59
|
+
return {
|
|
60
|
+
error: new Error('Error while confirming artifact upload. ' +
|
|
61
|
+
JSON.stringify(confirmArtifactUploadError)),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Return the artifact information to the platform
|
|
65
|
+
const artifact = {
|
|
66
|
+
id: preparedArtifact.artifact_id,
|
|
67
|
+
item_type: itemType,
|
|
68
|
+
item_count: Array.isArray(fetchedObjects) ? fetchedObjects.length : 1,
|
|
69
|
+
};
|
|
70
|
+
return { artifact };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Gets the upload URL for an artifact from the DevRev API.
|
|
74
|
+
* @param {string} filename - The name of the file to upload
|
|
75
|
+
* @param {string} fileType - The MIME type of the file
|
|
76
|
+
* @param {number} [fileSize] - Optional file size in bytes
|
|
77
|
+
* @returns {Promise<ArtifactToUpload | void>} The artifact upload information or undefined on error
|
|
78
|
+
*/
|
|
79
|
+
async getArtifactUploadUrl(filename, fileType, fileSize) {
|
|
80
|
+
const url = `${this.devrevApiEndpoint}/internal/airdrop.artifacts.upload-url`;
|
|
81
|
+
try {
|
|
82
|
+
const response = await axios_client_internal_1.axiosClient.get(url, {
|
|
83
|
+
headers: Object.assign({}, this.defaultHeaders),
|
|
84
|
+
params: {
|
|
85
|
+
request_id: this.requestId,
|
|
86
|
+
file_type: fileType,
|
|
87
|
+
file_name: (0, uploader_helpers_1.truncateFilename)(filename),
|
|
88
|
+
file_size: fileSize,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return { response: response.data };
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return { error };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Uploads an artifact file to the provided upload URL using multipart form data.
|
|
99
|
+
* @param {ArtifactToUpload} artifact - The artifact upload information containing upload URL and form data
|
|
100
|
+
* @param {Buffer} file - The file buffer to upload
|
|
101
|
+
* @returns {Promise<AxiosResponse | void>} The axios response or undefined on error
|
|
102
|
+
*/
|
|
103
|
+
async uploadArtifact(artifact, file) {
|
|
104
|
+
const formData = new form_data_1.default();
|
|
105
|
+
for (const field in artifact.form_data) {
|
|
106
|
+
formData.append(field, artifact.form_data[field]);
|
|
107
|
+
}
|
|
108
|
+
formData.append('file', file);
|
|
109
|
+
try {
|
|
110
|
+
const response = await axios_client_internal_1.axiosClient.post(artifact.upload_url, formData, {
|
|
111
|
+
headers: Object.assign({}, formData.getHeaders()),
|
|
112
|
+
});
|
|
113
|
+
return { response };
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return { error };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Streams an artifact file from an axios response to the upload URL.
|
|
121
|
+
* @param {ArtifactToUpload} artifact - The artifact upload information containing upload URL and form data
|
|
122
|
+
* @param {AxiosResponse} fileStream - The axios response stream containing the file data
|
|
123
|
+
* @returns {Promise<AxiosResponse | void>} The axios response or undefined on error
|
|
124
|
+
*/
|
|
125
|
+
async streamArtifact(artifact, fileStream) {
|
|
126
|
+
const formData = new form_data_1.default();
|
|
127
|
+
for (const field in artifact.form_data) {
|
|
128
|
+
formData.append(field, artifact.form_data[field]);
|
|
129
|
+
}
|
|
130
|
+
formData.append('file', fileStream.data);
|
|
131
|
+
try {
|
|
132
|
+
const response = await axios_client_internal_1.axiosClient.post(artifact.upload_url, formData, {
|
|
133
|
+
headers: Object.assign(Object.assign({}, formData.getHeaders()), (!fileStream.headers['content-length']
|
|
134
|
+
? {
|
|
135
|
+
'Content-Length': constants_1.MAX_DEVREV_ARTIFACT_SIZE,
|
|
136
|
+
}
|
|
137
|
+
: {})),
|
|
138
|
+
// Prevents buffering of the response in the memory
|
|
139
|
+
maxRedirects: 0,
|
|
140
|
+
// Allow 2xx and 3xx (redirects) to be considered successful, 4xx and 5xx will throw errors and be caught in the catch block
|
|
141
|
+
validateStatus: (status) => status >= 200 && status < 400,
|
|
142
|
+
});
|
|
143
|
+
this.destroyStream(fileStream);
|
|
144
|
+
return { response };
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.destroyStream(fileStream);
|
|
148
|
+
return { error };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Confirms that an artifact upload has been completed successfully.
|
|
153
|
+
* @param {string} artifactId - The ID of the artifact to confirm
|
|
154
|
+
* @returns {Promise<AxiosResponse | void>} The axios response or undefined on error
|
|
155
|
+
*/
|
|
156
|
+
async confirmArtifactUpload(artifactId) {
|
|
157
|
+
const url = `${this.devrevApiEndpoint}/internal/airdrop.artifacts.confirm-upload`;
|
|
158
|
+
try {
|
|
159
|
+
const response = await axios_client_internal_1.axiosClient.post(url, {
|
|
160
|
+
request_id: this.requestId,
|
|
161
|
+
artifact_id: artifactId,
|
|
162
|
+
}, {
|
|
163
|
+
headers: Object.assign({}, this.defaultHeaders),
|
|
164
|
+
});
|
|
165
|
+
// If response exists and the status is 2xx, return the response
|
|
166
|
+
if ((response === null || response === void 0 ? void 0 : response.status) >= 200 && (response === null || response === void 0 ? void 0 : response.status) < 300) {
|
|
167
|
+
return { response };
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
return {
|
|
171
|
+
error: new Error('Error while confirming artifact upload. ' +
|
|
172
|
+
JSON.stringify(response)),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return { error: (0, logger_1.serializeError)(error) };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Destroys a stream to prevent resource leaks.
|
|
182
|
+
* @param {any} fileStream - The axios response stream to destroy
|
|
183
|
+
*/
|
|
184
|
+
destroyStream(fileStream) {
|
|
185
|
+
try {
|
|
186
|
+
if (fileStream && fileStream.data) {
|
|
187
|
+
// For axios response streams, the data property contains the actual stream
|
|
188
|
+
if (typeof fileStream.data.destroy === 'function') {
|
|
189
|
+
fileStream.data.destroy();
|
|
190
|
+
}
|
|
191
|
+
else if (typeof fileStream.data.close === 'function') {
|
|
192
|
+
fileStream.data.close();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.warn('Error while destroying stream:', (0, logger_1.serializeError)(error));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Retrieves attachment metadata from an artifact by downloading and parsing it.
|
|
202
|
+
* @param {object} param0 - Configuration object
|
|
203
|
+
* @param {string} param0.artifact - The artifact ID to download attachments from
|
|
204
|
+
* @returns {Promise<{attachments?: NormalizedAttachment[], error?: {message: string}}>} The attachments array or error object
|
|
205
|
+
*/
|
|
206
|
+
async getAttachmentsFromArtifactId({ artifact, }) {
|
|
207
|
+
// Get the URL of the attachments metadata artifact
|
|
208
|
+
const { response: artifactUrl, error: artifactUrlError } = await this.getArtifactDownloadUrl(artifact);
|
|
209
|
+
if (artifactUrlError) {
|
|
210
|
+
return {
|
|
211
|
+
error: new Error('Error while getting artifact download URL. ' +
|
|
212
|
+
(0, logger_1.serializeError)(artifactUrlError)),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Download artifact from the URL
|
|
216
|
+
const { response: gzippedJsonlObject, error: gzippedJsonlObjectError } = await this.downloadArtifact(artifactUrl);
|
|
217
|
+
if (gzippedJsonlObjectError) {
|
|
218
|
+
return {
|
|
219
|
+
error: new Error('Error while downloading gzipped jsonl object.' +
|
|
220
|
+
(0, logger_1.serializeError)(gzippedJsonlObjectError)),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
// Decompress the gzipped jsonl object
|
|
224
|
+
const { response: jsonlObject, error: jsonlObjectError } = (0, uploader_helpers_1.decompressGzip)(gzippedJsonlObject);
|
|
225
|
+
if (jsonlObjectError) {
|
|
226
|
+
return {
|
|
227
|
+
error: new Error('Error while decompressing gzipped jsonl object.' +
|
|
228
|
+
(0, logger_1.serializeError)(jsonlObjectError)),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// Parse the jsonl object to get the attachment metadata
|
|
232
|
+
const { response: jsonObject, error: jsonObjectError } = (0, uploader_helpers_1.parseJsonl)(jsonlObject);
|
|
233
|
+
if (jsonObjectError) {
|
|
234
|
+
return {
|
|
235
|
+
error: new Error('Error while parsing jsonl object.' + (0, logger_1.serializeError)(jsonObjectError)),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
return { attachments: jsonObject };
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Gets the download URL for an artifact from the DevRev API.
|
|
242
|
+
* @param {string} artifactId - The ID of the artifact to download
|
|
243
|
+
* @returns {Promise<string | void>} The download URL or undefined on error
|
|
244
|
+
*/
|
|
245
|
+
async getArtifactDownloadUrl(artifactId) {
|
|
246
|
+
const url = `${this.devrevApiEndpoint}/internal/airdrop.artifacts.download-url`;
|
|
247
|
+
try {
|
|
248
|
+
const response = await axios_client_internal_1.axiosClient.get(url, {
|
|
249
|
+
headers: Object.assign({}, this.defaultHeaders),
|
|
250
|
+
params: {
|
|
251
|
+
request_id: this.requestId,
|
|
252
|
+
artifact_id: artifactId,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
return { response: response.data.download_url };
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
return { error };
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Downloads an artifact file from the given URL.
|
|
263
|
+
* @param {string} artifactUrl - The URL to download the artifact from
|
|
264
|
+
* @returns {Promise<Buffer | void>} The artifact file buffer or undefined on error
|
|
265
|
+
*/
|
|
266
|
+
async downloadArtifact(artifactUrl) {
|
|
267
|
+
try {
|
|
268
|
+
const response = await axios_client_internal_1.axiosClient.get(artifactUrl, {
|
|
269
|
+
responseType: 'arraybuffer',
|
|
270
|
+
});
|
|
271
|
+
return { response: response.data };
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
return { error };
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Retrieves and parses JSON objects from an artifact by artifact ID.
|
|
279
|
+
* @param {object} param0 - Configuration object
|
|
280
|
+
* @param {string} param0.artifactId - The artifact ID to download and parse
|
|
281
|
+
* @param {boolean} [param0.isGzipped=false] - Whether the artifact is gzipped
|
|
282
|
+
* @returns {Promise<object[] | object | void>} The parsed JSON objects or undefined on error
|
|
283
|
+
*/
|
|
284
|
+
async getJsonObjectByArtifactId({ artifactId, isGzipped = false, }) {
|
|
285
|
+
const { response: artifactUrl, error: artifactUrlError } = await this.getArtifactDownloadUrl(artifactId);
|
|
286
|
+
if (artifactUrlError) {
|
|
287
|
+
return { error: artifactUrlError };
|
|
288
|
+
}
|
|
289
|
+
const { response: artifact, error: artifactError } = await this.downloadArtifact(artifactUrl);
|
|
290
|
+
if (artifactError) {
|
|
291
|
+
return { error: artifactError };
|
|
292
|
+
}
|
|
293
|
+
if (isGzipped) {
|
|
294
|
+
const { response: decompressedArtifact, error: decompressedArtifactError, } = (0, uploader_helpers_1.decompressGzip)(artifact);
|
|
295
|
+
if (decompressedArtifactError) {
|
|
296
|
+
return { error: decompressedArtifactError };
|
|
297
|
+
}
|
|
298
|
+
const jsonlObject = Buffer.from(decompressedArtifact).toString('utf-8');
|
|
299
|
+
return { response: js_jsonl_1.jsonl.parse(jsonlObject) };
|
|
300
|
+
}
|
|
301
|
+
const jsonlObject = Buffer.from(artifact).toString('utf-8');
|
|
302
|
+
return { response: js_jsonl_1.jsonl.parse(jsonlObject) };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exports.Uploader = Uploader;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.test.d.ts","sourceRoot":"","sources":["../../src/uploader/uploader.test.ts"],"names":[],"mappings":""}
|