@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/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 ge=(r,e,t)=>{if(!e.has(r))throw TypeError("Cannot "+t)};var c=(r,e,t)=>(ge(r,e,"read from private field"),t?t.call(r):e.get(r)),N=(r,e,t)=>{if(e.has(r))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(r):e.set(r,t)},de=(r,e,t,n)=>(ge(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t);function fe(r,e,t=[],n=[]){for(let s=0,o=r.length;s<o;s++)(e(r[s],s)?t:n).push(r[s]);return[t,n]}var w={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:6,SELECTED:7,count:8,PARENT_IDX:"parent_idx",IDX_POINTER:"idx_pointer",FILTER_COUNT:"filter_count",NEXT_FILTER_IDX:"next_filter_idx"};var{DEPTH:$t,IS_LEAF:Gt}=w;var he=r=>{var e,t;if(((e=globalThis.document)==null?void 0:e.cookie)!==void 0)return(t=globalThis.document.cookie.split("; ").find(n=>n.startsWith(\`\${r}=\`)))==null?void 0:t.split("=")[1]};function z({from:r,to:e},t=0,n=Number.MAX_SAFE_INTEGER){if(t===0)return n<r?{from:0,to:0}:{from:r,to:Math.min(e,n)};if(r===0)return{from:r,to:Math.min(e+t,n)};{let s=e-r,o=Math.round(t/2),i=r-o<0,u=n-(e+o)<0;return i&&u?{from:0,to:n}:i?{from:0,to:s+t}:u?{from:Math.max(0,n-(s+t)),to:n}:{from:r-o,to:e+o}}}var rt=(r,{from:e,to:t})=>r>=e&&r<t;var I=class{constructor(e,t){this.from=e,this.to=t}isWithin(e){return rt(e,this)}overlap(e,t){return e>=this.to||t<this.from?[0,0]:[Math.max(e,this.from),Math.min(t,this.to)]}copy(){return new I(this.from,this.to)}};var{KEY:Yt}=w;var ot=["error","warn","info","debug"],it=r=>typeof r=="string"&&ot.includes(r),at="error",F=()=>{},ut="error",{loggingLevel:W=ut}=lt(),T=r=>{let e=W==="debug",t=e||W==="info",n=t||W==="warn",s=n||W==="error",o=t?f=>console.info(\`[\${r}] \${f}\`):F,i=n?f=>console.warn(\`[\${r}] \${f}\`):F,u=e?f=>console.debug(\`[\${r}] \${f}\`):F;return{errorEnabled:s,error:s?f=>console.error(\`[\${r}] \${f}\`):F}};function lt(){return typeof loggingSettings<"u"?loggingSettings:{loggingLevel:ct()}}function ct(){let r=he("vuu-logging-level");return it(r)?r:at}var{debug:pt,debugEnabled:gt}=T("range-monitor"),q=class{constructor(e){this.source=e;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:e,to:t}){let{timestamp:n}=this;if(this.range.from=e,this.range.to=t,this.timestamp=performance.now(),n)gt&&pt(\`<\${this.source}> [\${e}-\${t}], \${(this.timestamp-n).toFixed(0)} ms elapsed\`);else return 0}};function me(r){return Array.isArray(r)}function dt(r){return!Array.isArray(r)}var S,Ce=class{constructor(){N(this,S,new Map)}addListener(e,t){let n=c(this,S).get(e);n?me(n)?n.push(t):dt(n)&&c(this,S).set(e,[n,t]):c(this,S).set(e,t)}removeListener(e,t){if(!c(this,S).has(e))return;let n=c(this,S).get(e),s=-1;if(n===t)c(this,S).delete(e);else if(Array.isArray(n)){for(let o=length;o-- >0;)if(n[o]===t){s=o;break}if(s<0)return;n.length===1?(n.length=0,c(this,S).delete(e)):n.splice(s,1)}}removeAllListeners(e){e&&c(this,S).has(e)?c(this,S).delete(e):e===void 0&&c(this,S).clear()}emit(e,...t){if(c(this,S)){let n=c(this,S).get(e);n&&this.invokeHandler(n,t)}}once(e,t){let n=(...s)=>{this.removeListener(e,n),t(...s)};this.on(e,n)}on(e,t){this.addListener(e,t)}invokeHandler(e,t){if(me(e))e.slice().forEach(n=>this.invokeHandler(n,t));else switch(t.length){case 0:e();break;case 1:e(t[0]);break;case 2:e(t[0],t[1]);break;default:e.call(null,...t)}}};S=new WeakMap;var $=String.fromCharCode(8200),h=String.fromCharCode(8199);var un={DIGIT:h,TWO_DIGITS:h+h,THREE_DIGITS:h+h+h,FULL_PADDING:[null,$+h,$+h+h,$+h+h+h,$+h+h+h+h]};var ln=h+h+h+h+h+h+h+h+h;var ft={Enter:"Enter",Delete:"Delete"},ht={Home:"Home",End:"End",ArrowRight:"ArrowRight",ArrowLeft:"ArrowLeft",ArrowDown:"ArrowDown",ArrowUp:"ArrowUp",Tab:"Tab"},mt={F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12"},En={...ft,...ht,...mt};var{COUNT:vn}=w;var G=class{constructor(e){this.keys=new Map,this.free=[],this.nextKeyValue=0,this.reset(e)}next(){return this.free.length>0?this.free.pop():this.nextKeyValue++}reset({from:e,to:t}){this.keys.forEach((s,o)=>{(o<e||o>=t)&&(this.free.push(s),this.keys.delete(o))});let n=t-e;this.keys.size+this.free.length>n&&(this.free.length=Math.max(0,n-this.keys.size));for(let s=e;s<t;s++)if(!this.keys.has(s)){let o=this.next();this.keys.set(s,o)}this.nextKeyValue>this.keys.size&&(this.nextKeyValue=this.keys.size)}keyFor(e){let t=this.keys.get(e);if(t===void 0)throw console.log(\`key not found
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 reduce = this.p.parser.stateSlot(
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
- return false;
4619
- this.storeNode(0, this.reducePos, this.reducePos, 4, true);
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.reducePos, this.reducePos, -3);
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.reducePos, this.reducePos, -4);
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 (input.next < 0)
7493
+ if (!atEof)
7494
+ skipped++;
7495
+ if (nextPos == null)
5063
7496
  break;
5064
- input.advance();
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
- if (action == this.stateSlot(
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
- return true;
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
- return false;
8229
+ break;
5795
8230
  }
5796
- if (action == pair(this.data, i + 1))
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