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

sap-cf-destination

v0.3.1

Published

convenience utility for calling a URL via a SAP CF destination

Downloads

158

Readme

SAP CP Cloud Foundry destination handler

Build Status npm Package

Install

npm install --save sap-cf-destination

Prerequisites

  • destination and destination instance created
  • connectivity instance created
  • xsuaa instance created
  • all of the above instances bound to the node app, e.g. via manifest.yml:
    applications:
    - name: my_app
      path: my_app
      memory: 128M
      services:
        - xsuaa-instance
        - connectivity-instance
        - destination-instance

Usage

const callDestination = require('sap-cf-destination');

// Promise chain
callDestination({
        url: '/api/json',
        connectivity_instance: 'connectivity-lite',
        uaa_instance: 'uaa-lite',
        destination_instance: 'destination-lite',
        destination_name: 'tbaas',
        http_verb: 'POST',
        payload: {
            "me": "here"
        }
    })
        .then(response => {
            // do sth clever from the response
            // of $server_behind_destination_'tbaas'/api/json
        })
        .catch(err => {
            // oh no 💩
        })
        
// async/await? 👏
// add the 'async' keyword to an outer function wrapping 'callDestination'
async function getIt() {
    try {
        const response = await callDestination({...});
        // do sth clever w/ the response
    } catch (err) {
        // oh no 💩
    }
}

API

sap-cf-destination(options) ⇒ Promise.<(any|never)>

| Param | Type | Description | | --- | --- | --- | | options | Map | configuration options for several CF service instances | | options.url | string | the url to call in the destination, absolute path (including leading slash) e.g. /api/v1/json | | options.connectivity_instance | string | name of the instance of the connectivity service | | options.uaa_instance | string | name of the instance of the uaa service | | options.destination_instance | string | name of the instance of the destination service | | options.destination_name | string | name of the destination to use | | options.http_verb | 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | HTTP method to use | | [options.payload] | object | payload for POST, PUT or PATCH | | [options.formData] | object | mimic a browser for POSTing a form to the destination; implies http verb POST | | [options.content_type] | string | value for "Content-Type" http header, e.g. "application/json" | | [options.full_response] | boolean | whether to have the full response (including all headers etc) pass through to the caller (BE -> proxy -> client) | | [options.tech_error_only] | boolean | get a rejection only if the request failed for technical reasons, so e.g. 404 is considered a valid response | | [options.binary] | boolean | whether to expect (and deliver) a binary at @param url | | [options.scc_name] | string | Location ID of the SAP Cloud Connector |

Hints & Limitations

  • all major HTTP verbs are supported (GET, POST, PUT,PATCH,HEAD, DELETE,OPTIONS) per se
    BUT: if the proxy software decides to not let any of them pass through, the request originating from this module will of course fail
  • ~~POST,~~ PUT and PATCH only support a JSON payload. The payload itself can be a plain, deeply nested object; it will be stringified automatically
  • POST now supports both a JSON payload and a form-style ("like a browser") submission:
    callDestination({
      url: ...,
      http_verb: 'POST',
      formData: {
        field1: "some value",
        field2: JSON.stringify([ { "el1": "v1", "el2": "v2" } ])  // stringify deep nested objects and array structures
      }
    })
  • use scc_name: '<locID>' as a parameter to specify location ID of the SAP Cloud Connector (default: none)
    callDestination({
            //...
            scc_name: '<locID of SCC>'
        }).then(...).catch(...);
  • use full_response: true as a parameter to obtain the full response payload, e.g. to get access to response headers
    callDestination({
            //...
            full_response: true
        }).then(...).catch(...);
  • use tech_error_only: true as a parameter to only get a rejection if the request failed for technial reasons ("as long as it has a status code, it's a valid response")
    callDestination({
            //...
            tech_error_only: true
        }).then( response => {
            // even ☕️ ends up here
            // add
            //    full_response: true (see above)
            // to get response.statusCode
        }).catch( err => {
            // network layer problem or such
        });
  • do a download of a binary file by specifying the matching Content-Type of the file and setting binary to true;
    this will deliver a Buffer useable in writeStreams
    callDestination({
            //...
            content_type: 'application/zip',
            binary: true
        }).then( buffer => {
            // write Buffer
            fs.createWriteStream('file.zip')
              .write(buffer, 'binary')
              .end();
            // don't forget to listen to the error and finish event
            // ...
        }).catch(...);

License

Apache License 2.0

References

  • code inspiration from https://github.com/bertdeterd/scc-connector
  • ported Java reference code from https://help.sap.com/viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/en-US/313b215066a8400db461b311e01bd99b.html