# sugo-module-base

> Base module for SUGOS

Latest version **1.2.6** (published 2017-04-20) · Apache-2.0 license · 0 weekly downloads

## Install

```sh
npm install sugo-module-base
pnpm add sugo-module-base
yarn add sugo-module-base
bun add sugo-module-base
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.2.6 |
| Published | 2017-04-20 |
| First published | 2017-02-03 |
| Weekly downloads | 0 |
| License | Apache-2.0 |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >=6 |
| Dependencies | 7 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | Taka Okunishi |
| Maintainers | okunishinishi, realglobe |
| Keywords | SUGOS, module |

## Links

- npm: https://www.npmjs.com/package/sugo-module-base
- Repository: https://github.com/realglobe-inc/sugo-module-base
- Homepage: https://github.com/realglobe-Inc/sugo-module-base#readme
- Issues: https://github.com/realglobe-Inc/sugo-module-base/issues
- npm.io page: https://npm.io/package/sugo-module-base

## Dependencies (7)

- [co](https://npm.io/package/co.md) ^4.6.0
- [debug](https://npm.io/package/debug.md) ^2.6.3
- [defaults](https://npm.io/package/defaults.md) ^1.0.3
- [sg-check](https://npm.io/package/sg-check.md) ^1.1.5
- [sg-schemas](https://npm.io/package/sg-schemas.md) ^2.2.2
- [sg-validator](https://npm.io/package/sg-validator.md) ^1.1.1
- [sugo-constants](https://npm.io/package/sugo-constants.md) ^2.4.1

## Recent versions

- 1.2.6 (latest) — 2017-04-20
- 1.2.5 — 2017-03-09
- 1.2.4 — 2017-03-09
- 1.2.3 — 2017-02-03
- 1.2.2 — 2017-02-03
- 1.2.0 — 2017-02-03

## README

sugo-module-base
==========

<!---
This file is generated by ape-tmpl. Do not update manually.
--->

<!-- Badge Start -->
<a name="badges"></a>

[![Build Status][bd_travis_shield_url]][bd_travis_url]
[![npm Version][bd_npm_shield_url]][bd_npm_url]
[![JS Standard][bd_standard_shield_url]][bd_standard_url]

[bd_repo_url]: https://github.com/realglobe-Inc/sugo-module-base
[bd_travis_url]: http://travis-ci.org/realglobe-Inc/sugo-module-base
[bd_travis_shield_url]: http://img.shields.io/travis/realglobe-Inc/sugo-module-base.svg?style=flat
[bd_travis_com_url]: http://travis-ci.com/realglobe-Inc/sugo-module-base
[bd_travis_com_shield_url]: https://api.travis-ci.com/realglobe-Inc/sugo-module-base.svg?token=
[bd_license_url]: https://github.com/realglobe-Inc/sugo-module-base/blob/master/LICENSE
[bd_codeclimate_url]: http://codeclimate.com/github/realglobe-Inc/sugo-module-base
[bd_codeclimate_shield_url]: http://img.shields.io/codeclimate/github/realglobe-Inc/sugo-module-base.svg?style=flat
[bd_codeclimate_coverage_shield_url]: http://img.shields.io/codeclimate/coverage/github/realglobe-Inc/sugo-module-base.svg?style=flat
[bd_gemnasium_url]: https://gemnasium.com/realglobe-Inc/sugo-module-base
[bd_gemnasium_shield_url]: https://gemnasium.com/realglobe-Inc/sugo-module-base.svg
[bd_npm_url]: http://www.npmjs.org/package/sugo-module-base
[bd_npm_shield_url]: http://img.shields.io/npm/v/sugo-module-base.svg?style=flat
[bd_standard_url]: http://standardjs.com/
[bd_standard_shield_url]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg

<!-- Badge End -->


<!-- Description Start -->
<a name="description"></a>

Base module for SUGOS

<!-- Description End -->


<!-- Overview Start -->
<a name="overview"></a>



<!-- Overview End -->


<!-- Sections Start -->
<a name="sections"></a>

<!-- Section from "doc/guides/00.TOC.md.hbs" Start -->

<a name="section-doc-guides-00-t-o-c-md"></a>

Table of Contents
----------------

- [Requirements](#requirements)
- [Installation](#installation)
- [Usage](#usage)
- [Advanced Usage](#advanced-usage)
  * [Description with `$spec`](#description-with-spec)
  * [Define Custom Class](#define-custom-class)
  * [Use Mixins](#use-mixins)
  * [Modularize Existing Class](#modularize-existing-class)
- [License](#license)
- [Links](#links)


<!-- Section from "doc/guides/00.TOC.md.hbs" End -->

<!-- Section from "doc/guides/10.Requirements.md.hbs" Start -->

<a name="section-doc-guides-10-requirements-md"></a>

Requirements
-----

<a href="https://nodejs.org">
  <img src="https://realglobe-inc.github.io/sugos-assets/images/nodejs-banner.png"
       alt="Node.js"
       height="40"
       style="height:40px"
  /></a>
<a href="https://docs.npmjs.com/">
  <img src="https://realglobe-inc.github.io/sugos-assets/images/npm-banner.png"
       alt="NPM"
       height="40"
       style="height:40px"
  /></a>

+ [Node.js ( >=6 )][node_download_url]
+ [npm ( >=4 )][npm_url]

[node_download_url]: https://nodejs.org/en/download/
[npm_url]: https://docs.npmjs.com/


<!-- Section from "doc/guides/10.Requirements.md.hbs" End -->

<!-- Section from "doc/guides/21.Installation.md.hbs" Start -->

<a name="section-doc-guides-21-installation-md"></a>

Installation
-----

```bash
$ npm install sugo-module-base --save
```


<!-- Section from "doc/guides/21.Installation.md.hbs" End -->

<!-- Section from "doc/guides/22.Usage.md.hbs" Start -->

<a name="section-doc-guides-22-usage-md"></a>

Usage
---------

Register a module to actor.

```javascript
#!/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.

```javascript
#!/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))

```

<!-- Section from "doc/guides/22.Usage.md.hbs" End -->

<!-- Section from "doc/guides/23.Advanced Usage.md.hbs" Start -->

<a name="section-doc-guides-23-advanced-usage-md"></a>

Advanced Usage
---------

### Description with `$spec`

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

```javascript
#!/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))

```


[spec_schema_url]: https://github.com/realglobe-Inc/sg-schemas/blob/master/lib/module_spec.json


### Define Custom Class

You can define you own class by extending `Module` class

```javascript
/**
 * @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](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes#Mix-ins) would do this.


```javascript
/**
 * 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.


```javascript
/**
 * 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()
})






```

<!-- Section from "doc/guides/23.Advanced Usage.md.hbs" End -->


<!-- Sections Start -->


<!-- LICENSE Start -->
<a name="license"></a>

License
-------
This software is released under the [Apache-2.0 License](https://github.com/realglobe-Inc/sugo-module-base/blob/master/LICENSE).

<!-- LICENSE End -->


<!-- Links Start -->
<a name="links"></a>

Links
------

+ [SUGOS][sugos_url]
+ [Realglobe, Inc.][realglobe,_inc__url]

[sugos_url]: https://github.com/realglobe-Inc/sugos
[realglobe,_inc__url]: http://realglobe.jp

<!-- Links End -->

---
_Source: https://npm.io/package/sugo-module-base · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
