-
Notifications
You must be signed in to change notification settings - Fork 301
/
archive.ts
104 lines (101 loc) · 3.01 KB
/
archive.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import config from '../config';
import { gzipSync, gunzipSync } from 'zlib';
import {
S3Client,
PutObjectCommand,
GetObjectCommand,
} from '@aws-sdk/client-s3';
async function stream2buffer(stream: any): Promise<Buffer> {
return new Promise((resolve, reject) => {
const _buf: any[] = [];
stream.on('data', (chunk: any) => _buf.push(chunk));
stream.on('end', () => resolve(Buffer.concat(_buf)));
stream.on('error', (err: any) => reject(err));
});
}
export class Archive {
private endpoint: string = '';
private accessKeyId: string = '';
private secretAccessKey: string = '';
private bucket: string = '';
private client: S3Client | null = null;
constructor(type: 'match' | 'player') {
if (type === 'match') {
this.endpoint = config.MATCH_ARCHIVE_S3_ENDPOINT;
this.accessKeyId = config.MATCH_ARCHIVE_S3_KEY_ID;
this.secretAccessKey = config.MATCH_ARCHIVE_S3_KEY_SECRET;
this.bucket = config.MATCH_ARCHIVE_S3_BUCKET;
} else if (type === 'player') {
this.endpoint = config.PLAYER_ARCHIVE_S3_ENDPOINT;
this.accessKeyId = config.PLAYER_ARCHIVE_S3_KEY_ID;
this.secretAccessKey = config.PLAYER_ARCHIVE_S3_KEY_SECRET;
this.bucket = config.PLAYER_ARCHIVE_S3_BUCKET;
}
this.client = new S3Client({
region: 'us-east-1',
credentials: {
accessKeyId: this.accessKeyId,
secretAccessKey: this.secretAccessKey,
},
endpoint: 'https://' + this.endpoint,
// any other options are passed to new AWS.S3()
// See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#constructor-property
});
}
public archiveGet = async (key: string) => {
if (!this.client) {
return null;
}
const command = new GetObjectCommand({
Bucket: this.bucket,
Key: key,
});
try {
const data = await this.client.send(command);
if (!data.Body) {
return null;
}
const buffer = await stream2buffer(data.Body);
const result = gunzipSync(buffer);
console.log(
'[ARCHIVE] %s: read %s bytes, decompressed %s bytes',
key,
buffer.length,
result.length,
);
return result;
} catch (e: any) {
console.error('[ARCHIVE] get error:', e.Code);
return null;
}
};
public archivePut = async (key: string, blob: Buffer) => {
if (!this.client) {
return null;
}
if (blob.length < 1000) {
throw new Error(
'[ARCHIVE] Tried to archive less than 1kb so something is probably wrong',
);
}
try {
const data = gzipSync(blob);
const command = new PutObjectCommand({
Bucket: this.bucket,
Key: key,
Body: data,
});
const result = await this.client.send(command);
console.log(
'[ARCHIVE] %s: original %s bytes, archived %s bytes',
key,
blob.length,
data.length,
);
return result;
} catch (e: any) {
console.error('[ARCHIVE] put error:', e.Code || e);
return null;
}
};
}