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

sugo-module-base

v1.2.6

Published

Base module for SUGOS

Downloads

49

Readme

sugo-module-base

Build Status npm Version JS Standard

Base module for SUGOS

Table of Contents

Requirements

Installation

$ npm install sugo-module-base --save

Usage

Register a module to actor.

#!/usr/bin/env node

/**
 * Example usage of the caller
 */
'use strict'

const { Module } = require('sugo-module-base')
const sugoActor = require('sugo-actor')
const co = require('co')

co(function * () {
  let actor = sugoActor('http://my-sugo-cloud.example.com/actors', {
    key: 'my-actor-01',
    modules: {
      // Register the module
      module01: new Module({
        ping () { /* ... */ }
      }),
      module02: new (require('./example-custom-class'))({}),
      module03: new (require('./example-mixed-class'))({})
    }
  })
  yield actor.connect()
}).catch((err) => console.error(err))

Then, call the module from a remote caller.

#!/usr/bin/env node

/**
 * Example control from a remote caller
 * @see https://github.com/realglobe-Inc/sugo-caller
 */
'use strict'

const co = require('co')
const assert = require('assert')
const sugoCaller = require('sugo-caller')

co(function * () {
  let caller = sugoCaller('http://my-sugo-cloud.example.com/callers', {})
  let actor = caller.connect('my-actor-01')

  // Access to the module
  let module01 = actor.get('module01')

  // Send ping
  let pong = yield module01.ping()
  assert.ok(pong)
}).catch((err) => console.error(err))

Advanced Usage

Description with $spec

You can describe a module with $spec property. The spec object must conform to module_spec.json, a JSON-Schema.

#!/usr/bin/env node

/**
 * Example usage of the caller
 */
'use strict'

const { Module } = require('sugo-module-base')
const sugoActor = require('sugo-actor')
const co = require('co')

co(function * () {
  let actor = sugoActor('http://my-sugo-cloud.example.com/actors', {
    key: 'my-actor-01',
    modules: {
      // Register the module
      module01: new Module({
        ping () { /* ... */ },
        get $spec () {
          /**
           * Module specification.
           * @see https://github.com/realglobe-Inc/sg-schemas/blob/master/lib/module_spec.json
           */
          return {
            name: 'sugo-module-base-sample',
            version: '1.0.0',
            desc: 'A sample module',
            methods: {
              ping: {
                desc: 'Test the reachability of the module',
                params: []
              }
            }
          }
        }
      })
    }
  })
  yield actor.connect()
}).catch((err) => console.error(err))

Define Custom Class

You can define you own class by extending Module class

/**
 * @MyCustomClass
 */
'use strict'

const { Module } = require('sugo-module-base')

class MyCustomClass extends Module {
  constructor (config) {
    super(config)
  }

  myMethod01 () {
    /* ... */
  }

  get $spec () {
    return { /* ... */ }
  }
}

module.exports = MyCustomClass

Use Mixins

Sometimes you need to share functions between classes.

Javascript Class Mix-In would do this.

/**
 * Example to use mixin
 */
'use strict'

const { Module } = require('sugo-module-base')

const HiPeople = (baseClass = Module) => class extends baseClass {
  sayHi () { console.log('Hi!') }
}

const YoPeople = (baseClass = Module) => class extends baseClass {
  sayYo () { console.log('Yo!') }
}

class MyPerson extends HiPeople(YoPeople(Module)) {
  sayHiAndYo () {
    const s = this
    s.sayHi()
    s.sayYo()
  }
}


module.exports = MyPerson

Modularize Existing Class

Want to use an existing class? You can use modularize() method to define a new module class from existing class. Since SUGO-Actor not supports callback base function, you may need some hack.

/**
 * Example to modularize an existing class
 */
'use strict'

const { modularize } = require('sugo-module-base')
const sugoActor = require('sugo-actor')
const co = require('co')

co(function * () {
  // Existing class to modularize
  class YoPerson {
    sayYo () {
      return [ 'yo', ...arguments ].join(' ')
    }

    sayYoCallback (callback) {
      callback(null, this.sayYo())
    }
  }

  // Since you cannot load callback base module into SUGO-Actor,
  // You need wrapper class to add async method
  class YoPersonAsyncWrap extends YoPerson {
    sayYoAsync () {
      const s = this
      return new Promise((resolve, reject) => {
        this.sayYoCallback((err) =>
          err ? reject(err) : resolve()
        )
      })
    }
  }

  let YoModuleClass = modularize(YoPersonAsyncWrap, {
    filter (name, method) {
      let methodsToReject = [ 'sayYoCallback' ] // Strip off the callback method
      return !~methodsToReject.indexOf(name)
    }
  })

  // Apply the modularized class instance into actor
  let actor = sugoActor('http://my-sugo-cloud.example.com/actors', {
    key: 'my-actor-01',
    modules: {
      yo: new YoModuleClass()
    }
  })
  yield actor.connect()
})





License

This software is released under the Apache-2.0 License.

Links