"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AIGNEObserver = void 0;
const api_1 = require("@opentelemetry/api");
const db_path_js_1 = __importDefault(require("../core/db-path.js"));
const type_js_1 = require("../core/type.js");
const util_js_1 = require("../core/util.js");
const init_js_1 = require("../opentelemetry/instrument/init.js");
class AIGNEObserver {
    storage;
    tracer = api_1.trace.getTracer("aigne-tracer");
    processor;
    exporter;
    sdk;
    sdkServerStarted;
    static exportFn;
    static setExportFn(exportFn) {
        AIGNEObserver.exportFn = exportFn;
    }
    static updateFn;
    static setUpdateFn(updateFn) {
        AIGNEObserver.updateFn = updateFn;
    }
    constructor(options) {
        const parsed = type_js_1.AIGNEObserverOptionsSchema.parse(options);
        this.storage = parsed?.storage ?? (!util_js_1.isBlocklet ? (0, db_path_js_1.default)() : undefined);
    }
    async serve() {
        this.sdkServerStarted ??= this._serve();
        return this.sdkServerStarted;
    }
    async _serve() {
        if (!this.storage && !util_js_1.isBlocklet) {
            throw new Error("Server storage is not configured");
        }
        const { sdk, spanProcessor, traceExporter } = await (0, init_js_1.initOpenTelemetry)({
            dbPath: this.storage,
            exportFn: AIGNEObserver.exportFn,
            updateFn: AIGNEObserver.updateFn,
        });
        this.sdk = sdk;
        this.processor = spanProcessor;
        this.exporter = traceExporter;
    }
    async flush(span) {
        await this.processor?.onEnd(span);
        await this.processor?.forceFlush();
    }
    async update(id, data) {
        await this.exporter?.update(id, data);
    }
    async close() {
        try {
            // Shutdown processor
            await this.processor?.shutdown();
            // Shutdown exporter
            await this.exporter?.shutdown();
            // Shutdown SDK
            await this.sdk?.shutdown();
        }
        catch (error) {
            console.error("[Observability] Error during shutdown:", error);
        }
    }
}
exports.AIGNEObserver = AIGNEObserver;
