-
Notifications
You must be signed in to change notification settings - Fork 3.7k
/
utils.js
81 lines (72 loc) · 2.87 KB
/
utils.js
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
/**
* Copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the 'License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const { BlobServiceClient } = require("@azure/storage-blob");
const zlib = require('zlib');
const util = require('util');
const gzipAsync = util.promisify(zlib.gzip);
const gunzipAsync = util.promisify(zlib.gunzip);
const blobServiceClient = BlobServiceClient.fromConnectionString(process.env.AzureWebJobsStorage);
function flattenSpecs(suite, result = []) {
if (suite.suites) {
for (const child of suite.suites)
flattenSpecs(child, result);
}
for (const spec of suite.specs || [])
result.push(spec);
return result;
}
class SimpleBlob {
static async create(container, blobName) {
const dashboardContainerClient = await blobServiceClient.getContainerClient(container);
return new SimpleBlob(dashboardContainerClient, blobName);
}
constructor(containerClient, blobName) {
this._blobClient = containerClient.getBlobClient(blobName);
this._blockBlobClient = this._blobClient.getBlockBlobClient();
}
async download() {
if (!await this._blobClient.exists())
return undefined;
const response = await this._blobClient.download();
const responseStream = response.readableStreamBody;
const buffer = await new Promise((resolve, reject) => {
const chunks = [];
responseStream.on('data', data => chunks.push(data instanceof Buffer ? data : Buffer.from(data)));
responseStream.on('end', () => resolve(Buffer.concat(chunks)));
responseStream.on('error', reject);
});
const properties = await this._blobClient.getProperties();
const content = properties.contentEncoding.toLowerCase().trim() === 'gzip' ? await gunzipAsync(buffer) : buffer.toString('utf8');
return JSON.parse(content);
}
async uploadGzipped(data) {
const content = JSON.stringify(data);
const zipped = await gzipAsync(content, {
level: 9,
});
await this._blockBlobClient.upload(zipped, Buffer.byteLength(zipped), {
blobHTTPHeaders: {
blobContentEncoding: 'gzip',
blobContentType: 'application/json; charset=UTF-8',
}
});
}
}
async function deleteBlob(container, blobName) {
const containerClient = await blobServiceClient.getContainerClient(container);
await containerClient.deleteBlob(blobName, {});
}
module.exports = {gzipAsync, gunzipAsync, flattenSpecs, SimpleBlob, blobServiceClient, deleteBlob};