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

@adobe/reactor-sdk

v1.2.0

Published

JavaScript SDK for the Reactor API

Downloads

199

Readme

JavaScript Reactor SDK

Travis badge npm version Greenkeeper badge

A Library for accessing the Adobe Experience Platform Reactor API.

This API is fairly low-level. The Reactor methods are one-to-one with the RESTful API endpoints, and they provide very little help in constructing your payloads. This is intended to meet the expectations of JavaScript developers, but we welcome your feedback.

Installation

Using npm

You can use the Reactor SDK from npm with a bundler like Webpack, Rollup, or Parcel. If you use npm for client package management, you can install the SDK with:

npm install @adobe/reactor-sdk

Using a CDN

If you'd prefer not to use npm to manage your client packages, reactor-sdk also provides a UMD distribution in a dist folder which is hosted on a CDN:

<script src="https://unpkg.com/@adobe/reactor-sdk/dist/reactor-sdk.min.js"></script>

The Reactor constructor will be installed as window.Reactor, so typical usage would go something like this:

<script src="https://unpkg.com/@adobe/reactor-sdk/dist/reactor-sdk.min.js"></script>
<script>
  const tok = 'Your Access Token';
  const orgId = 'Your Org Id';
  const url = 'https://reactor.adobe.io';
  const reactor = new window.Reactor(tok, {
    reactorUrl: url,
    customHeaders: {'x-gw-ims-org-id': orgId}
  });
  const acme = await reactor.getCompany('CO0123456789012345678901');
  ...
</script>

How to retrieve your Access Token.

How to retrieve your Org ID.

Usage

The example below is a nodejs script that lists the ID's and names of all your Company's properties.

Put this text in a file named list-properties.js:

#!/usr/bin/env node
const Reactor = require('@adobe/reactor-sdk').default;

(async function() {
  const accessToken = process.env['ACCESS_TOKEN'];
  const orgId = process.env['ORG_ID'];
  const reactorUrl = 'https://reactor.adobe.io';
  const reactor = new Reactor(accessToken, { reactorUrl: reactorUrl, customHeaders: {'x-gw-ims-org-id': orgId} });
  // Example API call: list Companies for the authenticated organization
  const companyList = await reactor.listCompanies();
  for (var company of companyList.data) {
    console.log(`${company.id} ${company.attributes.name}`);
    // Example API call: list Properties for the identified Company
    const list = await reactor.listPropertiesForCompany(company.id);
    for (var property of list.data) {
      console.log(`- ${property.id} ${property.attributes.name}`);
    }
  }
})();

Note: If you are provisioned for multiple orgs, you will need to specify your org ID under customHeaders as shown below.

You can optionally add other custom headers that will be sent with each request by also specifying them in the customHeaders object.

const reactor = new window.Reactor(
  tok, {
    reactorUrl: url,
    customHeaders: {
      'x-gw-ims-org-id': orgId,
      'another-header-example': 42
    }
  }
);

Run it...

export ACCESS_TOKEN=... # see instructions below
export ORG_ID=... # see instructions belor
chmod u+x ./list-properties.js
./list-properties.js

How to retrieve your Access Token.

How to retrieve your Org ID.

...and you should get output similar to:

"COb711272b544e8359eab4492484893f77" "Fredigar and Bagginses"
"- PR090c7b576f892bf7a7f5e783d0e9ab75" "Shire Real Estate Holdings, LLC"
"- PR399e5b7dbcfc83db37051b43f5ac4d3b" "Mathom Recyclers, Ltd."
success

A browser implementation of this functionality would differ in two ways:

  1. it would use the pre-initialized window.Reactor rather than const Reactor = require('@adobe/reactor-sdk')
  2. providing your access token needs a different approach, since process.env is not available in browsers. Note: you don't want to inline the text of your access token, unless you are sure no adversary will have access to your page.

The SDK and the API

The Adobe Experience Platform Reactor API is a RESTful {json:api}-compliant service.

Each Reactor API endpoint has a corresponding function in this library. For example, the "Fetch a Profile" endpoint is accessed via the getProfile() SDK function.

Since the correspondence between API endpoints and SDK functions is one-to-one, the Reactor API documentation is the primary source of information.

(In addition to the live API documentation, the code that builds that documentation is available under open source, at reactor-developer-docs. For example, the source code of the "Fetch a Profile" documentation is at profiles/fetch.md.)

Every SDK function has an integration test that demonstrates its correctness. (Well, correct for at least one use). These tests also provide you working examples for every library function. [This isn't quite true yet. We're almost there, but a few remain to be implemented.]

For a complete and self-contained example program, see test.spec.js. This is also included in the integration tests, see examples.test.js. It's a JavaScript implementation of the ReactorPostman query set.

Developer Setup

If you want to contribute to development of this library,

git clone [email protected]:adobe/reactor-sdk-javascript.git
cd reactor-sdk-javascript
npm ci           # install dependencies and build Reactor SDK library

The clean install generates three versions of the library:

  1. ./lib/node/*.js, intended for use by nodejs projects
  2. ./lib/browser/*.js, intended for use by bundlers in browser projects
  3. ./dist/reactor.min.js, intended for loading directly into an HTML page (i.e., for non-bundled browser use)

With the SDK built, you can run its nodejs unit tests:

npm link "$(pwd)"           # make this SDK available to tests
npm run unit-tests          # run the tests in test/unit/**

The integration tests need a current access token, a provisioned Company, and your provisioned Org ID. You are expected to provide them to the tests via the environment variables ACCESS_TOKEN, COMPANY_ID, and ORG_ID. Instructions for getting your Access Token, your Company Id, and your Org ID are given below.

The in-browser integration tests require a local static-file web server, because loading their HTML using a file:// URL is not effective: the browser rejects all the resulting Reactor requests because they violate CORS restrictions. The necessary bare-bones web server is provided with this project, as scripts/static-server.js.

Once you've collected the necessary values for your environment variables, you can run the integration tests:

export ACCESS_TOKEN="your_reactor_access_token"
export COMPANY_ID="your_reactor_test_company_id" # "CO" followed by 32 hex digits
export ORG_ID="your_org_id" # 24 characters followed by "@AdobeOrg"
NODE_TLS_REJECT_UNAUTHORIZED=0 scripts/static-server.js --dir ./tmp.tests/

Switch to another terminal window, since you want that server to keep running.

npm run integration-tests   # run the tests in test/integration/**
# The library and bundled integration tests are not currently functioning,
# but the node ones are. Getting them all running is in the backlog. - CR

[Update] As of 24 August 2021, current versions of Google Chrome still won't allow the files to be loaded, even with the static server. Apparently, localhost:5000 and localhost:9010 are too different, and trigger CORS blocking. On MacOS, I've been able to get the tests to work by shutting down Chrome and relaunching with:

  • Bundled Library Test
open -a "Google Chrome" ./tmp.tests/integration-bundled-sdk/integration-tests-bundled-sdk.html \
     --args --disable-web-security --user-data-dir="/tmp/chrome"
  • Non-bundled Library Test
open -a "Google Chrome" ./tmp.tests/integration-library-sdk/integration-tests-library-sdk.html \
     --args --disable-web-security --user-data-dir="/tmp/chrome"

While developing the Reactor SDK, these are handy for auto-building when you change the source code:

# re-run {lint, prettier, build} when src/**/*.js changes
npm run src-watch

# re-run {lint, prettier, build, and test} when {dist,test/unit}/**/*.js changes
npm run unit-watch

# re-run {lint, prettier, build, and test} when {dist,test/integration}/**/*.js changes
npm run integration-watch

# re-run {lint, prettier, build, and test} when {src,test}/**/*.js changes
npm run all-watch

# Periodically, you'll want to remove the Properties created during integration tests
scripts/delete-test-properties

Determining Your Personal Information

Your Access Token

Here we provide instructions on two ways that you can retrieve your Access Token for use with the reactor-sdk project.

Programmatically via Adobe's jwt-auth project.

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const jwtAuth = require('@adobe/jwt-auth');
const Reactor = require('@adobe/reactor-sdk').default;

(async function() {
  const orgId = process.env['ORG_ID'];
  // jwt-auth config object: https://github.com/adobe/jwt-auth#config-object
  const config = {
    orgId,
    clientId: 'YOUR_CLIENT_ID',
    technicalAccountId: "YOUR_TECHNICAL_ACCOUNT_ID",
    clientSecret: "YOUR_CLIENT_SECRET",
    metaScopes: ["YOUR_META_SCOPES"],
  };
  config.privateKey = fs.readFileSync(path.resolve(__dirname, "path to your private key file"));
  const tokenResponse = await jwtAuth(config);
  const accessToken = tokenResponse['access_token'];

  const reactorUrl = 'https://reactor.adobe.io';
  const reactor = new Reactor(accessToken, { reactorUrl: reactorUrl, customHeaders: {'x-gw-ims-org-id': orgId} });

  // perform API calls here
})();

Through the Adobe Tags user interface

  • Using Google Chrome, log in to https://launch.adobe.com/companies
  • Open the developer console
  • Change the JavaScript context from "top" to "Main Content" using the dropdown menu Switch JavaScriptContext
  • Execute copy(userData.imsAccessToken)
  • The access token is now in your system clipboard. Paste it into an environment variable definition:
    • export ACCESS_TOKEN='<paste>'

Your Company ID

  • Log in to https://launch.adobe.com/companies
  • While looking at your Properties page, the address bar will show a URL like https://launch.adobe.com/companies/CO81f8cb0aca3a4ab8927ee1798c0d4f8a/properties.
  • Your Company ID is the 'CO' followed by 32 hexadecimal digits (i.e., from "CO" up to the following slash). Copy that company ID to an environment variable:
    • export COMPANY_ID=CO81f8cb0aca3a4ab8927ee1798c0d4f8a

Your Org ID

  • Log into https://launch.adobe.com/companies
  • Open the developer console
  • Change the JavaScript context from "top" to "Main Content" using the dropdown menu Switch JavaScriptContext
  • Execute copy(userData.profile.attributes.activeOrg)
  • The Org ID is now in your system clipboard. Paste it into an environment variable definition:
    • export ORG_ID='<paste>'

Future Work

  • Implement integration tests for the handful of functions not yet covered.
  • Include a section here on library function naming conventions.
  • Find or implement a JavaScript library for handling JWT token generation. The current mechanism requires you to generate an access token yourself. Such tokens time out after while, forcing you to generate a new one.
  • Describe how query parameters are passed in this SDK.

Contributing

Contributions are welcomed! Read the Contributing Guide for more information.

Before submitting your PR

# commit your changes
$ git add .
$ git commit -m 'your commit message'
$ npm version {major|minor|patch}
$ git push