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

playportal

v0.1.7

Published

Javascript SDK for utilizing playPORTAL service.

Downloads

10

Readme

playPORTAL Javascript SDK

playPORTAL TM provides a service to app developers for managing users of all ages and the data associated with the app and the app users, while providing compliance with required COPPA laws and guidelines.

Getting Started

playPORTAL StudioTM provides a service to app developers for managing users of all ages and the data associated with the app and the app users, while providing compliance with required COPPA laws and guidelines.

Getting Started

  • Step 1: Create playPORTAL Studio Account

  • Step 2: Register your App with playPORTAL

    • After confirmation, log in to the playPORTAL Studio
    • In the left navigation bar click on the Apps tab.
    • In the Apps panel, click on the "+ Add App" button.
    • Add an icon, name & description for your app.
    • For "Environment" leave "Sandbox" selected.
    • Click "Add App"
  • Step 3: Generate your Client ID and Client Secret

    • Tap "Client IDs & Secrets"
    • Tap "Generate Client ID"
    • The values generated will be used in 'Step 7'.
  • Step 4: Add a "Registered Redirect URI"

    • Tap "Registered Redirect URIs"
    • Tap "+ Add Redirect URI"
    • Enter your app's redirect uri (e.g. - helloworld://redirect) in to the prompt and click "Submit".
  • Step 5: Create a react-native app (if app doesn't exist)

$ react-native init yourapp

This will walk you through creating a new React Native project in yourapp working directory, e.g. /Users/x/ReactNative/yourapp Installing react-native...

  • [email protected] added 766 packages from 361 contributors and audited 15204 packages in 21.763s found 0 vulnerabilities

Setting up new React Native app in /Users/x/ReactNative/yourapp Installing React...

  • [email protected] added 1 package and audited 15228 packages in 4.435s found 0 vulnerabilities

Installing Jest...

  • Step 6: Install the playportal SDK

$ npm i playportal
  • Step 7: Add Client ID and Client Secret to App

    • Add the following to the "include" section of your App.js (or other main application module).

      • For the purpose of running yourapp, these keys are in plain text in the file, but for a production app you must store them securely - they uniquely identify your app and grant the permissions to your app as defined in playPORTAL Studio.
    • React-Native Example

      import {
        PPManager,
        PPconfigure,
        PPisAuthenticated,
        PPgetLoginRoute,
        PPhandleOpenURL,
        PPaddUserListener,  
        PPreadData,
        PPwriteData,
        PPgetFriends
      } from './node_modules/playPORTAL/ppsdk/src/PPManager';
      
      
      // -----------------------------------------------------------------
      // Copy your user defines from playPORTAL dev website
      // -----------------------------------------------------------------
      const cid = '<YOUR CLIENT_ID HERE>';
      const cse = '<YOUR CLIENT_SECRET HERE>';
      const redir = '<YOUR REDIRECT_URI HERE>';


And, in your app startup code, add the initialization to the componentDidMount method:

export default class App extends React.Component {
  state = {
    response: {},
  };

  componentDidMount = () => {
    PPaddUserListener(AppListener); // configure callback
    PPconfigure(cid, cse, redir); // do the init
  };

  render() {
    return <RootStack />;
  }
}
```
  • Step 8: Configure your app for SSO (requires URL redirects aka deep linking)

  • iOS

In the AppDelegate.m add the import for React-Native deep linking:

  #import <React/RCTLinkingManager.h>

In the AppDelegate.m add the following lines (above the @end):

  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
      return [RCTLinkingManager application:application openURL:url
			     sourceApplication:sourceApplication annotation:annotation];
    }        
  • Android

(coming soon!)

  • Step 9: Install the deep linking package for React-Native

$ npm install react-native-deep-linking
+ [email protected]
added 1 package from 1 contributor and audited 39661 packages in 5.752s
found 0 vulnerabilities
  • Step 10: Relink the react-native app

$ react-native link
  • Step 11: Running your app

$ cd /Users/x/software/ReactNative/yourapp
  • To run your app on iOS
$ react-native run-ios
  • or -
   Open ios/yourapp.xcodeproj in Xcode
   Hit the Run button
  • To run your app on Android
$ cd /Users/x/software/ReactNative/yourapp

NB: Have an Android emulator running (quickest way to get started), or a device connected

$ react-native run-android
  • Step 12: Generate "Sandbox" users for testing.

    • In the playPORTAL Studio, click on "Sandbox" in the left navigation pane.
    • Here you can generate different types of "Sandbox Users" so you can log in to your app and try it out.
    • "Sandbox Users" can be of type "Adult", "Parent", or "Child".
    • You can also create friendships between the users using the dropdowns in each "profile preview".
  • For futher information run any of the playPORTAL Hello World Apps that use the playPORTAL JavaScript SDK.

    • playPORTAL Hello World For React Native (Coming Soon!)
    • playPORTAL Hello World For NodeJS (Coming Soon!)

Making calls into the PPSDK plugin.

SSO Login / Authentication

The SSO login validates a single user (player) against the playPORTAL. Players may log in with a valid playPORTAL set of credentials. If they've previously logged in, then they can continue to operate as a logged in user.

The PPconfigure method is used to initiate this process. In conjunction with your UserListener function, the app can either:

  • if user is currently un-authorized, log a user in via SSO, and then allow full use of the playPORTAL SDK
  • if user is currently authorized, silently log in (no user interaction) and then allow full use of the playPORTAL SDK

To support this process, first define a UserListener function that will be invoked on change of Auth status.

  export const UserListener = (u, authUpdate) => {
	console.log("UserListener invoked on user:", JSON.stringify(userprofile) +" auth status:"+ authUpdate);
	authenticated = authUpdate;
	if(authenticated == true) {
	    userprofile = u; // save user profile for display, etc
	} else {
	   // display modal with login button or redirect to SSO login
	   ssoUrl = PPgetLoginRoute(); // URL for SSO login is here


	}
  }

Then, configure the SDK. The parameters are as described previously. This call does the configuration and starts the auth process. The UserListener will be invoked with auth status.

	PPconfigure(cid, cse, redir, ["SANDBOX" | "PRODUCTION"]);  // last parm, environment is optional. defaults to "SANDBOX"

--

User / Friends

The SDK provides methods for accessing a user's profile and a user's friends profiles.

The user's profile is returned to the UserListener, when the user is "auth'd". The user profile contains the following properties:

  • Get Friends

This method will return a list of this user's friends (with profile for each friend).

PPgetFriends()
parms:
	None
returns:
    	A promise that will resolve on success to the list of this user's friends, and on error, to the error status.
  PPgetFriends()
    .then((response) => {
      console.log("friends:", JSON.stringify(response));
    })
    .catch((error) => {
      console.error(error);
    })

Data

The SDK provides a simple Key Value (KV) store. On login, two data stores are opened / created for this user. There is a private data store for this users exclusive use, and a global data store this user shares with all other users of this same app. If a user logs out and logs in at a later date, the data in the private data store will be as left upon logout. The contents of the global data store will most likely have changed based on write operation of other users.

  • Write Data

This method will write a KV pair to the referenced data store. If a key is used more than once for writing, the value associated with the key will be updated and reflect the most recent write operation.

PPwriteData(bucketname, key, value)
parms:
	bucketname - the name of the data store (string). To use one of the pre-defined buckets (one private, one app global) this method can be called with PPgetMyBucketName(p) where p is boolean (true = my private, false = app global)
	key - a key to associate with this data (string)
	value - value to store (JSON.stringify'able JSON, e.g. objects w/o functions)
returns:
    	A promise that will resolve to indicate the success/error status of the write operation.

Example: to write { somekey : somevalue } to your application private data store:

	PPwriteData(PPgetMyBucketName(true), somekey, somevalue)
	.then((response) => {
	      console.log("KV written K:", somekey + " V:" + JSON.stingify(somevalue));
	 })
	.catch((error) => {
	     console.error(error);
	 })
  • Read data

This method will read a value from the bucket named bucketname for the Key key. It returns a promise that will either contain JSON data (on success) or an error.

PPreadData(bucket, key)
parms:
	bucketname - the name of the data store (string) or use the PPgetMyBucketName(boolean)
	key - the key to read data from (string)

returns:
    	A promise that will resolve on success to a response containing the profiles of the user's friends and on failure an error indicating the error status.

Example: to read { somekey } from your application global app data store:

	PPreadData(PPgetMyBucketName(false), somekey)
	.then((response) => {
	      console.log("KV read K:", somekey + " V:" + JSON.stringify(response));
	 })
	.catch((error) => {
	     console.error(error);
	 })
  • Create bucket

The user may also create additional data stores as necessary. That is done as:

PPcreateBucket(bucketname, users[], ispublic)
parms:
	bucketname - the name of the data store (string)
	users - CSV array of user ids
	ispublic - non-zero / non-null creates a public bucket

returns:
    	A promise that will resolve on success to a response containing the newly created bucket's metadata and on failure an error indicating the error status.

Example: create a new bucket named "gamescores" that is accessible by any app user




	PPcreateBucket('gamescores', [], true)
	.then((response) => {
	      console.log("new bucket created: ", newbucket);
	 })
	.catch((error) => {
	     console.error(error);
	 })

For subsequent reads/writes to this new bucket, the same name should be utilized as the bucketname, e.g. gamescores.