0.0.33-alpha.5 • Published 9 years ago
ironworks v0.0.33-alpha.5
ironworks
ironworks is a worker (plug-in) based framework to assist in creating a modular, interconnected microservice ecosystem
it provides several built-in workers as well as a base class to create custom workers
Documentation (coming soon)
Installation
npm install ironworks
Overview
services
- a
Serviceis a container for workers - a
Workeris added to aServiceusing theuse(worker)method - when all workers are added, call the
start()method - when a
Serviceis started, it calls workflow methods on each worker:preInit(comm, whoService, [callback])- this is mainly an internal step - it should not be overridden under normal circumstances
commis the instance ofiron-beamthat serves as ironworks shared eventing enginewhoServiceis an object with the name and id of the servicecallbackaccepts an error parameter- always
return super.preInit(comm, whoService, [callback])from this method
init([callback])- this is the step where listeners are created
- listeners can be created after this step, but certain
Servicefeatures will not take them into account callbackaccepts an error parameter- always
return super.init([callback])from this method
postInit([dependencies], [callback])- this step is used to interact with other workers once they have created their listeners in
init dependencieswill be aCollectionof workers that this worker depends on - those workers will have already completed theirpostInitstepcallbackaccepts an error parameter- always
return super.postInit([dependencies], [callback])from this method
- this step is used to interact with other workers once they have created their listeners in
start([dependencies], [callback])- this step is used to interact with other workers once they have be started
dependencieswill be aCollectionof workers that this worker depends on - those workers will have already completed theirstartstepcallbackaccepts an error parameter- always
return super.start([dependencies], [callback])from this method
postStart([dependencies], [callback])- this step is used to interact with other workers after they have been started
dependencieswill be aCollectionof workers that this worker depends on - those workers will have already completed theirpostStartstepcallbackaccepts an error parameter- always
return super.postStart([dependencies], [callback])from this method
- call
getWorker(name, callback)to get a worker from a started service - callback accepts an error and the worker, if found - call
dispose([callback])to stop a service which will dispose it's workers and release it's listeners and other references - callback is optional and does not accept an error parameter (disposal errors are handled internally through stdout)
workers
- a
Workeris a class that overrides service workflow methods in order to add event listeners to accomplish some task- eventing methods - ironworks uses 6 pairs of methods for emitters/listeners, instead of just emit/on, so that the parameter signature will be known to the framework
tell('event')->listen('event')- the simplest form where no information is sent or received - the event occurence is all that is needed
inform('information', { some: 'info' })->info('information', (info) => {...})- the emitter is providing information to the listener
confirm('task', (e) => {...})->verify('task', (cb) => {...})- the emitter needs to know when a listener has performed it's task
check('receipt', { product: 'data' }, (e) => {...})->ack('receipt', (product, cb) => {...})- the emitter needs to know when a listener has performed it's task on the provided information
ask('question', (e, answer) => {...})->answer('question', (cb) => {...})- the emitter needs information from the listener
request('action', { request: 'data' }, (e, response) => {...}->respond('action', (req, cb) => {...})- the emitter needs to get information from a listener about the provided information
- eventing methods - ironworks uses 6 pairs of methods for emitters/listeners, instead of just emit/on, so that the parameter signature will be known to the framework
event namespacing
ironworks uses a 5 part namespce for all event names - (i.e. - comm.service-name.request.my-worker.do-task)
- prefix
- used to create distinct channels for events inside the same service
- defaults to 'comm'
- service
- used to identify the target service name when communicating between mulitple services
- method
- the name of the "emit" method name used (i.e. - request, tell, check, etc.)
- worker
- the worker name that houses the listener for the event
- name
- the name of the event
built-in workers
- http server
- can be used to serve static files
- can provide a REST api for all listeners not annotated with
{ internal: true }
- socket
- depends on
HttpServerWorker - can be used to receive communication from other ironworks services via
ConnectorWorker - can provide a
socket.ioapi for all listeners not annotated with{ internal: true }
- depends on
- auth
- depends on
HttpServerWorkerandSocketWorker - can authenticate event listener endpoints using jwt tokens
- can authorize event listeners endpoints using roles
- depends on
- log
- will log all events to stdout
- events can be annotated
{ log: { level: [detail number] } }to control the detail level of the logs
- metric
- will emit
comm.[service name].inform.iw-metric-[metric worker name].incrementfor every event so that counts can be calculated - will emit
comm.[service name].inform.iw-metric-[metric worker name].durationfor every event so that execution time averages can be calculated
- will emit
- connector
- used to connect to other ironworks services
- more to come!
- environment
- used to get environment variables from the system
examples
http file server
import ironworks = require('ironworks');
import Service = ironworks.service.Service;
import HttpServerWorker = ironworks.workers.HttpServerWorker;
new Service('my-file-server')
.use(new HttpServerWorker({
port: 9967,
rootSitePagePath: "index.html", //the file served for the site root
hapi: { // this entire object is passed to hapi, any valid hapi option can be used
connections: {
routes: {
files: {
relativeTo: path.resolve('./content/public')
}
}
}
}
})
.start();http REST api server
import ironworks = require('ironworks');
import Service = ironworks.service.Service;
import HttpServerWorker = ironworks.workers.HttpServerWorker;
new Service('my-api-service')
.use(new HttpServerWorker({
port: 9967,
apiRoute: 'api' // used to separate the ironworks REST endpoints from your other urls
})
.answer('echo-endpoint', (req, cb) => {
cb(null, req);
}) // this will create an endpoint at http://hostname:9967/api/comm/my-api-service/ask/iw-service/echo-endpoint?some=data
.start();more examples on the way
0.0.33-alpha.5
9 years ago
0.0.33-alpha.4
9 years ago
0.0.33-alpha.3
9 years ago
0.0.33-alpha.2
9 years ago
0.0.33-alpha.1
9 years ago
0.0.33-alpha.0
9 years ago
0.0.33
9 years ago
0.0.32
9 years ago
0.0.31
9 years ago
0.0.30
9 years ago
0.0.29
9 years ago
0.0.28
9 years ago
0.0.27
9 years ago
0.0.26
9 years ago
0.0.25
9 years ago
0.0.22
10 years ago
0.0.21
10 years ago
0.0.20
10 years ago
0.0.19
10 years ago
0.0.18
10 years ago
0.0.17
10 years ago
0.0.16
10 years ago
0.0.15
10 years ago
0.0.14
10 years ago
0.0.13
10 years ago
0.0.12
10 years ago
0.0.11
10 years ago
0.0.10
10 years ago
0.0.9
10 years ago
0.0.8
10 years ago
0.0.5
10 years ago
0.0.2
10 years ago