@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 trigger = service.triggers[triggerName]
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
- if(trigger.definition.queuedBy) {
20
- const queuedBy = trigger.definition.queuedBy
21
- const keyFunction = typeof queuedBy == 'function' ? queuedBy : (
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()
@@ -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 remoteList = config.remote(clientData)
15
- for (let remote of remoteList) {
16
- dao[remote.name] = {
14
+ const remote = config.remote(clientData)
15
+ for (let remoteName of remote) {
16
+ dao[remoteName] = {
17
17
  type: "remote",
18
- generator: remote.generator || ReactiveDao.ObservableList
18
+ generator: ReactiveDao.ObservableList,
19
+ ...remote
19
20
  }
20
21
  }
21
22
  }
@@ -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] = new TriggerHandler( this.definition.triggers[triggerName], this )
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 executeSingleTrigger(definition, parameters, emit) {
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(parameters, emit) {
34
- const resultsPromises = this.definition.map(defn => this.executeSingleTrigger(defn, parameters, emit))
35
- const results = await Promise.all(resultsPromises)
36
- return results
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.12",
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": "747fead6b948fa2f182d8a4b6913c03d0405f7fd"
38
+ "gitHead": "9e2d54359edb2619024512f95ba6900734e7b3a1"
39
39
  }