@live-change/framework 0.7.12 → 0.7.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -5,7 +5,7 @@ const SplitEmitQueue = require('../utils/SplitEmitQueue.js')
|
|
|
5
5
|
|
|
6
6
|
async function startTriggerExecutor(service, config) {
|
|
7
7
|
if(!config.runCommands) return
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
service.keyBasedExecutionQueues = service.keyBasedExecutionQueues || new KeyBasedExecutionQueues(r => r.key)
|
|
10
10
|
|
|
11
11
|
await service.dao.request(['database', 'createTable'], service.databaseName, 'triggerRoutes').catch(e => 'ok')
|
|
@@ -13,78 +13,12 @@ async function startTriggerExecutor(service, config) {
|
|
|
13
13
|
service.triggerQueue = new CommandQueue(service.dao, service.databaseName,
|
|
14
14
|
service.app.splitTriggers ? `${service.name}_triggers` : 'triggers', service.name )
|
|
15
15
|
for (let triggerName in service.triggers) {
|
|
16
|
-
const
|
|
16
|
+
const triggers = service.triggers[triggerName]
|
|
17
17
|
await service.dao.request(['database', 'put'], service.databaseName, 'triggerRoutes',
|
|
18
18
|
{ id: triggerName + '=>' + service.name, trigger: triggerName, service: service.name })
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Array.isArray(queuedBy) ? (c) => JSON.stringify(queuedBy.map(k=>c[k])) :
|
|
23
|
-
(c) => JSON.stringify(c[queuedBy]) )
|
|
24
|
-
service.triggerQueue.addCommandHandler(triggerName, async (trig) => {
|
|
25
|
-
const profileOp = await service.profileLog.begin({ operation: 'queueTrigger', triggerType: triggerName,
|
|
26
|
-
triggerId: trig.id, by: trig.by })
|
|
27
|
-
console.log("QUEUED TRIGGER STARTED", trig)
|
|
28
|
-
const reportFinished = trigger.definition.waitForEvents ? 'trigger_'+trig.id : undefined
|
|
29
|
-
const flags = { triggerId: trig.id, reportFinished }
|
|
30
|
-
const emit = service.app.splitEvents
|
|
31
|
-
? new SplitEmitQueue(service, flags)
|
|
32
|
-
: new SingleEmitQueue(service, flags)
|
|
33
|
-
const routine = () => service.profileLog.profile({ operation: 'runTrigger', triggerType: triggerName,
|
|
34
|
-
commandId: trig.id, by: trig.by }, async () => {
|
|
35
|
-
let result
|
|
36
|
-
try {
|
|
37
|
-
console.log("TRIGGERED!!", trig)
|
|
38
|
-
result = await service.app.assertTime('trigger '+trigger.definition.name,
|
|
39
|
-
trigger.definition.timeout || 10000,
|
|
40
|
-
() => trigger.execute(trig, (...args) => emit.emit(...args)), trig)
|
|
41
|
-
console.log("TRIGGER DONE!", trig)
|
|
42
|
-
} catch (e) {
|
|
43
|
-
console.error(`TRIGGER ${triggerName} ERROR`, e.stack)
|
|
44
|
-
throw e
|
|
45
|
-
}
|
|
46
|
-
const events = await emit.commit()
|
|
47
|
-
if(trigger.definition.waitForEvents)
|
|
48
|
-
await service.app.waitForEvents(reportFinished, events, trigger.definition.waitForEvents)
|
|
49
|
-
return result
|
|
50
|
-
})
|
|
51
|
-
try {
|
|
52
|
-
routine.key = keyFunction(trig)
|
|
53
|
-
} catch(e) {
|
|
54
|
-
console.error("QUEUE KEY FUNCTION ERROR", e)
|
|
55
|
-
}
|
|
56
|
-
console.log("TRIGGER QUEUE KEY", routine.key)
|
|
57
|
-
const promise = service.keyBasedExecutionQueues.queue(routine)
|
|
58
|
-
await service.profileLog.endPromise(profileOp, promise)
|
|
59
|
-
return promise
|
|
60
|
-
})
|
|
61
|
-
} else {
|
|
62
|
-
service.triggerQueue.addCommandHandler(triggerName,
|
|
63
|
-
(trig) => service.profileLog.profile({ operation: 'runTrigger', triggerType: triggerName,
|
|
64
|
-
commandId: trig.id, by: trig.by }, async () => {
|
|
65
|
-
console.log("NOT QUEUED TRIGGER STARTED", trig)
|
|
66
|
-
const reportFinished = trigger.definition.waitForEvents ? 'trigger_'+trig.id : undefined
|
|
67
|
-
const flags = { triggerId: trig.id, reportFinished }
|
|
68
|
-
const emit = service.app.splitEvents
|
|
69
|
-
? new SplitEmitQueue(service, flags)
|
|
70
|
-
: new SingleEmitQueue(service, flags)
|
|
71
|
-
let result
|
|
72
|
-
try {
|
|
73
|
-
result = await service.app.assertTime('trigger '+trigger.definition.name,
|
|
74
|
-
trigger.definition.timeout || 10000,
|
|
75
|
-
() => trigger.execute(trig, (...args) => emit.emit(...args)), trig)
|
|
76
|
-
console.log("TRIGGER DONE!", trig)
|
|
77
|
-
} catch (e) {
|
|
78
|
-
console.error(`TRIGGER ${triggerName} ERROR`, e.stack)
|
|
79
|
-
throw e
|
|
80
|
-
}
|
|
81
|
-
const events = await emit.commit()
|
|
82
|
-
if(trigger.definition.waitForEvents)
|
|
83
|
-
await service.app.waitForEvents(reportFinished, events, trigger.definition.waitForEvents)
|
|
84
|
-
return result
|
|
85
|
-
})
|
|
86
|
-
)
|
|
87
|
-
}
|
|
19
|
+
service.triggerQueue.addCommandHandler(triggerName,
|
|
20
|
+
(trig) => Promise.all(triggers.map( trigger => trigger.execute(trig, service) ))
|
|
21
|
+
)
|
|
88
22
|
}
|
|
89
23
|
|
|
90
24
|
service.triggerQueue.start()
|
package/lib/runtime/Dao.js
CHANGED
|
@@ -11,11 +11,12 @@ function prepareReactiveDaoDefinition(config, clientData) {
|
|
|
11
11
|
if(!clientData.roles) throw new Error("no roles")
|
|
12
12
|
let dao = {}
|
|
13
13
|
if(config.remote) {
|
|
14
|
-
const
|
|
15
|
-
for (let
|
|
16
|
-
dao[
|
|
14
|
+
const remote = config.remote(clientData)
|
|
15
|
+
for (let remoteName of remote) {
|
|
16
|
+
dao[remoteName] = {
|
|
17
17
|
type: "remote",
|
|
18
|
-
generator:
|
|
18
|
+
generator: ReactiveDao.ObservableList,
|
|
19
|
+
...remote
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
}
|
package/lib/runtime/Service.js
CHANGED
|
@@ -52,7 +52,8 @@ class Service {
|
|
|
52
52
|
|
|
53
53
|
this.triggers = {}
|
|
54
54
|
for(let triggerName in this.definition.triggers) {
|
|
55
|
-
this.triggers[triggerName] =
|
|
55
|
+
this.triggers[triggerName] = this.definition.triggers[triggerName]
|
|
56
|
+
.map(trigger => new TriggerHandler( trigger, this ))
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
this.events = {}
|
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
const { prepareParameters, processReturn } = require("./params.js")
|
|
2
|
+
const SplitEmitQueue = require("../utils/SplitEmitQueue.js");
|
|
3
|
+
const SingleEmitQueue = require("../utils/SingleEmitQueue.js");
|
|
2
4
|
|
|
3
5
|
class TriggerHandler {
|
|
4
6
|
|
|
5
7
|
constructor(definition, service) {
|
|
6
8
|
this.definition = definition
|
|
7
9
|
this.service = service
|
|
10
|
+
|
|
11
|
+
if(definition.queuedBy) {
|
|
12
|
+
const queuedBy = definition.queuedBy
|
|
13
|
+
this.queueKeyFunction = typeof queuedBy == 'function' ? queuedBy : (
|
|
14
|
+
Array.isArray(queuedBy) ? (c) => JSON.stringify(queuedBy.map(k=>c[k])) :
|
|
15
|
+
(c) => JSON.stringify(c[queuedBy]) )
|
|
16
|
+
}
|
|
8
17
|
}
|
|
9
18
|
|
|
10
|
-
async
|
|
19
|
+
async doExecute(parameters, emit) {
|
|
11
20
|
//console.log("PARAMETERS", JSON.stringify(parameters), "DEFN", this.definition.properties)
|
|
12
|
-
const preparedParams = await prepareParameters(parameters, definition.properties, this.service)
|
|
21
|
+
const preparedParams = await prepareParameters(parameters, this.definition.properties, this.service)
|
|
13
22
|
//console.log("PREP PARAMS", preparedParams)
|
|
14
23
|
|
|
15
|
-
let resultPromise = definition.execute({
|
|
24
|
+
let resultPromise = this.definition.execute({
|
|
16
25
|
...preparedParams
|
|
17
26
|
}, {
|
|
18
27
|
action: this,
|
|
@@ -21,21 +30,82 @@ class TriggerHandler {
|
|
|
21
30
|
}, emit)
|
|
22
31
|
|
|
23
32
|
resultPromise = resultPromise.then(async result => {
|
|
24
|
-
const processedResult = await processReturn(result, definition.returns, this.service)
|
|
33
|
+
const processedResult = await processReturn(result, this.definition.returns, this.service)
|
|
25
34
|
return processedResult
|
|
26
35
|
})
|
|
27
36
|
resultPromise.catch(error => {
|
|
28
|
-
console.error(`Trigger ${definition.name} error `, error)
|
|
37
|
+
console.error(`Trigger ${this.definition.name} error `, error)
|
|
29
38
|
})
|
|
30
39
|
return resultPromise
|
|
31
40
|
}
|
|
32
41
|
|
|
33
|
-
async execute(
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
42
|
+
async execute(trig, service) {
|
|
43
|
+
console.log("EXECUTE", trig, this.queueKeyFunction)
|
|
44
|
+
const profileOp = await service.profileLog.begin({
|
|
45
|
+
operation: 'queueTrigger', triggerType: this.definition.name,
|
|
46
|
+
triggerId: trig.id, by: trig.by
|
|
47
|
+
})
|
|
48
|
+
if(this.queueKeyFunction) {
|
|
49
|
+
console.log("QUEUED TRIGGER STARTED", trig)
|
|
50
|
+
const routine = () => service.profileLog.profile({
|
|
51
|
+
operation: 'runTrigger', triggerType: this.definition.name,
|
|
52
|
+
commandId: trig.id, by: trig.by
|
|
53
|
+
}, async () => {
|
|
54
|
+
let result
|
|
55
|
+
const reportFinished = this.definition.waitForEvents ? 'trigger_' + trig.id : undefined
|
|
56
|
+
const flags = {triggerId: trig.id, reportFinished}
|
|
57
|
+
const emit = service.app.splitEvents
|
|
58
|
+
? new SplitEmitQueue(service, flags)
|
|
59
|
+
: new SingleEmitQueue(service, flags)
|
|
60
|
+
try {
|
|
61
|
+
console.log("TRIGGER RUNNING!", trig)
|
|
62
|
+
result = await service.app.assertTime('trigger ' + this.definition.name,
|
|
63
|
+
this.definition.timeout || 10000,
|
|
64
|
+
() => this.doExecute(trig, (...args) => emit.emit(...args)))
|
|
65
|
+
console.log("TRIGGER DONE!", trig)
|
|
66
|
+
} catch (e) {
|
|
67
|
+
console.error(`TRIGGER ${this.definition.name} ERROR`, e.stack)
|
|
68
|
+
throw e
|
|
69
|
+
}
|
|
70
|
+
const events = await emit.commit()
|
|
71
|
+
if (this.definition.waitForEvents)
|
|
72
|
+
await service.app.waitForEvents(reportFinished, events, this.definition.waitForEvents)
|
|
73
|
+
return result
|
|
74
|
+
})
|
|
75
|
+
try {
|
|
76
|
+
routine.key = this.queueKeyFunction(trig)
|
|
77
|
+
} catch (e) {
|
|
78
|
+
console.error("QUEUE KEY FUNCTION ERROR", e)
|
|
79
|
+
}
|
|
80
|
+
console.log("TRIGGER QUEUE KEY", routine.key)
|
|
81
|
+
const promise = service.keyBasedExecutionQueues.queue(routine)
|
|
82
|
+
await service.profileLog.endPromise(profileOp, promise)
|
|
83
|
+
return promise
|
|
84
|
+
} else {
|
|
85
|
+
console.log("NOT QUEUED TRIGGER STARTED", trig)
|
|
86
|
+
const reportFinished = this.definition.waitForEvents ? 'trigger_'+trig.id : undefined
|
|
87
|
+
const flags = { triggerId: trig.id, reportFinished }
|
|
88
|
+
const emit = service.app.splitEvents
|
|
89
|
+
? new SplitEmitQueue(service, flags)
|
|
90
|
+
: new SingleEmitQueue(service, flags)
|
|
91
|
+
let result
|
|
92
|
+
try {
|
|
93
|
+
result = await service.app.assertTime('trigger '+this.definition.name,
|
|
94
|
+
this.definition.timeout || 10000,
|
|
95
|
+
() => this.doExecute(trig, (...args) => emit.emit(...args)))
|
|
96
|
+
console.log("TRIGGER DONE!", trig)
|
|
97
|
+
} catch (e) {
|
|
98
|
+
console.error(`TRIGGER ${this.definition.name} ERROR`, e.stack)
|
|
99
|
+
throw e
|
|
100
|
+
}
|
|
101
|
+
const events = await emit.commit()
|
|
102
|
+
if(this.definition.waitForEvents)
|
|
103
|
+
await service.app.waitForEvents(reportFinished, events, this.definition.waitForEvents)
|
|
104
|
+
await service.profileLog.end(profileOp)
|
|
105
|
+
return result
|
|
106
|
+
}
|
|
37
107
|
}
|
|
38
108
|
|
|
39
109
|
}
|
|
40
110
|
|
|
41
|
-
module.exports = TriggerHandler
|
|
111
|
+
module.exports = TriggerHandler
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-change/framework",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.15",
|
|
4
4
|
"description": "Live Change Framework - ultimate solution for real time mobile/web apps",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"tape": "^5.3.2",
|
|
36
36
|
"websocket": "^1.0.34"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "9e2d54359edb2619024512f95ba6900734e7b3a1"
|
|
39
39
|
}
|