@natlibfi/sru-client
Version:
SRU Javascript client library
76 lines (75 loc) • 3.45 kB
JavaScript
import fs from "fs";
import yargs from "yargs";
import { handleInterrupt } from "@natlibfi/melinda-backend-commons";
import createSruClient from "./index";
run();
function run() {
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((args2) => {
const [query2] = args2._;
if (query2 === void 0) {
throw new Error("No query given");
}
return true;
}).parseSync();
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) {
recordCounter++;
console.log(`Record ${recordCounter}/${recordTotal}`);
if (showOutputRecord) {
console.log("Output:");
console.log(record);
}
const folder = "./results";
if (writeFiles) {
console.log(`Writing to file: ${folder}/${recordCounter}`);
prepareFolder(folder, recordCounter);
fs.writeFileSync(`${folder}/${recordCounter}`, JSON.stringify(record.toObject()));
return;
}
function prepareFolder(folder2, fileName) {
if (fs.existsSync(folder2)) {
if (overwriteFiles) {
return;
}
if (fs.existsSync(`${folder2}/${fileName}`)) {
throw new Error(`${folder2}/${fileName} allready exist`);
}
return;
}
fs.mkdirSync(folder2);
return;
}
}
function onEnd(nextRecordOffset) {
console.log("********** THE END **********");
console.log(`NextRecordOffset: ${nextRecordOffset}`);
console.log("********************");
}
function onError(err) {
console.log(`Error: ${err}`);
}
}
//# sourceMappingURL=cli.js.map