@muze-nl/od-jsontag 0.1.7 → 0.2.1

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/od-jsontag",
3
- "version": "0.1.7",
3
+ "version": "0.2.1",
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/jsontag.mjs CHANGED
@@ -45,6 +45,3 @@ export function removeAttribute(obj, attr) {
45
45
  return JSONTag.removeAttribute(obj?.[source] ?? obj, attr)
46
46
  }
47
47
 
48
- export function clone(obj) {
49
- return JSONTag.clone(obj?.[source] ?? obj)
50
- }
package/src/parse.mjs CHANGED
@@ -46,7 +46,9 @@ export default function parse(input, meta, immutable=true)
46
46
  t: "\t"
47
47
  }
48
48
  let offsetArray = []
49
- let resultArray = []
49
+ if (!meta.resultArray) {
50
+ meta.resultArray = []
51
+ }
50
52
 
51
53
  at = 0
52
54
  ch = " "
@@ -661,6 +663,7 @@ export default function parse(input, meta, immutable=true)
661
663
  }
662
664
 
663
665
  let parseValue = function(position, ob={}) {
666
+ input = position.input
664
667
  at = position.start
665
668
  next()
666
669
  return value(ob)
@@ -719,6 +722,9 @@ export default function parse(input, meta, immutable=true)
719
722
  newValueHandler: {
720
723
  get(target, prop, receiver) {
721
724
  switch(prop) {
725
+ case resultSet:
726
+ return meta.resultArray
727
+ break;
722
728
  case source:
723
729
  return target
724
730
  break
@@ -827,6 +833,9 @@ export default function parse(input, meta, immutable=true)
827
833
  get(target, prop, receiver) {
828
834
  firstParse(target)
829
835
  switch(prop) {
836
+ case resultSet:
837
+ return meta.resultArray
838
+ break;
830
839
  case source:
831
840
  if (meta.access && !meta.access(target, prop, 'get')) {
832
841
  return undefined
@@ -845,7 +854,7 @@ export default function parse(input, meta, immutable=true)
845
854
  if (target[isChanged]) {
846
855
  return serialize(target, null, true)
847
856
  }
848
- return input.slice(target[position].start,target[position].end)
857
+ return target[position].input.slice(target[position].start,target[position].end)
849
858
  }
850
859
  break
851
860
  case getIndex:
@@ -867,18 +876,31 @@ export default function parse(input, meta, immutable=true)
867
876
  }
868
877
  },
869
878
  set(target, prop, value) {
870
- if (immutable && prop!==resultSet) {
879
+ if (immutable && prop!==resultSet && prop!==source) {
871
880
  throw new Error('dataspace is immutable')
872
881
  }
873
882
  firstParse(target)
874
- if (prop!==isChanged) {
875
- if (prop!=resultSet && meta.access && !meta.access(target, prop, 'set')) {
876
- return undefined
877
- }
878
- if (JSONTag.getType(value)==='object' && !value[isProxy]) {
879
- value = getNewValueProxy(value)
880
- }
881
- 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
882
904
  }
883
905
  target[isChanged] = true
884
906
  return true
@@ -933,13 +955,19 @@ export default function parse(input, meta, immutable=true)
933
955
  }
934
956
  }
935
957
 
958
+ function resetObject(ob) {
959
+ for (let prop of Object.getOwnPropertyNames(ob)) {
960
+ delete ob[prop]
961
+ }
962
+ }
963
+
936
964
  const getNewValueProxy = function(value) {
937
- let index = resultArray.length
938
- resultArray.push('')
965
+ let index = meta.resultArray.length
966
+ meta.resultArray.push('')
939
967
  value[getIndex] = index
940
968
  makeChildProxies(value)
941
969
  let result = JSONTagProxy(value, handlers.newValueHandler)
942
- resultArray[index] = result
970
+ meta.resultArray[index] = result
943
971
  return result
944
972
  }
945
973
 
@@ -951,6 +979,7 @@ export default function parse(input, meta, immutable=true)
951
979
  cache[isParsed] = false
952
980
  // current offset + length contains jsontag of this value
953
981
  cache[position] = {
982
+ input,
954
983
  start: at-1,
955
984
  end: at-1+length
956
985
  }
@@ -967,7 +996,7 @@ export default function parse(input, meta, immutable=true)
967
996
  whitespace()
968
997
  if (ch==='~') {
969
998
  let vOffset = offset()
970
- return resultArray[vOffset]
999
+ return meta.resultArray[vOffset]
971
1000
  }
972
1001
  if (ch==='<') {
973
1002
  tagOb = tag()
@@ -1028,18 +1057,40 @@ export default function parse(input, meta, immutable=true)
1028
1057
  return result
1029
1058
  }
1030
1059
 
1060
+ function jump() {
1061
+ next('+')
1062
+ return number()
1063
+ }
1064
+
1031
1065
  function lengthValue(i) {
1032
- let l = length()
1033
- let v = valueProxy(l,i)
1034
- 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]
1035
1078
  }
1036
1079
 
1080
+ let line = 0
1037
1081
  while(ch && at<input.length) {
1038
- result = lengthValue(resultArray.length)
1082
+ result = lengthValue(line) // needs to return current line nr
1039
1083
  whitespace()
1040
1084
  offsetArray.push(at)
1041
- 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
+ }
1042
1094
  }
1043
- resultArray[0][resultSet] = resultArray
1044
- return resultArray[0]
1095
+ return meta.resultArray[0]
1045
1096
  }
package/src/serialize.mjs CHANGED
@@ -15,17 +15,8 @@ function stringToSAB(strData) {
15
15
  return uint8sab
16
16
  }
17
17
 
18
- export default function serialize(value, meta, skipLength=false, index=false) {
18
+ export default function serialize(value, options={}) {
19
19
  let resultArray = []
20
- if (!meta) {
21
- meta = {}
22
- }
23
- if (!meta.index) {
24
- meta.index = {}
25
- }
26
- if (!meta.index.id) {
27
- meta.index.id = new Map()
28
- }
29
20
  let references = new WeakMap()
30
21
 
31
22
  function stringifyValue(value, inarray=false) {
@@ -139,7 +130,7 @@ export default function serialize(value, meta, skipLength=false, index=false) {
139
130
  if (typeof s == 'string' || s instanceof String) {
140
131
  s = encoder.encode(s)
141
132
  }
142
- if (skipLength) {
133
+ if (s[0]==43 || options.skipLength) {
143
134
  return new Uint8Array(s)
144
135
  }
145
136
  let length = encoder.encode('('+s.length+')')
@@ -154,16 +145,31 @@ export default function serialize(value, meta, skipLength=false, index=false) {
154
145
  } else {
155
146
  resultArray.push(value)
156
147
  }
157
- let current = 0
158
- while(current<resultArray.length) {
159
- if (resultArray[current][isChanged] || !resultArray[current][isProxy]) {
160
- resultArray[current] = encoder.encode(innerStringify(current))
148
+ let currentSource = 0
149
+ let currentResult = 0
150
+ let skipCount = 0
151
+ let result = resultArray
152
+ if (options.changes) {
153
+ result = []
154
+ }
155
+ while(currentSource<resultArray.length) {
156
+ if (resultArray[currentSource][isChanged] || !resultArray[currentSource][isProxy]) {
157
+ if (skipCount) {
158
+ result[currentResult] = encoder.encode('+'+skipCount)
159
+ skipCount = 0
160
+ currentResult++
161
+ }
162
+ result[currentResult] = encoder.encode(innerStringify(currentSource))
163
+ currentResult++
164
+ } else if (!options.changes) {
165
+ resultArray[currentResult] = resultArray[currentSource][getBuffer](currentSource)
166
+ currentResult++
161
167
  } else {
162
- resultArray[current] = resultArray[current][getBuffer](current)
168
+ skipCount++
163
169
  }
164
- current++
170
+ currentSource++
165
171
  }
166
- let arr = resultArray.map(encode)
172
+ let arr = result.map(encode)
167
173
  let length = 0
168
174
  for (let line of arr) {
169
175
  length += line.length+1