1.0.1 • Published 8 years ago

deepstream.io-pipeline v1.0.1

Weekly downloads
3
License
MIT
Repository
github
Last release
8 years ago

deepstream.io-pipeline

NPM version

A PermissionHandler pipeline for deepstream.io

Table of contents

Install

npm i -S deepstream.io-pipeline

Basic info

deepstream.io-pipeline provides a PermissionHandler pipeline for deepstream.io, allowing you to add multiple strategies that are isolated from eachother but will run in a non-blocking sequence. The sequence will run in the same order you added each strategy with the addPipelineStep method. So if you added a strategy called JWTStrategy first, that strategy will be "tested" first on each login attempt.

The API is compatible with deepstreams' PermissionHandler API, and to add the pipeline to your current codebase is as trivial as copy-pasting.

If none of the steps in the pipeline calls the callback in isValidUser without errors, the error from the last step in the pipeline is returned to the user. This basically means that the user autenticating either has incorrect credentials or tries to authenticate with data that is unknown to your strategies/steps.

Usage (ES2015)

import DeepstreamServer from 'deepstream.io'
import Pipeline from 'deepstream.io-pipeline'

class JWTStrategy {
  isValidUser (connectionDetails, authData, callback) {
    if (authData.token === 'sometoken') {
      let user = this.getUserFromDBSomehow()
      callback(null, user)
    } else {
      callback('invalid token')
    }
  }

  // All users authenticated via the JWTStrategy will use
  // this canPerformAction method, isolated from the other
  // strategies you may have added to the pipeline.
  canPerformAction (username, message, callback) {
    callback(null, true)
  }

  // Same as above comment
  onClientDisconnect (username) {}
}

const permissionHandler = new Pipeline()

permissionHandler
  .addPipelineStep({
    isValidUser (connectionDetails, authData, callback) {
      if (!authData.username) callback(null, 'guest')
    },
    canPerformAction (guest, message, callback) {
      callback(null, true)
    }
  })
  .addPipelineStep(new JWTStrategy())
  .addPipelineStep(...)

const server = new DeepstreamServer()

server.set('PermissionHandler', permissionHandler) // Set the pipeline as the PermissionHandler

Usage (ES5)

var DeepstreamServer = require('deepstream.io')
var Pipeline = require('deepstream.io-pipeline').default

function JWTStrategy() {}

JWTStrategy.prototype.isValidUser = function (connectionDetails, authData, callback) {
  if (authData.token === 'sometoken') {
      let user = this.getUserFromDBSomehow()
      callback(null, user)
    } else {
      callback('invalid token')
    }
}

// All users authenticated via the JWTStrategy will use
// this canPerformAction method, isolated from the other
// strategies you may have added to the pipeline.
JWTStrategy.prototype.canPerformAction = function (username, message, callback) {
  callback(null, true)
}

// Same as above comment
JWTStrategy.prototype.onClientDisconnect = function (username) {}

var permissionHandler = new Pipeline()

permissionHandler
  .addPipelineStep({
    isValidUser: function (connectionDetails, authData, callback) {
      if (!authData.username) callback(null, 'guest')
    },
    canPerformAction: function (guest, message, callback) {
      callback(null, true)
    }
  })
  .addPipelineStep(new JWTStrategy())
  .addPipelineStep(...)

var server = new DeepstreamServer()

server.set('PermissionHandler', permissionHandler) // Set the pipeline as the PermissionHandler

API

addPipelineStep(step)

  • Arguments:
    • step - Object or Array of objects with isValidUser (etc)-methods available.

License

MIT © Rabalder Media

1.0.1

8 years ago

1.0.0

8 years ago

0.1.1

8 years ago

0.1.0

8 years ago