@live-change/framework 0.5.14 → 0.5.18
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.
- package/lib/App.js +29 -2
- package/lib/definition/ServiceDefinition.js +5 -0
- package/lib/runtime/Action.js +2 -1
- package/lib/runtime/Service.js +3 -2
- package/lib/runtime/TriggerHandler.js +2 -1
- package/lib/updaters/database.js +14 -14
- package/lib/utils/CommandQueue.js +1 -1
- package/lib/utils/EventSourcing.js +4 -4
- package/package.json +1 -9
package/lib/App.js
CHANGED
|
@@ -34,6 +34,8 @@ const eventListener = require('./processes/eventListener.js')
|
|
|
34
34
|
|
|
35
35
|
const utils = require('./utils.js')
|
|
36
36
|
|
|
37
|
+
const debug = require('debug')('framework')
|
|
38
|
+
|
|
37
39
|
class App {
|
|
38
40
|
|
|
39
41
|
constructor(config = {}) {
|
|
@@ -104,7 +106,7 @@ class App {
|
|
|
104
106
|
}
|
|
105
107
|
|
|
106
108
|
async applyChanges(changes, service, updaters, force) {
|
|
107
|
-
|
|
109
|
+
debug("APPLY CHANGES", JSON.stringify(changes, null, ' '))
|
|
108
110
|
updaters = updaters || this.defaultUpdaters
|
|
109
111
|
for(let updater of updaters) {
|
|
110
112
|
await updater(changes, service, this, force)
|
|
@@ -179,7 +181,7 @@ class App {
|
|
|
179
181
|
})
|
|
180
182
|
const routes = await this.dao.get(['database', 'tableRange', this.databaseName, 'triggerRoutes',
|
|
181
183
|
{ gte: data.type+'=', lte: data.type+'=\xFF\xFF\xFF\xFF' }])
|
|
182
|
-
console.log("TRIGGER ROUTES", routes)
|
|
184
|
+
console.log("TRIGGER ROUTES", data.type, '=>', routes)
|
|
183
185
|
let promises = []
|
|
184
186
|
for(const route of routes) {
|
|
185
187
|
promises.push(this.triggerService(route.service, { ...data }))
|
|
@@ -386,6 +388,31 @@ class App {
|
|
|
386
388
|
}
|
|
387
389
|
}
|
|
388
390
|
|
|
391
|
+
|
|
392
|
+
query(query, params) {
|
|
393
|
+
return ['database', 'query', this.databaseName, `(${ query })`, params]
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
queryGet(query, params) {
|
|
397
|
+
return this.dao.get(this.query(query, params))
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
queryObservable(query, params) {
|
|
401
|
+
return this.dao.observable(this.query(query, params))
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
queryObject(query, params) {
|
|
405
|
+
return ['database', 'queryObject', this.databaseName, `(${ query })`, params]
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
queryObjectGet(query, params) {
|
|
409
|
+
return this.dao.get(this.queryObject(query, params))
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
queryObjectObservable(query, params) {
|
|
413
|
+
return this.dao.observable(this.queryObject(query, params))
|
|
414
|
+
}
|
|
415
|
+
|
|
389
416
|
async close() {
|
|
390
417
|
for(const timeout of this.activeTimeouts) {
|
|
391
418
|
clearTimeout(timeout)
|
|
@@ -84,6 +84,7 @@ class ServiceDefinition {
|
|
|
84
84
|
this.use = []
|
|
85
85
|
this.processors = []
|
|
86
86
|
this.authenticators = []
|
|
87
|
+
this.beforeStartCallbacks = []
|
|
87
88
|
this.validators = defaultValidators
|
|
88
89
|
for(let key in definition) this[key] = definition[key]
|
|
89
90
|
}
|
|
@@ -144,6 +145,10 @@ class ServiceDefinition {
|
|
|
144
145
|
this.authenticators.push(authenticator)
|
|
145
146
|
}
|
|
146
147
|
|
|
148
|
+
beforeStart(callback) {
|
|
149
|
+
this.beforeStartCallbacks.push(callback)
|
|
150
|
+
}
|
|
151
|
+
|
|
147
152
|
toJSON() {
|
|
148
153
|
let models = {}
|
|
149
154
|
for(let key in this.models) models[key] = this.models[key].toJSON()
|
package/lib/runtime/Action.js
CHANGED
|
@@ -20,7 +20,8 @@ class Action {
|
|
|
20
20
|
action: this,
|
|
21
21
|
service: this.service,
|
|
22
22
|
client: command.client,
|
|
23
|
-
command
|
|
23
|
+
command,
|
|
24
|
+
trigger: (...args) => this.service.trigger(...args) /// TODO: collet call traces
|
|
24
25
|
}, emit)
|
|
25
26
|
|
|
26
27
|
resultPromise = resultPromise.then(async result => {
|
package/lib/runtime/Service.js
CHANGED
|
@@ -61,7 +61,6 @@ class Service {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
this.authenticators = this.definition.authenticators
|
|
64
|
-
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
async start(config) {
|
|
@@ -76,7 +75,9 @@ class Service {
|
|
|
76
75
|
let promises = config.processes.map(proc => proc(this, config))
|
|
77
76
|
await Promise.all(promises)
|
|
78
77
|
|
|
79
|
-
|
|
78
|
+
for(const beforeStartCallback of this.definition.beforeStartCallbacks) {
|
|
79
|
+
await beforeStartCallback(this)
|
|
80
|
+
}
|
|
80
81
|
|
|
81
82
|
console.log("Service", this.definition.name, "started")
|
|
82
83
|
}
|
|
@@ -16,7 +16,8 @@ class TriggerHandler {
|
|
|
16
16
|
...preparedParams
|
|
17
17
|
}, {
|
|
18
18
|
action: this,
|
|
19
|
-
service: this.service
|
|
19
|
+
service: this.service,
|
|
20
|
+
trigger: (...args) => this.service.trigger(...args) /// TODO: collet call traces
|
|
20
21
|
}, emit)
|
|
21
22
|
|
|
22
23
|
resultPromise = resultPromise.then(async result => {
|
package/lib/updaters/database.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const utils = require("../utils.js")
|
|
2
|
-
|
|
2
|
+
const debug = require('debug')('framework:updaters:db')
|
|
3
3
|
async function update(changes, service, app, force) {
|
|
4
4
|
|
|
5
5
|
const dao = app.dao
|
|
@@ -39,7 +39,7 @@ async function update(changes, service, app, force) {
|
|
|
39
39
|
indexName = generateTableName(indexName)
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
debug("CREATE INDEX", indexName)
|
|
43
43
|
|
|
44
44
|
const options = {
|
|
45
45
|
multi: index.multi || false
|
|
@@ -99,19 +99,19 @@ async function update(changes, service, app, force) {
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
debug("INDEX CREATED!", index)
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
debug("DATABASE UPDATER")
|
|
106
106
|
|
|
107
107
|
for(let change of changes) {
|
|
108
|
-
|
|
108
|
+
debug("PROCESSING CHANGE", change)
|
|
109
109
|
switch(change.operation) {
|
|
110
110
|
case "createModel": {
|
|
111
111
|
const model = change.model
|
|
112
112
|
const tableName = generateTableName(model.name)
|
|
113
113
|
await dao.request(['database', 'createTable'], database, tableName)
|
|
114
|
-
|
|
114
|
+
debug("TABLE CREATED!", tableName)
|
|
115
115
|
for(let indexName in model.indexes) {
|
|
116
116
|
const index = model.indexes[indexName]
|
|
117
117
|
await createIndex(tableName, indexName, index)
|
|
@@ -134,7 +134,7 @@ async function update(changes, service, app, force) {
|
|
|
134
134
|
} break
|
|
135
135
|
case "deleteModel": {
|
|
136
136
|
const tableName = generateTableName(change.name)
|
|
137
|
-
|
|
137
|
+
debug("DELETE TABLE")
|
|
138
138
|
const model = change.model
|
|
139
139
|
for(let indexName in model.indexes) {
|
|
140
140
|
let indexName = change.name
|
|
@@ -188,9 +188,9 @@ async function update(changes, service, app, force) {
|
|
|
188
188
|
const property = change.property
|
|
189
189
|
let update = {}
|
|
190
190
|
update[change.name] = property.defaultValue
|
|
191
|
-
|
|
191
|
+
debug("CREATE PROPERTY UPDATE", update)
|
|
192
192
|
await dao.request(['database', 'query'], database, `(${
|
|
193
|
-
async (input, output, { table, update }) =>
|
|
193
|
+
async (input, output, { table, update }) =>
|
|
194
194
|
await input.table(table).onChange((obj, oldObj) => {
|
|
195
195
|
if(obj) output.table(table).update(obj.id, [{ op: 'merge', value: update }])
|
|
196
196
|
})
|
|
@@ -231,14 +231,14 @@ async function update(changes, service, app, force) {
|
|
|
231
231
|
default:
|
|
232
232
|
}
|
|
233
233
|
}
|
|
234
|
-
|
|
234
|
+
debug("DATABASE UPDATED")
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
debug("CHECKING DATABASE INTEGRITY...")
|
|
237
237
|
const indexes = await dao.get(['database', 'indexesList', database])
|
|
238
238
|
for(const indexName in service.indexes) {
|
|
239
239
|
const fullIndexName = generateTableName(indexName)
|
|
240
240
|
if(!indexes.includes(fullIndexName)) {
|
|
241
|
-
|
|
241
|
+
debug("index", fullIndexName, "not found! creating...")
|
|
242
242
|
await createIndex(null, indexName, service.index[indexName])
|
|
243
243
|
}
|
|
244
244
|
}
|
|
@@ -248,8 +248,8 @@ async function update(changes, service, app, force) {
|
|
|
248
248
|
for(const indexName in model.indexes) {
|
|
249
249
|
const fullIndexName = tableName + '_' + indexName
|
|
250
250
|
if(!indexes.includes(fullIndexName)) {
|
|
251
|
-
|
|
252
|
-
|
|
251
|
+
debug("I", indexes)
|
|
252
|
+
debug("table ", modelName, " index", fullIndexName, "not found! creating...")
|
|
253
253
|
await createIndex(generateTableName(modelName), indexName, model.indexes[indexName])
|
|
254
254
|
}
|
|
255
255
|
}
|
|
@@ -22,7 +22,7 @@ class CommandQueue {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
async start() {
|
|
25
|
-
console.log("START QUEUE", this.tableName, this.indexName)
|
|
25
|
+
//console.log("START QUEUE", this.tableName, this.indexName)
|
|
26
26
|
await this.connection.request(['database', 'createTable'], this.database, this.tableName).catch(e => 'ok')
|
|
27
27
|
await this.connection.request(['database', 'createIndex'], this.database, this.indexName, `(${
|
|
28
28
|
async function(input, output, { tableName }) {
|
|
@@ -29,7 +29,7 @@ class EventSourcing {
|
|
|
29
29
|
await this.connection.request(['database', 'createLog'], this.database, this.logName).catch(e => 'ok')
|
|
30
30
|
this.state = await this.connection.get(
|
|
31
31
|
['database', 'tableObject', this.database, 'eventConsumers', this.consumerId])
|
|
32
|
-
console.log("GOT CONSUMER STATE", this.state)
|
|
32
|
+
//console.log("GOT CONSUMER STATE", this.state)
|
|
33
33
|
if(!this.state) {
|
|
34
34
|
this.state = {
|
|
35
35
|
id: this.consumerId,
|
|
@@ -83,12 +83,12 @@ class EventSourcing {
|
|
|
83
83
|
try {
|
|
84
84
|
await this.doHandleEvent(event, mainEvent)
|
|
85
85
|
done = true
|
|
86
|
-
} catch(e) {
|
|
87
|
-
if(e == 'timeout' && retry < maxRetry) {
|
|
86
|
+
} catch(e) {
|
|
87
|
+
if(e == 'timeout' && retry < maxRetry) {
|
|
88
88
|
retry++
|
|
89
89
|
const sleepTime = Math.pow(2, retry) * 100
|
|
90
90
|
console.error(`Event \n${JSON.stringify(event, null, " ")}\n handling timeout, will retry `,
|
|
91
|
-
retry, ' time after ', sleepTime, 'ms sleep')
|
|
91
|
+
retry, ' time after ', sleepTime, 'ms sleep')
|
|
92
92
|
sleep(retry)
|
|
93
93
|
} else {
|
|
94
94
|
console.error(`EVENT \n${JSON.stringify(event, null, " ")}\n HANDLING ERROR`, e, ' => STOPPING!')
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-change/framework",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.18",
|
|
4
4
|
"description": "Live Change Framework - ultimate solution for real time mobile/web apps",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -28,18 +28,10 @@
|
|
|
28
28
|
"@live-change/db-store-lmdb": "^0.1.22",
|
|
29
29
|
"@live-change/uid": "^0.1.4",
|
|
30
30
|
"cookie": "^0.4.1",
|
|
31
|
-
"encoding-down": "^7.1.0",
|
|
32
31
|
"express": "^4.17.1",
|
|
33
|
-
"level-rocksdb": "^5.0.0",
|
|
34
|
-
"leveldown": "^6.1.0",
|
|
35
|
-
"levelup": "^5.1.1",
|
|
36
|
-
"memdown": "^6.1.1",
|
|
37
|
-
"node-lmdb": "^0.8.0",
|
|
38
32
|
"os-service": "^2.2.0",
|
|
39
33
|
"rimraf": "^3.0.2",
|
|
40
|
-
"rocksdb": "^5.2.0",
|
|
41
34
|
"@live-change/sockjs": "^0.4.0-rc.1",
|
|
42
|
-
"subleveldown": "^6.0.1",
|
|
43
35
|
"tape": "^5.3.2",
|
|
44
36
|
"websocket": "^1.0.34"
|
|
45
37
|
}
|