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/
|
node_modules/
|
||||||
dist/
|
dist/
|
||||||
|
dist-server/
|
||||||
|
collector-data/
|
||||||
|
monitor-data/
|
||||||
.env
|
.env
|
||||||
*.log
|
*.log
|
||||||
|
logviewer.config.json
|
||||||
|
|||||||
@@ -3,40 +3,32 @@
|
|||||||
"id": "web-app",
|
"id": "web-app",
|
||||||
"name": "web-app",
|
"name": "web-app",
|
||||||
"createdAt": "2026-05-01T19:00:40.860Z",
|
"createdAt": "2026-05-01T19:00:40.860Z",
|
||||||
"lineCount": 1105,
|
"lineCount": 106,
|
||||||
"lastReceived": "2026-05-04T11:50:15.405Z",
|
"lastReceived": "2026-05-24T10:50:35.000Z",
|
||||||
"currentFileSize": 66937
|
"currentFileSize": 6090
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "auth-service",
|
"id": "auth-service",
|
||||||
"name": "auth-service",
|
"name": "auth-service",
|
||||||
"createdAt": "2026-05-01T19:00:40.862Z",
|
"createdAt": "2026-05-01T19:00:40.862Z",
|
||||||
"lineCount": 0,
|
"lineCount": 99,
|
||||||
"lastReceived": "2026-05-02T20:28:12.250Z",
|
"lastReceived": "2026-05-24T10:50:34.385Z",
|
||||||
"currentFileSize": 0
|
"currentFileSize": 5678
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "payment-api",
|
|
||||||
"name": "payment-api",
|
|
||||||
"createdAt": "2026-05-01T19:00:41.742Z",
|
|
||||||
"lineCount": 0,
|
|
||||||
"lastReceived": "2026-05-02T20:28:12.868Z",
|
|
||||||
"currentFileSize": 0
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "worker-1",
|
"id": "worker-1",
|
||||||
"name": "worker-1",
|
"name": "worker-1",
|
||||||
"createdAt": "2026-05-01T19:00:43.603Z",
|
"createdAt": "2026-05-01T19:00:43.603Z",
|
||||||
"lineCount": 0,
|
"lineCount": 94,
|
||||||
"lastReceived": "2026-05-02T20:28:10.699Z",
|
"lastReceived": "2026-05-24T10:50:34.697Z",
|
||||||
"currentFileSize": 0
|
"currentFileSize": 5421
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "app-server",
|
"id": "app-server",
|
||||||
"name": "app-server",
|
"name": "app-server",
|
||||||
"createdAt": "2026-05-04T08:57:18.300Z",
|
"createdAt": "2026-05-04T08:57:18.300Z",
|
||||||
"lineCount": 0,
|
"lineCount": 0,
|
||||||
"lastReceived": "2026-05-04T08:57:18.300Z",
|
"lastReceived": "2026-05-24T10:50:07.501Z",
|
||||||
"currentFileSize": 0
|
"currentFileSize": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -44,15 +36,23 @@
|
|||||||
"name": "payment-svc",
|
"name": "payment-svc",
|
||||||
"createdAt": "2026-05-04T08:57:18.302Z",
|
"createdAt": "2026-05-04T08:57:18.302Z",
|
||||||
"lineCount": 0,
|
"lineCount": 0,
|
||||||
"lastReceived": "2026-05-04T08:57:18.302Z",
|
"lastReceived": "2026-05-24T10:50:07.503Z",
|
||||||
"currentFileSize": 0
|
"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",
|
"id": "auth-svc",
|
||||||
"name": "auth-svc",
|
"name": "auth-svc",
|
||||||
"createdAt": "2026-05-04T08:57:18.311Z",
|
"createdAt": "2026-05-24T10:50:07.509Z",
|
||||||
"lineCount": 0,
|
"lineCount": 1,
|
||||||
"lastReceived": "2026-05-04T08:57:18.312Z",
|
"lastReceived": "2026-05-24T10:50:07.510Z",
|
||||||
"currentFileSize": 0
|
"currentFileSize": 23
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -72,7 +72,11 @@ class ConfigManager {
|
|||||||
const eqIndex = trimmed.indexOf('=');
|
const eqIndex = trimmed.indexOf('=');
|
||||||
if (eqIndex > 0) {
|
if (eqIndex > 0) {
|
||||||
const key = trimmed.substring(0, eqIndex).trim();
|
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]) {
|
if (!process.env[key]) {
|
||||||
process.env[key] = value;
|
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
|
* Download an object's content as string
|
||||||
*/
|
*/
|
||||||
async getObject(key) {
|
async getObject(key) {
|
||||||
|
// Encode each path segment separately to preserve /
|
||||||
|
const encodedKey = key.split('/').map(s => encodeURIComponent(s)).join('/');
|
||||||
const path = this.config.endpoint
|
const path = this.config.endpoint
|
||||||
? `/${this.config.bucket}/${encodeURIComponent(key)}`
|
? `/${this.config.bucket}/${encodedKey}`
|
||||||
: `/${encodeURIComponent(key)}`;
|
: `/${encodedKey}`;
|
||||||
const response = await this.requestRaw('GET', path, '');
|
const response = await this.requestRaw('GET', path, '');
|
||||||
// Auto-decompress if gzipped
|
// Auto-decompress if gzipped
|
||||||
if (key.endsWith('.gz') || key.endsWith('.gzip')) {
|
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'));
|
ok('auth-svc exists', names.includes('auth-svc'));
|
||||||
|
|
||||||
r = await req(8081, 'GET', '/collector/stream/app-server');
|
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');
|
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);
|
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('=');
|
const eqIndex = trimmed.indexOf('=');
|
||||||
if (eqIndex > 0) {
|
if (eqIndex > 0) {
|
||||||
const key = trimmed.substring(0, eqIndex).trim();
|
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]) {
|
if (!process.env[key]) {
|
||||||
process.env[key] = value;
|
process.env[key] = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import * as path from 'path';
|
|||||||
import * as zlib from 'zlib';
|
import * as zlib from 'zlib';
|
||||||
import * as http from 'http';
|
import * as http from 'http';
|
||||||
import * as https from 'https';
|
import * as https from 'https';
|
||||||
import * as url from 'url';
|
|
||||||
|
|
||||||
// ---- Types ----
|
// ---- Types ----
|
||||||
|
|
||||||
|
|||||||
@@ -71,9 +71,11 @@ export class S3Source {
|
|||||||
* Download an object's content as string
|
* Download an object's content as string
|
||||||
*/
|
*/
|
||||||
async getObject(key: string): Promise<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
|
const path = this.config.endpoint
|
||||||
? `/${this.config.bucket}/${encodeURIComponent(key)}`
|
? `/${this.config.bucket}/${encodedKey}`
|
||||||
: `/${encodeURIComponent(key)}`;
|
: `/${encodedKey}`;
|
||||||
|
|
||||||
const response = await this.requestRaw('GET', path, '');
|
const response = await this.requestRaw('GET', path, '');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user