Compare commits
2 Commits
5a41f3ce26
...
ce1d4561a2
| Author | SHA1 | Date | |
|---|---|---|---|
| ce1d4561a2 | |||
| 351ccf3e2a |
3
Web/bfcache/server/.npmrc
Normal file
3
Web/bfcache/server/.npmrc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
save-exact=true
|
||||||
|
package-lock=false
|
||||||
|
@techniker-me:registry=https://registry-node.techniker.me
|
||||||
@@ -3,20 +3,22 @@
|
|||||||
"workspaces": {
|
"workspaces": {
|
||||||
"": {
|
"": {
|
||||||
"name": "server",
|
"name": "server",
|
||||||
"devDependencies": {
|
"dependencies": {
|
||||||
"@eslint/css": "^0.11.0",
|
"@techniker-me/logger": "0.0.15",
|
||||||
"@eslint/js": "^9.35.0",
|
"@techniker-me/tools": "2025.0.16",
|
||||||
"@eslint/json": "^0.13.2",
|
|
||||||
"@eslint/markdown": "^7.2.0",
|
|
||||||
"@types/bun": "latest",
|
|
||||||
"eslint": "^9.35.0",
|
|
||||||
"globals": "^16.4.0",
|
|
||||||
"jiti": "^2.5.1",
|
|
||||||
"prettier": "^3.6.2",
|
|
||||||
"typescript-eslint": "^8.44.0",
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"devDependencies": {
|
||||||
|
"@eslint/css": "0.11.0",
|
||||||
|
"@eslint/js": "9.35.0",
|
||||||
|
"@eslint/json": "0.13.2",
|
||||||
|
"@eslint/markdown": "7.2.0",
|
||||||
|
"@types/bun": "latest",
|
||||||
|
"eslint": "9.35.0",
|
||||||
|
"globals": "16.4.0",
|
||||||
|
"jiti": "2.5.1",
|
||||||
|
"prettier": "3.6.2",
|
||||||
"typescript": "5.9.2",
|
"typescript": "5.9.2",
|
||||||
|
"typescript-eslint": "8.44.0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -63,6 +65,10 @@
|
|||||||
|
|
||||||
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
||||||
|
|
||||||
|
"@techniker-me/logger": ["@techniker-me/logger@0.0.15", "https://registry-node.techniker.me/@techniker-me/logger/-/logger-0.0.15.tgz", { "dependencies": { "@techniker-me/tools": "2025.0.16" } }, "sha512-+6aB39lWTO2RDQLse2nZqfTXa7Kp78K7Xy7zobwBQlg01jR4zKmQAMkjQ4iduvnQYEU+1F2k6FDMco2E0mWZ4w=="],
|
||||||
|
|
||||||
|
"@techniker-me/tools": ["@techniker-me/tools@2025.0.16", "https://registry-node.techniker.me/@techniker-me/tools/-/tools-2025.0.16.tgz", {}, "sha512-Ul2yj1vd4lCO8g7IW2pHkAsdeRVEUMqGpiIvSedCc1joVXEWPbh4GESW83kMHtisjFjjlZIzb3EVlCE0BCiBWQ=="],
|
||||||
|
|
||||||
"@types/bun": ["@types/bun@1.2.22", "", { "dependencies": { "bun-types": "1.2.22" } }, "sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA=="],
|
"@types/bun": ["@types/bun@1.2.22", "", { "dependencies": { "bun-types": "1.2.22" } }, "sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA=="],
|
||||||
|
|
||||||
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
|
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
|
||||||
|
|||||||
2
Web/bfcache/server/bunfig.toml
Normal file
2
Web/bfcache/server/bunfig.toml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[install.scopes]
|
||||||
|
"@techniker-me" = "https://registry-node.techniker.me"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@technier-me/websocket-relay-server",
|
"name": "@technier-me/websocket-relay-server",
|
||||||
"module": "index.ts",
|
"module": "src/index.ts",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -8,7 +8,8 @@
|
|||||||
"format": "prettier --write .",
|
"format": "prettier --write .",
|
||||||
"lint": "eslint --max-warnings 0 .",
|
"lint": "eslint --max-warnings 0 .",
|
||||||
"prelint:fix": "bun run format",
|
"prelint:fix": "bun run format",
|
||||||
"lint:fix": "eslint --fix ."
|
"lint:fix": "eslint --fix .",
|
||||||
|
"start:dev": "bun run --watch src"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/css": "0.11.0",
|
"@eslint/css": "0.11.0",
|
||||||
@@ -20,9 +21,34 @@
|
|||||||
"globals": "16.4.0",
|
"globals": "16.4.0",
|
||||||
"jiti": "2.5.1",
|
"jiti": "2.5.1",
|
||||||
"prettier": "3.6.2",
|
"prettier": "3.6.2",
|
||||||
|
"typescript": "5.9.2",
|
||||||
"typescript-eslint": "8.44.0"
|
"typescript-eslint": "8.44.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"dependencies": {
|
||||||
"typescript": "5.9.2"
|
"@techniker-me/logger": "0.0.15",
|
||||||
|
"@techniker-me/tools": "2025.0.16"
|
||||||
|
},
|
||||||
|
"author": {
|
||||||
|
"name": "Alexander Zinn",
|
||||||
|
"email": "zinntechniker@gmail.com",
|
||||||
|
"git+url": "https://github.com/zinntechniker"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/zinntechniker/websocket-relay-server"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/zinntechniker/websocket-relay-server",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/zinntechniker/websocket-relay-server/issues"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"websocket",
|
||||||
|
"relay",
|
||||||
|
"server"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.0.0",
|
||||||
|
"bun": ">=1.2.21"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
93
Web/bfcache/server/src/WebSocketServer.ts
Normal file
93
Web/bfcache/server/src/WebSocketServer.ts
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
import type {ServerWebSocket, WebSocketCompressor} from 'bun';
|
||||||
|
import type {Seconds, Bytes} from './types/Units';
|
||||||
|
|
||||||
|
export type PerMessageDeflate =
|
||||||
|
| boolean
|
||||||
|
| {
|
||||||
|
compress?: boolean | WebSocketCompressor;
|
||||||
|
decomporess?: boolean | WebSocketCompressor;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type WebSocketServerOptions = {
|
||||||
|
maxPayloadLength?: Bytes;
|
||||||
|
idleTimeout?: Seconds;
|
||||||
|
backPressureLimit?: Bytes;
|
||||||
|
closeOnBackPressureLimit?: boolean;
|
||||||
|
sendPings?: boolean;
|
||||||
|
publishToSelf?: boolean;
|
||||||
|
perMessageDeflate?: PerMessageDeflate;
|
||||||
|
onSocketError?: (client: ServerWebSocket, error: Error) => void;
|
||||||
|
onSocketOpen?: (client: ServerWebSocket) => void;
|
||||||
|
onSocketMessage?: (client: ServerWebSocket, message: string | ArrayBuffer | Uint8Array) => void;
|
||||||
|
onSocketDrain?: (client: ServerWebSocket) => void;
|
||||||
|
onSocketClose?: (client: ServerWebSocket) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const webSocketServerDefaults: WebSocketServerOptions = {
|
||||||
|
maxPayloadLength: 16777216,
|
||||||
|
idleTimeout: 120,
|
||||||
|
backPressureLimit: 1048576,
|
||||||
|
closeOnBackPressureLimit: false,
|
||||||
|
sendPings: true,
|
||||||
|
publishToSelf: true,
|
||||||
|
perMessageDeflate: true
|
||||||
|
};
|
||||||
|
|
||||||
|
export default class WebSocketServer {
|
||||||
|
private readonly _maxPayloadLength: Bytes;
|
||||||
|
private readonly _idleTimeout: Seconds;
|
||||||
|
private readonly _backPressureLimit: Bytes;
|
||||||
|
private readonly _closeOnBackPressureLimit: boolean;
|
||||||
|
private readonly _sendPings: boolean;
|
||||||
|
private readonly _publishToSelf: boolean;
|
||||||
|
private readonly _perMessageDeflate: PerMessageDeflate;
|
||||||
|
|
||||||
|
public readonly error?: (client: ServerWebSocket, error: Error) => void;
|
||||||
|
public readonly open?: (client: ServerWebSocket) => void;
|
||||||
|
public readonly message?: (client: ServerWebSocket, message: string | ArrayBuffer | Uint8Array) => void;
|
||||||
|
public readonly drain?: (client: ServerWebSocket) => void;
|
||||||
|
public readonly close?: (client: ServerWebSocket) => void;
|
||||||
|
|
||||||
|
constructor(options?: WebSocketServerOptions) {
|
||||||
|
this._maxPayloadLength = options?.maxPayloadLength ?? webSocketServerDefaults.maxPayloadLength!;
|
||||||
|
this._idleTimeout = options?.idleTimeout ?? webSocketServerDefaults.idleTimeout!;
|
||||||
|
this._backPressureLimit = options?.backPressureLimit ?? webSocketServerDefaults.backPressureLimit!;
|
||||||
|
this._closeOnBackPressureLimit = options?.closeOnBackPressureLimit ?? webSocketServerDefaults.closeOnBackPressureLimit!;
|
||||||
|
this._sendPings = options?.sendPings ?? webSocketServerDefaults.sendPings!;
|
||||||
|
this._publishToSelf = options?.publishToSelf ?? webSocketServerDefaults.publishToSelf!;
|
||||||
|
this._perMessageDeflate = options?.perMessageDeflate ?? webSocketServerDefaults.perMessageDeflate!;
|
||||||
|
this.error = options?.onSocketError;
|
||||||
|
this.open = options?.onSocketOpen;
|
||||||
|
this.message = options?.onSocketMessage;
|
||||||
|
this.drain = options?.onSocketDrain;
|
||||||
|
this.close = options?.onSocketClose;
|
||||||
|
}
|
||||||
|
|
||||||
|
get maxPayloadLength(): Bytes {
|
||||||
|
return this._maxPayloadLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
get idleTimeout(): Seconds {
|
||||||
|
return this._idleTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
get backPressureLimit(): Bytes {
|
||||||
|
return this._backPressureLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
get closeOnBackPressureLimit(): boolean {
|
||||||
|
return this._closeOnBackPressureLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
get sendPings(): boolean {
|
||||||
|
return this._sendPings;
|
||||||
|
}
|
||||||
|
|
||||||
|
get publishToSelf(): boolean {
|
||||||
|
return this._publishToSelf;
|
||||||
|
}
|
||||||
|
|
||||||
|
get perMessageDeflate(): PerMessageDeflate {
|
||||||
|
return this._perMessageDeflate;
|
||||||
|
}
|
||||||
|
}
|
||||||
1
Web/bfcache/server/src/index.ts
Normal file
1
Web/bfcache/server/src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
console.log('hello claris');
|
||||||
3
Web/bfcache/server/src/types/Units.ts
Normal file
3
Web/bfcache/server/src/types/Units.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export type Bytes = number;
|
||||||
|
|
||||||
|
export type Seconds = number;
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"allowImportingTsExtensions": true,
|
"allowImportingTsExtensions": true,
|
||||||
"verbatimModuleSyntax": true,
|
"verbatimModuleSyntax": false,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
|
|
||||||
"strict": true,
|
"strict": true,
|
||||||
|
|||||||
Reference in New Issue
Block a user