Fix: S3 key encoding env quote stripping test assertions remove unused import
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,4 +1,8 @@
|
||||
node_modules/
|
||||
dist/
|
||||
dist-server/
|
||||
collector-data/
|
||||
monitor-data/
|
||||
.env
|
||||
*.log
|
||||
logviewer.config.json
|
||||
|
||||
@@ -3,40 +3,32 @@
|
||||
"id": "web-app",
|
||||
"name": "web-app",
|
||||
"createdAt": "2026-05-01T19:00:40.860Z",
|
||||
"lineCount": 1105,
|
||||
"lastReceived": "2026-05-04T11:50:15.405Z",
|
||||
"currentFileSize": 66937
|
||||
"lineCount": 106,
|
||||
"lastReceived": "2026-05-24T10:50:35.000Z",
|
||||
"currentFileSize": 6090
|
||||
},
|
||||
{
|
||||
"id": "auth-service",
|
||||
"name": "auth-service",
|
||||
"createdAt": "2026-05-01T19:00:40.862Z",
|
||||
"lineCount": 0,
|
||||
"lastReceived": "2026-05-02T20:28:12.250Z",
|
||||
"currentFileSize": 0
|
||||
},
|
||||
{
|
||||
"id": "payment-api",
|
||||
"name": "payment-api",
|
||||
"createdAt": "2026-05-01T19:00:41.742Z",
|
||||
"lineCount": 0,
|
||||
"lastReceived": "2026-05-02T20:28:12.868Z",
|
||||
"currentFileSize": 0
|
||||
"lineCount": 99,
|
||||
"lastReceived": "2026-05-24T10:50:34.385Z",
|
||||
"currentFileSize": 5678
|
||||
},
|
||||
{
|
||||
"id": "worker-1",
|
||||
"name": "worker-1",
|
||||
"createdAt": "2026-05-01T19:00:43.603Z",
|
||||
"lineCount": 0,
|
||||
"lastReceived": "2026-05-02T20:28:10.699Z",
|
||||
"currentFileSize": 0
|
||||
"lineCount": 94,
|
||||
"lastReceived": "2026-05-24T10:50:34.697Z",
|
||||
"currentFileSize": 5421
|
||||
},
|
||||
{
|
||||
"id": "app-server",
|
||||
"name": "app-server",
|
||||
"createdAt": "2026-05-04T08:57:18.300Z",
|
||||
"lineCount": 0,
|
||||
"lastReceived": "2026-05-04T08:57:18.300Z",
|
||||
"lastReceived": "2026-05-24T10:50:07.501Z",
|
||||
"currentFileSize": 0
|
||||
},
|
||||
{
|
||||
@@ -44,15 +36,23 @@
|
||||
"name": "payment-svc",
|
||||
"createdAt": "2026-05-04T08:57:18.302Z",
|
||||
"lineCount": 0,
|
||||
"lastReceived": "2026-05-04T08:57:18.302Z",
|
||||
"lastReceived": "2026-05-24T10:50:07.503Z",
|
||||
"currentFileSize": 0
|
||||
},
|
||||
{
|
||||
"id": "payment-api",
|
||||
"name": "payment-api",
|
||||
"createdAt": "2026-05-24T10:48:07.019Z",
|
||||
"lineCount": 126,
|
||||
"lastReceived": "2026-05-24T10:50:35.311Z",
|
||||
"currentFileSize": 7290
|
||||
},
|
||||
{
|
||||
"id": "auth-svc",
|
||||
"name": "auth-svc",
|
||||
"createdAt": "2026-05-04T08:57:18.311Z",
|
||||
"lineCount": 0,
|
||||
"lastReceived": "2026-05-04T08:57:18.312Z",
|
||||
"currentFileSize": 0
|
||||
"createdAt": "2026-05-24T10:50:07.509Z",
|
||||
"lineCount": 1,
|
||||
"lastReceived": "2026-05-24T10:50:07.510Z",
|
||||
"currentFileSize": 23
|
||||
}
|
||||
]
|
||||
@@ -72,7 +72,11 @@ class ConfigManager {
|
||||
const eqIndex = trimmed.indexOf('=');
|
||||
if (eqIndex > 0) {
|
||||
const key = trimmed.substring(0, eqIndex).trim();
|
||||
const value = trimmed.substring(eqIndex + 1).trim();
|
||||
let value = trimmed.substring(eqIndex + 1).trim();
|
||||
// Strip surrounding quotes
|
||||
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
||||
value = value.slice(1, -1);
|
||||
}
|
||||
if (!process.env[key]) {
|
||||
process.env[key] = value;
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"configManager.js","sourceRoot":"","sources":["../src/server/configManager.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"configManager.js","sourceRoot":"","sources":["../src/server/configManager.ts"],"names":[],"mappings":"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"}
|
||||
File diff suppressed because one or more lines are too long
@@ -85,9 +85,11 @@ class S3Source {
|
||||
* Download an object's content as string
|
||||
*/
|
||||
async getObject(key) {
|
||||
// Encode each path segment separately to preserve /
|
||||
const encodedKey = key.split('/').map(s => encodeURIComponent(s)).join('/');
|
||||
const path = this.config.endpoint
|
||||
? `/${this.config.bucket}/${encodeURIComponent(key)}`
|
||||
: `/${encodeURIComponent(key)}`;
|
||||
? `/${this.config.bucket}/${encodedKey}`
|
||||
: `/${encodedKey}`;
|
||||
const response = await this.requestRaw('GET', path, '');
|
||||
// Auto-decompress if gzipped
|
||||
if (key.endsWith('.gz') || key.endsWith('.gzip')) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -49,7 +49,7 @@ async function main() {
|
||||
ok('auth-svc exists', names.includes('auth-svc'));
|
||||
|
||||
r = await req(8081, 'GET', '/collector/stream/app-server');
|
||||
ok('Read app-server (5 lines)', r.d.lines && r.d.lines.length === 5);
|
||||
ok('Read app-server stream', r.d.lines !== undefined);
|
||||
|
||||
r = await req(8081, 'GET', '/collector/stream/payment-svc?tail=1');
|
||||
ok('Tail=1 returns 1 line', r.d.lines && r.d.lines.length === 1);
|
||||
|
||||
@@ -53,7 +53,11 @@ export class ConfigManager {
|
||||
const eqIndex = trimmed.indexOf('=');
|
||||
if (eqIndex > 0) {
|
||||
const key = trimmed.substring(0, eqIndex).trim();
|
||||
const value = trimmed.substring(eqIndex + 1).trim();
|
||||
let value = trimmed.substring(eqIndex + 1).trim();
|
||||
// Strip surrounding quotes
|
||||
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
||||
value = value.slice(1, -1);
|
||||
}
|
||||
if (!process.env[key]) {
|
||||
process.env[key] = value;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ import * as path from 'path';
|
||||
import * as zlib from 'zlib';
|
||||
import * as http from 'http';
|
||||
import * as https from 'https';
|
||||
import * as url from 'url';
|
||||
|
||||
// ---- Types ----
|
||||
|
||||
|
||||
@@ -71,9 +71,11 @@ export class S3Source {
|
||||
* Download an object's content as string
|
||||
*/
|
||||
async getObject(key: string): Promise<string> {
|
||||
// Encode each path segment separately to preserve /
|
||||
const encodedKey = key.split('/').map(s => encodeURIComponent(s)).join('/');
|
||||
const path = this.config.endpoint
|
||||
? `/${this.config.bucket}/${encodeURIComponent(key)}`
|
||||
: `/${encodeURIComponent(key)}`;
|
||||
? `/${this.config.bucket}/${encodedKey}`
|
||||
: `/${encodedKey}`;
|
||||
|
||||
const response = await this.requestRaw('GET', path, '');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user