@leansdk/leanrc
Version:
LeanRC is a MVC framework for creating graceful applications
160 lines (140 loc) • 5 kB
text/coffeescript
# This file is part of LeanRC.
#
# LeanRC is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# LeanRC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with LeanRC. If not, see <https://www.gnu.org/licenses/>.
###
for example
```coffee
module.exports = (Module)->
{
Resource
BodyParseMixin
} = Module::
class CucumbersResource extends Resource
BodyParseMixin
Module
'parseBody', only: ['create', 'update']
entityName: String,
default: 'cucumber'
CucumbersResource.initialize()
```
###
module.exports = (Module)->
{
MIGRATE
ROLLBACK
JOB_RESULT
HANDLER_RESULT
STOPPED_MIGRATE
STOPPED_ROLLBACK
AnyT, PointerT, EventEmitterT
FuncG, MaybeG, StructG
ContextInterface, ResourceInterface, NotificationInterface
Mediator, Mixin
Utils: { genRandomAlphaNumbers }
} = Module::
Module.defineMixin Mixin 'ApplicationMediatorMixin', (BaseClass = Mediator) ->
class extends BaseClass
ipoEmitter = PointerT emitter: EventEmitterT
listNotificationInterests: FuncG([], Array),
default: (args...)->
interests = args...
interests.push HANDLER_RESULT
interests.push JOB_RESULT
interests.push STOPPED_MIGRATE
interests.push STOPPED_ROLLBACK
interests
handleNotification: FuncG(NotificationInterface),
default: (aoNotification)->
vsName = aoNotification.getName()
voBody = aoNotification.getBody()
vsType = aoNotification.getType()
switch vsName
when HANDLER_RESULT, STOPPED_MIGRATE, STOPPED_ROLLBACK, JOB_RESULT
@[ipoEmitter].emit vsType, voBody
break
else
aoNotification
return
migrate: FuncG([MaybeG StructG until: MaybeG String]),
default: (opts)->
return yield Module::Promise.new (resolve, reject)=>
try
reverse = genRandomAlphaNumbers 32
@[ipoEmitter].once reverse, ({error})->
if error?
reject error
return
resolve()
return
.sendNotification MIGRATE, opts, reverse
catch err
reject err
return
rollback: FuncG([MaybeG StructG steps: MaybeG(Number), until: MaybeG String]),
default: (opts)->
return yield Module::Promise.new (resolve, reject)=>
try
reverse = genRandomAlphaNumbers 32
@[ipoEmitter].once reverse, ({error})->
if error?
reject error
return
resolve()
return
.sendNotification ROLLBACK, opts, reverse
catch err
reject err
return
run: FuncG([String, MaybeG AnyT], MaybeG AnyT),
default: (scriptName, data)->
return yield Module::Promise.new (resolve, reject)=>
try
reverse = genRandomAlphaNumbers 32
@[ipoEmitter].once reverse, ({error, result})->
if error?
reject error
return
resolve(result)
return
.sendNotification scriptName, data, reverse
catch err
reject err
return
execute: FuncG([String, StructG({
context: ContextInterface, reverse: String
}), String], StructG {
result: MaybeG(AnyT), resource: ResourceInterface
}),
default: (resourceName, {context, reverse}, action)->
return yield Module::Promise.new (resolve, reject)=>
try
@[ipoEmitter].once reverse, ({error, result, resource})->
if error?
reject error
return
resolve {result, resource}
return
resourceName, {context, reverse}, action, null
catch err
reject err
return
init: FuncG([String, AnyT]),
default: (args...)->
EventEmitter = require 'events'
voEmitter = new EventEmitter()
@[ipoEmitter] = voEmitter
return args...