npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

oclc-ncip

v1.0.1

Published

Toolkit to make NCIP requests using OCLC WorldShare Management Services

Downloads

10

Readme

oclc-ncip

Beta implementation of OCLC's WMS NCIP Services. Currently only supports Staff services, as the Patron services seem to require token authorization instead of a generic HMAC signature.

caveat

The XML response parser is pretty rudimentary, meaning: attributes/namespacing are ignored, repeating nodes aren't stored as arrays, and single tags (<example />) result in an empty object (see the below examples) with their parents as keys. Currently, this is best used for transactions that don't rely heavily on the bibliographic data returned by certain requests. Any help with this (or anything else, really) is greatly appreciated.

requires

  • OCLC WebService Key
  • principalID and principalIDNS of the user that will be making these automated requests (at a later point, this could/should allow for OCLC Access Tokens)
  • currently only tested on iojs v1.6.3, but it'll probably work on your moderately-new version of node too.

usage

to install:

npm install oclc-ncip

design note

All five methods are designed to also accept an object of params as the first parameter and a callback as the second. Below each example below is a table of accepted and/or required keys. In addition to those listed, each object allows for a custom WSKey (as wskey) and agencyID (as agencyID) to be passed, if that appeals to you.

Each of the callbacks provides two parameters: an error object (null on success), and a response object (null on failure).

new NCIP(agencyID, WSKey)

var NCIP = require('oclc-ncip');
var WSKey = require('oclc-wskey');
var key = new WSKey('public_wskey', 'secret', {principalID: 'yadda-yadda', principalIDNS: 'yad:da:ya:dda'});

var ncip = new NCIP(128807, key);

The WSKey library doesn't require a user object for creation, but all of the NCIP calls rely on a principalID and principalIDNS pair to construct a url and HMAC signature.

ncip.checkOutItem(branchID, itemBarcode, userBarcode, dueDate, callback)

Check an item out to a patron. branchID is whatever branch the item belongs to (which differs from the agencyID used to instantiate the NCIP object). From what I've found, this ID isn't easily discoverable, but can be found by: switching branches in WMS, 'inspect element'-ing the modal that appears, and finding the values of the select options.

~~The dueDate parameter can be substituted for the callback to use the date as determined by the loan rules.~~ See below.

examples

function cb(err, resp) {
  if (err) {
    console.warn(err);
  } else {
    console.log(resp);
  }
}

ncip.checkOutItem(129479, 10176, 6147646220, cb);

/** or **/

var opt = {
      branchID: 129479,
      itemBarcode: 10176,
      userBarcode: 6147646220
    };

ncip.checkOutItem(opt, cb);

// {
//   userID: { 
//     agencyID: '128807', 
//     userIdentifierValue: '6147646220' 
//   },
//   dateDue: '2015-06-17T23:59:59.000-04:00',
//   renewalCount: '4',
//   itemOptionalFields: { 
//     bibliographicDescription: { 
//       author: 'Clancy, Tom,',
//       bibliographicRecordID: [Object],
//       publicationDate: '2010',
//       publisher: 'New York : G.P. Putnam\'s Sons,',
//       title: 'Dead or alive /',
//       language: 'eng',
//       mediumType: 'Book' 
//     },
//     itemUseRestrictionType: 'DEFAULT_4BOOK',
//     circulationStatus: 'On Loan',
//     itemDescription: { 
//       callNumber: 'PS3553.L245 D425 2010',
//       itemDescriptionLevel: 'Item',
//       holdingsInformation: [Object],
//       numberOfPieces: '1'
//     },
//     location: { 
//       locationType: 'Permanent Location', 
//       locationName: [Object] 
//     } 
//   } 
// }

Alternately: you may use this as ncip.checkOutItem(options, callback) to only use two parameter spaces. Options are:

 key      |                     value                           | required?

--------------|-----------------------------------------------------|---------- branchID | (string, number) unique ID of check-in branch | yes itemBarcode | (string, number) identifier value for item | yes userBarcode | (string, number) identifier value for user | yes dueDate | (Date or parseable date string) due date for item | no (default is period set by institution for shelving location)

A Note on dueDate

As of 5/28/15, the CheckOutItem API seems to be ignoring any dates passed within <DesiredDueDate> tags, so all transactions will use their institution's default checkout period instead. If you've got any help to offer, please leave an issue or submit a pull-request. Thanks!

ncip.checkInItem(branchID, itemBarcode, callback)

Checks an item in.

example

ncip.checkInItem(129479, 10176, function(err, resp) { console.log(resp); });

// { 
//   itemID: { 
//     agencyID: '128807', 
//     itemIdentifierValue: '10176' 
//   },
//   userID: { 
//     agencyID: '128807', 
//     userIdentifierValue: '6147646220'
//   },
//   routingInformation: { 
//     routingInstructions: 'Re-shelve', 
//     destination: {} 
//   } 
// }

Alternately: you may use this as ncip.checkInItem(options, callback) to only use two parameter spaces. Options are:

 key      |                     value                     | required?

--------------|-----------------------------------------------|---------- branchID | (string, number) unique ID of check-in branch | yes itemBarcode | (string, number) identifier value for item | yes

ncip.requestItem(itemBarcode, userBarcode, pickupLocation, callback)

Place an item-level hold on an item.

var itemBarcode = 10176
  , userBarcode = 6147646220
  , pickupLocation = 123456
  ;

ncip.requestItem(itemBarcode, userBarcode, pickupLocation, function(err, resp) {
    if ( err ) return console.warn(err);
    console.log(resp)
})

// { 
//   requestID: { 
//     agencyID: '128807',
//     requestIdentifierValue: 'f93d83db-14b4-49bb-80fc-bde513af3733' 
//   },
//   userID: { 
//     agencyID: '128807', 
//     userIdentifierValue: '6147646220' 
//   },
//   requestType: 'Hold',
//   requestScopeType: 'Item' 
// }

Alternately: you may use this as ncip.requestItem(options, callback) to allow more flexibility. Options available are:

    key          |                                 value                                 | required?

---------------------|-----------------------------------------------------------------------|---------- itemBarcode | (string, number) identifier value for item | yes userBarcode | (string, number) identifier value for user | yes pickupLocation | (string, number) unique ID of pickup branch | yes earliestDateNeeded | (Date or parseable date string) delay the hold until this date | no (hold is placed immediately) needBeforeDate | (Date or parseable date string) date after which to expire the hold | no (hold expires after limit set by institution)

ncip.requestBibItem(oclcNumber, userBarcode, pickupLocation, callback)

Place a Bibliographic-level item hold. Essentially a wrapper around NCIP.requestItem.

var oclcNumber = 606774536
  , userBarcode = 6147646220
  , pickupLocation = 123456
  ;

ncip.requestBibItem(oclcNumber, userBarcode, pickupLocation, function(err, resp) {
  if ( err ) return console.warn(err.detail);
  console.log(resp);
});

// { 
//   requestID: { 
//     agencyID: '128807',
//     requestIdentifierValue: 'f93d83db-14b4-49bb-80fc-bde513af3733' 
//   },
//   userID: { 
//     agencyID: '128807', 
//     userIdentifierValue: '6147646220' 
//   },
//   requestType: 'Hold',
//   requestScopeType: 'Bibliographic Item' 
// }

Alternately: you may use this as ncip.requestBibItem(options, callback) to allow more flexibility. Options available are:

    key          |                                 value                                 | required?

---------------------|-----------------------------------------------------------------------|---------- oclcNumber | (string, number) OCLC # for bibliographic record | yes userBarcode | (string, number) identifier value for user | yes pickupLocation | (string, number) unique ID of pickup branch | yes earliestDateNeeded | (Date or parseable date string) delay the hold until this date | no (hold is placed immediately) needBeforeDate | (Date or parseable date string) date after which to expire the hold | no (hold expires after limit set by institution)

cancelRequestItem(itemID || requestID, userBarcode, callback)

Cancels an item-level request item. The item's ID or the request's ID can be passed through the first parameter.

ncip.cancelRequestItem('f93d83db-14b4-49bb-80fc-bde513af3733', 6147646220, function(err, resp) {
    console.log(resp);
});

// { 
//   userID: { 
//     agencyID: '128807', 
//     userIdentifierValue: '6147646220' 
//   } 
// }

Alternately: you may use this as ncip.cancelRequestItem(options, callback) and pass an object with the following keys:

    key          |                                 value                                 | required?

---------------------|-----------------------------------------------------------------------|---------- requestID | string identifier for the request | no, but requires either requestID or itemBarcode itemBarcode | (string, number) identifier value for item | no, but requires either requestID or itemBarcode userBarcode | (string, number) identifier value for user | yes

cancelRequestBibItem(oclcNumber || requestID, userBarcode, callback)

Cancels a bib-level request item. The bib-record's OCLC number or the request ID can be passed through the first parameter.

ncip.cancelRequestBibItem('f93d83db-14b4-49bb-80fc-bde513af3733', 6147646220, function(err, resp) {
    console.log(resp);
});

// { 
//   userID: { 
//     agencyID: '128807', 
//     userIdentifierValue: '6147646220' 
//   } 
// }

Alternately: you may use this as ncip.cancelRequestItem(options, callback) and pass an object with the following keys:

    key          |                                 value                                 | required?

---------------------|-----------------------------------------------------------------------|---------- requestID | string identifier for the request | no, but requires either requestID or oclcNumber oclcNumber | (string, number) OCLC # for bibliographic record | no, but requires either requestID or oclcNumber userBarcode | (string, number) identifier value for user | yes

License

MIT