import { Observable, type OperatorFunction } from 'rxjs';
import { StreamEncoderHelper } from '../stream-helper/encoder.js';
import type { EncodeOptions } from '../options.js';

/** 流式编码 UBJSON */
export function encode(options?: EncodeOptions): OperatorFunction<unknown, Uint8Array> {
    return (observable) => {
        return new Observable<Uint8Array>((subscriber) => {
            const helper = new StreamEncoderHelper(options, (chunk: Uint8Array): void => subscriber.next(chunk));
            const sub = observable.subscribe({
                next(value) {
                    try {
                        helper.encode(value);
                    } catch (ex) {
                        subscriber.error(ex as Error);
                    }
                },
                error(err) {
                    subscriber.error(err);
                },
                complete() {
                    subscriber.complete();
                },
            });
            sub.add(() => helper.destroy());
            return sub;
        });
    };
}
