All files / src/PerfectWSAdvanced/transform TransformAbortSignal.ts

96.96% Statements 32/33
100% Branches 13/13
100% Functions 6/6
96.96% Lines 32/33

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 432x 2x     2x   2x 1292x   2x 2911x 12x 12x 1x   12x   12x 2911x 2911x   2x 2995x 2995x 2995x 2995x 2995x 2995x   2x 14784x 14769x 14769x   15x 15x 1x 15x   15x 14784x 2x  
import { transformSendDeserializeType, transformSendRecursive } from './utils/changeType.js';
import { v4 as uuid } from 'uuid';
import { NetworkEventListener } from '../../utils/NetworkEventListener.js';
 
export class TransformAbortSignal {
 
    constructor(private _events: NetworkEventListener, private _maxDepth: number = 100) {
    }
 
    deserialize(data: any) {
        return transformSendDeserializeType(data, 'abortSignal', found => {
            const abortController = new AbortController();
            this._events.once(`___abortSignal.aborted.${found.signalId}`, (source, { reason }) => {
                if (source === 'local') return;
                abortController.abort(reason);
            });
 
            return abortController.signal;
        }, this._maxDepth);
    }
 
    serialize(obj: any) {
        return transformSendRecursive(obj, {
            maxDepth: this._maxDepth,
            processingDataType: (data) => typeof data === 'object' && data !== null,
            transformData: (data) => this._serializeAbortSignal(data)
        });
    }
 
    private _serializeAbortSignal(signal: any) {
        if (!(signal instanceof AbortSignal)) {
            return null;
        }
 
        const signalId = uuid();
        signal.addEventListener('abort', () => {
            this._events.emit(`___abortSignal.aborted.${signalId}`, { reason: signal.reason });
        });
 
        return { ___type: 'abortSignal', signalId };
    }
}