All files / sportident-testbench-shell/src/commands getHolder.ts

6.25% Statements 3/48
0% Branches 0/14
0% Functions 0/12
6.25% Lines 3/48

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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81        1x 1x   1x                                                                                                                                                  
import * as utils from 'sportident/lib/utils';
import {ISiCard} from 'sportident/lib/SiCard/ISiCard';
import {SiMainStationSiCardInsertedEvent, SiMainStationSiCardRemovedEvent} from 'sportident/lib/SiStation/ISiMainStation';
import {ShellCommandContext} from '../Shell';
import {BaseCommand, ArgType} from './BaseCommand';
import {SiMainStation} from 'sportident/lib/SiStation';
 
export class GetHolderCommand extends BaseCommand {
    getArgTypes(): ArgType[] {
        return [];
    }
 
    printUsage(context: ShellCommandContext): void {
        super.printUsage(context);
        context.putString('e.g. getHolder\n');
    }
 
    run(context: ShellCommandContext): Promise<void> {
        const device = context.env.device;
        Iif (!device) {
            return Promise.reject(new Error('No device.'));
        }
        const mainStation = SiMainStation.fromSiDevice(device);
        Iif (mainStation === undefined) {
            context.putString('No such station\n');
            return Promise.resolve();
        }
 
        const resetCardCallbacks = () => {
            mainStation.removeAllEventListeners();
        };
        let currentReject: (() => void)|undefined = undefined;
        context.waitChar().then((char: number) => {
            Iif (char === 27 || char === 3) { // Escape || Ctrl-C
                resetCardCallbacks();
                Iif (currentReject !== undefined) {
                    currentReject();
                }
            }
        });
 
        return mainStation.atomically(() => {
            mainStation.setInfo('autoSend', false);
            mainStation.setInfo('mode', 'Readout');
            mainStation.setInfo('code', 10);
        })
            .then(() => {
                context.putString('Insert card to read...\n');
                return new Promise((resolve, reject) => {
                    currentReject = reject;
                    resetCardCallbacks();
                    const handleCardRemoved: utils.EventCallback<SiMainStationSiCardRemovedEvent> =
                        (removeEvent) => {
                            const card = removeEvent.siCard;
                            console.debug(`Removed card: ${card.constructor.name} ${card.cardNumber}`);
                            resetCardCallbacks();
                            currentReject = undefined;
                            setTimeout(resolve, 1);
                        };
                    const handleCardRead = (card: ISiCard) => {
                        context.putString(`${card.constructor.name} ${card.cardNumber} read.\n`);
                        const cardHolder = card.storage.get('cardHolder')?.value ?? {};
                        Object.keys(cardHolder).forEach((key) => {
                            context.putString(`${key}: ${cardHolder[key]}\n`);
                        });
                        card.confirm();
                        context.putString('Remove card...\n');
                        mainStation.addEventListener('siCardRemoved', handleCardRemoved);
                    };
                    const handleCardInserted: utils.EventCallback<SiMainStationSiCardInsertedEvent> = (cardEvent) => {
                        const card = cardEvent.siCard;
                        context.putString(`Reading ${card.constructor.name} ${card.cardNumber}...\n`);
                        card.read()
                            .then(handleCardRead);
                    };
                    mainStation.addEventListener('siCardInserted', handleCardInserted);
                });
            });
    }
}