mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	Compressed dashboard is 10 times smaller yet has all the data to render flakiness. Drive-by: remove old dashboard implementations since they are no longer used.
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * 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};
 |