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 2881x 12x 12x 1x   12x   12x 2881x 2881x   2x 2965x 2965x 2965x 2965x 2965x 2965x   2x 14692x 14677x 14677x   15x 15x 1x 15x   15x 14692x 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 };
    }
}