@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 +2 -2
- package/src/command-worker-module.mjs +2 -1
- package/src/fastParse.mjs +94 -99
- package/src/fastStringify.mjs +0 -9
- package/src/query-worker-module.mjs +5 -5
- package/src/symbols.mjs +4 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@muze-nl/simplystore",
|
|
3
|
-
"version": "0.
|
|
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.
|
|
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
|
|
662
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
762
|
+
return target[parent][isChanged]
|
|
780
763
|
} else {
|
|
781
764
|
if (!immutable && Array.isArray(target[prop])) {
|
|
782
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
|
829
|
+
return target[getIndex]
|
|
835
830
|
break
|
|
836
831
|
case isChanged:
|
|
837
|
-
return
|
|
832
|
+
return target[isChanged]
|
|
838
833
|
break
|
|
839
834
|
default:
|
|
840
|
-
if (Array.isArray(target[prop])
|
|
841
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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') {
|
package/src/fastStringify.mjs
CHANGED
|
@@ -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
|
|
6
|
+
export const isParsed = Symbol('isParsed')
|
|
7
|
+
export const getString = Symbol('getString')
|
|
8
|
+
export const position = Symbol('position')
|
|
9
|
+
export const parent = Symbol('parent')
|