mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-01-16 19:32:08 +01:00
Compare commits
5 Commits
71c8aff125
...
codex/modi
| Author | SHA1 | Date | |
|---|---|---|---|
|
bb078b4d6a
|
|||
| 33577bb2d5 | |||
| adea8ae6b7 | |||
| ef8601dd72 | |||
| 5aaca6de99 |
2
.github/workflows/playwright.yml
vendored
2
.github/workflows/playwright.yml
vendored
@ -1,4 +1,6 @@
|
|||||||
name: Playwright Tests
|
name: Playwright Tests
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main, master]
|
branches: [main, master]
|
||||||
|
|||||||
17
src/index.ts
17
src/index.ts
@ -3,11 +3,13 @@
|
|||||||
|
|
||||||
import { PrismaClient } from '@prisma/client';
|
import { PrismaClient } from '@prisma/client';
|
||||||
import { PrismaD1 } from '@prisma/adapter-d1';
|
import { PrismaD1 } from '@prisma/adapter-d1';
|
||||||
|
import { formatError } from './utils/error';
|
||||||
|
|
||||||
export interface Env {
|
export interface Env {
|
||||||
DB: D1Database;
|
DB: D1Database;
|
||||||
NEXTAUTH_SECRET?: string;
|
NEXTAUTH_SECRET?: string;
|
||||||
NEXTAUTH_URL?: string;
|
NEXTAUTH_URL?: string;
|
||||||
|
WORKER_ENV?: string; // 'development' | 'production'
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -208,21 +210,22 @@ export default {
|
|||||||
});
|
});
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Worker error:', error);
|
console.error('Worker error:', error); // Log full error details, including stack trace
|
||||||
|
|
||||||
|
// Use the formatError utility to properly format the error response
|
||||||
|
const errorPayload = formatError(error, env);
|
||||||
|
|
||||||
return new Response(
|
return new Response(
|
||||||
JSON.stringify({
|
JSON.stringify(errorPayload),
|
||||||
error: 'Internal Server Error',
|
|
||||||
message: error instanceof Error ? error.message : 'Unknown error',
|
|
||||||
stack: error instanceof Error ? error.stack : undefined
|
|
||||||
}),
|
|
||||||
{
|
{
|
||||||
status: 500,
|
status: 500,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Access-Control-Allow-Origin': '*'
|
'Access-Control-Allow-Origin': '*'
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
16
src/utils/error.ts
Normal file
16
src/utils/error.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
export function formatError(error: unknown, env?: { WORKER_ENV?: string }): Record<string, unknown> {
|
||||||
|
const payload: Record<string, unknown> = {
|
||||||
|
error: 'Internal Server Error',
|
||||||
|
message: error instanceof Error ? error.message : 'Unknown error'
|
||||||
|
};
|
||||||
|
|
||||||
|
// Only include stack trace in development environment
|
||||||
|
// In Cloudflare Workers, check environment via env parameter
|
||||||
|
const isDevelopment = env?.WORKER_ENV !== 'production';
|
||||||
|
|
||||||
|
if (isDevelopment) {
|
||||||
|
payload.stack = error instanceof Error ? error.stack : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
36
tests/formatError.test.ts
Normal file
36
tests/formatError.test.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { test } from 'node:test';
|
||||||
|
import assert from 'node:assert';
|
||||||
|
import { formatError } from '../src/utils/error';
|
||||||
|
|
||||||
|
const originalEnv = process.env.NODE_ENV;
|
||||||
|
|
||||||
|
test('includes stack when not in production', () => {
|
||||||
|
const err = new Error('boom');
|
||||||
|
const payload = formatError(err, { WORKER_ENV: 'development' });
|
||||||
|
assert.ok('stack' in payload);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('omits stack in production', () => {
|
||||||
|
const err = new Error('boom');
|
||||||
|
const payload = formatError(err, { WORKER_ENV: 'production' });
|
||||||
|
assert.ok(!('stack' in payload));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('includes message for all environments', () => {
|
||||||
|
const err = new Error('boom');
|
||||||
|
const devPayload = formatError(err, { WORKER_ENV: 'development' });
|
||||||
|
const prodPayload = formatError(err, { WORKER_ENV: 'production' });
|
||||||
|
|
||||||
|
assert.strictEqual(devPayload.message, 'boom');
|
||||||
|
assert.strictEqual(prodPayload.message, 'boom');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('handles non-Error objects', () => {
|
||||||
|
const payload = formatError('string error', { WORKER_ENV: 'development' });
|
||||||
|
assert.strictEqual(payload.message, 'Unknown error');
|
||||||
|
assert.strictEqual(payload.error, 'Internal Server Error');
|
||||||
|
});
|
||||||
|
|
||||||
|
test.after(() => {
|
||||||
|
if (originalEnv === undefined) delete process.env.NODE_ENV; else process.env.NODE_ENV = originalEnv;
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user