Compare commits

...

18 Commits

Author SHA1 Message Date
efb4229f58 3.0.12 2024-01-08 14:43:12 +01:00
61dcc6badc fix(core): update 2024-01-08 14:43:11 +01:00
585da9bc79 3.0.11 2024-01-08 14:35:35 +01:00
60a2efaecb fix(core): update 2024-01-08 14:35:34 +01:00
2c8f550830 3.0.10 2024-01-07 14:50:14 +01:00
c9688159e5 fix(core): update 2024-01-07 14:50:14 +01:00
a710473d33 3.0.9 2023-11-06 13:56:03 +01:00
61c62672fc fix(core): update 2023-11-06 13:56:02 +01:00
1a7150e1f8 3.0.8 2023-11-06 11:29:53 +01:00
f35360adba fix(core): update 2023-11-06 11:29:52 +01:00
9774567dc0 3.0.7 2023-10-23 16:52:32 +02:00
529c5feeb1 fix(core): update 2023-10-23 16:52:31 +02:00
d2cac36a6e 3.0.6 2023-10-20 18:13:11 +02:00
2cdef55f13 fix(core): update 2023-10-20 18:13:10 +02:00
05444b757b 3.0.5 2023-09-21 00:48:05 +02:00
1ef5c0da06 fix(core): update 2023-09-21 00:48:04 +02:00
00b4108803 3.0.4 2023-08-06 18:15:02 +02:00
7e75cccbcb fix(core): update 2023-08-06 18:15:01 +02:00
13 changed files with 1990 additions and 1200 deletions

View File

@ -105,6 +105,6 @@ jobs:
run: |
npmci node install stable
npmci npm install
pnpm install -g @gitzone/tsdoc
pnpm install -g @git.zone/tsdoc
npmci command tsdoc
continue-on-error: true

View File

@ -1,6 +1,6 @@
{
"name": "@api.global/typedserver",
"version": "3.0.3",
"version": "3.0.12",
"description": "easy serving of static files",
"main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts",
@ -37,15 +37,15 @@
],
"homepage": "https://github.com/pushrocks/easyserve",
"dependencies": {
"@api.global/typedrequest": "^3.0.1",
"@api.global/typedrequest": "^3.0.4",
"@api.global/typedrequest-interfaces": "^3.0.1",
"@api.global/typedsocket": "^3.0.0",
"@push.rocks/lik": "^6.0.3",
"@push.rocks/lik": "^6.0.12",
"@push.rocks/smartchok": "^1.0.23",
"@push.rocks/smartdelay": "^3.0.5",
"@push.rocks/smartenv": "^5.0.5",
"@push.rocks/smartenv": "^5.0.12",
"@push.rocks/smartfeed": "^1.0.11",
"@push.rocks/smartfile": "^10.0.28",
"@push.rocks/smartfile": "^11.0.4",
"@push.rocks/smartlog": "^3.0.3",
"@push.rocks/smartlog-destination-devtools": "^1.0.10",
"@push.rocks/smartmanifest": "^2.0.2",
@ -53,26 +53,27 @@
"@push.rocks/smartopen": "^2.0.0",
"@push.rocks/smartpath": "^5.0.11",
"@push.rocks/smartpromise": "^4.0.2",
"@push.rocks/smartrequest": "^2.0.18",
"@push.rocks/smartrx": "^3.0.6",
"@push.rocks/smartsitemap": "^2.0.2",
"@push.rocks/smarttime": "^4.0.4",
"@push.rocks/webstore": "^2.0.9",
"@tsclass/tsclass": "^4.0.42",
"@types/express": "^4.17.17",
"@push.rocks/smartrequest": "^2.0.21",
"@push.rocks/smartrx": "^3.0.7",
"@push.rocks/smartsitemap": "^2.0.3",
"@push.rocks/smartstream": "^3.0.30",
"@push.rocks/smarttime": "^4.0.6",
"@push.rocks/webstore": "^2.0.13",
"@tsclass/tsclass": "^4.0.46",
"@types/express": "^4.17.21",
"body-parser": "^1.20.2",
"cors": "^2.8.5",
"express": "^4.18.2",
"express-force-ssl": "^0.3.2",
"lit": "^2.8.0"
"lit": "^3.1.0"
},
"devDependencies": {
"@gitzone/tsbuild": "^2.1.66",
"@gitzone/tsbundle": "^2.0.8",
"@gitzone/tsrun": "^1.2.44",
"@gitzone/tstest": "^1.0.77",
"@push.rocks/tapbundle": "^5.0.12",
"@types/node": "^20.4.8"
"@git.zone/tsbuild": "^2.1.66",
"@git.zone/tsbundle": "^2.0.8",
"@git.zone/tsrun": "^1.2.44",
"@git.zone/tstest": "^1.0.84",
"@push.rocks/tapbundle": "^5.0.15",
"@types/node": "^20.10.7"
},
"private": false,
"browserslist": [

3028
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -78,7 +78,7 @@ tap.test('should create a valid StaticHandler', async () => {
});
tap.test('should add typedrequest and typedsocket', async () => {
const typedrequest = await import('@apiglobal/typedrequest');
const typedrequest = await import('@api.global/typedrequest');
const typedrouter = new typedrequest.TypedRouter();
testServer.addTypedRequest(typedrouter);

View File

@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@api.global/typedserver',
version: '3.0.3',
version: '3.0.12',
description: 'easy serving of static files'
}

View File

@ -1,11 +1,11 @@
export type TResponseModifier = <T>(responseArg: {
headers: { [header: string]: number | string | string[] | undefined };
path: string;
responseContent: string;
responseContent: Buffer;
travelData?: T;
}) => Promise<{
headers: { [header: string]: number | string | string[] | undefined };
path: string;
responseContent: string;
responseContent: Buffer;
travelData?: T;
}>;

View File

@ -0,0 +1,76 @@
import * as plugins from '../typedserver.plugins.js';
export class Compressor {
public async compressContent(
content: Buffer,
method: 'gzip' | 'deflate' | 'br' | 'none'
): Promise<Buffer> {
return new Promise((resolve, reject) => {
switch (method) {
case 'gzip':
plugins.zlib.gzip(content, (err, result) => {
if (err) reject(err);
else resolve(result);
});
break;
case 'br':
plugins.zlib.brotliCompress(content, (err, result) => {
if (err) reject(err);
else resolve(result);
});
break;
case 'deflate':
plugins.zlib.deflate(content, (err, result) => {
if (err) reject(err);
else resolve(result);
});
break;
default:
resolve(content);
}
});
}
public determineCompression(acceptEncoding: string | string[]) {
// Ensure acceptEncoding is a single string
const encodingString = Array.isArray(acceptEncoding)
? acceptEncoding.join(', ')
: acceptEncoding;
let compressionMethod: 'gzip' | 'deflate' | 'br' | 'none' = 'none';
// Check and prioritize compression methods
if (/\bbr\b/.test(encodingString)) {
compressionMethod = 'br';
} else if (/\bgzip\b/.test(encodingString)) {
compressionMethod = 'gzip';
} else if (/\bdeflate\b/.test(encodingString)) {
compressionMethod = 'deflate';
}
return compressionMethod;
}
public async maybeCompress(requestHeaders: plugins.http.IncomingHttpHeaders, content: Buffer) {
const acceptEncoding = requestHeaders['accept-encoding'];
const compressionMethod = this.determineCompression(acceptEncoding);
const result = await this.compressContent(content, compressionMethod);
return {
result,
compressionMethod,
};
}
public createCompressionStream(method: 'gzip' | 'deflate' | 'br' | 'none') {
switch (method) {
case 'gzip':
return plugins.zlib.createGzip();
case 'br':
return plugins.zlib.createBrotliCompress();
case 'deflate':
return plugins.zlib.createDeflate();
default:
throw new Error('Invalid compression method');
}
}
}

View File

@ -40,7 +40,7 @@ export class HandlerProxy extends Handler {
}
}
let responseToSend: string = proxiedResponse.body;
let responseToSend: Buffer = proxiedResponse.body;
if (typeof responseToSend !== 'string') {
console.log(proxyRequestUrl);
console.log(responseToSend);

View File

@ -2,8 +2,10 @@ import * as plugins from '../typedserver.plugins.js';
import * as interfaces from '../interfaces/index.js';
import { Handler } from './classes.handler.js';
import { Compressor } from './classes.compressor.js';
export class HandlerStatic extends Handler {
public compressor = new Compressor();
constructor(
pathArg: string,
optionsArg?: {
@ -62,11 +64,9 @@ export class HandlerStatic extends Handler {
}
// lets actually care about serving, if security checks pass
let fileString: string;
let fileEncoding: 'binary' | 'utf8';
let fileBuffer: Buffer;
try {
fileString = plugins.smartfile.fs.toStringSync(joinedPath);
fileEncoding = plugins.smartmime.getEncoding(joinedPath);
fileBuffer = plugins.smartfile.fs.toBufferSync(joinedPath);
usedPath = joinedPath;
} catch (err) {
// try serving index.html instead
@ -75,8 +75,7 @@ export class HandlerStatic extends Handler {
console.log(`serving default path ${defaultPath} instead of ${joinedPath}`);
try {
parsedPath = plugins.path.parse(defaultPath);
fileString = plugins.smartfile.fs.toStringSync(defaultPath);
fileEncoding = plugins.smartmime.getEncoding(defaultPath);
fileBuffer = plugins.smartfile.fs.toBufferSync(defaultPath);
usedPath = defaultPath;
} catch (err) {
res.writeHead(500);
@ -99,7 +98,7 @@ export class HandlerStatic extends Handler {
const modifiedResponse = await optionsArg.responseModifier({
headers: res.getHeaders(),
path: usedPath,
responseContent: fileString,
responseContent: fileBuffer,
travelData,
});
@ -115,11 +114,15 @@ export class HandlerStatic extends Handler {
}
// responseContent
fileString = modifiedResponse.responseContent;
fileBuffer = modifiedResponse.responseContent;
}
// lets finally deal with compression
const compressionResult = await this.compressor.maybeCompress(requestHeaders, fileBuffer);
res.status(200);
res.write(Buffer.from(fileString, fileEncoding));
res.header('Content-Encoding', compressionResult.compressionMethod);
res.write(compressionResult.result);
res.end();
});
}

View File

@ -132,7 +132,8 @@ export class Server {
this.expressAppInstance.use((req, res, next) => {
res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
res.setHeader('Cross-Origin-Embedder-Policy', 'unsafe-none');
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('SERVEZONE_ROUTE', 'LOSSLESS_ORIGIN_CONTAINER');
res.setHeader('Cache-Control', 'no-cache');

View File

@ -124,7 +124,7 @@ export class TypedServer {
'/*',
new servertools.HandlerStatic(this.options.serveDir, {
responseModifier: async (responseArg) => {
let fileString = responseArg.responseContent;
let fileString = responseArg.responseContent.toString();
if (plugins.path.parse(responseArg.path).ext === '.html') {
const fileStringArray = fileString.split('<head>');
if (this.options.injectReload && fileStringArray.length === 2) {
@ -153,7 +153,7 @@ export class TypedServer {
return {
headers,
path: responseArg.path,
responseContent: fileString,
responseContent: Buffer.from(fileString),
};
},
serveIndexHtmlDefault: true,

View File

@ -3,8 +3,9 @@ import * as http from 'http';
import * as https from 'https';
import * as net from 'net';
import * as path from 'path';
import * as zlib from 'zlib';
export { http, https, net, path };
export { http, https, net, path, zlib };
// @tsclass scope
import * as tsclass from '@tsclass/tsclass';
@ -32,6 +33,7 @@ import * as smartpromise from '@push.rocks/smartpromise';
import * as smartrequest from '@push.rocks/smartrequest';
import * as smartrx from '@push.rocks/smartrx';
import * as smartsitemap from '@push.rocks/smartsitemap';
import * as smartstream from '@push.rocks/smartstream';
import * as smarttime from '@push.rocks/smarttime';
export {
@ -47,6 +49,7 @@ export {
smartpromise,
smartrequest,
smartsitemap,
smartstream,
smarttime,
smartrx,
};

View File

@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@api.global/typedserver',
version: '3.0.3',
version: '3.0.12',
description: 'easy serving of static files'
}