mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +00:00
refactoring and cleaning up core.js a bit...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
8a02178a24
commit
5a60a2810e
@ -14,8 +14,9 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Features:
|
* Features:
|
||||||
* - logger
|
* - util
|
||||||
* - introspection
|
* - introspection
|
||||||
|
* - logger
|
||||||
* - lifecycle
|
* - lifecycle
|
||||||
* base life-cycle events (start/stop/..)
|
* base life-cycle events (start/stop/..)
|
||||||
* base abort api
|
* base abort api
|
||||||
@ -26,7 +27,6 @@
|
|||||||
* - timers
|
* - timers
|
||||||
* wrapper around setInterval(..), setTimeout(..) and friends,
|
* wrapper around setInterval(..), setTimeout(..) and friends,
|
||||||
* provides persistent timer triggers and introspection...
|
* provides persistent timer triggers and introspection...
|
||||||
* - util
|
|
||||||
* - journal
|
* - journal
|
||||||
* action journaling and undo/redo functionality
|
* action journaling and undo/redo functionality
|
||||||
* XXX needs revision...
|
* XXX needs revision...
|
||||||
@ -43,6 +43,7 @@
|
|||||||
*
|
*
|
||||||
* XXX some actions use the .clone(..) action/protocol, should this be
|
* XXX some actions use the .clone(..) action/protocol, should this be
|
||||||
* defined here???
|
* defined here???
|
||||||
|
* XXX should this be split into a generic app building lib?
|
||||||
*
|
*
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
|
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
|
||||||
@ -65,49 +66,8 @@ var toggler = require('lib/toggler')
|
|||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
// NOTE: if no toggler state is set this assumes that the first state
|
|
||||||
// is the default...
|
|
||||||
// NOTE: default states is [false, true]
|
|
||||||
var makeConfigToggler =
|
|
||||||
module.makeConfigToggler =
|
|
||||||
function(attr, states, a, b){
|
|
||||||
|
|
||||||
states = states || [false, true]
|
|
||||||
var pre = a
|
|
||||||
// XXX is this a good default???
|
|
||||||
//var post = b || function(action){ action != null && this.focusImage() }
|
|
||||||
var post = b
|
|
||||||
|
|
||||||
return toggler.Toggler(null,
|
|
||||||
function(_, action){
|
|
||||||
var lst = states instanceof Array ? states
|
|
||||||
: states instanceof Function ? states.call(this)
|
|
||||||
: states
|
|
||||||
|
|
||||||
// get attr path...
|
|
||||||
var a = attr.split(/\./g)
|
|
||||||
var cfg = a.slice(0, -1)
|
|
||||||
.reduce(function(res, cur){
|
|
||||||
return res[cur] }, this.config)
|
|
||||||
|
|
||||||
if(action == null){
|
|
||||||
var val = cfg[a.pop()]
|
|
||||||
return val == null ?
|
|
||||||
(lst[lst.indexOf('none')] || lst[0])
|
|
||||||
: val
|
|
||||||
|
|
||||||
} else {
|
|
||||||
cfg[a[a.length-1]] = action
|
|
||||||
this.config[a[0]] = this.config[a[0]]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
states, pre, post)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
|
||||||
// Root ImageGrid.viewer object constructor...
|
// Root ImageGrid.viewer object constructor...
|
||||||
//
|
//
|
||||||
// This adds:
|
// This adds:
|
||||||
@ -166,7 +126,8 @@ ImageGridFeatures.__actions__ =
|
|||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Setup runtime info...
|
// Setup runtime info...
|
||||||
// XXX add chrome-app...
|
//
|
||||||
|
// XXX add PWA / chrome-app...
|
||||||
// XXX add cordova...
|
// XXX add cordova...
|
||||||
// XXX add mobile...
|
// XXX add mobile...
|
||||||
// XXX add widget...
|
// XXX add widget...
|
||||||
@ -220,6 +181,251 @@ if(typeof(window) != 'undefined'){
|
|||||||
|
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
// Util...
|
||||||
|
|
||||||
|
// Toggle value in .config...
|
||||||
|
//
|
||||||
|
// NOTE: if no toggler state is set this assumes that the first state
|
||||||
|
// is the default...
|
||||||
|
// NOTE: default states is [false, true]
|
||||||
|
var makeConfigToggler =
|
||||||
|
module.makeConfigToggler =
|
||||||
|
function(attr, states, a, b){
|
||||||
|
|
||||||
|
states = states || [false, true]
|
||||||
|
var pre = a
|
||||||
|
// XXX is this a good default???
|
||||||
|
//var post = b || function(action){ action != null && this.focusImage() }
|
||||||
|
var post = b
|
||||||
|
|
||||||
|
return toggler.Toggler(null,
|
||||||
|
function(_, action){
|
||||||
|
var lst = states instanceof Array ? states
|
||||||
|
: states instanceof Function ? states.call(this)
|
||||||
|
: states
|
||||||
|
|
||||||
|
// get attr path...
|
||||||
|
var a = attr.split(/\./g)
|
||||||
|
var cfg = a.slice(0, -1)
|
||||||
|
.reduce(function(res, cur){
|
||||||
|
return res[cur] }, this.config)
|
||||||
|
|
||||||
|
if(action == null){
|
||||||
|
var val = cfg[a.pop()]
|
||||||
|
return val == null ?
|
||||||
|
(lst[lst.indexOf('none')] || lst[0])
|
||||||
|
: val
|
||||||
|
|
||||||
|
} else {
|
||||||
|
cfg[a[a.length-1]] = action
|
||||||
|
this.config[a[0]] = this.config[a[0]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
states, pre, post)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
var UtilActions = actions.Actions({
|
||||||
|
mergeConfig: ['- System/',
|
||||||
|
doc`Merge a config object into .config
|
||||||
|
`,
|
||||||
|
function(config){
|
||||||
|
config = config instanceof Function ? config.call(this)
|
||||||
|
: typeof(config) == typeof('str') ? this.config[config]
|
||||||
|
: config
|
||||||
|
Object.assign(this.config, config) }],
|
||||||
|
})
|
||||||
|
|
||||||
|
var Util =
|
||||||
|
module.Util = ImageGridFeatures.Feature({
|
||||||
|
title: '',
|
||||||
|
doc: '',
|
||||||
|
|
||||||
|
tag: 'util',
|
||||||
|
|
||||||
|
actions: UtilActions,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
// Introspection...
|
||||||
|
|
||||||
|
// Normalize doc strings...
|
||||||
|
//
|
||||||
|
// This will remove indent padding from all lines in a doc string.
|
||||||
|
//
|
||||||
|
// This is useful for documenting actions using ES6 template/multi-line
|
||||||
|
// strings and keep them sane in terms of indent...
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// someAction: ['Test/Some action title',
|
||||||
|
// core.doc`This is an example...
|
||||||
|
// mult-iline...
|
||||||
|
// ...doc string that will be normalized and look the same but`
|
||||||
|
// without the indent...`,
|
||||||
|
// function(){ ... }]
|
||||||
|
//
|
||||||
|
// NOTE: this will ignore the first line's indent so it can be started
|
||||||
|
// right at the string start.
|
||||||
|
//
|
||||||
|
// XXX might be a good idea to move this to a more generic spot like lib/util.js...
|
||||||
|
//var doc = module.doc = object.doc
|
||||||
|
var doc = module.doc = actions.doc
|
||||||
|
var text = module.text = object.text
|
||||||
|
|
||||||
|
|
||||||
|
// Indicate that an action is not intended for direct use...
|
||||||
|
//
|
||||||
|
// NOTE: this will not do anything but mark the action.
|
||||||
|
var notUserCallable =
|
||||||
|
module.notUserCallable =
|
||||||
|
function(func){
|
||||||
|
func.__not_user_callable__ = true
|
||||||
|
return func }
|
||||||
|
|
||||||
|
// NOTE: this is the same as event but user-callable...
|
||||||
|
var UserEvent =
|
||||||
|
module.UserEvent =
|
||||||
|
function(func){
|
||||||
|
func.__event__ = true
|
||||||
|
return func }
|
||||||
|
|
||||||
|
// XXX rename???
|
||||||
|
var Event =
|
||||||
|
module.Event =
|
||||||
|
function(func){
|
||||||
|
func.__event__ = true
|
||||||
|
return notUserCallable(func) }
|
||||||
|
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
var IntrospectionActions = actions.Actions({
|
||||||
|
get useractions(){
|
||||||
|
return this.cache('useractions', function(d){
|
||||||
|
return d instanceof Array ?
|
||||||
|
d.slice()
|
||||||
|
: this.actions.filter(this.isUserCallable.bind(this)) }) },
|
||||||
|
get events(){
|
||||||
|
return this.cache('events', function(d){
|
||||||
|
return d instanceof Array ?
|
||||||
|
d.slice()
|
||||||
|
: this.actions.filter(this.isEvent.bind(this)) }) },
|
||||||
|
|
||||||
|
isUserCallable:
|
||||||
|
// XXX should this check only the root action or the whole set???
|
||||||
|
// ...in other words: can we make an action non-user-callable
|
||||||
|
// anywhere other than the root action?
|
||||||
|
// IMO no...
|
||||||
|
//function(action){
|
||||||
|
// return this.getActionAttr(action, '__not_user_callable__') != true }],
|
||||||
|
actions.doWithRootAction(function(action){
|
||||||
|
return action.__not_user_callable__ != true }),
|
||||||
|
isEvent:
|
||||||
|
actions.doWithRootAction(function(action){
|
||||||
|
return !!action.__event__ }),
|
||||||
|
|
||||||
|
// XXX revise...
|
||||||
|
getActionMode: ['- Interface/',
|
||||||
|
doc`Get action browse mode...
|
||||||
|
|
||||||
|
Get and action's .mode(..) method and return its result.
|
||||||
|
|
||||||
|
Action .mode can be:
|
||||||
|
<function> - action method.
|
||||||
|
<action-name> - alias, name of action to get the
|
||||||
|
method from.
|
||||||
|
|
||||||
|
The action .mode(..) method is called in the context of actions.
|
||||||
|
|
||||||
|
Basic example:
|
||||||
|
someAction: ['Path/To/Some action',
|
||||||
|
{mode: function(){ ... }},
|
||||||
|
function(){
|
||||||
|
...
|
||||||
|
}],
|
||||||
|
someOtherAction: ['Path/To/Some action',
|
||||||
|
// alias
|
||||||
|
{mode: 'someAction'},
|
||||||
|
function(){
|
||||||
|
...
|
||||||
|
}],
|
||||||
|
|
||||||
|
|
||||||
|
Usage pattern:
|
||||||
|
// for cases where we need to define an explicit mode...
|
||||||
|
actionModeX: ['- System/',
|
||||||
|
{mode: function(){
|
||||||
|
return this.actionModeX() }},
|
||||||
|
core.notUserCallable(function(){
|
||||||
|
return ...
|
||||||
|
})],
|
||||||
|
someAction: [
|
||||||
|
// use the mode...
|
||||||
|
{mode: 'actionModeX'},
|
||||||
|
function(){
|
||||||
|
...
|
||||||
|
}],
|
||||||
|
`,
|
||||||
|
function(action, mode_cache){
|
||||||
|
var m = action
|
||||||
|
var visited = [m]
|
||||||
|
var last
|
||||||
|
|
||||||
|
// check cache...
|
||||||
|
if(m in (mode_cache || {})){
|
||||||
|
return mode_cache[m] }
|
||||||
|
|
||||||
|
// handle aliases...
|
||||||
|
do {
|
||||||
|
last = m
|
||||||
|
m = this.getActionAttr(m, 'mode')
|
||||||
|
|
||||||
|
// check cache...
|
||||||
|
if(m in (mode_cache || {})){
|
||||||
|
return mode_cache[m] }
|
||||||
|
|
||||||
|
// check for loops...
|
||||||
|
if(m && visited[m] != null){
|
||||||
|
m = null
|
||||||
|
break
|
||||||
|
}
|
||||||
|
visited.push(m)
|
||||||
|
} while(typeof(m) == typeof('str'))
|
||||||
|
|
||||||
|
//return m ? m.call(this) : undefined
|
||||||
|
return m ?
|
||||||
|
// no cache...
|
||||||
|
(mode_cache == null ?
|
||||||
|
m.call(this)
|
||||||
|
// cache hit...
|
||||||
|
: last in mode_cache ?
|
||||||
|
mode_cache[last]
|
||||||
|
// call check and populate cache...
|
||||||
|
: (mode_cache[action] =
|
||||||
|
mode_cache[last] =
|
||||||
|
m.call(this)))
|
||||||
|
: actions.UNDEFINED }],
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
var Introspection =
|
||||||
|
module.Introspection = ImageGridFeatures.Feature({
|
||||||
|
title: '',
|
||||||
|
|
||||||
|
tag: 'introspection',
|
||||||
|
depends: [
|
||||||
|
'cache'
|
||||||
|
],
|
||||||
|
|
||||||
|
actions: IntrospectionActions,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------
|
||||||
// Logger...
|
// Logger...
|
||||||
|
|
||||||
var LoggerActions = actions.Actions({
|
var LoggerActions = actions.Actions({
|
||||||
@ -419,185 +625,6 @@ module.Logger = ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
|
||||||
// Introspection...
|
|
||||||
|
|
||||||
// Normalize doc strings...
|
|
||||||
//
|
|
||||||
// This will remove indent padding from all lines in a doc string.
|
|
||||||
//
|
|
||||||
// This is useful for documenting actions using ES6 template/multi-line
|
|
||||||
// strings and keep them sane in terms of indent...
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
// someAction: ['Test/Some action title',
|
|
||||||
// core.doc`This is an example...
|
|
||||||
// mult-iline...
|
|
||||||
// ...doc string that will be normalized and look the same but`
|
|
||||||
// without the indent...`,
|
|
||||||
// function(){ ... }]
|
|
||||||
//
|
|
||||||
// NOTE: this will ignore the first line's indent so it can be started
|
|
||||||
// right at the string start.
|
|
||||||
//
|
|
||||||
// XXX might be a good idea to move this to a more generic spot like lib/util.js...
|
|
||||||
//var doc = module.doc = object.doc
|
|
||||||
var doc = module.doc = actions.doc
|
|
||||||
var text = module.text = object.text
|
|
||||||
|
|
||||||
|
|
||||||
// Indicate that an action is not intended for direct use...
|
|
||||||
//
|
|
||||||
// NOTE: this will not do anything but mark the action.
|
|
||||||
var notUserCallable =
|
|
||||||
module.notUserCallable =
|
|
||||||
function(func){
|
|
||||||
func.__not_user_callable__ = true
|
|
||||||
return func
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: this is the same as event but user-callable...
|
|
||||||
var UserEvent =
|
|
||||||
module.UserEvent =
|
|
||||||
function(func){
|
|
||||||
func.__event__ = true
|
|
||||||
return func
|
|
||||||
}
|
|
||||||
|
|
||||||
// XXX rename???
|
|
||||||
var Event =
|
|
||||||
module.Event =
|
|
||||||
function(func){
|
|
||||||
func.__event__ = true
|
|
||||||
return notUserCallable(func)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
|
|
||||||
var IntrospectionActions = actions.Actions({
|
|
||||||
get useractions(){
|
|
||||||
return this.cache('useractions', function(d){
|
|
||||||
return d instanceof Array ?
|
|
||||||
d.slice()
|
|
||||||
: this.actions.filter(this.isUserCallable.bind(this)) }) },
|
|
||||||
get events(){
|
|
||||||
return this.cache('events', function(d){
|
|
||||||
return d instanceof Array ?
|
|
||||||
d.slice()
|
|
||||||
: this.actions.filter(this.isEvent.bind(this)) }) },
|
|
||||||
|
|
||||||
isUserCallable:
|
|
||||||
// XXX should this check only the root action or the whole set???
|
|
||||||
// ...in other words: can we make an action non-user-callable
|
|
||||||
// anywhere other than the root action?
|
|
||||||
// IMO no...
|
|
||||||
//function(action){
|
|
||||||
// return this.getActionAttr(action, '__not_user_callable__') != true }],
|
|
||||||
actions.doWithRootAction(function(action){
|
|
||||||
return action.__not_user_callable__ != true }),
|
|
||||||
isEvent:
|
|
||||||
actions.doWithRootAction(function(action){
|
|
||||||
return !!action.__event__ }),
|
|
||||||
|
|
||||||
// XXX revise...
|
|
||||||
getActionMode: ['- Interface/',
|
|
||||||
doc`Get action browse mode...
|
|
||||||
|
|
||||||
Get and action's .mode(..) method and return its result.
|
|
||||||
|
|
||||||
Action .mode can be:
|
|
||||||
<function> - action method.
|
|
||||||
<action-name> - alias, name of action to get the
|
|
||||||
method from.
|
|
||||||
|
|
||||||
The action .mode(..) method is called in the context of actions.
|
|
||||||
|
|
||||||
Basic example:
|
|
||||||
someAction: ['Path/To/Some action',
|
|
||||||
{mode: function(){ ... }},
|
|
||||||
function(){
|
|
||||||
...
|
|
||||||
}],
|
|
||||||
someOtherAction: ['Path/To/Some action',
|
|
||||||
// alias
|
|
||||||
{mode: 'someAction'},
|
|
||||||
function(){
|
|
||||||
...
|
|
||||||
}],
|
|
||||||
|
|
||||||
|
|
||||||
Usage pattern:
|
|
||||||
// for cases where we need to define an explicit mode...
|
|
||||||
actionModeX: ['- System/',
|
|
||||||
{mode: function(){
|
|
||||||
return this.actionModeX() }},
|
|
||||||
core.notUserCallable(function(){
|
|
||||||
return ...
|
|
||||||
})],
|
|
||||||
someAction: [
|
|
||||||
// use the mode...
|
|
||||||
{mode: 'actionModeX'},
|
|
||||||
function(){
|
|
||||||
...
|
|
||||||
}],
|
|
||||||
`,
|
|
||||||
function(action, mode_cache){
|
|
||||||
var m = action
|
|
||||||
var visited = [m]
|
|
||||||
var last
|
|
||||||
|
|
||||||
// check cache...
|
|
||||||
if(m in (mode_cache || {})){
|
|
||||||
return mode_cache[m] }
|
|
||||||
|
|
||||||
// handle aliases...
|
|
||||||
do {
|
|
||||||
last = m
|
|
||||||
m = this.getActionAttr(m, 'mode')
|
|
||||||
|
|
||||||
// check cache...
|
|
||||||
if(m in (mode_cache || {})){
|
|
||||||
return mode_cache[m] }
|
|
||||||
|
|
||||||
// check for loops...
|
|
||||||
if(m && visited[m] != null){
|
|
||||||
m = null
|
|
||||||
break
|
|
||||||
}
|
|
||||||
visited.push(m)
|
|
||||||
} while(typeof(m) == typeof('str'))
|
|
||||||
|
|
||||||
//return m ? m.call(this) : undefined
|
|
||||||
return m ?
|
|
||||||
// no cache...
|
|
||||||
(mode_cache == null ?
|
|
||||||
m.call(this)
|
|
||||||
// cache hit...
|
|
||||||
: last in mode_cache ?
|
|
||||||
mode_cache[last]
|
|
||||||
// call check and populate cache...
|
|
||||||
: (mode_cache[action] =
|
|
||||||
mode_cache[last] =
|
|
||||||
m.call(this)))
|
|
||||||
: actions.UNDEFINED }],
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
var Introspection =
|
|
||||||
module.Introspection = ImageGridFeatures.Feature({
|
|
||||||
title: '',
|
|
||||||
|
|
||||||
tag: 'introspection',
|
|
||||||
depends: [
|
|
||||||
'cache'
|
|
||||||
],
|
|
||||||
|
|
||||||
actions: IntrospectionActions,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// System life-cycle...
|
// System life-cycle...
|
||||||
|
|
||||||
@ -1001,6 +1028,7 @@ module.LifeCycle = ImageGridFeatures.Feature({
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Serialization...
|
// Serialization...
|
||||||
|
|
||||||
@ -1025,6 +1053,7 @@ module.Serialization = ImageGridFeatures.Feature({
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Cache...
|
// Cache...
|
||||||
|
|
||||||
@ -1839,31 +1868,6 @@ module.Timers = ImageGridFeatures.Feature({
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
|
||||||
// Util...
|
|
||||||
|
|
||||||
var UtilActions = actions.Actions({
|
|
||||||
mergeConfig: ['- System/',
|
|
||||||
doc`Merge a config object into .config
|
|
||||||
`,
|
|
||||||
function(config){
|
|
||||||
config = config instanceof Function ? config.call(this)
|
|
||||||
: typeof(config) == typeof('str') ? this.config[config]
|
|
||||||
: config
|
|
||||||
Object.assign(this.config, config)
|
|
||||||
}],
|
|
||||||
})
|
|
||||||
|
|
||||||
var Util =
|
|
||||||
module.Util = ImageGridFeatures.Feature({
|
|
||||||
title: '',
|
|
||||||
doc: '',
|
|
||||||
|
|
||||||
tag: 'util',
|
|
||||||
|
|
||||||
actions: UtilActions,
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Journal...
|
// Journal...
|
||||||
@ -2148,7 +2152,7 @@ module.Journal = ImageGridFeatures.Feature({
|
|||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Changes API...
|
// Changes...
|
||||||
|
|
||||||
var ChangesActions = actions.Actions({
|
var ChangesActions = actions.Actions({
|
||||||
// This can be:
|
// This can be:
|
||||||
@ -2679,6 +2683,8 @@ function(title, func){
|
|||||||
// mode.
|
// mode.
|
||||||
// NOTE: since the sync-mode can block it must be used very carefully.
|
// NOTE: since the sync-mode can block it must be used very carefully.
|
||||||
//
|
//
|
||||||
|
// XXX might be a good idea to split this into a generic and domain parts
|
||||||
|
// and move the generic part into types/runner...
|
||||||
// XXX check if item is already in queue...
|
// XXX check if item is already in queue...
|
||||||
var queueHandler =
|
var queueHandler =
|
||||||
module.queueHandler =
|
module.queueHandler =
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user