mirror of
https://github.com/hanzoai/chat.git
synced 2026-09-30 20:51:17 +00:00
Forks the internal @librechat/api workspace package (packages/api) to @hanzochat/api, matching the app package @hanzochat/chat. De-LibreChats the package name and puts its build under our control. Fixes the live prod bug where the deployed chat image shipped a stale @librechat/api/dist missing the exported handleError(), breaking every error path with "handleError is not a function" and killing the SSE stream. A clean build of @hanzochat/api produces dist/index.js that exports handleError (verified: exports.handleError = handleError). - packages/api/package.json: name @librechat/api -> @hanzochat/api - 254 source/config/doc/lockfile sites: @librechat/api -> @hanzochat/api (api/, packages/, config/, turbo.json, pnpm-lock.yaml, bun.lock, package-lock.json, LLM.md) - @librechat/api-client (distinct MCP client id string) left untouched - other @librechat/* packages (client, data-schemas, data-provider) left as-is per scope pnpm install (regenerated lockfile) + build:api green; dist exports handleError. api/data-schemas/client packages build; full build:packages and api test:ci are blocked by a PRE-EXISTING, unrelated upstream break in librechat-data-provider (config.spec.ts / cloudfront-config.spec.ts reference exports that src/config.ts no longer has) -- out of scope here.
92 lines
2.5 KiB
JavaScript
92 lines
2.5 KiB
JavaScript
describe('telemetry bootstrap', () => {
|
|
const originalEnv = process.env;
|
|
|
|
beforeEach(() => {
|
|
jest.resetModules();
|
|
process.env = { ...originalEnv };
|
|
delete process.env.OTEL_SDK_DISABLED;
|
|
delete process.env.OTEL_TRACING_ENABLED;
|
|
jest.doMock('dotenv', () => ({
|
|
config: jest.fn(),
|
|
}));
|
|
});
|
|
|
|
afterEach(() => {
|
|
process.env = originalEnv;
|
|
jest.dontMock('dotenv');
|
|
jest.dontMock('@hanzochat/api/telemetry');
|
|
jest.resetModules();
|
|
});
|
|
|
|
it('does not load OpenTelemetry packages by default', () => {
|
|
jest.doMock(
|
|
'@hanzochat/api/telemetry',
|
|
() => {
|
|
throw new Error('telemetry package should not load when tracing is disabled');
|
|
},
|
|
{ virtual: true },
|
|
);
|
|
|
|
const telemetry = require('./telemetry');
|
|
|
|
expect(telemetry.enabled).toBe(false);
|
|
expect(telemetry.status).toBe('disabled');
|
|
});
|
|
|
|
it('does not load OpenTelemetry packages when the SDK is disabled', () => {
|
|
process.env.OTEL_SDK_DISABLED = 'true';
|
|
process.env.OTEL_TRACING_ENABLED = 'true';
|
|
jest.doMock(
|
|
'@hanzochat/api/telemetry',
|
|
() => {
|
|
throw new Error('telemetry package should not load when the SDK is disabled');
|
|
},
|
|
{ virtual: true },
|
|
);
|
|
|
|
const telemetry = require('./telemetry');
|
|
|
|
expect(telemetry.enabled).toBe(false);
|
|
expect(telemetry.status).toBe('disabled');
|
|
});
|
|
|
|
it('loads and exposes telemetry middleware when tracing is enabled', () => {
|
|
process.env.OTEL_TRACING_ENABLED = 'true';
|
|
let enabled = true;
|
|
let status = 'starting';
|
|
const telemetryMiddleware = jest.fn();
|
|
const telemetryErrorMiddleware = jest.fn();
|
|
const initializeTelemetry = jest.fn(() => ({
|
|
get enabled() {
|
|
return enabled;
|
|
},
|
|
get status() {
|
|
return status;
|
|
},
|
|
shutdown: jest.fn(),
|
|
}));
|
|
jest.doMock(
|
|
'@hanzochat/api/telemetry',
|
|
() => ({
|
|
initializeTelemetry,
|
|
telemetryMiddleware,
|
|
telemetryErrorMiddleware,
|
|
}),
|
|
{ virtual: true },
|
|
);
|
|
|
|
const telemetry = require('./telemetry');
|
|
|
|
expect(initializeTelemetry).toHaveBeenCalledTimes(1);
|
|
expect(telemetry.enabled).toBe(true);
|
|
expect(telemetry.status).toBe('starting');
|
|
expect(telemetry.telemetryMiddleware).toBe(telemetryMiddleware);
|
|
expect(telemetry.telemetryErrorMiddleware).toBe(telemetryErrorMiddleware);
|
|
|
|
enabled = false;
|
|
status = 'failed';
|
|
expect(telemetry.enabled).toBe(false);
|
|
expect(telemetry.status).toBe('failed');
|
|
});
|
|
});
|