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

@gr4vy/node

v0.63.1

Published

NodeJS client for @gr4vy/node

Downloads

2,635

Readme

Gr4vy SDK for Node

Module Version

Gr4vy provides any of your payment integrations through one unified API. For more details, visit gr4vy.com.

Installation

To add Gr4vy to your project, install the @gr4vy/node package as follows.

npm install @gr4vy/node --save
# yarn add @gr4vy/node

Getting Started

To make your first API call, you will need to request a Gr4vy instance to be set up. Please contact our sales team for a demo.

Once you have been set up with a Gr4vy account you will need to head over to the Integrations panel and generate a private key. We recommend storing this key in a secure location but in this code sample we simply read the file from disk.

const fs = require('fs')
const { Client, BuyerRequest } = require('@gr4vy/node')
// or: import { Client, BuyerRequest } from "@gr4vy/node";

const key = String(fs.readFileSync('./private.key'))

const client = new Client({
  gr4vyId: 'YOUR_GR4VY_ID',
  privateKey: key,
  environment: 'production',
})

const buyerRequest = new BuyerRequest()
buyerRequest.displayName = 'John L.'
const buyer = await client.newBuyer(buyerRequest)
console.log(buyer)
// {
//   response: {...} the HTTP response object
//   body {...} the parsed JSON
// }

Environment

The SDK defaults the environment to "sandbox", to send transactions to production, set the environment in Client:

const client = new Client({
  gr4vyId: 'YOUR_GR4VY_ID',
  privateKey: key,
  environment: 'sandbox',
})

const client = new Client({
  gr4vyId: 'YOUR_GR4VY_ID',
  privateKey: key,
  environment: 'production',
})

Gr4vy Embed

To create a token for Gr4vy Embed, call the client.getEmbedToken() function with the amount, currency, and optional buyer information for Gr4vy Embed.

// generate a session to tie any transactions to
const response = await this.newCheckoutSession()
// generate the token
const token = await client.getEmbedToken({
  amount: 1299,
  currency: 'USD',
  buyerExternalIdentifier: 'user-1234',
  checkoutSessionId: response.body.id,
  // or: buyerId: ...
})

// or to combine both calls in one
const { token, checkoutSession } =
  await client.getEmbedTokenWithCheckoutSession(embedParams)

You can now pass this token to your front end where it can be used to authenticate Gr4vy Embed.

Refreshing a token

To get a new token with a new expiration date, or to add new data to a token, without losing the checkout session ID, you can call the updateEmbedToken method again with the original token and the new data. Your checkout session will automatically be added to the same token.

const token = await client.updateEmbedToken(oldToken, {
  amount: 1299,
  currency: 'USD',
  buyerExternalIdentifier: 'user-1234',
})

Additional data

Additional data can be added to a token. The buyerId and buyerExternalIdentifier fields can be used to allow the token to pull in previously stored payment methods for a user. A buyer needs to be created before it can be used in this way.

const buyerRequest = new BuyerRequest()
buyerRequest.displayName = 'John L.'
buyerRequest.externalIdentifier = 'user-1234'
const buyer = await client.newBuyer(buyerRequest)

const token = await client.getEmbedToken({
  amount: 1299,
  currency: 'USD',
  buyerId: buyer.body.id,
})

Initialization

The client can be initialized with the Gr4vy ID (gr4vyId) and the private key.

const client = new Client({
  gr4vyId: 'acme',
  privateKey: key,
})

Alternatively, instead of the gr4vyId it can be initialized with the baseUrl of the server to use directly.

const client = new Client({
  baseUrl: 'https://api.acme.gr4vy.app',
  privateKey: key,
})

Your API key can be created in your admin panel on the Integrations tab.

Making API calls

This library conveniently maps every API path to a seperate function. For example, GET /buyers?limit=100 would be:

client.listBuyers(null, 100)

To create or update a resource, the API requires a request object for that resource that is conventiently named <Resource>Request or <Resource>UpdateRequest.

For example, to create a buyer you will need to pass a BuyerRequest object to the addBuyer method.

const buyerRequest = new BuyerRequest()
buyerRequest.displayName = 'John L.'
const buyer = await client.newBuyer(buyerRequest)

Similarly, to update a buyer you will need to pass in the BuyerUpdateRequest.

const buyerUpdateRequest = new BuyerUpdateRequest()
buyerUpdateRequest.displayName = 'John D.'
const buyer = await client.updateBuyer(buyer.id, buyerUpdateRequest)

Generate API bearer token

The SDK can be used to create API access tokens for use with other request libraries.

import { JWTScope } from '@gr4vy/node'

const bearerToken = client.getBearerToken(
  [JWTScope.BuyersRead, JWTScope.BuyersWrite],
  '1h'
)

The first parameter is a list of recognised scopes for the Gr4vy API. The second parameter is the expiration time for the token as defined by the vercel/ms library.

The resulting token can be used as a bearer token in the header of the HTTP request made to the API.

Authorization: Bearer <bearerToken>

Response & Promises

Every API call returns a Promise that either resolves or rejects.

Every resolved API call returns an object containing a body attribute with the parsed JSON body and a response object representing the HTTP response object which includes the raw headers and status code.

For a failed API call, it returns a similar object is returned with the body of the error.

client
  .getBuyer(buyer.id)
  .then((result) => {
    console.dir(result.body) // the parsed JSON
    console.dir(result.response.statusCode) // the status code of the response
  })
  .catch((error) => {
    console.dir(error.response.body) // the parsed JSON of the error
    console.dir(error.response.statusCode) // the status code of the error
  })

Logging & Debugging

The SDK makes it easy possible to the requests and responses to the console.

const client = new Client({
  gr4vyId: 'demo',
  privateKey: key,
  debug: true,
  // merchantAccountId: 'my-merchant-id' # optional for multi merchant instances
})

This will output the request parameters and response to the console as follows.

Gr4vy - Request - .getBuyer: 41291df0-4a5d-42d9-a977-dbc8ef6463c4
Gr4vy - Response - .getBuyer - 200): Buyer {
  type: 'buyer',
  id: '41291df0-4a5d-42d9-a977-dbc8ef6463c4',
  external_identifier: null,
  display_name: 'Test',
  created_at: 2021-02-23T16:23:22.794Z,
  updated_at: 2021-02-23T16:23:22.794Z
}

Development

Adding new APIs

To add new APIs, run the following command to update the models and APIs based on the API spec.

./openapi-generator-generate.sh

Next, update sdk/client.ts to bind any new APIs or remove any APIs that are no longer available.

const poa = new PaymentOptionsApi(this.baseUrl)
this.listPaymentOptions = this.wrap(poa.listPaymentOptions.bind(poa))
this.apis.push(poa)

Publishing

Publishing of this project is done automatically using the yarn release command which creates a new version, publishes it to a tag, and then triggers a GitHub Action to release the new package to NPM.

License

This library is released under the MIT License.