@cudenix/cudenix 0.0.48 → 0.0.51
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/ecosystem/modules/compress/index.d.ts +1 -2
- package/dist/ecosystem/modules/compress/index.d.ts.map +1 -1
- package/dist/ecosystem/modules/compress/index.js +69 -29
- package/dist/ecosystem/modules/compress/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/ecosystem/modules/compress/compression-stream.d.ts +0 -16
- package/dist/ecosystem/modules/compress/compression-stream.d.ts.map +0 -1
- package/dist/ecosystem/modules/compress/compression-stream.js +0 -18
- package/dist/ecosystem/modules/compress/compression-stream.js.map +0 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export interface CompressOptions {
|
|
2
2
|
threshold?: number;
|
|
3
|
-
level?: Bun.ZlibCompressionOptions["level"];
|
|
4
3
|
}
|
|
5
|
-
export declare const compress: ({ threshold
|
|
4
|
+
export declare const compress: ({ threshold }?: CompressOptions) => import("../../../core/index.js").Module<import("../../../core/index.js").MergeErrors<{}, import("../../../core/index.js").TransformError<never>>, "/", {}, {}, import("../../../core/index.js").MergeSuccesses<{}, import("../../../core/index.js").TransformSuccess<never>>, {
|
|
6
5
|
inputs: NonNullable<unknown>;
|
|
7
6
|
outputs: NonNullable<unknown>;
|
|
8
7
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ecosystem/modules/compress/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ecosystem/modules/compress/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAuED,eAAO,MAAM,QAAQ,GACpB,gBAAsB,eAA6B;;;EAwGnD,CAAC"}
|
|
@@ -1,11 +1,50 @@
|
|
|
1
|
-
import { constants } from "node:zlib";
|
|
2
1
|
import { module, processResponse, success } from "../../../core/index.js";
|
|
3
|
-
import { CompressionStream } from "../../../ecosystem/modules/compress/compression-stream.js";
|
|
4
2
|
import { Empty } from "../../../utils/index.js";
|
|
5
|
-
const compressibleRegexp = /^\s*(?:text\/
|
|
3
|
+
const compressibleRegexp = /^\s*(?:text\/[^;\s]+|application\/(?:json|javascript|xml|x-www-form-urlencoded)|[^;\s]+\/[^;\s]+\+(?:json|text|xml|yaml))(?:[;\s]|$)/i;
|
|
6
4
|
const noTransformRegexp = /\bno-transform\b/i;
|
|
7
|
-
|
|
8
|
-
const
|
|
5
|
+
const parseAcceptEncoding = (header) => {
|
|
6
|
+
const map = new Map();
|
|
7
|
+
if (!header) {
|
|
8
|
+
return map;
|
|
9
|
+
}
|
|
10
|
+
let order = 0;
|
|
11
|
+
const split = header.split(",");
|
|
12
|
+
for (let i = 0; i < split.length; i++) {
|
|
13
|
+
const token = split[i]?.trim().toLowerCase();
|
|
14
|
+
if (!token) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const [name, ...options] = token.split(";").map((split) => {
|
|
18
|
+
return split.trim();
|
|
19
|
+
});
|
|
20
|
+
if (!name) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
let q = 1;
|
|
24
|
+
for (let j = 0; j < options.length; j++) {
|
|
25
|
+
const option = options[j];
|
|
26
|
+
if (!option) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const priority = Number(option.match(/^q=([0-9.]+)$/)?.[1]);
|
|
30
|
+
if (Number.isNaN(priority)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
q = priority;
|
|
34
|
+
}
|
|
35
|
+
const previous = map.get(name);
|
|
36
|
+
if (!previous || q > previous.q) {
|
|
37
|
+
map.set(name, {
|
|
38
|
+
order,
|
|
39
|
+
q,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
order++;
|
|
43
|
+
}
|
|
44
|
+
return map;
|
|
45
|
+
};
|
|
46
|
+
export const compress = ({ threshold = 1024 } = new Empty()) => {
|
|
47
|
+
const encodings = ["br", "gzip", "deflate", "zstd"];
|
|
9
48
|
return module().middleware(async ({ request: { raw }, response }, next) => {
|
|
10
49
|
await next();
|
|
11
50
|
const contentLength = response.headers.get("Content-Length");
|
|
@@ -19,21 +58,26 @@ export const compress = ({ threshold = 1024, level } = new Empty()) => {
|
|
|
19
58
|
(contentLength && Number(contentLength) < threshold)) {
|
|
20
59
|
return;
|
|
21
60
|
}
|
|
22
|
-
const accepted =
|
|
23
|
-
.get("Accept-Encoding")
|
|
24
|
-
?.split(",")
|
|
25
|
-
.map((encoding) => {
|
|
26
|
-
return encoding.trim().toLowerCase().split(";")[0];
|
|
27
|
-
})
|
|
28
|
-
.filter((encoding) => {
|
|
29
|
-
return !!encoding;
|
|
30
|
-
}));
|
|
61
|
+
const accepted = parseAcceptEncoding(raw.headers.get("Accept-Encoding") ?? "");
|
|
31
62
|
if (accepted.size === 0) {
|
|
32
63
|
return;
|
|
33
64
|
}
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
65
|
+
const star = accepted.get("*");
|
|
66
|
+
const encoding = encodings
|
|
67
|
+
.map((encoding) => {
|
|
68
|
+
return {
|
|
69
|
+
order: 0,
|
|
70
|
+
q: 0,
|
|
71
|
+
...(accepted.get(encoding) ?? star),
|
|
72
|
+
name: encoding,
|
|
73
|
+
};
|
|
74
|
+
})
|
|
75
|
+
.filter((encoding) => {
|
|
76
|
+
return encoding.q > 0;
|
|
77
|
+
})
|
|
78
|
+
.sort((a, b) => {
|
|
79
|
+
return b.q === a.q ? a.order - b.order : b.q - a.q;
|
|
80
|
+
})[0];
|
|
37
81
|
if (!encoding) {
|
|
38
82
|
return;
|
|
39
83
|
}
|
|
@@ -53,19 +97,15 @@ export const compress = ({ threshold = 1024, level } = new Empty()) => {
|
|
|
53
97
|
if (!stream) {
|
|
54
98
|
return;
|
|
55
99
|
}
|
|
56
|
-
processedResponse.headers.
|
|
100
|
+
const vary = processedResponse.headers.get("Vary");
|
|
101
|
+
if (!vary || vary.toLowerCase().indexOf("accept-encoding") === -1) {
|
|
102
|
+
processedResponse.headers.append("Vary", "Accept-Encoding");
|
|
103
|
+
}
|
|
57
104
|
processedResponse.headers.delete("Content-Length");
|
|
58
|
-
processedResponse.headers.set("Content-Encoding", encoding);
|
|
59
|
-
response.content = success(new Response(stream.pipeThrough(new CompressionStream(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
[constants.BROTLI_PARAM_QUALITY]: level ?? 6,
|
|
63
|
-
},
|
|
64
|
-
}
|
|
65
|
-
: {
|
|
66
|
-
flush: constants.Z_SYNC_FLUSH,
|
|
67
|
-
level,
|
|
68
|
-
})), processedResponse), {
|
|
105
|
+
processedResponse.headers.set("Content-Encoding", encoding.name);
|
|
106
|
+
response.content = success(new Response(stream.pipeThrough(new CompressionStream(
|
|
107
|
+
// @ts-expect-error
|
|
108
|
+
encoding.name === "br" ? "brotli" : encoding.name)), processedResponse), {
|
|
69
109
|
status: processedResponse.status,
|
|
70
110
|
transform: false,
|
|
71
111
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ecosystem/modules/compress/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ecosystem/modules/compress/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
},
|
|
7
7
|
"description": "cudenix",
|
|
8
8
|
"devDependencies": {
|
|
9
|
-
"@biomejs/biome": "2.
|
|
10
|
-
"@types/bun": "1.3.
|
|
9
|
+
"@biomejs/biome": "2.3.10",
|
|
10
|
+
"@types/bun": "1.3.4",
|
|
11
11
|
"tsc-alias": "1.8.16",
|
|
12
12
|
"typescript": "5.9.3"
|
|
13
13
|
},
|
|
@@ -89,5 +89,5 @@
|
|
|
89
89
|
"sideEffects": false,
|
|
90
90
|
"type": "module",
|
|
91
91
|
"types": "dist/index.d.ts",
|
|
92
|
-
"version": "0.0.
|
|
92
|
+
"version": "0.0.51"
|
|
93
93
|
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { type BrotliOptions, createBrotliCompress, createDeflate, createGzip, createZstdCompress, type ZlibOptions } from "node:zlib";
|
|
2
|
-
declare const transformMap: {
|
|
3
|
-
readonly br: typeof createBrotliCompress;
|
|
4
|
-
readonly deflate: typeof createDeflate;
|
|
5
|
-
readonly gzip: typeof createGzip;
|
|
6
|
-
readonly zstd: typeof createZstdCompress;
|
|
7
|
-
};
|
|
8
|
-
export declare class CompressionStream {
|
|
9
|
-
readable: ReadableStream;
|
|
10
|
-
writable: WritableStream;
|
|
11
|
-
constructor(method: keyof typeof transformMap, options?: BrotliOptions & ZlibOptions & {
|
|
12
|
-
dictionary?: Buffer;
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=compression-stream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compression-stream.d.ts","sourceRoot":"","sources":["../../../../src/ecosystem/modules/compress/compression-stream.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,aAAa,EAClB,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,KAAK,WAAW,EAChB,MAAM,WAAW,CAAC;AAEnB,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AAEX,qBAAa,iBAAiB;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;gBAGxB,MAAM,EAAE,MAAM,OAAO,YAAY,EACjC,OAAO,GAAE,aAAa,GAAG,WAAW,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;CAOpE"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Duplex } from "node:stream";
|
|
2
|
-
import { createBrotliCompress, createDeflate, createGzip, createZstdCompress, } from "node:zlib";
|
|
3
|
-
const transformMap = {
|
|
4
|
-
br: createBrotliCompress,
|
|
5
|
-
deflate: createDeflate,
|
|
6
|
-
gzip: createGzip,
|
|
7
|
-
zstd: createZstdCompress,
|
|
8
|
-
};
|
|
9
|
-
export class CompressionStream {
|
|
10
|
-
readable;
|
|
11
|
-
writable;
|
|
12
|
-
constructor(method, options = {}) {
|
|
13
|
-
const pair = Duplex.toWeb(transformMap[method](options));
|
|
14
|
-
this.readable = pair.readable;
|
|
15
|
-
this.writable = pair.writable;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=compression-stream.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compression-stream.js","sourceRoot":"","sources":["../../../../src/ecosystem/modules/compress/compression-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAEN,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,kBAAkB,GAElB,MAAM,WAAW,CAAC;AAEnB,MAAM,YAAY,GAAG;IACpB,EAAE,EAAE,oBAAoB;IACxB,OAAO,EAAE,aAAa;IACtB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,kBAAkB;CACf,CAAC;AAEX,MAAM,OAAO,iBAAiB;IAC7B,QAAQ,CAAiB;IACzB,QAAQ,CAAiB;IAEzB,YACC,MAAiC,EACjC,UAAiE,EAAE;QAEnE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAqC,CAAC;QAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,CAAC;CACD"}
|