iobroker.beszel 0.2.5 → 0.2.6

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/README.md CHANGED
@@ -122,8 +122,11 @@ beszel.0.
122
122
 
123
123
  ## Changelog
124
124
 
125
+ ### 0.2.6 (2026-04-08)
126
+ - Use `node:` prefix for built-in modules (http, https, url)
127
+
125
128
  ### 0.2.5 (2026-04-08)
126
- - Restore standard GitHub-based tests, remove CHANGELOG.md, add FORBIDDEN_CHARS reference, fix Dependabot cooldown
129
+ - Restore standard GitHub-based tests, remove CHANGELOG.md, add FORBIDDEN_CHARS reference
127
130
 
128
131
  ### 0.2.4 (2026-04-05)
129
132
  - Cleaner log messages, remove redundant adapter name prefix
@@ -134,9 +137,6 @@ beszel.0.
134
137
  ### 0.2.2 (2026-04-03)
135
138
  - Modernize dev tooling (esbuild, TypeScript 5.9 pin, testing-action-check v2)
136
139
 
137
- ### 0.2.1 (2026-03-28)
138
- - Error deduplication, auth backoff, protect against empty system list deletion
139
-
140
140
  Older changelog: [CHANGELOG_OLD.md](CHANGELOG_OLD.md)
141
141
 
142
142
  ---
@@ -31,9 +31,9 @@ __export(beszel_client_exports, {
31
31
  BeszelClient: () => BeszelClient
32
32
  });
33
33
  module.exports = __toCommonJS(beszel_client_exports);
34
- var http = __toESM(require("http"));
35
- var https = __toESM(require("https"));
36
- var import_url = require("url");
34
+ var http = __toESM(require("node:http"));
35
+ var https = __toESM(require("node:https"));
36
+ var import_node_url = require("node:url");
37
37
  const TOKEN_REFRESH_MS = 23 * 60 * 60 * 1e3;
38
38
  class BeszelClient {
39
39
  baseUrl;
@@ -142,7 +142,7 @@ class BeszelClient {
142
142
  return new Promise((resolve, reject) => {
143
143
  let parsedUrl;
144
144
  try {
145
- parsedUrl = new import_url.URL(this.baseUrl + path);
145
+ parsedUrl = new import_node_url.URL(this.baseUrl + path);
146
146
  } catch {
147
147
  reject(new Error(`Invalid URL: ${this.baseUrl + path}`));
148
148
  return;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/beszel-client.ts"],
4
- "sourcesContent": ["import * as http from \"http\";\nimport * as https from \"https\";\nimport { URL } from \"url\";\nimport type {\n AuthResponse,\n BeszelContainer,\n BeszelSystem,\n BeszelSystemStats,\n PocketBaseList,\n SystemStats,\n} from \"./types.js\";\n\nconst TOKEN_REFRESH_MS = 23 * 60 * 60 * 1000; // 23 hours\n\n/**\n * HTTP client for the Beszel PocketBase REST API.\n * Uses only Node.js built-in http/https \u2014 no extra dependencies.\n */\nexport class BeszelClient {\n private readonly baseUrl: string;\n private readonly username: string;\n private readonly password: string;\n\n private token: string | null = null;\n private tokenTime = 0;\n\n /**\n * @param url Beszel Hub base URL, e.g. http://192.168.1.100:8090\n * @param username Login username\n * @param password Login password\n */\n constructor(url: string, username: string, password: string) {\n // Strip trailing slash\n this.baseUrl = url.replace(/\\/+$/, \"\");\n this.username = username;\n this.password = password;\n }\n\n /** Force token re-authentication on the next request */\n public invalidateToken(): void {\n this.token = null;\n this.tokenTime = 0;\n }\n\n /**\n * Test the connection to Beszel.\n * Returns { success: true } or { success: false, message: reason }.\n */\n public async checkConnection(): Promise<{\n success: boolean;\n message: string;\n }> {\n try {\n this.invalidateToken();\n await this.authenticate();\n return { success: true, message: \"Connected successfully\" };\n } catch (err) {\n return {\n success: false,\n message: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /** Fetch all systems */\n public async getSystems(): Promise<BeszelSystem[]> {\n await this.ensureToken();\n const data = await this.fetchJson<PocketBaseList<BeszelSystem>>(\n \"/api/collections/systems/records?perPage=200&sort=name\",\n );\n return data.items;\n }\n\n /**\n * Fetch the latest 1m stats per system.\n * Returns a Map<systemId, SystemStats>.\n *\n * @param systemIds List of system IDs to fetch stats for\n */\n public async getLatestStats(\n systemIds: string[],\n ): Promise<Map<string, SystemStats>> {\n if (systemIds.length === 0) {\n return new Map();\n }\n await this.ensureToken();\n const data = await this.fetchJson<PocketBaseList<BeszelSystemStats>>(\n \"/api/collections/system_stats/records?sort=-updated&perPage=200&filter=type%3D'1m'\",\n );\n\n // Deduplicate: keep the newest record per system\n const result = new Map<string, SystemStats>();\n for (const record of data.items) {\n if (!result.has(record.system)) {\n result.set(record.system, record.stats);\n }\n }\n return result;\n }\n\n /** Fetch all containers */\n public async getContainers(): Promise<BeszelContainer[]> {\n await this.ensureToken();\n const data = await this.fetchJson<PocketBaseList<BeszelContainer>>(\n \"/api/collections/containers/records?perPage=500&sort=system%2Cname\",\n );\n return data.items;\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private async ensureToken(): Promise<void> {\n const now = Date.now();\n if (this.token && now - this.tokenTime < TOKEN_REFRESH_MS) {\n return;\n }\n await this.authenticate();\n }\n\n private async authenticate(): Promise<void> {\n const body = JSON.stringify({\n identity: this.username,\n password: this.password,\n });\n\n const data = await this.request<AuthResponse>(\n \"POST\",\n \"/api/collections/users/auth-with-password\",\n body,\n null, // no auth token yet\n );\n\n this.token = data.token;\n this.tokenTime = Date.now();\n }\n\n private async fetchJson<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path, null, this.token);\n }\n\n private request<T>(\n method: string,\n path: string,\n body: string | null,\n token: string | null,\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(this.baseUrl + path);\n } catch {\n reject(new Error(`Invalid URL: ${this.baseUrl + path}`));\n return;\n }\n\n const isHttps = parsedUrl.protocol === \"https:\";\n const transport = isHttps ? https : http;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n if (token) {\n headers.Authorization = token;\n }\n if (body !== null) {\n headers[\"Content-Length\"] = Buffer.byteLength(body).toString();\n }\n\n const options: http.RequestOptions = {\n hostname: parsedUrl.hostname,\n port: parsedUrl.port || (isHttps ? 443 : 80),\n path: parsedUrl.pathname + parsedUrl.search,\n method,\n headers,\n timeout: 15000,\n };\n\n const req = transport.request(options, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (\n !res.statusCode ||\n res.statusCode < 200 ||\n res.statusCode >= 300\n ) {\n // Propagate 401 specifically so caller can re-auth\n const err = new Error(\n `HTTP ${res.statusCode ?? \"?\"}: ${raw.slice(0, 200)}`,\n );\n (err as NodeJS.ErrnoException).code =\n res.statusCode === 401 ? \"UNAUTHORIZED\" : \"HTTP_ERROR\";\n reject(err);\n return;\n }\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n reject(new Error(`Invalid JSON response from ${path}`));\n }\n });\n });\n\n req.on(\"timeout\", () => {\n req.destroy();\n reject(new Error(`Request to ${path} timed out`));\n });\n\n req.on(\"error\", (err) => reject(err));\n\n if (body !== null) {\n req.write(body);\n }\n req.end();\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as http from \"node:http\";\nimport * as https from \"node:https\";\nimport { URL } from \"node:url\";\nimport type {\n AuthResponse,\n BeszelContainer,\n BeszelSystem,\n BeszelSystemStats,\n PocketBaseList,\n SystemStats,\n} from \"./types.js\";\n\nconst TOKEN_REFRESH_MS = 23 * 60 * 60 * 1000; // 23 hours\n\n/**\n * HTTP client for the Beszel PocketBase REST API.\n * Uses only Node.js built-in http/https \u2014 no extra dependencies.\n */\nexport class BeszelClient {\n private readonly baseUrl: string;\n private readonly username: string;\n private readonly password: string;\n\n private token: string | null = null;\n private tokenTime = 0;\n\n /**\n * @param url Beszel Hub base URL, e.g. http://192.168.1.100:8090\n * @param username Login username\n * @param password Login password\n */\n constructor(url: string, username: string, password: string) {\n // Strip trailing slash\n this.baseUrl = url.replace(/\\/+$/, \"\");\n this.username = username;\n this.password = password;\n }\n\n /** Force token re-authentication on the next request */\n public invalidateToken(): void {\n this.token = null;\n this.tokenTime = 0;\n }\n\n /**\n * Test the connection to Beszel.\n * Returns { success: true } or { success: false, message: reason }.\n */\n public async checkConnection(): Promise<{\n success: boolean;\n message: string;\n }> {\n try {\n this.invalidateToken();\n await this.authenticate();\n return { success: true, message: \"Connected successfully\" };\n } catch (err) {\n return {\n success: false,\n message: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /** Fetch all systems */\n public async getSystems(): Promise<BeszelSystem[]> {\n await this.ensureToken();\n const data = await this.fetchJson<PocketBaseList<BeszelSystem>>(\n \"/api/collections/systems/records?perPage=200&sort=name\",\n );\n return data.items;\n }\n\n /**\n * Fetch the latest 1m stats per system.\n * Returns a Map<systemId, SystemStats>.\n *\n * @param systemIds List of system IDs to fetch stats for\n */\n public async getLatestStats(\n systemIds: string[],\n ): Promise<Map<string, SystemStats>> {\n if (systemIds.length === 0) {\n return new Map();\n }\n await this.ensureToken();\n const data = await this.fetchJson<PocketBaseList<BeszelSystemStats>>(\n \"/api/collections/system_stats/records?sort=-updated&perPage=200&filter=type%3D'1m'\",\n );\n\n // Deduplicate: keep the newest record per system\n const result = new Map<string, SystemStats>();\n for (const record of data.items) {\n if (!result.has(record.system)) {\n result.set(record.system, record.stats);\n }\n }\n return result;\n }\n\n /** Fetch all containers */\n public async getContainers(): Promise<BeszelContainer[]> {\n await this.ensureToken();\n const data = await this.fetchJson<PocketBaseList<BeszelContainer>>(\n \"/api/collections/containers/records?perPage=500&sort=system%2Cname\",\n );\n return data.items;\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private async ensureToken(): Promise<void> {\n const now = Date.now();\n if (this.token && now - this.tokenTime < TOKEN_REFRESH_MS) {\n return;\n }\n await this.authenticate();\n }\n\n private async authenticate(): Promise<void> {\n const body = JSON.stringify({\n identity: this.username,\n password: this.password,\n });\n\n const data = await this.request<AuthResponse>(\n \"POST\",\n \"/api/collections/users/auth-with-password\",\n body,\n null, // no auth token yet\n );\n\n this.token = data.token;\n this.tokenTime = Date.now();\n }\n\n private async fetchJson<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path, null, this.token);\n }\n\n private request<T>(\n method: string,\n path: string,\n body: string | null,\n token: string | null,\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(this.baseUrl + path);\n } catch {\n reject(new Error(`Invalid URL: ${this.baseUrl + path}`));\n return;\n }\n\n const isHttps = parsedUrl.protocol === \"https:\";\n const transport = isHttps ? https : http;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n if (token) {\n headers.Authorization = token;\n }\n if (body !== null) {\n headers[\"Content-Length\"] = Buffer.byteLength(body).toString();\n }\n\n const options: http.RequestOptions = {\n hostname: parsedUrl.hostname,\n port: parsedUrl.port || (isHttps ? 443 : 80),\n path: parsedUrl.pathname + parsedUrl.search,\n method,\n headers,\n timeout: 15000,\n };\n\n const req = transport.request(options, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (\n !res.statusCode ||\n res.statusCode < 200 ||\n res.statusCode >= 300\n ) {\n // Propagate 401 specifically so caller can re-auth\n const err = new Error(\n `HTTP ${res.statusCode ?? \"?\"}: ${raw.slice(0, 200)}`,\n );\n (err as NodeJS.ErrnoException).code =\n res.statusCode === 401 ? \"UNAUTHORIZED\" : \"HTTP_ERROR\";\n reject(err);\n return;\n }\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n reject(new Error(`Invalid JSON response from ${path}`));\n }\n });\n });\n\n req.on(\"timeout\", () => {\n req.destroy();\n reject(new Error(`Request to ${path} timed out`));\n });\n\n req.on(\"error\", (err) => reject(err));\n\n if (body !== null) {\n req.write(body);\n }\n req.end();\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "beszel",
4
- "version": "0.2.5",
4
+ "version": "0.2.6",
5
5
  "news": {
6
+ "0.2.6": {
7
+ "en": "Use node: prefix for built-in modules (S5043)",
8
+ "de": "node:-Präfix für eingebaute Module (S5043)",
9
+ "ru": "Префикс node: для встроенных модулей (S5043)",
10
+ "pt": "Prefixo node: para módulos nativos (S5043)",
11
+ "nl": "node: prefix voor ingebouwde modules (S5043)",
12
+ "fr": "Préfixe node: pour les modules natifs (S5043)",
13
+ "it": "Prefisso node: per moduli nativi (S5043)",
14
+ "es": "Prefijo node: para módulos nativos (S5043)",
15
+ "pl": "Prefiks node: dla wbudowanych modułów (S5043)",
16
+ "uk": "Префікс node: для вбудованих модулів (S5043)",
17
+ "zh-cn": "为内置模块使用node:前缀 (S5043)"
18
+ },
6
19
  "0.2.5": {
7
20
  "en": "Restore standard GitHub-based tests, remove CHANGELOG.md, add FORBIDDEN_CHARS reference, fix Dependabot cooldown",
8
21
  "de": "Standard GitHub-Tests wiederhergestellt, CHANGELOG.md entfernt, FORBIDDEN_CHARS-Referenz, Dependabot-Cooldown",
@@ -80,19 +93,6 @@
80
93
  "pl": "Metody timera adaptera, synchroniczne onUnload, zakładka O nas zintegrowana z Połączenie, CI Windows/macOS, pełny tekst licencji MIT w README",
81
94
  "uk": "Методи таймера адаптера, синхронний onUnload, вкладка Про програму об'єднана з Підключення, CI для Windows/macOS, повний текст ліцензії MIT в README",
82
95
  "zh-cn": "使用适配器定时器方法,同步onUnload,将关于标签合并到连接标签,添加Windows/macOS CI,README中完整MIT许可证文本"
83
- },
84
- "0.1.9": {
85
- "en": "Logging cleanup: stale system removal moved to debug level",
86
- "de": "Logging-Bereinigung: Entfernung veralteter Systeme auf Debug-Level verschoben",
87
- "ru": "Очистка логирования: удаление устаревших систем перенесено на уровень debug",
88
- "pt": "Limpeza de logging: remoção de sistemas obsoletos movida para nível debug",
89
- "nl": "Logging opruiming: verwijdering van verouderde systemen verplaatst naar debug-niveau",
90
- "fr": "Nettoyage du logging: suppression des systèmes obsolètes déplacée au niveau debug",
91
- "it": "Pulizia logging: rimozione di sistemi obsoleti spostata al livello debug",
92
- "es": "Limpieza de logging: eliminación de sistemas obsoletos movida al nivel debug",
93
- "pl": "Czyszczenie logowania: usuwanie przestarzałych systemów przeniesione na poziom debug",
94
- "uk": "Очищення логування: видалення застарілих систем переміщено на рівень debug",
95
- "zh-cn": "日志清理:将过期系统的删除移至debug级别"
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.beszel",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "ioBroker adapter for Beszel server monitoring",
5
5
  "author": {
6
6
  "name": "krobi",