@empiricalrun/r2-uploader 0.4.0 → 0.6.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/CHANGELOG.md +12 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/upload/stream.d.ts.map +1 -1
- package/dist/upload/stream.js +23 -27
- package/dist/upload-task.d.ts +21 -0
- package/dist/upload-task.d.ts.map +1 -0
- package/dist/upload-task.js +48 -0
- package/package.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @empiricalrun/r2-uploader
|
|
2
2
|
|
|
3
|
+
## 0.6.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 79a4e0f: feat: add blob reporters for sharding
|
|
8
|
+
|
|
9
|
+
## 0.5.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- a94a7f7: fix: resolve multipart upload retry failures
|
|
14
|
+
|
|
3
15
|
## 0.4.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,6 @@ export { fetchFiles } from "./fetch";
|
|
|
2
2
|
export { sendTaskToQueue, waitForTaskQueueToFinish } from "./queue";
|
|
3
3
|
export type { AsyncTask, FileMap } from "./types";
|
|
4
4
|
export { uploadDirectory, uploadInMemoryFiles } from "./upload";
|
|
5
|
+
export type { CreateUploadTaskOptions } from "./upload-task";
|
|
6
|
+
export { createUploadTask } from "./upload-task";
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,YAAY,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.uploadInMemoryFiles = exports.uploadDirectory = exports.waitForTaskQueueToFinish = exports.sendTaskToQueue = exports.fetchFiles = void 0;
|
|
3
|
+
exports.createUploadTask = exports.uploadInMemoryFiles = exports.uploadDirectory = exports.waitForTaskQueueToFinish = exports.sendTaskToQueue = exports.fetchFiles = void 0;
|
|
4
4
|
var fetch_1 = require("./fetch");
|
|
5
5
|
Object.defineProperty(exports, "fetchFiles", { enumerable: true, get: function () { return fetch_1.fetchFiles; } });
|
|
6
6
|
var queue_1 = require("./queue");
|
|
@@ -9,3 +9,5 @@ Object.defineProperty(exports, "waitForTaskQueueToFinish", { enumerable: true, g
|
|
|
9
9
|
var upload_1 = require("./upload");
|
|
10
10
|
Object.defineProperty(exports, "uploadDirectory", { enumerable: true, get: function () { return upload_1.uploadDirectory; } });
|
|
11
11
|
Object.defineProperty(exports, "uploadInMemoryFiles", { enumerable: true, get: function () { return upload_1.uploadInMemoryFiles; } });
|
|
12
|
+
var upload_task_1 = require("./upload-task");
|
|
13
|
+
Object.defineProperty(exports, "createUploadTask", { enumerable: true, get: function () { return upload_task_1.createUploadTask; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/upload/stream.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEzD,eAAO,MAAM,iBAAiB,GAAU,QAAQ,oBAAoB,
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/upload/stream.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEzD,eAAO,MAAM,iBAAiB,GAAU,QAAQ,oBAAoB,qBA0GnE,CAAC"}
|
package/dist/upload/stream.js
CHANGED
|
@@ -42,34 +42,30 @@ const uploadFileStreams = async (config) => {
|
|
|
42
42
|
let partNumber = 1;
|
|
43
43
|
const parts = [];
|
|
44
44
|
for await (const chunk of fileStream) {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
await (0, async_retry_1.default)(async () => {
|
|
55
|
-
const { ETag } = await S3.send(uploadPartCommand);
|
|
56
|
-
logger_1.logger.debug("upload part command sent successfully for file", file.fullPath);
|
|
57
|
-
parts.push({ ETag: ETag, PartNumber: partNumber });
|
|
58
|
-
partNumber++;
|
|
59
|
-
}, {
|
|
60
|
-
retries: 5,
|
|
61
|
-
factor: 3,
|
|
62
|
-
minTimeout: 1_000,
|
|
63
|
-
maxTimeout: 60_000,
|
|
64
|
-
randomize: true,
|
|
65
|
-
onRetry: (err, i) => {
|
|
66
|
-
logger_1.logger.debug("Upload part retry attempt:", i, ":", file.fullPath);
|
|
67
|
-
},
|
|
45
|
+
const currentPartNumber = partNumber;
|
|
46
|
+
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
47
|
+
const { ETag } = await (0, async_retry_1.default)(async () => {
|
|
48
|
+
const uploadPartCommand = new client_s3_1.UploadPartCommand({
|
|
49
|
+
Bucket: config.bucket,
|
|
50
|
+
Key: fileKey,
|
|
51
|
+
PartNumber: currentPartNumber,
|
|
52
|
+
UploadId,
|
|
53
|
+
Body: chunkBuffer,
|
|
68
54
|
});
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
55
|
+
return await S3.send(uploadPartCommand);
|
|
56
|
+
}, {
|
|
57
|
+
retries: 5,
|
|
58
|
+
factor: 3,
|
|
59
|
+
minTimeout: 1_000,
|
|
60
|
+
maxTimeout: 60_000,
|
|
61
|
+
randomize: true,
|
|
62
|
+
onRetry: (err, i) => {
|
|
63
|
+
logger_1.logger.debug("Upload part retry attempt:", i, ":", file.fullPath);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
logger_1.logger.debug("upload part command sent successfully for file", file.fullPath);
|
|
67
|
+
parts.push({ ETag: ETag, PartNumber: currentPartNumber });
|
|
68
|
+
partNumber++;
|
|
73
69
|
}
|
|
74
70
|
const completeMultipartUploadParams = {
|
|
75
71
|
Bucket: config.bucket,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AsyncTask } from "./types";
|
|
2
|
+
export interface CreateUploadTaskOptions {
|
|
3
|
+
sourceDir: string;
|
|
4
|
+
fileList?: string[];
|
|
5
|
+
destinationDir: string;
|
|
6
|
+
uploadBucket: string;
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates an async task for uploading files to R2 storage.
|
|
11
|
+
*
|
|
12
|
+
* @param {Object} params - The upload parameters
|
|
13
|
+
* @param {string} params.sourceDir - The source directory containing files to upload
|
|
14
|
+
* @param {string[]} [params.fileList] - Optional list of specific files to upload
|
|
15
|
+
* @param {string} params.destinationDir - The destination directory in R2 storage
|
|
16
|
+
* @param {string} params.uploadBucket - The R2 bucket to upload to
|
|
17
|
+
* @param {string} params.baseUrl - The base URL for generating file URLs
|
|
18
|
+
* @returns {AsyncTask} An async task that when executed will upload the files and return a map of file paths to URLs
|
|
19
|
+
*/
|
|
20
|
+
export declare function createUploadTask({ sourceDir, fileList, destinationDir, uploadBucket, baseUrl, }: CreateUploadTaskOptions): AsyncTask;
|
|
21
|
+
//# sourceMappingURL=upload-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-task.d.ts","sourceRoot":"","sources":["../src/upload-task.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAW,MAAM,SAAS,CAAC;AAG7C,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,OAAO,GACR,EAAE,uBAAuB,GAAG,SAAS,CA4BrC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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.createUploadTask = createUploadTask;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const logger_1 = require("./logger");
|
|
9
|
+
const upload_1 = require("./upload");
|
|
10
|
+
/**
|
|
11
|
+
* Creates an async task for uploading files to R2 storage.
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} params - The upload parameters
|
|
14
|
+
* @param {string} params.sourceDir - The source directory containing files to upload
|
|
15
|
+
* @param {string[]} [params.fileList] - Optional list of specific files to upload
|
|
16
|
+
* @param {string} params.destinationDir - The destination directory in R2 storage
|
|
17
|
+
* @param {string} params.uploadBucket - The R2 bucket to upload to
|
|
18
|
+
* @param {string} params.baseUrl - The base URL for generating file URLs
|
|
19
|
+
* @returns {AsyncTask} An async task that when executed will upload the files and return a map of file paths to URLs
|
|
20
|
+
*/
|
|
21
|
+
function createUploadTask({ sourceDir, fileList, destinationDir, uploadBucket, baseUrl, }) {
|
|
22
|
+
return async () => {
|
|
23
|
+
if (!process.env.R2_ACCOUNT_ID ||
|
|
24
|
+
!process.env.R2_ACCESS_KEY_ID ||
|
|
25
|
+
!process.env.R2_SECRET_ACCESS_KEY) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const uploadedFiles = await (0, upload_1.uploadDirectory)({
|
|
30
|
+
sourceDir,
|
|
31
|
+
fileList,
|
|
32
|
+
destinationDir,
|
|
33
|
+
uploadBucket,
|
|
34
|
+
});
|
|
35
|
+
const urls = {};
|
|
36
|
+
Object.entries(uploadedFiles).forEach(([filePath]) => {
|
|
37
|
+
const fileUrl = new URL(path_1.default.join(destinationDir, filePath), baseUrl);
|
|
38
|
+
urls[filePath] = fileUrl.toString();
|
|
39
|
+
});
|
|
40
|
+
logger_1.logger.debug("Finished uploading files");
|
|
41
|
+
return urls;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logger_1.logger.error("Error uploading files", error);
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
package/package.json
CHANGED
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/delete.ts","./src/fetch.ts","./src/index.ts","./src/logger.ts","./src/queue.ts","./src/types.ts","./src/upload/buffer.ts","./src/upload/index.ts","./src/upload/stream.ts"],"version":"5.8.3"}
|
|
1
|
+
{"root":["./src/delete.ts","./src/fetch.ts","./src/index.ts","./src/logger.ts","./src/queue.ts","./src/types.ts","./src/upload-task.ts","./src/upload/buffer.ts","./src/upload/index.ts","./src/upload/stream.ts"],"version":"5.8.3"}
|