@live-change/framework 0.5.10 → 0.5.14

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
@@ -73,7 +73,7 @@ class App {
73
73
  this.databaseName = config?.db?.name || 'test'
74
74
 
75
75
  this.instanceId = randomString(4)
76
- this.uidGenerator = uidGenerator(this.instanceId)
76
+ this.uidGenerator = uidGenerator(this.instanceId, this.config.uidBorders)
77
77
 
78
78
  this.activeTimeouts = new Set()
79
79
  }
@@ -15,4 +15,12 @@ module.exports = function(service, definition, app) {
15
15
 
16
16
  delete definition.events
17
17
  delete definition.triggers
18
+ delete definition.authenticators
19
+ delete definition.processors
20
+ delete definition.validators
21
+ delete definition.processed
22
+ delete definition.foreignModels
23
+ delete definition.foreignIndexes
24
+ delete definition.config
25
+ delete definition.indexes
18
26
  }
@@ -28,24 +28,24 @@ class ApiServer {
28
28
 
29
29
  async daoFactory(credentialsp, ip) {
30
30
  let credentials = { ...credentialsp, ip, roles: [] }
31
+ const allAuthenticators = []
31
32
  if(this.config.authenticators) {
32
33
  const auth = Array.isArray(this.config.authenticators)
33
34
  ? this.config.authenticators : [this.config.authenticators]
34
- for(const authenticator of auth) {
35
- if(authenticator && authenticator.prepareCredentials)
36
- await authenticator.prepareCredentials(credentials, this.config)
37
- }
35
+ allAuthenticators.push(...auth.filter(a => !!a))
38
36
  }
39
37
  for(const service of this.config.services) {
40
- console.log("SERIVCE AUTH", service.name, service.authenticators)
38
+ //console.log("SERIVCE AUTH", service.name, service.authenticators)
41
39
  if(service.authenticators) {
42
- for(const authenticator of service.authenticators) {
43
- if(authenticator && authenticator.prepareCredentials)
44
- await authenticator.prepareCredentials(credentials, this.config)
45
- }
40
+ allAuthenticators.push(...service.authenticators.filter(a => !!a))
46
41
  }
47
42
  }
48
- const dao = new this.DaoConstructor(this.config, { ...credentials })
43
+ for(const authenticator of allAuthenticators) {
44
+ if(authenticator.prepareCredentials) {
45
+ await authenticator.prepareCredentials(credentials, this.config)
46
+ }
47
+ }
48
+ const dao = new this.DaoConstructor({ ...this.config, authenticators: allAuthenticators }, { ...credentials })
49
49
  await dao.start()
50
50
  return dao
51
51
  }
@@ -141,7 +141,7 @@ function prepareReactiveDaoDefinition(config, clientData) {
141
141
  Promise.all(
142
142
  config.services.map(service => service.app.clientSideDefinition(service, clientData))
143
143
  ).then(services => new ReactiveDao.ObservableValue({
144
- client: clientData,
144
+ client: { ...clientData, sessionKey: undefined },
145
145
  services
146
146
  }))
147
147
  )
@@ -150,7 +150,7 @@ function prepareReactiveDaoDefinition(config, clientData) {
150
150
  return Promise.all(
151
151
  config.services.map(service => service.app.clientSideDefinition(service, clientData))
152
152
  ).then(services => ({
153
- client: clientData,
153
+ client: { ...clientData, sessionKey: undefined },
154
154
  services
155
155
  }))
156
156
  }
@@ -11,21 +11,7 @@ class LiveDao extends LcDao.DaoProxy {
11
11
 
12
12
  this.authenticators = []
13
13
  if(this.config.authenticators) {
14
- const auth = Array.isArray(this.config.authenticators)
15
- ? this.config.authenticators : [this.config.authenticators]
16
- for(const authenticator of auth) {
17
- if(authenticator && authenticator.authenticatorObservable)
18
- this.authenticators.push(authenticator)
19
- }
20
- }
21
- for(const service of this.config.services) {
22
- console.log("SERIVCE AUTH", service.name, service.authenticators)
23
- if(service.authenticators) {
24
- for(const authenticator of service.authenticators) {
25
- if(authenticator && authenticator.authenticatorObservable)
26
- this.authenticators.push(authenticator)
27
- }
28
- }
14
+ this.authenticators = this.config.authenticators.filter(a => a.credentialsObservable)
29
15
  }
30
16
 
31
17
  this.currentDao = null
@@ -48,8 +34,8 @@ class LiveDao extends LcDao.DaoProxy {
48
34
  for(const credentialsObserver of this.credentialsObservations) {
49
35
  credentials = {
50
36
  ...credentials,
51
- ...credentialsObservers.credentials,
52
- roles: [...credentials.roles, ...credentialsObserver.credentials.roles]
37
+ ...credentialsObserver.credentials,
38
+ roles: [...credentials.roles, ...(credentialsObserver.credentials.roles || [])]
53
39
  }
54
40
  }
55
41
  return credentials
@@ -57,13 +43,21 @@ class LiveDao extends LcDao.DaoProxy {
57
43
 
58
44
  async start() {
59
45
  this.credentialsObservations = this.authenticators.map(authenticator => {
60
- const observable = authenticator.authenticatorObservable(this.initialCredentials)
46
+ const result = authenticator.credentialsObservable(this.initialCredentials)
47
+ const observable = result.then ? new LcDao.ObservablePromiseProxy(result) : result
61
48
  const observer = {
62
- set: (newCredentials) => {
63
- state.credentials = newCredentials
49
+ set: (data) => {
50
+ console.log("NEW CREDENTIALS", data)
51
+ if(data) {
52
+ const { id, ...newCredentials } = data
53
+ state.credentials = newCredentials
54
+ } else {
55
+ state.credentials = {}
56
+ }
64
57
  this.refreshCredentials()
65
58
  }
66
59
  }
60
+ observable.observe(observer)
67
61
  const promise = waitForSignal(observable)
68
62
  const state = {
69
63
  observable, observer, promise, credentials: {}
@@ -14,6 +14,31 @@ class ReaderModel {
14
14
  return ['database', 'tableObject', this.service.databaseName, this.tableName, id]
15
15
  }
16
16
 
17
+ limitedPath(id, fields) { // takes object or list of fields
18
+ if(Array.isArray(fields)) {
19
+ fields = utils.fieldListToFieldsObject(fields)
20
+ }
21
+ fields.id = true // id is required
22
+ return ['database', 'queryObject', this.service.databaseName, `(${
23
+ async (input, output, { tableName, id, fields }) => {
24
+ function mapper(obj, fields) {
25
+ if(!obj) return obj
26
+ const out = {}
27
+ for(const key in fields) {
28
+ if(typeof fields[key] == 'object') {
29
+ out[key] = mapper(obj[key], fields[key])
30
+ } else {
31
+ out[key] = obj[key]
32
+ }
33
+ }
34
+ return out
35
+ }
36
+ await input.table(tableName).object(id).onChange((obj, oldObj) =>
37
+ output.change(mapper(obj, fields), mapper(oldObj, fields)))
38
+ }
39
+ })`, { tableName: this.tableName, id, fields }]
40
+ }
41
+
17
42
  rangePath(range = {}) {
18
43
  if(typeof range != 'object') {
19
44
  const str = range.toString()
@@ -218,39 +243,30 @@ class ReaderModel {
218
243
  observable(id) {
219
244
  return this.service.dao.observable(this.path(id), ReactiveDao.ObservableValue)
220
245
  }
221
-
222
246
  async get(id) {
223
247
  return this.service.dao.get(this.path(id), ReactiveDao.ObservableValue)
224
248
  }
225
-
226
249
  rangeObservable(range) {
227
250
  return this.service.dao.observable(this.rangePath(range), ReactiveDao.ObservableList)
228
251
  }
229
-
230
252
  async rangeGet(range) {
231
253
  return this.service.dao.get(this.rangePath(range), ReactiveDao.ObservableList)
232
254
  }
233
-
234
255
  indexRangeObservable(index, range, pathRange = null) {
235
256
  return this.service.dao.observable(this.indexRangePath(index, range, pathRange), ReactiveDao.ObservableList)
236
257
  }
237
-
238
258
  async indexRangeGet(index, range, pathRange = null) {
239
259
  return this.service.dao.get(this.indexRangePath(index, range, pathRange), ReactiveDao.ObservableList)
240
260
  }
241
-
242
261
  indexObjectObservable(index, range, pathRange = null) {
243
262
  return this.service.dao.observable(this.indexObjectPath(index, range, pathRange))
244
263
  }
245
-
246
264
  async indexObjectGet(index, range, pathRange) {
247
265
  return this.service.dao.get(this.indexObjectPath(index, range, pathRange))
248
266
  }
249
-
250
267
  sortedIndexRangeObservable(index, range, pathRange = null) {
251
268
  return this.service.dao.observable(this.sortedIndexRangePath(index, range, pathRange), ReactiveDao.ObservableList)
252
269
  }
253
-
254
270
  async sortedIndexRangeGet(index, range, pathRange = null) {
255
271
  return this.service.dao.get(this.sortedIndexRangePath(index, range, pathRange), ReactiveDao.ObservableList)
256
272
  }
@@ -11,6 +11,21 @@ function nonEmpty(value) {
11
11
  if(Object.keys(value).length == 0) return 'empty'
12
12
  }
13
13
  }
14
+
15
+ function getField(context, fieldName) {
16
+ const propPath = context.propName ? context.propName.split('.') : []
17
+ propPath.pop()
18
+ let path
19
+ if(fieldName[0] == '/') {
20
+ path = fieldName.slice(1).split('.')
21
+ } else {
22
+ path = propPath.concat(fieldName.split('.'))
23
+ }
24
+ let p = context.props
25
+ for(let part of path) p = p[part]
26
+ return p
27
+ }
28
+
14
29
  nonEmpty.isRequired = () => true
15
30
 
16
31
  let validators = {
@@ -49,7 +64,7 @@ let validators = {
49
64
  }
50
65
  }
51
66
  validator.isRequired = (context) => {
52
- if(getField(context.props, prop) == to) {
67
+ if(getField(context, prop) == to) {
53
68
  for(let v of validators) {
54
69
  if(v.isRequired && v.isRequired(context)) return true
55
70
  }
package/lib/utils.js CHANGED
@@ -231,8 +231,23 @@ const rangeProperties = {
231
231
  }
232
232
  }
233
233
 
234
+ function fieldListToFieldsObject(fieldList) {
235
+ const fields = {}
236
+ for(const fieldName of fieldList) {
237
+ const parts = fieldName.split('.')
238
+ let at = fields
239
+ let i = 0
240
+ for(; i < parts.length - 1; i ++) {
241
+ if(!at[parts[i]]) at[parts[i]] = {}
242
+ at = at[parts[i]]
243
+ }
244
+ at[parts[i]] = true
245
+ }
246
+ return fields
247
+ }
248
+
234
249
  module.exports = {
235
250
  typeName, toJSON, setDifference, mapDifference, crudChanges,
236
251
  getProperty, setProperty, getField, setField, isObject, mergeDeep, generateDefault,
237
- prefixRange, rangeProperties
252
+ prefixRange, rangeProperties, fieldListToFieldsObject
238
253
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@live-change/framework",
3
- "version": "0.5.10",
3
+ "version": "0.5.14",
4
4
  "description": "Live Change Framework - ultimate solution for real time mobile/web apps",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -21,12 +21,12 @@
21
21
  },
22
22
  "homepage": "https://github.com/live-change/framework",
23
23
  "devDependencies": {
24
- "@live-change/dao": "^0.3.6",
25
- "@live-change/dao-websocket": "^0.3.1",
26
- "@live-change/db": "^0.3.62",
24
+ "@live-change/dao": "^0.3.13",
25
+ "@live-change/dao-websocket": "^0.3.2",
26
+ "@live-change/db": "^0.3.64",
27
27
  "@live-change/db-store-level": "^0.1.15",
28
28
  "@live-change/db-store-lmdb": "^0.1.22",
29
- "@live-change/uid": "^0.1.3",
29
+ "@live-change/uid": "^0.1.4",
30
30
  "cookie": "^0.4.1",
31
31
  "encoding-down": "^7.1.0",
32
32
  "express": "^4.17.1",
@@ -34,13 +34,13 @@
34
34
  "leveldown": "^6.1.0",
35
35
  "levelup": "^5.1.1",
36
36
  "memdown": "^6.1.1",
37
- "node-lmdb": "^0.9.5",
37
+ "node-lmdb": "^0.8.0",
38
38
  "os-service": "^2.2.0",
39
39
  "rimraf": "^3.0.2",
40
- "rocksdb": "^5.1.1",
41
- "sockjs": "^0.3.21",
40
+ "rocksdb": "^5.2.0",
41
+ "@live-change/sockjs": "^0.4.0-rc.1",
42
42
  "subleveldown": "^6.0.1",
43
- "tape": "^5.3.1",
43
+ "tape": "^5.3.2",
44
44
  "websocket": "^1.0.34"
45
45
  }
46
46
  }