@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 +1 -1
- package/src/jsontag.mjs +0 -3
- package/src/parse.mjs +73 -22
- package/src/serialize.mjs +24 -18
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@muze-nl/od-jsontag",
|
|
3
|
-
"version": "0.1
|
|
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
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
|
-
|
|
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
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
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
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
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(
|
|
1082
|
+
result = lengthValue(line) // needs to return current line nr
|
|
1039
1083
|
whitespace()
|
|
1040
1084
|
offsetArray.push(at)
|
|
1041
|
-
|
|
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]
|
|
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,
|
|
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
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
168
|
+
skipCount++
|
|
163
169
|
}
|
|
164
|
-
|
|
170
|
+
currentSource++
|
|
165
171
|
}
|
|
166
|
-
let arr =
|
|
172
|
+
let arr = result.map(encode)
|
|
167
173
|
let length = 0
|
|
168
174
|
for (let line of arr) {
|
|
169
175
|
length += line.length+1
|