@ya-accelerators/web-backend-framework 0.0.61 → 0.0.62
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/s3/index.d.ts +30 -0
- package/dist/s3/index.js +90 -15
- package/dist/s3/index.js.map +1 -1
- package/package.json +1 -1
package/dist/s3/index.d.ts
CHANGED
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
import { S3Client } from '@aws-sdk/client-s3';
|
|
2
|
+
export type ObjectLockMode = 'COMPLIANCE' | 'GOVERNANCE';
|
|
3
|
+
export type ObjectVersion = {
|
|
4
|
+
versionId: string;
|
|
5
|
+
isLatest: boolean;
|
|
6
|
+
lastModified?: Date;
|
|
7
|
+
size?: number;
|
|
8
|
+
};
|
|
2
9
|
export declare const s3: {
|
|
3
10
|
client: () => S3Client;
|
|
11
|
+
putObjectWorm: (params: {
|
|
12
|
+
bucket: string;
|
|
13
|
+
key: string;
|
|
14
|
+
body: Buffer | Uint8Array | string;
|
|
15
|
+
mode: ObjectLockMode;
|
|
16
|
+
retainUntil: Date;
|
|
17
|
+
contentType?: string;
|
|
18
|
+
}) => Promise<{
|
|
19
|
+
versionId: string;
|
|
20
|
+
}>;
|
|
21
|
+
listObjectVersions: (params: {
|
|
22
|
+
bucket: string;
|
|
23
|
+
key: string;
|
|
24
|
+
}) => Promise<ObjectVersion[]>;
|
|
25
|
+
deleteOrphanVersions: (params: {
|
|
26
|
+
bucket: string;
|
|
27
|
+
key: string;
|
|
28
|
+
keepVersionIds: string[];
|
|
29
|
+
governanceBypass?: boolean;
|
|
30
|
+
}) => Promise<{
|
|
31
|
+
deletedVersionIds: string[];
|
|
32
|
+
skippedVersionIds: string[];
|
|
33
|
+
}>;
|
|
4
34
|
};
|
package/dist/s3/index.js
CHANGED
|
@@ -1,20 +1,95 @@
|
|
|
1
|
-
import { S3Client } from '@aws-sdk/client-s3';
|
|
1
|
+
import { DeleteObjectCommand, ListObjectVersionsCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
|
|
2
2
|
import { defaultEnv } from "../env.js";
|
|
3
3
|
let _client;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
const client = () => {
|
|
5
|
+
if (!_client) {
|
|
6
|
+
const endpoint = defaultEnv.LOCAL_S3_ENDPOINT;
|
|
7
|
+
_client = endpoint
|
|
8
|
+
? new S3Client({
|
|
9
|
+
region: defaultEnv.AWS_REGION,
|
|
10
|
+
endpoint,
|
|
11
|
+
credentials: { accessKeyId: 'minioadmin', secretAccessKey: 'minioadmin123' },
|
|
12
|
+
forcePathStyle: true,
|
|
13
|
+
})
|
|
14
|
+
: new S3Client();
|
|
15
|
+
}
|
|
16
|
+
return _client;
|
|
17
|
+
};
|
|
18
|
+
// Seal an object under Object Lock retention. Returns the S3 version-id the caller records in its
|
|
19
|
+
// own index. Throws when the bucket returns no VersionId (versioning / Object Lock not enabled).
|
|
20
|
+
const putObjectWorm = async (params) => {
|
|
21
|
+
const result = await client().send(new PutObjectCommand({
|
|
22
|
+
Bucket: params.bucket,
|
|
23
|
+
Key: params.key,
|
|
24
|
+
Body: params.body,
|
|
25
|
+
ContentType: params.contentType,
|
|
26
|
+
ObjectLockMode: params.mode,
|
|
27
|
+
ObjectLockRetainUntilDate: params.retainUntil,
|
|
28
|
+
}));
|
|
29
|
+
if (!result.VersionId) {
|
|
30
|
+
throw new Error(`putObjectWorm: no VersionId for ${params.bucket}/${params.key} (bucket needs versioning + Object Lock)`);
|
|
31
|
+
}
|
|
32
|
+
return { versionId: result.VersionId };
|
|
33
|
+
};
|
|
34
|
+
// Enumerate every version of a single key (evidence audit + orphan detection). Paginates fully.
|
|
35
|
+
const listObjectVersions = async (params) => {
|
|
36
|
+
const versions = [];
|
|
37
|
+
let keyMarker;
|
|
38
|
+
let versionIdMarker;
|
|
39
|
+
do {
|
|
40
|
+
const result = await client().send(new ListObjectVersionsCommand({
|
|
41
|
+
Bucket: params.bucket,
|
|
42
|
+
Prefix: params.key,
|
|
43
|
+
KeyMarker: keyMarker,
|
|
44
|
+
VersionIdMarker: versionIdMarker,
|
|
45
|
+
}));
|
|
46
|
+
for (const version of result.Versions ?? []) {
|
|
47
|
+
if (version.Key === params.key && version.VersionId) {
|
|
48
|
+
versions.push({
|
|
49
|
+
versionId: version.VersionId,
|
|
50
|
+
isLatest: version.IsLatest ?? false,
|
|
51
|
+
lastModified: version.LastModified,
|
|
52
|
+
size: version.Size,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
keyMarker = result.IsTruncated ? result.NextKeyMarker : undefined;
|
|
57
|
+
versionIdMarker = result.IsTruncated ? result.NextVersionIdMarker : undefined;
|
|
58
|
+
} while (keyMarker || versionIdMarker);
|
|
59
|
+
return versions;
|
|
60
|
+
};
|
|
61
|
+
// Delete versions of a key no longer referenced (`keepVersionIds` = the version-ids still indexed).
|
|
62
|
+
// A version still under retention cannot be deleted: S3 rejects it with `AccessDenied`, and it is
|
|
63
|
+
// returned in `skippedVersionIds` rather than failing the whole sweep. GOVERNANCE-mode versions
|
|
64
|
+
// under retention are deletable only with `governanceBypass` (requires `s3:BypassGovernanceRetention`).
|
|
65
|
+
// Any other error propagates — only the retention denial is caught.
|
|
66
|
+
const deleteOrphanVersions = async (params) => {
|
|
67
|
+
const keep = new Set(params.keepVersionIds);
|
|
68
|
+
const deletedVersionIds = [];
|
|
69
|
+
const skippedVersionIds = [];
|
|
70
|
+
for (const version of await listObjectVersions({ bucket: params.bucket, key: params.key })) {
|
|
71
|
+
if (keep.has(version.versionId)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await client().send(new DeleteObjectCommand({
|
|
76
|
+
Bucket: params.bucket,
|
|
77
|
+
Key: params.key,
|
|
78
|
+
VersionId: version.versionId,
|
|
79
|
+
BypassGovernanceRetention: params.governanceBypass,
|
|
80
|
+
}));
|
|
81
|
+
deletedVersionIds.push(version.versionId);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error instanceof Error && error.name === 'AccessDenied') {
|
|
85
|
+
skippedVersionIds.push(version.versionId);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
16
90
|
}
|
|
17
|
-
|
|
18
|
-
}
|
|
91
|
+
}
|
|
92
|
+
return { deletedVersionIds, skippedVersionIds };
|
|
19
93
|
};
|
|
94
|
+
export const s3 = { client, putObjectWorm, listObjectVersions, deleteOrphanVersions };
|
|
20
95
|
//# sourceMappingURL=index.js.map
|
package/dist/s3/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/s3/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/s3/index.ts"],"names":[],"mappings":"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"}
|