@dbos-inc/aws-s3-workflows 3.0.29-preview
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 +241 -0
- package/dbos-config.yaml +20 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/knexfile.d.ts +4 -0
- package/dist/knexfile.d.ts.map +1 -0
- package/dist/knexfile.js +19 -0
- package/dist/knexfile.js.map +1 -0
- package/dist/migrations/20240410.d.ts +4 -0
- package/dist/migrations/20240410.d.ts.map +1 -0
- package/dist/migrations/20240410.js +19 -0
- package/dist/migrations/20240410.js.map +1 -0
- package/dist/src/s3_utils.d.ts +57 -0
- package/dist/src/s3_utils.d.ts.map +1 -0
- package/dist/src/s3_utils.js +88 -0
- package/dist/src/s3_utils.js.map +1 -0
- package/dist/src/s3_utils.test.d.ts +25 -0
- package/dist/src/s3_utils.test.d.ts.map +1 -0
- package/dist/src/s3_utils.test.js +354 -0
- package/dist/src/s3_utils.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/index.ts +7 -0
- package/jest.config.js +8 -0
- package/knexfile.ts +21 -0
- package/migrations/20240410.ts +16 -0
- package/package.json +37 -0
- package/src/s3_utils.test.ts +350 -0
- package/src/s3_utils.ts +157 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
+
if (mod && mod.__esModule) return mod;
|
|
26
|
+
var result = {};
|
|
27
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
+
__setModuleDefault(result, mod);
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
32
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.deleteWF = exports.uploadPWF = exports.uploadWF = void 0;
|
|
39
|
+
const s3_utils_1 = require("./s3_utils");
|
|
40
|
+
const dbos_sdk_1 = require("@dbos-inc/dbos-sdk");
|
|
41
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
42
|
+
const s3_presigned_post_1 = require("@aws-sdk/s3-presigned-post");
|
|
43
|
+
const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
|
|
44
|
+
const form_data_1 = __importDefault(require("form-data"));
|
|
45
|
+
const axios_1 = __importDefault(require("axios"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const node_crypto_1 = require("node:crypto");
|
|
48
|
+
var FileStatus;
|
|
49
|
+
(function (FileStatus) {
|
|
50
|
+
FileStatus["PENDING"] = "Pending";
|
|
51
|
+
FileStatus["RECEIVED"] = "Received";
|
|
52
|
+
FileStatus["ACTIVE"] = "Active";
|
|
53
|
+
})(FileStatus || (FileStatus = {}));
|
|
54
|
+
class TestUserFileTable {
|
|
55
|
+
//////////
|
|
56
|
+
//// Database table
|
|
57
|
+
//////////
|
|
58
|
+
// Pick a file ID
|
|
59
|
+
static chooseFileRecord(details) {
|
|
60
|
+
const rec = {
|
|
61
|
+
user_id: details.user_id,
|
|
62
|
+
file_status: FileStatus.PENDING,
|
|
63
|
+
file_type: details.file_type,
|
|
64
|
+
file_id: (0, node_crypto_1.randomUUID)(),
|
|
65
|
+
file_name: details.file_name,
|
|
66
|
+
file_time: new Date().getTime(),
|
|
67
|
+
key: '',
|
|
68
|
+
};
|
|
69
|
+
rec.key = TestUserFileTable.createS3Key(rec);
|
|
70
|
+
return Promise.resolve(rec);
|
|
71
|
+
}
|
|
72
|
+
static createS3Key(rec) {
|
|
73
|
+
const key = `${rec.file_type}/${rec.user_id}/${rec.file_id}/${rec.file_time}`;
|
|
74
|
+
return key;
|
|
75
|
+
}
|
|
76
|
+
static toFileDetails(rec) {
|
|
77
|
+
return {
|
|
78
|
+
user_id: rec.user_id,
|
|
79
|
+
file_type: rec.file_type,
|
|
80
|
+
file_name: rec.file_name,
|
|
81
|
+
file_id: rec.file_id,
|
|
82
|
+
file_status: rec.file_status,
|
|
83
|
+
file_time: rec.file_time,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// File table DML operations
|
|
87
|
+
// Whole record is known
|
|
88
|
+
static async insertFileRecord(rec) {
|
|
89
|
+
await dbos_sdk_1.DBOS.knexClient('user_files').insert(TestUserFileTable.toFileDetails(rec));
|
|
90
|
+
}
|
|
91
|
+
static async updateFileRecord(rec) {
|
|
92
|
+
await dbos_sdk_1.DBOS.knexClient('user_files')
|
|
93
|
+
.update(TestUserFileTable.toFileDetails(rec))
|
|
94
|
+
.where({ file_id: rec.file_id });
|
|
95
|
+
}
|
|
96
|
+
// Delete when part of record is known
|
|
97
|
+
static async deleteFileRecordById(file_id) {
|
|
98
|
+
await dbos_sdk_1.DBOS.knexClient('user_files').delete().where({ file_id });
|
|
99
|
+
}
|
|
100
|
+
// Queries
|
|
101
|
+
static async lookUpByFields(fields) {
|
|
102
|
+
const rv = await dbos_sdk_1.DBOS.knexClient('user_files')
|
|
103
|
+
.select()
|
|
104
|
+
.where({ ...fields, file_status: FileStatus.ACTIVE })
|
|
105
|
+
.orderBy('file_time', 'desc')
|
|
106
|
+
.first();
|
|
107
|
+
return rv ? [rv] : [];
|
|
108
|
+
}
|
|
109
|
+
static async lookUpByName(user_id, file_type, file_name) {
|
|
110
|
+
const rv = await dbos_sdk_1.DBOS.knexClient('user_files')
|
|
111
|
+
.select()
|
|
112
|
+
.where({ user_id, file_type, file_name, file_status: FileStatus.ACTIVE })
|
|
113
|
+
.orderBy('file_time', 'desc')
|
|
114
|
+
.first();
|
|
115
|
+
return rv ? [rv] : [];
|
|
116
|
+
}
|
|
117
|
+
static async lookUpByType(user_id, file_type) {
|
|
118
|
+
const rv = await dbos_sdk_1.DBOS.knexClient('user_files')
|
|
119
|
+
.select()
|
|
120
|
+
.where({ user_id, file_type, file_status: FileStatus.ACTIVE });
|
|
121
|
+
return rv;
|
|
122
|
+
}
|
|
123
|
+
static async lookUpByUser(user_id) {
|
|
124
|
+
const rv = await dbos_sdk_1.DBOS.knexClient('user_files')
|
|
125
|
+
.select()
|
|
126
|
+
.where({ user_id, file_status: FileStatus.ACTIVE });
|
|
127
|
+
return rv;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
__decorate([
|
|
131
|
+
dbos_sdk_1.DBOS.step(),
|
|
132
|
+
__metadata("design:type", Function),
|
|
133
|
+
__metadata("design:paramtypes", [Object]),
|
|
134
|
+
__metadata("design:returntype", Promise)
|
|
135
|
+
], TestUserFileTable, "chooseFileRecord", null);
|
|
136
|
+
__decorate([
|
|
137
|
+
dbos_sdk_1.DBOS.transaction(),
|
|
138
|
+
__metadata("design:type", Function),
|
|
139
|
+
__metadata("design:paramtypes", [Object]),
|
|
140
|
+
__metadata("design:returntype", Promise)
|
|
141
|
+
], TestUserFileTable, "insertFileRecord", null);
|
|
142
|
+
__decorate([
|
|
143
|
+
dbos_sdk_1.DBOS.transaction(),
|
|
144
|
+
__metadata("design:type", Function),
|
|
145
|
+
__metadata("design:paramtypes", [Object]),
|
|
146
|
+
__metadata("design:returntype", Promise)
|
|
147
|
+
], TestUserFileTable, "updateFileRecord", null);
|
|
148
|
+
__decorate([
|
|
149
|
+
dbos_sdk_1.DBOS.transaction(),
|
|
150
|
+
__metadata("design:type", Function),
|
|
151
|
+
__metadata("design:paramtypes", [String]),
|
|
152
|
+
__metadata("design:returntype", Promise)
|
|
153
|
+
], TestUserFileTable, "deleteFileRecordById", null);
|
|
154
|
+
__decorate([
|
|
155
|
+
dbos_sdk_1.DBOS.transaction({ readOnly: true }),
|
|
156
|
+
__metadata("design:type", Function),
|
|
157
|
+
__metadata("design:paramtypes", [Object]),
|
|
158
|
+
__metadata("design:returntype", Promise)
|
|
159
|
+
], TestUserFileTable, "lookUpByFields", null);
|
|
160
|
+
__decorate([
|
|
161
|
+
dbos_sdk_1.DBOS.transaction({ readOnly: true }),
|
|
162
|
+
__metadata("design:type", Function),
|
|
163
|
+
__metadata("design:paramtypes", [String, String, String]),
|
|
164
|
+
__metadata("design:returntype", Promise)
|
|
165
|
+
], TestUserFileTable, "lookUpByName", null);
|
|
166
|
+
__decorate([
|
|
167
|
+
dbos_sdk_1.DBOS.transaction({ readOnly: true }),
|
|
168
|
+
__metadata("design:type", Function),
|
|
169
|
+
__metadata("design:paramtypes", [String, String]),
|
|
170
|
+
__metadata("design:returntype", Promise)
|
|
171
|
+
], TestUserFileTable, "lookUpByType", null);
|
|
172
|
+
__decorate([
|
|
173
|
+
dbos_sdk_1.DBOS.transaction({ readOnly: true }),
|
|
174
|
+
__metadata("design:type", Function),
|
|
175
|
+
__metadata("design:paramtypes", [String]),
|
|
176
|
+
__metadata("design:returntype", Promise)
|
|
177
|
+
], TestUserFileTable, "lookUpByUser", null);
|
|
178
|
+
const s3bucket = process.env['S3_BUCKET'];
|
|
179
|
+
const s3region = process.env['AWS_REGION'];
|
|
180
|
+
const s3accessKey = process.env['AWS_ACCESS_KEY_ID'];
|
|
181
|
+
const s3accessSecret = process.env['AWS_SECRET_ACCESS_KEY'];
|
|
182
|
+
let s3client = undefined;
|
|
183
|
+
const s3callback = {
|
|
184
|
+
// Database operations (these should be transactions)
|
|
185
|
+
newActiveFile: async (rec) => {
|
|
186
|
+
rec.file_status = FileStatus.ACTIVE;
|
|
187
|
+
return await TestUserFileTable.insertFileRecord(rec);
|
|
188
|
+
},
|
|
189
|
+
newPendingFile: async (rec) => {
|
|
190
|
+
rec.file_status = FileStatus.PENDING;
|
|
191
|
+
return await TestUserFileTable.insertFileRecord(rec);
|
|
192
|
+
},
|
|
193
|
+
fileActivated: async (rec) => {
|
|
194
|
+
rec.file_status = FileStatus.ACTIVE;
|
|
195
|
+
return await TestUserFileTable.updateFileRecord(rec);
|
|
196
|
+
},
|
|
197
|
+
fileDeleted: async (rec) => {
|
|
198
|
+
return await TestUserFileTable.deleteFileRecordById(rec.file_id);
|
|
199
|
+
},
|
|
200
|
+
// S3 interaction options, these will be run as steps
|
|
201
|
+
putS3Contents: async (rec, content, options) => {
|
|
202
|
+
return await s3client?.send(new client_s3_1.PutObjectCommand({
|
|
203
|
+
Bucket: s3bucket,
|
|
204
|
+
Key: rec.key,
|
|
205
|
+
ContentType: options?.contentType ?? 'text/plain',
|
|
206
|
+
Body: content,
|
|
207
|
+
}));
|
|
208
|
+
},
|
|
209
|
+
createPresignedPost: async (rec, timeout, opts) => {
|
|
210
|
+
const postPresigned = await (0, s3_presigned_post_1.createPresignedPost)(s3client, {
|
|
211
|
+
Conditions: [
|
|
212
|
+
['content-length-range', 1, 10000000], // 10MB
|
|
213
|
+
],
|
|
214
|
+
Bucket: s3bucket,
|
|
215
|
+
Key: rec.key,
|
|
216
|
+
Expires: timeout || 60,
|
|
217
|
+
Fields: {
|
|
218
|
+
'Content-Type': opts?.contentType || '*',
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
return { url: postPresigned.url, fields: postPresigned.fields };
|
|
222
|
+
},
|
|
223
|
+
validateS3Upload: undefined,
|
|
224
|
+
deleteS3Object: async (rec) => {
|
|
225
|
+
return await s3client?.send(new client_s3_1.DeleteObjectCommand({
|
|
226
|
+
Bucket: s3bucket,
|
|
227
|
+
Key: rec.key,
|
|
228
|
+
}));
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
exports.uploadWF = (0, s3_utils_1.registerS3UploadWorkflow)({ className: 'UserFile', name: 'uploadWF' }, s3callback);
|
|
232
|
+
exports.uploadPWF = (0, s3_utils_1.registerS3PresignedUploadWorkflow)({ className: 'UserFile', name: 'uploadPWF' }, s3callback);
|
|
233
|
+
exports.deleteWF = (0, s3_utils_1.registerS3DeleteWorkflow)({ className: 'UserFile', name: 'deleteWF' }, s3callback);
|
|
234
|
+
describe('ses-tests', () => {
|
|
235
|
+
let s3IsAvailable = true;
|
|
236
|
+
beforeAll(async () => {
|
|
237
|
+
// Check if S3 is available and update app config, skip the test if it's not
|
|
238
|
+
if (!s3region || !s3bucket || !s3accessKey || !s3accessSecret) {
|
|
239
|
+
s3IsAvailable = false;
|
|
240
|
+
console.log('S3 Test is not configured. To run, set AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and S3_BUCKET');
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
s3client = new client_s3_1.S3Client({
|
|
244
|
+
region: s3region,
|
|
245
|
+
credentials: {
|
|
246
|
+
accessKeyId: s3accessKey,
|
|
247
|
+
secretAccessKey: s3accessSecret,
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
await dbos_sdk_1.DBOS.launch();
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
afterAll(async () => {
|
|
254
|
+
if (s3IsAvailable) {
|
|
255
|
+
await dbos_sdk_1.DBOS.shutdown();
|
|
256
|
+
}
|
|
257
|
+
}, 10000);
|
|
258
|
+
test('s3-simple-wfs', async () => {
|
|
259
|
+
if (!s3IsAvailable) {
|
|
260
|
+
console.log('S3 unavailable, skipping S3 tests');
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const userid = (0, node_crypto_1.randomUUID)();
|
|
264
|
+
// The simple workflows that will be performed are to:
|
|
265
|
+
// Put file contents into DBOS (w/ table index)
|
|
266
|
+
const myFile = { user_id: userid, file_type: 'text', file_name: 'mytextfile.txt' };
|
|
267
|
+
const myFileRec = await TestUserFileTable.chooseFileRecord(myFile);
|
|
268
|
+
await (0, exports.uploadWF)(myFileRec, 'This is my file');
|
|
269
|
+
// Get the file contents out of DBOS (using the table index)
|
|
270
|
+
const mytxt = await getS3KeyContents(myFileRec.key);
|
|
271
|
+
expect(mytxt).toBe('This is my file');
|
|
272
|
+
// Delete the file contents out of DBOS (using the table index)
|
|
273
|
+
const dfhandle = await (0, exports.deleteWF)(myFileRec);
|
|
274
|
+
expect(dfhandle).toBeDefined();
|
|
275
|
+
}, 10000);
|
|
276
|
+
test('s3-complex-wfs', async () => {
|
|
277
|
+
if (!s3IsAvailable) {
|
|
278
|
+
console.log('S3 unavailable, skipping S3 tests');
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// The complex workflows that will be performed are to:
|
|
282
|
+
// Put the file contents into DBOS with a presigned post
|
|
283
|
+
const userid = (0, node_crypto_1.randomUUID)();
|
|
284
|
+
// The simple workflows that will be performed are to:
|
|
285
|
+
// Put file contents into DBOS (w/ table index)
|
|
286
|
+
const myFile = { user_id: userid, file_type: 'text', file_name: 'mytextfile.txt' };
|
|
287
|
+
const myFileRec = await TestUserFileTable.chooseFileRecord(myFile);
|
|
288
|
+
const wfhandle = await dbos_sdk_1.DBOS.startWorkflow(exports.uploadPWF)(myFileRec, 60, { contentType: 'text/plain' });
|
|
289
|
+
// Get the presigned post
|
|
290
|
+
const ppost = await dbos_sdk_1.DBOS.getEvent(wfhandle.workflowID, 'uploadkey');
|
|
291
|
+
// Upload to the URL
|
|
292
|
+
try {
|
|
293
|
+
const res = await uploadToS3(ppost, './src/s3_utils.test.ts');
|
|
294
|
+
expect(res.status.toString()[0]).toBe('2');
|
|
295
|
+
}
|
|
296
|
+
catch (e) {
|
|
297
|
+
// You do NOT want to accidentally serialize an AxiosError - they don't!
|
|
298
|
+
console.log('Caught something awful!', e);
|
|
299
|
+
expect(e).toBeUndefined();
|
|
300
|
+
}
|
|
301
|
+
// Notify WF
|
|
302
|
+
await dbos_sdk_1.DBOS.send(wfhandle.workflowID, true, 'uploadfinish');
|
|
303
|
+
// Wait for WF complete
|
|
304
|
+
const _myFileRecord = await wfhandle.getResult();
|
|
305
|
+
// Get the file out of DBOS (using a signed URL)
|
|
306
|
+
const myurl = await getS3KeyUrl(myFileRec.key, 60);
|
|
307
|
+
expect(myurl).not.toBeNull();
|
|
308
|
+
// Get the file contents out of S3
|
|
309
|
+
await downloadFromS3(myurl, './deleteme.xxx');
|
|
310
|
+
expect(fs.existsSync('./deleteme.xxx')).toBeTruthy();
|
|
311
|
+
fs.rmSync('./deleteme.xxx');
|
|
312
|
+
// Delete the file contents out of DBOS (using the table index)
|
|
313
|
+
const dfhandle = await (0, exports.deleteWF)(myFileRec);
|
|
314
|
+
expect(dfhandle).toBeDefined();
|
|
315
|
+
}, 10000);
|
|
316
|
+
async function getS3KeyContents(key) {
|
|
317
|
+
return (await s3client.send(new client_s3_1.GetObjectCommand({
|
|
318
|
+
Bucket: s3bucket,
|
|
319
|
+
Key: key,
|
|
320
|
+
}))).Body?.transformToString();
|
|
321
|
+
}
|
|
322
|
+
async function getS3KeyUrl(key, expirationSecs) {
|
|
323
|
+
const getObjectCommand = new client_s3_1.GetObjectCommand({
|
|
324
|
+
Bucket: s3bucket,
|
|
325
|
+
Key: key,
|
|
326
|
+
});
|
|
327
|
+
const presignedUrl = await (0, s3_request_presigner_1.getSignedUrl)(s3client, getObjectCommand, { expiresIn: expirationSecs });
|
|
328
|
+
return presignedUrl;
|
|
329
|
+
}
|
|
330
|
+
async function uploadToS3(presignedPostData, filePath) {
|
|
331
|
+
const formData = new form_data_1.default();
|
|
332
|
+
// Append all the fields from the presigned post data
|
|
333
|
+
Object.keys(presignedPostData.fields).forEach((key) => {
|
|
334
|
+
formData.append(key, presignedPostData.fields[key]);
|
|
335
|
+
});
|
|
336
|
+
// Append the file you want to upload
|
|
337
|
+
const fileStream = fs.createReadStream(filePath);
|
|
338
|
+
formData.append('file', fileStream);
|
|
339
|
+
return await axios_1.default.post(presignedPostData.url, formData);
|
|
340
|
+
}
|
|
341
|
+
async function downloadFromS3(presignedGetUrl, outputPath) {
|
|
342
|
+
const response = await axios_1.default.get(presignedGetUrl, {
|
|
343
|
+
responseType: 'stream', // Important to handle large files
|
|
344
|
+
});
|
|
345
|
+
// Use a write stream to save the file to the desired path
|
|
346
|
+
const writer = fs.createWriteStream(outputPath);
|
|
347
|
+
response.data.pipe(writer);
|
|
348
|
+
return new Promise((resolve, reject) => {
|
|
349
|
+
writer.on('finish', resolve);
|
|
350
|
+
writer.on('error', reject);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
//# sourceMappingURL=s3_utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3_utils.test.js","sourceRoot":"","sources":["../../src/s3_utils.test.ts"],"names":[],"mappings":"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"}
|