Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions alibabacloud-gateway-sls/ts/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@alicloud/gateway-sls",
"version": "0.3.0",
"version": "0.3.1",
"description": "",
"main": "dist/client.js",
"scripts": {
Expand Down Expand Up @@ -29,7 +29,7 @@
"@alicloud/darabonba-array": "^0.1.0",
"@alicloud/darabonba-encode-util": "^0.0.2",
"@alicloud/darabonba-signature-util": "^0.0.4",
"@alicloud/gateway-sls-util": "^0.3.0"
"@alicloud/gateway-sls-util": "^0.3.1"
},
"files": [
"dist",
Expand Down
5 changes: 2 additions & 3 deletions alibabacloud-gateway-sls/util/ts/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@alicloud/gateway-sls-util",
"version": "0.3.0",
"version": "0.3.1",
"description": "",
"main": "dist/client.js",
"scripts": {
Expand All @@ -12,15 +12,14 @@
"author": "",
"license": "ISC",
"devDependencies": {
"@types/lz4": "^0.6.4",
"@types/node": "^12.12.26",
"nyc": "^15.0.0",
"source-map-support": "^0.5.16",
"ts-node": "^8.6.2",
"typescript": "^3.7.5"
},
"dependencies": {
"lz4": "^0.6.5"
"lz4-napi": "^2.9.0"
},
"files": [
"dist",
Expand Down
19 changes: 12 additions & 7 deletions alibabacloud-gateway-sls/util/ts/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@ import { Readable } from 'stream';

export async function readableStreamToBuffer(stream: Readable): Promise<Buffer> {
const chunks: Buffer[] = [];
return new Promise((resolve, reject) => {
stream.on('data', (chunk: Buffer) => chunks.push(chunk));
stream.on('error', reject);
stream.on('end', () => {
resolve(Buffer.concat(chunks));
});
});
for await (const chunk of stream) {
chunks.push(chunk as Buffer);
}
return Buffer.concat(chunks);
}

export async function readableStreamWithPrependBuffer(stream: Readable, prependBuffer: Buffer): Promise<Buffer> {
const chunks: Buffer[] = [];
for await (const chunk of stream) {
chunks.push(chunk as Buffer);
}
return Buffer.concat([prependBuffer, ...chunks]);
}
7 changes: 3 additions & 4 deletions alibabacloud-gateway-sls/util/ts/src/compress.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import lz4 from 'lz4';
import {compress as napiLz4Compress} from 'lz4-napi';
import zlib from 'zlib';

const supportedCompressor = ['lz4', 'gzip', 'deflate']

export async function lz4Compress(data: Buffer): Promise<Buffer> {
const output = Buffer.alloc(lz4.encodeBound(data.length));
const n = lz4.encodeBlock(data, output);
return Buffer.from(output.slice(0, n));
// eliminate 4 bytes prepended size
return (await napiLz4Compress(data)).slice(4);
}

export async function gzipCompress(data: Buffer): Promise<Buffer> {
Expand Down
19 changes: 11 additions & 8 deletions alibabacloud-gateway-sls/util/ts/src/decompress.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
import { Readable } from 'stream';
import { readableStreamToBuffer } from './common';
import lz4 from 'lz4';
import { readableStreamToBuffer, readableStreamWithPrependBuffer } from './common';
import {uncompress as napiLz4Uncompress} from 'lz4-napi';
import zlib from 'zlib';

import fs from 'fs';
const supportedDecompressor = ['lz4', 'gzip', 'deflate']

export async function isDecompressorAvailable(compressType: string): Promise<boolean> {
return supportedDecompressor.includes(compressType);
}

export async function lz4Decompress(input: Readable, bodyRawSize: number): Promise<Buffer> {
const output = Buffer.alloc(bodyRawSize);
const n = lz4.decodeBlock(await readableStreamToBuffer(input), output);
if (n !== bodyRawSize) {
return Buffer.from(output.slice(0, n));
// prepend 4 bytes size to the buffer
const sizeBuffer = Buffer.alloc(4);
sizeBuffer.writeUInt32LE(bodyRawSize, 0);
let compressedBuffer = await readableStreamWithPrependBuffer(input, sizeBuffer);
const napiOutput = await napiLz4Uncompress(compressedBuffer);
if (napiOutput.length !== bodyRawSize) {
throw new Error(`unexpected uncompressed size: ${napiOutput.length}, expected: ${bodyRawSize}`);
}
return output;
return napiOutput;
}

export async function gzipDecompress(input: Readable, bodyRawSize: number): Promise<Buffer> {
Expand Down
Loading