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

@turgid-tributary/smart-health-card-decoder

v1.1.3

Published

API for decoding a QR encoded SMART Health Card

Downloads

422

Readme

SMART Health Card Decoder Library

A library to decode & verify encoded SMART Health Cards into a patient's FHIR data.

Expected usage is to have an application scan a SMART Health Card QR-code with a QR-scanner. The QR code is decoded into an shc string. This shc string is then passed to the verify() function along with a directory (a list of application permitted issuers/keys).
The shc string will then be decoded into an immunization 'card' with the signature being verified using the supplied directory:

// Basic usage

import {verify, Directory} from 'smart-health-card-decoder'

const resultFromQrScanner = 'shc:/56762909524 ... ';  // truncated

const vciDirectory = await Directory.create('vci'); // download daily VCI directory snapshot by default.

const result = await verify(resultFromQrScanner, vciDirectory);

if (result.verified === false) {
    const failureReason = result.reason;  // 'failed-validation' | 'bad-signature' | 'expired' | 'revoked'
    const failureErrors = result.data.errors;
    // handle errors
}

// success, do something with fhir data
const fhirBundle = result.data.fhirBundle;

The result.data object, returned above, is a Context object. See Context object for all the available data contained in this object.

See Directory for more information on the Directory class used above.

See VCI Directory for more information about the VCI Directory.

Install via GitHub

npm install github:smart-on-fhir/smart-health-card-decoder
// import the package
import {verify} from 'smart-health-card-decoder'

Browser

The library build script generates a bundled script for browser use.
Update the babel.config.json file to modify desired browser support.

<script src="\umd\smart-health-card-decoder.umd.js"></script>

<script>

    var smart = window['smart-health-card-decoder'];

    var directory = await smart.Directory.create(["https://spec.smarthealth.cards/examples/issuer"]);

    // Decode & Verify the QR-data
    var result = await smart.verify(qrUrl, directory);

    if (result.verified === false) {
        const failureReason = result.reason;  // 'failed-validation' | 'bad-signature' | 'expired' | 'revoked'
        const failureErrors = result.data.errors;
        // handle errors
    }

    // success, do something with fhir data
    const fhirBundle = result.data.fhirBundle;


</script>

Build from source

Alternatively, the package can be built from source following these steps.

  1. Clone the source:

    git clone https://github.com/smart-on-fhir/smart-health-card-decoder.git
    cd smart-health-card-decoder
  2. Build the package (install will trigger the build script through the prepare script):

    npm install
  3. Optionally, run the tests:

    npm test

Examples

Using verify() with a constructed directory

import {verify} from 'smart-health-card-decoder'

// supply a directory of issuer-keysets to verify against
// an issuer may possess several keys in .keys[]
const myDirectory = {
    directory: "https://spec.smarthealth.cards/examples",
    time: "2022-02-28T22:38:31Z",
    issuerInfo: [
        {
            issuer: {
                iss: 'https://spec.smarthealth.cards/examples/issuer',
                name: 'smarthealth.cards'
            },
            keys: [
                {
                    kty: "EC",
                    kid: "3Kfdg-XwP-7gXyywtUfUADwBumDOPKMQx-iELL11W9s",
                    use: "sig",
                    alg: "ES256",
                    crv: "P-256",
                    x: "11XvRWy1I2S0EyJlyf_bWfw_TQ5CJJNLw78bHXNxcgw",
                    y: "eZXwxvO1hvCY0KucrPfKo7yAyMT6Ajc3N7OkAB6VYy8"
                }
            ]
        }
    ]
};

const encodedShc = 'shc:/56762909524 ... ';

const directory = await smart.Directory.create(myDirectory);

const result = await verify(encodedShc, directory);

if (result.verified === false) {
    const failureReason = result.reason;  // 'failed-validation' | 'bad-signature' | 'expired' | 'revoked'
    const failureErrors = result.data.errors;
    // handle errors
}

// success, do something with fhir data
const fhirBundle = result.data.fhirBundle;

Low Level API

See Low Level API for a list of more granular functions.