UNPKG

@natlibfi/sru-client

Version:
121 lines (100 loc) 3.85 kB
import fs from 'fs'; import yargs from 'yargs'; import {handleInterrupt} from '@natlibfi/melinda-backend-commons'; import createSruClient from './index'; run(); /* eslint-disable max-statements, no-console */ function run() { // const logger = createLogger(); process .on('SIGINT', handleInterrupt) .on('unhandledRejection', handleInterrupt) .on('uncaughtException', handleInterrupt); const args = yargs(process.argv.slice(2)) .scriptName('sru-cli') .wrap(yargs.terminalWidth()) .epilog('Copyright (C) 2025 University Of Helsinki (The National Library Of Finland)') .usage('Environment variable info in example.env') .usage('Installed globally: $0 <query> [options]') .usage('Not installed: npx $0 <query> [options]') .usage('Build from source: node dist/index.js <query> [options]') .showHelpOnFail(true) .example([ ['$ node dist/cli.js rec.id=001234567'], ['$ node dist/cli.js dc.title="malli" -s true'], ['$ node dist/cli.js <query>'] ]) .version() .env('SRU') .positional('query', {type: 'string', describe: 'sru query'}) .options({ s: {alias: 'showOutputRecord', type: 'boolean', default: false, describe: ''}, o: {alias: 'overwriteFiles', type: 'boolean', default: true, describe: ''}, a: {alias: 'retrieveAll', type: 'boolean', default: false, describe: 'Retrieve all record for query'}, r: {alias: 'recordSchema', type: 'marcxml', default: false, describe: 'Sru endpoint record schema'}, m: {alias: 'metadataFormat', type: 'string', default: 'string', describe: 'Record output schema (string (xml), object, marcJson)'}, w: {alias: 'writeFiles', type: 'boolean', default: false, describe: 'Record output as files'} }) .check((args) => { const [query] = args._; if (query === undefined) { throw new Error('No query given'); } return true; }) .parseSync(); // console.log(JSON.stringify(args)); const [query] = args._; const {url, showOutputRecord, writeFiles, retrieveAll, recordSchema, metadataFormat, overwriteFiles} = args; const sruClient = createSruClient({url, recordSchema, retrieveAll, metadataFormat}); let recordCounter = 0; let recordTotal = 0; sruClient.searchRetrieve(query) .on('total', onTotal) .on('record', onRecord) .on('end', onEnd) .on('error', onError); function onTotal(total) { recordTotal = total; console.log('********************'); console.log(`Query has total of ${total} records`); console.log('********************'); } function onRecord(record) { // eslint-disable-line // Comment: console.log(record); recordCounter++; //eslint-disable-line console.log(`Record ${recordCounter}/${recordTotal}`); if (showOutputRecord) { // eslint-disable-line console.log('Output:'); // eslint-disable-line console.log(record); // eslint-disable-line } const folder = './results'; if (writeFiles) { console.log(`Writing to file: ${folder}/${recordCounter}`); // eslint-disable-line prepareFolder(folder, recordCounter); fs.writeFileSync(`${folder}/${recordCounter}`, JSON.stringify(record.toObject())); return; } function prepareFolder(folder, fileName) { if (fs.existsSync(folder)) { if (overwriteFiles) { return; } if (fs.existsSync(`${folder}/${fileName}`)) { throw new Error(`${folder}/${fileName} allready exist`); } return; } fs.mkdirSync(folder); return; } } function onEnd(nextRecordOffset) { console.log('********** THE END **********'); console.log(`NextRecordOffset: ${nextRecordOffset}`); console.log('********************'); } function onError(err) { console.log(`Error: ${err}`); } }