@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 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
- console.log("APPLY CHANGES", JSON.stringify(changes, null, ' '))
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()
@@ -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 => {
@@ -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
- //if(config.startEventListener) this.startEventListener()
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 => {
@@ -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
- console.log("CREATE INDEX", indexName)
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
- console.log("INDEX CREATED!", index)
102
+ debug("INDEX CREATED!", index)
103
103
  }
104
104
 
105
- console.log("DATABASE UPDATER")
105
+ debug("DATABASE UPDATER")
106
106
 
107
107
  for(let change of changes) {
108
- console.log("PROCESSING CHANGE", change)
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
- console.log("TABLE CREATED!", tableName)
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
- console.log("DELETE TABLE")
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
- console.log("CREATE PROPERTY UPDATE", update)
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
- console.log("DATABASE UPDATED")
234
+ debug("DATABASE UPDATED")
235
235
 
236
- console.log("CHECKING DATABASE INTEGRITY...")
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
- console.log("index", fullIndexName, "not found! creating...")
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
- console.log("I", indexes)
252
- console.log("table ", modelName, " index", fullIndexName, "not found! creating...")
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.14",
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
  }