@vuu-ui/vuu-popups 0.8.0-debug → 0.8.1-debug
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/cjs/index.js +55 -18
- package/cjs/index.js.map +2 -2
- package/esm/index.js +2456 -21
- package/esm/index.js.map +2 -2
- package/package.json +3 -3
- package/types/menu/context-menu-provider.d.ts +2 -8
- package/types/menu/useContextMenu.d.ts +1 -1
package/esm/index.js
CHANGED
|
@@ -2830,11 +2830,2409 @@ var isTableSchema = (message) => message.type === "TABLE_META_RESP";
|
|
|
2830
2830
|
|
|
2831
2831
|
// ../vuu-data/src/inlined-worker.js
|
|
2832
2832
|
var workerSourceCode = `
|
|
2833
|
-
var
|
|
2833
|
+
var __accessCheck = (obj, member, msg) => {
|
|
2834
|
+
if (!member.has(obj))
|
|
2835
|
+
throw TypeError("Cannot " + msg);
|
|
2836
|
+
};
|
|
2837
|
+
var __privateGet = (obj, member, getter) => {
|
|
2838
|
+
__accessCheck(obj, member, "read from private field");
|
|
2839
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
2840
|
+
};
|
|
2841
|
+
var __privateAdd = (obj, member, value) => {
|
|
2842
|
+
if (member.has(obj))
|
|
2843
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
2844
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
2845
|
+
};
|
|
2846
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
2847
|
+
__accessCheck(obj, member, "write to private field");
|
|
2848
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
2849
|
+
return value;
|
|
2850
|
+
};
|
|
2851
|
+
|
|
2852
|
+
// ../vuu-utils/src/array-utils.ts
|
|
2853
|
+
function partition(array, test, pass = [], fail = []) {
|
|
2854
|
+
for (let i = 0, len = array.length; i < len; i++) {
|
|
2855
|
+
(test(array[i], i) ? pass : fail).push(array[i]);
|
|
2856
|
+
}
|
|
2857
|
+
return [pass, fail];
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2860
|
+
// ../vuu-utils/src/column-utils.ts
|
|
2861
|
+
var metadataKeys = {
|
|
2862
|
+
IDX: 0,
|
|
2863
|
+
RENDER_IDX: 1,
|
|
2864
|
+
IS_LEAF: 2,
|
|
2865
|
+
IS_EXPANDED: 3,
|
|
2866
|
+
DEPTH: 4,
|
|
2867
|
+
COUNT: 5,
|
|
2868
|
+
KEY: 6,
|
|
2869
|
+
SELECTED: 7,
|
|
2870
|
+
count: 8,
|
|
2871
|
+
// TODO following only used in datamodel
|
|
2872
|
+
PARENT_IDX: "parent_idx",
|
|
2873
|
+
IDX_POINTER: "idx_pointer",
|
|
2874
|
+
FILTER_COUNT: "filter_count",
|
|
2875
|
+
NEXT_FILTER_IDX: "next_filter_idx"
|
|
2876
|
+
};
|
|
2877
|
+
var { DEPTH, IS_LEAF } = metadataKeys;
|
|
2878
|
+
|
|
2879
|
+
// ../vuu-utils/src/cookie-utils.ts
|
|
2880
|
+
var getCookieValue = (name) => {
|
|
2881
|
+
var _a, _b;
|
|
2882
|
+
if (((_a = globalThis.document) == null ? void 0 : _a.cookie) !== void 0) {
|
|
2883
|
+
return (_b = globalThis.document.cookie.split("; ").find((row) => row.startsWith(\`\${name}=\`))) == null ? void 0 : _b.split("=")[1];
|
|
2884
|
+
}
|
|
2885
|
+
};
|
|
2886
|
+
|
|
2887
|
+
// ../vuu-utils/src/range-utils.ts
|
|
2888
|
+
function getFullRange({ from, to }, bufferSize = 0, rowCount = Number.MAX_SAFE_INTEGER) {
|
|
2889
|
+
if (bufferSize === 0) {
|
|
2890
|
+
if (rowCount < from) {
|
|
2891
|
+
return { from: 0, to: 0 };
|
|
2892
|
+
} else {
|
|
2893
|
+
return { from, to: Math.min(to, rowCount) };
|
|
2894
|
+
}
|
|
2895
|
+
} else if (from === 0) {
|
|
2896
|
+
return { from, to: Math.min(to + bufferSize, rowCount) };
|
|
2897
|
+
} else {
|
|
2898
|
+
const rangeSize = to - from;
|
|
2899
|
+
const buff = Math.round(bufferSize / 2);
|
|
2900
|
+
const shortfallBefore = from - buff < 0;
|
|
2901
|
+
const shortFallAfter = rowCount - (to + buff) < 0;
|
|
2902
|
+
if (shortfallBefore && shortFallAfter) {
|
|
2903
|
+
return { from: 0, to: rowCount };
|
|
2904
|
+
} else if (shortfallBefore) {
|
|
2905
|
+
return { from: 0, to: rangeSize + bufferSize };
|
|
2906
|
+
} else if (shortFallAfter) {
|
|
2907
|
+
return {
|
|
2908
|
+
from: Math.max(0, rowCount - (rangeSize + bufferSize)),
|
|
2909
|
+
to: rowCount
|
|
2910
|
+
};
|
|
2911
|
+
} else {
|
|
2912
|
+
return { from: from - buff, to: to + buff };
|
|
2913
|
+
}
|
|
2914
|
+
}
|
|
2915
|
+
}
|
|
2916
|
+
var withinRange = (value, { from, to }) => value >= from && value < to;
|
|
2917
|
+
var WindowRange = class {
|
|
2918
|
+
constructor(from, to) {
|
|
2919
|
+
this.from = from;
|
|
2920
|
+
this.to = to;
|
|
2921
|
+
}
|
|
2922
|
+
isWithin(index) {
|
|
2923
|
+
return withinRange(index, this);
|
|
2924
|
+
}
|
|
2925
|
+
//find the overlap of this range and a new one
|
|
2926
|
+
overlap(from, to) {
|
|
2927
|
+
return from >= this.to || to < this.from ? [0, 0] : [Math.max(from, this.from), Math.min(to, this.to)];
|
|
2928
|
+
}
|
|
2929
|
+
copy() {
|
|
2930
|
+
return new WindowRange(this.from, this.to);
|
|
2931
|
+
}
|
|
2932
|
+
};
|
|
2933
|
+
|
|
2934
|
+
// ../vuu-utils/src/DataWindow.ts
|
|
2935
|
+
var { KEY } = metadataKeys;
|
|
2936
|
+
|
|
2937
|
+
// ../vuu-utils/src/logging-utils.ts
|
|
2938
|
+
var logLevels = ["error", "warn", "info", "debug"];
|
|
2939
|
+
var isValidLogLevel = (value) => typeof value === "string" && logLevels.includes(value);
|
|
2940
|
+
var DEFAULT_LOG_LEVEL = "error";
|
|
2941
|
+
var NO_OP = () => void 0;
|
|
2942
|
+
var DEFAULT_DEBUG_LEVEL = false ? "error" : "info";
|
|
2943
|
+
var { loggingLevel = DEFAULT_DEBUG_LEVEL } = getLoggingSettings();
|
|
2944
|
+
var logger = (category) => {
|
|
2945
|
+
const debugEnabled5 = loggingLevel === "debug";
|
|
2946
|
+
const infoEnabled5 = debugEnabled5 || loggingLevel === "info";
|
|
2947
|
+
const warnEnabled = infoEnabled5 || loggingLevel === "warn";
|
|
2948
|
+
const errorEnabled = warnEnabled || loggingLevel === "error";
|
|
2949
|
+
const info5 = infoEnabled5 ? (message) => console.info(\`[\${category}] \${message}\`) : NO_OP;
|
|
2950
|
+
const warn4 = warnEnabled ? (message) => console.warn(\`[\${category}] \${message}\`) : NO_OP;
|
|
2951
|
+
const debug5 = debugEnabled5 ? (message) => console.debug(\`[\${category}] \${message}\`) : NO_OP;
|
|
2952
|
+
const error4 = errorEnabled ? (message) => console.error(\`[\${category}] \${message}\`) : NO_OP;
|
|
2953
|
+
if (false) {
|
|
2954
|
+
return {
|
|
2955
|
+
errorEnabled,
|
|
2956
|
+
error: error4
|
|
2957
|
+
};
|
|
2958
|
+
} else {
|
|
2959
|
+
return {
|
|
2960
|
+
debugEnabled: debugEnabled5,
|
|
2961
|
+
infoEnabled: infoEnabled5,
|
|
2962
|
+
warnEnabled,
|
|
2963
|
+
errorEnabled,
|
|
2964
|
+
info: info5,
|
|
2965
|
+
warn: warn4,
|
|
2966
|
+
debug: debug5,
|
|
2967
|
+
error: error4
|
|
2968
|
+
};
|
|
2969
|
+
}
|
|
2970
|
+
};
|
|
2971
|
+
function getLoggingSettings() {
|
|
2972
|
+
if (typeof loggingSettings !== "undefined") {
|
|
2973
|
+
return loggingSettings;
|
|
2974
|
+
} else {
|
|
2975
|
+
return {
|
|
2976
|
+
loggingLevel: getLoggingLevelFromCookie()
|
|
2977
|
+
};
|
|
2978
|
+
}
|
|
2979
|
+
}
|
|
2980
|
+
function getLoggingLevelFromCookie() {
|
|
2981
|
+
const value = getCookieValue("vuu-logging-level");
|
|
2982
|
+
if (isValidLogLevel(value)) {
|
|
2983
|
+
return value;
|
|
2984
|
+
} else {
|
|
2985
|
+
return DEFAULT_LOG_LEVEL;
|
|
2986
|
+
}
|
|
2987
|
+
}
|
|
2988
|
+
|
|
2989
|
+
// ../vuu-utils/src/debug-utils.ts
|
|
2990
|
+
var { debug, debugEnabled } = logger("range-monitor");
|
|
2991
|
+
var RangeMonitor = class {
|
|
2992
|
+
constructor(source) {
|
|
2993
|
+
this.source = source;
|
|
2994
|
+
this.range = { from: 0, to: 0 };
|
|
2995
|
+
this.timestamp = 0;
|
|
2996
|
+
}
|
|
2997
|
+
isSet() {
|
|
2998
|
+
return this.timestamp !== 0;
|
|
2999
|
+
}
|
|
3000
|
+
set({ from, to }) {
|
|
3001
|
+
const { timestamp } = this;
|
|
3002
|
+
this.range.from = from;
|
|
3003
|
+
this.range.to = to;
|
|
3004
|
+
this.timestamp = performance.now();
|
|
3005
|
+
if (timestamp) {
|
|
3006
|
+
debugEnabled && debug(
|
|
3007
|
+
\`<\${this.source}> [\${from}-\${to}], \${(this.timestamp - timestamp).toFixed(0)} ms elapsed\`
|
|
3008
|
+
);
|
|
3009
|
+
} else {
|
|
3010
|
+
return 0;
|
|
3011
|
+
}
|
|
3012
|
+
}
|
|
3013
|
+
};
|
|
3014
|
+
|
|
3015
|
+
// ../vuu-utils/src/event-emitter.ts
|
|
3016
|
+
function isArrayOfListeners(listeners) {
|
|
3017
|
+
return Array.isArray(listeners);
|
|
3018
|
+
}
|
|
3019
|
+
function isOnlyListener(listeners) {
|
|
3020
|
+
return !Array.isArray(listeners);
|
|
3021
|
+
}
|
|
3022
|
+
var _events;
|
|
3023
|
+
var EventEmitter = class {
|
|
3024
|
+
constructor() {
|
|
3025
|
+
__privateAdd(this, _events, /* @__PURE__ */ new Map());
|
|
3026
|
+
}
|
|
3027
|
+
addListener(event, listener) {
|
|
3028
|
+
const listeners = __privateGet(this, _events).get(event);
|
|
3029
|
+
if (!listeners) {
|
|
3030
|
+
__privateGet(this, _events).set(event, listener);
|
|
3031
|
+
} else if (isArrayOfListeners(listeners)) {
|
|
3032
|
+
listeners.push(listener);
|
|
3033
|
+
} else if (isOnlyListener(listeners)) {
|
|
3034
|
+
__privateGet(this, _events).set(event, [listeners, listener]);
|
|
3035
|
+
}
|
|
3036
|
+
}
|
|
3037
|
+
removeListener(event, listener) {
|
|
3038
|
+
if (!__privateGet(this, _events).has(event)) {
|
|
3039
|
+
return;
|
|
3040
|
+
}
|
|
3041
|
+
const listenerOrListeners = __privateGet(this, _events).get(event);
|
|
3042
|
+
let position = -1;
|
|
3043
|
+
if (listenerOrListeners === listener) {
|
|
3044
|
+
__privateGet(this, _events).delete(event);
|
|
3045
|
+
} else if (Array.isArray(listenerOrListeners)) {
|
|
3046
|
+
for (let i = length; i-- > 0; ) {
|
|
3047
|
+
if (listenerOrListeners[i] === listener) {
|
|
3048
|
+
position = i;
|
|
3049
|
+
break;
|
|
3050
|
+
}
|
|
3051
|
+
}
|
|
3052
|
+
if (position < 0) {
|
|
3053
|
+
return;
|
|
3054
|
+
}
|
|
3055
|
+
if (listenerOrListeners.length === 1) {
|
|
3056
|
+
listenerOrListeners.length = 0;
|
|
3057
|
+
__privateGet(this, _events).delete(event);
|
|
3058
|
+
} else {
|
|
3059
|
+
listenerOrListeners.splice(position, 1);
|
|
3060
|
+
}
|
|
3061
|
+
}
|
|
3062
|
+
}
|
|
3063
|
+
removeAllListeners(event) {
|
|
3064
|
+
if (event && __privateGet(this, _events).has(event)) {
|
|
3065
|
+
__privateGet(this, _events).delete(event);
|
|
3066
|
+
} else if (event === void 0) {
|
|
3067
|
+
__privateGet(this, _events).clear();
|
|
3068
|
+
}
|
|
3069
|
+
}
|
|
3070
|
+
emit(event, ...args) {
|
|
3071
|
+
if (__privateGet(this, _events)) {
|
|
3072
|
+
const handler = __privateGet(this, _events).get(event);
|
|
3073
|
+
if (handler) {
|
|
3074
|
+
this.invokeHandler(handler, args);
|
|
3075
|
+
}
|
|
3076
|
+
}
|
|
3077
|
+
}
|
|
3078
|
+
once(event, listener) {
|
|
3079
|
+
const handler = (...args) => {
|
|
3080
|
+
this.removeListener(event, handler);
|
|
3081
|
+
listener(...args);
|
|
3082
|
+
};
|
|
3083
|
+
this.on(event, handler);
|
|
3084
|
+
}
|
|
3085
|
+
on(event, listener) {
|
|
3086
|
+
this.addListener(event, listener);
|
|
3087
|
+
}
|
|
3088
|
+
invokeHandler(handler, args) {
|
|
3089
|
+
if (isArrayOfListeners(handler)) {
|
|
3090
|
+
handler.slice().forEach((listener) => this.invokeHandler(listener, args));
|
|
3091
|
+
} else {
|
|
3092
|
+
switch (args.length) {
|
|
3093
|
+
case 0:
|
|
3094
|
+
handler();
|
|
3095
|
+
break;
|
|
3096
|
+
case 1:
|
|
3097
|
+
handler(args[0]);
|
|
3098
|
+
break;
|
|
3099
|
+
case 2:
|
|
3100
|
+
handler(args[0], args[1]);
|
|
3101
|
+
break;
|
|
3102
|
+
default:
|
|
3103
|
+
handler.call(null, ...args);
|
|
3104
|
+
}
|
|
3105
|
+
}
|
|
3106
|
+
}
|
|
3107
|
+
};
|
|
3108
|
+
_events = new WeakMap();
|
|
3109
|
+
|
|
3110
|
+
// ../vuu-utils/src/round-decimal.ts
|
|
3111
|
+
var PUNCTUATION_STR = String.fromCharCode(8200);
|
|
3112
|
+
var DIGIT_STR = String.fromCharCode(8199);
|
|
3113
|
+
var Space = {
|
|
3114
|
+
DIGIT: DIGIT_STR,
|
|
3115
|
+
TWO_DIGITS: DIGIT_STR + DIGIT_STR,
|
|
3116
|
+
THREE_DIGITS: DIGIT_STR + DIGIT_STR + DIGIT_STR,
|
|
3117
|
+
FULL_PADDING: [
|
|
3118
|
+
null,
|
|
3119
|
+
PUNCTUATION_STR + DIGIT_STR,
|
|
3120
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR,
|
|
3121
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR,
|
|
3122
|
+
PUNCTUATION_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR
|
|
3123
|
+
]
|
|
3124
|
+
};
|
|
3125
|
+
var LEADING_FILL = DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR + DIGIT_STR;
|
|
3126
|
+
|
|
3127
|
+
// ../vuu-utils/src/input-utils.ts
|
|
3128
|
+
var actionKeys = {
|
|
3129
|
+
Enter: "Enter",
|
|
3130
|
+
Delete: "Delete"
|
|
3131
|
+
};
|
|
3132
|
+
var navigationKeys = {
|
|
3133
|
+
Home: "Home",
|
|
3134
|
+
End: "End",
|
|
3135
|
+
ArrowRight: "ArrowRight",
|
|
3136
|
+
ArrowLeft: "ArrowLeft",
|
|
3137
|
+
ArrowDown: "ArrowDown",
|
|
3138
|
+
ArrowUp: "ArrowUp",
|
|
3139
|
+
Tab: "Tab"
|
|
3140
|
+
};
|
|
3141
|
+
var functionKeys = {
|
|
3142
|
+
F1: "F1",
|
|
3143
|
+
F2: "F2",
|
|
3144
|
+
F3: "F3",
|
|
3145
|
+
F4: "F4",
|
|
3146
|
+
F5: "F5",
|
|
3147
|
+
F6: "F6",
|
|
3148
|
+
F7: "F7",
|
|
3149
|
+
F8: "F8",
|
|
3150
|
+
F9: "F9",
|
|
3151
|
+
F10: "F10",
|
|
3152
|
+
F11: "F11",
|
|
3153
|
+
F12: "F12"
|
|
3154
|
+
};
|
|
3155
|
+
var specialKeys = {
|
|
3156
|
+
...actionKeys,
|
|
3157
|
+
...navigationKeys,
|
|
3158
|
+
...functionKeys
|
|
3159
|
+
};
|
|
3160
|
+
|
|
3161
|
+
// ../vuu-utils/src/json-utils.ts
|
|
3162
|
+
var { COUNT } = metadataKeys;
|
|
3163
|
+
|
|
3164
|
+
// ../vuu-utils/src/keyset.ts
|
|
3165
|
+
var KeySet = class {
|
|
3166
|
+
constructor(range) {
|
|
3167
|
+
this.keys = /* @__PURE__ */ new Map();
|
|
3168
|
+
this.free = [];
|
|
3169
|
+
this.nextKeyValue = 0;
|
|
3170
|
+
this.reset(range);
|
|
3171
|
+
}
|
|
3172
|
+
next() {
|
|
3173
|
+
if (this.free.length > 0) {
|
|
3174
|
+
return this.free.pop();
|
|
3175
|
+
} else {
|
|
3176
|
+
return this.nextKeyValue++;
|
|
3177
|
+
}
|
|
3178
|
+
}
|
|
3179
|
+
reset({ from, to }) {
|
|
3180
|
+
this.keys.forEach((keyValue, rowIndex) => {
|
|
3181
|
+
if (rowIndex < from || rowIndex >= to) {
|
|
3182
|
+
this.free.push(keyValue);
|
|
3183
|
+
this.keys.delete(rowIndex);
|
|
3184
|
+
}
|
|
3185
|
+
});
|
|
3186
|
+
const size = to - from;
|
|
3187
|
+
if (this.keys.size + this.free.length > size) {
|
|
3188
|
+
this.free.length = Math.max(0, size - this.keys.size);
|
|
3189
|
+
}
|
|
3190
|
+
for (let rowIndex = from; rowIndex < to; rowIndex++) {
|
|
3191
|
+
if (!this.keys.has(rowIndex)) {
|
|
3192
|
+
const nextKeyValue = this.next();
|
|
3193
|
+
this.keys.set(rowIndex, nextKeyValue);
|
|
3194
|
+
}
|
|
3195
|
+
}
|
|
3196
|
+
if (this.nextKeyValue > this.keys.size) {
|
|
3197
|
+
this.nextKeyValue = this.keys.size;
|
|
3198
|
+
}
|
|
3199
|
+
}
|
|
3200
|
+
keyFor(rowIndex) {
|
|
3201
|
+
const key = this.keys.get(rowIndex);
|
|
3202
|
+
if (key === void 0) {
|
|
3203
|
+
console.log(\`key not found
|
|
2834
3204
|
keys: \${this.toDebugString()}
|
|
2835
3205
|
free : \${this.free.join(",")}
|
|
2836
|
-
\`),Error(\`KeySet, no key found for rowIndex \${e}\`);return t}toDebugString(){return Array.from(this.keys.entries()).map((e,t)=>\`\${e}=>\${t}\`).join(",")}};var{IDX:kn}=w;var{SELECTED:Nn}=w,v={False:0,True:1,First:2,Last:4};var Fn=v.True+v.First+v.Last,Wn=v.True+v.First,qn=v.True+v.Last;var be=r=>{if(r.every(t=>typeof t=="number"))return r;let e=[];for(let t of r)if(typeof t=="number")e.push(t);else for(let n=t[0];n<=t[1];n++)e.push(n);return e};var{debug:Vs,debugEnabled:Es,error:Se,info:V,infoEnabled:Ct,warn:x}=T("websocket-connection"),Re="ws",bt=r=>r.startsWith(Re+"://")||r.startsWith(Re+"s://"),Te={},Z=Symbol("setWebsocket"),A=Symbol("connectionCallback");async function Ee(r,e,t){return X(r,e,t)}async function Y(r){X(r.url,r.protocol,r[A],r)}async function X(r,e,t,n){let s=Te[r]||(Te[r]={attemptsRemaining:5,status:"disconnected"});try{t({type:"connection-status",status:"connecting"});let o=typeof n<"u",i=await Rt(r,e);console.info("%c\u26A1 %cconnected","font-size: 24px;color: green;font-weight: bold;","color:green; font-size: 14px;"),n!==void 0&&n[Z](i);let u=n!=null?n:new Q(i,r,e,t),g=o?"reconnected":"connection-open-awaiting-session";return t({type:"connection-status",status:g}),u.status=g,u}catch(o){console.log({evt:o});let i=--s.attemptsRemaining>0;if(t({type:"connection-status",status:"disconnected",reason:"failed to connect",retry:i}),i)return St(r,e,t,n,1e4);throw Error("Failed to establish connection")}}var St=(r,e,t,n,s)=>new Promise(o=>{setTimeout(()=>{o(X(r,e,t,n))},s)}),Rt=(r,e)=>new Promise((t,n)=>{let s=bt(r)?r:\`wss://\${r}\`;Ct&&e!==void 0&&V(\`WebSocket Protocol \${e==null?void 0:e.toString()}\`);let o=new WebSocket(s,e);o.onopen=()=>t(o),o.onerror=i=>n(i)}),ye=()=>{x==null||x("Connection cannot be closed, socket not yet opened")},Ve=r=>{x==null||x(\`Message cannot be sent, socket closed \${r.body.type}\`)},Tt=r=>{try{return JSON.parse(r)}catch{throw Error(\`Error parsing JSON response from server \${r}\`)}},Q=class{constructor(e,t,n,s){this.close=ye;this.requiresLogin=!0;this.send=Ve;this.status="ready";this.messagesCount=0;this.connectionMetricsInterval=null;this.handleWebsocketMessage=e=>{let t=Tt(e.data);this.messagesCount+=1,this[A](t)};this.url=t,this.protocol=n,this[A]=s,this[Z](e)}reconnect(){Y(this)}[(A,Z)](e){let t=this[A];e.onmessage=o=>{this.status="connected",e.onmessage=this.handleWebsocketMessage,this.handleWebsocketMessage(o)},this.connectionMetricsInterval=setInterval(()=>{t({type:"connection-metrics",messagesLength:this.messagesCount}),this.messagesCount=0},1e3),e.onerror=()=>{Se("\u26A1 connection error"),t({type:"connection-status",status:"disconnected",reason:"error"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status==="connection-open-awaiting-session"?Se("Websocket connection lost before Vuu session established, check websocket configuration"):this.status!=="closed"&&(Y(this),this.send=s)},e.onclose=()=>{V==null||V("\u26A1 connection close"),t({type:"connection-status",status:"disconnected",reason:"close"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status!=="closed"&&(Y(this),this.send=s)};let n=o=>{e.send(JSON.stringify(o))},s=o=>{V==null||V(\`TODO queue message until websocket reconnected \${o.body.type}\`)};this.send=n,this.close=()=>{this.status="closed",e.close(),this.close=ye,this.send=Ve,V==null||V("close websocket")}}};var yt=["VIEW_PORT_MENUS_SELECT_RPC","VIEW_PORT_MENU_TABLE_RPC","VIEW_PORT_MENU_ROW_RPC","VIEW_PORT_MENU_CELL_RPC","VP_EDIT_CELL_RPC","VP_EDIT_ROW_RPC","VP_EDIT_ADD_ROW_RPC","VP_EDIT_DELETE_CELL_RPC","VP_EDIT_DELETE_ROW_RPC","VP_EDIT_SUBMIT_FORM_RPC"],we=r=>yt.includes(r.type),ee=({requestId:r,...e})=>[r,e],Me=r=>{let e=r.at(0);if(e.updateType==="SIZE"){if(r.length===1)return r;e=r.at(1)}let t=r.at(-1);return[e,t]},Ie=r=>{let e={};for(let t of r)(e[t.viewPortId]||(e[t.viewPortId]=[])).push(t);return e},te=({columns:r,dataTypes:e,key:t,table:n})=>({table:n,columns:r.map((s,o)=>({name:s,serverDataType:e[o]})),key:t});var ve=r=>r.type==="connection-status",_e=r=>r.type==="connection-metrics";var De=r=>"viewport"in r,xe=r=>r.type==="VIEW_PORT_MENU_RESP"&&r.action!==null&&B(r.action.table),B=r=>r!==null&&typeof r=="object"&&"table"in r&&"module"in r?r.table.startsWith("session"):!1;var Pe="CHANGE_VP_SUCCESS",Oe="CHANGE_VP_RANGE_SUCCESS",Le="CLOSE_TREE_NODE",ke="CLOSE_TREE_SUCCESS";var Ae="CREATE_VP",Ue="CREATE_VP_SUCCESS",Ne="DISABLE_VP",Fe="DISABLE_VP_SUCCESS";var We="ENABLE_VP",qe="ENABLE_VP_SUCCESS";var ne="GET_VP_VISUAL_LINKS",$e="GET_VIEW_PORT_MENUS";var Ge="HB",Be="HB_RESP",Ke="LOGIN",He="LOGIN_SUCCESS",Je="OPEN_TREE_NODE",je="OPEN_TREE_SUCCESS";var ze="REMOVE_VP";var se="RPC_RESP";var Ye="SET_SELECTION_SUCCESS",re="TABLE_META_RESP",oe="TABLE_LIST_RESP",Ze="TABLE_ROW";var Xe=r=>{switch(r){case"TypeAheadRpcHandler":return"TYPEAHEAD";default:return"SIMUL"}};var et=[],y=T("array-backed-moving-window"),C,K=class{constructor({from:e,to:t},{from:n,to:s},o){N(this,C,void 0);this.setRowCount=e=>{var t;if((t=y.info)==null||t.call(y,\`setRowCount \${e}\`),e<this.internalData.length&&(this.internalData.length=e),e<this.rowCount){this.rowsWithinRange=0;let n=Math.min(e,this.clientRange.to);for(let s=this.clientRange.from;s<n;s++){let o=s-c(this,C).from;this.internalData[o]!==void 0&&(this.rowsWithinRange+=1)}}this.rowCount=e};this.bufferBreakout=(e,t)=>{let n=this.bufferSize*.25;return c(this,C).to-t<n?!0:c(this,C).from>0&&e-c(this,C).from<n};this.bufferSize=o,this.clientRange=new I(e,t),de(this,C,new I(n,s)),this.internalData=new Array(o),this.rowsWithinRange=0,this.rowCount=0}get range(){return c(this,C)}get hasAllRowsWithinRange(){return this.rowsWithinRange===this.clientRange.to-this.clientRange.from||this.rowCount>0&&this.clientRange.from+this.rowsWithinRange===this.rowCount}outOfRange(e,t){let{from:n,to:s}=this.range;if(t<n||e>=s)return!0}setAtIndex(e){let{rowIndex:t}=e,n=this.isWithinClientRange(t);if(n||this.isWithinRange(t)){let s=t-c(this,C).from;!this.internalData[s]&&n&&(this.rowsWithinRange+=1),this.internalData[s]=e}return n}getAtIndex(e){return c(this,C).isWithin(e)&&this.internalData[e-c(this,C).from]!=null?this.internalData[e-c(this,C).from]:void 0}isWithinRange(e){return c(this,C).isWithin(e)}isWithinClientRange(e){return this.clientRange.isWithin(e)}setClientRange(e,t){var f;(f=y.debug)==null||f.call(y,\`setClientRange \${e} - \${t}\`);let n=this.clientRange.from,s=Math.min(this.clientRange.to,this.rowCount);if(e===n&&t===s)return[!1,et];let o=this.clientRange.copy();this.clientRange.from=e,this.clientRange.to=t,this.rowsWithinRange=0;for(let a=e;a<t;a++){let l=a-c(this,C).from;this.internalData[l]&&(this.rowsWithinRange+=1)}let i=et,u=c(this,C).from;if(this.hasAllRowsWithinRange)if(t>o.to){let a=Math.max(e,o.to);i=this.internalData.slice(a-u,t-u)}else{let a=Math.min(o.from,t);i=this.internalData.slice(e-u,a-u)}return[this.bufferBreakout(e,t),i]}setRange(e,t){var i;(i=y.debug)==null||i.call(y,\`setRange \${e} - \${t}\`);let[n,s]=c(this,C).overlap(e,t),o=new Array(t-e+this.bufferSize);this.rowsWithinRange=0;for(let u=n;u<s;u++){let g=this.getAtIndex(u);if(g){let f=u-e;o[f]=g,this.isWithinClientRange(u)&&(this.rowsWithinRange+=1)}}this.internalData=o,c(this,C).from=e,c(this,C).to=t}getData(){var u;let{from:e,to:t}=c(this,C),{from:n,to:s}=this.clientRange,o=Math.max(0,n-e),i=Math.min(t-e,t,s-e,(u=this.rowCount)!=null?u:t);return this.internalData.slice(o,i)}clear(){var e;(e=y.debug)==null||e.call(y,"clear"),this.internalData.length=0,this.rowsWithinRange=0,this.setRowCount(0)}getCurrentDataRange(){let e=this.internalData,t=e.length,[n]=this.internalData,s=this.internalData[t-1];if(n&&s)return[n.rowIndex,s.rowIndex];for(let o=0;o<t;o++)if(e[o]!==void 0){n=e[o];break}for(let o=t-1;o>=0;o--)if(e[o]!==void 0){s=e[o];break}return n&&s?[n.rowIndex,s.rowIndex]:[-1,-1]}};C=new WeakMap;var Vt=[],{debug:m,debugEnabled:H,error:Et,info:p,infoEnabled:wt,warn:P}=T("viewport"),Mt=({rowKey:r,updateType:e})=>e==="U"&&!r.startsWith("$root"),J=class{constructor({aggregations:e,bufferSize:t=50,columns:n,filter:s,groupBy:o=[],table:i,range:u,sort:g,title:f,viewport:a,visualLink:l}){this.dataWindow=void 0;this.hasUpdates=!1;this.pendingUpdates=[];this.pendingOperations=new Map;this.pendingRangeRequests=[];this.rowCountChanged=!1;this.tableSchema=null;this.batchMode=!0;this.useBatchMode=!0;this.rangeMonitor=new q("ViewPort");this.disabled=!1;this.isTree=!1;this.status="";this.suspended=!1;this.rangeRequestAlreadyPending=e=>{let{bufferSize:t}=this,n=t*.25,{from:s}=e;for(let{from:o,to:i}of this.pendingRangeRequests)if(s>=o&&s<i){if(e.to+n<=i)return!0;s=i}return!1};this.getNewRowCount=()=>{if(this.rowCountChanged&&this.dataWindow)return this.rowCountChanged=!1,this.dataWindow.rowCount};this.aggregations=e,this.bufferSize=t,this.clientRange=u,this.clientViewportId=a,this.columns=n,this.filter=s,this.groupBy=o,this.keys=new G(u),this.pendingLinkedParent=l,this.table=i,this.sort=g,this.title=f,wt&&(p==null||p(\`constructor #\${a} \${i.table} bufferSize=\${t}\`))}get hasUpdatesToProcess(){return this.suspended?!1:this.rowCountChanged||this.hasUpdates}get size(){var e,t;return(t=(e=this.dataWindow)==null?void 0:e.rowCount)!=null?t:0}subscribe(){let{filter:e}=this.filter;return this.status=this.status==="subscribed"?"resubscribing":"subscribing",{type:Ae,table:this.table,range:z(this.clientRange,this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:e}}}handleSubscribed({viewPortId:e,aggregations:t,columns:n,filterSpec:s,range:o,sort:i,groupBy:u}){return this.serverViewportId=e,this.status="subscribed",this.aggregations=t,this.columns=n,this.groupBy=u,this.isTree=u&&u.length>0,this.dataWindow=new K(this.clientRange,o,this.bufferSize),{aggregations:t,type:"subscribed",clientViewportId:this.clientViewportId,columns:n,filter:s,groupBy:u,range:o,sort:i,tableSchema:this.tableSchema}}awaitOperation(e,t){this.pendingOperations.set(e,t)}completeOperation(e,...t){var u;let{clientViewportId:n,pendingOperations:s}=this,o=s.get(e);if(!o){Et("no matching operation found to complete");return}let{type:i}=o;if(p==null||p(\`completeOperation \${i}\`),s.delete(e),i==="CHANGE_VP_RANGE"){let[g,f]=t;(u=this.dataWindow)==null||u.setRange(g,f);for(let a=this.pendingRangeRequests.length-1;a>=0;a--){let l=this.pendingRangeRequests[a];if(l.requestId===e){l.acked=!0;break}else P==null||P("range requests sent faster than they are being ACKed")}}else if(i==="config"){let{aggregations:g,columns:f,filter:a,groupBy:l,sort:d}=o.data;return this.aggregations=g,this.columns=f,this.filter=a,this.groupBy=l,this.sort=d,l.length>0?this.isTree=!0:this.isTree&&(this.isTree=!1),m==null||m(\`config change confirmed, isTree : \${this.isTree}\`),{clientViewportId:n,type:i,config:o.data}}else{if(i==="groupBy")return this.isTree=o.data.length>0,this.groupBy=o.data,m==null||m(\`groupBy change confirmed, isTree : \${this.isTree}\`),{clientViewportId:n,type:i,groupBy:o.data};if(i==="columns")return this.columns=o.data,{clientViewportId:n,type:i,columns:o.data};if(i==="filter")return this.filter=o.data,{clientViewportId:n,type:i,filter:o.data};if(i==="aggregate")return this.aggregations=o.data,{clientViewportId:n,type:"aggregate",aggregations:this.aggregations};if(i==="sort")return this.sort=o.data,{clientViewportId:n,type:i,sort:this.sort};if(i!=="selection"){if(i==="disable")return this.disabled=!0,{type:"disabled",clientViewportId:n};if(i==="enable")return this.disabled=!1,{type:"enabled",clientViewportId:n};if(i==="CREATE_VISUAL_LINK"){let[g,f,a]=t;return this.linkedParent={colName:g,parentViewportId:f,parentColName:a},this.pendingLinkedParent=void 0,{type:"vuu-link-created",clientViewportId:n,colName:g,parentViewportId:f,parentColName:a}}else if(i==="REMOVE_VISUAL_LINK")return this.linkedParent=void 0,{type:"vuu-link-removed",clientViewportId:n}}}}rangeRequest(e,t){H&&this.rangeMonitor.set(t);let n="CHANGE_VP_RANGE";if(this.dataWindow){let[s,o]=this.dataWindow.setClientRange(t.from,t.to),i,u=this.dataWindow.rowCount||void 0,g=s&&!this.rangeRequestAlreadyPending(t)?{type:n,viewPortId:this.serverViewportId,...z(t,this.bufferSize,u)}:null;if(g){H&&(m==null||m(\`create CHANGE_VP_RANGE: [\${g.from} - \${g.to}]\`)),this.awaitOperation(e,{type:n});let a=this.pendingRangeRequests.at(-1);if(a)if(a.acked)console.warn("Range Request before previous request is filled");else{let{from:l,to:d}=a;this.dataWindow.outOfRange(l,d)?i={clientViewportId:this.clientViewportId,type:"debounce-begin"}:P==null||P("Range Request before previous request is acked")}this.pendingRangeRequests.push({...g,requestId:e}),this.useBatchMode&&(this.batchMode=!0)}else o.length>0&&(this.batchMode=!1);this.keys.reset(this.dataWindow.clientRange);let f=this.isTree?ae:ie;return o.length?[g,o.map(a=>f(a,this.keys))]:i?[g,void 0,i]:[g]}else return[null]}setLinks(e){return this.links=e,[{type:"vuu-links",links:e,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(e){return{type:"vuu-menu",menu:e,clientViewportId:this.clientViewportId}}setTableSchema(e){this.tableSchema=e}openTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:Je,vpId:this.serverViewportId,treeKey:t.key}}closeTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:Le,vpId:this.serverViewportId,treeKey:t.key}}createLink(e,t,n,s){let o={type:"CREATE_VISUAL_LINK",parentVpId:n,childVpId:this.serverViewportId,parentColumnName:s,childColumnName:t};return this.awaitOperation(e,o),this.useBatchMode&&(this.batchMode=!0),o}removeLink(e){let t={type:"REMOVE_VISUAL_LINK",childVpId:this.serverViewportId};return this.awaitOperation(e,t),t}suspend(){this.suspended=!0,p==null||p("suspend")}resume(){return this.suspended=!1,H&&(m==null||m(\`resume: \${this.currentData()}\`)),this.currentData()}currentData(){let e=[];if(this.dataWindow){let t=this.dataWindow.getData(),{keys:n}=this,s=this.isTree?ae:ie;for(let o of t)o&&e.push(s(o,n))}return e}enable(e){return this.awaitOperation(e,{type:"enable"}),p==null||p(\`enable: \${this.serverViewportId}\`),{type:We,viewPortId:this.serverViewportId}}disable(e){return this.awaitOperation(e,{type:"disable"}),p==null||p(\`disable: \${this.serverViewportId}\`),{type:Ne,viewPortId:this.serverViewportId}}columnRequest(e,t){return this.awaitOperation(e,{type:"columns",data:t}),m==null||m(\`columnRequest: \${t}\`),this.createRequest({columns:t})}filterRequest(e,t){this.awaitOperation(e,{type:"filter",data:t}),this.useBatchMode&&(this.batchMode=!0);let{filter:n}=t;return p==null||p(\`filterRequest: \${n}\`),this.createRequest({filterSpec:{filter:n}})}setConfig(e,t){this.awaitOperation(e,{type:"config",data:t});let{filter:n,...s}=t;return this.useBatchMode&&(this.batchMode=!0),H?m==null||m(\`setConfig \${JSON.stringify(t)}\`):p==null||p("setConfig"),this.createRequest({...s,filterSpec:typeof(n==null?void 0:n.filter)=="string"?{filter:n.filter}:{filter:""}},!0)}aggregateRequest(e,t){return this.awaitOperation(e,{type:"aggregate",data:t}),p==null||p(\`aggregateRequest: \${t}\`),this.createRequest({aggregations:t})}sortRequest(e,t){return this.awaitOperation(e,{type:"sort",data:t}),p==null||p(\`sortRequest: \${JSON.stringify(t.sortDefs)}\`),this.createRequest({sort:t})}groupByRequest(e,t=Vt){var n;return this.awaitOperation(e,{type:"groupBy",data:t}),this.useBatchMode&&(this.batchMode=!0),this.isTree||(n=this.dataWindow)==null||n.clear(),this.createRequest({groupBy:t})}selectRequest(e,t){return this.awaitOperation(e,{type:"selection",data:t}),p==null||p(\`selectRequest: \${t}\`),{type:"SET_SELECTION",vpId:this.serverViewportId,selection:be(t)}}removePendingRangeRequest(e,t){for(let n=this.pendingRangeRequests.length-1;n>=0;n--){let{from:s,to:o}=this.pendingRangeRequests[n],i=!0;if(e>=s&&e<o||t>s&&t<o){i||console.warn("removePendingRangeRequest TABLE_ROWS are not for latest request"),this.pendingRangeRequests.splice(n,1);break}else i=!1}}updateRows(e){var s,o,i;let[t,n]=Me(e);if(t&&n&&this.removePendingRangeRequest(t.rowIndex,n.rowIndex),e.length===1&&t.vpSize===0&&this.disabled){m==null||m(\`ignore a SIZE=0 message on disabled viewport (\${e.length} rows)\`);return}for(let u of e)this.isTree&&Mt(u)||((u.updateType==="SIZE"||((s=this.dataWindow)==null?void 0:s.rowCount)!==u.vpSize)&&((o=this.dataWindow)==null||o.setRowCount(u.vpSize),this.rowCountChanged=!0),u.updateType==="U"&&(i=this.dataWindow)!=null&&i.setAtIndex(u)&&(this.hasUpdates=!0,this.batchMode||this.pendingUpdates.push(u)))}getClientRows(){let e,t="size-only";if(this.hasUpdates&&this.dataWindow){let{keys:n}=this,s=this.isTree?ae:ie;if(this.pendingUpdates.length>0){e=[],t="update";for(let o of this.pendingUpdates)e.push(s(o,n));this.pendingUpdates.length=0}else{let o=this.dataWindow.getData();if(this.dataWindow.hasAllRowsWithinRange){e=[],t="batch";for(let i of o)e.push(s(i,n));this.batchMode=!1}}this.hasUpdates=!1}return[e,t]}createRequest(e,t=!1){return t?{type:"CHANGE_VP",viewPortId:this.serverViewportId,...e}:{type:"CHANGE_VP",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...e}}},ie=({rowIndex:r,rowKey:e,sel:t,data:n},s)=>[r,s.keyFor(r),!0,!1,0,0,e,t].concat(n),ae=({rowIndex:r,rowKey:e,sel:t,data:n},s)=>{let[o,i,,u,,g,...f]=n;return[r,s.keyFor(r),u,i,o,g,e,t].concat(f)};var tt=1;var{debug:M,debugEnabled:O,error:L,info:_,infoEnabled:It,warn:k}=T("server-proxy"),b=()=>\`\${tt++}\`,vt={},_t=r=>r.disabled!==!0&&r.suspended!==!0,Dt={type:"NO_ACTION"},xt=(r,e,t)=>r.map(n=>n.parentVpId===e?{...n,label:t}:n);function Pt(r,e){return r.map(t=>{let{parentVpId:n}=t,s=e.get(n);if(s)return{...t,parentClientVpId:s.clientViewportId,label:s.title};throw Error("addLabelsToLinks viewport not found")})}var j=class{constructor(e,t){this.authToken="";this.user="user";this.pendingTableMetaRequests=new Map;this.pendingRequests=new Map;this.queuedRequests=[];this.cachedTableSchemas=new Map;this.connection=e,this.postMessageToClient=t,this.viewports=new Map,this.mapClientToServerViewport=new Map}async reconnect(){await this.login(this.authToken);let[e,t]=fe(Array.from(this.viewports.values()),_t);this.viewports.clear(),this.mapClientToServerViewport.clear();let n=s=>{s.forEach(o=>{let{clientViewportId:i}=o;this.viewports.set(i,o),this.sendMessageToServer(o.subscribe(),i)})};n(e),setTimeout(()=>{n(t)},2e3)}async login(e,t="user"){if(e)return this.authToken=e,this.user=t,new Promise((n,s)=>{this.sendMessageToServer({type:Ke,token:this.authToken,user:t},""),this.pendingLogin={resolve:n,reject:s}});this.authToken===""&&L("login, cannot login until auth token has been obtained")}subscribe(e){if(this.mapClientToServerViewport.has(e.viewport))L(\`spurious subscribe call \${e.viewport}\`);else{if(!this.hasSchemaForTable(e.table)&&!B(e.table)){_==null||_(\`subscribe to \${e.table.table}, no metadata yet, request metadata\`);let n=b();this.sendMessageToServer({type:"GET_TABLE_META",table:e.table},n),this.pendingTableMetaRequests.set(n,e.viewport)}let t=new J(e);this.viewports.set(e.viewport,t),this.sendIfReady(t.subscribe(),e.viewport,this.sessionId!=="")}}unsubscribe(e){let t=this.mapClientToServerViewport.get(e);t?(_==null||_(\`Unsubscribe Message (Client to Server):
|
|
2837
|
-
\${t}\`),this.sendMessageToServer({type:ze,viewPortId:t})):L(\`failed to unsubscribe client viewport \${e}, viewport not found\`)}getViewportForClient(e,t=!0){let n=this.mapClientToServerViewport.get(e);if(n){let s=this.viewports.get(n);if(s)return s;if(t)throw Error(\`Viewport not found for client viewport \${e}\`);return null}else{if(this.viewports.has(e))return this.viewports.get(e);if(t)throw Error(\`Viewport server id not found for client viewport \${e}\`);return null}}setViewRange(e,t){let n=b(),[s,o,i]=e.rangeRequest(n,t.range);s&&this.sendIfReady(s,n,e.status==="subscribed"),o?this.postMessageToClient({mode:"batch",type:"viewport-update",clientViewportId:e.clientViewportId,rows:o}):i&&this.postMessageToClient(i)}setConfig(e,t){let n=b(),s=e.setConfig(n,t.config);this.sendIfReady(s,n,e.status==="subscribed")}aggregate(e,t){let n=b(),s=e.aggregateRequest(n,t.aggregations);this.sendIfReady(s,n,e.status==="subscribed")}sort(e,t){let n=b(),s=e.sortRequest(n,t.sort);this.sendIfReady(s,n,e.status==="subscribed")}groupBy(e,t){let n=b(),s=e.groupByRequest(n,t.groupBy);this.sendIfReady(s,n,e.status==="subscribed")}filter(e,t){let n=b(),{filter:s}=t,o=e.filterRequest(n,s);this.sendIfReady(o,n,e.status==="subscribed")}setColumns(e,t){let n=b(),{columns:s}=t,o=e.columnRequest(n,s);this.sendIfReady(o,n,e.status==="subscribed")}setTitle(e,t){e&&(e.title=t.title,this.updateTitleOnVisualLinks(e))}select(e,t){let n=b(),{selected:s}=t,o=e.selectRequest(n,s);this.sendIfReady(o,n,e.status==="subscribed")}disableViewport(e){let t=b(),n=e.disable(t);this.sendIfReady(n,t,e.status==="subscribed")}enableViewport(e){if(e.disabled){let t=b(),n=e.enable(t);this.sendIfReady(n,t,e.status==="subscribed")}}resumeViewport(e){let t=e.resume();this.postMessageToClient({clientViewportId:e.clientViewportId,rows:t,type:"viewport-update"})}openTreeNode(e,t){if(e.serverViewportId){let n=b();this.sendIfReady(e.openTreeNode(n,t),n,e.status==="subscribed")}}closeTreeNode(e,t){if(e.serverViewportId){let n=b();this.sendIfReady(e.closeTreeNode(n,t),n,e.status==="subscribed")}}createLink(e,t){let{parentClientVpId:n,parentColumnName:s,childColumnName:o}=t,i=b(),u=this.mapClientToServerViewport.get(n);if(u){let g=e.createLink(i,o,u,s);this.sendMessageToServer(g,i)}else L("ServerProxy unable to create link, viewport not found")}removeLink(e){let t=b(),n=e.removeLink(t);this.sendMessageToServer(n,t)}updateTitleOnVisualLinks(e){var s;let{serverViewportId:t,title:n}=e;for(let o of this.viewports.values())if(o!==e&&o.links&&t&&n&&(s=o.links)!=null&&s.some(i=>i.parentVpId===t)){let[i]=o.setLinks(xt(o.links,t,n));this.postMessageToClient(i)}}removeViewportFromVisualLinks(e){var t;for(let n of this.viewports.values())if((t=n.links)!=null&&t.some(({parentVpId:s})=>s===e)){let[s]=n.setLinks(n.links.filter(({parentVpId:o})=>o!==e));this.postMessageToClient(s)}}menuRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[n,s]=ee(e);this.sendMessageToServer({...s,vpId:t.serverViewportId},n)}}rpcCall(e){let[t,n]=ee(e),s=Xe(n.service);this.sendMessageToServer(n,t,{module:s})}handleMessageFromClient(e){if(M==null||M(\`handleMessageFromClient: \${e.type}\`),De(e))if(e.type==="disable"){let t=this.getViewportForClient(e.viewport,!1);return t!==null?this.disableViewport(t):void 0}else{let t=this.getViewportForClient(e.viewport);switch(e.type){case"setViewRange":return this.setViewRange(t,e);case"config":return this.setConfig(t,e);case"aggregate":return this.aggregate(t,e);case"sort":return this.sort(t,e);case"groupBy":return this.groupBy(t,e);case"filter":return this.filter(t,e);case"select":return this.select(t,e);case"suspend":return t.suspend();case"resume":return this.resumeViewport(t);case"enable":return this.enableViewport(t);case"openTreeNode":return this.openTreeNode(t,e);case"closeTreeNode":return this.closeTreeNode(t,e);case"createLink":return this.createLink(t,e);case"removeLink":return this.removeLink(t);case"setColumns":return this.setColumns(t,e);case"setTitle":return this.setTitle(t,e);default:}}else{if(we(e))return this.menuRpcCall(e);{let{type:t,requestId:n}=e;switch(t){case"GET_TABLE_LIST":return this.sendMessageToServer({type:t},n);case"GET_TABLE_META":return this.sendMessageToServer({type:t,table:e.table},n);case"RPC_CALL":return this.rpcCall(e);default:}}}L(\`Vuu ServerProxy Unexpected message from client \${JSON.stringify(e)}\`)}awaitResponseToMessage(e){return new Promise((t,n)=>{let s=b();this.sendMessageToServer(e,s),this.pendingRequests.set(s,{reject:n,resolve:t})})}sendIfReady(e,t,n=!0){return n?this.sendMessageToServer(e,t):this.queuedRequests.push(e),n}sendMessageToServer(e,t=\`\${tt++}\`,n=vt){let{module:s="CORE"}=n;this.authToken&&this.connection.send({requestId:t,sessionId:this.sessionId,token:this.authToken,user:this.user,module:s,body:e})}handleMessageFromServer(e){var u;let{body:t,requestId:n,sessionId:s}=e,o=this.pendingRequests.get(n);if(o){let{resolve:a}=o;this.pendingRequests.delete(n),a(t);return}let{viewports:i}=this;switch(t.type){case Ge:this.sendMessageToServer({type:Be,ts:+new Date},"NA");break;case He:if(s)this.sessionId=s,(u=this.pendingLogin)==null||u.resolve(s),this.pendingLogin=void 0;else throw Error("LOGIN_SUCCESS did not provide sessionId");break;case Ue:{let a=i.get(n);if(a){let{status:l}=a,{viewPortId:d}=t;n!==d&&(i.delete(n),i.set(d,a)),this.mapClientToServerViewport.set(n,d);let R=a.handleSubscribed(t);R&&(this.postMessageToClient(R),O&&M(\`post DataSourceSubscribedMessage to client: \${JSON.stringify(R)}\`)),a.disabled&&this.disableViewport(a),l==="subscribing"&&!B(a.table)&&(this.sendMessageToServer({type:ne,vpId:d}),this.sendMessageToServer({type:$e,vpId:d}),Array.from(i.entries()).filter(([E,{disabled:U}])=>E!==d&&!U).forEach(([E])=>{this.sendMessageToServer({type:ne,vpId:E})}))}}break;case"REMOVE_VP_SUCCESS":{let a=this.viewports.get(t.viewPortId);a&&(this.mapClientToServerViewport.delete(a.clientViewportId),i.delete(t.viewPortId),this.removeViewportFromVisualLinks(t.viewPortId))}break;case Ye:{let a=this.viewports.get(t.vpId);a&&a.completeOperation(n)}break;case Pe:case Fe:if(i.has(t.viewPortId)){let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(n);l!==void 0&&(this.postMessageToClient(l),O&&M(\`postMessageToClient \${JSON.stringify(l)}\`))}}break;case qe:{let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(n);if(l){this.postMessageToClient(l);let d=a.currentData();O&&M(\`Enable Response (ServerProxy to Client): \${JSON.stringify(l)}\`),a.size===0?O&&M("Viewport Enabled but size 0, resend to server"):(this.postMessageToClient({clientViewportId:a.clientViewportId,mode:"batch",rows:d,size:a.size,type:"viewport-update"}),O&&M(\`Enable Response (ServerProxy to Client): send size \${a.size} \${d.length} rows from cache\`))}}}break;case Ze:{let a=Ie(t.rows);for(let[l,d]of Object.entries(a)){let R=i.get(l);R?R.updateRows(d):k==null||k(\`TABLE_ROW message received for non registered viewport \${l}\`)}this.processUpdates()}break;case Oe:{let a=this.viewports.get(t.viewPortId);if(a){let{from:l,to:d}=t;a.completeOperation(n,l,d)}}break;case je:case ke:break;case"CREATE_VISUAL_LINK_SUCCESS":{let a=this.viewports.get(t.childVpId),l=this.viewports.get(t.parentVpId);if(a&&l){let{childColumnName:d,parentColumnName:R}=t,E=a.completeOperation(n,d,l.clientViewportId,R);E&&this.postMessageToClient(E)}}break;case"REMOVE_VISUAL_LINK_SUCCESS":{let a=this.viewports.get(t.childVpId);if(a){let l=a.completeOperation(n);l&&this.postMessageToClient(l)}}break;case oe:this.postMessageToClient({type:oe,tables:t.tables,requestId:n});break;case re:{let a=this.cacheTableMeta(t),l=this.pendingTableMetaRequests.get(n);if(l){this.pendingTableMetaRequests.delete(n);let d=this.viewports.get(l);d?d.setTableSchema(a):k==null||k("Message has come back AFTER CREATE_VP_SUCCESS, what do we do now")}else this.postMessageToClient({type:re,tableSchema:a,requestId:n})}break;case"VP_VISUAL_LINKS_RESP":{let a=this.getActiveLinks(t.links),l=this.viewports.get(t.vpId);if(a.length&&l){let d=Pt(a,this.viewports),[R,E]=l.setLinks(d);if(this.postMessageToClient(R),E){let{link:U,parentClientVpId:nt}=E,ce=b(),pe=this.mapClientToServerViewport.get(nt);if(pe){let st=l.createLink(ce,U.fromColumn,pe,U.toColumn);this.sendMessageToServer(st,ce)}}}}break;case"VIEW_PORT_MENUS_RESP":if(t.menu.name){let a=this.viewports.get(t.vpId);if(a){let l=a.setMenu(t.menu);this.postMessageToClient(l)}}break;case"VP_EDIT_RPC_RESPONSE":this.postMessageToClient({action:t.action,requestId:n,rpcName:t.rpcName,type:"VP_EDIT_RPC_RESPONSE"});break;case"VP_EDIT_RPC_REJECT":this.viewports.get(t.vpId)&&this.postMessageToClient({requestId:n,type:"VP_EDIT_RPC_REJECT",error:t.error});break;case"VIEW_PORT_MENU_RESP":if(xe(t)){let{action:a,rpcName:l}=t;this.awaitResponseToMessage({type:"GET_TABLE_META",table:a.table}).then(d=>{let R=te(d);this.postMessageToClient({rpcName:l,type:"VIEW_PORT_MENU_RESP",action:{...a,tableSchema:R},tableAlreadyOpen:this.isTableOpen(a.table),requestId:n})})}else{let{action:a}=t;this.postMessageToClient({type:"VIEW_PORT_MENU_RESP",action:a||Dt,tableAlreadyOpen:a!==null&&this.isTableOpen(a.table),requestId:n})}break;case se:{let{method:a,result:l}=t;this.postMessageToClient({type:se,method:a,result:l,requestId:n})}break;case"ERROR":L(t.msg);break;default:It&&_(\`handleMessageFromServer \${t.type}.\`)}}hasSchemaForTable(e){return this.cachedTableSchemas.has(\`\${e.module}:\${e.table}\`)}cacheTableMeta(e){let{module:t,table:n}=e.table,s=\`\${t}:\${n}\`,o=this.cachedTableSchemas.get(s);return o||(o=te(e),this.cachedTableSchemas.set(s,o)),o}isTableOpen(e){if(e){let t=e.table;for(let n of this.viewports.values())if(!n.suspended&&n.table.table===t)return!0}}getActiveLinks(e){return e.filter(t=>{let n=this.viewports.get(t.parentVpId);return n&&!n.suspended})}processUpdates(){this.viewports.forEach(e=>{var t;if(e.hasUpdatesToProcess){let[n,s]=e.getClientRows(),o=e.getNewRowCount();(o!==void 0||n&&n.length>0)&&(O&&M(\`postMessageToClient #\${e.clientViewportId} viewport-update \${s}, \${(t=n==null?void 0:n.length)!=null?t:"no"} rows, size \${o}\`),this.postMessageToClient({clientViewportId:e.clientViewportId,mode:s,rows:n,size:o,type:"viewport-update"}))}})}};var D,{info:ue,infoEnabled:le}=T("worker");async function Ot(r,e,t,n,s){let o=await Ee(r,e,i=>{_e(i)?postMessage({type:"connection-metrics",messages:i}):ve(i)?(s(i),i.status==="reconnected"&&D.reconnect()):D.handleMessageFromServer(i)});D=new j(o,i=>Lt(i)),o.requiresLogin&&await D.login(t,n)}function Lt(r){postMessage(r)}var kt=async({data:r})=>{switch(r.type){case"connect":await Ot(r.url,r.protocol,r.token,r.username,postMessage),postMessage({type:"connected"});break;case"subscribe":le&&ue(\`client subscribe: \${JSON.stringify(r)}\`),D.subscribe(r);break;case"unsubscribe":le&&ue(\`client unsubscribe: \${JSON.stringify(r)}\`),D.unsubscribe(r.viewport);break;default:le&&ue(\`client message: \${JSON.stringify(r)}\`),D.handleMessageFromClient(r)}};self.addEventListener("message",kt);postMessage({type:"ready"});
|
|
3206
|
+
\`);
|
|
3207
|
+
throw Error(\`KeySet, no key found for rowIndex \${rowIndex}\`);
|
|
3208
|
+
}
|
|
3209
|
+
return key;
|
|
3210
|
+
}
|
|
3211
|
+
toDebugString() {
|
|
3212
|
+
return Array.from(this.keys.entries()).map((k, v) => \`\${k}=>\${v}\`).join(",");
|
|
3213
|
+
}
|
|
3214
|
+
};
|
|
3215
|
+
|
|
3216
|
+
// ../vuu-utils/src/row-utils.ts
|
|
3217
|
+
var { IDX } = metadataKeys;
|
|
3218
|
+
|
|
3219
|
+
// ../vuu-utils/src/selection-utils.ts
|
|
3220
|
+
var { SELECTED } = metadataKeys;
|
|
3221
|
+
var RowSelected = {
|
|
3222
|
+
False: 0,
|
|
3223
|
+
True: 1,
|
|
3224
|
+
First: 2,
|
|
3225
|
+
Last: 4
|
|
3226
|
+
};
|
|
3227
|
+
var SINGLE_SELECTED_ROW = RowSelected.True + RowSelected.First + RowSelected.Last;
|
|
3228
|
+
var FIRST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.First;
|
|
3229
|
+
var LAST_SELECTED_ROW_OF_BLOCK = RowSelected.True + RowSelected.Last;
|
|
3230
|
+
var expandSelection = (selected) => {
|
|
3231
|
+
if (selected.every((selectedItem) => typeof selectedItem === "number")) {
|
|
3232
|
+
return selected;
|
|
3233
|
+
}
|
|
3234
|
+
const expandedSelected = [];
|
|
3235
|
+
for (const selectedItem of selected) {
|
|
3236
|
+
if (typeof selectedItem === "number") {
|
|
3237
|
+
expandedSelected.push(selectedItem);
|
|
3238
|
+
} else {
|
|
3239
|
+
for (let i = selectedItem[0]; i <= selectedItem[1]; i++) {
|
|
3240
|
+
expandedSelected.push(i);
|
|
3241
|
+
}
|
|
3242
|
+
}
|
|
3243
|
+
}
|
|
3244
|
+
return expandedSelected;
|
|
3245
|
+
};
|
|
3246
|
+
|
|
3247
|
+
// src/websocket-connection.ts
|
|
3248
|
+
var { debug: debug2, debugEnabled: debugEnabled2, error, info, infoEnabled, warn } = logger(
|
|
3249
|
+
"websocket-connection"
|
|
3250
|
+
);
|
|
3251
|
+
var WS = "ws";
|
|
3252
|
+
var isWebsocketUrl = (url) => url.startsWith(WS + "://") || url.startsWith(WS + "s://");
|
|
3253
|
+
var connectionAttempts = {};
|
|
3254
|
+
var setWebsocket = Symbol("setWebsocket");
|
|
3255
|
+
var connectionCallback = Symbol("connectionCallback");
|
|
3256
|
+
async function connect(connectionString, protocol, callback) {
|
|
3257
|
+
return makeConnection(connectionString, protocol, callback);
|
|
3258
|
+
}
|
|
3259
|
+
async function reconnect(connection) {
|
|
3260
|
+
makeConnection(
|
|
3261
|
+
connection.url,
|
|
3262
|
+
connection.protocol,
|
|
3263
|
+
connection[connectionCallback],
|
|
3264
|
+
connection
|
|
3265
|
+
);
|
|
3266
|
+
}
|
|
3267
|
+
async function makeConnection(url, protocol, callback, connection) {
|
|
3268
|
+
const connectionStatus = connectionAttempts[url] || (connectionAttempts[url] = {
|
|
3269
|
+
attemptsRemaining: 5,
|
|
3270
|
+
status: "disconnected"
|
|
3271
|
+
});
|
|
3272
|
+
try {
|
|
3273
|
+
callback({ type: "connection-status", status: "connecting" });
|
|
3274
|
+
const reconnecting = typeof connection !== "undefined";
|
|
3275
|
+
const ws = await createWebsocket(url, protocol);
|
|
3276
|
+
console.info(
|
|
3277
|
+
"%c\u26A1 %cconnected",
|
|
3278
|
+
"font-size: 24px;color: green;font-weight: bold;",
|
|
3279
|
+
"color:green; font-size: 14px;"
|
|
3280
|
+
);
|
|
3281
|
+
if (connection !== void 0) {
|
|
3282
|
+
connection[setWebsocket](ws);
|
|
3283
|
+
}
|
|
3284
|
+
const websocketConnection = connection != null ? connection : new WebsocketConnection(ws, url, protocol, callback);
|
|
3285
|
+
const status = reconnecting ? "reconnected" : "connection-open-awaiting-session";
|
|
3286
|
+
callback({ type: "connection-status", status });
|
|
3287
|
+
websocketConnection.status = status;
|
|
3288
|
+
return websocketConnection;
|
|
3289
|
+
} catch (evt) {
|
|
3290
|
+
console.log({ evt });
|
|
3291
|
+
const retry = --connectionStatus.attemptsRemaining > 0;
|
|
3292
|
+
callback({
|
|
3293
|
+
type: "connection-status",
|
|
3294
|
+
status: "disconnected",
|
|
3295
|
+
reason: "failed to connect",
|
|
3296
|
+
retry
|
|
3297
|
+
});
|
|
3298
|
+
if (retry) {
|
|
3299
|
+
return makeConnectionIn(url, protocol, callback, connection, 1e4);
|
|
3300
|
+
} else {
|
|
3301
|
+
throw Error("Failed to establish connection");
|
|
3302
|
+
}
|
|
3303
|
+
}
|
|
3304
|
+
}
|
|
3305
|
+
var makeConnectionIn = (url, protocol, callback, connection, delay) => new Promise((resolve) => {
|
|
3306
|
+
setTimeout(() => {
|
|
3307
|
+
resolve(makeConnection(url, protocol, callback, connection));
|
|
3308
|
+
}, delay);
|
|
3309
|
+
});
|
|
3310
|
+
var createWebsocket = (connectionString, protocol) => new Promise((resolve, reject) => {
|
|
3311
|
+
const websocketUrl = isWebsocketUrl(connectionString) ? connectionString : \`wss://\${connectionString}\`;
|
|
3312
|
+
if (infoEnabled && protocol !== void 0) {
|
|
3313
|
+
info(\`WebSocket Protocol \${protocol == null ? void 0 : protocol.toString()}\`);
|
|
3314
|
+
}
|
|
3315
|
+
const ws = new WebSocket(websocketUrl, protocol);
|
|
3316
|
+
ws.onopen = () => resolve(ws);
|
|
3317
|
+
ws.onerror = (evt) => reject(evt);
|
|
3318
|
+
});
|
|
3319
|
+
var closeWarn = () => {
|
|
3320
|
+
warn == null ? void 0 : warn(\`Connection cannot be closed, socket not yet opened\`);
|
|
3321
|
+
};
|
|
3322
|
+
var sendWarn = (msg) => {
|
|
3323
|
+
warn == null ? void 0 : warn(\`Message cannot be sent, socket closed \${msg.body.type}\`);
|
|
3324
|
+
};
|
|
3325
|
+
var parseMessage = (message) => {
|
|
3326
|
+
try {
|
|
3327
|
+
return JSON.parse(message);
|
|
3328
|
+
} catch (e) {
|
|
3329
|
+
throw Error(\`Error parsing JSON response from server \${message}\`);
|
|
3330
|
+
}
|
|
3331
|
+
};
|
|
3332
|
+
var WebsocketConnection = class {
|
|
3333
|
+
constructor(ws, url, protocol, callback) {
|
|
3334
|
+
this.close = closeWarn;
|
|
3335
|
+
this.requiresLogin = true;
|
|
3336
|
+
this.send = sendWarn;
|
|
3337
|
+
this.status = "ready";
|
|
3338
|
+
this.messagesCount = 0;
|
|
3339
|
+
this.connectionMetricsInterval = null;
|
|
3340
|
+
this.handleWebsocketMessage = (evt) => {
|
|
3341
|
+
const vuuMessageFromServer = parseMessage(evt.data);
|
|
3342
|
+
this.messagesCount += 1;
|
|
3343
|
+
if (true) {
|
|
3344
|
+
if (debugEnabled2 && vuuMessageFromServer.body.type !== "HB") {
|
|
3345
|
+
debug2 == null ? void 0 : debug2(\`<<< \${vuuMessageFromServer.body.type}\`);
|
|
3346
|
+
}
|
|
3347
|
+
}
|
|
3348
|
+
this[connectionCallback](vuuMessageFromServer);
|
|
3349
|
+
};
|
|
3350
|
+
this.url = url;
|
|
3351
|
+
this.protocol = protocol;
|
|
3352
|
+
this[connectionCallback] = callback;
|
|
3353
|
+
this[setWebsocket](ws);
|
|
3354
|
+
}
|
|
3355
|
+
reconnect() {
|
|
3356
|
+
reconnect(this);
|
|
3357
|
+
}
|
|
3358
|
+
[(connectionCallback, setWebsocket)](ws) {
|
|
3359
|
+
const callback = this[connectionCallback];
|
|
3360
|
+
ws.onmessage = (evt) => {
|
|
3361
|
+
this.status = "connected";
|
|
3362
|
+
ws.onmessage = this.handleWebsocketMessage;
|
|
3363
|
+
this.handleWebsocketMessage(evt);
|
|
3364
|
+
};
|
|
3365
|
+
this.connectionMetricsInterval = setInterval(() => {
|
|
3366
|
+
callback({
|
|
3367
|
+
type: "connection-metrics",
|
|
3368
|
+
messagesLength: this.messagesCount
|
|
3369
|
+
});
|
|
3370
|
+
this.messagesCount = 0;
|
|
3371
|
+
}, 1e3);
|
|
3372
|
+
ws.onerror = () => {
|
|
3373
|
+
error(\`\u26A1 connection error\`);
|
|
3374
|
+
callback({
|
|
3375
|
+
type: "connection-status",
|
|
3376
|
+
status: "disconnected",
|
|
3377
|
+
reason: "error"
|
|
3378
|
+
});
|
|
3379
|
+
if (this.connectionMetricsInterval) {
|
|
3380
|
+
clearInterval(this.connectionMetricsInterval);
|
|
3381
|
+
this.connectionMetricsInterval = null;
|
|
3382
|
+
}
|
|
3383
|
+
if (this.status === "connection-open-awaiting-session") {
|
|
3384
|
+
error(
|
|
3385
|
+
\`Websocket connection lost before Vuu session established, check websocket configuration\`
|
|
3386
|
+
);
|
|
3387
|
+
} else if (this.status !== "closed") {
|
|
3388
|
+
reconnect(this);
|
|
3389
|
+
this.send = queue;
|
|
3390
|
+
}
|
|
3391
|
+
};
|
|
3392
|
+
ws.onclose = () => {
|
|
3393
|
+
info == null ? void 0 : info(\`\u26A1 connection close\`);
|
|
3394
|
+
callback({
|
|
3395
|
+
type: "connection-status",
|
|
3396
|
+
status: "disconnected",
|
|
3397
|
+
reason: "close"
|
|
3398
|
+
});
|
|
3399
|
+
if (this.connectionMetricsInterval) {
|
|
3400
|
+
clearInterval(this.connectionMetricsInterval);
|
|
3401
|
+
this.connectionMetricsInterval = null;
|
|
3402
|
+
}
|
|
3403
|
+
if (this.status !== "closed") {
|
|
3404
|
+
reconnect(this);
|
|
3405
|
+
this.send = queue;
|
|
3406
|
+
}
|
|
3407
|
+
};
|
|
3408
|
+
const send = (msg) => {
|
|
3409
|
+
if (true) {
|
|
3410
|
+
if (debugEnabled2 && msg.body.type !== "HB_RESP") {
|
|
3411
|
+
debug2 == null ? void 0 : debug2(\`>>> \${msg.body.type}\`);
|
|
3412
|
+
}
|
|
3413
|
+
}
|
|
3414
|
+
ws.send(JSON.stringify(msg));
|
|
3415
|
+
};
|
|
3416
|
+
const queue = (msg) => {
|
|
3417
|
+
info == null ? void 0 : info(\`TODO queue message until websocket reconnected \${msg.body.type}\`);
|
|
3418
|
+
};
|
|
3419
|
+
this.send = send;
|
|
3420
|
+
this.close = () => {
|
|
3421
|
+
this.status = "closed";
|
|
3422
|
+
ws.close();
|
|
3423
|
+
this.close = closeWarn;
|
|
3424
|
+
this.send = sendWarn;
|
|
3425
|
+
info == null ? void 0 : info("close websocket");
|
|
3426
|
+
};
|
|
3427
|
+
}
|
|
3428
|
+
};
|
|
3429
|
+
|
|
3430
|
+
// src/message-utils.ts
|
|
3431
|
+
var MENU_RPC_TYPES = [
|
|
3432
|
+
"VIEW_PORT_MENUS_SELECT_RPC",
|
|
3433
|
+
"VIEW_PORT_MENU_TABLE_RPC",
|
|
3434
|
+
"VIEW_PORT_MENU_ROW_RPC",
|
|
3435
|
+
"VIEW_PORT_MENU_CELL_RPC",
|
|
3436
|
+
"VP_EDIT_CELL_RPC",
|
|
3437
|
+
"VP_EDIT_ROW_RPC",
|
|
3438
|
+
"VP_EDIT_ADD_ROW_RPC",
|
|
3439
|
+
"VP_EDIT_DELETE_CELL_RPC",
|
|
3440
|
+
"VP_EDIT_DELETE_ROW_RPC",
|
|
3441
|
+
"VP_EDIT_SUBMIT_FORM_RPC"
|
|
3442
|
+
];
|
|
3443
|
+
var isVuuMenuRpcRequest = (message) => MENU_RPC_TYPES.includes(message["type"]);
|
|
3444
|
+
var stripRequestId = ({
|
|
3445
|
+
requestId,
|
|
3446
|
+
...rest
|
|
3447
|
+
}) => [requestId, rest];
|
|
3448
|
+
var getFirstAndLastRows = (rows) => {
|
|
3449
|
+
let firstRow = rows.at(0);
|
|
3450
|
+
if (firstRow.updateType === "SIZE") {
|
|
3451
|
+
if (rows.length === 1) {
|
|
3452
|
+
return rows;
|
|
3453
|
+
} else {
|
|
3454
|
+
firstRow = rows.at(1);
|
|
3455
|
+
}
|
|
3456
|
+
}
|
|
3457
|
+
const lastRow = rows.at(-1);
|
|
3458
|
+
return [firstRow, lastRow];
|
|
3459
|
+
};
|
|
3460
|
+
var groupRowsByViewport = (rows) => {
|
|
3461
|
+
const result = {};
|
|
3462
|
+
for (const row of rows) {
|
|
3463
|
+
const rowsForViewport = result[row.viewPortId] || (result[row.viewPortId] = []);
|
|
3464
|
+
rowsForViewport.push(row);
|
|
3465
|
+
}
|
|
3466
|
+
return result;
|
|
3467
|
+
};
|
|
3468
|
+
var createSchemaFromTableMetadata = ({
|
|
3469
|
+
columns,
|
|
3470
|
+
dataTypes,
|
|
3471
|
+
key,
|
|
3472
|
+
table
|
|
3473
|
+
}) => {
|
|
3474
|
+
return {
|
|
3475
|
+
table,
|
|
3476
|
+
columns: columns.map((col, idx) => ({
|
|
3477
|
+
name: col,
|
|
3478
|
+
serverDataType: dataTypes[idx]
|
|
3479
|
+
})),
|
|
3480
|
+
key
|
|
3481
|
+
};
|
|
3482
|
+
};
|
|
3483
|
+
|
|
3484
|
+
// src/vuuUIMessageTypes.ts
|
|
3485
|
+
var isConnectionStatusMessage = (msg) => msg.type === "connection-status";
|
|
3486
|
+
var isConnectionQualityMetrics = (msg) => msg.type === "connection-metrics";
|
|
3487
|
+
var isViewporttMessage = (msg) => "viewport" in msg;
|
|
3488
|
+
var isSessionTableActionMessage = (messageBody) => messageBody.type === "VIEW_PORT_MENU_RESP" && messageBody.action !== null && isSessionTable(messageBody.action.table);
|
|
3489
|
+
var isSessionTable = (table) => {
|
|
3490
|
+
if (table !== null && typeof table === "object" && "table" in table && "module" in table) {
|
|
3491
|
+
return table.table.startsWith("session");
|
|
3492
|
+
}
|
|
3493
|
+
return false;
|
|
3494
|
+
};
|
|
3495
|
+
|
|
3496
|
+
// src/server-proxy/messages.ts
|
|
3497
|
+
var CHANGE_VP_SUCCESS = "CHANGE_VP_SUCCESS";
|
|
3498
|
+
var CHANGE_VP_RANGE_SUCCESS = "CHANGE_VP_RANGE_SUCCESS";
|
|
3499
|
+
var CLOSE_TREE_NODE = "CLOSE_TREE_NODE";
|
|
3500
|
+
var CLOSE_TREE_SUCCESS = "CLOSE_TREE_SUCCESS";
|
|
3501
|
+
var CREATE_VP = "CREATE_VP";
|
|
3502
|
+
var CREATE_VP_SUCCESS = "CREATE_VP_SUCCESS";
|
|
3503
|
+
var DISABLE_VP = "DISABLE_VP";
|
|
3504
|
+
var DISABLE_VP_SUCCESS = "DISABLE_VP_SUCCESS";
|
|
3505
|
+
var ENABLE_VP = "ENABLE_VP";
|
|
3506
|
+
var ENABLE_VP_SUCCESS = "ENABLE_VP_SUCCESS";
|
|
3507
|
+
var GET_VP_VISUAL_LINKS = "GET_VP_VISUAL_LINKS";
|
|
3508
|
+
var GET_VIEW_PORT_MENUS = "GET_VIEW_PORT_MENUS";
|
|
3509
|
+
var HB = "HB";
|
|
3510
|
+
var HB_RESP = "HB_RESP";
|
|
3511
|
+
var LOGIN = "LOGIN";
|
|
3512
|
+
var LOGIN_SUCCESS = "LOGIN_SUCCESS";
|
|
3513
|
+
var OPEN_TREE_NODE = "OPEN_TREE_NODE";
|
|
3514
|
+
var OPEN_TREE_SUCCESS = "OPEN_TREE_SUCCESS";
|
|
3515
|
+
var REMOVE_VP = "REMOVE_VP";
|
|
3516
|
+
var RPC_RESP = "RPC_RESP";
|
|
3517
|
+
var SET_SELECTION_SUCCESS = "SET_SELECTION_SUCCESS";
|
|
3518
|
+
var TABLE_META_RESP = "TABLE_META_RESP";
|
|
3519
|
+
var TABLE_LIST_RESP = "TABLE_LIST_RESP";
|
|
3520
|
+
var TABLE_ROW = "TABLE_ROW";
|
|
3521
|
+
|
|
3522
|
+
// src/server-proxy/rpc-services.ts
|
|
3523
|
+
var getRpcServiceModule = (service) => {
|
|
3524
|
+
switch (service) {
|
|
3525
|
+
case "TypeAheadRpcHandler":
|
|
3526
|
+
return "TYPEAHEAD";
|
|
3527
|
+
default:
|
|
3528
|
+
return "SIMUL";
|
|
3529
|
+
}
|
|
3530
|
+
};
|
|
3531
|
+
|
|
3532
|
+
// src/server-proxy/array-backed-moving-window.ts
|
|
3533
|
+
var EMPTY_ARRAY = [];
|
|
3534
|
+
var log = logger("array-backed-moving-window");
|
|
3535
|
+
var _range;
|
|
3536
|
+
var ArrayBackedMovingWindow = class {
|
|
3537
|
+
// Note, the buffer is already accounted for in the range passed in here
|
|
3538
|
+
constructor({ from: clientFrom, to: clientTo }, { from, to }, bufferSize) {
|
|
3539
|
+
__privateAdd(this, _range, void 0);
|
|
3540
|
+
this.setRowCount = (rowCount) => {
|
|
3541
|
+
var _a;
|
|
3542
|
+
(_a = log.info) == null ? void 0 : _a.call(log, \`setRowCount \${rowCount}\`);
|
|
3543
|
+
if (rowCount < this.internalData.length) {
|
|
3544
|
+
this.internalData.length = rowCount;
|
|
3545
|
+
}
|
|
3546
|
+
if (rowCount < this.rowCount) {
|
|
3547
|
+
this.rowsWithinRange = 0;
|
|
3548
|
+
const end = Math.min(rowCount, this.clientRange.to);
|
|
3549
|
+
for (let i = this.clientRange.from; i < end; i++) {
|
|
3550
|
+
const rowIndex = i - __privateGet(this, _range).from;
|
|
3551
|
+
if (this.internalData[rowIndex] !== void 0) {
|
|
3552
|
+
this.rowsWithinRange += 1;
|
|
3553
|
+
}
|
|
3554
|
+
}
|
|
3555
|
+
}
|
|
3556
|
+
this.rowCount = rowCount;
|
|
3557
|
+
};
|
|
3558
|
+
this.bufferBreakout = (from, to) => {
|
|
3559
|
+
const bufferPerimeter = this.bufferSize * 0.25;
|
|
3560
|
+
if (__privateGet(this, _range).to - to < bufferPerimeter) {
|
|
3561
|
+
return true;
|
|
3562
|
+
} else if (__privateGet(this, _range).from > 0 && from - __privateGet(this, _range).from < bufferPerimeter) {
|
|
3563
|
+
return true;
|
|
3564
|
+
} else {
|
|
3565
|
+
return false;
|
|
3566
|
+
}
|
|
3567
|
+
};
|
|
3568
|
+
this.bufferSize = bufferSize;
|
|
3569
|
+
this.clientRange = new WindowRange(clientFrom, clientTo);
|
|
3570
|
+
__privateSet(this, _range, new WindowRange(from, to));
|
|
3571
|
+
this.internalData = new Array(bufferSize);
|
|
3572
|
+
this.rowsWithinRange = 0;
|
|
3573
|
+
this.rowCount = 0;
|
|
3574
|
+
}
|
|
3575
|
+
get range() {
|
|
3576
|
+
return __privateGet(this, _range);
|
|
3577
|
+
}
|
|
3578
|
+
// TODO we shpuld probably have a hasAllClientRowsWithinRange
|
|
3579
|
+
get hasAllRowsWithinRange() {
|
|
3580
|
+
return this.rowsWithinRange === this.clientRange.to - this.clientRange.from || // this.rowsWithinRange === this.range.to - this.range.from ||
|
|
3581
|
+
this.rowCount > 0 && this.clientRange.from + this.rowsWithinRange === this.rowCount;
|
|
3582
|
+
}
|
|
3583
|
+
// Check to see if set of rows is outside the current viewport range, indicating
|
|
3584
|
+
// that veiwport is being scrolled quickly and server is not able to keep up.
|
|
3585
|
+
outOfRange(firstIndex, lastIndex) {
|
|
3586
|
+
const { from, to } = this.range;
|
|
3587
|
+
if (lastIndex < from) {
|
|
3588
|
+
return true;
|
|
3589
|
+
}
|
|
3590
|
+
if (firstIndex >= to) {
|
|
3591
|
+
return true;
|
|
3592
|
+
}
|
|
3593
|
+
}
|
|
3594
|
+
setAtIndex(row) {
|
|
3595
|
+
const { rowIndex: index } = row;
|
|
3596
|
+
const isWithinClientRange = this.isWithinClientRange(index);
|
|
3597
|
+
if (isWithinClientRange || this.isWithinRange(index)) {
|
|
3598
|
+
const internalIndex = index - __privateGet(this, _range).from;
|
|
3599
|
+
if (!this.internalData[internalIndex] && isWithinClientRange) {
|
|
3600
|
+
this.rowsWithinRange += 1;
|
|
3601
|
+
}
|
|
3602
|
+
this.internalData[internalIndex] = row;
|
|
3603
|
+
}
|
|
3604
|
+
return isWithinClientRange;
|
|
3605
|
+
}
|
|
3606
|
+
getAtIndex(index) {
|
|
3607
|
+
return __privateGet(this, _range).isWithin(index) && this.internalData[index - __privateGet(this, _range).from] != null ? this.internalData[index - __privateGet(this, _range).from] : void 0;
|
|
3608
|
+
}
|
|
3609
|
+
isWithinRange(index) {
|
|
3610
|
+
return __privateGet(this, _range).isWithin(index);
|
|
3611
|
+
}
|
|
3612
|
+
isWithinClientRange(index) {
|
|
3613
|
+
return this.clientRange.isWithin(index);
|
|
3614
|
+
}
|
|
3615
|
+
// Returns [false] or [serverDataRequired, clientRows, holdingRows]
|
|
3616
|
+
setClientRange(from, to) {
|
|
3617
|
+
var _a;
|
|
3618
|
+
(_a = log.debug) == null ? void 0 : _a.call(log, \`setClientRange \${from} - \${to}\`);
|
|
3619
|
+
const currentFrom = this.clientRange.from;
|
|
3620
|
+
const currentTo = Math.min(this.clientRange.to, this.rowCount);
|
|
3621
|
+
if (from === currentFrom && to === currentTo) {
|
|
3622
|
+
return [
|
|
3623
|
+
false,
|
|
3624
|
+
EMPTY_ARRAY
|
|
3625
|
+
/*, EMPTY_ARRAY*/
|
|
3626
|
+
];
|
|
3627
|
+
}
|
|
3628
|
+
const originalRange = this.clientRange.copy();
|
|
3629
|
+
this.clientRange.from = from;
|
|
3630
|
+
this.clientRange.to = to;
|
|
3631
|
+
this.rowsWithinRange = 0;
|
|
3632
|
+
for (let i = from; i < to; i++) {
|
|
3633
|
+
const internalIndex = i - __privateGet(this, _range).from;
|
|
3634
|
+
if (this.internalData[internalIndex]) {
|
|
3635
|
+
this.rowsWithinRange += 1;
|
|
3636
|
+
}
|
|
3637
|
+
}
|
|
3638
|
+
let clientRows = EMPTY_ARRAY;
|
|
3639
|
+
const offset = __privateGet(this, _range).from;
|
|
3640
|
+
if (this.hasAllRowsWithinRange) {
|
|
3641
|
+
if (to > originalRange.to) {
|
|
3642
|
+
const start = Math.max(from, originalRange.to);
|
|
3643
|
+
clientRows = this.internalData.slice(start - offset, to - offset);
|
|
3644
|
+
} else {
|
|
3645
|
+
const end = Math.min(originalRange.from, to);
|
|
3646
|
+
clientRows = this.internalData.slice(from - offset, end - offset);
|
|
3647
|
+
}
|
|
3648
|
+
}
|
|
3649
|
+
const serverDataRequired = this.bufferBreakout(from, to);
|
|
3650
|
+
return [serverDataRequired, clientRows];
|
|
3651
|
+
}
|
|
3652
|
+
setRange(from, to) {
|
|
3653
|
+
var _a;
|
|
3654
|
+
(_a = log.debug) == null ? void 0 : _a.call(log, \`setRange \${from} - \${to}\`);
|
|
3655
|
+
const [overlapFrom, overlapTo] = __privateGet(this, _range).overlap(from, to);
|
|
3656
|
+
const newData = new Array(to - from + this.bufferSize);
|
|
3657
|
+
this.rowsWithinRange = 0;
|
|
3658
|
+
for (let i = overlapFrom; i < overlapTo; i++) {
|
|
3659
|
+
const data = this.getAtIndex(i);
|
|
3660
|
+
if (data) {
|
|
3661
|
+
const index = i - from;
|
|
3662
|
+
newData[index] = data;
|
|
3663
|
+
if (this.isWithinClientRange(i)) {
|
|
3664
|
+
this.rowsWithinRange += 1;
|
|
3665
|
+
}
|
|
3666
|
+
}
|
|
3667
|
+
}
|
|
3668
|
+
this.internalData = newData;
|
|
3669
|
+
__privateGet(this, _range).from = from;
|
|
3670
|
+
__privateGet(this, _range).to = to;
|
|
3671
|
+
}
|
|
3672
|
+
getData() {
|
|
3673
|
+
var _a;
|
|
3674
|
+
const { from, to } = __privateGet(this, _range);
|
|
3675
|
+
const { from: clientFrom, to: clientTo } = this.clientRange;
|
|
3676
|
+
const startOffset = Math.max(0, clientFrom - from);
|
|
3677
|
+
const endOffset = Math.min(
|
|
3678
|
+
to - from,
|
|
3679
|
+
to,
|
|
3680
|
+
clientTo - from,
|
|
3681
|
+
(_a = this.rowCount) != null ? _a : to
|
|
3682
|
+
);
|
|
3683
|
+
return this.internalData.slice(startOffset, endOffset);
|
|
3684
|
+
}
|
|
3685
|
+
clear() {
|
|
3686
|
+
var _a;
|
|
3687
|
+
(_a = log.debug) == null ? void 0 : _a.call(log, "clear");
|
|
3688
|
+
this.internalData.length = 0;
|
|
3689
|
+
this.rowsWithinRange = 0;
|
|
3690
|
+
this.setRowCount(0);
|
|
3691
|
+
}
|
|
3692
|
+
// used only for debugging
|
|
3693
|
+
getCurrentDataRange() {
|
|
3694
|
+
const rows = this.internalData;
|
|
3695
|
+
const len = rows.length;
|
|
3696
|
+
let [firstRow] = this.internalData;
|
|
3697
|
+
let lastRow = this.internalData[len - 1];
|
|
3698
|
+
if (firstRow && lastRow) {
|
|
3699
|
+
return [firstRow.rowIndex, lastRow.rowIndex];
|
|
3700
|
+
} else {
|
|
3701
|
+
for (let i = 0; i < len; i++) {
|
|
3702
|
+
if (rows[i] !== void 0) {
|
|
3703
|
+
firstRow = rows[i];
|
|
3704
|
+
break;
|
|
3705
|
+
}
|
|
3706
|
+
}
|
|
3707
|
+
for (let i = len - 1; i >= 0; i--) {
|
|
3708
|
+
if (rows[i] !== void 0) {
|
|
3709
|
+
lastRow = rows[i];
|
|
3710
|
+
break;
|
|
3711
|
+
}
|
|
3712
|
+
}
|
|
3713
|
+
if (firstRow && lastRow) {
|
|
3714
|
+
return [firstRow.rowIndex, lastRow.rowIndex];
|
|
3715
|
+
} else {
|
|
3716
|
+
return [-1, -1];
|
|
3717
|
+
}
|
|
3718
|
+
}
|
|
3719
|
+
}
|
|
3720
|
+
};
|
|
3721
|
+
_range = new WeakMap();
|
|
3722
|
+
|
|
3723
|
+
// src/server-proxy/viewport.ts
|
|
3724
|
+
var EMPTY_GROUPBY = [];
|
|
3725
|
+
var { debug: debug3, debugEnabled: debugEnabled3, error: error2, info: info2, infoEnabled: infoEnabled2, warn: warn2 } = logger("viewport");
|
|
3726
|
+
var isLeafUpdate = ({ rowKey, updateType }) => updateType === "U" && !rowKey.startsWith("$root");
|
|
3727
|
+
var Viewport = class {
|
|
3728
|
+
constructor({
|
|
3729
|
+
aggregations,
|
|
3730
|
+
bufferSize = 50,
|
|
3731
|
+
columns,
|
|
3732
|
+
filter,
|
|
3733
|
+
groupBy = [],
|
|
3734
|
+
table,
|
|
3735
|
+
range,
|
|
3736
|
+
sort,
|
|
3737
|
+
title,
|
|
3738
|
+
viewport,
|
|
3739
|
+
visualLink
|
|
3740
|
+
}) {
|
|
3741
|
+
// TODO create this in constructor so we don't have to mark is as optional
|
|
3742
|
+
this.dataWindow = void 0;
|
|
3743
|
+
this.hasUpdates = false;
|
|
3744
|
+
this.pendingUpdates = [];
|
|
3745
|
+
this.pendingOperations = /* @__PURE__ */ new Map();
|
|
3746
|
+
this.pendingRangeRequests = [];
|
|
3747
|
+
this.rowCountChanged = false;
|
|
3748
|
+
this.tableSchema = null;
|
|
3749
|
+
this.batchMode = true;
|
|
3750
|
+
this.useBatchMode = true;
|
|
3751
|
+
this.rangeMonitor = new RangeMonitor("ViewPort");
|
|
3752
|
+
this.disabled = false;
|
|
3753
|
+
this.isTree = false;
|
|
3754
|
+
// TODO roll disabled/suspended into status
|
|
3755
|
+
this.status = "";
|
|
3756
|
+
this.suspended = false;
|
|
3757
|
+
this.rangeRequestAlreadyPending = (range) => {
|
|
3758
|
+
const { bufferSize } = this;
|
|
3759
|
+
const bufferThreshold = bufferSize * 0.25;
|
|
3760
|
+
let { from: stillPendingFrom } = range;
|
|
3761
|
+
for (const { from, to } of this.pendingRangeRequests) {
|
|
3762
|
+
if (stillPendingFrom >= from && stillPendingFrom < to) {
|
|
3763
|
+
if (range.to + bufferThreshold <= to) {
|
|
3764
|
+
return true;
|
|
3765
|
+
} else {
|
|
3766
|
+
stillPendingFrom = to;
|
|
3767
|
+
}
|
|
3768
|
+
}
|
|
3769
|
+
}
|
|
3770
|
+
return false;
|
|
3771
|
+
};
|
|
3772
|
+
this.getNewRowCount = () => {
|
|
3773
|
+
if (this.rowCountChanged && this.dataWindow) {
|
|
3774
|
+
this.rowCountChanged = false;
|
|
3775
|
+
return this.dataWindow.rowCount;
|
|
3776
|
+
}
|
|
3777
|
+
};
|
|
3778
|
+
this.aggregations = aggregations;
|
|
3779
|
+
this.bufferSize = bufferSize;
|
|
3780
|
+
this.clientRange = range;
|
|
3781
|
+
this.clientViewportId = viewport;
|
|
3782
|
+
this.columns = columns;
|
|
3783
|
+
this.filter = filter;
|
|
3784
|
+
this.groupBy = groupBy;
|
|
3785
|
+
this.keys = new KeySet(range);
|
|
3786
|
+
this.pendingLinkedParent = visualLink;
|
|
3787
|
+
this.table = table;
|
|
3788
|
+
this.sort = sort;
|
|
3789
|
+
this.title = title;
|
|
3790
|
+
infoEnabled2 && (info2 == null ? void 0 : info2(
|
|
3791
|
+
\`constructor #\${viewport} \${table.table} bufferSize=\${bufferSize}\`
|
|
3792
|
+
));
|
|
3793
|
+
}
|
|
3794
|
+
get hasUpdatesToProcess() {
|
|
3795
|
+
if (this.suspended) {
|
|
3796
|
+
return false;
|
|
3797
|
+
}
|
|
3798
|
+
return this.rowCountChanged || this.hasUpdates;
|
|
3799
|
+
}
|
|
3800
|
+
get size() {
|
|
3801
|
+
var _a, _b;
|
|
3802
|
+
return (_b = (_a = this.dataWindow) == null ? void 0 : _a.rowCount) != null ? _b : 0;
|
|
3803
|
+
}
|
|
3804
|
+
subscribe() {
|
|
3805
|
+
const { filter } = this.filter;
|
|
3806
|
+
this.status = this.status === "subscribed" ? "resubscribing" : "subscribing";
|
|
3807
|
+
return {
|
|
3808
|
+
type: CREATE_VP,
|
|
3809
|
+
table: this.table,
|
|
3810
|
+
range: getFullRange(this.clientRange, this.bufferSize),
|
|
3811
|
+
aggregations: this.aggregations,
|
|
3812
|
+
columns: this.columns,
|
|
3813
|
+
sort: this.sort,
|
|
3814
|
+
groupBy: this.groupBy,
|
|
3815
|
+
filterSpec: { filter }
|
|
3816
|
+
};
|
|
3817
|
+
}
|
|
3818
|
+
handleSubscribed({
|
|
3819
|
+
viewPortId,
|
|
3820
|
+
aggregations,
|
|
3821
|
+
columns,
|
|
3822
|
+
filterSpec: filter,
|
|
3823
|
+
range,
|
|
3824
|
+
sort,
|
|
3825
|
+
groupBy
|
|
3826
|
+
}) {
|
|
3827
|
+
this.serverViewportId = viewPortId;
|
|
3828
|
+
this.status = "subscribed";
|
|
3829
|
+
this.aggregations = aggregations;
|
|
3830
|
+
this.columns = columns;
|
|
3831
|
+
this.groupBy = groupBy;
|
|
3832
|
+
this.isTree = groupBy && groupBy.length > 0;
|
|
3833
|
+
this.dataWindow = new ArrayBackedMovingWindow(
|
|
3834
|
+
this.clientRange,
|
|
3835
|
+
range,
|
|
3836
|
+
this.bufferSize
|
|
3837
|
+
);
|
|
3838
|
+
return {
|
|
3839
|
+
aggregations,
|
|
3840
|
+
type: "subscribed",
|
|
3841
|
+
clientViewportId: this.clientViewportId,
|
|
3842
|
+
columns,
|
|
3843
|
+
filter,
|
|
3844
|
+
groupBy,
|
|
3845
|
+
range,
|
|
3846
|
+
sort,
|
|
3847
|
+
tableSchema: this.tableSchema
|
|
3848
|
+
};
|
|
3849
|
+
}
|
|
3850
|
+
awaitOperation(requestId, msg) {
|
|
3851
|
+
this.pendingOperations.set(requestId, msg);
|
|
3852
|
+
}
|
|
3853
|
+
// Return a message if we need to communicate this to client UI
|
|
3854
|
+
completeOperation(requestId, ...params) {
|
|
3855
|
+
var _a;
|
|
3856
|
+
const { clientViewportId, pendingOperations } = this;
|
|
3857
|
+
const pendingOperation = pendingOperations.get(requestId);
|
|
3858
|
+
if (!pendingOperation) {
|
|
3859
|
+
error2("no matching operation found to complete");
|
|
3860
|
+
return;
|
|
3861
|
+
}
|
|
3862
|
+
const { type } = pendingOperation;
|
|
3863
|
+
info2 == null ? void 0 : info2(\`completeOperation \${type}\`);
|
|
3864
|
+
pendingOperations.delete(requestId);
|
|
3865
|
+
if (type === "CHANGE_VP_RANGE") {
|
|
3866
|
+
const [from, to] = params;
|
|
3867
|
+
(_a = this.dataWindow) == null ? void 0 : _a.setRange(from, to);
|
|
3868
|
+
for (let i = this.pendingRangeRequests.length - 1; i >= 0; i--) {
|
|
3869
|
+
const pendingRangeRequest = this.pendingRangeRequests[i];
|
|
3870
|
+
if (pendingRangeRequest.requestId === requestId) {
|
|
3871
|
+
pendingRangeRequest.acked = true;
|
|
3872
|
+
break;
|
|
3873
|
+
} else {
|
|
3874
|
+
warn2 == null ? void 0 : warn2("range requests sent faster than they are being ACKed");
|
|
3875
|
+
}
|
|
3876
|
+
}
|
|
3877
|
+
} else if (type === "config") {
|
|
3878
|
+
const { aggregations, columns, filter, groupBy, sort } = pendingOperation.data;
|
|
3879
|
+
this.aggregations = aggregations;
|
|
3880
|
+
this.columns = columns;
|
|
3881
|
+
this.filter = filter;
|
|
3882
|
+
this.groupBy = groupBy;
|
|
3883
|
+
this.sort = sort;
|
|
3884
|
+
if (groupBy.length > 0) {
|
|
3885
|
+
this.isTree = true;
|
|
3886
|
+
} else if (this.isTree) {
|
|
3887
|
+
this.isTree = false;
|
|
3888
|
+
}
|
|
3889
|
+
debug3 == null ? void 0 : debug3(\`config change confirmed, isTree : \${this.isTree}\`);
|
|
3890
|
+
return {
|
|
3891
|
+
clientViewportId,
|
|
3892
|
+
type,
|
|
3893
|
+
config: pendingOperation.data
|
|
3894
|
+
};
|
|
3895
|
+
} else if (type === "groupBy") {
|
|
3896
|
+
this.isTree = pendingOperation.data.length > 0;
|
|
3897
|
+
this.groupBy = pendingOperation.data;
|
|
3898
|
+
debug3 == null ? void 0 : debug3(\`groupBy change confirmed, isTree : \${this.isTree}\`);
|
|
3899
|
+
return {
|
|
3900
|
+
clientViewportId,
|
|
3901
|
+
type,
|
|
3902
|
+
groupBy: pendingOperation.data
|
|
3903
|
+
};
|
|
3904
|
+
} else if (type === "columns") {
|
|
3905
|
+
this.columns = pendingOperation.data;
|
|
3906
|
+
return {
|
|
3907
|
+
clientViewportId,
|
|
3908
|
+
type,
|
|
3909
|
+
columns: pendingOperation.data
|
|
3910
|
+
};
|
|
3911
|
+
} else if (type === "filter") {
|
|
3912
|
+
this.filter = pendingOperation.data;
|
|
3913
|
+
return {
|
|
3914
|
+
clientViewportId,
|
|
3915
|
+
type,
|
|
3916
|
+
filter: pendingOperation.data
|
|
3917
|
+
};
|
|
3918
|
+
} else if (type === "aggregate") {
|
|
3919
|
+
this.aggregations = pendingOperation.data;
|
|
3920
|
+
return {
|
|
3921
|
+
clientViewportId,
|
|
3922
|
+
type: "aggregate",
|
|
3923
|
+
aggregations: this.aggregations
|
|
3924
|
+
};
|
|
3925
|
+
} else if (type === "sort") {
|
|
3926
|
+
this.sort = pendingOperation.data;
|
|
3927
|
+
return {
|
|
3928
|
+
clientViewportId,
|
|
3929
|
+
type,
|
|
3930
|
+
sort: this.sort
|
|
3931
|
+
};
|
|
3932
|
+
} else if (type === "selection") {
|
|
3933
|
+
} else if (type === "disable") {
|
|
3934
|
+
this.disabled = true;
|
|
3935
|
+
return {
|
|
3936
|
+
type: "disabled",
|
|
3937
|
+
clientViewportId
|
|
3938
|
+
};
|
|
3939
|
+
} else if (type === "enable") {
|
|
3940
|
+
this.disabled = false;
|
|
3941
|
+
return {
|
|
3942
|
+
type: "enabled",
|
|
3943
|
+
clientViewportId
|
|
3944
|
+
};
|
|
3945
|
+
} else if (type === "CREATE_VISUAL_LINK") {
|
|
3946
|
+
const [colName, parentViewportId, parentColName] = params;
|
|
3947
|
+
this.linkedParent = {
|
|
3948
|
+
colName,
|
|
3949
|
+
parentViewportId,
|
|
3950
|
+
parentColName
|
|
3951
|
+
};
|
|
3952
|
+
this.pendingLinkedParent = void 0;
|
|
3953
|
+
return {
|
|
3954
|
+
type: "vuu-link-created",
|
|
3955
|
+
clientViewportId,
|
|
3956
|
+
colName,
|
|
3957
|
+
parentViewportId,
|
|
3958
|
+
parentColName
|
|
3959
|
+
};
|
|
3960
|
+
} else if (type === "REMOVE_VISUAL_LINK") {
|
|
3961
|
+
this.linkedParent = void 0;
|
|
3962
|
+
return {
|
|
3963
|
+
type: "vuu-link-removed",
|
|
3964
|
+
clientViewportId
|
|
3965
|
+
};
|
|
3966
|
+
}
|
|
3967
|
+
}
|
|
3968
|
+
// TODO when a range request arrives, consider the viewport to be scrolling
|
|
3969
|
+
// until data arrives and we have the full range.
|
|
3970
|
+
// When not scrolling, any server data is an update
|
|
3971
|
+
// When scrolling, we are in batch mode
|
|
3972
|
+
rangeRequest(requestId, range) {
|
|
3973
|
+
if (debugEnabled3) {
|
|
3974
|
+
this.rangeMonitor.set(range);
|
|
3975
|
+
}
|
|
3976
|
+
const type = "CHANGE_VP_RANGE";
|
|
3977
|
+
if (this.dataWindow) {
|
|
3978
|
+
const [serverDataRequired, clientRows] = this.dataWindow.setClientRange(
|
|
3979
|
+
range.from,
|
|
3980
|
+
range.to
|
|
3981
|
+
);
|
|
3982
|
+
let debounceRequest;
|
|
3983
|
+
const maxRange = this.dataWindow.rowCount || void 0;
|
|
3984
|
+
const serverRequest = serverDataRequired && !this.rangeRequestAlreadyPending(range) ? {
|
|
3985
|
+
type,
|
|
3986
|
+
viewPortId: this.serverViewportId,
|
|
3987
|
+
...getFullRange(range, this.bufferSize, maxRange)
|
|
3988
|
+
} : null;
|
|
3989
|
+
if (serverRequest) {
|
|
3990
|
+
debugEnabled3 && (debug3 == null ? void 0 : debug3(
|
|
3991
|
+
\`create CHANGE_VP_RANGE: [\${serverRequest.from} - \${serverRequest.to}]\`
|
|
3992
|
+
));
|
|
3993
|
+
this.awaitOperation(requestId, { type });
|
|
3994
|
+
const pendingRequest = this.pendingRangeRequests.at(-1);
|
|
3995
|
+
if (pendingRequest) {
|
|
3996
|
+
if (pendingRequest.acked) {
|
|
3997
|
+
console.warn("Range Request before previous request is filled");
|
|
3998
|
+
} else {
|
|
3999
|
+
const { from, to } = pendingRequest;
|
|
4000
|
+
if (this.dataWindow.outOfRange(from, to)) {
|
|
4001
|
+
debounceRequest = {
|
|
4002
|
+
clientViewportId: this.clientViewportId,
|
|
4003
|
+
type: "debounce-begin"
|
|
4004
|
+
};
|
|
4005
|
+
} else {
|
|
4006
|
+
warn2 == null ? void 0 : warn2("Range Request before previous request is acked");
|
|
4007
|
+
}
|
|
4008
|
+
}
|
|
4009
|
+
}
|
|
4010
|
+
this.pendingRangeRequests.push({ ...serverRequest, requestId });
|
|
4011
|
+
if (this.useBatchMode) {
|
|
4012
|
+
this.batchMode = true;
|
|
4013
|
+
}
|
|
4014
|
+
} else if (clientRows.length > 0) {
|
|
4015
|
+
this.batchMode = false;
|
|
4016
|
+
}
|
|
4017
|
+
this.keys.reset(this.dataWindow.clientRange);
|
|
4018
|
+
const toClient = this.isTree ? toClientRowTree : toClientRow;
|
|
4019
|
+
if (clientRows.length) {
|
|
4020
|
+
return [
|
|
4021
|
+
serverRequest,
|
|
4022
|
+
clientRows.map((row) => {
|
|
4023
|
+
return toClient(row, this.keys);
|
|
4024
|
+
})
|
|
4025
|
+
];
|
|
4026
|
+
} else if (debounceRequest) {
|
|
4027
|
+
return [serverRequest, void 0, debounceRequest];
|
|
4028
|
+
} else {
|
|
4029
|
+
return [serverRequest];
|
|
4030
|
+
}
|
|
4031
|
+
} else {
|
|
4032
|
+
return [null];
|
|
4033
|
+
}
|
|
4034
|
+
}
|
|
4035
|
+
setLinks(links) {
|
|
4036
|
+
this.links = links;
|
|
4037
|
+
return [
|
|
4038
|
+
{
|
|
4039
|
+
type: "vuu-links",
|
|
4040
|
+
links,
|
|
4041
|
+
clientViewportId: this.clientViewportId
|
|
4042
|
+
},
|
|
4043
|
+
this.pendingLinkedParent
|
|
4044
|
+
];
|
|
4045
|
+
}
|
|
4046
|
+
setMenu(menu) {
|
|
4047
|
+
return {
|
|
4048
|
+
type: "vuu-menu",
|
|
4049
|
+
menu,
|
|
4050
|
+
clientViewportId: this.clientViewportId
|
|
4051
|
+
};
|
|
4052
|
+
}
|
|
4053
|
+
setTableSchema(tableSchema) {
|
|
4054
|
+
this.tableSchema = tableSchema;
|
|
4055
|
+
}
|
|
4056
|
+
openTreeNode(requestId, message) {
|
|
4057
|
+
if (this.useBatchMode) {
|
|
4058
|
+
this.batchMode = true;
|
|
4059
|
+
}
|
|
4060
|
+
return {
|
|
4061
|
+
type: OPEN_TREE_NODE,
|
|
4062
|
+
vpId: this.serverViewportId,
|
|
4063
|
+
treeKey: message.key
|
|
4064
|
+
};
|
|
4065
|
+
}
|
|
4066
|
+
closeTreeNode(requestId, message) {
|
|
4067
|
+
if (this.useBatchMode) {
|
|
4068
|
+
this.batchMode = true;
|
|
4069
|
+
}
|
|
4070
|
+
return {
|
|
4071
|
+
type: CLOSE_TREE_NODE,
|
|
4072
|
+
vpId: this.serverViewportId,
|
|
4073
|
+
treeKey: message.key
|
|
4074
|
+
};
|
|
4075
|
+
}
|
|
4076
|
+
createLink(requestId, colName, parentVpId, parentColumnName) {
|
|
4077
|
+
const message = {
|
|
4078
|
+
type: "CREATE_VISUAL_LINK",
|
|
4079
|
+
parentVpId,
|
|
4080
|
+
childVpId: this.serverViewportId,
|
|
4081
|
+
parentColumnName,
|
|
4082
|
+
childColumnName: colName
|
|
4083
|
+
};
|
|
4084
|
+
this.awaitOperation(requestId, message);
|
|
4085
|
+
if (this.useBatchMode) {
|
|
4086
|
+
this.batchMode = true;
|
|
4087
|
+
}
|
|
4088
|
+
return message;
|
|
4089
|
+
}
|
|
4090
|
+
removeLink(requestId) {
|
|
4091
|
+
const message = {
|
|
4092
|
+
type: "REMOVE_VISUAL_LINK",
|
|
4093
|
+
childVpId: this.serverViewportId
|
|
4094
|
+
};
|
|
4095
|
+
this.awaitOperation(requestId, message);
|
|
4096
|
+
return message;
|
|
4097
|
+
}
|
|
4098
|
+
suspend() {
|
|
4099
|
+
this.suspended = true;
|
|
4100
|
+
info2 == null ? void 0 : info2("suspend");
|
|
4101
|
+
}
|
|
4102
|
+
resume() {
|
|
4103
|
+
this.suspended = false;
|
|
4104
|
+
if (debugEnabled3) {
|
|
4105
|
+
debug3 == null ? void 0 : debug3(\`resume: \${this.currentData()}\`);
|
|
4106
|
+
}
|
|
4107
|
+
return this.currentData();
|
|
4108
|
+
}
|
|
4109
|
+
currentData() {
|
|
4110
|
+
const out = [];
|
|
4111
|
+
if (this.dataWindow) {
|
|
4112
|
+
const records = this.dataWindow.getData();
|
|
4113
|
+
const { keys } = this;
|
|
4114
|
+
const toClient = this.isTree ? toClientRowTree : toClientRow;
|
|
4115
|
+
for (const row of records) {
|
|
4116
|
+
if (row) {
|
|
4117
|
+
out.push(toClient(row, keys));
|
|
4118
|
+
}
|
|
4119
|
+
}
|
|
4120
|
+
}
|
|
4121
|
+
return out;
|
|
4122
|
+
}
|
|
4123
|
+
enable(requestId) {
|
|
4124
|
+
this.awaitOperation(requestId, { type: "enable" });
|
|
4125
|
+
info2 == null ? void 0 : info2(\`enable: \${this.serverViewportId}\`);
|
|
4126
|
+
return {
|
|
4127
|
+
type: ENABLE_VP,
|
|
4128
|
+
viewPortId: this.serverViewportId
|
|
4129
|
+
};
|
|
4130
|
+
}
|
|
4131
|
+
disable(requestId) {
|
|
4132
|
+
this.awaitOperation(requestId, { type: "disable" });
|
|
4133
|
+
info2 == null ? void 0 : info2(\`disable: \${this.serverViewportId}\`);
|
|
4134
|
+
return {
|
|
4135
|
+
type: DISABLE_VP,
|
|
4136
|
+
viewPortId: this.serverViewportId
|
|
4137
|
+
};
|
|
4138
|
+
}
|
|
4139
|
+
columnRequest(requestId, columns) {
|
|
4140
|
+
this.awaitOperation(requestId, {
|
|
4141
|
+
type: "columns",
|
|
4142
|
+
data: columns
|
|
4143
|
+
});
|
|
4144
|
+
debug3 == null ? void 0 : debug3(\`columnRequest: \${columns}\`);
|
|
4145
|
+
return this.createRequest({ columns });
|
|
4146
|
+
}
|
|
4147
|
+
filterRequest(requestId, dataSourceFilter) {
|
|
4148
|
+
this.awaitOperation(requestId, {
|
|
4149
|
+
type: "filter",
|
|
4150
|
+
data: dataSourceFilter
|
|
4151
|
+
});
|
|
4152
|
+
if (this.useBatchMode) {
|
|
4153
|
+
this.batchMode = true;
|
|
4154
|
+
}
|
|
4155
|
+
const { filter } = dataSourceFilter;
|
|
4156
|
+
info2 == null ? void 0 : info2(\`filterRequest: \${filter}\`);
|
|
4157
|
+
return this.createRequest({ filterSpec: { filter } });
|
|
4158
|
+
}
|
|
4159
|
+
setConfig(requestId, config) {
|
|
4160
|
+
this.awaitOperation(requestId, { type: "config", data: config });
|
|
4161
|
+
const { filter, ...remainingConfig } = config;
|
|
4162
|
+
if (this.useBatchMode) {
|
|
4163
|
+
this.batchMode = true;
|
|
4164
|
+
}
|
|
4165
|
+
debugEnabled3 ? debug3 == null ? void 0 : debug3(\`setConfig \${JSON.stringify(config)}\`) : info2 == null ? void 0 : info2(\`setConfig\`);
|
|
4166
|
+
return this.createRequest(
|
|
4167
|
+
{
|
|
4168
|
+
...remainingConfig,
|
|
4169
|
+
filterSpec: typeof (filter == null ? void 0 : filter.filter) === "string" ? {
|
|
4170
|
+
filter: filter.filter
|
|
4171
|
+
} : {
|
|
4172
|
+
filter: ""
|
|
4173
|
+
}
|
|
4174
|
+
},
|
|
4175
|
+
true
|
|
4176
|
+
);
|
|
4177
|
+
}
|
|
4178
|
+
aggregateRequest(requestId, aggregations) {
|
|
4179
|
+
this.awaitOperation(requestId, { type: "aggregate", data: aggregations });
|
|
4180
|
+
info2 == null ? void 0 : info2(\`aggregateRequest: \${aggregations}\`);
|
|
4181
|
+
return this.createRequest({ aggregations });
|
|
4182
|
+
}
|
|
4183
|
+
sortRequest(requestId, sort) {
|
|
4184
|
+
this.awaitOperation(requestId, { type: "sort", data: sort });
|
|
4185
|
+
info2 == null ? void 0 : info2(\`sortRequest: \${JSON.stringify(sort.sortDefs)}\`);
|
|
4186
|
+
return this.createRequest({ sort });
|
|
4187
|
+
}
|
|
4188
|
+
groupByRequest(requestId, groupBy = EMPTY_GROUPBY) {
|
|
4189
|
+
var _a;
|
|
4190
|
+
this.awaitOperation(requestId, { type: "groupBy", data: groupBy });
|
|
4191
|
+
if (this.useBatchMode) {
|
|
4192
|
+
this.batchMode = true;
|
|
4193
|
+
}
|
|
4194
|
+
if (!this.isTree) {
|
|
4195
|
+
(_a = this.dataWindow) == null ? void 0 : _a.clear();
|
|
4196
|
+
}
|
|
4197
|
+
return this.createRequest({ groupBy });
|
|
4198
|
+
}
|
|
4199
|
+
selectRequest(requestId, selected) {
|
|
4200
|
+
this.awaitOperation(requestId, { type: "selection", data: selected });
|
|
4201
|
+
info2 == null ? void 0 : info2(\`selectRequest: \${selected}\`);
|
|
4202
|
+
return {
|
|
4203
|
+
type: "SET_SELECTION",
|
|
4204
|
+
vpId: this.serverViewportId,
|
|
4205
|
+
selection: expandSelection(selected)
|
|
4206
|
+
};
|
|
4207
|
+
}
|
|
4208
|
+
removePendingRangeRequest(firstIndex, lastIndex) {
|
|
4209
|
+
for (let i = this.pendingRangeRequests.length - 1; i >= 0; i--) {
|
|
4210
|
+
const { from, to } = this.pendingRangeRequests[i];
|
|
4211
|
+
let isLast = true;
|
|
4212
|
+
if (firstIndex >= from && firstIndex < to || lastIndex > from && lastIndex < to) {
|
|
4213
|
+
if (!isLast) {
|
|
4214
|
+
console.warn(
|
|
4215
|
+
"removePendingRangeRequest TABLE_ROWS are not for latest request"
|
|
4216
|
+
);
|
|
4217
|
+
}
|
|
4218
|
+
this.pendingRangeRequests.splice(i, 1);
|
|
4219
|
+
break;
|
|
4220
|
+
} else {
|
|
4221
|
+
isLast = false;
|
|
4222
|
+
}
|
|
4223
|
+
}
|
|
4224
|
+
}
|
|
4225
|
+
updateRows(rows) {
|
|
4226
|
+
var _a, _b, _c;
|
|
4227
|
+
const [firstRow, lastRow] = getFirstAndLastRows(rows);
|
|
4228
|
+
if (firstRow && lastRow) {
|
|
4229
|
+
this.removePendingRangeRequest(firstRow.rowIndex, lastRow.rowIndex);
|
|
4230
|
+
}
|
|
4231
|
+
if (rows.length === 1 && firstRow.vpSize === 0 && this.disabled) {
|
|
4232
|
+
debug3 == null ? void 0 : debug3(
|
|
4233
|
+
\`ignore a SIZE=0 message on disabled viewport (\${rows.length} rows)\`
|
|
4234
|
+
);
|
|
4235
|
+
return;
|
|
4236
|
+
}
|
|
4237
|
+
for (const row of rows) {
|
|
4238
|
+
if (this.isTree && isLeafUpdate(row)) {
|
|
4239
|
+
continue;
|
|
4240
|
+
} else {
|
|
4241
|
+
if (row.updateType === "SIZE" || ((_a = this.dataWindow) == null ? void 0 : _a.rowCount) !== row.vpSize) {
|
|
4242
|
+
(_b = this.dataWindow) == null ? void 0 : _b.setRowCount(row.vpSize);
|
|
4243
|
+
this.rowCountChanged = true;
|
|
4244
|
+
}
|
|
4245
|
+
if (row.updateType === "U") {
|
|
4246
|
+
if ((_c = this.dataWindow) == null ? void 0 : _c.setAtIndex(row)) {
|
|
4247
|
+
this.hasUpdates = true;
|
|
4248
|
+
if (!this.batchMode) {
|
|
4249
|
+
this.pendingUpdates.push(row);
|
|
4250
|
+
}
|
|
4251
|
+
}
|
|
4252
|
+
}
|
|
4253
|
+
}
|
|
4254
|
+
}
|
|
4255
|
+
}
|
|
4256
|
+
// This is called only after new data has been received from server - data
|
|
4257
|
+
// returned direcly from buffer does not use this.
|
|
4258
|
+
getClientRows() {
|
|
4259
|
+
let out = void 0;
|
|
4260
|
+
let mode = "size-only";
|
|
4261
|
+
if (this.hasUpdates && this.dataWindow) {
|
|
4262
|
+
const { keys } = this;
|
|
4263
|
+
const toClient = this.isTree ? toClientRowTree : toClientRow;
|
|
4264
|
+
if (this.pendingUpdates.length > 0) {
|
|
4265
|
+
out = [];
|
|
4266
|
+
mode = "update";
|
|
4267
|
+
for (const row of this.pendingUpdates) {
|
|
4268
|
+
out.push(toClient(row, keys));
|
|
4269
|
+
}
|
|
4270
|
+
this.pendingUpdates.length = 0;
|
|
4271
|
+
} else {
|
|
4272
|
+
const records = this.dataWindow.getData();
|
|
4273
|
+
if (this.dataWindow.hasAllRowsWithinRange) {
|
|
4274
|
+
out = [];
|
|
4275
|
+
mode = "batch";
|
|
4276
|
+
for (const row of records) {
|
|
4277
|
+
out.push(toClient(row, keys));
|
|
4278
|
+
}
|
|
4279
|
+
this.batchMode = false;
|
|
4280
|
+
}
|
|
4281
|
+
}
|
|
4282
|
+
this.hasUpdates = false;
|
|
4283
|
+
}
|
|
4284
|
+
return [out, mode];
|
|
4285
|
+
}
|
|
4286
|
+
createRequest(params, overWrite = false) {
|
|
4287
|
+
if (overWrite) {
|
|
4288
|
+
return {
|
|
4289
|
+
type: "CHANGE_VP",
|
|
4290
|
+
viewPortId: this.serverViewportId,
|
|
4291
|
+
...params
|
|
4292
|
+
};
|
|
4293
|
+
} else {
|
|
4294
|
+
return {
|
|
4295
|
+
type: "CHANGE_VP",
|
|
4296
|
+
viewPortId: this.serverViewportId,
|
|
4297
|
+
aggregations: this.aggregations,
|
|
4298
|
+
columns: this.columns,
|
|
4299
|
+
sort: this.sort,
|
|
4300
|
+
groupBy: this.groupBy,
|
|
4301
|
+
filterSpec: {
|
|
4302
|
+
filter: this.filter.filter
|
|
4303
|
+
},
|
|
4304
|
+
...params
|
|
4305
|
+
};
|
|
4306
|
+
}
|
|
4307
|
+
}
|
|
4308
|
+
};
|
|
4309
|
+
var toClientRow = ({ rowIndex, rowKey, sel: isSelected, data }, keys) => {
|
|
4310
|
+
return [
|
|
4311
|
+
rowIndex,
|
|
4312
|
+
keys.keyFor(rowIndex),
|
|
4313
|
+
true,
|
|
4314
|
+
false,
|
|
4315
|
+
0,
|
|
4316
|
+
0,
|
|
4317
|
+
rowKey,
|
|
4318
|
+
isSelected
|
|
4319
|
+
].concat(data);
|
|
4320
|
+
};
|
|
4321
|
+
var toClientRowTree = ({ rowIndex, rowKey, sel: isSelected, data }, keys) => {
|
|
4322
|
+
const [depth, isExpanded, , isLeaf, , count, ...rest] = data;
|
|
4323
|
+
return [
|
|
4324
|
+
rowIndex,
|
|
4325
|
+
keys.keyFor(rowIndex),
|
|
4326
|
+
isLeaf,
|
|
4327
|
+
isExpanded,
|
|
4328
|
+
depth,
|
|
4329
|
+
count,
|
|
4330
|
+
rowKey,
|
|
4331
|
+
isSelected
|
|
4332
|
+
].concat(rest);
|
|
4333
|
+
};
|
|
4334
|
+
|
|
4335
|
+
// src/server-proxy/server-proxy.ts
|
|
4336
|
+
var _requestId = 1;
|
|
4337
|
+
var { debug: debug4, debugEnabled: debugEnabled4, error: error3, info: info3, infoEnabled: infoEnabled3, warn: warn3 } = logger("server-proxy");
|
|
4338
|
+
var nextRequestId = () => \`\${_requestId++}\`;
|
|
4339
|
+
var DEFAULT_OPTIONS = {};
|
|
4340
|
+
var isActiveViewport = (viewPort) => viewPort.disabled !== true && viewPort.suspended !== true;
|
|
4341
|
+
var NO_ACTION = {
|
|
4342
|
+
type: "NO_ACTION"
|
|
4343
|
+
};
|
|
4344
|
+
var addTitleToLinks = (links, serverViewportId, label) => links.map(
|
|
4345
|
+
(link) => link.parentVpId === serverViewportId ? { ...link, label } : link
|
|
4346
|
+
);
|
|
4347
|
+
function addLabelsToLinks(links, viewports) {
|
|
4348
|
+
return links.map((linkDescriptor) => {
|
|
4349
|
+
const { parentVpId } = linkDescriptor;
|
|
4350
|
+
const viewport = viewports.get(parentVpId);
|
|
4351
|
+
if (viewport) {
|
|
4352
|
+
return {
|
|
4353
|
+
...linkDescriptor,
|
|
4354
|
+
parentClientVpId: viewport.clientViewportId,
|
|
4355
|
+
label: viewport.title
|
|
4356
|
+
};
|
|
4357
|
+
} else {
|
|
4358
|
+
throw Error("addLabelsToLinks viewport not found");
|
|
4359
|
+
}
|
|
4360
|
+
});
|
|
4361
|
+
}
|
|
4362
|
+
var ServerProxy = class {
|
|
4363
|
+
constructor(connection, callback) {
|
|
4364
|
+
this.authToken = "";
|
|
4365
|
+
this.user = "user";
|
|
4366
|
+
this.pendingTableMetaRequests = /* @__PURE__ */ new Map();
|
|
4367
|
+
this.pendingRequests = /* @__PURE__ */ new Map();
|
|
4368
|
+
this.queuedRequests = [];
|
|
4369
|
+
this.cachedTableSchemas = /* @__PURE__ */ new Map();
|
|
4370
|
+
this.connection = connection;
|
|
4371
|
+
this.postMessageToClient = callback;
|
|
4372
|
+
this.viewports = /* @__PURE__ */ new Map();
|
|
4373
|
+
this.mapClientToServerViewport = /* @__PURE__ */ new Map();
|
|
4374
|
+
}
|
|
4375
|
+
async reconnect() {
|
|
4376
|
+
await this.login(this.authToken);
|
|
4377
|
+
const [activeViewports, inactiveViewports] = partition(
|
|
4378
|
+
Array.from(this.viewports.values()),
|
|
4379
|
+
isActiveViewport
|
|
4380
|
+
);
|
|
4381
|
+
this.viewports.clear();
|
|
4382
|
+
this.mapClientToServerViewport.clear();
|
|
4383
|
+
const reconnectViewports = (viewports) => {
|
|
4384
|
+
viewports.forEach((viewport) => {
|
|
4385
|
+
const { clientViewportId } = viewport;
|
|
4386
|
+
this.viewports.set(clientViewportId, viewport);
|
|
4387
|
+
this.sendMessageToServer(viewport.subscribe(), clientViewportId);
|
|
4388
|
+
});
|
|
4389
|
+
};
|
|
4390
|
+
reconnectViewports(activeViewports);
|
|
4391
|
+
setTimeout(() => {
|
|
4392
|
+
reconnectViewports(inactiveViewports);
|
|
4393
|
+
}, 2e3);
|
|
4394
|
+
}
|
|
4395
|
+
async login(authToken, user = "user") {
|
|
4396
|
+
if (authToken) {
|
|
4397
|
+
this.authToken = authToken;
|
|
4398
|
+
this.user = user;
|
|
4399
|
+
return new Promise((resolve, reject) => {
|
|
4400
|
+
this.sendMessageToServer(
|
|
4401
|
+
{ type: LOGIN, token: this.authToken, user },
|
|
4402
|
+
""
|
|
4403
|
+
);
|
|
4404
|
+
this.pendingLogin = { resolve, reject };
|
|
4405
|
+
});
|
|
4406
|
+
} else if (this.authToken === "") {
|
|
4407
|
+
error3("login, cannot login until auth token has been obtained");
|
|
4408
|
+
}
|
|
4409
|
+
}
|
|
4410
|
+
subscribe(message) {
|
|
4411
|
+
if (!this.mapClientToServerViewport.has(message.viewport)) {
|
|
4412
|
+
if (!this.hasSchemaForTable(message.table) && // A Session table is never cached - it is limited to a single workflow interaction
|
|
4413
|
+
// The metadata for a session table is requested even before the subscribe call.
|
|
4414
|
+
!isSessionTable(message.table)) {
|
|
4415
|
+
info3 == null ? void 0 : info3(
|
|
4416
|
+
\`subscribe to \${message.table.table}, no metadata yet, request metadata\`
|
|
4417
|
+
);
|
|
4418
|
+
const requestId = nextRequestId();
|
|
4419
|
+
this.sendMessageToServer(
|
|
4420
|
+
{ type: "GET_TABLE_META", table: message.table },
|
|
4421
|
+
requestId
|
|
4422
|
+
);
|
|
4423
|
+
this.pendingTableMetaRequests.set(requestId, message.viewport);
|
|
4424
|
+
}
|
|
4425
|
+
const viewport = new Viewport(message);
|
|
4426
|
+
this.viewports.set(message.viewport, viewport);
|
|
4427
|
+
this.sendIfReady(
|
|
4428
|
+
viewport.subscribe(),
|
|
4429
|
+
message.viewport,
|
|
4430
|
+
this.sessionId !== ""
|
|
4431
|
+
);
|
|
4432
|
+
} else {
|
|
4433
|
+
error3(\`spurious subscribe call \${message.viewport}\`);
|
|
4434
|
+
}
|
|
4435
|
+
}
|
|
4436
|
+
unsubscribe(clientViewportId) {
|
|
4437
|
+
const serverViewportId = this.mapClientToServerViewport.get(clientViewportId);
|
|
4438
|
+
if (serverViewportId) {
|
|
4439
|
+
info3 == null ? void 0 : info3(
|
|
4440
|
+
\`Unsubscribe Message (Client to Server):
|
|
4441
|
+
\${serverViewportId}\`
|
|
4442
|
+
);
|
|
4443
|
+
this.sendMessageToServer({
|
|
4444
|
+
type: REMOVE_VP,
|
|
4445
|
+
viewPortId: serverViewportId
|
|
4446
|
+
});
|
|
4447
|
+
} else {
|
|
4448
|
+
error3(
|
|
4449
|
+
\`failed to unsubscribe client viewport \${clientViewportId}, viewport not found\`
|
|
4450
|
+
);
|
|
4451
|
+
}
|
|
4452
|
+
}
|
|
4453
|
+
getViewportForClient(clientViewportId, throws = true) {
|
|
4454
|
+
const serverViewportId = this.mapClientToServerViewport.get(clientViewportId);
|
|
4455
|
+
if (serverViewportId) {
|
|
4456
|
+
const viewport = this.viewports.get(serverViewportId);
|
|
4457
|
+
if (viewport) {
|
|
4458
|
+
return viewport;
|
|
4459
|
+
} else if (throws) {
|
|
4460
|
+
throw Error(
|
|
4461
|
+
\`Viewport not found for client viewport \${clientViewportId}\`
|
|
4462
|
+
);
|
|
4463
|
+
} else {
|
|
4464
|
+
return null;
|
|
4465
|
+
}
|
|
4466
|
+
} else if (this.viewports.has(clientViewportId)) {
|
|
4467
|
+
return this.viewports.get(clientViewportId);
|
|
4468
|
+
} else if (throws) {
|
|
4469
|
+
throw Error(
|
|
4470
|
+
\`Viewport server id not found for client viewport \${clientViewportId}\`
|
|
4471
|
+
);
|
|
4472
|
+
} else {
|
|
4473
|
+
return null;
|
|
4474
|
+
}
|
|
4475
|
+
}
|
|
4476
|
+
/**********************************************************************/
|
|
4477
|
+
/* Handle messages from client */
|
|
4478
|
+
/**********************************************************************/
|
|
4479
|
+
setViewRange(viewport, message) {
|
|
4480
|
+
const requestId = nextRequestId();
|
|
4481
|
+
const [serverRequest, rows, debounceRequest] = viewport.rangeRequest(
|
|
4482
|
+
requestId,
|
|
4483
|
+
message.range
|
|
4484
|
+
);
|
|
4485
|
+
if (serverRequest) {
|
|
4486
|
+
if (true) {
|
|
4487
|
+
info3 == null ? void 0 : info3(
|
|
4488
|
+
\`CHANGE_VP_RANGE [\${message.range.from}-\${message.range.to}] => [\${serverRequest.from}-\${serverRequest.to}]\`
|
|
4489
|
+
);
|
|
4490
|
+
}
|
|
4491
|
+
this.sendIfReady(
|
|
4492
|
+
serverRequest,
|
|
4493
|
+
requestId,
|
|
4494
|
+
viewport.status === "subscribed"
|
|
4495
|
+
);
|
|
4496
|
+
}
|
|
4497
|
+
if (rows) {
|
|
4498
|
+
this.postMessageToClient({
|
|
4499
|
+
mode: "batch",
|
|
4500
|
+
type: "viewport-update",
|
|
4501
|
+
clientViewportId: viewport.clientViewportId,
|
|
4502
|
+
rows
|
|
4503
|
+
});
|
|
4504
|
+
} else if (debounceRequest) {
|
|
4505
|
+
this.postMessageToClient(debounceRequest);
|
|
4506
|
+
}
|
|
4507
|
+
}
|
|
4508
|
+
setConfig(viewport, message) {
|
|
4509
|
+
const requestId = nextRequestId();
|
|
4510
|
+
const request = viewport.setConfig(requestId, message.config);
|
|
4511
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4512
|
+
}
|
|
4513
|
+
aggregate(viewport, message) {
|
|
4514
|
+
const requestId = nextRequestId();
|
|
4515
|
+
const request = viewport.aggregateRequest(requestId, message.aggregations);
|
|
4516
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4517
|
+
}
|
|
4518
|
+
sort(viewport, message) {
|
|
4519
|
+
const requestId = nextRequestId();
|
|
4520
|
+
const request = viewport.sortRequest(requestId, message.sort);
|
|
4521
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4522
|
+
}
|
|
4523
|
+
groupBy(viewport, message) {
|
|
4524
|
+
const requestId = nextRequestId();
|
|
4525
|
+
const request = viewport.groupByRequest(requestId, message.groupBy);
|
|
4526
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4527
|
+
}
|
|
4528
|
+
filter(viewport, message) {
|
|
4529
|
+
const requestId = nextRequestId();
|
|
4530
|
+
const { filter } = message;
|
|
4531
|
+
const request = viewport.filterRequest(requestId, filter);
|
|
4532
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4533
|
+
}
|
|
4534
|
+
setColumns(viewport, message) {
|
|
4535
|
+
const requestId = nextRequestId();
|
|
4536
|
+
const { columns } = message;
|
|
4537
|
+
const request = viewport.columnRequest(requestId, columns);
|
|
4538
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4539
|
+
}
|
|
4540
|
+
setTitle(viewport, message) {
|
|
4541
|
+
if (viewport) {
|
|
4542
|
+
viewport.title = message.title;
|
|
4543
|
+
this.updateTitleOnVisualLinks(viewport);
|
|
4544
|
+
}
|
|
4545
|
+
}
|
|
4546
|
+
select(viewport, message) {
|
|
4547
|
+
const requestId = nextRequestId();
|
|
4548
|
+
const { selected } = message;
|
|
4549
|
+
const request = viewport.selectRequest(requestId, selected);
|
|
4550
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4551
|
+
}
|
|
4552
|
+
disableViewport(viewport) {
|
|
4553
|
+
const requestId = nextRequestId();
|
|
4554
|
+
const request = viewport.disable(requestId);
|
|
4555
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4556
|
+
}
|
|
4557
|
+
enableViewport(viewport) {
|
|
4558
|
+
if (viewport.disabled) {
|
|
4559
|
+
const requestId = nextRequestId();
|
|
4560
|
+
const request = viewport.enable(requestId);
|
|
4561
|
+
this.sendIfReady(request, requestId, viewport.status === "subscribed");
|
|
4562
|
+
}
|
|
4563
|
+
}
|
|
4564
|
+
resumeViewport(viewport) {
|
|
4565
|
+
const rows = viewport.resume();
|
|
4566
|
+
this.postMessageToClient({
|
|
4567
|
+
clientViewportId: viewport.clientViewportId,
|
|
4568
|
+
rows,
|
|
4569
|
+
type: "viewport-update"
|
|
4570
|
+
});
|
|
4571
|
+
}
|
|
4572
|
+
openTreeNode(viewport, message) {
|
|
4573
|
+
if (viewport.serverViewportId) {
|
|
4574
|
+
const requestId = nextRequestId();
|
|
4575
|
+
this.sendIfReady(
|
|
4576
|
+
viewport.openTreeNode(requestId, message),
|
|
4577
|
+
requestId,
|
|
4578
|
+
viewport.status === "subscribed"
|
|
4579
|
+
);
|
|
4580
|
+
}
|
|
4581
|
+
}
|
|
4582
|
+
closeTreeNode(viewport, message) {
|
|
4583
|
+
if (viewport.serverViewportId) {
|
|
4584
|
+
const requestId = nextRequestId();
|
|
4585
|
+
this.sendIfReady(
|
|
4586
|
+
viewport.closeTreeNode(requestId, message),
|
|
4587
|
+
requestId,
|
|
4588
|
+
viewport.status === "subscribed"
|
|
4589
|
+
);
|
|
4590
|
+
}
|
|
4591
|
+
}
|
|
4592
|
+
createLink(viewport, message) {
|
|
4593
|
+
const { parentClientVpId, parentColumnName, childColumnName } = message;
|
|
4594
|
+
const requestId = nextRequestId();
|
|
4595
|
+
const parentVpId = this.mapClientToServerViewport.get(parentClientVpId);
|
|
4596
|
+
if (parentVpId) {
|
|
4597
|
+
const request = viewport.createLink(
|
|
4598
|
+
requestId,
|
|
4599
|
+
childColumnName,
|
|
4600
|
+
parentVpId,
|
|
4601
|
+
parentColumnName
|
|
4602
|
+
);
|
|
4603
|
+
this.sendMessageToServer(request, requestId);
|
|
4604
|
+
} else {
|
|
4605
|
+
error3("ServerProxy unable to create link, viewport not found");
|
|
4606
|
+
}
|
|
4607
|
+
}
|
|
4608
|
+
removeLink(viewport) {
|
|
4609
|
+
const requestId = nextRequestId();
|
|
4610
|
+
const request = viewport.removeLink(requestId);
|
|
4611
|
+
this.sendMessageToServer(request, requestId);
|
|
4612
|
+
}
|
|
4613
|
+
updateTitleOnVisualLinks(viewport) {
|
|
4614
|
+
var _a;
|
|
4615
|
+
const { serverViewportId, title } = viewport;
|
|
4616
|
+
for (const vp of this.viewports.values()) {
|
|
4617
|
+
if (vp !== viewport && vp.links && serverViewportId && title) {
|
|
4618
|
+
if ((_a = vp.links) == null ? void 0 : _a.some((link) => link.parentVpId === serverViewportId)) {
|
|
4619
|
+
const [messageToClient] = vp.setLinks(
|
|
4620
|
+
addTitleToLinks(vp.links, serverViewportId, title)
|
|
4621
|
+
);
|
|
4622
|
+
this.postMessageToClient(messageToClient);
|
|
4623
|
+
}
|
|
4624
|
+
}
|
|
4625
|
+
}
|
|
4626
|
+
}
|
|
4627
|
+
removeViewportFromVisualLinks(serverViewportId) {
|
|
4628
|
+
var _a;
|
|
4629
|
+
for (const vp of this.viewports.values()) {
|
|
4630
|
+
if ((_a = vp.links) == null ? void 0 : _a.some(({ parentVpId }) => parentVpId === serverViewportId)) {
|
|
4631
|
+
const [messageToClient] = vp.setLinks(
|
|
4632
|
+
vp.links.filter(({ parentVpId }) => parentVpId !== serverViewportId)
|
|
4633
|
+
);
|
|
4634
|
+
this.postMessageToClient(messageToClient);
|
|
4635
|
+
}
|
|
4636
|
+
}
|
|
4637
|
+
}
|
|
4638
|
+
menuRpcCall(message) {
|
|
4639
|
+
const viewport = this.getViewportForClient(message.vpId, false);
|
|
4640
|
+
if (viewport == null ? void 0 : viewport.serverViewportId) {
|
|
4641
|
+
const [requestId, rpcRequest] = stripRequestId(message);
|
|
4642
|
+
this.sendMessageToServer(
|
|
4643
|
+
{
|
|
4644
|
+
...rpcRequest,
|
|
4645
|
+
vpId: viewport.serverViewportId
|
|
4646
|
+
},
|
|
4647
|
+
requestId
|
|
4648
|
+
);
|
|
4649
|
+
}
|
|
4650
|
+
}
|
|
4651
|
+
rpcCall(message) {
|
|
4652
|
+
const [requestId, rpcRequest] = stripRequestId(message);
|
|
4653
|
+
const module = getRpcServiceModule(rpcRequest.service);
|
|
4654
|
+
this.sendMessageToServer(rpcRequest, requestId, { module });
|
|
4655
|
+
}
|
|
4656
|
+
handleMessageFromClient(message) {
|
|
4657
|
+
debug4 == null ? void 0 : debug4(\`handleMessageFromClient: \${message.type}\`);
|
|
4658
|
+
if (isViewporttMessage(message)) {
|
|
4659
|
+
if (message.type === "disable") {
|
|
4660
|
+
const viewport = this.getViewportForClient(message.viewport, false);
|
|
4661
|
+
if (viewport !== null) {
|
|
4662
|
+
return this.disableViewport(viewport);
|
|
4663
|
+
} else {
|
|
4664
|
+
return;
|
|
4665
|
+
}
|
|
4666
|
+
} else {
|
|
4667
|
+
const viewport = this.getViewportForClient(message.viewport);
|
|
4668
|
+
switch (message.type) {
|
|
4669
|
+
case "setViewRange":
|
|
4670
|
+
return this.setViewRange(viewport, message);
|
|
4671
|
+
case "config":
|
|
4672
|
+
return this.setConfig(viewport, message);
|
|
4673
|
+
case "aggregate":
|
|
4674
|
+
return this.aggregate(viewport, message);
|
|
4675
|
+
case "sort":
|
|
4676
|
+
return this.sort(viewport, message);
|
|
4677
|
+
case "groupBy":
|
|
4678
|
+
return this.groupBy(viewport, message);
|
|
4679
|
+
case "filter":
|
|
4680
|
+
return this.filter(viewport, message);
|
|
4681
|
+
case "select":
|
|
4682
|
+
return this.select(viewport, message);
|
|
4683
|
+
case "suspend":
|
|
4684
|
+
return viewport.suspend();
|
|
4685
|
+
case "resume":
|
|
4686
|
+
return this.resumeViewport(viewport);
|
|
4687
|
+
case "enable":
|
|
4688
|
+
return this.enableViewport(viewport);
|
|
4689
|
+
case "openTreeNode":
|
|
4690
|
+
return this.openTreeNode(viewport, message);
|
|
4691
|
+
case "closeTreeNode":
|
|
4692
|
+
return this.closeTreeNode(viewport, message);
|
|
4693
|
+
case "createLink":
|
|
4694
|
+
return this.createLink(viewport, message);
|
|
4695
|
+
case "removeLink":
|
|
4696
|
+
return this.removeLink(viewport);
|
|
4697
|
+
case "setColumns":
|
|
4698
|
+
return this.setColumns(viewport, message);
|
|
4699
|
+
case "setTitle":
|
|
4700
|
+
return this.setTitle(viewport, message);
|
|
4701
|
+
default:
|
|
4702
|
+
}
|
|
4703
|
+
}
|
|
4704
|
+
} else if (isVuuMenuRpcRequest(message)) {
|
|
4705
|
+
return this.menuRpcCall(message);
|
|
4706
|
+
} else {
|
|
4707
|
+
const { type, requestId } = message;
|
|
4708
|
+
switch (type) {
|
|
4709
|
+
case "GET_TABLE_LIST":
|
|
4710
|
+
return this.sendMessageToServer({ type }, requestId);
|
|
4711
|
+
case "GET_TABLE_META":
|
|
4712
|
+
return this.sendMessageToServer(
|
|
4713
|
+
{ type, table: message.table },
|
|
4714
|
+
requestId
|
|
4715
|
+
);
|
|
4716
|
+
case "RPC_CALL":
|
|
4717
|
+
return this.rpcCall(message);
|
|
4718
|
+
default:
|
|
4719
|
+
}
|
|
4720
|
+
}
|
|
4721
|
+
error3(
|
|
4722
|
+
\`Vuu ServerProxy Unexpected message from client \${JSON.stringify(
|
|
4723
|
+
message
|
|
4724
|
+
)}\`
|
|
4725
|
+
);
|
|
4726
|
+
}
|
|
4727
|
+
awaitResponseToMessage(message) {
|
|
4728
|
+
return new Promise((resolve, reject) => {
|
|
4729
|
+
const requestId = nextRequestId();
|
|
4730
|
+
this.sendMessageToServer(message, requestId);
|
|
4731
|
+
this.pendingRequests.set(requestId, { reject, resolve });
|
|
4732
|
+
});
|
|
4733
|
+
}
|
|
4734
|
+
sendIfReady(message, requestId, isReady = true) {
|
|
4735
|
+
if (isReady) {
|
|
4736
|
+
this.sendMessageToServer(message, requestId);
|
|
4737
|
+
} else {
|
|
4738
|
+
this.queuedRequests.push(message);
|
|
4739
|
+
}
|
|
4740
|
+
return isReady;
|
|
4741
|
+
}
|
|
4742
|
+
sendMessageToServer(body, requestId = \`\${_requestId++}\`, options = DEFAULT_OPTIONS) {
|
|
4743
|
+
const { module = "CORE" } = options;
|
|
4744
|
+
if (this.authToken) {
|
|
4745
|
+
this.connection.send({
|
|
4746
|
+
requestId,
|
|
4747
|
+
sessionId: this.sessionId,
|
|
4748
|
+
token: this.authToken,
|
|
4749
|
+
user: this.user,
|
|
4750
|
+
module,
|
|
4751
|
+
body
|
|
4752
|
+
});
|
|
4753
|
+
}
|
|
4754
|
+
}
|
|
4755
|
+
handleMessageFromServer(message) {
|
|
4756
|
+
var _a, _b, _c;
|
|
4757
|
+
const { body, requestId, sessionId } = message;
|
|
4758
|
+
const pendingRequest = this.pendingRequests.get(requestId);
|
|
4759
|
+
if (pendingRequest) {
|
|
4760
|
+
const { resolve } = pendingRequest;
|
|
4761
|
+
this.pendingRequests.delete(requestId);
|
|
4762
|
+
resolve(body);
|
|
4763
|
+
return;
|
|
4764
|
+
}
|
|
4765
|
+
const { viewports } = this;
|
|
4766
|
+
switch (body.type) {
|
|
4767
|
+
case HB:
|
|
4768
|
+
this.sendMessageToServer(
|
|
4769
|
+
{ type: HB_RESP, ts: +/* @__PURE__ */ new Date() },
|
|
4770
|
+
"NA"
|
|
4771
|
+
);
|
|
4772
|
+
break;
|
|
4773
|
+
case LOGIN_SUCCESS:
|
|
4774
|
+
if (sessionId) {
|
|
4775
|
+
this.sessionId = sessionId;
|
|
4776
|
+
(_a = this.pendingLogin) == null ? void 0 : _a.resolve(sessionId);
|
|
4777
|
+
this.pendingLogin = void 0;
|
|
4778
|
+
} else {
|
|
4779
|
+
throw Error("LOGIN_SUCCESS did not provide sessionId");
|
|
4780
|
+
}
|
|
4781
|
+
break;
|
|
4782
|
+
case CREATE_VP_SUCCESS:
|
|
4783
|
+
{
|
|
4784
|
+
const viewport = viewports.get(requestId);
|
|
4785
|
+
if (viewport) {
|
|
4786
|
+
const { status: viewportStatus } = viewport;
|
|
4787
|
+
const { viewPortId: serverViewportId } = body;
|
|
4788
|
+
if (requestId !== serverViewportId) {
|
|
4789
|
+
viewports.delete(requestId);
|
|
4790
|
+
viewports.set(serverViewportId, viewport);
|
|
4791
|
+
}
|
|
4792
|
+
this.mapClientToServerViewport.set(requestId, serverViewportId);
|
|
4793
|
+
const response = viewport.handleSubscribed(body);
|
|
4794
|
+
if (response) {
|
|
4795
|
+
this.postMessageToClient(response);
|
|
4796
|
+
if (debugEnabled4) {
|
|
4797
|
+
debug4(
|
|
4798
|
+
\`post DataSourceSubscribedMessage to client: \${JSON.stringify(
|
|
4799
|
+
response
|
|
4800
|
+
)}\`
|
|
4801
|
+
);
|
|
4802
|
+
}
|
|
4803
|
+
}
|
|
4804
|
+
if (viewport.disabled) {
|
|
4805
|
+
this.disableViewport(viewport);
|
|
4806
|
+
}
|
|
4807
|
+
if (viewportStatus === "subscribing" && // A session table will never have Visual Links, nor Context Menus
|
|
4808
|
+
!isSessionTable(viewport.table)) {
|
|
4809
|
+
this.sendMessageToServer({
|
|
4810
|
+
type: GET_VP_VISUAL_LINKS,
|
|
4811
|
+
vpId: serverViewportId
|
|
4812
|
+
});
|
|
4813
|
+
this.sendMessageToServer({
|
|
4814
|
+
type: GET_VIEW_PORT_MENUS,
|
|
4815
|
+
vpId: serverViewportId
|
|
4816
|
+
});
|
|
4817
|
+
Array.from(viewports.entries()).filter(
|
|
4818
|
+
([id, { disabled }]) => id !== serverViewportId && !disabled
|
|
4819
|
+
).forEach(([vpId]) => {
|
|
4820
|
+
this.sendMessageToServer({
|
|
4821
|
+
type: GET_VP_VISUAL_LINKS,
|
|
4822
|
+
vpId
|
|
4823
|
+
});
|
|
4824
|
+
});
|
|
4825
|
+
}
|
|
4826
|
+
}
|
|
4827
|
+
}
|
|
4828
|
+
break;
|
|
4829
|
+
case "REMOVE_VP_SUCCESS":
|
|
4830
|
+
{
|
|
4831
|
+
const viewport = this.viewports.get(body.viewPortId);
|
|
4832
|
+
if (viewport) {
|
|
4833
|
+
this.mapClientToServerViewport.delete(viewport.clientViewportId);
|
|
4834
|
+
viewports.delete(body.viewPortId);
|
|
4835
|
+
this.removeViewportFromVisualLinks(body.viewPortId);
|
|
4836
|
+
}
|
|
4837
|
+
}
|
|
4838
|
+
break;
|
|
4839
|
+
case SET_SELECTION_SUCCESS:
|
|
4840
|
+
{
|
|
4841
|
+
const viewport = this.viewports.get(body.vpId);
|
|
4842
|
+
if (viewport) {
|
|
4843
|
+
viewport.completeOperation(requestId);
|
|
4844
|
+
}
|
|
4845
|
+
}
|
|
4846
|
+
break;
|
|
4847
|
+
case CHANGE_VP_SUCCESS:
|
|
4848
|
+
case DISABLE_VP_SUCCESS:
|
|
4849
|
+
if (viewports.has(body.viewPortId)) {
|
|
4850
|
+
const viewport = this.viewports.get(body.viewPortId);
|
|
4851
|
+
if (viewport) {
|
|
4852
|
+
const response = viewport.completeOperation(requestId);
|
|
4853
|
+
if (response !== void 0) {
|
|
4854
|
+
this.postMessageToClient(response);
|
|
4855
|
+
if (debugEnabled4) {
|
|
4856
|
+
debug4(\`postMessageToClient \${JSON.stringify(response)}\`);
|
|
4857
|
+
}
|
|
4858
|
+
}
|
|
4859
|
+
}
|
|
4860
|
+
}
|
|
4861
|
+
break;
|
|
4862
|
+
case ENABLE_VP_SUCCESS:
|
|
4863
|
+
{
|
|
4864
|
+
const viewport = this.viewports.get(body.viewPortId);
|
|
4865
|
+
if (viewport) {
|
|
4866
|
+
const response = viewport.completeOperation(requestId);
|
|
4867
|
+
if (response) {
|
|
4868
|
+
this.postMessageToClient(response);
|
|
4869
|
+
const rows = viewport.currentData();
|
|
4870
|
+
debugEnabled4 && debug4(
|
|
4871
|
+
\`Enable Response (ServerProxy to Client): \${JSON.stringify(
|
|
4872
|
+
response
|
|
4873
|
+
)}\`
|
|
4874
|
+
);
|
|
4875
|
+
if (viewport.size === 0) {
|
|
4876
|
+
debugEnabled4 && debug4(\`Viewport Enabled but size 0, resend to server\`);
|
|
4877
|
+
} else {
|
|
4878
|
+
this.postMessageToClient({
|
|
4879
|
+
clientViewportId: viewport.clientViewportId,
|
|
4880
|
+
mode: "batch",
|
|
4881
|
+
rows,
|
|
4882
|
+
size: viewport.size,
|
|
4883
|
+
type: "viewport-update"
|
|
4884
|
+
});
|
|
4885
|
+
debugEnabled4 && debug4(
|
|
4886
|
+
\`Enable Response (ServerProxy to Client): send size \${viewport.size} \${rows.length} rows from cache\`
|
|
4887
|
+
);
|
|
4888
|
+
}
|
|
4889
|
+
}
|
|
4890
|
+
}
|
|
4891
|
+
}
|
|
4892
|
+
break;
|
|
4893
|
+
case TABLE_ROW:
|
|
4894
|
+
{
|
|
4895
|
+
const viewportRowMap = groupRowsByViewport(body.rows);
|
|
4896
|
+
if (debugEnabled4) {
|
|
4897
|
+
const [firstRow, secondRow] = body.rows;
|
|
4898
|
+
if (body.rows.length === 0) {
|
|
4899
|
+
debug4("handleMessageFromServer TABLE_ROW 0 rows");
|
|
4900
|
+
} else if ((firstRow == null ? void 0 : firstRow.rowIndex) === -1) {
|
|
4901
|
+
if (body.rows.length === 1) {
|
|
4902
|
+
if (firstRow.updateType === "SIZE") {
|
|
4903
|
+
debug4(
|
|
4904
|
+
\`handleMessageFromServer [\${firstRow.viewPortId}] TABLE_ROW SIZE ONLY \${firstRow.vpSize}\`
|
|
4905
|
+
);
|
|
4906
|
+
} else {
|
|
4907
|
+
debug4(
|
|
4908
|
+
\`handleMessageFromServer [\${firstRow.viewPortId}] TABLE_ROW SIZE \${firstRow.vpSize} rowIdx \${firstRow.rowIndex}\`
|
|
4909
|
+
);
|
|
4910
|
+
}
|
|
4911
|
+
} else {
|
|
4912
|
+
debug4(
|
|
4913
|
+
\`handleMessageFromServer TABLE_ROW \${body.rows.length} rows, SIZE \${firstRow.vpSize}, [\${secondRow == null ? void 0 : secondRow.rowIndex}] - [\${(_b = body.rows[body.rows.length - 1]) == null ? void 0 : _b.rowIndex}]\`
|
|
4914
|
+
);
|
|
4915
|
+
}
|
|
4916
|
+
} else {
|
|
4917
|
+
debug4(
|
|
4918
|
+
\`handleMessageFromServer TABLE_ROW \${body.rows.length} rows [\${firstRow == null ? void 0 : firstRow.rowIndex}] - [\${(_c = body.rows[body.rows.length - 1]) == null ? void 0 : _c.rowIndex}]\`
|
|
4919
|
+
);
|
|
4920
|
+
}
|
|
4921
|
+
}
|
|
4922
|
+
for (const [viewportId, rows] of Object.entries(viewportRowMap)) {
|
|
4923
|
+
const viewport = viewports.get(viewportId);
|
|
4924
|
+
if (viewport) {
|
|
4925
|
+
viewport.updateRows(rows);
|
|
4926
|
+
} else {
|
|
4927
|
+
warn3 == null ? void 0 : warn3(
|
|
4928
|
+
\`TABLE_ROW message received for non registered viewport \${viewportId}\`
|
|
4929
|
+
);
|
|
4930
|
+
}
|
|
4931
|
+
}
|
|
4932
|
+
this.processUpdates();
|
|
4933
|
+
}
|
|
4934
|
+
break;
|
|
4935
|
+
case CHANGE_VP_RANGE_SUCCESS:
|
|
4936
|
+
{
|
|
4937
|
+
const viewport = this.viewports.get(body.viewPortId);
|
|
4938
|
+
if (viewport) {
|
|
4939
|
+
const { from, to } = body;
|
|
4940
|
+
if (true) {
|
|
4941
|
+
info3 == null ? void 0 : info3(\`CHANGE_VP_RANGE_SUCCESS \${from} - \${to}\`);
|
|
4942
|
+
}
|
|
4943
|
+
viewport.completeOperation(requestId, from, to);
|
|
4944
|
+
}
|
|
4945
|
+
}
|
|
4946
|
+
break;
|
|
4947
|
+
case OPEN_TREE_SUCCESS:
|
|
4948
|
+
case CLOSE_TREE_SUCCESS:
|
|
4949
|
+
break;
|
|
4950
|
+
case "CREATE_VISUAL_LINK_SUCCESS":
|
|
4951
|
+
{
|
|
4952
|
+
const viewport = this.viewports.get(body.childVpId);
|
|
4953
|
+
const parentViewport = this.viewports.get(body.parentVpId);
|
|
4954
|
+
if (viewport && parentViewport) {
|
|
4955
|
+
const { childColumnName, parentColumnName } = body;
|
|
4956
|
+
const response = viewport.completeOperation(
|
|
4957
|
+
requestId,
|
|
4958
|
+
childColumnName,
|
|
4959
|
+
parentViewport.clientViewportId,
|
|
4960
|
+
parentColumnName
|
|
4961
|
+
);
|
|
4962
|
+
if (response) {
|
|
4963
|
+
this.postMessageToClient(response);
|
|
4964
|
+
}
|
|
4965
|
+
}
|
|
4966
|
+
}
|
|
4967
|
+
break;
|
|
4968
|
+
case "REMOVE_VISUAL_LINK_SUCCESS":
|
|
4969
|
+
{
|
|
4970
|
+
const viewport = this.viewports.get(body.childVpId);
|
|
4971
|
+
if (viewport) {
|
|
4972
|
+
const response = viewport.completeOperation(
|
|
4973
|
+
requestId
|
|
4974
|
+
);
|
|
4975
|
+
if (response) {
|
|
4976
|
+
this.postMessageToClient(response);
|
|
4977
|
+
}
|
|
4978
|
+
}
|
|
4979
|
+
}
|
|
4980
|
+
break;
|
|
4981
|
+
case TABLE_LIST_RESP:
|
|
4982
|
+
this.postMessageToClient({
|
|
4983
|
+
type: TABLE_LIST_RESP,
|
|
4984
|
+
tables: body.tables,
|
|
4985
|
+
requestId
|
|
4986
|
+
});
|
|
4987
|
+
break;
|
|
4988
|
+
case TABLE_META_RESP:
|
|
4989
|
+
{
|
|
4990
|
+
const tableSchema = this.cacheTableMeta(body);
|
|
4991
|
+
const clientViewportId = this.pendingTableMetaRequests.get(requestId);
|
|
4992
|
+
if (clientViewportId) {
|
|
4993
|
+
this.pendingTableMetaRequests.delete(requestId);
|
|
4994
|
+
const viewport = this.viewports.get(clientViewportId);
|
|
4995
|
+
if (viewport) {
|
|
4996
|
+
viewport.setTableSchema(tableSchema);
|
|
4997
|
+
} else {
|
|
4998
|
+
warn3 == null ? void 0 : warn3(
|
|
4999
|
+
"Message has come back AFTER CREATE_VP_SUCCESS, what do we do now"
|
|
5000
|
+
);
|
|
5001
|
+
}
|
|
5002
|
+
} else {
|
|
5003
|
+
this.postMessageToClient({
|
|
5004
|
+
type: TABLE_META_RESP,
|
|
5005
|
+
tableSchema,
|
|
5006
|
+
requestId
|
|
5007
|
+
});
|
|
5008
|
+
}
|
|
5009
|
+
}
|
|
5010
|
+
break;
|
|
5011
|
+
case "VP_VISUAL_LINKS_RESP":
|
|
5012
|
+
{
|
|
5013
|
+
const activeLinkDescriptors = this.getActiveLinks(body.links);
|
|
5014
|
+
const viewport = this.viewports.get(body.vpId);
|
|
5015
|
+
if (activeLinkDescriptors.length && viewport) {
|
|
5016
|
+
const linkDescriptorsWithLabels = addLabelsToLinks(
|
|
5017
|
+
activeLinkDescriptors,
|
|
5018
|
+
this.viewports
|
|
5019
|
+
);
|
|
5020
|
+
const [clientMessage, pendingLink] = viewport.setLinks(
|
|
5021
|
+
linkDescriptorsWithLabels
|
|
5022
|
+
);
|
|
5023
|
+
this.postMessageToClient(clientMessage);
|
|
5024
|
+
if (pendingLink) {
|
|
5025
|
+
const { link, parentClientVpId } = pendingLink;
|
|
5026
|
+
const requestId2 = nextRequestId();
|
|
5027
|
+
const serverViewportId = this.mapClientToServerViewport.get(parentClientVpId);
|
|
5028
|
+
if (serverViewportId) {
|
|
5029
|
+
const message2 = viewport.createLink(
|
|
5030
|
+
requestId2,
|
|
5031
|
+
link.fromColumn,
|
|
5032
|
+
serverViewportId,
|
|
5033
|
+
link.toColumn
|
|
5034
|
+
);
|
|
5035
|
+
this.sendMessageToServer(message2, requestId2);
|
|
5036
|
+
}
|
|
5037
|
+
}
|
|
5038
|
+
}
|
|
5039
|
+
}
|
|
5040
|
+
break;
|
|
5041
|
+
case "VIEW_PORT_MENUS_RESP":
|
|
5042
|
+
if (body.menu.name) {
|
|
5043
|
+
const viewport = this.viewports.get(body.vpId);
|
|
5044
|
+
if (viewport) {
|
|
5045
|
+
const clientMessage = viewport.setMenu(body.menu);
|
|
5046
|
+
this.postMessageToClient(clientMessage);
|
|
5047
|
+
}
|
|
5048
|
+
}
|
|
5049
|
+
break;
|
|
5050
|
+
case "VP_EDIT_RPC_RESPONSE":
|
|
5051
|
+
{
|
|
5052
|
+
this.postMessageToClient({
|
|
5053
|
+
action: body.action,
|
|
5054
|
+
requestId,
|
|
5055
|
+
rpcName: body.rpcName,
|
|
5056
|
+
type: "VP_EDIT_RPC_RESPONSE"
|
|
5057
|
+
});
|
|
5058
|
+
}
|
|
5059
|
+
break;
|
|
5060
|
+
case "VP_EDIT_RPC_REJECT":
|
|
5061
|
+
{
|
|
5062
|
+
const viewport = this.viewports.get(body.vpId);
|
|
5063
|
+
if (viewport) {
|
|
5064
|
+
this.postMessageToClient({
|
|
5065
|
+
requestId,
|
|
5066
|
+
type: "VP_EDIT_RPC_REJECT",
|
|
5067
|
+
error: body.error
|
|
5068
|
+
});
|
|
5069
|
+
}
|
|
5070
|
+
}
|
|
5071
|
+
break;
|
|
5072
|
+
case "VIEW_PORT_MENU_RESP":
|
|
5073
|
+
{
|
|
5074
|
+
if (isSessionTableActionMessage(body)) {
|
|
5075
|
+
const { action, rpcName } = body;
|
|
5076
|
+
this.awaitResponseToMessage({
|
|
5077
|
+
type: "GET_TABLE_META",
|
|
5078
|
+
table: action.table
|
|
5079
|
+
}).then((response) => {
|
|
5080
|
+
const tableSchema = createSchemaFromTableMetadata(
|
|
5081
|
+
response
|
|
5082
|
+
);
|
|
5083
|
+
this.postMessageToClient({
|
|
5084
|
+
rpcName,
|
|
5085
|
+
type: "VIEW_PORT_MENU_RESP",
|
|
5086
|
+
action: {
|
|
5087
|
+
...action,
|
|
5088
|
+
tableSchema
|
|
5089
|
+
},
|
|
5090
|
+
tableAlreadyOpen: this.isTableOpen(action.table),
|
|
5091
|
+
requestId
|
|
5092
|
+
});
|
|
5093
|
+
});
|
|
5094
|
+
} else {
|
|
5095
|
+
const { action } = body;
|
|
5096
|
+
this.postMessageToClient({
|
|
5097
|
+
type: "VIEW_PORT_MENU_RESP",
|
|
5098
|
+
action: action || NO_ACTION,
|
|
5099
|
+
tableAlreadyOpen: action !== null && this.isTableOpen(action.table),
|
|
5100
|
+
requestId
|
|
5101
|
+
});
|
|
5102
|
+
}
|
|
5103
|
+
}
|
|
5104
|
+
break;
|
|
5105
|
+
case RPC_RESP:
|
|
5106
|
+
{
|
|
5107
|
+
const { method, result } = body;
|
|
5108
|
+
this.postMessageToClient({
|
|
5109
|
+
type: RPC_RESP,
|
|
5110
|
+
method,
|
|
5111
|
+
result,
|
|
5112
|
+
requestId
|
|
5113
|
+
});
|
|
5114
|
+
}
|
|
5115
|
+
break;
|
|
5116
|
+
case "ERROR":
|
|
5117
|
+
error3(body.msg);
|
|
5118
|
+
break;
|
|
5119
|
+
default:
|
|
5120
|
+
infoEnabled3 && info3(\`handleMessageFromServer \${body["type"]}.\`);
|
|
5121
|
+
}
|
|
5122
|
+
}
|
|
5123
|
+
hasSchemaForTable(table) {
|
|
5124
|
+
return this.cachedTableSchemas.has(\`\${table.module}:\${table.table}\`);
|
|
5125
|
+
}
|
|
5126
|
+
cacheTableMeta(messageBody) {
|
|
5127
|
+
const { module, table } = messageBody.table;
|
|
5128
|
+
const key = \`\${module}:\${table}\`;
|
|
5129
|
+
let tableSchema = this.cachedTableSchemas.get(key);
|
|
5130
|
+
if (!tableSchema) {
|
|
5131
|
+
tableSchema = createSchemaFromTableMetadata(messageBody);
|
|
5132
|
+
this.cachedTableSchemas.set(key, tableSchema);
|
|
5133
|
+
}
|
|
5134
|
+
return tableSchema;
|
|
5135
|
+
}
|
|
5136
|
+
isTableOpen(table) {
|
|
5137
|
+
if (table) {
|
|
5138
|
+
const tableName = table.table;
|
|
5139
|
+
for (const viewport of this.viewports.values()) {
|
|
5140
|
+
if (!viewport.suspended && viewport.table.table === tableName) {
|
|
5141
|
+
return true;
|
|
5142
|
+
}
|
|
5143
|
+
}
|
|
5144
|
+
}
|
|
5145
|
+
}
|
|
5146
|
+
// Eliminate links to suspended viewports
|
|
5147
|
+
getActiveLinks(linkDescriptors) {
|
|
5148
|
+
return linkDescriptors.filter((linkDescriptor) => {
|
|
5149
|
+
const viewport = this.viewports.get(linkDescriptor.parentVpId);
|
|
5150
|
+
return viewport && !viewport.suspended;
|
|
5151
|
+
});
|
|
5152
|
+
}
|
|
5153
|
+
processUpdates() {
|
|
5154
|
+
this.viewports.forEach((viewport) => {
|
|
5155
|
+
var _a;
|
|
5156
|
+
if (viewport.hasUpdatesToProcess) {
|
|
5157
|
+
const [rows, mode] = viewport.getClientRows();
|
|
5158
|
+
const size = viewport.getNewRowCount();
|
|
5159
|
+
if (size !== void 0 || rows && rows.length > 0) {
|
|
5160
|
+
debugEnabled4 && debug4(
|
|
5161
|
+
\`postMessageToClient #\${viewport.clientViewportId} viewport-update \${mode}, \${(_a = rows == null ? void 0 : rows.length) != null ? _a : "no"} rows, size \${size}\`
|
|
5162
|
+
);
|
|
5163
|
+
this.postMessageToClient({
|
|
5164
|
+
clientViewportId: viewport.clientViewportId,
|
|
5165
|
+
mode,
|
|
5166
|
+
rows,
|
|
5167
|
+
size,
|
|
5168
|
+
type: "viewport-update"
|
|
5169
|
+
});
|
|
5170
|
+
}
|
|
5171
|
+
}
|
|
5172
|
+
});
|
|
5173
|
+
}
|
|
5174
|
+
};
|
|
5175
|
+
|
|
5176
|
+
// src/worker.ts
|
|
5177
|
+
var server;
|
|
5178
|
+
var { info: info4, infoEnabled: infoEnabled4 } = logger("worker");
|
|
5179
|
+
async function connectToServer(url, protocol, token, username, onConnectionStatusChange) {
|
|
5180
|
+
const connection = await connect(
|
|
5181
|
+
url,
|
|
5182
|
+
protocol,
|
|
5183
|
+
// if this was called during connect, we would get a ReferenceError, but it will
|
|
5184
|
+
// never be called until subscriptions have been made, so this is safe.
|
|
5185
|
+
//TODO do we need to listen in to the connection messages here so we can lock back in, in the event of a reconnenct ?
|
|
5186
|
+
(msg) => {
|
|
5187
|
+
if (isConnectionQualityMetrics(msg))
|
|
5188
|
+
postMessage({ type: "connection-metrics", messages: msg });
|
|
5189
|
+
else if (isConnectionStatusMessage(msg)) {
|
|
5190
|
+
onConnectionStatusChange(msg);
|
|
5191
|
+
if (msg.status === "reconnected") {
|
|
5192
|
+
server.reconnect();
|
|
5193
|
+
}
|
|
5194
|
+
} else {
|
|
5195
|
+
server.handleMessageFromServer(msg);
|
|
5196
|
+
}
|
|
5197
|
+
}
|
|
5198
|
+
);
|
|
5199
|
+
server = new ServerProxy(connection, (msg) => sendMessageToClient(msg));
|
|
5200
|
+
if (connection.requiresLogin) {
|
|
5201
|
+
await server.login(token, username);
|
|
5202
|
+
}
|
|
5203
|
+
}
|
|
5204
|
+
function sendMessageToClient(message) {
|
|
5205
|
+
postMessage(message);
|
|
5206
|
+
}
|
|
5207
|
+
var handleMessageFromClient = async ({
|
|
5208
|
+
data: message
|
|
5209
|
+
}) => {
|
|
5210
|
+
switch (message.type) {
|
|
5211
|
+
case "connect":
|
|
5212
|
+
await connectToServer(
|
|
5213
|
+
message.url,
|
|
5214
|
+
message.protocol,
|
|
5215
|
+
message.token,
|
|
5216
|
+
message.username,
|
|
5217
|
+
postMessage
|
|
5218
|
+
);
|
|
5219
|
+
postMessage({ type: "connected" });
|
|
5220
|
+
break;
|
|
5221
|
+
case "subscribe":
|
|
5222
|
+
infoEnabled4 && info4(\`client subscribe: \${JSON.stringify(message)}\`);
|
|
5223
|
+
server.subscribe(message);
|
|
5224
|
+
break;
|
|
5225
|
+
case "unsubscribe":
|
|
5226
|
+
infoEnabled4 && info4(\`client unsubscribe: \${JSON.stringify(message)}\`);
|
|
5227
|
+
server.unsubscribe(message.viewport);
|
|
5228
|
+
break;
|
|
5229
|
+
default:
|
|
5230
|
+
infoEnabled4 && info4(\`client message: \${JSON.stringify(message)}\`);
|
|
5231
|
+
server.handleMessageFromClient(message);
|
|
5232
|
+
}
|
|
5233
|
+
};
|
|
5234
|
+
self.addEventListener("message", handleMessageFromClient);
|
|
5235
|
+
postMessage({ type: "ready" });
|
|
2838
5236
|
|
|
2839
5237
|
`;
|
|
2840
5238
|
|
|
@@ -4603,26 +7001,58 @@ var Stack3 = class {
|
|
|
4603
7001
|
// be done.
|
|
4604
7002
|
/// @internal
|
|
4605
7003
|
forceReduce() {
|
|
4606
|
-
let
|
|
7004
|
+
let { parser: parser2 } = this.p;
|
|
7005
|
+
let reduce = parser2.stateSlot(
|
|
4607
7006
|
this.state,
|
|
4608
7007
|
5
|
|
4609
7008
|
/* ParseState.ForcedReduce */
|
|
4610
7009
|
);
|
|
4611
7010
|
if ((reduce & 65536) == 0)
|
|
4612
7011
|
return false;
|
|
4613
|
-
let { parser: parser2 } = this.p;
|
|
4614
7012
|
if (!parser2.validAction(this.state, reduce)) {
|
|
4615
7013
|
let depth = reduce >> 19, term = reduce & 65535;
|
|
4616
7014
|
let target = this.stack.length - depth * 3;
|
|
4617
|
-
if (target < 0 || parser2.getGoto(this.stack[target], term, false) < 0)
|
|
4618
|
-
|
|
4619
|
-
|
|
7015
|
+
if (target < 0 || parser2.getGoto(this.stack[target], term, false) < 0) {
|
|
7016
|
+
let backup = this.findForcedReduction();
|
|
7017
|
+
if (backup == null)
|
|
7018
|
+
return false;
|
|
7019
|
+
reduce = backup;
|
|
7020
|
+
}
|
|
7021
|
+
this.storeNode(0, this.pos, this.pos, 4, true);
|
|
4620
7022
|
this.score -= 100;
|
|
4621
7023
|
}
|
|
4622
7024
|
this.reducePos = this.pos;
|
|
4623
7025
|
this.reduce(reduce);
|
|
4624
7026
|
return true;
|
|
4625
7027
|
}
|
|
7028
|
+
/// Try to scan through the automaton to find some kind of reduction
|
|
7029
|
+
/// that can be applied. Used when the regular ForcedReduce field
|
|
7030
|
+
/// isn't a valid action. @internal
|
|
7031
|
+
findForcedReduction() {
|
|
7032
|
+
let { parser: parser2 } = this.p, seen = [];
|
|
7033
|
+
let explore = (state, depth) => {
|
|
7034
|
+
if (seen.includes(state))
|
|
7035
|
+
return;
|
|
7036
|
+
seen.push(state);
|
|
7037
|
+
return parser2.allActions(state, (action) => {
|
|
7038
|
+
if (action & (262144 | 131072))
|
|
7039
|
+
;
|
|
7040
|
+
else if (action & 65536) {
|
|
7041
|
+
let rDepth = (action >> 19) - depth;
|
|
7042
|
+
if (rDepth > 1) {
|
|
7043
|
+
let term = action & 65535, target = this.stack.length - rDepth * 3;
|
|
7044
|
+
if (target >= 0 && parser2.getGoto(this.stack[target], term, false) >= 0)
|
|
7045
|
+
return rDepth << 19 | 65536 | term;
|
|
7046
|
+
}
|
|
7047
|
+
} else {
|
|
7048
|
+
let found = explore(action, depth + 1);
|
|
7049
|
+
if (found != null)
|
|
7050
|
+
return found;
|
|
7051
|
+
}
|
|
7052
|
+
});
|
|
7053
|
+
};
|
|
7054
|
+
return explore(this.state, 0);
|
|
7055
|
+
}
|
|
4626
7056
|
/// @internal
|
|
4627
7057
|
forceAll() {
|
|
4628
7058
|
while (!this.p.parser.stateFlag(
|
|
@@ -4691,13 +7121,13 @@ var Stack3 = class {
|
|
|
4691
7121
|
emitContext() {
|
|
4692
7122
|
let last = this.buffer.length - 1;
|
|
4693
7123
|
if (last < 0 || this.buffer[last] != -3)
|
|
4694
|
-
this.buffer.push(this.curContext.hash, this.
|
|
7124
|
+
this.buffer.push(this.curContext.hash, this.pos, this.pos, -3);
|
|
4695
7125
|
}
|
|
4696
7126
|
/// @internal
|
|
4697
7127
|
emitLookAhead() {
|
|
4698
7128
|
let last = this.buffer.length - 1;
|
|
4699
7129
|
if (last < 0 || this.buffer[last] != -4)
|
|
4700
|
-
this.buffer.push(this.lookAhead, this.
|
|
7130
|
+
this.buffer.push(this.lookAhead, this.pos, this.pos, -4);
|
|
4701
7131
|
}
|
|
4702
7132
|
updateContext(context) {
|
|
4703
7133
|
if (context != this.curContext.context) {
|
|
@@ -5054,16 +7484,17 @@ var LocalTokenGroup = class {
|
|
|
5054
7484
|
token(input, stack) {
|
|
5055
7485
|
let start2 = input.pos, skipped = 0;
|
|
5056
7486
|
for (; ; ) {
|
|
7487
|
+
let atEof = input.next < 0, nextPos = input.resolveOffset(1, 1);
|
|
5057
7488
|
readToken(this.data, input, stack, 0, this.data, this.precTable);
|
|
5058
7489
|
if (input.token.value > -1)
|
|
5059
7490
|
break;
|
|
5060
7491
|
if (this.elseToken == null)
|
|
5061
7492
|
return;
|
|
5062
|
-
if (
|
|
7493
|
+
if (!atEof)
|
|
7494
|
+
skipped++;
|
|
7495
|
+
if (nextPos == null)
|
|
5063
7496
|
break;
|
|
5064
|
-
input.
|
|
5065
|
-
input.reset(input.pos, input.token);
|
|
5066
|
-
skipped++;
|
|
7497
|
+
input.reset(nextPos, input.token);
|
|
5067
7498
|
}
|
|
5068
7499
|
if (skipped) {
|
|
5069
7500
|
input.reset(start2, input.token);
|
|
@@ -5776,26 +8207,30 @@ var LRParser = class extends Parser {
|
|
|
5776
8207
|
}
|
|
5777
8208
|
/// @internal
|
|
5778
8209
|
validAction(state, action) {
|
|
5779
|
-
|
|
8210
|
+
return !!this.allActions(state, (a) => a == action ? true : null);
|
|
8211
|
+
}
|
|
8212
|
+
/// @internal
|
|
8213
|
+
allActions(state, action) {
|
|
8214
|
+
let deflt = this.stateSlot(
|
|
5780
8215
|
state,
|
|
5781
8216
|
4
|
|
5782
8217
|
/* ParseState.DefaultReduce */
|
|
5783
|
-
)
|
|
5784
|
-
|
|
8218
|
+
);
|
|
8219
|
+
let result = deflt ? action(deflt) : void 0;
|
|
5785
8220
|
for (let i = this.stateSlot(
|
|
5786
8221
|
state,
|
|
5787
8222
|
1
|
|
5788
8223
|
/* ParseState.Actions */
|
|
5789
|
-
); ; i += 3) {
|
|
8224
|
+
); result == null; i += 3) {
|
|
5790
8225
|
if (this.data[i] == 65535) {
|
|
5791
8226
|
if (this.data[i + 1] == 1)
|
|
5792
8227
|
i = pair(this.data, i + 2);
|
|
5793
8228
|
else
|
|
5794
|
-
|
|
8229
|
+
break;
|
|
5795
8230
|
}
|
|
5796
|
-
|
|
5797
|
-
return true;
|
|
8231
|
+
result = action(pair(this.data, i + 1));
|
|
5798
8232
|
}
|
|
8233
|
+
return result;
|
|
5799
8234
|
}
|
|
5800
8235
|
/// Get the states that can follow this one through shift actions or
|
|
5801
8236
|
/// goto jumps. @internal
|