@muze-nl/od-jsontag 0.1.6 → 0.2.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/parse.mjs +88 -28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muze-nl/od-jsontag",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "On Demand JSONTag: parse/serialize large datastructures on demand, useful for sharing data between threads",
5
5
  "type": "module",
6
6
  "author": "Auke van Slooten <auke@muze.nl>",
package/src/parse.mjs CHANGED
@@ -14,6 +14,15 @@ function stringToSAB(strData) {
14
14
  return uint8sab
15
15
  }
16
16
 
17
+ function JSONTagProxy(target, handler) {
18
+ let p = new Proxy(target, handler)
19
+ let a = JSONTag.getAttributes(target)
20
+ JSONTag.setAttributes(target, a)
21
+ let t = JSONTag.getType(target)
22
+ JSONTag.setType(target, t)
23
+ return p
24
+ }
25
+
17
26
  export default function parse(input, meta, immutable=true)
18
27
  {
19
28
  if (!meta) {
@@ -37,7 +46,9 @@ export default function parse(input, meta, immutable=true)
37
46
  t: "\t"
38
47
  }
39
48
  let offsetArray = []
40
- let resultArray = []
49
+ if (!meta.resultArray) {
50
+ meta.resultArray = []
51
+ }
41
52
 
42
53
  at = 0
43
54
  ch = " "
@@ -652,6 +663,7 @@ export default function parse(input, meta, immutable=true)
652
663
  }
653
664
 
654
665
  let parseValue = function(position, ob={}) {
666
+ input = position.input
655
667
  at = position.start
656
668
  next()
657
669
  return value(ob)
@@ -691,7 +703,7 @@ export default function parse(input, meta, immutable=true)
691
703
  return undefined
692
704
  }
693
705
  if (Array.isArray(target[prop])) {
694
- return new Proxy(target[prop], handlers.newArrayHandler)
706
+ return JSONTagProxy(target[prop], handlers.newArrayHandler)
695
707
  }
696
708
  return target[prop]
697
709
  }
@@ -710,6 +722,9 @@ export default function parse(input, meta, immutable=true)
710
722
  newValueHandler: {
711
723
  get(target, prop, receiver) {
712
724
  switch(prop) {
725
+ case resultSet:
726
+ return meta.resultArray
727
+ break;
713
728
  case source:
714
729
  return target
715
730
  break
@@ -736,7 +751,7 @@ export default function parse(input, meta, immutable=true)
736
751
  return undefined
737
752
  }
738
753
  if (Array.isArray(target[prop])) {
739
- return new Proxy(target[prop], handlers.newArrayHandler)
754
+ return JSONTagProxy(target[prop], handlers.newArrayHandler)
740
755
  }
741
756
  return target[prop]
742
757
  break
@@ -780,7 +795,7 @@ export default function parse(input, meta, immutable=true)
780
795
  }
781
796
  if (Array.isArray(target[prop])) {
782
797
  target[prop][parent] = target[parent]
783
- return new Proxy(target[prop], handlers.arrayHandler)
798
+ return JSONTagProxy(target[prop], handlers.arrayHandler)
784
799
  }
785
800
  return target[prop]
786
801
  }
@@ -818,6 +833,9 @@ export default function parse(input, meta, immutable=true)
818
833
  get(target, prop, receiver) {
819
834
  firstParse(target)
820
835
  switch(prop) {
836
+ case resultSet:
837
+ return meta.resultArray
838
+ break;
821
839
  case source:
822
840
  if (meta.access && !meta.access(target, prop, 'get')) {
823
841
  return undefined
@@ -836,7 +854,7 @@ export default function parse(input, meta, immutable=true)
836
854
  if (target[isChanged]) {
837
855
  return serialize(target, null, true)
838
856
  }
839
- return input.slice(target[position].start,target[position].end)
857
+ return target[position].input.slice(target[position].start,target[position].end)
840
858
  }
841
859
  break
842
860
  case getIndex:
@@ -851,25 +869,38 @@ export default function parse(input, meta, immutable=true)
851
869
  }
852
870
  if (Array.isArray(target[prop])) {
853
871
  target[prop][parent] = target
854
- return new Proxy(target[prop], handlers.arrayHandler)
872
+ return JSONTagProxy(target[prop], handlers.arrayHandler)
855
873
  }
856
874
  return target[prop]
857
875
  break
858
876
  }
859
877
  },
860
878
  set(target, prop, value) {
861
- if (immutable && prop!==resultSet) {
879
+ if (immutable && prop!==resultSet && prop!==source) {
862
880
  throw new Error('dataspace is immutable')
863
881
  }
864
882
  firstParse(target)
865
- if (prop!==isChanged) {
866
- if (prop!=resultSet && meta.access && !meta.access(target, prop, 'set')) {
867
- return undefined
868
- }
869
- if (JSONTag.getType(value)==='object' && !value[isProxy]) {
870
- value = getNewValueProxy(value)
871
- }
872
- target[prop] = value
883
+ switch(prop) {
884
+ case isChanged:
885
+ break
886
+ case source:
887
+ resetObject(target)
888
+ target[position] = value[position]
889
+ target[isParsed] = false
890
+ return true
891
+ break
892
+ case resultSet:
893
+ break
894
+ default:
895
+ if (meta.access && !meta.access(target, prop, 'set')) {
896
+ return undefined
897
+ }
898
+ if (JSONTag.getType(value)==='object' && !value[isProxy]) {
899
+ value = getNewValueProxy(value)
900
+ }
901
+ target[prop] = value
902
+
903
+ break
873
904
  }
874
905
  target[isChanged] = true
875
906
  return true
@@ -924,13 +955,19 @@ export default function parse(input, meta, immutable=true)
924
955
  }
925
956
  }
926
957
 
958
+ function resetObject(ob) {
959
+ for (let prop of Object.getOwnPropertyNames(ob)) {
960
+ delete ob[prop]
961
+ }
962
+ }
963
+
927
964
  const getNewValueProxy = function(value) {
928
- let index = resultArray.length
929
- resultArray.push('')
965
+ let index = meta.resultArray.length
966
+ meta.resultArray.push('')
930
967
  value[getIndex] = index
931
968
  makeChildProxies(value)
932
- let result = new Proxy(value, handlers.newValueHandler)
933
- resultArray[index] = result
969
+ let result = JSONTagProxy(value, handlers.newValueHandler)
970
+ meta.resultArray[index] = result
934
971
  return result
935
972
  }
936
973
 
@@ -942,6 +979,7 @@ export default function parse(input, meta, immutable=true)
942
979
  cache[isParsed] = false
943
980
  // current offset + length contains jsontag of this value
944
981
  cache[position] = {
982
+ input,
945
983
  start: at-1,
946
984
  end: at-1+length
947
985
  }
@@ -949,7 +987,7 @@ export default function parse(input, meta, immutable=true)
949
987
  next()
950
988
  // newValueHandler makes sure that value[getBuffer] runs stringify
951
989
  // arrayHandler makes sure that changes in the array set targetIsChanged to true
952
- return new Proxy(cache, handlers.handler)
990
+ return JSONTagProxy(cache, handlers.handler)
953
991
  }
954
992
 
955
993
  value = function(ob={})
@@ -958,7 +996,7 @@ export default function parse(input, meta, immutable=true)
958
996
  whitespace()
959
997
  if (ch==='~') {
960
998
  let vOffset = offset()
961
- return resultArray[vOffset]
999
+ return meta.resultArray[vOffset]
962
1000
  }
963
1001
  if (ch==='<') {
964
1002
  tagOb = tag()
@@ -1019,18 +1057,40 @@ export default function parse(input, meta, immutable=true)
1019
1057
  return result
1020
1058
  }
1021
1059
 
1060
+ function jump() {
1061
+ next('+')
1062
+ return number()
1063
+ }
1064
+
1022
1065
  function lengthValue(i) {
1023
- let l = length()
1024
- let v = valueProxy(l,i)
1025
- return [l, v]
1066
+ whitespace()
1067
+ if (!ch) {
1068
+ next()
1069
+ }
1070
+ let l, v
1071
+ if (ch=='+') {
1072
+ i += jump()
1073
+ } else {
1074
+ l = length()
1075
+ v = valueProxy(l,i)
1076
+ }
1077
+ return [l, v, i]
1026
1078
  }
1027
1079
 
1080
+ let line = 0
1028
1081
  while(ch && at<input.length) {
1029
- result = lengthValue(resultArray.length)
1082
+ result = lengthValue(line) // needs to return current line nr
1030
1083
  whitespace()
1031
1084
  offsetArray.push(at)
1032
- resultArray.push(result[1])
1085
+ line = result[2]
1086
+ if (result[1]) {
1087
+ if (!meta.resultArray[line]) {
1088
+ meta.resultArray[line] = result[1]
1089
+ } else {
1090
+ meta.resultArray[line][source] = result[1]
1091
+ }
1092
+ line++
1093
+ }
1033
1094
  }
1034
- resultArray[0][resultSet] = resultArray
1035
- return resultArray[0]
1095
+ return meta.resultArray[0]
1036
1096
  }