@muze-nl/simplystore 0.5.7 → 0.6.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muze-nl/simplystore",
3
- "version": "0.5.7",
3
+ "version": "0.6.0",
4
4
  "main": "src/server.mjs",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -17,7 +17,7 @@
17
17
  "homepage": "https://github.com/simplyedit/simplystore#readme",
18
18
  "dependencies": {
19
19
  "@muze-nl/jsontag": "^0.9.1",
20
- "array-where-select": "^0.4.7",
20
+ "array-where-select": "^0.5.0",
21
21
  "codemirror": "^6.0.1",
22
22
  "express": "^4.18.1",
23
23
  "json-pointer": "^0.6.2",
@@ -86,6 +86,7 @@ export default async function runCommand(commandStr, request) {
86
86
  if (commands[task.name]) {
87
87
  let time = Date.now()
88
88
  commands[task.name](dataspace, task, request, metaProxy)
89
+ //TODO: if command/task makes no changes, skip updating data.jsontag and writing it, skip response.data
89
90
  FastJSONTag.setAttribute(dataspace, 'command', task.id)
90
91
 
91
92
  const strData = resultSetStringify(resultSet)
@@ -96,7 +97,7 @@ export default async function runCommand(commandStr, request) {
96
97
  id: meta.index.id
97
98
  }
98
99
  }
99
-
100
+ //TODO: write data every x commands or x minutes, in seperate thread
100
101
  await writeFileAtomic(datafile, uint8sab)
101
102
  let end = Date.now()
102
103
  console.log('task time',end-time)
package/src/fastParse.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import JSONTag from '@muze-nl/jsontag';
2
2
  import Null from '@muze-nl/jsontag/src/lib/Null.mjs'
3
3
  import fastStringify from './fastStringify.mjs'
4
- import {source,isProxy,getBuffer,getIndex,isChanged} from './symbols.mjs'
4
+ import {source,isProxy,getBuffer,getIndex,isChanged,isParsed,position,parent} from './symbols.mjs'
5
5
 
6
6
  const decoder = new TextDecoder()
7
7
  const encoder = new TextEncoder()
@@ -36,6 +36,10 @@ export default function parse(input, meta, immutable=true)
36
36
  t: "\t"
37
37
  }
38
38
  let offsetArray = []
39
+ let resultArray = []
40
+
41
+ at = 0
42
+ ch = " "
39
43
 
40
44
  let error = function(m)
41
45
  {
@@ -58,7 +62,7 @@ export default function parse(input, meta, immutable=true)
58
62
  let next = function(c)
59
63
  {
60
64
  if (c && c!==ch) {
61
- error("Expected '"+c+"' instead of '"+ch+"'")
65
+ error("Expected '"+c+"' instead of '"+ch+"': "+at+':'+input)
62
66
  }
63
67
  ch = String.fromCharCode(input.at(at))
64
68
  at+=1
@@ -658,10 +662,8 @@ export default function parse(input, meta, immutable=true)
658
662
  })
659
663
  }
660
664
 
661
- const getNewValueProxy = function(value) {
662
- let index = resultArray.length
663
- resultArray.push('')
664
- let arrayHandler = {
665
+ const handlers = {
666
+ newArrayHandler: {
665
667
  get(target, prop) {
666
668
  if (target[prop] instanceof Function) {
667
669
  return (...args) => {
@@ -677,7 +679,8 @@ export default function parse(input, meta, immutable=true)
677
679
  return true
678
680
  } else {
679
681
  if (Array.isArray(target[prop])) {
680
- return new Proxy(target[prop], arrayHandler)
682
+ // console.log('proxying array with newArrayHandler')
683
+ return new Proxy(target[prop], handlers.newArrayHandler)
681
684
  }
682
685
  return target[prop]
683
686
  }
@@ -689,8 +692,8 @@ export default function parse(input, meta, immutable=true)
689
692
  target[prop] = value
690
693
  return true
691
694
  }
692
- }
693
- let newValueHandler = {
695
+ },
696
+ newValueHandler: {
694
697
  get(target, prop, receiver) {
695
698
  switch(prop) {
696
699
  case source:
@@ -701,6 +704,7 @@ export default function parse(input, meta, immutable=true)
701
704
  break
702
705
  case getBuffer:
703
706
  return (i) => {
707
+ let index = target[getIndex]
704
708
  if (i != index) {
705
709
  return encoder.encode('~'+index)
706
710
  }
@@ -709,14 +713,15 @@ export default function parse(input, meta, immutable=true)
709
713
  }
710
714
  break
711
715
  case getIndex:
712
- return index
716
+ return target[getIndex]
713
717
  break
714
718
  case isChanged:
715
719
  return true
716
720
  break
717
721
  default:
718
722
  if (Array.isArray(target[prop])) {
719
- return new Proxy(target[prop], arrayHandler)
723
+ // console.log('proxying array with newArrayHandler')
724
+ return new Proxy(target[prop], handlers.newArrayHandler)
720
725
  }
721
726
  return target[prop]
722
727
  break
@@ -729,57 +734,37 @@ export default function parse(input, meta, immutable=true)
729
734
  target[prop] = value
730
735
  return true
731
736
  }
732
- }
733
-
734
- makeChildProxies(value)
735
- let result = new Proxy(value, newValueHandler)
736
- resultArray[index] = result
737
- return result
738
- }
739
-
740
- let valueProxy = function(length, index)
741
- {
742
- // current offset + length contains jsontag of this value
743
- let position = {
744
- start: at-1,
745
- end: at-1+length
746
- }
747
- let cache = {}
748
- let targetIsChanged = false
749
- let parsed = false
750
- at += length
751
- next()
752
- let firstParse = function() {
753
- if (!parsed) {
754
- parseValue(position, cache)
755
- parsed = true
756
- }
757
- }
758
- // newValueHandler makes sure that value[getBuffer] runs stringify
759
- // arrayHandler makes sure that changes in the array set targetIsChanged to true
760
- let arrayHandler = {
737
+ },
738
+ arrayHandler: {
761
739
  get(target, prop) {
762
740
  if (target[prop] instanceof Function) {
763
741
  if (['copyWithin','fill','pop','push','reverse','shift','sort','splice','unshift'].indexOf(prop)!==-1) {
764
742
  if (immutable) {
765
743
  throw new Error('dataspace is immutable')
766
744
  }
767
- targetIsChanged = true
745
+ // console.log('getting array function '+prop)
768
746
  }
769
747
  return (...args) => {
748
+ // console.log('calling array function '+prop)
770
749
  args = args.map(arg => {
771
750
  if (JSONTag.getType(arg)==='object' && !arg[isProxy]) {
751
+ console.log('proxying arg')
772
752
  arg = getNewValueProxy(arg)
773
753
  }
774
754
  return arg
775
755
  })
776
- return target[prop].apply(target, args)
756
+ target[parent][isChanged] = true // incorrect target for isChanged...
757
+ let result = target[prop].apply(target, args)
758
+ // console.log('target',target,result)
759
+ return result
777
760
  }
778
761
  } else if (prop===isChanged) {
779
- return targetIsChanged
762
+ return target[parent][isChanged]
780
763
  } else {
781
764
  if (!immutable && Array.isArray(target[prop])) {
782
- return new Proxy(target[prop], arrayHandler)
765
+ // console.log('proxying array with arrayHandler')
766
+ target[prop][parent] = target[parent]
767
+ return new Proxy(target[prop], handlers.arrayHandler)
783
768
  }
784
769
  return target[prop]
785
770
  }
@@ -792,7 +777,7 @@ export default function parse(input, meta, immutable=true)
792
777
  value = getNewValueProxy(value)
793
778
  }
794
779
  target[prop] = value
795
- targetIsChanged = true
780
+ target[parent][isChanged] = true
796
781
  return true
797
782
  },
798
783
  deleteProperty(target, prop) {
@@ -803,13 +788,22 @@ export default function parse(input, meta, immutable=true)
803
788
  //that object should be deleted so that its line will become empty
804
789
  //when stringifying resultArray again
805
790
  delete target[prop]
806
- targetIsChanged = true
791
+ target[parent][isChanged] = true
807
792
  return true
793
+ },
794
+ ownKeys: (target) => {
795
+ return Reflect.ownKeys(target)
796
+ },
797
+ getOwnPropertyDescriptor: (target, prop) => {
798
+ return {
799
+ enumerable: true,
800
+ configurable: true
801
+ }
808
802
  }
809
- }
810
- let handler = {
803
+ },
804
+ handler: {
811
805
  get(target, prop, receiver) {
812
- firstParse()
806
+ firstParse(target)
813
807
  switch(prop) {
814
808
  case source:
815
809
  return target
@@ -819,58 +813,96 @@ export default function parse(input, meta, immutable=true)
819
813
  break
820
814
  case getBuffer:
821
815
  return (i) => {
816
+ let index = target[getIndex]
822
817
  if (i != index) {
823
818
  return encoder.encode('~'+index)
824
819
  }
825
- if (targetIsChanged) {
820
+ if (target[isChanged]) {
826
821
  // return newly stringified contents of cache
827
822
  let temp = fastStringify(target, null, true)
828
823
  return encoder.encode(fastStringify(target, null, true))
829
824
  }
830
- return input.slice(position.start,position.end)
825
+ return input.slice(target[position].start,target[position].end)
831
826
  }
832
827
  break
833
828
  case getIndex:
834
- return index
829
+ return target[getIndex]
835
830
  break
836
831
  case isChanged:
837
- return targetIsChanged
832
+ return target[isChanged]
838
833
  break
839
834
  default:
840
- if (Array.isArray(target[prop]) && target[prop].propertyIsEnumerable()) {
841
- return new Proxy(target[prop], arrayHandler)
835
+ if (!immutable && Array.isArray(target[prop])) {
836
+ // console.log('proxying array with arrayHandler')
837
+ target[prop][parent] = target
838
+ return new Proxy(target[prop], handlers.arrayHandler)
842
839
  }
843
- return target[prop] // FIXME: make arrays immutable as well
840
+ return target[prop]
844
841
  break
845
842
  }
846
843
  },
847
844
  set(target, prop, value) {
848
845
  if (!immutable) {
849
- firstParse()
846
+ firstParse(target)
850
847
  if (prop!==isChanged) {
851
848
  if (JSONTag.getType(value)==='object' && !value[isProxy]) {
852
849
  value = getNewValueProxy(value)
853
850
  }
854
851
  target[prop] = value
855
852
  }
856
- targetIsChanged = true
853
+ target[isChanged] = true
857
854
  return true
858
855
  }
859
856
  },
860
857
  deleteProperty: (target, prop) => {
861
858
  if (!immutable) {
862
- firstParse()
859
+ firstParse(target)
863
860
  delete target[prop]
864
- targetIsChanged = true
861
+ target[isChanged] = true
865
862
  return true
866
863
  }
867
864
  },
868
865
  'ownKeys': (target) => {
869
- firstParse()
866
+ firstParse(target)
870
867
  return Reflect.ownKeys(target)
871
868
  }
872
869
  }
873
- return new Proxy(cache, handler)
870
+
871
+ }
872
+
873
+ const firstParse = function(target) {
874
+ if (!target[isParsed]) {
875
+ parseValue(target[position], target)
876
+ target[isParsed] = true
877
+ }
878
+ }
879
+
880
+ const getNewValueProxy = function(value) {
881
+ let index = resultArray.length
882
+ resultArray.push('')
883
+ value[getIndex] = index
884
+ makeChildProxies(value)
885
+ let result = new Proxy(value, handlers.newValueHandler)
886
+ resultArray[index] = result
887
+ return result
888
+ }
889
+
890
+ let valueProxy = function(length, index)
891
+ {
892
+ let cache = {}
893
+ cache[getIndex] = index
894
+ cache[isChanged] = false
895
+ cache[isParsed] = false
896
+ // current offset + length contains jsontag of this value
897
+ cache[position] = {
898
+ start: at-1,
899
+ end: at-1+length
900
+ }
901
+ at += length
902
+ next()
903
+ // newValueHandler makes sure that value[getBuffer] runs stringify
904
+ // arrayHandler makes sure that changes in the array set targetIsChanged to true
905
+ return new Proxy(cache, handlers.handler)
874
906
  }
875
907
 
876
908
  value = function(ob={})
@@ -950,9 +982,6 @@ export default function parse(input, meta, immutable=true)
950
982
  return [l, v]
951
983
  }
952
984
 
953
- at = 0
954
- ch = " "
955
- let resultArray = []
956
985
  while(ch && at<input.length) {
957
986
  result = lengthValue(resultArray.length)
958
987
  whitespace()
@@ -960,40 +989,6 @@ export default function parse(input, meta, immutable=true)
960
989
  resultArray.push(result[1])
961
990
  }
962
991
 
963
- if (typeof reviver === 'function') {
964
- function walk(holder, key)
965
- {
966
- var k;
967
- var v;
968
- var value = holder[key];
969
- if (value !== null
970
- && typeof value === "object"
971
- && !(value instanceof String
972
- || value instanceof Number
973
- || value instanceof Boolean)
974
- ) {
975
- for (k in value) {
976
- if (Object.prototype.hasOwnProperty.call(value, k)) {
977
- v = walk(value, k);
978
- if (v !== undefined
979
- && ( typeof value[k] === 'undefined' || value[k]!==v) )
980
- {
981
- value[k] = v;
982
- if (JSONTag.getType(v)==='link') {
983
- checkUnresolved(v, value, k)
984
- }
985
- } else if (v === undefined) {
986
- delete value[k];
987
- }
988
- }
989
- }
990
- }
991
- return reviver.call(holder, key, value, meta);
992
- }
993
-
994
- walk({"":result}, "")
995
- }
996
-
997
992
  let replaceLink = function(u,value)
998
993
  {
999
994
  if (typeof value !== 'undefined') {
@@ -100,15 +100,6 @@ export default function stringify(value, meta, skipLength=false, index=false) {
100
100
  // is only ever called on object values
101
101
  // and should always return a stringified object, not a reference (~n)
102
102
  const innerStringify = (current) => {
103
- let indent = ""
104
- let gap = ""
105
-
106
- if (typeof space === "number") {
107
- indent += " ".repeat(space)
108
- } else if (typeof space === "string") {
109
- indent = space
110
- }
111
-
112
103
  let object = resultArray[current]
113
104
  let result
114
105
 
@@ -27,11 +27,11 @@ const metaIdProxy = {
27
27
  }
28
28
 
29
29
  const FastJSONTag = {
30
- getType: (obj) => JSONTag.getType(obj[source]),
31
- getAttribute: (obj, attr) => JSONTag.getAttribute(obj[source],attr),
32
- getAttributes: (obj) => JSONTag.getAttributes(obj[source]),
33
- getAttributeString: (obj) => JSONTag.getAttributesString(obj[source]),
34
- getTypeString: (obj) => JSONTag.getTypeString(obj[source])
30
+ getType: (obj) => JSONTag.getType(obj?.[source]),
31
+ getAttribute: (obj, attr) => JSONTag.getAttribute(obj?.[source],attr),
32
+ getAttributes: (obj) => JSONTag.getAttributes(obj?.[source]),
33
+ getAttributeString: (obj) => JSONTag.getAttributesString(obj?.[source]),
34
+ getTypeString: (obj) => JSONTag.getTypeString(obj?.[source])
35
35
  }
36
36
 
37
37
  const tasks = {
package/src/symbols.mjs CHANGED
@@ -3,4 +3,7 @@ export const isProxy = Symbol('isProxy')
3
3
  export const getBuffer = Symbol('getBuffer')
4
4
  export const getIndex = Symbol('getIndex')
5
5
  export const isChanged = Symbol('isChanged')
6
- export const getString = Symbol('getString')
6
+ export const isParsed = Symbol('isParsed')
7
+ export const getString = Symbol('getString')
8
+ export const position = Symbol('position')
9
+ export const parent = Symbol('parent')