@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.
- package/package.json +1 -1
- 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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
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(
|
|
1082
|
+
result = lengthValue(line) // needs to return current line nr
|
|
1030
1083
|
whitespace()
|
|
1031
1084
|
offsetArray.push(at)
|
|
1032
|
-
|
|
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]
|
|
1035
|
-
return resultArray[0]
|
|
1095
|
+
return meta.resultArray[0]
|
|
1036
1096
|
}
|