@vuu-ui/vuu-data-remote 4.1.0 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,24 +1,23 @@
1
1
  {
2
- "version": "4.1.0",
2
+ "version": "4.1.1",
3
3
  "main": "./src/index.js",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
6
  "scripts": {
7
7
  "build": "node ../../scripts/build-worker.ts && node ../../scripts/run-build-rslib.ts",
8
- "build:dev": "node ../../scripts/build-worker.ts && node ../../scripts/run-build.mjs -- --dev",
9
8
  "build:worker": "node ../../scripts/build-worker.ts",
10
9
  "test": "vitest run",
11
10
  "type-defs": "node ../../scripts/build-type-defs.mjs"
12
11
  },
13
12
  "devDependencies": {
14
- "@vuu-ui/vuu-data-types": "4.1.0",
15
- "@vuu-ui/vuu-table-types": "4.1.0",
16
- "@vuu-ui/vuu-filter-types": "4.1.0",
17
- "@vuu-ui/vuu-protocol-types": "4.1.0"
13
+ "@vuu-ui/vuu-data-types": "4.1.1",
14
+ "@vuu-ui/vuu-table-types": "4.1.1",
15
+ "@vuu-ui/vuu-filter-types": "4.1.1",
16
+ "@vuu-ui/vuu-protocol-types": "4.1.1"
18
17
  },
19
18
  "dependencies": {
20
- "@vuu-ui/vuu-filter-parser": "4.1.0",
21
- "@vuu-ui/vuu-utils": "4.1.0"
19
+ "@vuu-ui/vuu-filter-parser": "4.1.1",
20
+ "@vuu-ui/vuu-utils": "4.1.1"
22
21
  },
23
22
  "files": [
24
23
  "README.md",
@@ -1,2 +1,2 @@
1
- const workerSourceCode = '(()=>{"use strict";const getCookieValue=name=>{if(globalThis.document?.cookie!==undefined){return globalThis.document.cookie.split("; ").find(row=>row.startsWith(`${name}=`))?.split("=")[1]}};function setCookieValue(name,value,days){let expires="";if(typeof days==="number"){const date=new Date;date.setTime(date.getTime()+days*24*60*60*1e3);expires="; expires="+date.toUTCString()}const encodedName=encodeURIComponent(name);const encodedValue=encodeURIComponent(value);document.cookie=`${encodedName}=${encodedValue}${expires};`};const logLevels=["error","warn","info","debug"];const isValidLogLevel=value=>typeof value==="string"&&logLevels.includes(value);const DEFAULT_LOG_LEVEL="error";const NO_OP=()=>undefined;const DEFAULT_DEBUG_LEVEL=false?0:"info";const{loggingLevel=DEFAULT_DEBUG_LEVEL}=getLoggingSettings();const logger=category=>{const debugEnabled=loggingLevel==="debug";const infoEnabled=debugEnabled||loggingLevel==="info";const warnEnabled=infoEnabled||loggingLevel==="warn";const errorEnabled=warnEnabled||loggingLevel==="error";const info=infoEnabled?message=>console.info(`${Date.now()} [${category}] ${message}`):NO_OP;const warn=warnEnabled?message=>console.warn(`[${category}] ${message}`):NO_OP;const debug=debugEnabled?message=>console.debug(`${Date.now()} [${category}] ${message}`):NO_OP;const error=errorEnabled?message=>console.error(`[${category}] ${message}`):NO_OP;if(false){}else{return{debugEnabled,infoEnabled,warnEnabled,errorEnabled,info,warn,debug,error}}};function getLoggingSettings(){if(typeof loggingSettings!=="undefined"){return loggingSettings}else{return{loggingLevel:getLoggingLevelFromCookie()}}}function getLoggingLevelFromCookie(){const value=getCookieValue("vuu-logging-level");if(isValidLogLevel(value)){return value}else{return DEFAULT_LOG_LEVEL}}const getLoggingConfigForWorker=()=>{return`const loggingSettings = { loggingLevel: "${getLoggingLevelFromCookie()}"};`};const logUnhandledMessage=(message,context="[logUnhandledStruct]")=>{console.log(`${context} ${JSON.stringify(message)}`)};const NoFilter=null&&{filter:""};const NoSort=null&&{sortDefs:[]};const vanillaConfig=null&&{aggregations:[],columns:[],filterSpec:NoFilter,groupBy:[],sort:NoSort};const sessionDataSourceConfig=(sourceConfig,overrideColumns)=>{if(overrideColumns===undefined){return sourceConfig}return{...vanillaConfig,columns:overrideColumns}};const assertExpectedSessionTable=(sessionTable,expectedTable)=>{if(expectedTable&&expectedTable.module!==sessionTable.module){throw Error(`[datasource-utils] session table ${sessionTable.module}/${sessionTable.table} does not match expected edit table module ${expectedTable.module}`)}};const stripVisualLink=configWithVisualLink=>{if(configWithVisualLink.visualLink){const{visualLink,...config}=configWithVisualLink;return config}else{return configWithVisualLink}};const equivalentAggregations=({aggregations:agg1},{aggregations:agg2})=>agg1===undefined&&agg2?.length===0||agg2===undefined&&agg1?.length===0;const equivalentColumns=({columns:cols1},{columns:cols2})=>cols1===undefined&&cols2?.length===0||cols2===undefined&&cols1?.length===0;const equivalentFilter=({filterSpec:f1},{filterSpec:f2})=>f1===undefined&&f2?.filter===""||f2===undefined&&f1?.filter==="";const equivalentGroupBy=({groupBy:val1},{groupBy:val2})=>val1===undefined&&val2?.length===0||val2===undefined&&val1?.length===0;const equivalentSort=({sort:s1},{sort:s2})=>s1===undefined&&s2?.sortDefs.length===0||s2===undefined&&s1?.sortDefs.length===0;const exactlyTheSame=(a,b)=>{if(a===b){return true}else if(a===undefined&&b===undefined){return true}else{return false}};const isAggregationsChanged=(config,newConfig)=>{const{aggregations:agg1}=config;const{aggregations:agg2}=newConfig;if(exactlyTheSame(agg1,agg2)||equivalentAggregations(config,newConfig)){return false}else if(agg1===undefined||agg2===undefined){return true}else if(agg1.length!==agg2.length){return true}return agg1.some(({column,aggType},i)=>column!==agg2[i].column||aggType!==agg2[i].aggType)};const isColumnsChanged=(config,newConfig)=>{const{columns:cols1}=config;const{columns:cols2}=newConfig;if(exactlyTheSame(cols1,cols2)||equivalentColumns(config,newConfig)){return false}else if(cols1===undefined||cols2===undefined){return true}else if(cols1?.length!==cols2?.length){return true}return cols1.some((column,i)=>column!==cols2?.[i])};const isBaseFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.baseFilterSpec?.filter!==c2.baseFilterSpec?.filter}};const isFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.filterSpec?.filter!==c2.filterSpec?.filter}};const isGroupByChanged=(config,newConfig)=>{const{groupBy:g1}=config;const{groupBy:g2}=newConfig;if(exactlyTheSame(g1,g2)||equivalentGroupBy(config,newConfig)){return false}else if(g1===undefined||g2===undefined){return true}else if(g1?.length!==g2?.length){return true}return g1.some((column,i)=>column!==g2?.[i])};const isSortChanged=(config,newConfig)=>{const{sort:s1}=config;const{sort:s2}=newConfig;if(exactlyTheSame(s1,s2)||equivalentSort(config,newConfig)){return false}else if(s1===undefined||s2===undefined){return true}else if(s1?.sortDefs.length!==s2?.sortDefs.length){return true}return s1.sortDefs.some(({column,sortType},i)=>column!==s2.sortDefs[i].column||sortType!==s2.sortDefs[i].sortType)};const isVisualLinkChanged=({visualLink:v1},{visualLink:v2})=>{if(exactlyTheSame(v1,v2)){return false}if(v1===undefined||v2===undefined){return true}return v1.label!==v2.label||v1.parentVpId!==v2.parentVpId};const NO_CONFIG_CHANGES=null&&{aggregationsChanged:false,baseFilterChanged:false,columnsChanged:false,filterChanged:false,groupByChanged:false,noChanges:true,sortChanged:false,visualLinkChanged:false};const isConfigChanged=(config,newConfig)=>{if(exactlyTheSame(config,newConfig)){return NO_CONFIG_CHANGES}if(config===undefined&&newConfig==undefined){return NO_CONFIG_CHANGES}else if(config===undefined){return isConfigChanged({},newConfig)}else if(newConfig===undefined){return isConfigChanged(config,{})}const aggregationsChanged=isAggregationsChanged(config,newConfig);const baseFilterChanged=isBaseFilterChanged(config,newConfig);const columnsChanged=isColumnsChanged(config,newConfig);const filterChanged=isFilterChanged(config,newConfig);const groupByChanged=isGroupByChanged(config,newConfig);const sortChanged=isSortChanged(config,newConfig);const visualLinkChanged=isVisualLinkChanged(config,newConfig);const noChanges=!(aggregationsChanged||baseFilterChanged||columnsChanged||filterChanged||groupByChanged||sortChanged||visualLinkChanged);return{aggregationsChanged,baseFilterChanged,columnsChanged,filterChanged,groupByChanged,noChanges,sortChanged,visualLinkChanged}};const hasGroupBy=config=>config!==undefined&&config.groupBy!==undefined&&config.groupBy.length>0;const hasBaseFilter=config=>config?.baseFilterSpec!==undefined&&config.baseFilterSpec.filter.length>0;const hasFilter=config=>config?.filterSpec!==undefined&&config.filterSpec.filter.length>0;const hasSort=config=>config?.sort!==undefined&&Array.isArray(config.sort?.sortDefs)&&config.sort.sortDefs.length>0;const isTypeaheadSuggestionProvider=source=>typeof source["getTypeaheadSuggestions"]==="function";const isTableSchemaMessage=message=>message.type==="TABLE_META_RESP";const isConnectionQualityMetrics=msg=>msg.type==="connection-metrics";const messageHasResult=msg=>typeof msg.result!=="undefined";const isVisualLinkMessage=msg=>msg.type.endsWith("_VISUAL_LINK");const isVisualLinksMessage=msg=>msg.type==="vuu-links";const isViewportMessage=msg=>"viewport"in msg;const messageHasDataRows=message=>message.type==="viewport-update"&&Array.isArray(message.rows);const messageHasSize=message=>message.type==="viewport-update"&&typeof message.size==="number";const withConfigDefaults=config=>{if(config.aggregations&&config.baseFilterSpec&&config.columns&&config.filterSpec&&config.groupBy&&config.sort){return config}else{const{aggregations=[],baseFilterSpec:baseFilter={filter:""},columns=[],filterSpec:filter={filter:""},groupBy=[],sort={sortDefs:[]},visualLink}=config;return{aggregations,baseFilterSpec:baseFilter,columns,filterSpec:filter,groupBy,sort,visualLink}}};const dataSourceRowToEntity=(row,columnMap)=>Object.entries(columnMap).reduce((entity,[name,index])=>({...entity,[name]:row[index]}),{});const MENU_RPC_TYPES=["VIEW_PORT_MENUS_SELECT_RPC","VIEW_PORT_MENU_TABLE_RPC","VIEW_PORT_MENU_ROW_RPC","VIEW_PORT_MENU_CELL_RPC"];const INVALID_SESSION="Invalid session";const SESSION_LIMIT_EXCEEDED="User session limit exceeded";const INVALID_TOKEN="Invalid token";const TOKEN_EXPIRED="Token has expired";const InvalidLoginMessages=[INVALID_SESSION,SESSION_LIMIT_EXCEEDED,INVALID_TOKEN,TOKEN_EXPIRED];const isErrorMessage=message=>typeof message=="object"&&message?.type==="ERROR";const isLoginErrorMessage=message=>typeof message==="string"&&InvalidLoginMessages.includes(message);const isSelectRequest=message=>message&&typeof message==="object"&&"type"in message&&(message.type==="SELECT_ROW"||message.type==="DESELECT_ROW"||message.type==="SELECT_ROW_RANGE"||message.type==="SELECT_ALL"||message.type==="DESELECT_ALL");const isSelectSuccessWithRowCount=response=>["SELECT_ROW_SUCCESS","DESELECT_ROW_SUCCESS","SELECT_ROW_RANGE_SUCCESS","SELECT_ALL_SUCCESS","DESELECT_ALL_SUCCESS"].includes(response.type??"")&&typeof response.selectedRowCount==="number";const isRpcServiceRequest=message=>message.type==="RPC_REQUEST";const hasViewPortContext=message=>message.context.type==="VIEWPORT_CONTEXT";const isVuuMenuRpcRequest=message=>MENU_RPC_TYPES.includes(message["type"]);const isLoginResponse=message=>message!==null&&typeof message==="object"&&"type"in message&&(message.type==="LOGIN_SUCCESS"||message.type==="LOGIN_FAIL");const isRpcSuccess=rpcResult=>rpcResult?.type==="SUCCESS_RESULT";const isRpcError=rpcResult=>rpcResult?.type==="ERROR_RESULT";const isRequestResponse=message=>"requestId"in message;const isOpenSessionTableDialogMessage=rpcResponse=>rpcResponse.type==="VIEW_PORT_MENU_RESP"&&isOpenDialogAction(rpcResponse.action)&&"tableSchema"in rpcResponse.action;const isOpenDialogAction=action=>action!==undefined&&action.type==="OPEN_DIALOG_ACTION";const isTypeaheadRequest=request=>{return isRpcServiceRequest(request)&&(request.rpcName==="getUniqueFieldValues"||request.rpcName==="getUniqueFieldValuesStartingWith")};const isCreateVpSuccess=response=>response.type==="CREATE_VP_SUCCESS";const isSessionTable=table=>{if(table!==null&&typeof table==="object"&&"table"in table&&"module"in table){return table.table.startsWith("session")}return false};function isActionMessage(rpcResponse){return rpcResponse.type==="VIEW_PORT_MENU_RESP"}function isSessionTableActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&(rpcResponse.action?.renderComponent==="inline-form"||rpcResponse.action?.renderComponent==="grid")}function isCustomComponentActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&typeof rpcResponse.action.renderComponent==="string"&&componentInRegistry(rpcResponse.action.renderComponent)}const numericTypes=null&&["int","long","double","scaleddecimal2","scaleddecimal4","scaleddecimal6","scaleddecimal8"];function isNumericType(dataType){return numericTypes.includes(dataType)}const isAddRowRpcRequest=rpcRequest=>rpcRequest.rpcName==="addRow";const isEditCellRpcRequest=rpcRequest=>rpcRequest.rpcName==="editCell";const isBeginEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName==="beginEditSession";const isEndEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName==="endEditSession";const isUndoRowChangeRpcRequest=rpcRequest=>rpcRequest.rpcName==="undoRowChange";const isDeleteSelectedRowsRpcRequest=rpcRequest=>rpcRequest.rpcName==="deleteSelectedRows";const isCreateSessionTableRpcRequest=rpcRequest=>rpcRequest.rpcName==="createSessionTable";const simpleIdentity=(a,b)=>a===b;function partition(array,test,pass=[],fail=[]){for(let i=0,len=array.length;i<len;i++){(test(array[i],i)?pass:fail).push(array[i])}return[pass,fail]}function itemsChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return!currentItems.every(item=>newItems.includes(item))}else{return currentItems.some(currentItem=>newItems.findIndex(newItem=>newItem[identityProperty]===currentItem[identityProperty])===-1)}}function itemsOrOrderChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return currentItems.some((item,index)=>newItems[index]!==item)}else{return currentItems.some((currentItem,index)=>newItems[index][identityProperty]!==currentItem[identityProperty])}}const moveItemDeprecated=(items,item,moveTo)=>{const fromIndex=items.indexOf(item);if(fromIndex===moveTo){return items}const newItems=items.slice();if(fromIndex===-1){throw Error("moveItem, item to be moved not found")}newItems.splice(fromIndex,1);if(moveTo===-1){newItems.push(item)}else{const offset=moveTo>fromIndex?0:0;newItems.splice(moveTo+offset,0,item)}return newItems};const moveItem=(items,fromIndex,toIndex)=>{if(fromIndex===toIndex){return items}else{const newItems=items.slice();const[item]=newItems.splice(fromIndex,1);if(toIndex===-1){return newItems.concat(item)}else{const offset=toIndex>fromIndex?0:0;newItems.splice(toIndex+offset,0,item);return newItems}}};const getAddedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(currentItems===undefined){return newItems}const isNew=item=>currentItems.every(currentItem=>compareItems(item,currentItem)===false);if(newItems.some(isNew)){return newItems.filter(isNew)}else{return[]}};const getRemovedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(newItems===undefined){return currentItems}const isRemoved=item=>newItems.every(newItem=>compareItems(item,newItem)===false);if(currentItems.some(isRemoved)){return currentItems.filter(isRemoved)}else{return[]}};const containsSubsetOfItems=(allItems,comparedItems)=>{if(comparedItems.length>allItems.length)return false;const invalidItems=getAddedItems(allItems,comparedItems);return invalidItems.length===0};const getMissingItems=(sourceItems,items,identity)=>items.filter(i=>sourceItems.findIndex(s=>identity(s)===i)===-1);const reorderItems=(originalItems,orderedNames)=>{const orderedItems=[];let previousName="";for(const name of orderedNames){if(previousName!==name){const item=originalItems.find(c=>c.name===name);if(item){orderedItems.push(item)}previousName=name}}return orderedItems};const hasRequestId=message=>{return"requestId"in message};const stripRequestId=({requestId,...rest})=>[requestId,rest];const getFirstAndLastRows=rows=>{let firstRow=rows.at(0);if(firstRow.updateType==="SIZE"){if(rows.length===1){return rows}else{firstRow=rows.at(1)}}const lastRow=rows.at(-1);return[firstRow,lastRow]};const insertRow=(rows,row)=>{const lastRow=rows.at(-1);if(lastRow===undefined||row.rowIndex>lastRow.rowIndex){rows.push(row)}else{for(let i=0;i<rows.length;i++){if(row.rowIndex<rows[i].rowIndex){rows.splice(i,0,row);return}else if(row.rowIndex===rows[i].rowIndex){if(row.ts<rows[i].ts){}else{rows[i]=row}return}}throw Error("don\'t expect to get this far")}};const groupRowsByViewport=rows=>{const result={};for(const row of rows){const rowsForViewport=result[row.viewPortId]||(result[row.viewPortId]=[]);insertRow(rowsForViewport,row)}return result};const createSchemaFromTableMetadata=({columns,dataTypes,editableColumns=[],key,maxRangeEnd,maxRangeWidth,table})=>{return{table,columns:columns.map((col,idx)=>{if(editableColumns.includes(col)){return{editable:true,name:col,serverDataType:dataTypes[idx]}}return{name:col,serverDataType:dataTypes[idx]}}),key,rangeLimits:{maxRangeEnd,maxRangeWidth}}};const CHANGE_VP_SUCCESS="CHANGE_VP_SUCCESS";const CHANGE_VP_RANGE_SUCCESS="CHANGE_VP_RANGE_SUCCESS";const CLOSE_TREE_NODE="CLOSE_TREE_NODE";const CLOSE_TREE_SUCCESS="CLOSE_TREE_SUCCESS";const CLOSE_TREE_REJECT="CLOSE_TREE_REJECT";const CREATE_VISUAL_LINK="CREATE_VISUAL_LINK";const CREATE_VP="CREATE_VP";const DISABLE_VP="DISABLE_VP";const DISABLE_VP_SUCCESS="DISABLE_VP_SUCCESS";const DISABLE_VP_REJECT="DISABLE_VP_REJECT";const ENABLE_VP="ENABLE_VP";const ENABLE_VP_SUCCESS="ENABLE_VP_SUCCESS";const ENABLE_VP_REJECT="ENABLE_VP_REJECT";const GET_TABLE_META="GET_TABLE_META";const GET_VP_VISUAL_LINKS="GET_VP_VISUAL_LINKS";const GET_VIEW_PORT_MENUS="GET_VIEW_PORT_MENUS";const VIEW_PORT_MENUS_SELECT_RPC="VIEW_PORT_MENUS_SELECT_RPC";const VIEW_PORT_MENU_CELL_RPC="VIEW_PORT_MENU_CELL_RPC";const VIEW_PORT_MENU_TABLE_RPC="VIEW_PORT_MENU_TABLE_RPC";const VIEW_PORT_MENU_ROW_RPC="VIEW_PORT_MENU_ROW_RPC";const VIEW_PORT_MENU_RESP="VIEW_PORT_MENU_RESP";const VIEW_PORT_MENU_REJ="VIEW_PORT_MENU_REJ";const HB="HB";const HB_RESP="HB_RESP";const OPEN_TREE_NODE="OPEN_TREE_NODE";const OPEN_TREE_SUCCESS="OPEN_TREE_SUCCESS";const OPEN_TREE_REJECT="OPEN_TREE_REJECT";const REMOVE_VP="REMOVE_VP";const REMOVE_VP_REJECT="REMOVE_VP_REJECT";const MENU_RPC_RESP="MENU_RPC_RESP";const TABLE_ROW="TABLE_ROW";const SIZE="SIZE";const UPDATE="U";function _check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function _class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function _class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function _class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function _class_private_field_get(receiver,privateMap){var descriptor=_class_extract_field_descriptor(receiver,privateMap,"get");return _class_apply_descriptor_get(receiver,descriptor)}function _class_private_field_init(obj,privateMap,value){_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function _class_private_field_set(receiver,privateMap,value){var descriptor=_class_extract_field_descriptor(receiver,privateMap,"set");_class_apply_descriptor_set(receiver,descriptor,value);return value}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}var _baseFrom=new WeakMap,_renderBufferSize=new WeakMap,_baseTo=new WeakMap;class RangeImpl{get reset(){return new RangeImpl(0,_class_private_field_get(this,_baseTo)-_class_private_field_get(this,_baseFrom),_class_private_field_get(this,_renderBufferSize))}get withBuffer(){return getFullRange(this,_class_private_field_get(this,_renderBufferSize))}equals(range){return range.from===_class_private_field_get(this,_baseFrom)&&range.to===_class_private_field_get(this,_baseTo)}toJson(){return{from:this.from,to:this.to,baseFrom:_class_private_field_get(this,_baseFrom),baseTo:_class_private_field_get(this,_baseTo),renderBufferSize:_class_private_field_get(this,_renderBufferSize)}}constructor(from,to,renderBufferSize=0){_define_property(this,"from",void 0);_define_property(this,"to",void 0);_class_private_field_init(this,_baseFrom,{writable:true,value:void 0});_class_private_field_init(this,_renderBufferSize,{writable:true,value:void 0});_class_private_field_init(this,_baseTo,{writable:true,value:void 0});this.from=from;this.to=to;_class_private_field_set(this,_renderBufferSize,0);_class_private_field_set(this,_baseFrom,from);_class_private_field_set(this,_baseTo,to);_class_private_field_set(this,_renderBufferSize,renderBufferSize)}}const Range=(from,to,renderBufferSize)=>new RangeImpl(from,to,renderBufferSize);const NULL_RANGE=Range(0,0);function getFullRange({from,to},bufferSize=0,maxRangeEnd=Number.MAX_SAFE_INTEGER){if(from===0&&to===0){return{from,to}}else if(bufferSize===0){if(maxRangeEnd<from){return{from:0,to:0}}else{return{from,to:Math.min(to,maxRangeEnd)}}}else if(from===0){return{from,to:Math.min(to+bufferSize,maxRangeEnd)}}else{const shortfallBefore=from-bufferSize<0;const shortfallAfter=maxRangeEnd-(to+bufferSize)<0;if(shortfallBefore&&shortfallAfter){return{from:0,to:maxRangeEnd}}else if(shortfallBefore){return{from:0,to:to+bufferSize}}else if(shortfallAfter){return{from:Math.max(0,from-bufferSize),to:maxRangeEnd}}else{return{from:from-bufferSize,to:to+bufferSize}}}}const withinRange=(value,{from,to})=>value>=from&&value<to;const rangeNewItems=({from:from1,to:to1},newRange)=>{const{from:from2,to:to2}=newRange;const noOverlap=from2>=to1||to2<=from1;const newFullySubsumesOld=from2<from1&&to2>to1;return noOverlap||newFullySubsumesOld?newRange:to2>to1?{from:to1,to:to2}:{from:from2,to:from1}};class WindowRange{isWithin(index){return withinRange(index,this)}overlap(from,to){return from>=this.to||to<this.from?[0,0]:[Math.max(from,this.from),Math.min(to,this.to)]}copy(){return new WindowRange(this.from,this.to)}constructor(from,to){_define_property(this,"from",void 0);_define_property(this,"to",void 0);this.from=from;this.to=to}}const constrainRangeWidth=(range,maxRangeWidth=Number.MAX_SAFE_INTEGER)=>{if(range.to-range.from<maxRangeWidth){return range}console.warn(`[range-utils] range ${range.from} - ${range.to} exceeds maxRangeWidth ${maxRangeWidth} for this table `);return{from:range.from,to:range.from+maxRangeWidth}};const constrainRange=(range,maxRangeEnd,maxRangeWidth)=>{if(maxRangeEnd>0&&maxRangeEnd<range.to){if(maxRangeEnd>range.from){return constrainRangeWidth({from:range.from,to:maxRangeEnd},maxRangeWidth)}else{throw Error(`constrainRange: cannot apply the maxRangeEnd ${maxRangeEnd} to range ${range.from} - ${range.to}`)}}else{return constrainRangeWidth(range,maxRangeWidth)}};function debug_utils_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:debug_utils_debug,debugEnabled:debug_utils_debugEnabled}=logger("range-monitor");class RangeMonitor{isSet(){return this.timestamp!==0}set({from,to}){const{timestamp}=this;this.range.from=from;this.range.to=to;this.timestamp=performance.now();if(timestamp){debug_utils_debugEnabled&&debug_utils_debug(`<${this.source}> [${from}-${to}], ${(this.timestamp-timestamp).toFixed(0)} ms elapsed`)}else{return 0}}constructor(source){debug_utils_define_property(this,"source",void 0);debug_utils_define_property(this,"range",void 0);debug_utils_define_property(this,"timestamp",void 0);this.source=source;this.range={from:0,to:0};this.timestamp=0}};function keyset_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY=[];class KeySet{next(free=EMPTY){if(free.length>0){return free.shift()}else{return this.nextKeyValue++}}init({from,to}){this.keys.clear();this.freeKeys.length=0;this.nextKeyValue=0;for(let rowIndex=from;rowIndex<to;rowIndex++){const nextKeyValue=this.next();this.keys.set(rowIndex,nextKeyValue)}return true}reset({from,to}){this.range={from,to};const{freeKeys}=this;this.keys.forEach((keyValue,rowIndex)=>{if(rowIndex<from||rowIndex>=to){freeKeys.push(keyValue);this.keys.delete(rowIndex)}});let freeKeyIndex=0;for(let rowIndex=from;rowIndex<to;rowIndex++){if(!this.keys.has(rowIndex)){const nextKeyValue=freeKeyIndex<freeKeys.length?freeKeys[freeKeyIndex++]:this.nextKeyValue++;this.keys.set(rowIndex,nextKeyValue)}}if(freeKeyIndex>0){freeKeys.splice(0,freeKeyIndex)}return false}keyFor(rowIndex){const key=this.keys.get(rowIndex);if(key===undefined){console.log(`key not found\n keys: ${this.toDebugString()}\n `);throw Error(`KeySet, no key found for rowIndex ${rowIndex}`)}return key}toDebugString(){return`${this.keys.size} keys\n${Array.from(this.keys.entries()).sort(([key1],[key2])=>key1-key2).map(([k,v])=>`${k}=>${v}`).join(",")}]\n`}constructor(range){keyset_define_property(this,"keys",new Map);keyset_define_property(this,"freeKeys",[]);keyset_define_property(this,"nextKeyValue",0);keyset_define_property(this,"range",void 0);this.range={from:range.from,to:range.to};this.init(range)}};function array_backed_moving_window_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function array_backed_moving_window_class_private_field_get(receiver,privateMap){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,"get");return array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor)}function array_backed_moving_window_class_private_field_init(obj,privateMap,value){array_backed_moving_window_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function array_backed_moving_window_class_private_field_set(receiver,privateMap,value){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,"set");array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value);return value}function array_backed_moving_window_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY_ARRAY=[];const log=logger("array-backed-moving-window");function dataIsUnchanged(newRow,existingRow){if(!existingRow){return false}if(existingRow.data.length!==newRow.data.length){return false}if(existingRow.sel!==newRow.sel){return false}for(let i=0;i<existingRow.data.length;i++){if(existingRow.data[i]!==newRow.data[i]){return false}}return true}var _range=new WeakMap;class ArrayBackedMovingWindow{get range(){return array_backed_moving_window_class_private_field_get(this,_range)}outOfRange(firstIndex,lastIndex){const{from,to}=this.range;if(lastIndex<from){return true}if(firstIndex>=to){return true}}setAtIndex(row){const{rowIndex:index}=row;const internalIndex=index-array_backed_moving_window_class_private_field_get(this,_range).from;if(dataIsUnchanged(row,this.internalData[internalIndex])){return false}const isWithinClientRange=this.isWithinClientRange(index);if(isWithinClientRange||this.isWithinRange(index)){if(!this.internalData[internalIndex]&&isWithinClientRange){this.rowsWithinRange+=1}this.internalData[internalIndex]=row}return isWithinClientRange}getAtIndex(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)&&this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]!=null?this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]:undefined}isWithinRange(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)}isWithinClientRange(index){return this.clientRange.isWithin(index)}setClientRange(from,to){log.debug?.(`setClientRange ${from} - ${to}`);const currentFrom=this.clientRange.from;const currentTo=Math.min(this.clientRange.to,this.rowCount);if(from===currentFrom&&to===currentTo){this.clientRange.to=to;return[false,EMPTY_ARRAY]}const originalRange=this.clientRange.copy();this.clientRange.from=from;this.clientRange.to=to;this.rowsWithinRange=0;for(let i=from;i<to;i++){const internalIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[internalIndex]){this.rowsWithinRange+=1}}const clientRows=[];const offset=array_backed_moving_window_class_private_field_get(this,_range).from;for(let i=from;i<to;i++){if(i<originalRange.from||i>=originalRange.to){const row=this.internalData[i-offset];if(row){clientRows.push(row)}}}const serverDataRequired=this.bufferBreakout(from,to);return[serverDataRequired,clientRows]}setRange(from,to){if(from!==array_backed_moving_window_class_private_field_get(this,_range).from||to!==array_backed_moving_window_class_private_field_get(this,_range).to){log.debug?.(`setRange ${from} - ${to}`);const[overlapFrom,overlapTo]=array_backed_moving_window_class_private_field_get(this,_range).overlap(from,to);const newData=new Array(to-from);this.rowsWithinRange=0;for(let i=overlapFrom;i<overlapTo;i++){const row=this.getAtIndex(i);if(row){const index=i-from;newData[index]=row;if(this.isWithinClientRange(i)){this.rowsWithinRange+=1}}}this.internalData=newData;array_backed_moving_window_class_private_field_get(this,_range).from=from;array_backed_moving_window_class_private_field_get(this,_range).to=to}else{log.debug?.(`setRange ${from} - ${to} IGNORED because not changed`)}}get data(){return this.internalData}getData(){const{from,to}=array_backed_moving_window_class_private_field_get(this,_range);const{from:clientFrom,to:clientTo}=this.clientRange;const startOffset=Math.max(0,clientFrom-from);const endOffset=Math.min(to-from,to,clientTo-from,this.rowCount??to);return this.internalData.slice(startOffset,endOffset)}clear(){log.debug?.("clear");this.internalData.length=0;this.rowsWithinRange=0;this.setRowCount(0)}getCurrentDataRange(){const rows=this.internalData;const len=rows.length;let[firstRow]=this.internalData;let lastRow=this.internalData[len-1];if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{for(let i=0;i<len;i++){if(rows[i]!==undefined){firstRow=rows[i];break}}for(let i=len-1;i>=0;i--){if(rows[i]!==undefined){lastRow=rows[i];break}}if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{return[-1,-1]}}}constructor({from:clientFrom,to:clientTo},{from,to},bufferSize){array_backed_moving_window_class_private_field_init(this,_range,{writable:true,value:void 0});array_backed_moving_window_define_property(this,"bufferSize",void 0);array_backed_moving_window_define_property(this,"internalData",void 0);array_backed_moving_window_define_property(this,"rowsWithinRange",void 0);array_backed_moving_window_define_property(this,"clientRange",void 0);array_backed_moving_window_define_property(this,"rowCount",void 0);array_backed_moving_window_define_property(this,"setRowCount",rowCount=>{log.info?.(`setRowCount ${rowCount}`);const dataLength=Math.max(0,rowCount-array_backed_moving_window_class_private_field_get(this,_range).from);if(dataLength<this.internalData.length){this.internalData.length=dataLength}if(rowCount<this.rowCount){this.rowsWithinRange=0;const end=Math.min(rowCount,this.clientRange.to);for(let i=this.clientRange.from;i<end;i++){const rowIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[rowIndex]!==undefined){this.rowsWithinRange+=1}}}this.rowCount=rowCount});array_backed_moving_window_define_property(this,"bufferBreakout",(from,to)=>{const bufferPerimeter=this.bufferSize*.25;if(array_backed_moving_window_class_private_field_get(this,_range).to-to<bufferPerimeter){return true}else if(array_backed_moving_window_class_private_field_get(this,_range).from>0&&from-array_backed_moving_window_class_private_field_get(this,_range).from<bufferPerimeter){return true}else{return false}});this.bufferSize=bufferSize;this.clientRange=new WindowRange(clientFrom,clientTo);array_backed_moving_window_class_private_field_set(this,_range,new WindowRange(from,to));this.internalData=new Array(bufferSize);this.rowsWithinRange=0;this.rowCount=0}};function viewport_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function viewport_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function viewport_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function viewport_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function viewport_class_private_field_get(receiver,privateMap){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,"get");return viewport_class_apply_descriptor_get(receiver,descriptor)}function viewport_class_private_field_init(obj,privateMap,value){viewport_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function viewport_class_private_field_set(receiver,privateMap,value){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,"set");viewport_class_apply_descriptor_set(receiver,descriptor,value);return value}function viewport_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:viewport_debug,debugEnabled:viewport_debugEnabled,error:viewport_error,info:viewport_info,infoEnabled:viewport_infoEnabled,warn:viewport_warn}=logger("Viewport");const isLeafUpdate=({rowKey,updateType})=>updateType==="U"&&!rowKey.startsWith("$root");const NO_DATA_UPDATE=[undefined,undefined];const NO_UPDATE_STATUS={count:0,mode:undefined,size:0,ts:0};var _status=new WeakMap,_clientRange=new WeakMap,_maxRangeEnd=new WeakMap;class Viewport{get hasUpdatesToProcess(){if(this.suspended){return false}return this.rowCountChanged||this.hasUpdates}get size(){return this.dataWindow.rowCount??0}get clientRange(){return viewport_class_private_field_get(this,_clientRange)}get status(){return viewport_class_private_field_get(this,_status)}set status(status){viewport_class_private_field_set(this,_status,status)}subscribe(){const{filter}=this.filter;this.status=viewport_class_private_field_get(this,_status)==="subscribed"?"resubscribing":"subscribing";return{type:CREATE_VP,table:this.table,range:getFullRange(viewport_class_private_field_get(this,_clientRange),this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter}}}handleSubscribed({viewPortId,aggregations,columns,filterSpec:filter,range,sort,groupBy,table},baseTableSchema){this.serverViewportId=viewPortId;this.status="subscribed";this.aggregations=aggregations;this.columns=columns;this.groupBy=groupBy;this.isTree=groupBy&&groupBy.length>0;this.dataWindow.setRange(range.from,range.to);const tableSchema=table===baseTableSchema.table.table?baseTableSchema:{...baseTableSchema,table:{...baseTableSchema.table,session:table}};if(tableSchema.rangeLimits){viewport_class_private_field_set(this,_maxRangeEnd,tableSchema.rangeLimits?.maxRangeEnd)}return{aggregations,type:"subscribed",clientViewportId:this.clientViewportId,columns,filterSpec:filter,groupBy,range,sort,tableSchema}}awaitOperation(requestId,msg){this.pendingOperations.set(requestId,msg)}rejectOperation(requestId,_msg){const{pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to reject for requestId ${requestId}`);return}const{type}=pendingOperation;pendingOperations.delete(requestId);if(type==="CHANGE_VP_RANGE"){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.nacked=true;break}else{viewport_warn?.("range requests sent faster than they are being ACKed")}}}}completeOperation(requestId,...params){const{clientViewportId,pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to complete for requestId ${requestId}`);return}const{type}=pendingOperation;viewport_info?.(`completeOperation ${type}`);pendingOperations.delete(requestId);if(type==="CHANGE_VP_RANGE"){const[from,to]=params;viewport_infoEnabled&&viewport_info(`completeOperation CHANGE_VP_RANGE\n window setRange (${from}:${to}) ${this.pendingRangeRequests.length} range requests pending`);this.dataWindow?.setRange(from,to);for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.acked=true;break}else{viewport_warn?.("range requests sent faster than they are being ACKed")}}}else if(type==="config"){const{aggregations,columns,filterSpec:filter,groupBy,sort}=pendingOperation.data;this.aggregations=aggregations;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.sort=sort;if(groupBy.length>0){this.isTree=true}else if(this.isTree){this.isTree=false}viewport_debug?.(`config change confirmed, isTree : ${this.isTree}`);return{clientViewportId,type,config:pendingOperation.data}}else if(type==="selection"){}else if(type==="disable"){this.suspended=false;this.disabled=true;this.disabledActive=pendingOperation.disableActive;return{type:"disabled",clientViewportId}}else if(type==="enable"){this.disabled=false;this.disabledActive=false;return{type:"enabled",clientViewportId}}else if(type==="freeze"){this.frozen=true;return{type:"frozen",clientViewportId}}else if(type==="unfreeze"){this.frozen=false;return{type:"unfrozen",clientViewportId}}else if(type==="CREATE_VISUAL_LINK"){const[colName,parentViewportId,parentColName]=params;this.linkedParent={colName,parentViewportId,parentColName};this.pendingLinkedParent=undefined;return{requestId,type:"vuu-link-created",clientViewportId,colName,parentViewportId,parentColName}}else if(type==="REMOVE_VISUAL_LINK"){this.linkedParent=undefined;return{requestId,type:"vuu-link-removed",clientViewportId}}}rangeRequest(requestId,range){if(viewport_debugEnabled){this.rangeMonitor.set(range)}viewport_infoEnabled&&viewport_info(`(bufferSize ${this.bufferSize}) rangeRequest (${range.from}:${range.to}) current: window client (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), full (${this.dataWindow.range.from}:${this.dataWindow.range.to}) `);const type="CHANGE_VP_RANGE";if(this.dataWindow){const[serverDataRequired,clientRows]=this.dataWindow.setClientRange(range.from,range.to);viewport_infoEnabled&&viewport_info(`updated: dataWindow clientRange (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), fullRange (${this.dataWindow.range.from}:${this.dataWindow.range.to}) serverDataRequired ${serverDataRequired?"Y":"N"} ${clientRows.length} rows returned from local buffer`);let debounceRequest;const maxRange=viewport_class_private_field_get(this,_maxRangeEnd);const serverRequest=serverDataRequired&&!this.rangeRequestAlreadyPending(range)?{type,viewPortId:this.serverViewportId,...getFullRange(range,this.bufferSize,maxRange)}:null;if(serverRequest){viewport_infoEnabled&&viewport_info(`create CHANGE_VP_RANGE: (${serverRequest.from} - ${serverRequest.to})`);viewport_debugEnabled&&viewport_debug?.(`create CHANGE_VP_RANGE: [${serverRequest.from} - ${serverRequest.to}]`);this.awaitOperation(requestId,{type});const pendingRequest=this.pendingRangeRequests.at(-1);if(pendingRequest){if(pendingRequest.acked){console.warn("Range Request before previous request is filled")}else{const{from,to}=pendingRequest;if(this.dataWindow.outOfRange(from,to)){debounceRequest={clientViewportId:this.clientViewportId,type:"debounce-begin"}}else{viewport_warn?.("Range Request before previous request is acked")}}}this.pendingRangeRequests.push({...serverRequest,requestId})}else if(clientRows.length>0){this.batchMode=false}this.keys.reset(this.dataWindow.clientRange);const toClient=this.isTree?toClientRowTree:toClientRow;if(clientRows.length){return[serverRequest,clientRows.map(row=>{return toClient(row,this.keys)})]}else if(debounceRequest){return[serverRequest,undefined,debounceRequest]}else{return[serverRequest]}}else{return[null]}}setLinks(links){this.links=links.filter(link=>link.parentVpId!==this.serverViewportId);return[{type:"vuu-links",links:this.links,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(menu){return{type:"vuu-menu",menu,clientViewportId:this.clientViewportId}}openTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);viewport_infoEnabled&&viewport_info(`treeKey ${treeKey}`);return{type:OPEN_TREE_NODE,vpId:this.serverViewportId,treeKey}}closeTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);return{type:CLOSE_TREE_NODE,vpId:this.serverViewportId,treeKey}}createLink(requestId,vuuCreateVisualLink){const message={...vuuCreateVisualLink,childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}removeLink(requestId){const message={type:"REMOVE_VISUAL_LINK",childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}suspend(){this.suspended=true;this.pendingUpdates.length=0;viewport_info?.("suspend")}resume(){this.suspended=false;if(viewport_debugEnabled){viewport_debug?.(`resume: ${this.currentData()}`)}return[this.size,this.currentData()]}currentData(){const out=[];if(this.dataWindow){const records=this.dataWindow.getData();const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;for(const row of records){if(row){out.push(toClient(row,keys))}}}return out}enable(requestId){this.awaitOperation(requestId,{type:"enable"});viewport_info?.(`enable: ${this.serverViewportId}`);return{type:ENABLE_VP,viewPortId:this.serverViewportId}}disable(requestId,disableActive=false){this.awaitOperation(requestId,{type:"disable",disableActive});viewport_info?.(`disable: ${this.serverViewportId}`);return{type:DISABLE_VP,viewPortId:this.serverViewportId}}freeze(requestId){this.awaitOperation(requestId,{type:"freeze"});viewport_info?.(`freeze: ${this.serverViewportId}`);return{type:"FREEZE_VP",viewPortId:this.serverViewportId}}unfreeze(requestId){this.awaitOperation(requestId,{type:"unfreeze"});viewport_info?.(`unfreeze: ${this.serverViewportId}`);this.frozen=false;return{type:"UNFREEZE_VP",viewPortId:this.serverViewportId}}setConfig(requestId,config){this.awaitOperation(requestId,{type:"config",data:config});const{filterSpec:filter,...remainingConfig}=config;viewport_debugEnabled?viewport_debug?.(`setConfig ${JSON.stringify(config)}`):viewport_info?.(`setConfig`);if(!this.isTree&&config.groupBy.length>0){this.dataWindow?.clear()}return this.createRequest({...remainingConfig,filterSpec:typeof filter?.filter==="string"?{filter:filter.filter}:{filter:""}},true)}selectRequest(request){viewport_info?.(`selectRequest: ${request.type}`);if(this.serverViewportId){return{...request,vpId:this.serverViewportId}}else{throw Error(`[Viewport] cannot process ${request.type} before serverViewportId has been set`)}}removePendingRangeRequest(firstIndex,lastIndex){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const{from,to}=this.pendingRangeRequests[i];let isLast=true;if(firstIndex>=from&&firstIndex<to||lastIndex>from&&lastIndex<to){if(!isLast){console.warn("removePendingRangeRequest TABLE_ROWS are not for latest request")}this.pendingRangeRequests.splice(i,1);break}else{isLast=false}}}clearCache(){this.dataWindow.setRowCount(0);this.postMessageToClient({clientViewportId:this.clientViewportId,type:"viewport-clear"})}updateRows(rows){const[firstRow,lastRow]=getFirstAndLastRows(rows);if(firstRow&&lastRow){this.removePendingRangeRequest(firstRow.rowIndex,lastRow.rowIndex)}if(rows.length===1){if(firstRow.vpSize===0&&this.disabled){viewport_debug?.(`ignore a SIZE=0 message on disabled viewport (${rows.length} rows)`);return}}for(const row of rows){if(this.isTree&&isLeafUpdate(row)){continue}else{if(row.updateType==="SIZE"||this.dataWindow?.rowCount!==row.vpSize){this.dataWindow?.setRowCount(row.vpSize);this.rowCountChanged=true}if(row.updateType==="U"){if(this.dataWindow?.setAtIndex(row)){if(this.suspended!==true){this.hasUpdates=true;if(!this.batchMode){this.pendingUpdates.push(row)}}}}}}}getKeyForRowAtIndex(rowIndex){const row=this.dataWindow.getAtIndex(rowIndex);return row?.rowKey}getClientRows(){let out=undefined;let mode="size-only";if(!this.hasUpdates&&!this.rowCountChanged){return NO_DATA_UPDATE}if(this.hasUpdates){const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;if(this.updateThrottleTimer){self.clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}if(this.pendingUpdates.length>0){out=[];mode="update";for(const row of this.pendingUpdates){out.push(toClient(row,keys))}}this.pendingUpdates.length=0;this.hasUpdates=false}if(this.throttleMessage(mode)){return NO_DATA_UPDATE}else{return[out,mode]}}createRequest(params,overWrite=false){if(overWrite){return{type:"CHANGE_VP",viewPortId:this.serverViewportId,...params}}else{return{type:"CHANGE_VP",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...params}}}constructor({aggregations,bufferSize=50,columns,filterSpec:filter,groupBy=[],table,range,sort,title,viewport,visualLink},postMessageToClient){viewport_class_private_field_init(this,_status,{writable:true,value:""});viewport_define_property(this,"aggregations",void 0);viewport_define_property(this,"batchMode",false);viewport_define_property(this,"bufferSize",void 0);viewport_class_private_field_init(this,_clientRange,{writable:true,value:void 0});viewport_define_property(this,"columns",void 0);viewport_define_property(this,"dataWindow",void 0);viewport_define_property(this,"filter",void 0);viewport_define_property(this,"groupBy",void 0);viewport_define_property(this,"sort",void 0);viewport_define_property(this,"hasUpdates",false);viewport_define_property(this,"pendingUpdates",[]);viewport_define_property(this,"keys",void 0);viewport_class_private_field_init(this,_maxRangeEnd,{writable:true,value:Number.MAX_SAFE_INTEGER});viewport_define_property(this,"pendingLinkedParent",void 0);viewport_define_property(this,"pendingOperations",new Map);viewport_define_property(this,"pendingRangeRequests",[]);viewport_define_property(this,"postMessageToClient",void 0);viewport_define_property(this,"rowCountChanged",false);viewport_define_property(this,"lastUpdateStatus",NO_UPDATE_STATUS);viewport_define_property(this,"updateThrottleTimer",undefined);viewport_define_property(this,"rangeMonitor",new RangeMonitor("ViewPort"));viewport_define_property(this,"clientViewportId",void 0);viewport_define_property(this,"disabled",false);viewport_define_property(this,"disabledActive",false);viewport_define_property(this,"frozen",false);viewport_define_property(this,"isTree",false);viewport_define_property(this,"links",void 0);viewport_define_property(this,"linkedParent",void 0);viewport_define_property(this,"serverViewportId",void 0);viewport_define_property(this,"suspended",false);viewport_define_property(this,"suspendTimer",null);viewport_define_property(this,"table",void 0);viewport_define_property(this,"title",void 0);viewport_define_property(this,"setLastSizeOnlyUpdateSize",size=>{this.lastUpdateStatus.size=size});viewport_define_property(this,"setLastUpdate",mode=>{const{ts:lastTS,mode:lastMode}=this.lastUpdateStatus;let elapsedTime=0;if(lastMode===mode){const ts=Date.now();this.lastUpdateStatus.count+=1;this.lastUpdateStatus.ts=ts;elapsedTime=lastTS===0?0:ts-lastTS}else{this.lastUpdateStatus.count=1;this.lastUpdateStatus.ts=0;elapsedTime=0}this.lastUpdateStatus.mode=mode;return elapsedTime});viewport_define_property(this,"rangeRequestAlreadyPending",range=>{const{bufferSize}=this;const bufferThreshold=bufferSize*.25;let{from:stillPendingFrom}=range;for(const{from,to}of this.pendingRangeRequests){if(stillPendingFrom>=from&&stillPendingFrom<to){if(range.to+bufferThreshold<=to){return true}else{stillPendingFrom=to}}}return false});viewport_define_property(this,"sendThrottledSizeMessage",()=>{this.updateThrottleTimer=undefined;this.lastUpdateStatus.count=3;this.postMessageToClient({clientViewportId:this.clientViewportId,mode:"size-only",size:this.lastUpdateStatus.size,type:"viewport-update"})});viewport_define_property(this,"shouldThrottleMessage",mode=>{const elapsedTime=this.setLastUpdate(mode);return mode==="size-only"&&elapsedTime>0&&elapsedTime<500&&this.lastUpdateStatus.count>3});viewport_define_property(this,"throttleMessage",mode=>{if(this.shouldThrottleMessage(mode)){viewport_info?.("[Viewport] throttling updates setTimeout to 300");this.setLastSizeOnlyUpdateSize(this.dataWindow.rowCount);if(this.updateThrottleTimer===undefined){this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,100)}return true}else if(this.updateThrottleTimer!==undefined){clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}return false});viewport_define_property(this,"getNewRowCount",()=>{if(this.rowCountChanged&&this.dataWindow){this.rowCountChanged=false;return this.dataWindow.rowCount}});this.aggregations=aggregations;this.bufferSize=bufferSize;viewport_class_private_field_set(this,_clientRange,range);this.clientViewportId=viewport;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.keys=new KeySet(range);this.pendingLinkedParent=visualLink;this.table=table;this.sort=sort;this.title=title;viewport_infoEnabled&&viewport_info?.(`${table.table} #${viewport}, bufferSize=${bufferSize}`);this.dataWindow=new ArrayBackedMovingWindow(viewport_class_private_field_get(this,_clientRange),range,this.bufferSize);this.postMessageToClient=postMessageToClient}}const viewport_isNew=false;const toClientRow=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{return[rowIndex,keys.keyFor(rowIndex),true,false,0,0,rowKey,isSelected,ts,viewport_isNew].concat(data)};const toClientRowTree=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{const[depth,isExpanded,,isLeaf,,count,...rest]=data;return[rowIndex,keys.keyFor(rowIndex),isLeaf,isExpanded,depth,count,rowKey,isSelected,ts,viewport_isNew].concat(rest)};function event_emitter_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function event_emitter_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function event_emitter_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function event_emitter_class_private_field_get(receiver,privateMap){var descriptor=event_emitter_class_extract_field_descriptor(receiver,privateMap,"get");return event_emitter_class_apply_descriptor_get(receiver,descriptor)}function event_emitter_class_private_field_init(obj,privateMap,value){event_emitter_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function isArrayOfListeners(listeners){return Array.isArray(listeners)}function isOnlyListener(listeners){return!Array.isArray(listeners)}var _events=new WeakMap;class EventEmitter{addListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(!listeners){event_emitter_class_private_field_get(this,_events).set(event,listener)}else if(isArrayOfListeners(listeners)){listeners.push(listener)}else if(isOnlyListener(listeners)){event_emitter_class_private_field_get(this,_events).set(event,[listeners,listener])}}removeListener(event,listener){if(!event_emitter_class_private_field_get(this,_events).has(event)){return}const listenerOrListeners=event_emitter_class_private_field_get(this,_events).get(event);let position=-1;if(listenerOrListeners===listener){event_emitter_class_private_field_get(this,_events).delete(event)}else if(Array.isArray(listenerOrListeners)){for(let i=listenerOrListeners.length;i-- >0;){if(listenerOrListeners[i]===listener){position=i;break}}if(position<0){return}if(listenerOrListeners.length===1){listenerOrListeners.length=0;event_emitter_class_private_field_get(this,_events).delete(event)}else{listenerOrListeners.splice(position,1)}}}removeAllListeners(event){if(event&&event_emitter_class_private_field_get(this,_events).has(event)){event_emitter_class_private_field_get(this,_events).delete(event)}else if(event===undefined){event_emitter_class_private_field_get(this,_events).clear()}}emit(event,...args){if(event_emitter_class_private_field_get(this,_events)){const handler=event_emitter_class_private_field_get(this,_events).get(event);if(handler){this.invokeHandler(handler,args)}}}once(event,listener){const handler=(...args)=>{this.removeListener(event,handler);listener(...args)};this.on(event,handler)}on(event,listener){this.addListener(event,listener)}hasListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(Array.isArray(listeners)){return listeners.includes(listener)}else{return listeners===listener}}invokeHandler(handler,args){if(isArrayOfListeners(handler)){handler.slice().forEach(listener=>this.invokeHandler(listener,args))}else{switch(args.length){case 0:handler();break;case 1:handler(args[0]);break;case 2:handler(args[0],args[1]);break;default:handler.call(null,...args)}}}constructor(){event_emitter_class_private_field_init(this,_events,{writable:true,value:new Map})}};function promise_utils_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function promise_utils_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function promise_utils_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function promise_utils_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function promise_utils_class_private_field_get(receiver,privateMap){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,"get");return promise_utils_class_apply_descriptor_get(receiver,descriptor)}function promise_utils_class_private_field_init(obj,privateMap,value){promise_utils_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function promise_utils_class_private_field_set(receiver,privateMap,value){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,"set");promise_utils_class_apply_descriptor_set(receiver,descriptor,value);return value}var _promise=new WeakMap,_resolve=new WeakMap,_reject=new WeakMap,_resolved=new WeakMap;class DeferredPromise{get promise(){return promise_utils_class_private_field_get(this,_promise)}get isResolved(){return promise_utils_class_private_field_get(this,_resolved)}resolve(value){promise_utils_class_private_field_set(this,_resolved,true);return promise_utils_class_private_field_get(this,_resolve).call(this,value)}get reject(){return promise_utils_class_private_field_get(this,_reject)}constructor(){promise_utils_class_private_field_init(this,_promise,{writable:true,value:void 0});promise_utils_class_private_field_init(this,_resolve,{writable:true,value:()=>console.log("resolve was not set")});promise_utils_class_private_field_init(this,_reject,{writable:true,value:()=>console.log("reject was not set")});promise_utils_class_private_field_init(this,_resolved,{writable:true,value:false});promise_utils_class_private_field_set(this,_promise,new Promise((resolve,reject)=>{promise_utils_class_private_field_set(this,_resolve,resolve);promise_utils_class_private_field_set(this,_reject,reject)}))}};function WebSocketConnection_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function WebSocketConnection_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function WebSocketConnection_class_private_field_get(receiver,privateMap){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,"get");return WebSocketConnection_class_apply_descriptor_get(receiver,descriptor)}function WebSocketConnection_class_private_field_init(obj,privateMap,value){WebSocketConnection_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function WebSocketConnection_class_private_field_set(receiver,privateMap,value){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,"set");WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value);return value}function WebSocketConnection_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const isInvalidTokenReason=text=>text==="Invalid token"||text==="Token has expired";const isInvalidSessionReason=text=>text==="Invalid session"||text==="User session limit exceeded";const{debug:WebSocketConnection_debug,debugEnabled:WebSocketConnection_debugEnabled,info:WebSocketConnection_info}=logger("WebSocketConnection");const isWebSocketConnectionStatus=msg=>typeof msg==="string"&&["connecting","websocket-open","connected","reconnecting","reconnected","disconnected","closed","failed"].includes(msg);const isConnected=status=>status==="connected"||status==="reconnected";const isLoginRejectedMessage=message=>message!==null&&"type"in message&&message.type==="LOGIN_REJECTED";const DEFAULT_CONNECTION_TIMEOUT=1e4;const parseWebSocketMessage=message=>{try{return JSON.parse(message)}catch(e){throw Error(`Error parsing JSON response from server ${message}`)}};var _callback=new WeakMap,_confirmedOpen=new WeakMap,_connectionPhase=new WeakMap,_connectionStatus=new WeakMap,_connectionTimeout=new WeakMap,_deferredOpen=new WeakMap,_protocols=new WeakMap,_url=new WeakMap,_ws=new WeakMap;class WebSocketConnection extends EventEmitter{get connectionTimeout(){return WebSocketConnection_class_private_field_get(this,_connectionTimeout)}get protocols(){return WebSocketConnection_class_private_field_get(this,_protocols)}get isClosed(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)==="closed"}get isDisconnected(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)==="disconnected"}get connectionPhase(){return WebSocketConnection_class_private_field_get(this,_connectionPhase)}get connectionStatus(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)}set connectionStatus(connectionStatus){if(connectionStatus!=="connecting"&&connectionStatus!=="reconnecting"){WebSocketConnection_class_private_field_set(this,_connectionStatus,connectionStatus);this.emit("connection-status",WebSocketConnection_class_private_field_get(this,_connectionStatus))}}get confirmedOpen(){return WebSocketConnection_class_private_field_get(this,_confirmedOpen)}set confirmedOpen(confirmedOpen){WebSocketConnection_class_private_field_set(this,_confirmedOpen,confirmedOpen);if(confirmedOpen&&WebSocketConnection_class_private_field_get(this,_connectionPhase)==="initial-connection"){WebSocketConnection_class_private_field_set(this,_connectionPhase,"post-disconnect-reconnection")}}get url(){return WebSocketConnection_class_private_field_get(this,_url)}async openWebSocket(){const initialConnect=WebSocketConnection_class_private_field_get(this,_connectionPhase)==="initial-connection";if(WebSocketConnection_class_private_field_get(this,_deferredOpen)===undefined){WebSocketConnection_class_private_field_set(this,_deferredOpen,new DeferredPromise)}const{connectionTimeout,protocols,url}=this;WebSocketConnection_class_private_field_set(this,_connectionStatus,initialConnect?"connecting":"reconnecting");const timer=setTimeout(()=>{throw Error(`Failed to open WebSocket connection to ${url}, timed out after ${connectionTimeout}ms`)},connectionTimeout);const ws=WebSocketConnection_class_private_field_set(this,_ws,new WebSocket(url,protocols));ws.onopen=()=>{this.connectionStatus="websocket-open";clearTimeout(timer);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).resolve(undefined);WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}};ws.onerror=()=>{clearTimeout(timer)};ws.onclose=()=>{if(!this.isClosed){this.confirmedOpen=false;this.connectionStatus="disconnected";this.close("failure")}};ws.onmessage=evt=>{this.receive(evt)};return WebSocketConnection_class_private_field_get(this,_deferredOpen)?.promise}close(reason="shutdown"){this.connectionStatus="closed";if(reason==="failure"){if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).reject(Error("connection failed"));WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}}else{WebSocketConnection_class_private_field_get(this,_ws)?.close()}WebSocketConnection_class_private_field_set(this,_ws,undefined)}constructor({callback,connectionTimeout=DEFAULT_CONNECTION_TIMEOUT,protocols,url}){super(),WebSocketConnection_class_private_field_init(this,_callback,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_confirmedOpen,{writable:true,value:false}),WebSocketConnection_class_private_field_init(this,_connectionPhase,{writable:true,value:"initial-connection"}),WebSocketConnection_class_private_field_init(this,_connectionStatus,{writable:true,value:"closed"}),WebSocketConnection_class_private_field_init(this,_connectionTimeout,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_deferredOpen,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_protocols,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_url,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_ws,{writable:true,value:void 0}),WebSocketConnection_define_property(this,"receive",evt=>{if(isLoginErrorMessage(evt.data)){console.warn(`[WebSocketConnection] closed because of login issue`);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){console.warn(`... and we have a deferred connection`)}WebSocketConnection_class_private_field_get(this,_callback).call(this,{type:"LOGIN_REJECTED",reason:evt.data});this.close(evt.data)}else{const vuuMessageFromServer=parseWebSocketMessage(evt.data);if(WebSocketConnection_debugEnabled){if(vuuMessageFromServer.body.type!=="HB"){WebSocketConnection_debug(`<=== ${vuuMessageFromServer.body.type}`);if(vuuMessageFromServer.body.type==="CHANGE_VP_SUCCESS"){WebSocketConnection_debug(JSON.stringify(vuuMessageFromServer.body))}}}WebSocketConnection_class_private_field_get(this,_callback).call(this,vuuMessageFromServer);if(!this.confirmedOpen){if(vuuMessageFromServer.body.type==="LOGIN_SUCCESS"){this.connectionStatus=WebSocketConnection_class_private_field_get(this,_connectionPhase)==="initial-connection"?"connected":"reconnected";this.confirmedOpen=true}}}}),WebSocketConnection_define_property(this,"send",msg=>{if(msg.body.type==="CHANGE_VP_RANGE"){WebSocketConnection_info?.(`===> CHANGE_VP_RANGE<#${msg.requestId}> ${msg.body.from}-${msg.body.to}`)}WebSocketConnection_class_private_field_get(this,_ws)?.send(JSON.stringify(msg))});WebSocketConnection_class_private_field_set(this,_callback,callback);WebSocketConnection_class_private_field_set(this,_connectionTimeout,connectionTimeout);WebSocketConnection_class_private_field_set(this,_url,url);WebSocketConnection_class_private_field_set(this,_protocols,protocols)}};function server_proxy_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}let _requestId=1;const TEST_setRequestId=id=>_requestId=id;const{debug:server_proxy_debug,debugEnabled:server_proxy_debugEnabled,error:server_proxy_error,info:server_proxy_info,infoEnabled:server_proxy_infoEnabled,warn:server_proxy_warn}=logger("ServerProxy");const nextRequestId=()=>`${_requestId++}`;const DEFAULT_OPTIONS={};const isActiveViewport=viewPort=>viewPort.disabled!==true&&viewPort.suspended!==true;const addTitleToLinks=(links,serverViewportId,label)=>links.map(link=>link.parentVpId===serverViewportId?{...link,label}:link);function addLabelsToLinks(links,viewports){return links.map(linkDescriptor=>{const{parentVpId}=linkDescriptor;const viewport=viewports.get(parentVpId);if(viewport){return{...linkDescriptor,parentClientVpId:viewport.clientViewportId,label:viewport.title}}else{throw Error("addLabelsToLinks viewport not found")}})}class ServerProxy{async login(authToken){if(authToken){this.authToken=authToken;return new Promise((resolve,reject)=>{this.sendMessageToServer({type:"LOGIN",token:this.authToken},"");this.pendingLogin={resolve,reject}})}else if(this.authToken===""){server_proxy_error("login, cannot login until auth token has been obtained")}}clearAllViewports(){this.viewports.forEach(viewport=>{viewport.clearCache()})}disconnect(){this.viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.unsubscribe(clientViewportId);this.postMessageToClient({clientViewportId,type:"viewport-clear"})})}async subscribe(message){if(!this.mapClientToServerViewport.has(message.viewport)){const pendingTableSchema=this.getTableMeta(message.table);const viewport=new Viewport(message,this.postMessageToClient);this.viewports.set(message.viewport,viewport);const pendingSubscription=this.awaitResponseToMessage(viewport.subscribe(),message.viewport);const[subscribeResponse,tableSchema]=await Promise.all([pendingSubscription,pendingTableSchema]);if(isErrorMessage(tableSchema)){this.postMessageToClient({clientViewportId:message.viewport,type:"subscribe-failed",msg:`failed to fetch schema for table ${message.table.table}: ${tableSchema.msg}`})}else if(isCreateVpSuccess(subscribeResponse)){const{viewPortId:serverViewportId}=subscribeResponse;const{status:previousViewportStatus}=viewport;if(message.viewport!==serverViewportId){this.viewports.delete(message.viewport);this.viewports.set(serverViewportId,viewport)}this.mapClientToServerViewport.set(message.viewport,serverViewportId);const clientResponse=viewport.handleSubscribed(subscribeResponse,tableSchema);if(clientResponse){this.postMessageToClient(clientResponse);if(server_proxy_debugEnabled){server_proxy_debug(`post DataSourceSubscribedMessage to client: ${JSON.stringify(clientResponse)}`)}}if(viewport.disabled){this.disableViewport(viewport)}if(this.queuedRequests.length>0){this.processQueuedRequests()}if(previousViewportStatus==="subscribing"&&!isSessionTable(viewport.table)){this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId:serverViewportId});this.sendMessageToServer({type:GET_VIEW_PORT_MENUS,vpId:serverViewportId});Array.from(this.viewports.entries()).filter(([id,{disabled,status}])=>id!==serverViewportId&&!disabled&&status==="subscribed").forEach(([vpId])=>{this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId})})}}else{this.postMessageToClient({clientViewportId:message.viewport,type:"subscribe-failed",msg:`failed to open subscription on table ${message.table.table}: ${subscribeResponse.msg}`})}}else{server_proxy_error(`spurious subscribe call ${message.viewport}`)}}addRequestToQueue(queuedRequest){const isDifferentTypeViewport=qr=>qr.clientViewportId!==queuedRequest.clientViewportId||queuedRequest.message.type!==qr.message.type;if(!this.queuedRequests.every(isDifferentTypeViewport)){this.queuedRequests=this.queuedRequests.filter(isDifferentTypeViewport)}this.queuedRequests.push(queuedRequest)}processQueuedRequests(){const newQueue=[];for(const queuedRequest of this.queuedRequests){const{clientViewportId,message,requestId}=queuedRequest;const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){this.sendMessageToServer({...message,viewPortId:serverViewportId},requestId)}else if(this.viewports.has(clientViewportId)){newQueue.push(queuedRequest)}else{console.warn(`ServerProxy processQueuedRequests, ${message.type} request not found ${clientViewportId}`)}}this.queuedRequests=newQueue}unsubscribe(clientViewportId){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){server_proxy_info?.(`Unsubscribe Message (Client to Server):\n ${serverViewportId}`);this.sendMessageToServer({type:REMOVE_VP,viewPortId:serverViewportId})}else{server_proxy_error(`failed to unsubscribe client viewport ${clientViewportId}, viewport not found`)}}getViewportForClient(clientViewportId,throws=true){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){const viewport=this.viewports.get(serverViewportId);if(viewport){return viewport}else if(throws){throw Error(`Viewport not found for client viewport ${clientViewportId}`)}else{return null}}else if(this.viewports.has(clientViewportId)){return this.viewports.get(clientViewportId)}else if(throws){throw Error(`Viewport server id not found for client viewport ${clientViewportId}`)}else{return null}}setViewRange(viewport,message){const requestId=nextRequestId();server_proxy_infoEnabled&&server_proxy_info(`setViewRange (${message.range.from}:${message.range.to})`);const[serverRequest,rows,debounceRequest]=viewport.rangeRequest(requestId,message.range);if(viewport.status==="subscribed"){server_proxy_info?.(`setViewRange ${message.range.from} - ${message.range.to}`);if(serverRequest){if(true){server_proxy_info?.(`CHANGE_VP_RANGE (${message.range.from}-${message.range.to}) => (${serverRequest.from}-${serverRequest.to})`)}server_proxy_infoEnabled&&server_proxy_info(`setViewRange send CHANGE_VP_RANGE<#${requestId}> (${serverRequest.from}-${serverRequest.to})`);this.sendMessageToServer(serverRequest,requestId)}if(rows){server_proxy_info?.(`setViewRange ${rows.length} rows returned from cache`);this.postMessageToClient({mode:"update",type:"viewport-update",clientViewportId:viewport.clientViewportId,range:message.range,rows})}else if(debounceRequest){this.postMessageToClient(debounceRequest)}}else if(serverRequest){this.addRequestToQueue({clientViewportId:message.viewport,message:serverRequest,requestId})}}setConfig(viewport,message){const requestId=nextRequestId();const request=viewport.setConfig(requestId,message.config);this.sendIfReady(request,requestId,viewport.status==="subscribed")}setTitle(viewport,message){if(viewport){viewport.title=message.title;this.updateTitleOnVisualLinks(viewport)}}select(viewport,message){const[requestId,selectRequest]=stripRequestId(message);const request=viewport.selectRequest(selectRequest);this.sendMessageToServer(request,requestId)}disableAllActiveViewports(){console.log(`[ServerProxy] disableAllActiveViewports`);this.viewports.forEach(vp=>{if(isActiveViewport(vp)){this.disableViewport(vp,true)}})}enableAllActiveViewports(){this.viewports.forEach(vp=>{if(vp.disabledActive){this.enableViewport(vp)}})}disableViewport(viewport,disableActive=false){const requestId=nextRequestId();const request=viewport.disable(requestId,disableActive);this.sendIfReady(request,requestId,viewport.status==="subscribed")}enableViewport(viewport){if(viewport.disabled){const requestId=nextRequestId();const request=viewport.enable(requestId);this.sendIfReady(request,requestId,viewport.status==="subscribed")}}freezeViewport(viewport){const requestId=nextRequestId();const request=viewport.freeze(requestId);this.sendIfReady(request,requestId,viewport.status==="subscribed")}unfreezeViewport(viewport){if(viewport.frozen){const requestId=nextRequestId();const request=viewport.unfreeze(requestId);this.sendIfReady(request,requestId,viewport.status==="subscribed")}}suspendViewport(viewport,escalateToDisable=true,escalateDelay=3e3){viewport.suspend();if(escalateToDisable){viewport.suspendTimer=setTimeout(()=>{server_proxy_info?.("suspendTimer expired, escalate suspend to disable");this.disableViewport(viewport)},escalateDelay)}}resumeViewport(viewport){if(viewport.suspendTimer){server_proxy_debug?.("clear suspend timer");clearTimeout(viewport.suspendTimer);viewport.suspendTimer=null}const[size,rows]=viewport.resume();server_proxy_debug?.(`resumeViewport size ${size}, ${rows.length} rows sent to client`);this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:"update",rows,size,type:"viewport-update"})}openTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.openTreeNode(requestId,message),requestId,viewport.status==="subscribed")}}closeTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.closeTreeNode(requestId,message),requestId,viewport.status==="subscribed")}}createLink(viewport,message){const[requestId,visualLinkRequest]=stripRequestId(message);const parentVpId=this.mapClientToServerViewport.get(message.parentVpId);if(parentVpId){const request=viewport.createLink(requestId,{...visualLinkRequest,parentVpId});this.sendMessageToServer(request,requestId)}else{throw Error(`createLink parent viewport not found ${message.parentVpId}`)}}removeLink(viewport,message){const{requestId}=message;const request=viewport.removeLink(requestId);this.sendMessageToServer(request,requestId)}updateTitleOnVisualLinks(viewport){const{serverViewportId,title}=viewport;for(const vp of this.viewports.values()){if(vp!==viewport&&vp.links&&serverViewportId&&title){if(vp.links?.some(link=>link.parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(addTitleToLinks(vp.links,serverViewportId,title));this.postMessageToClient(messageToClient)}}}}removeViewportFromVisualLinks(serverViewportId){for(const vp of this.viewports.values()){if(vp.links?.some(({parentVpId})=>parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(vp.links.filter(({parentVpId})=>parentVpId!==serverViewportId));this.postMessageToClient(messageToClient)}}}menuRpcCall(message){const viewport=this.getViewportForClient(message.vpId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,vpId:viewport.serverViewportId},requestId)}}rpcRequest(message){if(hasViewPortContext(message)){const viewport=this.getViewportForClient(message.context.viewPortId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,context:{type:"VIEWPORT_CONTEXT",viewPortId:viewport.serverViewportId}},requestId)}}else{throw Error(`[ServerProxy] rpcRequest only supports VIEWPORT_CONTEXT at present`)}}handleMessageFromClient(message){if(isViewportMessage(message)||isVisualLinkMessage(message)){if(message.type==="disable"){const viewport=this.getViewportForClient(message.viewport,false);if(viewport!==null){return this.disableViewport(viewport)}else{return}}else{const viewport=isVisualLinkMessage(message)?this.getViewportForClient(message.childVpId):this.getViewportForClient(message.viewport);switch(message.type){case"setViewRange":return this.setViewRange(viewport,message);case"config":return this.setConfig(viewport,message);case"suspend":{const{escalateToDisable,escalateDelay}=message;return this.suspendViewport(viewport,escalateToDisable,escalateDelay)}case"resume":return this.resumeViewport(viewport);case"enable":return this.enableViewport(viewport);case"FREEZE_VP":return this.freezeViewport(viewport);case"UNFREEZE_VP":return this.unfreezeViewport(viewport);case"openTreeNode":return this.openTreeNode(viewport,message);case"closeTreeNode":return this.closeTreeNode(viewport,message);case"CREATE_VISUAL_LINK":return this.createLink(viewport,message);case"REMOVE_VISUAL_LINK":return this.removeLink(viewport,message);case"setTitle":return this.setTitle(viewport,message);default:}}}else if(isSelectRequest(message)){if(hasRequestId(message)){const viewport=this.getViewportForClient(message.vpId);return this.select(viewport,message)}else{console.warn(`selectRequest must have requestId`)}}else if(isRpcServiceRequest(message)){return this.rpcRequest(message)}else if(isVuuMenuRpcRequest(message)){return this.menuRpcCall(message)}else if(message.type==="disconnect"){return this.disconnect()}else if(message.type==="disable-all-active"){return this.disableAllActiveViewports()}else if(message.type==="enable-all-active"){return this.enableAllActiveViewports()}else{const{type,requestId}=message;switch(type){case"GET_TABLE_LIST":{this.tableList??(this.tableList=this.awaitResponseToMessage({type},requestId));this.tableList.then(response=>{this.postMessageToClient({type:"TABLE_LIST_RESP",tables:response.tables,requestId})});return}case"GET_TABLE_META":{this.getTableMeta(message.table,requestId).then(tableSchema=>{if(isErrorMessage(tableSchema)){}else if(tableSchema){this.postMessageToClient({type:"TABLE_META_RESP",tableSchema,requestId})}});return}default:}}server_proxy_error(`Vuu ServerProxy Unexpected message from client ${JSON.stringify(message)}`)}getTableMeta(table,requestId=nextRequestId()){if(isSessionTable(table)){return this.awaitResponseToMessage({type:"GET_TABLE_META",table},requestId).then(resp=>isErrorMessage(resp)?resp:createSchemaFromTableMetadata(resp))}const key=`${table.module}:${table.table}`;let tableMetaRequest=this.cachedTableMetaRequests.get(key);if(!tableMetaRequest){tableMetaRequest=this.awaitResponseToMessage({type:"GET_TABLE_META",table},requestId);this.cachedTableMetaRequests.set(key,tableMetaRequest)}return tableMetaRequest?.then(response=>{if(isErrorMessage(response)){return response}else{return this.cacheTableMeta(response)}})}awaitResponseToMessage(message,requestId=nextRequestId()){return new Promise((resolve,reject)=>{this.sendMessageToServer(message,requestId);this.pendingRequests.set(requestId,{reject,resolve})})}sendIfReady(message,requestId,isReady=true){if(isReady){this.sendMessageToServer(message,requestId)}return isReady}sendMessageToServer(body,requestId=`${_requestId++}`,options=DEFAULT_OPTIONS){const{module="CORE"}=options;if(this.authToken){this.connection.send({requestId,sessionId:this.sessionId,module,body})}}handleMessageFromServer(message){if(isLoginRejectedMessage(message)){if(this.pendingLogin){this.pendingLogin.reject(message.reason);this.pendingLogin=undefined;this.authToken=""}return}const{body,requestId,sessionId}=message;const pendingRequest=this.pendingRequests.get(requestId);if(pendingRequest){const{resolve}=pendingRequest;this.pendingRequests.delete(requestId);resolve(body);return}const{viewports}=this;switch(body.type){case"HB":this.sendMessageToServer({type:HB_RESP,ts:+new Date},"NA");break;case"LOGIN_SUCCESS":if(sessionId){this.sessionId=sessionId;this.pendingLogin?.resolve(sessionId);this.pendingLogin=undefined;this.postMessageToClient({...body,sessionId})}else{throw Error("LOGIN_SUCCESS did not provide sessionId")}break;case"REMOVE_VP_SUCCESS":{const viewport=viewports.get(body.viewPortId);if(viewport){this.mapClientToServerViewport.delete(viewport.clientViewportId);viewports.delete(body.viewPortId);this.removeViewportFromVisualLinks(body.viewPortId)}}break;case"SELECT_ALL_SUCCESS":case"SELECT_ROW_SUCCESS":case"SELECT_ROW_RANGE_SUCCESS":case"DESELECT_ROW_SUCCESS":{const{type,selectedRowCount}=body;this.postMessageToClient({requestId,type,selectedRowCount});break}case"DESELECT_ALL_SUCCESS":{const{type}=body;this.postMessageToClient({requestId,type,selectedRowCount:0});break}case"SELECT_ROW_REJECT":case"DESELECT_ROW_REJECT":case"SELECT_ROW_RANGE_REJECT":case"SELECT_ALL_REJECT":case"DESELECT_ALL_REJECT":console.warn(`select error ${body.type} ${body.errorMsg}`);break;case CHANGE_VP_SUCCESS:case DISABLE_VP_SUCCESS:if(viewports.has(body.viewPortId)){const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response!==undefined){this.postMessageToClient(response);if(server_proxy_debugEnabled){server_proxy_debug(`postMessageToClient ${JSON.stringify(response)}`)}}}}break;case ENABLE_VP_SUCCESS:{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response);const[size,rows]=viewport.resume();this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:"update",rows,size,type:"viewport-update"})}}}break;case"FREEZE_VP_SUCCESS":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case"UNFREEZE_VP_SUCCESS":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case"TABLE_ROW":{const viewportRowMap=groupRowsByViewport(body.rows);if(true&&server_proxy_debugEnabled){const[firstRow]=body.rows;if(body.rows.length===0){server_proxy_infoEnabled&&server_proxy_info("<=== TABLE_ROW 0 rows")}else if(firstRow?.rowIndex===-1){if(body.rows.length===1){if(firstRow.updateType==="SIZE"){server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ONLY ${firstRow.vpSize}`)}else{server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ${firstRow.vpSize} rowIdx ${firstRow.rowIndex}`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows, SIZE ${firstRow.vpSize}, [${body.rows.map(r=>r.rowIndex).join(",")}]`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows [${body.rows.map(r=>r.rowIndex).join(",")}]`)}}for(const[viewportId,rows]of Object.entries(viewportRowMap)){const viewport=viewports.get(viewportId);if(viewport){viewport.updateRows(rows)}else{server_proxy_warn?.(`TABLE_ROW message received for non registered viewport ${viewportId}`)}}this.processUpdates()}break;case"CHANGE_VP_RANGE_SUCCESS":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const{from,to}=body;server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_SUCCESS<#${requestId}> ${from} - ${to}`);viewport.completeOperation(requestId,from,to)}}break;case"CHANGE_VP_RANGE_REJECT":{const viewport=this.viewports.get(body.viewPortId);if(viewport){server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_REJECT<#${requestId}>`);viewport.rejectOperation(requestId,body.msg)}}break;case OPEN_TREE_SUCCESS:case CLOSE_TREE_SUCCESS:break;case"CREATE_VISUAL_LINK_SUCCESS":{const viewport=this.viewports.get(body.childVpId);const parentViewport=this.viewports.get(body.parentVpId);if(viewport&&parentViewport){const{childColumnName,parentColumnName}=body;const response=viewport.completeOperation(requestId,childColumnName,parentViewport.clientViewportId,parentColumnName);if(response){this.postMessageToClient(response)}}}break;case"REMOVE_VISUAL_LINK_SUCCESS":{const viewport=this.viewports.get(body.childVpId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case"VP_VISUAL_LINKS_RESP":{const activeLinkDescriptors=this.getActiveLinks(body.links);const viewport=this.viewports.get(body.vpId);if(activeLinkDescriptors.length&&viewport){const linkDescriptorsWithLabels=addLabelsToLinks(activeLinkDescriptors,this.viewports);const[clientMessage,pendingLink]=viewport.setLinks(linkDescriptorsWithLabels);this.postMessageToClient(clientMessage);if(pendingLink){const{link,parentClientVpId}=pendingLink;const requestId=nextRequestId();const parentVpId=this.mapClientToServerViewport.get(parentClientVpId);if(parentVpId){const message=viewport.createLink(requestId,{childVpId:body.vpId,childColumnName:link.fromColumn,parentColumnName:link.toColumn,parentVpId,type:"CREATE_VISUAL_LINK"});this.sendMessageToServer(message,requestId)}}}}break;case"VIEW_PORT_MENUS_RESP":if(body.menu?.name){const viewport=this.viewports.get(body.vpId);if(viewport){const clientMessage=viewport.setMenu(body.menu);this.postMessageToClient(clientMessage)}}break;case"VIEW_PORT_MENU_REJ":{const{error,rpcName,vpId}=body;const viewport=this.viewports.get(vpId);if(viewport){this.postMessageToClient({clientViewportId:viewport.clientViewportId,error,rpcName,type:"VIEW_PORT_MENU_REJ",requestId})}break}case"VIEW_PORT_MENU_RESP":{if(isSessionTableActionMessage(body)){const{action,rpcName}=body;this.awaitResponseToMessage({type:"GET_TABLE_META",table:action.table}).then(response=>{const tableSchema=createSchemaFromTableMetadata(response);this.postMessageToClient({rpcName,type:"VIEW_PORT_MENU_RESP",action:{...action,tableSchema},tableAlreadyOpen:this.isTableOpen(action.table),requestId})})}else{const{action,rpcName}=body;this.postMessageToClient({action,rpcName,requestId,tableAlreadyOpen:isOpenDialogAction(action)&&this.isTableOpen(action.table),type:"VIEW_PORT_MENU_RESP"})}}break;case"RPC_RESPONSE":{const{action,error,result}=body;this.postMessageToClient({action,type:"RPC_RESPONSE",error,result,requestId})}break;case"ERROR":server_proxy_error(body.msg);break;default:server_proxy_infoEnabled&&server_proxy_info(`<=== ${body["type"]}.`)}}cacheTableMeta(messageBody){const{module,table}=messageBody.table;const key=`${module}:${table}`;let tableSchema=this.cachedTableSchemas.get(key);if(!tableSchema){tableSchema=createSchemaFromTableMetadata(messageBody);this.cachedTableSchemas.set(key,tableSchema)}return tableSchema}isTableOpen(table){if(table){const tableName=table.table;for(const viewport of this.viewports.values()){if(!viewport.suspended&&viewport.table.table===tableName){return true}}}}getActiveLinks(linkDescriptors){return linkDescriptors.filter(linkDescriptor=>{const viewport=this.viewports.get(linkDescriptor.parentVpId);return viewport&&!viewport.suspended})}processUpdates(){this.viewports.forEach(viewport=>{if(viewport.hasUpdatesToProcess){const result=viewport.getClientRows();if(result!==NO_DATA_UPDATE){const[rows,mode]=result;const size=viewport.getNewRowCount();if(size!==undefined||rows&&rows.length>0){server_proxy_debugEnabled&&server_proxy_debug(`===> #${viewport.clientViewportId} viewport-update ${mode}, ${rows?.length??"no"} rows, size ${size}`);if(mode){this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode,rows,size,type:"viewport-update"})}}}}})}constructor(connection,callback){server_proxy_define_property(this,"connection",void 0);server_proxy_define_property(this,"postMessageToClient",void 0);server_proxy_define_property(this,"viewports",void 0);server_proxy_define_property(this,"mapClientToServerViewport",void 0);server_proxy_define_property(this,"authToken","");server_proxy_define_property(this,"pendingLogin",void 0);server_proxy_define_property(this,"pendingRequests",new Map);server_proxy_define_property(this,"sessionId",void 0);server_proxy_define_property(this,"queuedRequests",[]);server_proxy_define_property(this,"cachedTableMetaRequests",new Map);server_proxy_define_property(this,"cachedTableSchemas",new Map);server_proxy_define_property(this,"tableList",void 0);server_proxy_define_property(this,"connectionStatusChanged",status=>{if(status==="disconnected"){this.sessionId=undefined;this.clearAllViewports()}else if(status==="reconnected"){this.reconnect()}});server_proxy_define_property(this,"reconnect",async()=>{const[activeViewports,inactiveViewports]=partition(Array.from(this.viewports.values()),isActiveViewport);this.viewports.clear();this.mapClientToServerViewport.clear();const reconnectViewports=viewports=>{viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.awaitResponseToMessage(viewport.subscribe(),clientViewportId).then(msg=>{if(msg.type==="CREATE_VP_SUCCESS"){this.mapClientToServerViewport.set(clientViewportId,msg.viewPortId);this.viewports.set(msg.viewPortId,viewport);viewport.status="subscribed";viewport.serverViewportId=msg.viewPortId}else{}})})};reconnectViewports(activeViewports);setTimeout(()=>{reconnectViewports(inactiveViewports)},2e3)});this.connection=connection;this.postMessageToClient=callback;this.viewports=new Map;this.mapClientToServerViewport=new Map;connection.on("connection-status",this.connectionStatusChanged)}};let serverProxy;let webSocketConnection;const{info:worker_info,infoEnabled:worker_infoEnabled}=logger("worker");const sendMessageToClient=message=>{postMessage(message)};async function connectToServer(url,protocols,token){if(webSocketConnection===undefined&&serverProxy===undefined){webSocketConnection=new WebSocketConnection({callback:msg=>{if(isConnectionQualityMetrics(msg)){postMessage({type:"connection-metrics",messages:msg})}else{serverProxy.handleMessageFromServer(msg)}},protocols,url});webSocketConnection.on("connection-status",postMessage);serverProxy=new ServerProxy(webSocketConnection,sendMessageToClient)}await webSocketConnection.openWebSocket();return serverProxy.login(token)}const handleMessageFromClient=async({data:message})=>{switch(message.type){case"connect":try{const sessionId=await connectToServer(message.url,message.protocol,message.token);postMessage({type:"connected",sessionId})}catch(err){postMessage({type:"connection-failed",reason:String(err)})}break;case"disconnect":serverProxy.disconnect();webSocketConnection?.close();break;case"subscribe":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.subscribe(message);break;case"unsubscribe":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.unsubscribe(message.viewport);break;default:worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.handleMessageFromClient(message)}};self.addEventListener("message",handleMessageFromClient);postMessage({type:"ready"})})();';
1
+ const workerSourceCode = '(()=>{"use strict";const getCookieValue=name=>{if(globalThis.document?.cookie!==undefined){return globalThis.document.cookie.split("; ").find(row=>row.startsWith(`${name}=`))?.split("=")[1]}};function setCookieValue(name,value,days){let expires="";if(typeof days==="number"){const date=new Date;date.setTime(date.getTime()+days*24*60*60*1e3);expires="; expires="+date.toUTCString()}const encodedName=encodeURIComponent(name);const encodedValue=encodeURIComponent(value);document.cookie=`${encodedName}=${encodedValue}${expires};`};const logLevels=["error","warn","info","debug"];const isValidLogLevel=value=>typeof value==="string"&&logLevels.includes(value);const DEFAULT_LOG_LEVEL="error";const NO_OP=()=>undefined;const DEFAULT_DEBUG_LEVEL=false?0:"info";const{loggingLevel=DEFAULT_DEBUG_LEVEL}=getLoggingSettings();const logger=category=>{const debugEnabled=loggingLevel==="debug";const infoEnabled=debugEnabled||loggingLevel==="info";const warnEnabled=infoEnabled||loggingLevel==="warn";const errorEnabled=warnEnabled||loggingLevel==="error";const info=infoEnabled?message=>console.info(`${Date.now()} [${category}] ${message}`):NO_OP;const warn=warnEnabled?message=>console.warn(`[${category}] ${message}`):NO_OP;const debug=debugEnabled?message=>console.debug(`${Date.now()} [${category}] ${message}`):NO_OP;const error=errorEnabled?message=>console.error(`[${category}] ${message}`):NO_OP;if(false){}else{return{debugEnabled,infoEnabled,warnEnabled,errorEnabled,info,warn,debug,error}}};function getLoggingSettings(){if(typeof loggingSettings!=="undefined"){return loggingSettings}else{return{loggingLevel:getLoggingLevelFromCookie()}}}function getLoggingLevelFromCookie(){const value=getCookieValue("vuu-logging-level");if(isValidLogLevel(value)){return value}else{return DEFAULT_LOG_LEVEL}}const getLoggingConfigForWorker=()=>{return`const loggingSettings = { loggingLevel: "${getLoggingLevelFromCookie()}"};`};const logUnhandledMessage=(message,context="[logUnhandledStruct]")=>{console.log(`${context} ${JSON.stringify(message)}`)};const NoFilter=null&&{filter:""};const NoSort=null&&{sortDefs:[]};const vanillaConfig=null&&{aggregations:[],columns:[],filterSpec:NoFilter,groupBy:[],sort:NoSort};const sessionDataSourceConfig=(sourceConfig,overrideColumns)=>{if(overrideColumns===undefined){return sourceConfig}return{...vanillaConfig,columns:overrideColumns}};const assertExpectedSessionTable=(sessionTable,expectedTable)=>{if(expectedTable&&expectedTable.module!==sessionTable.module){throw Error(`[datasource-utils] session table ${sessionTable.module}/${sessionTable.table} does not match expected edit table module ${expectedTable.module}`)}};const stripVisualLink=configWithVisualLink=>{if(configWithVisualLink.visualLink){const{visualLink,...config}=configWithVisualLink;return config}else{return configWithVisualLink}};const equivalentAggregations=({aggregations:agg1},{aggregations:agg2})=>agg1===undefined&&agg2?.length===0||agg2===undefined&&agg1?.length===0;const equivalentColumns=({columns:cols1},{columns:cols2})=>cols1===undefined&&cols2?.length===0||cols2===undefined&&cols1?.length===0;const equivalentFilter=({filterSpec:f1},{filterSpec:f2})=>f1===undefined&&f2?.filter===""||f2===undefined&&f1?.filter==="";const equivalentGroupBy=({groupBy:val1},{groupBy:val2})=>val1===undefined&&val2?.length===0||val2===undefined&&val1?.length===0;const equivalentSort=({sort:s1},{sort:s2})=>s1===undefined&&s2?.sortDefs.length===0||s2===undefined&&s1?.sortDefs.length===0;const exactlyTheSame=(a,b)=>{if(a===b){return true}else if(a===undefined&&b===undefined){return true}else{return false}};const isAggregationsChanged=(config,newConfig)=>{const{aggregations:agg1}=config;const{aggregations:agg2}=newConfig;if(exactlyTheSame(agg1,agg2)||equivalentAggregations(config,newConfig)){return false}else if(agg1===undefined||agg2===undefined){return true}else if(agg1.length!==agg2.length){return true}return agg1.some(({column,aggType},i)=>column!==agg2[i].column||aggType!==agg2[i].aggType)};const isColumnsChanged=(config,newConfig)=>{const{columns:cols1}=config;const{columns:cols2}=newConfig;if(exactlyTheSame(cols1,cols2)||equivalentColumns(config,newConfig)){return false}else if(cols1===undefined||cols2===undefined){return true}else if(cols1?.length!==cols2?.length){return true}return cols1.some((column,i)=>column!==cols2?.[i])};const isBaseFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.baseFilterSpec?.filter!==c2.baseFilterSpec?.filter}};const isFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.filterSpec?.filter!==c2.filterSpec?.filter}};const isGroupByChanged=(config,newConfig)=>{const{groupBy:g1}=config;const{groupBy:g2}=newConfig;if(exactlyTheSame(g1,g2)||equivalentGroupBy(config,newConfig)){return false}else if(g1===undefined||g2===undefined){return true}else if(g1?.length!==g2?.length){return true}return g1.some((column,i)=>column!==g2?.[i])};const isSortChanged=(config,newConfig)=>{const{sort:s1}=config;const{sort:s2}=newConfig;if(exactlyTheSame(s1,s2)||equivalentSort(config,newConfig)){return false}else if(s1===undefined||s2===undefined){return true}else if(s1?.sortDefs.length!==s2?.sortDefs.length){return true}return s1.sortDefs.some(({column,sortType},i)=>column!==s2.sortDefs[i].column||sortType!==s2.sortDefs[i].sortType)};const isVisualLinkChanged=({visualLink:v1},{visualLink:v2})=>{if(exactlyTheSame(v1,v2)){return false}if(v1===undefined||v2===undefined){return true}return v1.label!==v2.label||v1.parentVpId!==v2.parentVpId};const NO_CONFIG_CHANGES=null&&{aggregationsChanged:false,baseFilterChanged:false,columnsChanged:false,filterChanged:false,groupByChanged:false,noChanges:true,sortChanged:false,visualLinkChanged:false};const isConfigChanged=(config,newConfig)=>{if(exactlyTheSame(config,newConfig)){return NO_CONFIG_CHANGES}if(config===undefined&&newConfig==undefined){return NO_CONFIG_CHANGES}else if(config===undefined){return isConfigChanged({},newConfig)}else if(newConfig===undefined){return isConfigChanged(config,{})}const aggregationsChanged=isAggregationsChanged(config,newConfig);const baseFilterChanged=isBaseFilterChanged(config,newConfig);const columnsChanged=isColumnsChanged(config,newConfig);const filterChanged=isFilterChanged(config,newConfig);const groupByChanged=isGroupByChanged(config,newConfig);const sortChanged=isSortChanged(config,newConfig);const visualLinkChanged=isVisualLinkChanged(config,newConfig);const noChanges=!(aggregationsChanged||baseFilterChanged||columnsChanged||filterChanged||groupByChanged||sortChanged||visualLinkChanged);return{aggregationsChanged,baseFilterChanged,columnsChanged,filterChanged,groupByChanged,noChanges,sortChanged,visualLinkChanged}};const hasGroupBy=config=>config!==undefined&&config.groupBy!==undefined&&config.groupBy.length>0;const hasBaseFilter=config=>config?.baseFilterSpec!==undefined&&config.baseFilterSpec.filter.length>0;const hasFilter=config=>config?.filterSpec!==undefined&&config.filterSpec.filter.length>0;const hasSort=config=>config?.sort!==undefined&&Array.isArray(config.sort?.sortDefs)&&config.sort.sortDefs.length>0;const isTypeaheadSuggestionProvider=source=>typeof source["getTypeaheadSuggestions"]==="function";const isTableSchemaMessage=message=>message.type==="TABLE_META_RESP";const isConnectionQualityMetrics=msg=>msg.type==="connection-metrics";const messageHasResult=msg=>typeof msg.result!=="undefined";const isVisualLinkMessage=msg=>msg.type.endsWith("_VISUAL_LINK");const isVisualLinksMessage=msg=>msg.type==="vuu-links";const isViewportMessage=msg=>"viewport"in msg;const messageHasDataRows=message=>message.type==="viewport-update"&&Array.isArray(message.rows);const messageHasSize=message=>message.type==="viewport-update"&&typeof message.size==="number";const withConfigDefaults=config=>{if(config.aggregations&&config.baseFilterSpec&&config.columns&&config.filterSpec&&config.groupBy&&config.sort){return config}else{const{aggregations=[],baseFilterSpec:baseFilter={filter:""},columns=[],filterSpec:filter={filter:""},groupBy=[],sort={sortDefs:[]},visualLink}=config;return{aggregations,baseFilterSpec:baseFilter,columns,filterSpec:filter,groupBy,sort,visualLink}}};const dataSourceRowToEntity=(row,columnMap)=>Object.entries(columnMap).reduce((entity,[name,index])=>({...entity,[name]:row[index]}),{});const MENU_RPC_TYPES=["VIEW_PORT_MENUS_SELECT_RPC","VIEW_PORT_MENU_TABLE_RPC","VIEW_PORT_MENU_ROW_RPC","VIEW_PORT_MENU_CELL_RPC"];const INVALID_SESSION="Invalid session";const SESSION_LIMIT_EXCEEDED="User session limit exceeded";const INVALID_TOKEN="Invalid token";const TOKEN_EXPIRED="Token has expired";const InvalidLoginMessages=[INVALID_SESSION,SESSION_LIMIT_EXCEEDED,INVALID_TOKEN,TOKEN_EXPIRED];const isErrorMessage=message=>typeof message=="object"&&message?.type==="ERROR";const isLoginErrorMessage=message=>typeof message==="string"&&InvalidLoginMessages.includes(message);const isSelectRequest=message=>message&&typeof message==="object"&&"type"in message&&(message.type==="SELECT_ROW"||message.type==="DESELECT_ROW"||message.type==="SELECT_ROW_RANGE"||message.type==="SELECT_ALL"||message.type==="DESELECT_ALL");const isSelectSuccessWithRowCount=response=>["SELECT_ROW_SUCCESS","DESELECT_ROW_SUCCESS","SELECT_ROW_RANGE_SUCCESS","SELECT_ALL_SUCCESS","DESELECT_ALL_SUCCESS"].includes(response.type??"")&&typeof response.selectedRowCount==="number";const isRpcServiceRequest=message=>message.type==="RPC_REQUEST";const hasViewPortContext=message=>message.context.type==="VIEWPORT_CONTEXT";const isVuuMenuRpcRequest=message=>MENU_RPC_TYPES.includes(message["type"]);const isLoginResponse=message=>message!==null&&typeof message==="object"&&"type"in message&&(message.type==="LOGIN_SUCCESS"||message.type==="LOGIN_FAIL");const isRpcSuccess=rpcResult=>rpcResult?.type==="SUCCESS_RESULT";const isRpcError=rpcResult=>rpcResult?.type==="ERROR_RESULT";const isRequestResponse=message=>"requestId"in message;const isOpenSessionTableDialogMessage=rpcResponse=>rpcResponse.type==="VIEW_PORT_MENU_RESP"&&isOpenDialogAction(rpcResponse.action)&&"tableSchema"in rpcResponse.action;const isOpenDialogAction=action=>action!==undefined&&action.type==="OPEN_DIALOG_ACTION";const isTypeaheadRequest=request=>{return isRpcServiceRequest(request)&&(request.rpcName==="getUniqueFieldValues"||request.rpcName==="getUniqueFieldValuesStartingWith")};const isCreateVpSuccess=response=>response.type==="CREATE_VP_SUCCESS";const isSessionTable=table=>{if(table!==null&&typeof table==="object"&&"table"in table&&"module"in table){return table.table.startsWith("session")}return false};function isActionMessage(rpcResponse){return rpcResponse.type==="VIEW_PORT_MENU_RESP"}function isSessionTableActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&(rpcResponse.action?.renderComponent==="inline-form"||rpcResponse.action?.renderComponent==="grid")}function isCustomComponentActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&typeof rpcResponse.action.renderComponent==="string"&&componentInRegistry(rpcResponse.action.renderComponent)}const numericTypes=null&&["int","long","double","scaleddecimal2","scaleddecimal4","scaleddecimal6","scaleddecimal8"];function isNumericType(dataType){return numericTypes.includes(dataType)}const isAddRowRpcRequest=rpcRequest=>rpcRequest.rpcName==="addRow";const isEditCellRpcRequest=rpcRequest=>rpcRequest.rpcName==="editCell";const isBeginEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName==="beginEditSession";const isEndEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName==="endEditSession";const isUndoRowChangeRpcRequest=rpcRequest=>rpcRequest.rpcName==="undoRowChange";const isDeleteSelectedRowsRpcRequest=rpcRequest=>rpcRequest.rpcName==="deleteSelectedRows";const isCreateSessionTableRpcRequest=rpcRequest=>rpcRequest.rpcName==="createSessionTable";const simpleIdentity=(a,b)=>a===b;function partition(array,test,pass=[],fail=[]){for(let i=0,len=array.length;i<len;i++){(test(array[i],i)?pass:fail).push(array[i])}return[pass,fail]}function itemsChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return!currentItems.every(item=>newItems.includes(item))}else{return currentItems.some(currentItem=>newItems.findIndex(newItem=>newItem[identityProperty]===currentItem[identityProperty])===-1)}}function itemsOrOrderChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return currentItems.some((item,index)=>newItems[index]!==item)}else{return currentItems.some((currentItem,index)=>newItems[index][identityProperty]!==currentItem[identityProperty])}}const moveItemDeprecated=(items,item,moveTo)=>{const fromIndex=items.indexOf(item);if(fromIndex===moveTo){return items}const newItems=items.slice();if(fromIndex===-1){throw Error("moveItem, item to be moved not found")}newItems.splice(fromIndex,1);if(moveTo===-1){newItems.push(item)}else{const offset=moveTo>fromIndex?0:0;newItems.splice(moveTo+offset,0,item)}return newItems};const moveItem=(items,fromIndex,toIndex)=>{if(fromIndex===toIndex){return items}else{const newItems=items.slice();const[item]=newItems.splice(fromIndex,1);if(toIndex===-1){return newItems.concat(item)}else{const offset=toIndex>fromIndex?0:0;newItems.splice(toIndex+offset,0,item);return newItems}}};const getAddedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(currentItems===undefined){return newItems}const isNew=item=>currentItems.every(currentItem=>compareItems(item,currentItem)===false);if(newItems.some(isNew)){return newItems.filter(isNew)}else{return[]}};const getRemovedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(newItems===undefined){return currentItems}const isRemoved=item=>newItems.every(newItem=>compareItems(item,newItem)===false);if(currentItems.some(isRemoved)){return currentItems.filter(isRemoved)}else{return[]}};const containsSubsetOfItems=(allItems,comparedItems)=>{if(comparedItems.length>allItems.length)return false;const invalidItems=getAddedItems(allItems,comparedItems);return invalidItems.length===0};const getMissingItems=(sourceItems,items,identity)=>items.filter(i=>sourceItems.findIndex(s=>identity(s)===i)===-1);const reorderItems=(originalItems,orderedNames)=>{const orderedItems=[];let previousName="";for(const name of orderedNames){if(previousName!==name){const item=originalItems.find(c=>c.name===name);if(item){orderedItems.push(item)}previousName=name}}return orderedItems};const hasRequestId=message=>{return"requestId"in message};const stripRequestId=({requestId,...rest})=>[requestId,rest];const getFirstAndLastRows=rows=>{let firstRow=rows.at(0);if(firstRow.updateType==="SIZE"){if(rows.length===1){return rows}else{firstRow=rows.at(1)}}const lastRow=rows.at(-1);return[firstRow,lastRow]};const insertRow=(rows,row)=>{const lastRow=rows.at(-1);if(lastRow===undefined||row.rowIndex>lastRow.rowIndex){rows.push(row)}else{for(let i=0;i<rows.length;i++){if(row.rowIndex<rows[i].rowIndex){rows.splice(i,0,row);return}else if(row.rowIndex===rows[i].rowIndex){if(row.ts<rows[i].ts){}else{rows[i]=row}return}}throw Error("don\'t expect to get this far")}};const groupRowsByViewport=rows=>{const result={};for(const row of rows){const rowsForViewport=result[row.viewPortId]||(result[row.viewPortId]=[]);insertRow(rowsForViewport,row)}return result};const createSchemaFromTableMetadata=({columns,dataTypes,editableColumns=[],key,maxRangeEnd,maxRangeWidth,table})=>{return{table,columns:columns.map((col,idx)=>{if(editableColumns.includes(col)){return{editable:true,name:col,serverDataType:dataTypes[idx]}}return{name:col,serverDataType:dataTypes[idx]}}),key,rangeLimits:{maxRangeEnd,maxRangeWidth}}};const CHANGE_VP_SUCCESS="CHANGE_VP_SUCCESS";const CHANGE_VP_RANGE_SUCCESS="CHANGE_VP_RANGE_SUCCESS";const CLOSE_TREE_NODE="CLOSE_TREE_NODE";const CLOSE_TREE_SUCCESS="CLOSE_TREE_SUCCESS";const CLOSE_TREE_REJECT="CLOSE_TREE_REJECT";const CREATE_VISUAL_LINK="CREATE_VISUAL_LINK";const CREATE_VP="CREATE_VP";const DISABLE_VP="DISABLE_VP";const DISABLE_VP_SUCCESS="DISABLE_VP_SUCCESS";const DISABLE_VP_REJECT="DISABLE_VP_REJECT";const ENABLE_VP="ENABLE_VP";const ENABLE_VP_SUCCESS="ENABLE_VP_SUCCESS";const ENABLE_VP_REJECT="ENABLE_VP_REJECT";const GET_TABLE_META="GET_TABLE_META";const GET_VP_VISUAL_LINKS="GET_VP_VISUAL_LINKS";const GET_VIEW_PORT_MENUS="GET_VIEW_PORT_MENUS";const VIEW_PORT_MENUS_SELECT_RPC="VIEW_PORT_MENUS_SELECT_RPC";const VIEW_PORT_MENU_CELL_RPC="VIEW_PORT_MENU_CELL_RPC";const VIEW_PORT_MENU_TABLE_RPC="VIEW_PORT_MENU_TABLE_RPC";const VIEW_PORT_MENU_ROW_RPC="VIEW_PORT_MENU_ROW_RPC";const VIEW_PORT_MENU_RESP="VIEW_PORT_MENU_RESP";const VIEW_PORT_MENU_REJ="VIEW_PORT_MENU_REJ";const HB="HB";const HB_RESP="HB_RESP";const OPEN_TREE_NODE="OPEN_TREE_NODE";const OPEN_TREE_SUCCESS="OPEN_TREE_SUCCESS";const OPEN_TREE_REJECT="OPEN_TREE_REJECT";const REMOVE_VP="REMOVE_VP";const REMOVE_VP_REJECT="REMOVE_VP_REJECT";const MENU_RPC_RESP="MENU_RPC_RESP";const TABLE_ROW="TABLE_ROW";const SIZE="SIZE";const UPDATE="U";function _check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function _class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function _class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function _class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function _class_private_field_get(receiver,privateMap){var descriptor=_class_extract_field_descriptor(receiver,privateMap,"get");return _class_apply_descriptor_get(receiver,descriptor)}function _class_private_field_init(obj,privateMap,value){_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function _class_private_field_set(receiver,privateMap,value){var descriptor=_class_extract_field_descriptor(receiver,privateMap,"set");_class_apply_descriptor_set(receiver,descriptor,value);return value}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}var _baseFrom=new WeakMap,_renderBufferSize=new WeakMap,_baseTo=new WeakMap;class RangeImpl{get reset(){return new RangeImpl(0,_class_private_field_get(this,_baseTo)-_class_private_field_get(this,_baseFrom),_class_private_field_get(this,_renderBufferSize))}get withBuffer(){return getFullRange(this,_class_private_field_get(this,_renderBufferSize))}equals(range){return range.from===_class_private_field_get(this,_baseFrom)&&range.to===_class_private_field_get(this,_baseTo)}toJson(){return{from:this.from,to:this.to,baseFrom:_class_private_field_get(this,_baseFrom),baseTo:_class_private_field_get(this,_baseTo),renderBufferSize:_class_private_field_get(this,_renderBufferSize)}}constructor(from,to,renderBufferSize=0){_define_property(this,"from",void 0);_define_property(this,"to",void 0);_class_private_field_init(this,_baseFrom,{writable:true,value:void 0});_class_private_field_init(this,_renderBufferSize,{writable:true,value:void 0});_class_private_field_init(this,_baseTo,{writable:true,value:void 0});this.from=from;this.to=to;_class_private_field_set(this,_renderBufferSize,0);_class_private_field_set(this,_baseFrom,from);_class_private_field_set(this,_baseTo,to);_class_private_field_set(this,_renderBufferSize,renderBufferSize)}}const Range=(from,to,renderBufferSize)=>new RangeImpl(from,to,renderBufferSize);const NULL_RANGE=Range(0,0);function getFullRange({from,to},bufferSize=0,maxRangeEnd=Number.MAX_SAFE_INTEGER){if(from===0&&to===0){return{from,to}}else if(bufferSize===0){if(maxRangeEnd<from){return{from:0,to:0}}else{return{from,to:Math.min(to,maxRangeEnd)}}}else if(from===0){return{from,to:Math.min(to+bufferSize,maxRangeEnd)}}else{const shortfallBefore=from-bufferSize<0;const shortfallAfter=maxRangeEnd-(to+bufferSize)<0;if(shortfallBefore&&shortfallAfter){return{from:0,to:maxRangeEnd}}else if(shortfallBefore){return{from:0,to:to+bufferSize}}else if(shortfallAfter){return{from:Math.max(0,from-bufferSize),to:maxRangeEnd}}else{return{from:from-bufferSize,to:to+bufferSize}}}}const withinRange=(value,{from,to})=>value>=from&&value<to;const rangeNewItems=({from:from1,to:to1},newRange)=>{const{from:from2,to:to2}=newRange;const noOverlap=from2>=to1||to2<=from1;const newFullySubsumesOld=from2<from1&&to2>to1;return noOverlap||newFullySubsumesOld?newRange:to2>to1?{from:to1,to:to2}:{from:from2,to:from1}};class WindowRange{isWithin(index){return withinRange(index,this)}overlap(from,to){return from>=this.to||to<this.from?[0,0]:[Math.max(from,this.from),Math.min(to,this.to)]}copy(){return new WindowRange(this.from,this.to)}constructor(from,to){_define_property(this,"from",void 0);_define_property(this,"to",void 0);this.from=from;this.to=to}}const constrainRangeWidth=(range,maxRangeWidth=Number.MAX_SAFE_INTEGER)=>{if(range.to-range.from<maxRangeWidth){return range}console.warn(`[range-utils] range ${range.from} - ${range.to} exceeds maxRangeWidth ${maxRangeWidth} for this table `);return{from:range.from,to:range.from+maxRangeWidth}};const constrainRange=(range,maxRangeEnd,maxRangeWidth)=>{if(maxRangeEnd>0&&maxRangeEnd<range.to){if(maxRangeEnd>range.from){return constrainRangeWidth({from:range.from,to:maxRangeEnd},maxRangeWidth)}else{throw Error(`constrainRange: cannot apply the maxRangeEnd ${maxRangeEnd} to range ${range.from} - ${range.to}`)}}else{return constrainRangeWidth(range,maxRangeWidth)}};function debug_utils_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:debug_utils_debug,debugEnabled:debug_utils_debugEnabled}=logger("range-monitor");class RangeMonitor{isSet(){return this.timestamp!==0}set({from,to}){const{timestamp}=this;this.range.from=from;this.range.to=to;this.timestamp=performance.now();if(timestamp){debug_utils_debugEnabled&&debug_utils_debug(`<${this.source}> [${from}-${to}], ${(this.timestamp-timestamp).toFixed(0)} ms elapsed`)}else{return 0}}constructor(source){debug_utils_define_property(this,"source",void 0);debug_utils_define_property(this,"range",void 0);debug_utils_define_property(this,"timestamp",void 0);this.source=source;this.range={from:0,to:0};this.timestamp=0}};function keyset_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY=[];class KeySet{next(free=EMPTY){if(free.length>0){return free.shift()}else{return this.nextKeyValue++}}init({from,to}){this.keys.clear();this.freeKeys.length=0;this.nextKeyValue=0;for(let rowIndex=from;rowIndex<to;rowIndex++){const nextKeyValue=this.next();this.keys.set(rowIndex,nextKeyValue)}return true}reset({from,to}){this.range={from,to};const{freeKeys}=this;this.keys.forEach((keyValue,rowIndex)=>{if(rowIndex<from||rowIndex>=to){freeKeys.push(keyValue);this.keys.delete(rowIndex)}});let freeKeyIndex=0;for(let rowIndex=from;rowIndex<to;rowIndex++){if(!this.keys.has(rowIndex)){const nextKeyValue=freeKeyIndex<freeKeys.length?freeKeys[freeKeyIndex++]:this.nextKeyValue++;this.keys.set(rowIndex,nextKeyValue)}}if(freeKeyIndex>0){freeKeys.splice(0,freeKeyIndex)}return false}keyFor(rowIndex){const key=this.keys.get(rowIndex);if(key===undefined){console.log(`key not found\n keys: ${this.toDebugString()}\n `);throw Error(`KeySet, no key found for rowIndex ${rowIndex}`)}return key}toDebugString(){return`${this.keys.size} keys\n${Array.from(this.keys.entries()).sort(([key1],[key2])=>key1-key2).map(([k,v])=>`${k}=>${v}`).join(",")}]\n`}constructor(range){keyset_define_property(this,"keys",new Map);keyset_define_property(this,"freeKeys",[]);keyset_define_property(this,"nextKeyValue",0);keyset_define_property(this,"range",void 0);this.range={from:range.from,to:range.to};this.init(range)}};function array_backed_moving_window_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function array_backed_moving_window_class_private_field_get(receiver,privateMap){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,"get");return array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor)}function array_backed_moving_window_class_private_field_init(obj,privateMap,value){array_backed_moving_window_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function array_backed_moving_window_class_private_field_set(receiver,privateMap,value){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,"set");array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value);return value}function array_backed_moving_window_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY_ARRAY=[];const log=logger("array-backed-moving-window");function dataIsUnchanged(newRow,existingRow){if(!existingRow){return false}if(existingRow.data.length!==newRow.data.length){return false}if(existingRow.sel!==newRow.sel){return false}for(let i=0;i<existingRow.data.length;i++){if(existingRow.data[i]!==newRow.data[i]){return false}}return true}var _range=new WeakMap;class ArrayBackedMovingWindow{get range(){return array_backed_moving_window_class_private_field_get(this,_range)}outOfRange(firstIndex,lastIndex){const{from,to}=this.range;if(lastIndex<from){return true}if(firstIndex>=to){return true}}setAtIndex(row){const{rowIndex:index}=row;const internalIndex=index-array_backed_moving_window_class_private_field_get(this,_range).from;if(dataIsUnchanged(row,this.internalData[internalIndex])){return false}const isWithinClientRange=this.isWithinClientRange(index);if(isWithinClientRange||this.isWithinRange(index)){if(!this.internalData[internalIndex]&&isWithinClientRange){this.rowsWithinRange+=1}this.internalData[internalIndex]=row}return isWithinClientRange}getAtIndex(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)&&this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]!=null?this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]:undefined}isWithinRange(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)}isWithinClientRange(index){return this.clientRange.isWithin(index)}setClientRange(from,to){log.debug?.(`setClientRange ${from} - ${to}`);const currentFrom=this.clientRange.from;const currentTo=Math.min(this.clientRange.to,this.rowCount);if(from===currentFrom&&to===currentTo){this.clientRange.to=to;return[false,EMPTY_ARRAY]}const originalRange=this.clientRange.copy();this.clientRange.from=from;this.clientRange.to=to;this.rowsWithinRange=0;for(let i=from;i<to;i++){const internalIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[internalIndex]){this.rowsWithinRange+=1}}const clientRows=[];const offset=array_backed_moving_window_class_private_field_get(this,_range).from;for(let i=from;i<to;i++){if(i<originalRange.from||i>=originalRange.to){const row=this.internalData[i-offset];if(row){clientRows.push(row)}}}const serverDataRequired=this.bufferBreakout(from,to);return[serverDataRequired,clientRows]}setRange(from,to){if(from!==array_backed_moving_window_class_private_field_get(this,_range).from||to!==array_backed_moving_window_class_private_field_get(this,_range).to){log.debug?.(`setRange ${from} - ${to}`);const[overlapFrom,overlapTo]=array_backed_moving_window_class_private_field_get(this,_range).overlap(from,to);const newData=new Array(to-from);this.rowsWithinRange=0;for(let i=overlapFrom;i<overlapTo;i++){const row=this.getAtIndex(i);if(row){const index=i-from;newData[index]=row;if(this.isWithinClientRange(i)){this.rowsWithinRange+=1}}}this.internalData=newData;array_backed_moving_window_class_private_field_get(this,_range).from=from;array_backed_moving_window_class_private_field_get(this,_range).to=to}else{log.debug?.(`setRange ${from} - ${to} IGNORED because not changed`)}}get data(){return this.internalData}getData(){const{from,to}=array_backed_moving_window_class_private_field_get(this,_range);const{from:clientFrom,to:clientTo}=this.clientRange;const startOffset=Math.max(0,clientFrom-from);const endOffset=Math.min(to-from,to,clientTo-from,this.rowCount??to);return this.internalData.slice(startOffset,endOffset)}clear(){log.debug?.("clear");this.internalData.length=0;this.rowsWithinRange=0;this.setRowCount(0)}getCurrentDataRange(){const rows=this.internalData;const len=rows.length;let[firstRow]=this.internalData;let lastRow=this.internalData[len-1];if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{for(let i=0;i<len;i++){if(rows[i]!==undefined){firstRow=rows[i];break}}for(let i=len-1;i>=0;i--){if(rows[i]!==undefined){lastRow=rows[i];break}}if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{return[-1,-1]}}}constructor({from:clientFrom,to:clientTo},{from,to},bufferSize){array_backed_moving_window_class_private_field_init(this,_range,{writable:true,value:void 0});array_backed_moving_window_define_property(this,"bufferSize",void 0);array_backed_moving_window_define_property(this,"internalData",void 0);array_backed_moving_window_define_property(this,"rowsWithinRange",void 0);array_backed_moving_window_define_property(this,"clientRange",void 0);array_backed_moving_window_define_property(this,"rowCount",void 0);array_backed_moving_window_define_property(this,"setRowCount",rowCount=>{log.info?.(`setRowCount ${rowCount}`);const dataLength=Math.max(0,rowCount-array_backed_moving_window_class_private_field_get(this,_range).from);if(dataLength<this.internalData.length){this.internalData.length=dataLength}if(rowCount<this.rowCount){this.rowsWithinRange=0;const end=Math.min(rowCount,this.clientRange.to);for(let i=this.clientRange.from;i<end;i++){const rowIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[rowIndex]!==undefined){this.rowsWithinRange+=1}}}this.rowCount=rowCount});array_backed_moving_window_define_property(this,"bufferBreakout",(from,to)=>{const bufferPerimeter=this.bufferSize*.25;if(array_backed_moving_window_class_private_field_get(this,_range).to-to<bufferPerimeter){return true}else if(array_backed_moving_window_class_private_field_get(this,_range).from>0&&from-array_backed_moving_window_class_private_field_get(this,_range).from<bufferPerimeter){return true}else{return false}});this.bufferSize=bufferSize;this.clientRange=new WindowRange(clientFrom,clientTo);array_backed_moving_window_class_private_field_set(this,_range,new WindowRange(from,to));this.internalData=new Array(bufferSize);this.rowsWithinRange=0;this.rowCount=0}};function viewport_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function viewport_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function viewport_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function viewport_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function viewport_class_private_field_get(receiver,privateMap){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,"get");return viewport_class_apply_descriptor_get(receiver,descriptor)}function viewport_class_private_field_init(obj,privateMap,value){viewport_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function viewport_class_private_field_set(receiver,privateMap,value){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,"set");viewport_class_apply_descriptor_set(receiver,descriptor,value);return value}function viewport_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:viewport_debug,debugEnabled:viewport_debugEnabled,error:viewport_error,info:viewport_info,infoEnabled:viewport_infoEnabled,warn:viewport_warn}=logger("Viewport");const isLeafUpdate=({rowKey,updateType})=>updateType==="U"&&!rowKey.startsWith("$root");const NO_DATA_UPDATE=[undefined,undefined];const NO_UPDATE_STATUS={count:0,mode:undefined,size:0,ts:0};var _status=new WeakMap,_clientRange=new WeakMap,_maxRangeEnd=new WeakMap;class Viewport{get hasUpdatesToProcess(){if(this.suspended){return false}return this.rowCountChanged||this.hasUpdates}get size(){return this.dataWindow.rowCount??0}get clientRange(){return viewport_class_private_field_get(this,_clientRange)}get status(){return viewport_class_private_field_get(this,_status)}set status(status){viewport_class_private_field_set(this,_status,status)}subscribe(){const{filter}=this.filter;this.status=viewport_class_private_field_get(this,_status)==="subscribed"?"resubscribing":"subscribing";return{type:CREATE_VP,table:this.table,range:getFullRange(viewport_class_private_field_get(this,_clientRange),this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter}}}handleSubscribed({viewPortId,aggregations,columns,filterSpec:filter,range,sort,groupBy,table},baseTableSchema){this.serverViewportId=viewPortId;this.status="subscribed";this.aggregations=aggregations;this.columns=columns;this.groupBy=groupBy;this.isTree=groupBy&&groupBy.length>0;this.dataWindow.setRange(range.from,range.to);const tableSchema=table===baseTableSchema.table.table?baseTableSchema:{...baseTableSchema,table:{...baseTableSchema.table,session:table}};if(tableSchema.rangeLimits){viewport_class_private_field_set(this,_maxRangeEnd,tableSchema.rangeLimits?.maxRangeEnd)}return{aggregations,type:"subscribed",clientViewportId:this.clientViewportId,columns,filterSpec:filter,groupBy,range,sort,tableSchema}}awaitOperation(requestId,msg){this.pendingOperations.set(requestId,msg)}rejectOperation(requestId,_msg){const{pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to reject for requestId ${requestId}`);return}const{type}=pendingOperation;pendingOperations.delete(requestId);if(type==="CHANGE_VP_RANGE"){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.nacked=true;break}else{viewport_warn?.("range requests sent faster than they are being ACKed")}}}}completeOperation(requestId,...params){const{clientViewportId,pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to complete for requestId ${requestId}`);return}const{type}=pendingOperation;viewport_info?.(`completeOperation ${type}`);pendingOperations.delete(requestId);if(type==="CHANGE_VP_RANGE"){const[from,to]=params;viewport_infoEnabled&&viewport_info(`completeOperation CHANGE_VP_RANGE\n window setRange (${from}:${to}) ${this.pendingRangeRequests.length} range requests pending`);this.dataWindow?.setRange(from,to);for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.acked=true;break}else{viewport_warn?.("range requests sent faster than they are being ACKed")}}}else if(type==="config"){const{aggregations,columns,filterSpec:filter,groupBy,sort}=pendingOperation.data;this.aggregations=aggregations;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.sort=sort;if(groupBy.length>0){this.isTree=true}else if(this.isTree){this.isTree=false}viewport_debug?.(`config change confirmed, isTree : ${this.isTree}`);return{clientViewportId,type,config:pendingOperation.data}}else if(type==="selection"){}else if(type==="disable"){this.suspended=false;this.disabled=true;this.disabledActive=pendingOperation.disableActive;return{type:"disabled",clientViewportId}}else if(type==="enable"){this.disabled=false;this.disabledActive=false;return{type:"enabled",clientViewportId}}else if(type==="freeze"){this.frozen=true;return{type:"frozen",clientViewportId}}else if(type==="unfreeze"){this.frozen=false;return{type:"unfrozen",clientViewportId}}else if(type==="CREATE_VISUAL_LINK"){const[colName,parentViewportId,parentColName]=params;this.linkedParent={colName,parentViewportId,parentColName};this.pendingLinkedParent=undefined;return{requestId,type:"vuu-link-created",clientViewportId,colName,parentViewportId,parentColName}}else if(type==="REMOVE_VISUAL_LINK"){this.linkedParent=undefined;return{requestId,type:"vuu-link-removed",clientViewportId}}}rangeRequest(requestId,range){if(viewport_debugEnabled){this.rangeMonitor.set(range)}viewport_infoEnabled&&viewport_info(`(bufferSize ${this.bufferSize}) rangeRequest (${range.from}:${range.to}) current: window client (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), full (${this.dataWindow.range.from}:${this.dataWindow.range.to}) `);const type="CHANGE_VP_RANGE";if(this.dataWindow){const[serverDataRequired,clientRows]=this.dataWindow.setClientRange(range.from,range.to);viewport_infoEnabled&&viewport_info(`updated: dataWindow clientRange (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), fullRange (${this.dataWindow.range.from}:${this.dataWindow.range.to}) serverDataRequired ${serverDataRequired?"Y":"N"} ${clientRows.length} rows returned from local buffer`);let debounceRequest;const maxRange=viewport_class_private_field_get(this,_maxRangeEnd);const serverRequest=serverDataRequired&&!this.rangeRequestAlreadyPending(range)?{type,viewPortId:this.serverViewportId,...getFullRange(range,this.bufferSize,maxRange)}:null;if(serverRequest){viewport_infoEnabled&&viewport_info(`create CHANGE_VP_RANGE: (${serverRequest.from} - ${serverRequest.to})`);viewport_debugEnabled&&viewport_debug?.(`create CHANGE_VP_RANGE: [${serverRequest.from} - ${serverRequest.to}]`);this.awaitOperation(requestId,{type});const pendingRequest=this.pendingRangeRequests.at(-1);if(pendingRequest){if(pendingRequest.acked){console.warn("Range Request before previous request is filled")}else{const{from,to}=pendingRequest;if(this.dataWindow.outOfRange(from,to)){debounceRequest={clientViewportId:this.clientViewportId,type:"debounce-begin"}}else{viewport_warn?.("Range Request before previous request is acked")}}}this.pendingRangeRequests.push({...serverRequest,requestId})}else if(clientRows.length>0){this.batchMode=false}this.keys.reset(this.dataWindow.clientRange);const toClient=this.isTree?toClientRowTree:toClientRow;if(clientRows.length){return[serverRequest,clientRows.map(row=>{return toClient(row,this.keys)})]}else if(debounceRequest){return[serverRequest,undefined,debounceRequest]}else{return[serverRequest]}}else{return[null]}}setLinks(links){this.links=links.filter(link=>link.parentVpId!==this.serverViewportId);return[{type:"vuu-links",links:this.links,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(menu){return{type:"vuu-menu",menu,clientViewportId:this.clientViewportId}}openTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);viewport_infoEnabled&&viewport_info(`treeKey ${treeKey}`);return{type:OPEN_TREE_NODE,vpId:this.serverViewportId,treeKey}}closeTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);return{type:CLOSE_TREE_NODE,vpId:this.serverViewportId,treeKey}}createLink(requestId,vuuCreateVisualLink){const message={...vuuCreateVisualLink,childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}removeLink(requestId){const message={type:"REMOVE_VISUAL_LINK",childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}suspend(){this.suspended=true;this.pendingUpdates.length=0;viewport_info?.("suspend")}resume(){this.suspended=false;if(viewport_debugEnabled){viewport_debug?.(`resume: ${this.currentData()}`)}return[this.size,this.currentData()]}currentData(){const out=[];if(this.dataWindow){const records=this.dataWindow.getData();const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;for(const row of records){if(row){out.push(toClient(row,keys))}}}return out}enable(requestId){this.awaitOperation(requestId,{type:"enable"});viewport_info?.(`enable: ${this.serverViewportId}`);return{type:ENABLE_VP,viewPortId:this.serverViewportId}}disable(requestId,disableActive=false){this.awaitOperation(requestId,{type:"disable",disableActive});viewport_info?.(`disable: ${this.serverViewportId}`);return{type:DISABLE_VP,viewPortId:this.serverViewportId}}freeze(requestId){this.awaitOperation(requestId,{type:"freeze"});viewport_info?.(`freeze: ${this.serverViewportId}`);return{type:"FREEZE_VP",viewPortId:this.serverViewportId}}unfreeze(requestId){this.awaitOperation(requestId,{type:"unfreeze"});viewport_info?.(`unfreeze: ${this.serverViewportId}`);this.frozen=false;return{type:"UNFREEZE_VP",viewPortId:this.serverViewportId}}setConfig(requestId,config){this.awaitOperation(requestId,{type:"config",data:config});const{filterSpec:filter,...remainingConfig}=config;viewport_debugEnabled?viewport_debug?.(`setConfig ${JSON.stringify(config)}`):viewport_info?.(`setConfig`);if(!this.isTree&&config.groupBy.length>0){this.dataWindow?.clear()}return this.createRequest({...remainingConfig,filterSpec:typeof filter?.filter==="string"?{filter:filter.filter}:{filter:""}},true)}selectRequest(request){viewport_info?.(`selectRequest: ${request.type}`);if(this.serverViewportId){return{...request,vpId:this.serverViewportId}}else{throw Error(`[Viewport] cannot process ${request.type} before serverViewportId has been set`)}}removePendingRangeRequest(firstIndex,lastIndex){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const{from,to}=this.pendingRangeRequests[i];let isLast=true;if(firstIndex>=from&&firstIndex<to||lastIndex>from&&lastIndex<to){if(!isLast){console.warn("removePendingRangeRequest TABLE_ROWS are not for latest request")}this.pendingRangeRequests.splice(i,1);break}else{isLast=false}}}clearCache(){this.dataWindow.setRowCount(0);this.postMessageToClient({clientViewportId:this.clientViewportId,type:"viewport-clear"})}updateRows(rows){const[firstRow,lastRow]=getFirstAndLastRows(rows);if(firstRow&&lastRow){this.removePendingRangeRequest(firstRow.rowIndex,lastRow.rowIndex)}if(rows.length===1){if(firstRow.vpSize===0&&this.disabled){viewport_debug?.(`ignore a SIZE=0 message on disabled viewport (${rows.length} rows)`);return}}for(const row of rows){if(this.isTree&&isLeafUpdate(row)){continue}else{if(row.updateType==="SIZE"||this.dataWindow?.rowCount!==row.vpSize){this.dataWindow?.setRowCount(row.vpSize);this.rowCountChanged=true}if(row.updateType==="U"){if(this.dataWindow?.setAtIndex(row)){if(this.suspended!==true){this.hasUpdates=true;if(!this.batchMode){this.pendingUpdates.push(row)}}}}}}}getKeyForRowAtIndex(rowIndex){const row=this.dataWindow.getAtIndex(rowIndex);return row?.rowKey}getClientRows(){let out=undefined;let mode="size-only";if(!this.hasUpdates&&!this.rowCountChanged){return NO_DATA_UPDATE}if(this.hasUpdates){const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;if(this.updateThrottleTimer){self.clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}if(this.pendingUpdates.length>0){out=[];mode="update";for(const row of this.pendingUpdates){out.push(toClient(row,keys))}}this.pendingUpdates.length=0;this.hasUpdates=false}if(this.throttleMessage(mode)){return NO_DATA_UPDATE}else{return[out,mode]}}createRequest(params,overWrite=false){if(overWrite){return{type:"CHANGE_VP",viewPortId:this.serverViewportId,...params}}else{return{type:"CHANGE_VP",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...params}}}constructor({aggregations,bufferSize=50,columns,filterSpec:filter,groupBy=[],table,range,sort,title,viewport,visualLink},postMessageToClient){viewport_class_private_field_init(this,_status,{writable:true,value:""});viewport_define_property(this,"aggregations",void 0);viewport_define_property(this,"batchMode",false);viewport_define_property(this,"bufferSize",void 0);viewport_class_private_field_init(this,_clientRange,{writable:true,value:void 0});viewport_define_property(this,"columns",void 0);viewport_define_property(this,"dataWindow",void 0);viewport_define_property(this,"filter",void 0);viewport_define_property(this,"groupBy",void 0);viewport_define_property(this,"sort",void 0);viewport_define_property(this,"hasUpdates",false);viewport_define_property(this,"pendingUpdates",[]);viewport_define_property(this,"keys",void 0);viewport_class_private_field_init(this,_maxRangeEnd,{writable:true,value:Number.MAX_SAFE_INTEGER});viewport_define_property(this,"pendingLinkedParent",void 0);viewport_define_property(this,"pendingOperations",new Map);viewport_define_property(this,"pendingRangeRequests",[]);viewport_define_property(this,"postMessageToClient",void 0);viewport_define_property(this,"rowCountChanged",false);viewport_define_property(this,"lastUpdateStatus",{...NO_UPDATE_STATUS});viewport_define_property(this,"updateThrottleTimer",undefined);viewport_define_property(this,"rangeMonitor",new RangeMonitor("ViewPort"));viewport_define_property(this,"clientViewportId",void 0);viewport_define_property(this,"disabled",false);viewport_define_property(this,"disabledActive",false);viewport_define_property(this,"frozen",false);viewport_define_property(this,"isTree",false);viewport_define_property(this,"links",void 0);viewport_define_property(this,"linkedParent",void 0);viewport_define_property(this,"serverViewportId",void 0);viewport_define_property(this,"suspended",false);viewport_define_property(this,"suspendTimer",null);viewport_define_property(this,"table",void 0);viewport_define_property(this,"title",void 0);viewport_define_property(this,"setLastSizeOnlyUpdateSize",size=>{this.lastUpdateStatus.size=size});viewport_define_property(this,"setLastUpdate",mode=>{const{ts:lastTS,mode:lastMode}=this.lastUpdateStatus;let elapsedTime=0;if(lastMode===mode){const ts=Date.now();this.lastUpdateStatus.count+=1;this.lastUpdateStatus.ts=ts;elapsedTime=lastTS===0?0:ts-lastTS}else{this.lastUpdateStatus.count=1;this.lastUpdateStatus.ts=0;elapsedTime=0}this.lastUpdateStatus.mode=mode;return elapsedTime});viewport_define_property(this,"rangeRequestAlreadyPending",range=>{const{bufferSize}=this;const bufferThreshold=bufferSize*.25;let{from:stillPendingFrom}=range;for(const{from,to}of this.pendingRangeRequests){if(stillPendingFrom>=from&&stillPendingFrom<to){if(range.to+bufferThreshold<=to){return true}else{stillPendingFrom=to}}}return false});viewport_define_property(this,"sendThrottledSizeMessage",()=>{this.updateThrottleTimer=undefined;this.lastUpdateStatus.count=3;this.postMessageToClient({clientViewportId:this.clientViewportId,mode:"size-only",size:this.lastUpdateStatus.size,type:"viewport-update"})});viewport_define_property(this,"shouldThrottleMessage",mode=>{const elapsedTime=this.setLastUpdate(mode);return mode==="size-only"&&elapsedTime>0&&elapsedTime<500&&this.lastUpdateStatus.count>3});viewport_define_property(this,"throttleMessage",mode=>{if(this.shouldThrottleMessage(mode)){viewport_info?.("[Viewport] throttling updates setTimeout to 300");this.setLastSizeOnlyUpdateSize(this.dataWindow.rowCount);if(this.updateThrottleTimer===undefined){this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,100)}return true}else if(this.updateThrottleTimer!==undefined){clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}return false});viewport_define_property(this,"getNewRowCount",()=>{if(this.rowCountChanged&&this.dataWindow){this.rowCountChanged=false;return this.dataWindow.rowCount}});this.aggregations=aggregations;this.bufferSize=bufferSize;viewport_class_private_field_set(this,_clientRange,range);this.clientViewportId=viewport;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.keys=new KeySet(range);this.pendingLinkedParent=visualLink;this.table=table;this.sort=sort;this.title=title;viewport_infoEnabled&&viewport_info?.(`${table.table} #${viewport}, bufferSize=${bufferSize}`);this.dataWindow=new ArrayBackedMovingWindow(viewport_class_private_field_get(this,_clientRange),range,this.bufferSize);this.postMessageToClient=postMessageToClient}}const viewport_isNew=false;const toClientRow=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{return[rowIndex,keys.keyFor(rowIndex),true,false,0,0,rowKey,isSelected,ts,viewport_isNew].concat(data)};const toClientRowTree=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{const[depth,isExpanded,,isLeaf,,count,...rest]=data;return[rowIndex,keys.keyFor(rowIndex),isLeaf,isExpanded,depth,count,rowKey,isSelected,ts,viewport_isNew].concat(rest)};function event_emitter_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function event_emitter_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function event_emitter_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function event_emitter_class_private_field_get(receiver,privateMap){var descriptor=event_emitter_class_extract_field_descriptor(receiver,privateMap,"get");return event_emitter_class_apply_descriptor_get(receiver,descriptor)}function event_emitter_class_private_field_init(obj,privateMap,value){event_emitter_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function isArrayOfListeners(listeners){return Array.isArray(listeners)}function isOnlyListener(listeners){return!Array.isArray(listeners)}var _events=new WeakMap;class EventEmitter{addListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(!listeners){event_emitter_class_private_field_get(this,_events).set(event,listener)}else if(isArrayOfListeners(listeners)){listeners.push(listener)}else if(isOnlyListener(listeners)){event_emitter_class_private_field_get(this,_events).set(event,[listeners,listener])}}removeListener(event,listener){if(!event_emitter_class_private_field_get(this,_events).has(event)){return}const listenerOrListeners=event_emitter_class_private_field_get(this,_events).get(event);let position=-1;if(listenerOrListeners===listener){event_emitter_class_private_field_get(this,_events).delete(event)}else if(Array.isArray(listenerOrListeners)){for(let i=listenerOrListeners.length;i-- >0;){if(listenerOrListeners[i]===listener){position=i;break}}if(position<0){return}if(listenerOrListeners.length===1){listenerOrListeners.length=0;event_emitter_class_private_field_get(this,_events).delete(event)}else{listenerOrListeners.splice(position,1)}}}removeAllListeners(event){if(event&&event_emitter_class_private_field_get(this,_events).has(event)){event_emitter_class_private_field_get(this,_events).delete(event)}else if(event===undefined){event_emitter_class_private_field_get(this,_events).clear()}}emit(event,...args){if(event_emitter_class_private_field_get(this,_events)){const handler=event_emitter_class_private_field_get(this,_events).get(event);if(handler){this.invokeHandler(handler,args)}}}once(event,listener){const handler=(...args)=>{this.removeListener(event,handler);listener(...args)};this.on(event,handler)}on(event,listener){this.addListener(event,listener)}hasListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(Array.isArray(listeners)){return listeners.includes(listener)}else{return listeners===listener}}invokeHandler(handler,args){if(isArrayOfListeners(handler)){handler.slice().forEach(listener=>this.invokeHandler(listener,args))}else{switch(args.length){case 0:handler();break;case 1:handler(args[0]);break;case 2:handler(args[0],args[1]);break;default:handler.call(null,...args)}}}constructor(){event_emitter_class_private_field_init(this,_events,{writable:true,value:new Map})}};function promise_utils_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function promise_utils_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function promise_utils_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function promise_utils_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function promise_utils_class_private_field_get(receiver,privateMap){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,"get");return promise_utils_class_apply_descriptor_get(receiver,descriptor)}function promise_utils_class_private_field_init(obj,privateMap,value){promise_utils_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function promise_utils_class_private_field_set(receiver,privateMap,value){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,"set");promise_utils_class_apply_descriptor_set(receiver,descriptor,value);return value}var _promise=new WeakMap,_resolve=new WeakMap,_reject=new WeakMap,_resolved=new WeakMap;class DeferredPromise{get promise(){return promise_utils_class_private_field_get(this,_promise)}get isResolved(){return promise_utils_class_private_field_get(this,_resolved)}resolve(value){promise_utils_class_private_field_set(this,_resolved,true);return promise_utils_class_private_field_get(this,_resolve).call(this,value)}get reject(){return promise_utils_class_private_field_get(this,_reject)}constructor(){promise_utils_class_private_field_init(this,_promise,{writable:true,value:void 0});promise_utils_class_private_field_init(this,_resolve,{writable:true,value:()=>console.log("resolve was not set")});promise_utils_class_private_field_init(this,_reject,{writable:true,value:()=>console.log("reject was not set")});promise_utils_class_private_field_init(this,_resolved,{writable:true,value:false});promise_utils_class_private_field_set(this,_promise,new Promise((resolve,reject)=>{promise_utils_class_private_field_set(this,_resolve,resolve);promise_utils_class_private_field_set(this,_reject,reject)}))}};function WebSocketConnection_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError("Cannot initialize the same private elements twice on an object")}}function WebSocketConnection_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError("attempted to set read only private field")}descriptor.value=value}}function WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError("attempted to "+action+" private field on non-instance");return privateMap.get(receiver)}function WebSocketConnection_class_private_field_get(receiver,privateMap){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,"get");return WebSocketConnection_class_apply_descriptor_get(receiver,descriptor)}function WebSocketConnection_class_private_field_init(obj,privateMap,value){WebSocketConnection_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function WebSocketConnection_class_private_field_set(receiver,privateMap,value){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,"set");WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value);return value}function WebSocketConnection_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const isInvalidTokenReason=text=>text==="Invalid token"||text==="Token has expired";const isInvalidSessionReason=text=>text==="Invalid session"||text==="User session limit exceeded";const{debug:WebSocketConnection_debug,debugEnabled:WebSocketConnection_debugEnabled,info:WebSocketConnection_info}=logger("WebSocketConnection");const isWebSocketConnectionStatus=msg=>typeof msg==="string"&&["connecting","websocket-open","connected","reconnecting","reconnected","disconnected","closed","failed"].includes(msg);const isConnected=status=>status==="connected"||status==="reconnected";const isLoginRejectedMessage=message=>message!==null&&"type"in message&&message.type==="LOGIN_REJECTED";const DEFAULT_CONNECTION_TIMEOUT=1e4;const parseWebSocketMessage=message=>{try{return JSON.parse(message)}catch(e){throw Error(`Error parsing JSON response from server ${message}`)}};var _callback=new WeakMap,_confirmedOpen=new WeakMap,_connectionPhase=new WeakMap,_connectionStatus=new WeakMap,_connectionTimeout=new WeakMap,_deferredOpen=new WeakMap,_protocols=new WeakMap,_url=new WeakMap,_ws=new WeakMap;class WebSocketConnection extends EventEmitter{get connectionTimeout(){return WebSocketConnection_class_private_field_get(this,_connectionTimeout)}get protocols(){return WebSocketConnection_class_private_field_get(this,_protocols)}get isClosed(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)==="closed"}get isDisconnected(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)==="disconnected"}get connectionPhase(){return WebSocketConnection_class_private_field_get(this,_connectionPhase)}get connectionStatus(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)}set connectionStatus(connectionStatus){if(connectionStatus!=="connecting"&&connectionStatus!=="reconnecting"){WebSocketConnection_class_private_field_set(this,_connectionStatus,connectionStatus);this.emit("connection-status",WebSocketConnection_class_private_field_get(this,_connectionStatus))}}get confirmedOpen(){return WebSocketConnection_class_private_field_get(this,_confirmedOpen)}set confirmedOpen(confirmedOpen){WebSocketConnection_class_private_field_set(this,_confirmedOpen,confirmedOpen);if(confirmedOpen&&WebSocketConnection_class_private_field_get(this,_connectionPhase)==="initial-connection"){WebSocketConnection_class_private_field_set(this,_connectionPhase,"post-disconnect-reconnection")}}get url(){return WebSocketConnection_class_private_field_get(this,_url)}async openWebSocket(){const initialConnect=WebSocketConnection_class_private_field_get(this,_connectionPhase)==="initial-connection";if(WebSocketConnection_class_private_field_get(this,_deferredOpen)===undefined){WebSocketConnection_class_private_field_set(this,_deferredOpen,new DeferredPromise)}const{connectionTimeout,protocols,url}=this;WebSocketConnection_class_private_field_set(this,_connectionStatus,initialConnect?"connecting":"reconnecting");const timer=setTimeout(()=>{throw Error(`Failed to open WebSocket connection to ${url}, timed out after ${connectionTimeout}ms`)},connectionTimeout);const ws=WebSocketConnection_class_private_field_set(this,_ws,new WebSocket(url,protocols));ws.onopen=()=>{this.connectionStatus="websocket-open";clearTimeout(timer);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).resolve(undefined);WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}};ws.onerror=()=>{clearTimeout(timer)};ws.onclose=()=>{if(!this.isClosed){this.confirmedOpen=false;this.connectionStatus="disconnected";this.close("failure")}};ws.onmessage=evt=>{this.receive(evt)};return WebSocketConnection_class_private_field_get(this,_deferredOpen)?.promise}close(reason="shutdown"){this.connectionStatus="closed";if(reason==="failure"){if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).reject(Error("connection failed"));WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}}else{WebSocketConnection_class_private_field_get(this,_ws)?.close()}WebSocketConnection_class_private_field_set(this,_ws,undefined)}constructor({callback,connectionTimeout=DEFAULT_CONNECTION_TIMEOUT,protocols,url}){super(),WebSocketConnection_class_private_field_init(this,_callback,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_confirmedOpen,{writable:true,value:false}),WebSocketConnection_class_private_field_init(this,_connectionPhase,{writable:true,value:"initial-connection"}),WebSocketConnection_class_private_field_init(this,_connectionStatus,{writable:true,value:"closed"}),WebSocketConnection_class_private_field_init(this,_connectionTimeout,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_deferredOpen,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_protocols,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_url,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_ws,{writable:true,value:void 0}),WebSocketConnection_define_property(this,"receive",evt=>{if(isLoginErrorMessage(evt.data)){console.warn(`[WebSocketConnection] closed because of login issue`);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){console.warn(`... and we have a deferred connection`)}WebSocketConnection_class_private_field_get(this,_callback).call(this,{type:"LOGIN_REJECTED",reason:evt.data});this.close(evt.data)}else{const vuuMessageFromServer=parseWebSocketMessage(evt.data);if(WebSocketConnection_debugEnabled){if(vuuMessageFromServer.body.type!=="HB"){WebSocketConnection_debug(`<=== ${vuuMessageFromServer.body.type}`);if(vuuMessageFromServer.body.type==="CHANGE_VP_SUCCESS"){WebSocketConnection_debug(JSON.stringify(vuuMessageFromServer.body))}}}WebSocketConnection_class_private_field_get(this,_callback).call(this,vuuMessageFromServer);if(!this.confirmedOpen){if(vuuMessageFromServer.body.type==="LOGIN_SUCCESS"){this.connectionStatus=WebSocketConnection_class_private_field_get(this,_connectionPhase)==="initial-connection"?"connected":"reconnected";this.confirmedOpen=true}}}}),WebSocketConnection_define_property(this,"send",msg=>{if(msg.body.type==="CHANGE_VP_RANGE"){WebSocketConnection_info?.(`===> CHANGE_VP_RANGE<#${msg.requestId}> ${msg.body.from}-${msg.body.to}`)}WebSocketConnection_class_private_field_get(this,_ws)?.send(JSON.stringify(msg))});WebSocketConnection_class_private_field_set(this,_callback,callback);WebSocketConnection_class_private_field_set(this,_connectionTimeout,connectionTimeout);WebSocketConnection_class_private_field_set(this,_url,url);WebSocketConnection_class_private_field_set(this,_protocols,protocols)}};function server_proxy_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}let _requestId=1;const TEST_setRequestId=id=>_requestId=id;const{debug:server_proxy_debug,debugEnabled:server_proxy_debugEnabled,error:server_proxy_error,info:server_proxy_info,infoEnabled:server_proxy_infoEnabled,warn:server_proxy_warn}=logger("ServerProxy");const nextRequestId=()=>`${_requestId++}`;const DEFAULT_OPTIONS={};const isActiveViewport=viewPort=>viewPort.disabled!==true&&viewPort.suspended!==true;const addTitleToLinks=(links,serverViewportId,label)=>links.map(link=>link.parentVpId===serverViewportId?{...link,label}:link);function addLabelsToLinks(links,viewports){return links.map(linkDescriptor=>{const{parentVpId}=linkDescriptor;const viewport=viewports.get(parentVpId);if(viewport){return{...linkDescriptor,parentClientVpId:viewport.clientViewportId,label:viewport.title}}else{throw Error("addLabelsToLinks viewport not found")}})}class ServerProxy{async login(authToken){if(authToken){this.authToken=authToken;return new Promise((resolve,reject)=>{this.sendMessageToServer({type:"LOGIN",token:this.authToken},"");this.pendingLogin={resolve,reject}})}else if(this.authToken===""){server_proxy_error("login, cannot login until auth token has been obtained")}}clearAllViewports(){this.viewports.forEach(viewport=>{viewport.clearCache()})}disconnect(){this.viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.unsubscribe(clientViewportId);this.postMessageToClient({clientViewportId,type:"viewport-clear"})})}async subscribe(message){if(!this.mapClientToServerViewport.has(message.viewport)){const pendingTableSchema=this.getTableMeta(message.table);const viewport=new Viewport(message,this.postMessageToClient);this.viewports.set(message.viewport,viewport);const pendingSubscription=this.awaitResponseToMessage(viewport.subscribe(),message.viewport);const[subscribeResponse,tableSchema]=await Promise.all([pendingSubscription,pendingTableSchema]);if(isErrorMessage(tableSchema)){this.postMessageToClient({clientViewportId:message.viewport,type:"subscribe-failed",msg:`failed to fetch schema for table ${message.table.table}: ${tableSchema.msg}`})}else if(isCreateVpSuccess(subscribeResponse)){const{viewPortId:serverViewportId}=subscribeResponse;const{status:previousViewportStatus}=viewport;if(message.viewport!==serverViewportId){this.viewports.delete(message.viewport);this.viewports.set(serverViewportId,viewport)}this.mapClientToServerViewport.set(message.viewport,serverViewportId);const clientResponse=viewport.handleSubscribed(subscribeResponse,tableSchema);if(clientResponse){this.postMessageToClient(clientResponse);if(server_proxy_debugEnabled){server_proxy_debug(`post DataSourceSubscribedMessage to client: ${JSON.stringify(clientResponse)}`)}}if(viewport.disabled){this.disableViewport(viewport)}if(this.queuedRequests.length>0){this.processQueuedRequests()}if(previousViewportStatus==="subscribing"&&!isSessionTable(viewport.table)){this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId:serverViewportId});this.sendMessageToServer({type:GET_VIEW_PORT_MENUS,vpId:serverViewportId});Array.from(this.viewports.entries()).filter(([id,{disabled,status}])=>id!==serverViewportId&&!disabled&&status==="subscribed").forEach(([vpId])=>{this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId})})}}else{this.postMessageToClient({clientViewportId:message.viewport,type:"subscribe-failed",msg:`failed to open subscription on table ${message.table.table}: ${subscribeResponse.msg}`})}}else{server_proxy_error(`spurious subscribe call ${message.viewport}`)}}addRequestToQueue(queuedRequest){const isDifferentTypeViewport=qr=>qr.clientViewportId!==queuedRequest.clientViewportId||queuedRequest.message.type!==qr.message.type;if(!this.queuedRequests.every(isDifferentTypeViewport)){this.queuedRequests=this.queuedRequests.filter(isDifferentTypeViewport)}this.queuedRequests.push(queuedRequest)}processQueuedRequests(){const newQueue=[];for(const queuedRequest of this.queuedRequests){const{clientViewportId,message,requestId}=queuedRequest;const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){this.sendMessageToServer({...message,viewPortId:serverViewportId},requestId)}else if(this.viewports.has(clientViewportId)){newQueue.push(queuedRequest)}else{console.warn(`ServerProxy processQueuedRequests, ${message.type} request not found ${clientViewportId}`)}}this.queuedRequests=newQueue}unsubscribe(clientViewportId){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){server_proxy_info?.(`Unsubscribe Message (Client to Server):\n ${serverViewportId}`);this.sendMessageToServer({type:REMOVE_VP,viewPortId:serverViewportId})}else{server_proxy_error(`failed to unsubscribe client viewport ${clientViewportId}, viewport not found`)}}getViewportForClient(clientViewportId,throws=true){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){const viewport=this.viewports.get(serverViewportId);if(viewport){return viewport}else if(throws){throw Error(`Viewport not found for client viewport ${clientViewportId}`)}else{return null}}else if(this.viewports.has(clientViewportId)){return this.viewports.get(clientViewportId)}else if(throws){throw Error(`Viewport server id not found for client viewport ${clientViewportId}`)}else{return null}}setViewRange(viewport,message){const requestId=nextRequestId();server_proxy_infoEnabled&&server_proxy_info(`setViewRange (${message.range.from}:${message.range.to})`);const[serverRequest,rows,debounceRequest]=viewport.rangeRequest(requestId,message.range);if(viewport.status==="subscribed"){server_proxy_info?.(`setViewRange ${message.range.from} - ${message.range.to}`);if(serverRequest){if(true){server_proxy_info?.(`CHANGE_VP_RANGE (${message.range.from}-${message.range.to}) => (${serverRequest.from}-${serverRequest.to})`)}server_proxy_infoEnabled&&server_proxy_info(`setViewRange send CHANGE_VP_RANGE<#${requestId}> (${serverRequest.from}-${serverRequest.to})`);this.sendMessageToServer(serverRequest,requestId)}if(rows){server_proxy_info?.(`setViewRange ${rows.length} rows returned from cache`);this.postMessageToClient({mode:"update",type:"viewport-update",clientViewportId:viewport.clientViewportId,range:message.range,rows})}else if(debounceRequest){this.postMessageToClient(debounceRequest)}}else if(serverRequest){this.addRequestToQueue({clientViewportId:message.viewport,message:serverRequest,requestId})}}setConfig(viewport,message){const requestId=nextRequestId();const request=viewport.setConfig(requestId,message.config);this.sendIfReady(request,requestId,viewport.status==="subscribed")}setTitle(viewport,message){if(viewport){viewport.title=message.title;this.updateTitleOnVisualLinks(viewport)}}select(viewport,message){const[requestId,selectRequest]=stripRequestId(message);const request=viewport.selectRequest(selectRequest);this.sendMessageToServer(request,requestId)}disableAllActiveViewports(){console.log(`[ServerProxy] disableAllActiveViewports`);this.viewports.forEach(vp=>{if(isActiveViewport(vp)){this.disableViewport(vp,true)}})}enableAllActiveViewports(){this.viewports.forEach(vp=>{if(vp.disabledActive){this.enableViewport(vp)}})}disableViewport(viewport,disableActive=false){const requestId=nextRequestId();const request=viewport.disable(requestId,disableActive);this.sendIfReady(request,requestId,viewport.status==="subscribed")}enableViewport(viewport){if(viewport.disabled){const requestId=nextRequestId();const request=viewport.enable(requestId);this.sendIfReady(request,requestId,viewport.status==="subscribed")}}freezeViewport(viewport){const requestId=nextRequestId();const request=viewport.freeze(requestId);this.sendIfReady(request,requestId,viewport.status==="subscribed")}unfreezeViewport(viewport){if(viewport.frozen){const requestId=nextRequestId();const request=viewport.unfreeze(requestId);this.sendIfReady(request,requestId,viewport.status==="subscribed")}}suspendViewport(viewport,escalateToDisable=true,escalateDelay=3e3){viewport.suspend();if(escalateToDisable){viewport.suspendTimer=setTimeout(()=>{server_proxy_info?.("suspendTimer expired, escalate suspend to disable");this.disableViewport(viewport)},escalateDelay)}}resumeViewport(viewport){if(viewport.suspendTimer){server_proxy_debug?.("clear suspend timer");clearTimeout(viewport.suspendTimer);viewport.suspendTimer=null}const[size,rows]=viewport.resume();server_proxy_debug?.(`resumeViewport size ${size}, ${rows.length} rows sent to client`);this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:"update",rows,size,type:"viewport-update"})}openTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.openTreeNode(requestId,message),requestId,viewport.status==="subscribed")}}closeTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.closeTreeNode(requestId,message),requestId,viewport.status==="subscribed")}}createLink(viewport,message){const[requestId,visualLinkRequest]=stripRequestId(message);const parentVpId=this.mapClientToServerViewport.get(message.parentVpId);if(parentVpId){const request=viewport.createLink(requestId,{...visualLinkRequest,parentVpId});this.sendMessageToServer(request,requestId)}else{throw Error(`createLink parent viewport not found ${message.parentVpId}`)}}removeLink(viewport,message){const{requestId}=message;const request=viewport.removeLink(requestId);this.sendMessageToServer(request,requestId)}updateTitleOnVisualLinks(viewport){const{serverViewportId,title}=viewport;for(const vp of this.viewports.values()){if(vp!==viewport&&vp.links&&serverViewportId&&title){if(vp.links?.some(link=>link.parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(addTitleToLinks(vp.links,serverViewportId,title));this.postMessageToClient(messageToClient)}}}}removeViewportFromVisualLinks(serverViewportId){for(const vp of this.viewports.values()){if(vp.links?.some(({parentVpId})=>parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(vp.links.filter(({parentVpId})=>parentVpId!==serverViewportId));this.postMessageToClient(messageToClient)}}}menuRpcCall(message){const viewport=this.getViewportForClient(message.vpId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,vpId:viewport.serverViewportId},requestId)}}rpcRequest(message){if(hasViewPortContext(message)){const viewport=this.getViewportForClient(message.context.viewPortId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,context:{type:"VIEWPORT_CONTEXT",viewPortId:viewport.serverViewportId}},requestId)}}else{throw Error(`[ServerProxy] rpcRequest only supports VIEWPORT_CONTEXT at present`)}}handleMessageFromClient(message){if(isViewportMessage(message)||isVisualLinkMessage(message)){if(message.type==="disable"){const viewport=this.getViewportForClient(message.viewport,false);if(viewport!==null){return this.disableViewport(viewport)}else{return}}else{const viewport=isVisualLinkMessage(message)?this.getViewportForClient(message.childVpId):this.getViewportForClient(message.viewport);switch(message.type){case"setViewRange":return this.setViewRange(viewport,message);case"config":return this.setConfig(viewport,message);case"suspend":{const{escalateToDisable,escalateDelay}=message;return this.suspendViewport(viewport,escalateToDisable,escalateDelay)}case"resume":return this.resumeViewport(viewport);case"enable":return this.enableViewport(viewport);case"FREEZE_VP":return this.freezeViewport(viewport);case"UNFREEZE_VP":return this.unfreezeViewport(viewport);case"openTreeNode":return this.openTreeNode(viewport,message);case"closeTreeNode":return this.closeTreeNode(viewport,message);case"CREATE_VISUAL_LINK":return this.createLink(viewport,message);case"REMOVE_VISUAL_LINK":return this.removeLink(viewport,message);case"setTitle":return this.setTitle(viewport,message);default:}}}else if(isSelectRequest(message)){if(hasRequestId(message)){const viewport=this.getViewportForClient(message.vpId);return this.select(viewport,message)}else{console.warn(`selectRequest must have requestId`)}}else if(isRpcServiceRequest(message)){return this.rpcRequest(message)}else if(isVuuMenuRpcRequest(message)){return this.menuRpcCall(message)}else if(message.type==="disconnect"){return this.disconnect()}else if(message.type==="disable-all-active"){return this.disableAllActiveViewports()}else if(message.type==="enable-all-active"){return this.enableAllActiveViewports()}else{const{type,requestId}=message;switch(type){case"GET_TABLE_LIST":{this.tableList??(this.tableList=this.awaitResponseToMessage({type},requestId));this.tableList.then(response=>{this.postMessageToClient({type:"TABLE_LIST_RESP",tables:response.tables,requestId})});return}case"GET_TABLE_META":{this.getTableMeta(message.table,requestId).then(tableSchema=>{if(isErrorMessage(tableSchema)){}else if(tableSchema){this.postMessageToClient({type:"TABLE_META_RESP",tableSchema,requestId})}});return}default:}}server_proxy_error(`Vuu ServerProxy Unexpected message from client ${JSON.stringify(message)}`)}getTableMeta(table,requestId=nextRequestId()){if(isSessionTable(table)){return this.awaitResponseToMessage({type:"GET_TABLE_META",table},requestId).then(resp=>isErrorMessage(resp)?resp:createSchemaFromTableMetadata(resp))}const key=`${table.module}:${table.table}`;let tableMetaRequest=this.cachedTableMetaRequests.get(key);if(!tableMetaRequest){tableMetaRequest=this.awaitResponseToMessage({type:"GET_TABLE_META",table},requestId);this.cachedTableMetaRequests.set(key,tableMetaRequest)}return tableMetaRequest?.then(response=>{if(isErrorMessage(response)){return response}else{return this.cacheTableMeta(response)}})}awaitResponseToMessage(message,requestId=nextRequestId()){return new Promise((resolve,reject)=>{this.sendMessageToServer(message,requestId);this.pendingRequests.set(requestId,{reject,resolve})})}sendIfReady(message,requestId,isReady=true){if(isReady){this.sendMessageToServer(message,requestId)}return isReady}sendMessageToServer(body,requestId=`${_requestId++}`,options=DEFAULT_OPTIONS){const{module="CORE"}=options;if(this.authToken){this.connection.send({requestId,sessionId:this.sessionId,module,body})}}handleMessageFromServer(message){if(isLoginRejectedMessage(message)){if(this.pendingLogin){this.pendingLogin.reject(message.reason);this.pendingLogin=undefined;this.authToken=""}return}const{body,requestId,sessionId}=message;const pendingRequest=this.pendingRequests.get(requestId);if(pendingRequest){const{resolve}=pendingRequest;this.pendingRequests.delete(requestId);resolve(body);return}const{viewports}=this;switch(body.type){case"HB":this.sendMessageToServer({type:HB_RESP,ts:+new Date},"NA");break;case"LOGIN_SUCCESS":if(sessionId){this.sessionId=sessionId;this.pendingLogin?.resolve(sessionId);this.pendingLogin=undefined;this.postMessageToClient({...body,sessionId})}else{throw Error("LOGIN_SUCCESS did not provide sessionId")}break;case"REMOVE_VP_SUCCESS":{const viewport=viewports.get(body.viewPortId);if(viewport){this.mapClientToServerViewport.delete(viewport.clientViewportId);viewports.delete(body.viewPortId);this.removeViewportFromVisualLinks(body.viewPortId)}}break;case"SELECT_ALL_SUCCESS":case"SELECT_ROW_SUCCESS":case"SELECT_ROW_RANGE_SUCCESS":case"DESELECT_ROW_SUCCESS":{const{type,selectedRowCount}=body;this.postMessageToClient({requestId,type,selectedRowCount});break}case"DESELECT_ALL_SUCCESS":{const{type}=body;this.postMessageToClient({requestId,type,selectedRowCount:0});break}case"SELECT_ROW_REJECT":case"DESELECT_ROW_REJECT":case"SELECT_ROW_RANGE_REJECT":case"SELECT_ALL_REJECT":case"DESELECT_ALL_REJECT":console.warn(`select error ${body.type} ${body.errorMsg}`);break;case CHANGE_VP_SUCCESS:case DISABLE_VP_SUCCESS:if(viewports.has(body.viewPortId)){const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response!==undefined){this.postMessageToClient(response);if(server_proxy_debugEnabled){server_proxy_debug(`postMessageToClient ${JSON.stringify(response)}`)}}}}break;case ENABLE_VP_SUCCESS:{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response);const[size,rows]=viewport.resume();this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:"update",rows,size,type:"viewport-update"})}}}break;case"FREEZE_VP_SUCCESS":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case"UNFREEZE_VP_SUCCESS":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case"TABLE_ROW":{const viewportRowMap=groupRowsByViewport(body.rows);if(true&&server_proxy_debugEnabled){const[firstRow]=body.rows;if(body.rows.length===0){server_proxy_infoEnabled&&server_proxy_info("<=== TABLE_ROW 0 rows")}else if(firstRow?.rowIndex===-1){if(body.rows.length===1){if(firstRow.updateType==="SIZE"){server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ONLY ${firstRow.vpSize}`)}else{server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ${firstRow.vpSize} rowIdx ${firstRow.rowIndex}`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows, SIZE ${firstRow.vpSize}, [${body.rows.map(r=>r.rowIndex).join(",")}]`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows [${body.rows.map(r=>r.rowIndex).join(",")}]`)}}for(const[viewportId,rows]of Object.entries(viewportRowMap)){const viewport=viewports.get(viewportId);if(viewport){viewport.updateRows(rows)}else{server_proxy_warn?.(`TABLE_ROW message received for non registered viewport ${viewportId}`)}}this.processUpdates()}break;case"CHANGE_VP_RANGE_SUCCESS":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const{from,to}=body;server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_SUCCESS<#${requestId}> ${from} - ${to}`);viewport.completeOperation(requestId,from,to)}}break;case"CHANGE_VP_RANGE_REJECT":{const viewport=this.viewports.get(body.viewPortId);if(viewport){server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_REJECT<#${requestId}>`);viewport.rejectOperation(requestId,body.msg)}}break;case OPEN_TREE_SUCCESS:case CLOSE_TREE_SUCCESS:break;case"CREATE_VISUAL_LINK_SUCCESS":{const viewport=this.viewports.get(body.childVpId);const parentViewport=this.viewports.get(body.parentVpId);if(viewport&&parentViewport){const{childColumnName,parentColumnName}=body;const response=viewport.completeOperation(requestId,childColumnName,parentViewport.clientViewportId,parentColumnName);if(response){this.postMessageToClient(response)}}}break;case"REMOVE_VISUAL_LINK_SUCCESS":{const viewport=this.viewports.get(body.childVpId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case"VP_VISUAL_LINKS_RESP":{const activeLinkDescriptors=this.getActiveLinks(body.links);const viewport=this.viewports.get(body.vpId);if(activeLinkDescriptors.length&&viewport){const linkDescriptorsWithLabels=addLabelsToLinks(activeLinkDescriptors,this.viewports);const[clientMessage,pendingLink]=viewport.setLinks(linkDescriptorsWithLabels);this.postMessageToClient(clientMessage);if(pendingLink){const{link,parentClientVpId}=pendingLink;const requestId=nextRequestId();const parentVpId=this.mapClientToServerViewport.get(parentClientVpId);if(parentVpId){const message=viewport.createLink(requestId,{childVpId:body.vpId,childColumnName:link.fromColumn,parentColumnName:link.toColumn,parentVpId,type:"CREATE_VISUAL_LINK"});this.sendMessageToServer(message,requestId)}}}}break;case"VIEW_PORT_MENUS_RESP":if(body.menu?.name){const viewport=this.viewports.get(body.vpId);if(viewport){const clientMessage=viewport.setMenu(body.menu);this.postMessageToClient(clientMessage)}}break;case"VIEW_PORT_MENU_REJ":{const{error,rpcName,vpId}=body;const viewport=this.viewports.get(vpId);if(viewport){this.postMessageToClient({clientViewportId:viewport.clientViewportId,error,rpcName,type:"VIEW_PORT_MENU_REJ",requestId})}break}case"VIEW_PORT_MENU_RESP":{if(isSessionTableActionMessage(body)){const{action,rpcName}=body;this.awaitResponseToMessage({type:"GET_TABLE_META",table:action.table}).then(response=>{const tableSchema=createSchemaFromTableMetadata(response);this.postMessageToClient({rpcName,type:"VIEW_PORT_MENU_RESP",action:{...action,tableSchema},tableAlreadyOpen:this.isTableOpen(action.table),requestId})})}else{const{action,rpcName}=body;this.postMessageToClient({action,rpcName,requestId,tableAlreadyOpen:isOpenDialogAction(action)&&this.isTableOpen(action.table),type:"VIEW_PORT_MENU_RESP"})}}break;case"RPC_RESPONSE":{const{action,error,result}=body;this.postMessageToClient({action,type:"RPC_RESPONSE",error,result,requestId})}break;case"ERROR":server_proxy_error(body.msg);break;default:server_proxy_infoEnabled&&server_proxy_info(`<=== ${body["type"]}.`)}}cacheTableMeta(messageBody){const{module,table}=messageBody.table;const key=`${module}:${table}`;let tableSchema=this.cachedTableSchemas.get(key);if(!tableSchema){tableSchema=createSchemaFromTableMetadata(messageBody);this.cachedTableSchemas.set(key,tableSchema)}return tableSchema}isTableOpen(table){if(table){const tableName=table.table;for(const viewport of this.viewports.values()){if(!viewport.suspended&&viewport.table.table===tableName){return true}}}}getActiveLinks(linkDescriptors){return linkDescriptors.filter(linkDescriptor=>{const viewport=this.viewports.get(linkDescriptor.parentVpId);return viewport&&!viewport.suspended})}processUpdates(){this.viewports.forEach(viewport=>{if(viewport.hasUpdatesToProcess){const result=viewport.getClientRows();if(result!==NO_DATA_UPDATE){const[rows,mode]=result;const size=viewport.getNewRowCount();if(size!==undefined||rows&&rows.length>0){server_proxy_debugEnabled&&server_proxy_debug(`===> #${viewport.clientViewportId} viewport-update ${mode}, ${rows?.length??"no"} rows, size ${size}`);if(mode){this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode,rows,size,type:"viewport-update"})}}}}})}constructor(connection,callback){server_proxy_define_property(this,"connection",void 0);server_proxy_define_property(this,"postMessageToClient",void 0);server_proxy_define_property(this,"viewports",void 0);server_proxy_define_property(this,"mapClientToServerViewport",void 0);server_proxy_define_property(this,"authToken","");server_proxy_define_property(this,"pendingLogin",void 0);server_proxy_define_property(this,"pendingRequests",new Map);server_proxy_define_property(this,"sessionId",void 0);server_proxy_define_property(this,"queuedRequests",[]);server_proxy_define_property(this,"cachedTableMetaRequests",new Map);server_proxy_define_property(this,"cachedTableSchemas",new Map);server_proxy_define_property(this,"tableList",void 0);server_proxy_define_property(this,"connectionStatusChanged",status=>{if(status==="disconnected"){this.sessionId=undefined;this.clearAllViewports()}else if(status==="reconnected"){this.reconnect()}});server_proxy_define_property(this,"reconnect",async()=>{const[activeViewports,inactiveViewports]=partition(Array.from(this.viewports.values()),isActiveViewport);this.viewports.clear();this.mapClientToServerViewport.clear();const reconnectViewports=viewports=>{viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.awaitResponseToMessage(viewport.subscribe(),clientViewportId).then(msg=>{if(msg.type==="CREATE_VP_SUCCESS"){this.mapClientToServerViewport.set(clientViewportId,msg.viewPortId);this.viewports.set(msg.viewPortId,viewport);viewport.status="subscribed";viewport.serverViewportId=msg.viewPortId}else{}})})};reconnectViewports(activeViewports);setTimeout(()=>{reconnectViewports(inactiveViewports)},2e3)});this.connection=connection;this.postMessageToClient=callback;this.viewports=new Map;this.mapClientToServerViewport=new Map;connection.on("connection-status",this.connectionStatusChanged)}};let serverProxy;let webSocketConnection;const{info:worker_info,infoEnabled:worker_infoEnabled}=logger("worker");const sendMessageToClient=message=>{postMessage(message)};async function connectToServer(url,protocols,token){if(webSocketConnection===undefined&&serverProxy===undefined){webSocketConnection=new WebSocketConnection({callback:msg=>{if(isConnectionQualityMetrics(msg)){postMessage({type:"connection-metrics",messages:msg})}else{serverProxy.handleMessageFromServer(msg)}},protocols,url});webSocketConnection.on("connection-status",postMessage);serverProxy=new ServerProxy(webSocketConnection,sendMessageToClient)}await webSocketConnection.openWebSocket();return serverProxy.login(token)}const handleMessageFromClient=async({data:message})=>{switch(message.type){case"connect":try{const sessionId=await connectToServer(message.url,message.protocol,message.token);postMessage({type:"connected",sessionId})}catch(err){postMessage({type:"connection-failed",reason:String(err)})}break;case"disconnect":serverProxy.disconnect();webSocketConnection?.close();break;case"subscribe":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.subscribe(message);break;case"unsubscribe":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.unsubscribe(message.viewport);break;default:worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.handleMessageFromClient(message)}};self.addEventListener("message",handleMessageFromClient);postMessage({type:"ready"})})();';
2
2
  export { workerSourceCode };
@@ -34,7 +34,9 @@ class Viewport {
34
34
  pendingRangeRequests = [];
35
35
  postMessageToClient;
36
36
  rowCountChanged = false;
37
- lastUpdateStatus = NO_UPDATE_STATUS;
37
+ lastUpdateStatus = {
38
+ ...NO_UPDATE_STATUS
39
+ };
38
40
  updateThrottleTimer = void 0;
39
41
  rangeMonitor = new RangeMonitor("ViewPort");
40
42
  clientViewportId;
@@ -1 +1 @@
1
- export declare const workerSourceCode = "(()=>{\"use strict\";const getCookieValue=name=>{if(globalThis.document?.cookie!==undefined){return globalThis.document.cookie.split(\"; \").find(row=>row.startsWith(`${name}=`))?.split(\"=\")[1]}};function setCookieValue(name,value,days){let expires=\"\";if(typeof days===\"number\"){const date=new Date;date.setTime(date.getTime()+days*24*60*60*1e3);expires=\"; expires=\"+date.toUTCString()}const encodedName=encodeURIComponent(name);const encodedValue=encodeURIComponent(value);document.cookie=`${encodedName}=${encodedValue}${expires};`};const logLevels=[\"error\",\"warn\",\"info\",\"debug\"];const isValidLogLevel=value=>typeof value===\"string\"&&logLevels.includes(value);const DEFAULT_LOG_LEVEL=\"error\";const NO_OP=()=>undefined;const DEFAULT_DEBUG_LEVEL=false?0:\"info\";const{loggingLevel=DEFAULT_DEBUG_LEVEL}=getLoggingSettings();const logger=category=>{const debugEnabled=loggingLevel===\"debug\";const infoEnabled=debugEnabled||loggingLevel===\"info\";const warnEnabled=infoEnabled||loggingLevel===\"warn\";const errorEnabled=warnEnabled||loggingLevel===\"error\";const info=infoEnabled?message=>console.info(`${Date.now()} [${category}] ${message}`):NO_OP;const warn=warnEnabled?message=>console.warn(`[${category}] ${message}`):NO_OP;const debug=debugEnabled?message=>console.debug(`${Date.now()} [${category}] ${message}`):NO_OP;const error=errorEnabled?message=>console.error(`[${category}] ${message}`):NO_OP;if(false){}else{return{debugEnabled,infoEnabled,warnEnabled,errorEnabled,info,warn,debug,error}}};function getLoggingSettings(){if(typeof loggingSettings!==\"undefined\"){return loggingSettings}else{return{loggingLevel:getLoggingLevelFromCookie()}}}function getLoggingLevelFromCookie(){const value=getCookieValue(\"vuu-logging-level\");if(isValidLogLevel(value)){return value}else{return DEFAULT_LOG_LEVEL}}const getLoggingConfigForWorker=()=>{return`const loggingSettings = { loggingLevel: \"${getLoggingLevelFromCookie()}\"};`};const logUnhandledMessage=(message,context=\"[logUnhandledStruct]\")=>{console.log(`${context} ${JSON.stringify(message)}`)};const NoFilter=null&&{filter:\"\"};const NoSort=null&&{sortDefs:[]};const vanillaConfig=null&&{aggregations:[],columns:[],filterSpec:NoFilter,groupBy:[],sort:NoSort};const sessionDataSourceConfig=(sourceConfig,overrideColumns)=>{if(overrideColumns===undefined){return sourceConfig}return{...vanillaConfig,columns:overrideColumns}};const assertExpectedSessionTable=(sessionTable,expectedTable)=>{if(expectedTable&&expectedTable.module!==sessionTable.module){throw Error(`[datasource-utils] session table ${sessionTable.module}/${sessionTable.table} does not match expected edit table module ${expectedTable.module}`)}};const stripVisualLink=configWithVisualLink=>{if(configWithVisualLink.visualLink){const{visualLink,...config}=configWithVisualLink;return config}else{return configWithVisualLink}};const equivalentAggregations=({aggregations:agg1},{aggregations:agg2})=>agg1===undefined&&agg2?.length===0||agg2===undefined&&agg1?.length===0;const equivalentColumns=({columns:cols1},{columns:cols2})=>cols1===undefined&&cols2?.length===0||cols2===undefined&&cols1?.length===0;const equivalentFilter=({filterSpec:f1},{filterSpec:f2})=>f1===undefined&&f2?.filter===\"\"||f2===undefined&&f1?.filter===\"\";const equivalentGroupBy=({groupBy:val1},{groupBy:val2})=>val1===undefined&&val2?.length===0||val2===undefined&&val1?.length===0;const equivalentSort=({sort:s1},{sort:s2})=>s1===undefined&&s2?.sortDefs.length===0||s2===undefined&&s1?.sortDefs.length===0;const exactlyTheSame=(a,b)=>{if(a===b){return true}else if(a===undefined&&b===undefined){return true}else{return false}};const isAggregationsChanged=(config,newConfig)=>{const{aggregations:agg1}=config;const{aggregations:agg2}=newConfig;if(exactlyTheSame(agg1,agg2)||equivalentAggregations(config,newConfig)){return false}else if(agg1===undefined||agg2===undefined){return true}else if(agg1.length!==agg2.length){return true}return agg1.some(({column,aggType},i)=>column!==agg2[i].column||aggType!==agg2[i].aggType)};const isColumnsChanged=(config,newConfig)=>{const{columns:cols1}=config;const{columns:cols2}=newConfig;if(exactlyTheSame(cols1,cols2)||equivalentColumns(config,newConfig)){return false}else if(cols1===undefined||cols2===undefined){return true}else if(cols1?.length!==cols2?.length){return true}return cols1.some((column,i)=>column!==cols2?.[i])};const isBaseFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.baseFilterSpec?.filter!==c2.baseFilterSpec?.filter}};const isFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.filterSpec?.filter!==c2.filterSpec?.filter}};const isGroupByChanged=(config,newConfig)=>{const{groupBy:g1}=config;const{groupBy:g2}=newConfig;if(exactlyTheSame(g1,g2)||equivalentGroupBy(config,newConfig)){return false}else if(g1===undefined||g2===undefined){return true}else if(g1?.length!==g2?.length){return true}return g1.some((column,i)=>column!==g2?.[i])};const isSortChanged=(config,newConfig)=>{const{sort:s1}=config;const{sort:s2}=newConfig;if(exactlyTheSame(s1,s2)||equivalentSort(config,newConfig)){return false}else if(s1===undefined||s2===undefined){return true}else if(s1?.sortDefs.length!==s2?.sortDefs.length){return true}return s1.sortDefs.some(({column,sortType},i)=>column!==s2.sortDefs[i].column||sortType!==s2.sortDefs[i].sortType)};const isVisualLinkChanged=({visualLink:v1},{visualLink:v2})=>{if(exactlyTheSame(v1,v2)){return false}if(v1===undefined||v2===undefined){return true}return v1.label!==v2.label||v1.parentVpId!==v2.parentVpId};const NO_CONFIG_CHANGES=null&&{aggregationsChanged:false,baseFilterChanged:false,columnsChanged:false,filterChanged:false,groupByChanged:false,noChanges:true,sortChanged:false,visualLinkChanged:false};const isConfigChanged=(config,newConfig)=>{if(exactlyTheSame(config,newConfig)){return NO_CONFIG_CHANGES}if(config===undefined&&newConfig==undefined){return NO_CONFIG_CHANGES}else if(config===undefined){return isConfigChanged({},newConfig)}else if(newConfig===undefined){return isConfigChanged(config,{})}const aggregationsChanged=isAggregationsChanged(config,newConfig);const baseFilterChanged=isBaseFilterChanged(config,newConfig);const columnsChanged=isColumnsChanged(config,newConfig);const filterChanged=isFilterChanged(config,newConfig);const groupByChanged=isGroupByChanged(config,newConfig);const sortChanged=isSortChanged(config,newConfig);const visualLinkChanged=isVisualLinkChanged(config,newConfig);const noChanges=!(aggregationsChanged||baseFilterChanged||columnsChanged||filterChanged||groupByChanged||sortChanged||visualLinkChanged);return{aggregationsChanged,baseFilterChanged,columnsChanged,filterChanged,groupByChanged,noChanges,sortChanged,visualLinkChanged}};const hasGroupBy=config=>config!==undefined&&config.groupBy!==undefined&&config.groupBy.length>0;const hasBaseFilter=config=>config?.baseFilterSpec!==undefined&&config.baseFilterSpec.filter.length>0;const hasFilter=config=>config?.filterSpec!==undefined&&config.filterSpec.filter.length>0;const hasSort=config=>config?.sort!==undefined&&Array.isArray(config.sort?.sortDefs)&&config.sort.sortDefs.length>0;const isTypeaheadSuggestionProvider=source=>typeof source[\"getTypeaheadSuggestions\"]===\"function\";const isTableSchemaMessage=message=>message.type===\"TABLE_META_RESP\";const isConnectionQualityMetrics=msg=>msg.type===\"connection-metrics\";const messageHasResult=msg=>typeof msg.result!==\"undefined\";const isVisualLinkMessage=msg=>msg.type.endsWith(\"_VISUAL_LINK\");const isVisualLinksMessage=msg=>msg.type===\"vuu-links\";const isViewportMessage=msg=>\"viewport\"in msg;const messageHasDataRows=message=>message.type===\"viewport-update\"&&Array.isArray(message.rows);const messageHasSize=message=>message.type===\"viewport-update\"&&typeof message.size===\"number\";const withConfigDefaults=config=>{if(config.aggregations&&config.baseFilterSpec&&config.columns&&config.filterSpec&&config.groupBy&&config.sort){return config}else{const{aggregations=[],baseFilterSpec:baseFilter={filter:\"\"},columns=[],filterSpec:filter={filter:\"\"},groupBy=[],sort={sortDefs:[]},visualLink}=config;return{aggregations,baseFilterSpec:baseFilter,columns,filterSpec:filter,groupBy,sort,visualLink}}};const dataSourceRowToEntity=(row,columnMap)=>Object.entries(columnMap).reduce((entity,[name,index])=>({...entity,[name]:row[index]}),{});const MENU_RPC_TYPES=[\"VIEW_PORT_MENUS_SELECT_RPC\",\"VIEW_PORT_MENU_TABLE_RPC\",\"VIEW_PORT_MENU_ROW_RPC\",\"VIEW_PORT_MENU_CELL_RPC\"];const INVALID_SESSION=\"Invalid session\";const SESSION_LIMIT_EXCEEDED=\"User session limit exceeded\";const INVALID_TOKEN=\"Invalid token\";const TOKEN_EXPIRED=\"Token has expired\";const InvalidLoginMessages=[INVALID_SESSION,SESSION_LIMIT_EXCEEDED,INVALID_TOKEN,TOKEN_EXPIRED];const isErrorMessage=message=>typeof message==\"object\"&&message?.type===\"ERROR\";const isLoginErrorMessage=message=>typeof message===\"string\"&&InvalidLoginMessages.includes(message);const isSelectRequest=message=>message&&typeof message===\"object\"&&\"type\"in message&&(message.type===\"SELECT_ROW\"||message.type===\"DESELECT_ROW\"||message.type===\"SELECT_ROW_RANGE\"||message.type===\"SELECT_ALL\"||message.type===\"DESELECT_ALL\");const isSelectSuccessWithRowCount=response=>[\"SELECT_ROW_SUCCESS\",\"DESELECT_ROW_SUCCESS\",\"SELECT_ROW_RANGE_SUCCESS\",\"SELECT_ALL_SUCCESS\",\"DESELECT_ALL_SUCCESS\"].includes(response.type??\"\")&&typeof response.selectedRowCount===\"number\";const isRpcServiceRequest=message=>message.type===\"RPC_REQUEST\";const hasViewPortContext=message=>message.context.type===\"VIEWPORT_CONTEXT\";const isVuuMenuRpcRequest=message=>MENU_RPC_TYPES.includes(message[\"type\"]);const isLoginResponse=message=>message!==null&&typeof message===\"object\"&&\"type\"in message&&(message.type===\"LOGIN_SUCCESS\"||message.type===\"LOGIN_FAIL\");const isRpcSuccess=rpcResult=>rpcResult?.type===\"SUCCESS_RESULT\";const isRpcError=rpcResult=>rpcResult?.type===\"ERROR_RESULT\";const isRequestResponse=message=>\"requestId\"in message;const isOpenSessionTableDialogMessage=rpcResponse=>rpcResponse.type===\"VIEW_PORT_MENU_RESP\"&&isOpenDialogAction(rpcResponse.action)&&\"tableSchema\"in rpcResponse.action;const isOpenDialogAction=action=>action!==undefined&&action.type===\"OPEN_DIALOG_ACTION\";const isTypeaheadRequest=request=>{return isRpcServiceRequest(request)&&(request.rpcName===\"getUniqueFieldValues\"||request.rpcName===\"getUniqueFieldValuesStartingWith\")};const isCreateVpSuccess=response=>response.type===\"CREATE_VP_SUCCESS\";const isSessionTable=table=>{if(table!==null&&typeof table===\"object\"&&\"table\"in table&&\"module\"in table){return table.table.startsWith(\"session\")}return false};function isActionMessage(rpcResponse){return rpcResponse.type===\"VIEW_PORT_MENU_RESP\"}function isSessionTableActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&(rpcResponse.action?.renderComponent===\"inline-form\"||rpcResponse.action?.renderComponent===\"grid\")}function isCustomComponentActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&typeof rpcResponse.action.renderComponent===\"string\"&&componentInRegistry(rpcResponse.action.renderComponent)}const numericTypes=null&&[\"int\",\"long\",\"double\",\"scaleddecimal2\",\"scaleddecimal4\",\"scaleddecimal6\",\"scaleddecimal8\"];function isNumericType(dataType){return numericTypes.includes(dataType)}const isAddRowRpcRequest=rpcRequest=>rpcRequest.rpcName===\"addRow\";const isEditCellRpcRequest=rpcRequest=>rpcRequest.rpcName===\"editCell\";const isBeginEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName===\"beginEditSession\";const isEndEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName===\"endEditSession\";const isUndoRowChangeRpcRequest=rpcRequest=>rpcRequest.rpcName===\"undoRowChange\";const isDeleteSelectedRowsRpcRequest=rpcRequest=>rpcRequest.rpcName===\"deleteSelectedRows\";const isCreateSessionTableRpcRequest=rpcRequest=>rpcRequest.rpcName===\"createSessionTable\";const simpleIdentity=(a,b)=>a===b;function partition(array,test,pass=[],fail=[]){for(let i=0,len=array.length;i<len;i++){(test(array[i],i)?pass:fail).push(array[i])}return[pass,fail]}function itemsChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return!currentItems.every(item=>newItems.includes(item))}else{return currentItems.some(currentItem=>newItems.findIndex(newItem=>newItem[identityProperty]===currentItem[identityProperty])===-1)}}function itemsOrOrderChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return currentItems.some((item,index)=>newItems[index]!==item)}else{return currentItems.some((currentItem,index)=>newItems[index][identityProperty]!==currentItem[identityProperty])}}const moveItemDeprecated=(items,item,moveTo)=>{const fromIndex=items.indexOf(item);if(fromIndex===moveTo){return items}const newItems=items.slice();if(fromIndex===-1){throw Error(\"moveItem, item to be moved not found\")}newItems.splice(fromIndex,1);if(moveTo===-1){newItems.push(item)}else{const offset=moveTo>fromIndex?0:0;newItems.splice(moveTo+offset,0,item)}return newItems};const moveItem=(items,fromIndex,toIndex)=>{if(fromIndex===toIndex){return items}else{const newItems=items.slice();const[item]=newItems.splice(fromIndex,1);if(toIndex===-1){return newItems.concat(item)}else{const offset=toIndex>fromIndex?0:0;newItems.splice(toIndex+offset,0,item);return newItems}}};const getAddedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(currentItems===undefined){return newItems}const isNew=item=>currentItems.every(currentItem=>compareItems(item,currentItem)===false);if(newItems.some(isNew)){return newItems.filter(isNew)}else{return[]}};const getRemovedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(newItems===undefined){return currentItems}const isRemoved=item=>newItems.every(newItem=>compareItems(item,newItem)===false);if(currentItems.some(isRemoved)){return currentItems.filter(isRemoved)}else{return[]}};const containsSubsetOfItems=(allItems,comparedItems)=>{if(comparedItems.length>allItems.length)return false;const invalidItems=getAddedItems(allItems,comparedItems);return invalidItems.length===0};const getMissingItems=(sourceItems,items,identity)=>items.filter(i=>sourceItems.findIndex(s=>identity(s)===i)===-1);const reorderItems=(originalItems,orderedNames)=>{const orderedItems=[];let previousName=\"\";for(const name of orderedNames){if(previousName!==name){const item=originalItems.find(c=>c.name===name);if(item){orderedItems.push(item)}previousName=name}}return orderedItems};const hasRequestId=message=>{return\"requestId\"in message};const stripRequestId=({requestId,...rest})=>[requestId,rest];const getFirstAndLastRows=rows=>{let firstRow=rows.at(0);if(firstRow.updateType===\"SIZE\"){if(rows.length===1){return rows}else{firstRow=rows.at(1)}}const lastRow=rows.at(-1);return[firstRow,lastRow]};const insertRow=(rows,row)=>{const lastRow=rows.at(-1);if(lastRow===undefined||row.rowIndex>lastRow.rowIndex){rows.push(row)}else{for(let i=0;i<rows.length;i++){if(row.rowIndex<rows[i].rowIndex){rows.splice(i,0,row);return}else if(row.rowIndex===rows[i].rowIndex){if(row.ts<rows[i].ts){}else{rows[i]=row}return}}throw Error(\"don't expect to get this far\")}};const groupRowsByViewport=rows=>{const result={};for(const row of rows){const rowsForViewport=result[row.viewPortId]||(result[row.viewPortId]=[]);insertRow(rowsForViewport,row)}return result};const createSchemaFromTableMetadata=({columns,dataTypes,editableColumns=[],key,maxRangeEnd,maxRangeWidth,table})=>{return{table,columns:columns.map((col,idx)=>{if(editableColumns.includes(col)){return{editable:true,name:col,serverDataType:dataTypes[idx]}}return{name:col,serverDataType:dataTypes[idx]}}),key,rangeLimits:{maxRangeEnd,maxRangeWidth}}};const CHANGE_VP_SUCCESS=\"CHANGE_VP_SUCCESS\";const CHANGE_VP_RANGE_SUCCESS=\"CHANGE_VP_RANGE_SUCCESS\";const CLOSE_TREE_NODE=\"CLOSE_TREE_NODE\";const CLOSE_TREE_SUCCESS=\"CLOSE_TREE_SUCCESS\";const CLOSE_TREE_REJECT=\"CLOSE_TREE_REJECT\";const CREATE_VISUAL_LINK=\"CREATE_VISUAL_LINK\";const CREATE_VP=\"CREATE_VP\";const DISABLE_VP=\"DISABLE_VP\";const DISABLE_VP_SUCCESS=\"DISABLE_VP_SUCCESS\";const DISABLE_VP_REJECT=\"DISABLE_VP_REJECT\";const ENABLE_VP=\"ENABLE_VP\";const ENABLE_VP_SUCCESS=\"ENABLE_VP_SUCCESS\";const ENABLE_VP_REJECT=\"ENABLE_VP_REJECT\";const GET_TABLE_META=\"GET_TABLE_META\";const GET_VP_VISUAL_LINKS=\"GET_VP_VISUAL_LINKS\";const GET_VIEW_PORT_MENUS=\"GET_VIEW_PORT_MENUS\";const VIEW_PORT_MENUS_SELECT_RPC=\"VIEW_PORT_MENUS_SELECT_RPC\";const VIEW_PORT_MENU_CELL_RPC=\"VIEW_PORT_MENU_CELL_RPC\";const VIEW_PORT_MENU_TABLE_RPC=\"VIEW_PORT_MENU_TABLE_RPC\";const VIEW_PORT_MENU_ROW_RPC=\"VIEW_PORT_MENU_ROW_RPC\";const VIEW_PORT_MENU_RESP=\"VIEW_PORT_MENU_RESP\";const VIEW_PORT_MENU_REJ=\"VIEW_PORT_MENU_REJ\";const HB=\"HB\";const HB_RESP=\"HB_RESP\";const OPEN_TREE_NODE=\"OPEN_TREE_NODE\";const OPEN_TREE_SUCCESS=\"OPEN_TREE_SUCCESS\";const OPEN_TREE_REJECT=\"OPEN_TREE_REJECT\";const REMOVE_VP=\"REMOVE_VP\";const REMOVE_VP_REJECT=\"REMOVE_VP_REJECT\";const MENU_RPC_RESP=\"MENU_RPC_RESP\";const TABLE_ROW=\"TABLE_ROW\";const SIZE=\"SIZE\";const UPDATE=\"U\";function _check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function _class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function _class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function _class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function _class_private_field_get(receiver,privateMap){var descriptor=_class_extract_field_descriptor(receiver,privateMap,\"get\");return _class_apply_descriptor_get(receiver,descriptor)}function _class_private_field_init(obj,privateMap,value){_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function _class_private_field_set(receiver,privateMap,value){var descriptor=_class_extract_field_descriptor(receiver,privateMap,\"set\");_class_apply_descriptor_set(receiver,descriptor,value);return value}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}var _baseFrom=new WeakMap,_renderBufferSize=new WeakMap,_baseTo=new WeakMap;class RangeImpl{get reset(){return new RangeImpl(0,_class_private_field_get(this,_baseTo)-_class_private_field_get(this,_baseFrom),_class_private_field_get(this,_renderBufferSize))}get withBuffer(){return getFullRange(this,_class_private_field_get(this,_renderBufferSize))}equals(range){return range.from===_class_private_field_get(this,_baseFrom)&&range.to===_class_private_field_get(this,_baseTo)}toJson(){return{from:this.from,to:this.to,baseFrom:_class_private_field_get(this,_baseFrom),baseTo:_class_private_field_get(this,_baseTo),renderBufferSize:_class_private_field_get(this,_renderBufferSize)}}constructor(from,to,renderBufferSize=0){_define_property(this,\"from\",void 0);_define_property(this,\"to\",void 0);_class_private_field_init(this,_baseFrom,{writable:true,value:void 0});_class_private_field_init(this,_renderBufferSize,{writable:true,value:void 0});_class_private_field_init(this,_baseTo,{writable:true,value:void 0});this.from=from;this.to=to;_class_private_field_set(this,_renderBufferSize,0);_class_private_field_set(this,_baseFrom,from);_class_private_field_set(this,_baseTo,to);_class_private_field_set(this,_renderBufferSize,renderBufferSize)}}const Range=(from,to,renderBufferSize)=>new RangeImpl(from,to,renderBufferSize);const NULL_RANGE=Range(0,0);function getFullRange({from,to},bufferSize=0,maxRangeEnd=Number.MAX_SAFE_INTEGER){if(from===0&&to===0){return{from,to}}else if(bufferSize===0){if(maxRangeEnd<from){return{from:0,to:0}}else{return{from,to:Math.min(to,maxRangeEnd)}}}else if(from===0){return{from,to:Math.min(to+bufferSize,maxRangeEnd)}}else{const shortfallBefore=from-bufferSize<0;const shortfallAfter=maxRangeEnd-(to+bufferSize)<0;if(shortfallBefore&&shortfallAfter){return{from:0,to:maxRangeEnd}}else if(shortfallBefore){return{from:0,to:to+bufferSize}}else if(shortfallAfter){return{from:Math.max(0,from-bufferSize),to:maxRangeEnd}}else{return{from:from-bufferSize,to:to+bufferSize}}}}const withinRange=(value,{from,to})=>value>=from&&value<to;const rangeNewItems=({from:from1,to:to1},newRange)=>{const{from:from2,to:to2}=newRange;const noOverlap=from2>=to1||to2<=from1;const newFullySubsumesOld=from2<from1&&to2>to1;return noOverlap||newFullySubsumesOld?newRange:to2>to1?{from:to1,to:to2}:{from:from2,to:from1}};class WindowRange{isWithin(index){return withinRange(index,this)}overlap(from,to){return from>=this.to||to<this.from?[0,0]:[Math.max(from,this.from),Math.min(to,this.to)]}copy(){return new WindowRange(this.from,this.to)}constructor(from,to){_define_property(this,\"from\",void 0);_define_property(this,\"to\",void 0);this.from=from;this.to=to}}const constrainRangeWidth=(range,maxRangeWidth=Number.MAX_SAFE_INTEGER)=>{if(range.to-range.from<maxRangeWidth){return range}console.warn(`[range-utils] range ${range.from} - ${range.to} exceeds maxRangeWidth ${maxRangeWidth} for this table `);return{from:range.from,to:range.from+maxRangeWidth}};const constrainRange=(range,maxRangeEnd,maxRangeWidth)=>{if(maxRangeEnd>0&&maxRangeEnd<range.to){if(maxRangeEnd>range.from){return constrainRangeWidth({from:range.from,to:maxRangeEnd},maxRangeWidth)}else{throw Error(`constrainRange: cannot apply the maxRangeEnd ${maxRangeEnd} to range ${range.from} - ${range.to}`)}}else{return constrainRangeWidth(range,maxRangeWidth)}};function debug_utils_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:debug_utils_debug,debugEnabled:debug_utils_debugEnabled}=logger(\"range-monitor\");class RangeMonitor{isSet(){return this.timestamp!==0}set({from,to}){const{timestamp}=this;this.range.from=from;this.range.to=to;this.timestamp=performance.now();if(timestamp){debug_utils_debugEnabled&&debug_utils_debug(`<${this.source}> [${from}-${to}], ${(this.timestamp-timestamp).toFixed(0)} ms elapsed`)}else{return 0}}constructor(source){debug_utils_define_property(this,\"source\",void 0);debug_utils_define_property(this,\"range\",void 0);debug_utils_define_property(this,\"timestamp\",void 0);this.source=source;this.range={from:0,to:0};this.timestamp=0}};function keyset_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY=[];class KeySet{next(free=EMPTY){if(free.length>0){return free.shift()}else{return this.nextKeyValue++}}init({from,to}){this.keys.clear();this.freeKeys.length=0;this.nextKeyValue=0;for(let rowIndex=from;rowIndex<to;rowIndex++){const nextKeyValue=this.next();this.keys.set(rowIndex,nextKeyValue)}return true}reset({from,to}){this.range={from,to};const{freeKeys}=this;this.keys.forEach((keyValue,rowIndex)=>{if(rowIndex<from||rowIndex>=to){freeKeys.push(keyValue);this.keys.delete(rowIndex)}});let freeKeyIndex=0;for(let rowIndex=from;rowIndex<to;rowIndex++){if(!this.keys.has(rowIndex)){const nextKeyValue=freeKeyIndex<freeKeys.length?freeKeys[freeKeyIndex++]:this.nextKeyValue++;this.keys.set(rowIndex,nextKeyValue)}}if(freeKeyIndex>0){freeKeys.splice(0,freeKeyIndex)}return false}keyFor(rowIndex){const key=this.keys.get(rowIndex);if(key===undefined){console.log(`key not found\n keys: ${this.toDebugString()}\n `);throw Error(`KeySet, no key found for rowIndex ${rowIndex}`)}return key}toDebugString(){return`${this.keys.size} keys\n${Array.from(this.keys.entries()).sort(([key1],[key2])=>key1-key2).map(([k,v])=>`${k}=>${v}`).join(\",\")}]\n`}constructor(range){keyset_define_property(this,\"keys\",new Map);keyset_define_property(this,\"freeKeys\",[]);keyset_define_property(this,\"nextKeyValue\",0);keyset_define_property(this,\"range\",void 0);this.range={from:range.from,to:range.to};this.init(range)}};function array_backed_moving_window_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function array_backed_moving_window_class_private_field_get(receiver,privateMap){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,\"get\");return array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor)}function array_backed_moving_window_class_private_field_init(obj,privateMap,value){array_backed_moving_window_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function array_backed_moving_window_class_private_field_set(receiver,privateMap,value){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,\"set\");array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value);return value}function array_backed_moving_window_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY_ARRAY=[];const log=logger(\"array-backed-moving-window\");function dataIsUnchanged(newRow,existingRow){if(!existingRow){return false}if(existingRow.data.length!==newRow.data.length){return false}if(existingRow.sel!==newRow.sel){return false}for(let i=0;i<existingRow.data.length;i++){if(existingRow.data[i]!==newRow.data[i]){return false}}return true}var _range=new WeakMap;class ArrayBackedMovingWindow{get range(){return array_backed_moving_window_class_private_field_get(this,_range)}outOfRange(firstIndex,lastIndex){const{from,to}=this.range;if(lastIndex<from){return true}if(firstIndex>=to){return true}}setAtIndex(row){const{rowIndex:index}=row;const internalIndex=index-array_backed_moving_window_class_private_field_get(this,_range).from;if(dataIsUnchanged(row,this.internalData[internalIndex])){return false}const isWithinClientRange=this.isWithinClientRange(index);if(isWithinClientRange||this.isWithinRange(index)){if(!this.internalData[internalIndex]&&isWithinClientRange){this.rowsWithinRange+=1}this.internalData[internalIndex]=row}return isWithinClientRange}getAtIndex(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)&&this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]!=null?this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]:undefined}isWithinRange(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)}isWithinClientRange(index){return this.clientRange.isWithin(index)}setClientRange(from,to){log.debug?.(`setClientRange ${from} - ${to}`);const currentFrom=this.clientRange.from;const currentTo=Math.min(this.clientRange.to,this.rowCount);if(from===currentFrom&&to===currentTo){this.clientRange.to=to;return[false,EMPTY_ARRAY]}const originalRange=this.clientRange.copy();this.clientRange.from=from;this.clientRange.to=to;this.rowsWithinRange=0;for(let i=from;i<to;i++){const internalIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[internalIndex]){this.rowsWithinRange+=1}}const clientRows=[];const offset=array_backed_moving_window_class_private_field_get(this,_range).from;for(let i=from;i<to;i++){if(i<originalRange.from||i>=originalRange.to){const row=this.internalData[i-offset];if(row){clientRows.push(row)}}}const serverDataRequired=this.bufferBreakout(from,to);return[serverDataRequired,clientRows]}setRange(from,to){if(from!==array_backed_moving_window_class_private_field_get(this,_range).from||to!==array_backed_moving_window_class_private_field_get(this,_range).to){log.debug?.(`setRange ${from} - ${to}`);const[overlapFrom,overlapTo]=array_backed_moving_window_class_private_field_get(this,_range).overlap(from,to);const newData=new Array(to-from);this.rowsWithinRange=0;for(let i=overlapFrom;i<overlapTo;i++){const row=this.getAtIndex(i);if(row){const index=i-from;newData[index]=row;if(this.isWithinClientRange(i)){this.rowsWithinRange+=1}}}this.internalData=newData;array_backed_moving_window_class_private_field_get(this,_range).from=from;array_backed_moving_window_class_private_field_get(this,_range).to=to}else{log.debug?.(`setRange ${from} - ${to} IGNORED because not changed`)}}get data(){return this.internalData}getData(){const{from,to}=array_backed_moving_window_class_private_field_get(this,_range);const{from:clientFrom,to:clientTo}=this.clientRange;const startOffset=Math.max(0,clientFrom-from);const endOffset=Math.min(to-from,to,clientTo-from,this.rowCount??to);return this.internalData.slice(startOffset,endOffset)}clear(){log.debug?.(\"clear\");this.internalData.length=0;this.rowsWithinRange=0;this.setRowCount(0)}getCurrentDataRange(){const rows=this.internalData;const len=rows.length;let[firstRow]=this.internalData;let lastRow=this.internalData[len-1];if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{for(let i=0;i<len;i++){if(rows[i]!==undefined){firstRow=rows[i];break}}for(let i=len-1;i>=0;i--){if(rows[i]!==undefined){lastRow=rows[i];break}}if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{return[-1,-1]}}}constructor({from:clientFrom,to:clientTo},{from,to},bufferSize){array_backed_moving_window_class_private_field_init(this,_range,{writable:true,value:void 0});array_backed_moving_window_define_property(this,\"bufferSize\",void 0);array_backed_moving_window_define_property(this,\"internalData\",void 0);array_backed_moving_window_define_property(this,\"rowsWithinRange\",void 0);array_backed_moving_window_define_property(this,\"clientRange\",void 0);array_backed_moving_window_define_property(this,\"rowCount\",void 0);array_backed_moving_window_define_property(this,\"setRowCount\",rowCount=>{log.info?.(`setRowCount ${rowCount}`);const dataLength=Math.max(0,rowCount-array_backed_moving_window_class_private_field_get(this,_range).from);if(dataLength<this.internalData.length){this.internalData.length=dataLength}if(rowCount<this.rowCount){this.rowsWithinRange=0;const end=Math.min(rowCount,this.clientRange.to);for(let i=this.clientRange.from;i<end;i++){const rowIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[rowIndex]!==undefined){this.rowsWithinRange+=1}}}this.rowCount=rowCount});array_backed_moving_window_define_property(this,\"bufferBreakout\",(from,to)=>{const bufferPerimeter=this.bufferSize*.25;if(array_backed_moving_window_class_private_field_get(this,_range).to-to<bufferPerimeter){return true}else if(array_backed_moving_window_class_private_field_get(this,_range).from>0&&from-array_backed_moving_window_class_private_field_get(this,_range).from<bufferPerimeter){return true}else{return false}});this.bufferSize=bufferSize;this.clientRange=new WindowRange(clientFrom,clientTo);array_backed_moving_window_class_private_field_set(this,_range,new WindowRange(from,to));this.internalData=new Array(bufferSize);this.rowsWithinRange=0;this.rowCount=0}};function viewport_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function viewport_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function viewport_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function viewport_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function viewport_class_private_field_get(receiver,privateMap){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,\"get\");return viewport_class_apply_descriptor_get(receiver,descriptor)}function viewport_class_private_field_init(obj,privateMap,value){viewport_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function viewport_class_private_field_set(receiver,privateMap,value){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,\"set\");viewport_class_apply_descriptor_set(receiver,descriptor,value);return value}function viewport_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:viewport_debug,debugEnabled:viewport_debugEnabled,error:viewport_error,info:viewport_info,infoEnabled:viewport_infoEnabled,warn:viewport_warn}=logger(\"Viewport\");const isLeafUpdate=({rowKey,updateType})=>updateType===\"U\"&&!rowKey.startsWith(\"$root\");const NO_DATA_UPDATE=[undefined,undefined];const NO_UPDATE_STATUS={count:0,mode:undefined,size:0,ts:0};var _status=new WeakMap,_clientRange=new WeakMap,_maxRangeEnd=new WeakMap;class Viewport{get hasUpdatesToProcess(){if(this.suspended){return false}return this.rowCountChanged||this.hasUpdates}get size(){return this.dataWindow.rowCount??0}get clientRange(){return viewport_class_private_field_get(this,_clientRange)}get status(){return viewport_class_private_field_get(this,_status)}set status(status){viewport_class_private_field_set(this,_status,status)}subscribe(){const{filter}=this.filter;this.status=viewport_class_private_field_get(this,_status)===\"subscribed\"?\"resubscribing\":\"subscribing\";return{type:CREATE_VP,table:this.table,range:getFullRange(viewport_class_private_field_get(this,_clientRange),this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter}}}handleSubscribed({viewPortId,aggregations,columns,filterSpec:filter,range,sort,groupBy,table},baseTableSchema){this.serverViewportId=viewPortId;this.status=\"subscribed\";this.aggregations=aggregations;this.columns=columns;this.groupBy=groupBy;this.isTree=groupBy&&groupBy.length>0;this.dataWindow.setRange(range.from,range.to);const tableSchema=table===baseTableSchema.table.table?baseTableSchema:{...baseTableSchema,table:{...baseTableSchema.table,session:table}};if(tableSchema.rangeLimits){viewport_class_private_field_set(this,_maxRangeEnd,tableSchema.rangeLimits?.maxRangeEnd)}return{aggregations,type:\"subscribed\",clientViewportId:this.clientViewportId,columns,filterSpec:filter,groupBy,range,sort,tableSchema}}awaitOperation(requestId,msg){this.pendingOperations.set(requestId,msg)}rejectOperation(requestId,_msg){const{pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to reject for requestId ${requestId}`);return}const{type}=pendingOperation;pendingOperations.delete(requestId);if(type===\"CHANGE_VP_RANGE\"){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.nacked=true;break}else{viewport_warn?.(\"range requests sent faster than they are being ACKed\")}}}}completeOperation(requestId,...params){const{clientViewportId,pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to complete for requestId ${requestId}`);return}const{type}=pendingOperation;viewport_info?.(`completeOperation ${type}`);pendingOperations.delete(requestId);if(type===\"CHANGE_VP_RANGE\"){const[from,to]=params;viewport_infoEnabled&&viewport_info(`completeOperation CHANGE_VP_RANGE\n window setRange (${from}:${to}) ${this.pendingRangeRequests.length} range requests pending`);this.dataWindow?.setRange(from,to);for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.acked=true;break}else{viewport_warn?.(\"range requests sent faster than they are being ACKed\")}}}else if(type===\"config\"){const{aggregations,columns,filterSpec:filter,groupBy,sort}=pendingOperation.data;this.aggregations=aggregations;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.sort=sort;if(groupBy.length>0){this.isTree=true}else if(this.isTree){this.isTree=false}viewport_debug?.(`config change confirmed, isTree : ${this.isTree}`);return{clientViewportId,type,config:pendingOperation.data}}else if(type===\"selection\"){}else if(type===\"disable\"){this.suspended=false;this.disabled=true;this.disabledActive=pendingOperation.disableActive;return{type:\"disabled\",clientViewportId}}else if(type===\"enable\"){this.disabled=false;this.disabledActive=false;return{type:\"enabled\",clientViewportId}}else if(type===\"freeze\"){this.frozen=true;return{type:\"frozen\",clientViewportId}}else if(type===\"unfreeze\"){this.frozen=false;return{type:\"unfrozen\",clientViewportId}}else if(type===\"CREATE_VISUAL_LINK\"){const[colName,parentViewportId,parentColName]=params;this.linkedParent={colName,parentViewportId,parentColName};this.pendingLinkedParent=undefined;return{requestId,type:\"vuu-link-created\",clientViewportId,colName,parentViewportId,parentColName}}else if(type===\"REMOVE_VISUAL_LINK\"){this.linkedParent=undefined;return{requestId,type:\"vuu-link-removed\",clientViewportId}}}rangeRequest(requestId,range){if(viewport_debugEnabled){this.rangeMonitor.set(range)}viewport_infoEnabled&&viewport_info(`(bufferSize ${this.bufferSize}) rangeRequest (${range.from}:${range.to}) current: window client (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), full (${this.dataWindow.range.from}:${this.dataWindow.range.to}) `);const type=\"CHANGE_VP_RANGE\";if(this.dataWindow){const[serverDataRequired,clientRows]=this.dataWindow.setClientRange(range.from,range.to);viewport_infoEnabled&&viewport_info(`updated: dataWindow clientRange (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), fullRange (${this.dataWindow.range.from}:${this.dataWindow.range.to}) serverDataRequired ${serverDataRequired?\"Y\":\"N\"} ${clientRows.length} rows returned from local buffer`);let debounceRequest;const maxRange=viewport_class_private_field_get(this,_maxRangeEnd);const serverRequest=serverDataRequired&&!this.rangeRequestAlreadyPending(range)?{type,viewPortId:this.serverViewportId,...getFullRange(range,this.bufferSize,maxRange)}:null;if(serverRequest){viewport_infoEnabled&&viewport_info(`create CHANGE_VP_RANGE: (${serverRequest.from} - ${serverRequest.to})`);viewport_debugEnabled&&viewport_debug?.(`create CHANGE_VP_RANGE: [${serverRequest.from} - ${serverRequest.to}]`);this.awaitOperation(requestId,{type});const pendingRequest=this.pendingRangeRequests.at(-1);if(pendingRequest){if(pendingRequest.acked){console.warn(\"Range Request before previous request is filled\")}else{const{from,to}=pendingRequest;if(this.dataWindow.outOfRange(from,to)){debounceRequest={clientViewportId:this.clientViewportId,type:\"debounce-begin\"}}else{viewport_warn?.(\"Range Request before previous request is acked\")}}}this.pendingRangeRequests.push({...serverRequest,requestId})}else if(clientRows.length>0){this.batchMode=false}this.keys.reset(this.dataWindow.clientRange);const toClient=this.isTree?toClientRowTree:toClientRow;if(clientRows.length){return[serverRequest,clientRows.map(row=>{return toClient(row,this.keys)})]}else if(debounceRequest){return[serverRequest,undefined,debounceRequest]}else{return[serverRequest]}}else{return[null]}}setLinks(links){this.links=links.filter(link=>link.parentVpId!==this.serverViewportId);return[{type:\"vuu-links\",links:this.links,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(menu){return{type:\"vuu-menu\",menu,clientViewportId:this.clientViewportId}}openTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);viewport_infoEnabled&&viewport_info(`treeKey ${treeKey}`);return{type:OPEN_TREE_NODE,vpId:this.serverViewportId,treeKey}}closeTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);return{type:CLOSE_TREE_NODE,vpId:this.serverViewportId,treeKey}}createLink(requestId,vuuCreateVisualLink){const message={...vuuCreateVisualLink,childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}removeLink(requestId){const message={type:\"REMOVE_VISUAL_LINK\",childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}suspend(){this.suspended=true;this.pendingUpdates.length=0;viewport_info?.(\"suspend\")}resume(){this.suspended=false;if(viewport_debugEnabled){viewport_debug?.(`resume: ${this.currentData()}`)}return[this.size,this.currentData()]}currentData(){const out=[];if(this.dataWindow){const records=this.dataWindow.getData();const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;for(const row of records){if(row){out.push(toClient(row,keys))}}}return out}enable(requestId){this.awaitOperation(requestId,{type:\"enable\"});viewport_info?.(`enable: ${this.serverViewportId}`);return{type:ENABLE_VP,viewPortId:this.serverViewportId}}disable(requestId,disableActive=false){this.awaitOperation(requestId,{type:\"disable\",disableActive});viewport_info?.(`disable: ${this.serverViewportId}`);return{type:DISABLE_VP,viewPortId:this.serverViewportId}}freeze(requestId){this.awaitOperation(requestId,{type:\"freeze\"});viewport_info?.(`freeze: ${this.serverViewportId}`);return{type:\"FREEZE_VP\",viewPortId:this.serverViewportId}}unfreeze(requestId){this.awaitOperation(requestId,{type:\"unfreeze\"});viewport_info?.(`unfreeze: ${this.serverViewportId}`);this.frozen=false;return{type:\"UNFREEZE_VP\",viewPortId:this.serverViewportId}}setConfig(requestId,config){this.awaitOperation(requestId,{type:\"config\",data:config});const{filterSpec:filter,...remainingConfig}=config;viewport_debugEnabled?viewport_debug?.(`setConfig ${JSON.stringify(config)}`):viewport_info?.(`setConfig`);if(!this.isTree&&config.groupBy.length>0){this.dataWindow?.clear()}return this.createRequest({...remainingConfig,filterSpec:typeof filter?.filter===\"string\"?{filter:filter.filter}:{filter:\"\"}},true)}selectRequest(request){viewport_info?.(`selectRequest: ${request.type}`);if(this.serverViewportId){return{...request,vpId:this.serverViewportId}}else{throw Error(`[Viewport] cannot process ${request.type} before serverViewportId has been set`)}}removePendingRangeRequest(firstIndex,lastIndex){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const{from,to}=this.pendingRangeRequests[i];let isLast=true;if(firstIndex>=from&&firstIndex<to||lastIndex>from&&lastIndex<to){if(!isLast){console.warn(\"removePendingRangeRequest TABLE_ROWS are not for latest request\")}this.pendingRangeRequests.splice(i,1);break}else{isLast=false}}}clearCache(){this.dataWindow.setRowCount(0);this.postMessageToClient({clientViewportId:this.clientViewportId,type:\"viewport-clear\"})}updateRows(rows){const[firstRow,lastRow]=getFirstAndLastRows(rows);if(firstRow&&lastRow){this.removePendingRangeRequest(firstRow.rowIndex,lastRow.rowIndex)}if(rows.length===1){if(firstRow.vpSize===0&&this.disabled){viewport_debug?.(`ignore a SIZE=0 message on disabled viewport (${rows.length} rows)`);return}}for(const row of rows){if(this.isTree&&isLeafUpdate(row)){continue}else{if(row.updateType===\"SIZE\"||this.dataWindow?.rowCount!==row.vpSize){this.dataWindow?.setRowCount(row.vpSize);this.rowCountChanged=true}if(row.updateType===\"U\"){if(this.dataWindow?.setAtIndex(row)){if(this.suspended!==true){this.hasUpdates=true;if(!this.batchMode){this.pendingUpdates.push(row)}}}}}}}getKeyForRowAtIndex(rowIndex){const row=this.dataWindow.getAtIndex(rowIndex);return row?.rowKey}getClientRows(){let out=undefined;let mode=\"size-only\";if(!this.hasUpdates&&!this.rowCountChanged){return NO_DATA_UPDATE}if(this.hasUpdates){const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;if(this.updateThrottleTimer){self.clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}if(this.pendingUpdates.length>0){out=[];mode=\"update\";for(const row of this.pendingUpdates){out.push(toClient(row,keys))}}this.pendingUpdates.length=0;this.hasUpdates=false}if(this.throttleMessage(mode)){return NO_DATA_UPDATE}else{return[out,mode]}}createRequest(params,overWrite=false){if(overWrite){return{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,...params}}else{return{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...params}}}constructor({aggregations,bufferSize=50,columns,filterSpec:filter,groupBy=[],table,range,sort,title,viewport,visualLink},postMessageToClient){viewport_class_private_field_init(this,_status,{writable:true,value:\"\"});viewport_define_property(this,\"aggregations\",void 0);viewport_define_property(this,\"batchMode\",false);viewport_define_property(this,\"bufferSize\",void 0);viewport_class_private_field_init(this,_clientRange,{writable:true,value:void 0});viewport_define_property(this,\"columns\",void 0);viewport_define_property(this,\"dataWindow\",void 0);viewport_define_property(this,\"filter\",void 0);viewport_define_property(this,\"groupBy\",void 0);viewport_define_property(this,\"sort\",void 0);viewport_define_property(this,\"hasUpdates\",false);viewport_define_property(this,\"pendingUpdates\",[]);viewport_define_property(this,\"keys\",void 0);viewport_class_private_field_init(this,_maxRangeEnd,{writable:true,value:Number.MAX_SAFE_INTEGER});viewport_define_property(this,\"pendingLinkedParent\",void 0);viewport_define_property(this,\"pendingOperations\",new Map);viewport_define_property(this,\"pendingRangeRequests\",[]);viewport_define_property(this,\"postMessageToClient\",void 0);viewport_define_property(this,\"rowCountChanged\",false);viewport_define_property(this,\"lastUpdateStatus\",NO_UPDATE_STATUS);viewport_define_property(this,\"updateThrottleTimer\",undefined);viewport_define_property(this,\"rangeMonitor\",new RangeMonitor(\"ViewPort\"));viewport_define_property(this,\"clientViewportId\",void 0);viewport_define_property(this,\"disabled\",false);viewport_define_property(this,\"disabledActive\",false);viewport_define_property(this,\"frozen\",false);viewport_define_property(this,\"isTree\",false);viewport_define_property(this,\"links\",void 0);viewport_define_property(this,\"linkedParent\",void 0);viewport_define_property(this,\"serverViewportId\",void 0);viewport_define_property(this,\"suspended\",false);viewport_define_property(this,\"suspendTimer\",null);viewport_define_property(this,\"table\",void 0);viewport_define_property(this,\"title\",void 0);viewport_define_property(this,\"setLastSizeOnlyUpdateSize\",size=>{this.lastUpdateStatus.size=size});viewport_define_property(this,\"setLastUpdate\",mode=>{const{ts:lastTS,mode:lastMode}=this.lastUpdateStatus;let elapsedTime=0;if(lastMode===mode){const ts=Date.now();this.lastUpdateStatus.count+=1;this.lastUpdateStatus.ts=ts;elapsedTime=lastTS===0?0:ts-lastTS}else{this.lastUpdateStatus.count=1;this.lastUpdateStatus.ts=0;elapsedTime=0}this.lastUpdateStatus.mode=mode;return elapsedTime});viewport_define_property(this,\"rangeRequestAlreadyPending\",range=>{const{bufferSize}=this;const bufferThreshold=bufferSize*.25;let{from:stillPendingFrom}=range;for(const{from,to}of this.pendingRangeRequests){if(stillPendingFrom>=from&&stillPendingFrom<to){if(range.to+bufferThreshold<=to){return true}else{stillPendingFrom=to}}}return false});viewport_define_property(this,\"sendThrottledSizeMessage\",()=>{this.updateThrottleTimer=undefined;this.lastUpdateStatus.count=3;this.postMessageToClient({clientViewportId:this.clientViewportId,mode:\"size-only\",size:this.lastUpdateStatus.size,type:\"viewport-update\"})});viewport_define_property(this,\"shouldThrottleMessage\",mode=>{const elapsedTime=this.setLastUpdate(mode);return mode===\"size-only\"&&elapsedTime>0&&elapsedTime<500&&this.lastUpdateStatus.count>3});viewport_define_property(this,\"throttleMessage\",mode=>{if(this.shouldThrottleMessage(mode)){viewport_info?.(\"[Viewport] throttling updates setTimeout to 300\");this.setLastSizeOnlyUpdateSize(this.dataWindow.rowCount);if(this.updateThrottleTimer===undefined){this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,100)}return true}else if(this.updateThrottleTimer!==undefined){clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}return false});viewport_define_property(this,\"getNewRowCount\",()=>{if(this.rowCountChanged&&this.dataWindow){this.rowCountChanged=false;return this.dataWindow.rowCount}});this.aggregations=aggregations;this.bufferSize=bufferSize;viewport_class_private_field_set(this,_clientRange,range);this.clientViewportId=viewport;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.keys=new KeySet(range);this.pendingLinkedParent=visualLink;this.table=table;this.sort=sort;this.title=title;viewport_infoEnabled&&viewport_info?.(`${table.table} #${viewport}, bufferSize=${bufferSize}`);this.dataWindow=new ArrayBackedMovingWindow(viewport_class_private_field_get(this,_clientRange),range,this.bufferSize);this.postMessageToClient=postMessageToClient}}const viewport_isNew=false;const toClientRow=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{return[rowIndex,keys.keyFor(rowIndex),true,false,0,0,rowKey,isSelected,ts,viewport_isNew].concat(data)};const toClientRowTree=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{const[depth,isExpanded,,isLeaf,,count,...rest]=data;return[rowIndex,keys.keyFor(rowIndex),isLeaf,isExpanded,depth,count,rowKey,isSelected,ts,viewport_isNew].concat(rest)};function event_emitter_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function event_emitter_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function event_emitter_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function event_emitter_class_private_field_get(receiver,privateMap){var descriptor=event_emitter_class_extract_field_descriptor(receiver,privateMap,\"get\");return event_emitter_class_apply_descriptor_get(receiver,descriptor)}function event_emitter_class_private_field_init(obj,privateMap,value){event_emitter_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function isArrayOfListeners(listeners){return Array.isArray(listeners)}function isOnlyListener(listeners){return!Array.isArray(listeners)}var _events=new WeakMap;class EventEmitter{addListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(!listeners){event_emitter_class_private_field_get(this,_events).set(event,listener)}else if(isArrayOfListeners(listeners)){listeners.push(listener)}else if(isOnlyListener(listeners)){event_emitter_class_private_field_get(this,_events).set(event,[listeners,listener])}}removeListener(event,listener){if(!event_emitter_class_private_field_get(this,_events).has(event)){return}const listenerOrListeners=event_emitter_class_private_field_get(this,_events).get(event);let position=-1;if(listenerOrListeners===listener){event_emitter_class_private_field_get(this,_events).delete(event)}else if(Array.isArray(listenerOrListeners)){for(let i=listenerOrListeners.length;i-- >0;){if(listenerOrListeners[i]===listener){position=i;break}}if(position<0){return}if(listenerOrListeners.length===1){listenerOrListeners.length=0;event_emitter_class_private_field_get(this,_events).delete(event)}else{listenerOrListeners.splice(position,1)}}}removeAllListeners(event){if(event&&event_emitter_class_private_field_get(this,_events).has(event)){event_emitter_class_private_field_get(this,_events).delete(event)}else if(event===undefined){event_emitter_class_private_field_get(this,_events).clear()}}emit(event,...args){if(event_emitter_class_private_field_get(this,_events)){const handler=event_emitter_class_private_field_get(this,_events).get(event);if(handler){this.invokeHandler(handler,args)}}}once(event,listener){const handler=(...args)=>{this.removeListener(event,handler);listener(...args)};this.on(event,handler)}on(event,listener){this.addListener(event,listener)}hasListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(Array.isArray(listeners)){return listeners.includes(listener)}else{return listeners===listener}}invokeHandler(handler,args){if(isArrayOfListeners(handler)){handler.slice().forEach(listener=>this.invokeHandler(listener,args))}else{switch(args.length){case 0:handler();break;case 1:handler(args[0]);break;case 2:handler(args[0],args[1]);break;default:handler.call(null,...args)}}}constructor(){event_emitter_class_private_field_init(this,_events,{writable:true,value:new Map})}};function promise_utils_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function promise_utils_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function promise_utils_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function promise_utils_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function promise_utils_class_private_field_get(receiver,privateMap){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,\"get\");return promise_utils_class_apply_descriptor_get(receiver,descriptor)}function promise_utils_class_private_field_init(obj,privateMap,value){promise_utils_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function promise_utils_class_private_field_set(receiver,privateMap,value){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,\"set\");promise_utils_class_apply_descriptor_set(receiver,descriptor,value);return value}var _promise=new WeakMap,_resolve=new WeakMap,_reject=new WeakMap,_resolved=new WeakMap;class DeferredPromise{get promise(){return promise_utils_class_private_field_get(this,_promise)}get isResolved(){return promise_utils_class_private_field_get(this,_resolved)}resolve(value){promise_utils_class_private_field_set(this,_resolved,true);return promise_utils_class_private_field_get(this,_resolve).call(this,value)}get reject(){return promise_utils_class_private_field_get(this,_reject)}constructor(){promise_utils_class_private_field_init(this,_promise,{writable:true,value:void 0});promise_utils_class_private_field_init(this,_resolve,{writable:true,value:()=>console.log(\"resolve was not set\")});promise_utils_class_private_field_init(this,_reject,{writable:true,value:()=>console.log(\"reject was not set\")});promise_utils_class_private_field_init(this,_resolved,{writable:true,value:false});promise_utils_class_private_field_set(this,_promise,new Promise((resolve,reject)=>{promise_utils_class_private_field_set(this,_resolve,resolve);promise_utils_class_private_field_set(this,_reject,reject)}))}};function WebSocketConnection_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function WebSocketConnection_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function WebSocketConnection_class_private_field_get(receiver,privateMap){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,\"get\");return WebSocketConnection_class_apply_descriptor_get(receiver,descriptor)}function WebSocketConnection_class_private_field_init(obj,privateMap,value){WebSocketConnection_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function WebSocketConnection_class_private_field_set(receiver,privateMap,value){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,\"set\");WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value);return value}function WebSocketConnection_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const isInvalidTokenReason=text=>text===\"Invalid token\"||text===\"Token has expired\";const isInvalidSessionReason=text=>text===\"Invalid session\"||text===\"User session limit exceeded\";const{debug:WebSocketConnection_debug,debugEnabled:WebSocketConnection_debugEnabled,info:WebSocketConnection_info}=logger(\"WebSocketConnection\");const isWebSocketConnectionStatus=msg=>typeof msg===\"string\"&&[\"connecting\",\"websocket-open\",\"connected\",\"reconnecting\",\"reconnected\",\"disconnected\",\"closed\",\"failed\"].includes(msg);const isConnected=status=>status===\"connected\"||status===\"reconnected\";const isLoginRejectedMessage=message=>message!==null&&\"type\"in message&&message.type===\"LOGIN_REJECTED\";const DEFAULT_CONNECTION_TIMEOUT=1e4;const parseWebSocketMessage=message=>{try{return JSON.parse(message)}catch(e){throw Error(`Error parsing JSON response from server ${message}`)}};var _callback=new WeakMap,_confirmedOpen=new WeakMap,_connectionPhase=new WeakMap,_connectionStatus=new WeakMap,_connectionTimeout=new WeakMap,_deferredOpen=new WeakMap,_protocols=new WeakMap,_url=new WeakMap,_ws=new WeakMap;class WebSocketConnection extends EventEmitter{get connectionTimeout(){return WebSocketConnection_class_private_field_get(this,_connectionTimeout)}get protocols(){return WebSocketConnection_class_private_field_get(this,_protocols)}get isClosed(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)===\"closed\"}get isDisconnected(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)===\"disconnected\"}get connectionPhase(){return WebSocketConnection_class_private_field_get(this,_connectionPhase)}get connectionStatus(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)}set connectionStatus(connectionStatus){if(connectionStatus!==\"connecting\"&&connectionStatus!==\"reconnecting\"){WebSocketConnection_class_private_field_set(this,_connectionStatus,connectionStatus);this.emit(\"connection-status\",WebSocketConnection_class_private_field_get(this,_connectionStatus))}}get confirmedOpen(){return WebSocketConnection_class_private_field_get(this,_confirmedOpen)}set confirmedOpen(confirmedOpen){WebSocketConnection_class_private_field_set(this,_confirmedOpen,confirmedOpen);if(confirmedOpen&&WebSocketConnection_class_private_field_get(this,_connectionPhase)===\"initial-connection\"){WebSocketConnection_class_private_field_set(this,_connectionPhase,\"post-disconnect-reconnection\")}}get url(){return WebSocketConnection_class_private_field_get(this,_url)}async openWebSocket(){const initialConnect=WebSocketConnection_class_private_field_get(this,_connectionPhase)===\"initial-connection\";if(WebSocketConnection_class_private_field_get(this,_deferredOpen)===undefined){WebSocketConnection_class_private_field_set(this,_deferredOpen,new DeferredPromise)}const{connectionTimeout,protocols,url}=this;WebSocketConnection_class_private_field_set(this,_connectionStatus,initialConnect?\"connecting\":\"reconnecting\");const timer=setTimeout(()=>{throw Error(`Failed to open WebSocket connection to ${url}, timed out after ${connectionTimeout}ms`)},connectionTimeout);const ws=WebSocketConnection_class_private_field_set(this,_ws,new WebSocket(url,protocols));ws.onopen=()=>{this.connectionStatus=\"websocket-open\";clearTimeout(timer);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).resolve(undefined);WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}};ws.onerror=()=>{clearTimeout(timer)};ws.onclose=()=>{if(!this.isClosed){this.confirmedOpen=false;this.connectionStatus=\"disconnected\";this.close(\"failure\")}};ws.onmessage=evt=>{this.receive(evt)};return WebSocketConnection_class_private_field_get(this,_deferredOpen)?.promise}close(reason=\"shutdown\"){this.connectionStatus=\"closed\";if(reason===\"failure\"){if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).reject(Error(\"connection failed\"));WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}}else{WebSocketConnection_class_private_field_get(this,_ws)?.close()}WebSocketConnection_class_private_field_set(this,_ws,undefined)}constructor({callback,connectionTimeout=DEFAULT_CONNECTION_TIMEOUT,protocols,url}){super(),WebSocketConnection_class_private_field_init(this,_callback,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_confirmedOpen,{writable:true,value:false}),WebSocketConnection_class_private_field_init(this,_connectionPhase,{writable:true,value:\"initial-connection\"}),WebSocketConnection_class_private_field_init(this,_connectionStatus,{writable:true,value:\"closed\"}),WebSocketConnection_class_private_field_init(this,_connectionTimeout,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_deferredOpen,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_protocols,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_url,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_ws,{writable:true,value:void 0}),WebSocketConnection_define_property(this,\"receive\",evt=>{if(isLoginErrorMessage(evt.data)){console.warn(`[WebSocketConnection] closed because of login issue`);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){console.warn(`... and we have a deferred connection`)}WebSocketConnection_class_private_field_get(this,_callback).call(this,{type:\"LOGIN_REJECTED\",reason:evt.data});this.close(evt.data)}else{const vuuMessageFromServer=parseWebSocketMessage(evt.data);if(WebSocketConnection_debugEnabled){if(vuuMessageFromServer.body.type!==\"HB\"){WebSocketConnection_debug(`<=== ${vuuMessageFromServer.body.type}`);if(vuuMessageFromServer.body.type===\"CHANGE_VP_SUCCESS\"){WebSocketConnection_debug(JSON.stringify(vuuMessageFromServer.body))}}}WebSocketConnection_class_private_field_get(this,_callback).call(this,vuuMessageFromServer);if(!this.confirmedOpen){if(vuuMessageFromServer.body.type===\"LOGIN_SUCCESS\"){this.connectionStatus=WebSocketConnection_class_private_field_get(this,_connectionPhase)===\"initial-connection\"?\"connected\":\"reconnected\";this.confirmedOpen=true}}}}),WebSocketConnection_define_property(this,\"send\",msg=>{if(msg.body.type===\"CHANGE_VP_RANGE\"){WebSocketConnection_info?.(`===> CHANGE_VP_RANGE<#${msg.requestId}> ${msg.body.from}-${msg.body.to}`)}WebSocketConnection_class_private_field_get(this,_ws)?.send(JSON.stringify(msg))});WebSocketConnection_class_private_field_set(this,_callback,callback);WebSocketConnection_class_private_field_set(this,_connectionTimeout,connectionTimeout);WebSocketConnection_class_private_field_set(this,_url,url);WebSocketConnection_class_private_field_set(this,_protocols,protocols)}};function server_proxy_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}let _requestId=1;const TEST_setRequestId=id=>_requestId=id;const{debug:server_proxy_debug,debugEnabled:server_proxy_debugEnabled,error:server_proxy_error,info:server_proxy_info,infoEnabled:server_proxy_infoEnabled,warn:server_proxy_warn}=logger(\"ServerProxy\");const nextRequestId=()=>`${_requestId++}`;const DEFAULT_OPTIONS={};const isActiveViewport=viewPort=>viewPort.disabled!==true&&viewPort.suspended!==true;const addTitleToLinks=(links,serverViewportId,label)=>links.map(link=>link.parentVpId===serverViewportId?{...link,label}:link);function addLabelsToLinks(links,viewports){return links.map(linkDescriptor=>{const{parentVpId}=linkDescriptor;const viewport=viewports.get(parentVpId);if(viewport){return{...linkDescriptor,parentClientVpId:viewport.clientViewportId,label:viewport.title}}else{throw Error(\"addLabelsToLinks viewport not found\")}})}class ServerProxy{async login(authToken){if(authToken){this.authToken=authToken;return new Promise((resolve,reject)=>{this.sendMessageToServer({type:\"LOGIN\",token:this.authToken},\"\");this.pendingLogin={resolve,reject}})}else if(this.authToken===\"\"){server_proxy_error(\"login, cannot login until auth token has been obtained\")}}clearAllViewports(){this.viewports.forEach(viewport=>{viewport.clearCache()})}disconnect(){this.viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.unsubscribe(clientViewportId);this.postMessageToClient({clientViewportId,type:\"viewport-clear\"})})}async subscribe(message){if(!this.mapClientToServerViewport.has(message.viewport)){const pendingTableSchema=this.getTableMeta(message.table);const viewport=new Viewport(message,this.postMessageToClient);this.viewports.set(message.viewport,viewport);const pendingSubscription=this.awaitResponseToMessage(viewport.subscribe(),message.viewport);const[subscribeResponse,tableSchema]=await Promise.all([pendingSubscription,pendingTableSchema]);if(isErrorMessage(tableSchema)){this.postMessageToClient({clientViewportId:message.viewport,type:\"subscribe-failed\",msg:`failed to fetch schema for table ${message.table.table}: ${tableSchema.msg}`})}else if(isCreateVpSuccess(subscribeResponse)){const{viewPortId:serverViewportId}=subscribeResponse;const{status:previousViewportStatus}=viewport;if(message.viewport!==serverViewportId){this.viewports.delete(message.viewport);this.viewports.set(serverViewportId,viewport)}this.mapClientToServerViewport.set(message.viewport,serverViewportId);const clientResponse=viewport.handleSubscribed(subscribeResponse,tableSchema);if(clientResponse){this.postMessageToClient(clientResponse);if(server_proxy_debugEnabled){server_proxy_debug(`post DataSourceSubscribedMessage to client: ${JSON.stringify(clientResponse)}`)}}if(viewport.disabled){this.disableViewport(viewport)}if(this.queuedRequests.length>0){this.processQueuedRequests()}if(previousViewportStatus===\"subscribing\"&&!isSessionTable(viewport.table)){this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId:serverViewportId});this.sendMessageToServer({type:GET_VIEW_PORT_MENUS,vpId:serverViewportId});Array.from(this.viewports.entries()).filter(([id,{disabled,status}])=>id!==serverViewportId&&!disabled&&status===\"subscribed\").forEach(([vpId])=>{this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId})})}}else{this.postMessageToClient({clientViewportId:message.viewport,type:\"subscribe-failed\",msg:`failed to open subscription on table ${message.table.table}: ${subscribeResponse.msg}`})}}else{server_proxy_error(`spurious subscribe call ${message.viewport}`)}}addRequestToQueue(queuedRequest){const isDifferentTypeViewport=qr=>qr.clientViewportId!==queuedRequest.clientViewportId||queuedRequest.message.type!==qr.message.type;if(!this.queuedRequests.every(isDifferentTypeViewport)){this.queuedRequests=this.queuedRequests.filter(isDifferentTypeViewport)}this.queuedRequests.push(queuedRequest)}processQueuedRequests(){const newQueue=[];for(const queuedRequest of this.queuedRequests){const{clientViewportId,message,requestId}=queuedRequest;const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){this.sendMessageToServer({...message,viewPortId:serverViewportId},requestId)}else if(this.viewports.has(clientViewportId)){newQueue.push(queuedRequest)}else{console.warn(`ServerProxy processQueuedRequests, ${message.type} request not found ${clientViewportId}`)}}this.queuedRequests=newQueue}unsubscribe(clientViewportId){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){server_proxy_info?.(`Unsubscribe Message (Client to Server):\n ${serverViewportId}`);this.sendMessageToServer({type:REMOVE_VP,viewPortId:serverViewportId})}else{server_proxy_error(`failed to unsubscribe client viewport ${clientViewportId}, viewport not found`)}}getViewportForClient(clientViewportId,throws=true){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){const viewport=this.viewports.get(serverViewportId);if(viewport){return viewport}else if(throws){throw Error(`Viewport not found for client viewport ${clientViewportId}`)}else{return null}}else if(this.viewports.has(clientViewportId)){return this.viewports.get(clientViewportId)}else if(throws){throw Error(`Viewport server id not found for client viewport ${clientViewportId}`)}else{return null}}setViewRange(viewport,message){const requestId=nextRequestId();server_proxy_infoEnabled&&server_proxy_info(`setViewRange (${message.range.from}:${message.range.to})`);const[serverRequest,rows,debounceRequest]=viewport.rangeRequest(requestId,message.range);if(viewport.status===\"subscribed\"){server_proxy_info?.(`setViewRange ${message.range.from} - ${message.range.to}`);if(serverRequest){if(true){server_proxy_info?.(`CHANGE_VP_RANGE (${message.range.from}-${message.range.to}) => (${serverRequest.from}-${serverRequest.to})`)}server_proxy_infoEnabled&&server_proxy_info(`setViewRange send CHANGE_VP_RANGE<#${requestId}> (${serverRequest.from}-${serverRequest.to})`);this.sendMessageToServer(serverRequest,requestId)}if(rows){server_proxy_info?.(`setViewRange ${rows.length} rows returned from cache`);this.postMessageToClient({mode:\"update\",type:\"viewport-update\",clientViewportId:viewport.clientViewportId,range:message.range,rows})}else if(debounceRequest){this.postMessageToClient(debounceRequest)}}else if(serverRequest){this.addRequestToQueue({clientViewportId:message.viewport,message:serverRequest,requestId})}}setConfig(viewport,message){const requestId=nextRequestId();const request=viewport.setConfig(requestId,message.config);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}setTitle(viewport,message){if(viewport){viewport.title=message.title;this.updateTitleOnVisualLinks(viewport)}}select(viewport,message){const[requestId,selectRequest]=stripRequestId(message);const request=viewport.selectRequest(selectRequest);this.sendMessageToServer(request,requestId)}disableAllActiveViewports(){console.log(`[ServerProxy] disableAllActiveViewports`);this.viewports.forEach(vp=>{if(isActiveViewport(vp)){this.disableViewport(vp,true)}})}enableAllActiveViewports(){this.viewports.forEach(vp=>{if(vp.disabledActive){this.enableViewport(vp)}})}disableViewport(viewport,disableActive=false){const requestId=nextRequestId();const request=viewport.disable(requestId,disableActive);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}enableViewport(viewport){if(viewport.disabled){const requestId=nextRequestId();const request=viewport.enable(requestId);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}}freezeViewport(viewport){const requestId=nextRequestId();const request=viewport.freeze(requestId);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}unfreezeViewport(viewport){if(viewport.frozen){const requestId=nextRequestId();const request=viewport.unfreeze(requestId);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}}suspendViewport(viewport,escalateToDisable=true,escalateDelay=3e3){viewport.suspend();if(escalateToDisable){viewport.suspendTimer=setTimeout(()=>{server_proxy_info?.(\"suspendTimer expired, escalate suspend to disable\");this.disableViewport(viewport)},escalateDelay)}}resumeViewport(viewport){if(viewport.suspendTimer){server_proxy_debug?.(\"clear suspend timer\");clearTimeout(viewport.suspendTimer);viewport.suspendTimer=null}const[size,rows]=viewport.resume();server_proxy_debug?.(`resumeViewport size ${size}, ${rows.length} rows sent to client`);this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:\"update\",rows,size,type:\"viewport-update\"})}openTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.openTreeNode(requestId,message),requestId,viewport.status===\"subscribed\")}}closeTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.closeTreeNode(requestId,message),requestId,viewport.status===\"subscribed\")}}createLink(viewport,message){const[requestId,visualLinkRequest]=stripRequestId(message);const parentVpId=this.mapClientToServerViewport.get(message.parentVpId);if(parentVpId){const request=viewport.createLink(requestId,{...visualLinkRequest,parentVpId});this.sendMessageToServer(request,requestId)}else{throw Error(`createLink parent viewport not found ${message.parentVpId}`)}}removeLink(viewport,message){const{requestId}=message;const request=viewport.removeLink(requestId);this.sendMessageToServer(request,requestId)}updateTitleOnVisualLinks(viewport){const{serverViewportId,title}=viewport;for(const vp of this.viewports.values()){if(vp!==viewport&&vp.links&&serverViewportId&&title){if(vp.links?.some(link=>link.parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(addTitleToLinks(vp.links,serverViewportId,title));this.postMessageToClient(messageToClient)}}}}removeViewportFromVisualLinks(serverViewportId){for(const vp of this.viewports.values()){if(vp.links?.some(({parentVpId})=>parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(vp.links.filter(({parentVpId})=>parentVpId!==serverViewportId));this.postMessageToClient(messageToClient)}}}menuRpcCall(message){const viewport=this.getViewportForClient(message.vpId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,vpId:viewport.serverViewportId},requestId)}}rpcRequest(message){if(hasViewPortContext(message)){const viewport=this.getViewportForClient(message.context.viewPortId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,context:{type:\"VIEWPORT_CONTEXT\",viewPortId:viewport.serverViewportId}},requestId)}}else{throw Error(`[ServerProxy] rpcRequest only supports VIEWPORT_CONTEXT at present`)}}handleMessageFromClient(message){if(isViewportMessage(message)||isVisualLinkMessage(message)){if(message.type===\"disable\"){const viewport=this.getViewportForClient(message.viewport,false);if(viewport!==null){return this.disableViewport(viewport)}else{return}}else{const viewport=isVisualLinkMessage(message)?this.getViewportForClient(message.childVpId):this.getViewportForClient(message.viewport);switch(message.type){case\"setViewRange\":return this.setViewRange(viewport,message);case\"config\":return this.setConfig(viewport,message);case\"suspend\":{const{escalateToDisable,escalateDelay}=message;return this.suspendViewport(viewport,escalateToDisable,escalateDelay)}case\"resume\":return this.resumeViewport(viewport);case\"enable\":return this.enableViewport(viewport);case\"FREEZE_VP\":return this.freezeViewport(viewport);case\"UNFREEZE_VP\":return this.unfreezeViewport(viewport);case\"openTreeNode\":return this.openTreeNode(viewport,message);case\"closeTreeNode\":return this.closeTreeNode(viewport,message);case\"CREATE_VISUAL_LINK\":return this.createLink(viewport,message);case\"REMOVE_VISUAL_LINK\":return this.removeLink(viewport,message);case\"setTitle\":return this.setTitle(viewport,message);default:}}}else if(isSelectRequest(message)){if(hasRequestId(message)){const viewport=this.getViewportForClient(message.vpId);return this.select(viewport,message)}else{console.warn(`selectRequest must have requestId`)}}else if(isRpcServiceRequest(message)){return this.rpcRequest(message)}else if(isVuuMenuRpcRequest(message)){return this.menuRpcCall(message)}else if(message.type===\"disconnect\"){return this.disconnect()}else if(message.type===\"disable-all-active\"){return this.disableAllActiveViewports()}else if(message.type===\"enable-all-active\"){return this.enableAllActiveViewports()}else{const{type,requestId}=message;switch(type){case\"GET_TABLE_LIST\":{this.tableList??(this.tableList=this.awaitResponseToMessage({type},requestId));this.tableList.then(response=>{this.postMessageToClient({type:\"TABLE_LIST_RESP\",tables:response.tables,requestId})});return}case\"GET_TABLE_META\":{this.getTableMeta(message.table,requestId).then(tableSchema=>{if(isErrorMessage(tableSchema)){}else if(tableSchema){this.postMessageToClient({type:\"TABLE_META_RESP\",tableSchema,requestId})}});return}default:}}server_proxy_error(`Vuu ServerProxy Unexpected message from client ${JSON.stringify(message)}`)}getTableMeta(table,requestId=nextRequestId()){if(isSessionTable(table)){return this.awaitResponseToMessage({type:\"GET_TABLE_META\",table},requestId).then(resp=>isErrorMessage(resp)?resp:createSchemaFromTableMetadata(resp))}const key=`${table.module}:${table.table}`;let tableMetaRequest=this.cachedTableMetaRequests.get(key);if(!tableMetaRequest){tableMetaRequest=this.awaitResponseToMessage({type:\"GET_TABLE_META\",table},requestId);this.cachedTableMetaRequests.set(key,tableMetaRequest)}return tableMetaRequest?.then(response=>{if(isErrorMessage(response)){return response}else{return this.cacheTableMeta(response)}})}awaitResponseToMessage(message,requestId=nextRequestId()){return new Promise((resolve,reject)=>{this.sendMessageToServer(message,requestId);this.pendingRequests.set(requestId,{reject,resolve})})}sendIfReady(message,requestId,isReady=true){if(isReady){this.sendMessageToServer(message,requestId)}return isReady}sendMessageToServer(body,requestId=`${_requestId++}`,options=DEFAULT_OPTIONS){const{module=\"CORE\"}=options;if(this.authToken){this.connection.send({requestId,sessionId:this.sessionId,module,body})}}handleMessageFromServer(message){if(isLoginRejectedMessage(message)){if(this.pendingLogin){this.pendingLogin.reject(message.reason);this.pendingLogin=undefined;this.authToken=\"\"}return}const{body,requestId,sessionId}=message;const pendingRequest=this.pendingRequests.get(requestId);if(pendingRequest){const{resolve}=pendingRequest;this.pendingRequests.delete(requestId);resolve(body);return}const{viewports}=this;switch(body.type){case\"HB\":this.sendMessageToServer({type:HB_RESP,ts:+new Date},\"NA\");break;case\"LOGIN_SUCCESS\":if(sessionId){this.sessionId=sessionId;this.pendingLogin?.resolve(sessionId);this.pendingLogin=undefined;this.postMessageToClient({...body,sessionId})}else{throw Error(\"LOGIN_SUCCESS did not provide sessionId\")}break;case\"REMOVE_VP_SUCCESS\":{const viewport=viewports.get(body.viewPortId);if(viewport){this.mapClientToServerViewport.delete(viewport.clientViewportId);viewports.delete(body.viewPortId);this.removeViewportFromVisualLinks(body.viewPortId)}}break;case\"SELECT_ALL_SUCCESS\":case\"SELECT_ROW_SUCCESS\":case\"SELECT_ROW_RANGE_SUCCESS\":case\"DESELECT_ROW_SUCCESS\":{const{type,selectedRowCount}=body;this.postMessageToClient({requestId,type,selectedRowCount});break}case\"DESELECT_ALL_SUCCESS\":{const{type}=body;this.postMessageToClient({requestId,type,selectedRowCount:0});break}case\"SELECT_ROW_REJECT\":case\"DESELECT_ROW_REJECT\":case\"SELECT_ROW_RANGE_REJECT\":case\"SELECT_ALL_REJECT\":case\"DESELECT_ALL_REJECT\":console.warn(`select error ${body.type} ${body.errorMsg}`);break;case CHANGE_VP_SUCCESS:case DISABLE_VP_SUCCESS:if(viewports.has(body.viewPortId)){const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response!==undefined){this.postMessageToClient(response);if(server_proxy_debugEnabled){server_proxy_debug(`postMessageToClient ${JSON.stringify(response)}`)}}}}break;case ENABLE_VP_SUCCESS:{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response);const[size,rows]=viewport.resume();this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:\"update\",rows,size,type:\"viewport-update\"})}}}break;case\"FREEZE_VP_SUCCESS\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case\"UNFREEZE_VP_SUCCESS\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case\"TABLE_ROW\":{const viewportRowMap=groupRowsByViewport(body.rows);if(true&&server_proxy_debugEnabled){const[firstRow]=body.rows;if(body.rows.length===0){server_proxy_infoEnabled&&server_proxy_info(\"<=== TABLE_ROW 0 rows\")}else if(firstRow?.rowIndex===-1){if(body.rows.length===1){if(firstRow.updateType===\"SIZE\"){server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ONLY ${firstRow.vpSize}`)}else{server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ${firstRow.vpSize} rowIdx ${firstRow.rowIndex}`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows, SIZE ${firstRow.vpSize}, [${body.rows.map(r=>r.rowIndex).join(\",\")}]`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows [${body.rows.map(r=>r.rowIndex).join(\",\")}]`)}}for(const[viewportId,rows]of Object.entries(viewportRowMap)){const viewport=viewports.get(viewportId);if(viewport){viewport.updateRows(rows)}else{server_proxy_warn?.(`TABLE_ROW message received for non registered viewport ${viewportId}`)}}this.processUpdates()}break;case\"CHANGE_VP_RANGE_SUCCESS\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const{from,to}=body;server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_SUCCESS<#${requestId}> ${from} - ${to}`);viewport.completeOperation(requestId,from,to)}}break;case\"CHANGE_VP_RANGE_REJECT\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_REJECT<#${requestId}>`);viewport.rejectOperation(requestId,body.msg)}}break;case OPEN_TREE_SUCCESS:case CLOSE_TREE_SUCCESS:break;case\"CREATE_VISUAL_LINK_SUCCESS\":{const viewport=this.viewports.get(body.childVpId);const parentViewport=this.viewports.get(body.parentVpId);if(viewport&&parentViewport){const{childColumnName,parentColumnName}=body;const response=viewport.completeOperation(requestId,childColumnName,parentViewport.clientViewportId,parentColumnName);if(response){this.postMessageToClient(response)}}}break;case\"REMOVE_VISUAL_LINK_SUCCESS\":{const viewport=this.viewports.get(body.childVpId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case\"VP_VISUAL_LINKS_RESP\":{const activeLinkDescriptors=this.getActiveLinks(body.links);const viewport=this.viewports.get(body.vpId);if(activeLinkDescriptors.length&&viewport){const linkDescriptorsWithLabels=addLabelsToLinks(activeLinkDescriptors,this.viewports);const[clientMessage,pendingLink]=viewport.setLinks(linkDescriptorsWithLabels);this.postMessageToClient(clientMessage);if(pendingLink){const{link,parentClientVpId}=pendingLink;const requestId=nextRequestId();const parentVpId=this.mapClientToServerViewport.get(parentClientVpId);if(parentVpId){const message=viewport.createLink(requestId,{childVpId:body.vpId,childColumnName:link.fromColumn,parentColumnName:link.toColumn,parentVpId,type:\"CREATE_VISUAL_LINK\"});this.sendMessageToServer(message,requestId)}}}}break;case\"VIEW_PORT_MENUS_RESP\":if(body.menu?.name){const viewport=this.viewports.get(body.vpId);if(viewport){const clientMessage=viewport.setMenu(body.menu);this.postMessageToClient(clientMessage)}}break;case\"VIEW_PORT_MENU_REJ\":{const{error,rpcName,vpId}=body;const viewport=this.viewports.get(vpId);if(viewport){this.postMessageToClient({clientViewportId:viewport.clientViewportId,error,rpcName,type:\"VIEW_PORT_MENU_REJ\",requestId})}break}case\"VIEW_PORT_MENU_RESP\":{if(isSessionTableActionMessage(body)){const{action,rpcName}=body;this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:action.table}).then(response=>{const tableSchema=createSchemaFromTableMetadata(response);this.postMessageToClient({rpcName,type:\"VIEW_PORT_MENU_RESP\",action:{...action,tableSchema},tableAlreadyOpen:this.isTableOpen(action.table),requestId})})}else{const{action,rpcName}=body;this.postMessageToClient({action,rpcName,requestId,tableAlreadyOpen:isOpenDialogAction(action)&&this.isTableOpen(action.table),type:\"VIEW_PORT_MENU_RESP\"})}}break;case\"RPC_RESPONSE\":{const{action,error,result}=body;this.postMessageToClient({action,type:\"RPC_RESPONSE\",error,result,requestId})}break;case\"ERROR\":server_proxy_error(body.msg);break;default:server_proxy_infoEnabled&&server_proxy_info(`<=== ${body[\"type\"]}.`)}}cacheTableMeta(messageBody){const{module,table}=messageBody.table;const key=`${module}:${table}`;let tableSchema=this.cachedTableSchemas.get(key);if(!tableSchema){tableSchema=createSchemaFromTableMetadata(messageBody);this.cachedTableSchemas.set(key,tableSchema)}return tableSchema}isTableOpen(table){if(table){const tableName=table.table;for(const viewport of this.viewports.values()){if(!viewport.suspended&&viewport.table.table===tableName){return true}}}}getActiveLinks(linkDescriptors){return linkDescriptors.filter(linkDescriptor=>{const viewport=this.viewports.get(linkDescriptor.parentVpId);return viewport&&!viewport.suspended})}processUpdates(){this.viewports.forEach(viewport=>{if(viewport.hasUpdatesToProcess){const result=viewport.getClientRows();if(result!==NO_DATA_UPDATE){const[rows,mode]=result;const size=viewport.getNewRowCount();if(size!==undefined||rows&&rows.length>0){server_proxy_debugEnabled&&server_proxy_debug(`===> #${viewport.clientViewportId} viewport-update ${mode}, ${rows?.length??\"no\"} rows, size ${size}`);if(mode){this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode,rows,size,type:\"viewport-update\"})}}}}})}constructor(connection,callback){server_proxy_define_property(this,\"connection\",void 0);server_proxy_define_property(this,\"postMessageToClient\",void 0);server_proxy_define_property(this,\"viewports\",void 0);server_proxy_define_property(this,\"mapClientToServerViewport\",void 0);server_proxy_define_property(this,\"authToken\",\"\");server_proxy_define_property(this,\"pendingLogin\",void 0);server_proxy_define_property(this,\"pendingRequests\",new Map);server_proxy_define_property(this,\"sessionId\",void 0);server_proxy_define_property(this,\"queuedRequests\",[]);server_proxy_define_property(this,\"cachedTableMetaRequests\",new Map);server_proxy_define_property(this,\"cachedTableSchemas\",new Map);server_proxy_define_property(this,\"tableList\",void 0);server_proxy_define_property(this,\"connectionStatusChanged\",status=>{if(status===\"disconnected\"){this.sessionId=undefined;this.clearAllViewports()}else if(status===\"reconnected\"){this.reconnect()}});server_proxy_define_property(this,\"reconnect\",async()=>{const[activeViewports,inactiveViewports]=partition(Array.from(this.viewports.values()),isActiveViewport);this.viewports.clear();this.mapClientToServerViewport.clear();const reconnectViewports=viewports=>{viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.awaitResponseToMessage(viewport.subscribe(),clientViewportId).then(msg=>{if(msg.type===\"CREATE_VP_SUCCESS\"){this.mapClientToServerViewport.set(clientViewportId,msg.viewPortId);this.viewports.set(msg.viewPortId,viewport);viewport.status=\"subscribed\";viewport.serverViewportId=msg.viewPortId}else{}})})};reconnectViewports(activeViewports);setTimeout(()=>{reconnectViewports(inactiveViewports)},2e3)});this.connection=connection;this.postMessageToClient=callback;this.viewports=new Map;this.mapClientToServerViewport=new Map;connection.on(\"connection-status\",this.connectionStatusChanged)}};let serverProxy;let webSocketConnection;const{info:worker_info,infoEnabled:worker_infoEnabled}=logger(\"worker\");const sendMessageToClient=message=>{postMessage(message)};async function connectToServer(url,protocols,token){if(webSocketConnection===undefined&&serverProxy===undefined){webSocketConnection=new WebSocketConnection({callback:msg=>{if(isConnectionQualityMetrics(msg)){postMessage({type:\"connection-metrics\",messages:msg})}else{serverProxy.handleMessageFromServer(msg)}},protocols,url});webSocketConnection.on(\"connection-status\",postMessage);serverProxy=new ServerProxy(webSocketConnection,sendMessageToClient)}await webSocketConnection.openWebSocket();return serverProxy.login(token)}const handleMessageFromClient=async({data:message})=>{switch(message.type){case\"connect\":try{const sessionId=await connectToServer(message.url,message.protocol,message.token);postMessage({type:\"connected\",sessionId})}catch(err){postMessage({type:\"connection-failed\",reason:String(err)})}break;case\"disconnect\":serverProxy.disconnect();webSocketConnection?.close();break;case\"subscribe\":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.subscribe(message);break;case\"unsubscribe\":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.unsubscribe(message.viewport);break;default:worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.handleMessageFromClient(message)}};self.addEventListener(\"message\",handleMessageFromClient);postMessage({type:\"ready\"})})();";
1
+ export declare const workerSourceCode = "(()=>{\"use strict\";const getCookieValue=name=>{if(globalThis.document?.cookie!==undefined){return globalThis.document.cookie.split(\"; \").find(row=>row.startsWith(`${name}=`))?.split(\"=\")[1]}};function setCookieValue(name,value,days){let expires=\"\";if(typeof days===\"number\"){const date=new Date;date.setTime(date.getTime()+days*24*60*60*1e3);expires=\"; expires=\"+date.toUTCString()}const encodedName=encodeURIComponent(name);const encodedValue=encodeURIComponent(value);document.cookie=`${encodedName}=${encodedValue}${expires};`};const logLevels=[\"error\",\"warn\",\"info\",\"debug\"];const isValidLogLevel=value=>typeof value===\"string\"&&logLevels.includes(value);const DEFAULT_LOG_LEVEL=\"error\";const NO_OP=()=>undefined;const DEFAULT_DEBUG_LEVEL=false?0:\"info\";const{loggingLevel=DEFAULT_DEBUG_LEVEL}=getLoggingSettings();const logger=category=>{const debugEnabled=loggingLevel===\"debug\";const infoEnabled=debugEnabled||loggingLevel===\"info\";const warnEnabled=infoEnabled||loggingLevel===\"warn\";const errorEnabled=warnEnabled||loggingLevel===\"error\";const info=infoEnabled?message=>console.info(`${Date.now()} [${category}] ${message}`):NO_OP;const warn=warnEnabled?message=>console.warn(`[${category}] ${message}`):NO_OP;const debug=debugEnabled?message=>console.debug(`${Date.now()} [${category}] ${message}`):NO_OP;const error=errorEnabled?message=>console.error(`[${category}] ${message}`):NO_OP;if(false){}else{return{debugEnabled,infoEnabled,warnEnabled,errorEnabled,info,warn,debug,error}}};function getLoggingSettings(){if(typeof loggingSettings!==\"undefined\"){return loggingSettings}else{return{loggingLevel:getLoggingLevelFromCookie()}}}function getLoggingLevelFromCookie(){const value=getCookieValue(\"vuu-logging-level\");if(isValidLogLevel(value)){return value}else{return DEFAULT_LOG_LEVEL}}const getLoggingConfigForWorker=()=>{return`const loggingSettings = { loggingLevel: \"${getLoggingLevelFromCookie()}\"};`};const logUnhandledMessage=(message,context=\"[logUnhandledStruct]\")=>{console.log(`${context} ${JSON.stringify(message)}`)};const NoFilter=null&&{filter:\"\"};const NoSort=null&&{sortDefs:[]};const vanillaConfig=null&&{aggregations:[],columns:[],filterSpec:NoFilter,groupBy:[],sort:NoSort};const sessionDataSourceConfig=(sourceConfig,overrideColumns)=>{if(overrideColumns===undefined){return sourceConfig}return{...vanillaConfig,columns:overrideColumns}};const assertExpectedSessionTable=(sessionTable,expectedTable)=>{if(expectedTable&&expectedTable.module!==sessionTable.module){throw Error(`[datasource-utils] session table ${sessionTable.module}/${sessionTable.table} does not match expected edit table module ${expectedTable.module}`)}};const stripVisualLink=configWithVisualLink=>{if(configWithVisualLink.visualLink){const{visualLink,...config}=configWithVisualLink;return config}else{return configWithVisualLink}};const equivalentAggregations=({aggregations:agg1},{aggregations:agg2})=>agg1===undefined&&agg2?.length===0||agg2===undefined&&agg1?.length===0;const equivalentColumns=({columns:cols1},{columns:cols2})=>cols1===undefined&&cols2?.length===0||cols2===undefined&&cols1?.length===0;const equivalentFilter=({filterSpec:f1},{filterSpec:f2})=>f1===undefined&&f2?.filter===\"\"||f2===undefined&&f1?.filter===\"\";const equivalentGroupBy=({groupBy:val1},{groupBy:val2})=>val1===undefined&&val2?.length===0||val2===undefined&&val1?.length===0;const equivalentSort=({sort:s1},{sort:s2})=>s1===undefined&&s2?.sortDefs.length===0||s2===undefined&&s1?.sortDefs.length===0;const exactlyTheSame=(a,b)=>{if(a===b){return true}else if(a===undefined&&b===undefined){return true}else{return false}};const isAggregationsChanged=(config,newConfig)=>{const{aggregations:agg1}=config;const{aggregations:agg2}=newConfig;if(exactlyTheSame(agg1,agg2)||equivalentAggregations(config,newConfig)){return false}else if(agg1===undefined||agg2===undefined){return true}else if(agg1.length!==agg2.length){return true}return agg1.some(({column,aggType},i)=>column!==agg2[i].column||aggType!==agg2[i].aggType)};const isColumnsChanged=(config,newConfig)=>{const{columns:cols1}=config;const{columns:cols2}=newConfig;if(exactlyTheSame(cols1,cols2)||equivalentColumns(config,newConfig)){return false}else if(cols1===undefined||cols2===undefined){return true}else if(cols1?.length!==cols2?.length){return true}return cols1.some((column,i)=>column!==cols2?.[i])};const isBaseFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.baseFilterSpec?.filter!==c2.baseFilterSpec?.filter}};const isFilterChanged=(c1,c2)=>{if(equivalentFilter(c1,c2)){return false}else{return c1.filterSpec?.filter!==c2.filterSpec?.filter}};const isGroupByChanged=(config,newConfig)=>{const{groupBy:g1}=config;const{groupBy:g2}=newConfig;if(exactlyTheSame(g1,g2)||equivalentGroupBy(config,newConfig)){return false}else if(g1===undefined||g2===undefined){return true}else if(g1?.length!==g2?.length){return true}return g1.some((column,i)=>column!==g2?.[i])};const isSortChanged=(config,newConfig)=>{const{sort:s1}=config;const{sort:s2}=newConfig;if(exactlyTheSame(s1,s2)||equivalentSort(config,newConfig)){return false}else if(s1===undefined||s2===undefined){return true}else if(s1?.sortDefs.length!==s2?.sortDefs.length){return true}return s1.sortDefs.some(({column,sortType},i)=>column!==s2.sortDefs[i].column||sortType!==s2.sortDefs[i].sortType)};const isVisualLinkChanged=({visualLink:v1},{visualLink:v2})=>{if(exactlyTheSame(v1,v2)){return false}if(v1===undefined||v2===undefined){return true}return v1.label!==v2.label||v1.parentVpId!==v2.parentVpId};const NO_CONFIG_CHANGES=null&&{aggregationsChanged:false,baseFilterChanged:false,columnsChanged:false,filterChanged:false,groupByChanged:false,noChanges:true,sortChanged:false,visualLinkChanged:false};const isConfigChanged=(config,newConfig)=>{if(exactlyTheSame(config,newConfig)){return NO_CONFIG_CHANGES}if(config===undefined&&newConfig==undefined){return NO_CONFIG_CHANGES}else if(config===undefined){return isConfigChanged({},newConfig)}else if(newConfig===undefined){return isConfigChanged(config,{})}const aggregationsChanged=isAggregationsChanged(config,newConfig);const baseFilterChanged=isBaseFilterChanged(config,newConfig);const columnsChanged=isColumnsChanged(config,newConfig);const filterChanged=isFilterChanged(config,newConfig);const groupByChanged=isGroupByChanged(config,newConfig);const sortChanged=isSortChanged(config,newConfig);const visualLinkChanged=isVisualLinkChanged(config,newConfig);const noChanges=!(aggregationsChanged||baseFilterChanged||columnsChanged||filterChanged||groupByChanged||sortChanged||visualLinkChanged);return{aggregationsChanged,baseFilterChanged,columnsChanged,filterChanged,groupByChanged,noChanges,sortChanged,visualLinkChanged}};const hasGroupBy=config=>config!==undefined&&config.groupBy!==undefined&&config.groupBy.length>0;const hasBaseFilter=config=>config?.baseFilterSpec!==undefined&&config.baseFilterSpec.filter.length>0;const hasFilter=config=>config?.filterSpec!==undefined&&config.filterSpec.filter.length>0;const hasSort=config=>config?.sort!==undefined&&Array.isArray(config.sort?.sortDefs)&&config.sort.sortDefs.length>0;const isTypeaheadSuggestionProvider=source=>typeof source[\"getTypeaheadSuggestions\"]===\"function\";const isTableSchemaMessage=message=>message.type===\"TABLE_META_RESP\";const isConnectionQualityMetrics=msg=>msg.type===\"connection-metrics\";const messageHasResult=msg=>typeof msg.result!==\"undefined\";const isVisualLinkMessage=msg=>msg.type.endsWith(\"_VISUAL_LINK\");const isVisualLinksMessage=msg=>msg.type===\"vuu-links\";const isViewportMessage=msg=>\"viewport\"in msg;const messageHasDataRows=message=>message.type===\"viewport-update\"&&Array.isArray(message.rows);const messageHasSize=message=>message.type===\"viewport-update\"&&typeof message.size===\"number\";const withConfigDefaults=config=>{if(config.aggregations&&config.baseFilterSpec&&config.columns&&config.filterSpec&&config.groupBy&&config.sort){return config}else{const{aggregations=[],baseFilterSpec:baseFilter={filter:\"\"},columns=[],filterSpec:filter={filter:\"\"},groupBy=[],sort={sortDefs:[]},visualLink}=config;return{aggregations,baseFilterSpec:baseFilter,columns,filterSpec:filter,groupBy,sort,visualLink}}};const dataSourceRowToEntity=(row,columnMap)=>Object.entries(columnMap).reduce((entity,[name,index])=>({...entity,[name]:row[index]}),{});const MENU_RPC_TYPES=[\"VIEW_PORT_MENUS_SELECT_RPC\",\"VIEW_PORT_MENU_TABLE_RPC\",\"VIEW_PORT_MENU_ROW_RPC\",\"VIEW_PORT_MENU_CELL_RPC\"];const INVALID_SESSION=\"Invalid session\";const SESSION_LIMIT_EXCEEDED=\"User session limit exceeded\";const INVALID_TOKEN=\"Invalid token\";const TOKEN_EXPIRED=\"Token has expired\";const InvalidLoginMessages=[INVALID_SESSION,SESSION_LIMIT_EXCEEDED,INVALID_TOKEN,TOKEN_EXPIRED];const isErrorMessage=message=>typeof message==\"object\"&&message?.type===\"ERROR\";const isLoginErrorMessage=message=>typeof message===\"string\"&&InvalidLoginMessages.includes(message);const isSelectRequest=message=>message&&typeof message===\"object\"&&\"type\"in message&&(message.type===\"SELECT_ROW\"||message.type===\"DESELECT_ROW\"||message.type===\"SELECT_ROW_RANGE\"||message.type===\"SELECT_ALL\"||message.type===\"DESELECT_ALL\");const isSelectSuccessWithRowCount=response=>[\"SELECT_ROW_SUCCESS\",\"DESELECT_ROW_SUCCESS\",\"SELECT_ROW_RANGE_SUCCESS\",\"SELECT_ALL_SUCCESS\",\"DESELECT_ALL_SUCCESS\"].includes(response.type??\"\")&&typeof response.selectedRowCount===\"number\";const isRpcServiceRequest=message=>message.type===\"RPC_REQUEST\";const hasViewPortContext=message=>message.context.type===\"VIEWPORT_CONTEXT\";const isVuuMenuRpcRequest=message=>MENU_RPC_TYPES.includes(message[\"type\"]);const isLoginResponse=message=>message!==null&&typeof message===\"object\"&&\"type\"in message&&(message.type===\"LOGIN_SUCCESS\"||message.type===\"LOGIN_FAIL\");const isRpcSuccess=rpcResult=>rpcResult?.type===\"SUCCESS_RESULT\";const isRpcError=rpcResult=>rpcResult?.type===\"ERROR_RESULT\";const isRequestResponse=message=>\"requestId\"in message;const isOpenSessionTableDialogMessage=rpcResponse=>rpcResponse.type===\"VIEW_PORT_MENU_RESP\"&&isOpenDialogAction(rpcResponse.action)&&\"tableSchema\"in rpcResponse.action;const isOpenDialogAction=action=>action!==undefined&&action.type===\"OPEN_DIALOG_ACTION\";const isTypeaheadRequest=request=>{return isRpcServiceRequest(request)&&(request.rpcName===\"getUniqueFieldValues\"||request.rpcName===\"getUniqueFieldValuesStartingWith\")};const isCreateVpSuccess=response=>response.type===\"CREATE_VP_SUCCESS\";const isSessionTable=table=>{if(table!==null&&typeof table===\"object\"&&\"table\"in table&&\"module\"in table){return table.table.startsWith(\"session\")}return false};function isActionMessage(rpcResponse){return rpcResponse.type===\"VIEW_PORT_MENU_RESP\"}function isSessionTableActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&(rpcResponse.action?.renderComponent===\"inline-form\"||rpcResponse.action?.renderComponent===\"grid\")}function isCustomComponentActionMessage(rpcResponse){return isActionMessage(rpcResponse)&&isOpenDialogAction(rpcResponse.action)&&isSessionTable(rpcResponse.action.table)&&typeof rpcResponse.action.renderComponent===\"string\"&&componentInRegistry(rpcResponse.action.renderComponent)}const numericTypes=null&&[\"int\",\"long\",\"double\",\"scaleddecimal2\",\"scaleddecimal4\",\"scaleddecimal6\",\"scaleddecimal8\"];function isNumericType(dataType){return numericTypes.includes(dataType)}const isAddRowRpcRequest=rpcRequest=>rpcRequest.rpcName===\"addRow\";const isEditCellRpcRequest=rpcRequest=>rpcRequest.rpcName===\"editCell\";const isBeginEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName===\"beginEditSession\";const isEndEditSessionRpcRequest=rpcRequest=>rpcRequest.rpcName===\"endEditSession\";const isUndoRowChangeRpcRequest=rpcRequest=>rpcRequest.rpcName===\"undoRowChange\";const isDeleteSelectedRowsRpcRequest=rpcRequest=>rpcRequest.rpcName===\"deleteSelectedRows\";const isCreateSessionTableRpcRequest=rpcRequest=>rpcRequest.rpcName===\"createSessionTable\";const simpleIdentity=(a,b)=>a===b;function partition(array,test,pass=[],fail=[]){for(let i=0,len=array.length;i<len;i++){(test(array[i],i)?pass:fail).push(array[i])}return[pass,fail]}function itemsChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return!currentItems.every(item=>newItems.includes(item))}else{return currentItems.some(currentItem=>newItems.findIndex(newItem=>newItem[identityProperty]===currentItem[identityProperty])===-1)}}function itemsOrOrderChanged(currentItems,newItems,identityProperty){if(currentItems.length!==newItems.length){return true}if(identityProperty===undefined){return currentItems.some((item,index)=>newItems[index]!==item)}else{return currentItems.some((currentItem,index)=>newItems[index][identityProperty]!==currentItem[identityProperty])}}const moveItemDeprecated=(items,item,moveTo)=>{const fromIndex=items.indexOf(item);if(fromIndex===moveTo){return items}const newItems=items.slice();if(fromIndex===-1){throw Error(\"moveItem, item to be moved not found\")}newItems.splice(fromIndex,1);if(moveTo===-1){newItems.push(item)}else{const offset=moveTo>fromIndex?0:0;newItems.splice(moveTo+offset,0,item)}return newItems};const moveItem=(items,fromIndex,toIndex)=>{if(fromIndex===toIndex){return items}else{const newItems=items.slice();const[item]=newItems.splice(fromIndex,1);if(toIndex===-1){return newItems.concat(item)}else{const offset=toIndex>fromIndex?0:0;newItems.splice(toIndex+offset,0,item);return newItems}}};const getAddedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(currentItems===undefined){return newItems}const isNew=item=>currentItems.every(currentItem=>compareItems(item,currentItem)===false);if(newItems.some(isNew)){return newItems.filter(isNew)}else{return[]}};const getRemovedItems=(currentItems,newItems,compareItems=simpleIdentity)=>{if(newItems===undefined){return currentItems}const isRemoved=item=>newItems.every(newItem=>compareItems(item,newItem)===false);if(currentItems.some(isRemoved)){return currentItems.filter(isRemoved)}else{return[]}};const containsSubsetOfItems=(allItems,comparedItems)=>{if(comparedItems.length>allItems.length)return false;const invalidItems=getAddedItems(allItems,comparedItems);return invalidItems.length===0};const getMissingItems=(sourceItems,items,identity)=>items.filter(i=>sourceItems.findIndex(s=>identity(s)===i)===-1);const reorderItems=(originalItems,orderedNames)=>{const orderedItems=[];let previousName=\"\";for(const name of orderedNames){if(previousName!==name){const item=originalItems.find(c=>c.name===name);if(item){orderedItems.push(item)}previousName=name}}return orderedItems};const hasRequestId=message=>{return\"requestId\"in message};const stripRequestId=({requestId,...rest})=>[requestId,rest];const getFirstAndLastRows=rows=>{let firstRow=rows.at(0);if(firstRow.updateType===\"SIZE\"){if(rows.length===1){return rows}else{firstRow=rows.at(1)}}const lastRow=rows.at(-1);return[firstRow,lastRow]};const insertRow=(rows,row)=>{const lastRow=rows.at(-1);if(lastRow===undefined||row.rowIndex>lastRow.rowIndex){rows.push(row)}else{for(let i=0;i<rows.length;i++){if(row.rowIndex<rows[i].rowIndex){rows.splice(i,0,row);return}else if(row.rowIndex===rows[i].rowIndex){if(row.ts<rows[i].ts){}else{rows[i]=row}return}}throw Error(\"don't expect to get this far\")}};const groupRowsByViewport=rows=>{const result={};for(const row of rows){const rowsForViewport=result[row.viewPortId]||(result[row.viewPortId]=[]);insertRow(rowsForViewport,row)}return result};const createSchemaFromTableMetadata=({columns,dataTypes,editableColumns=[],key,maxRangeEnd,maxRangeWidth,table})=>{return{table,columns:columns.map((col,idx)=>{if(editableColumns.includes(col)){return{editable:true,name:col,serverDataType:dataTypes[idx]}}return{name:col,serverDataType:dataTypes[idx]}}),key,rangeLimits:{maxRangeEnd,maxRangeWidth}}};const CHANGE_VP_SUCCESS=\"CHANGE_VP_SUCCESS\";const CHANGE_VP_RANGE_SUCCESS=\"CHANGE_VP_RANGE_SUCCESS\";const CLOSE_TREE_NODE=\"CLOSE_TREE_NODE\";const CLOSE_TREE_SUCCESS=\"CLOSE_TREE_SUCCESS\";const CLOSE_TREE_REJECT=\"CLOSE_TREE_REJECT\";const CREATE_VISUAL_LINK=\"CREATE_VISUAL_LINK\";const CREATE_VP=\"CREATE_VP\";const DISABLE_VP=\"DISABLE_VP\";const DISABLE_VP_SUCCESS=\"DISABLE_VP_SUCCESS\";const DISABLE_VP_REJECT=\"DISABLE_VP_REJECT\";const ENABLE_VP=\"ENABLE_VP\";const ENABLE_VP_SUCCESS=\"ENABLE_VP_SUCCESS\";const ENABLE_VP_REJECT=\"ENABLE_VP_REJECT\";const GET_TABLE_META=\"GET_TABLE_META\";const GET_VP_VISUAL_LINKS=\"GET_VP_VISUAL_LINKS\";const GET_VIEW_PORT_MENUS=\"GET_VIEW_PORT_MENUS\";const VIEW_PORT_MENUS_SELECT_RPC=\"VIEW_PORT_MENUS_SELECT_RPC\";const VIEW_PORT_MENU_CELL_RPC=\"VIEW_PORT_MENU_CELL_RPC\";const VIEW_PORT_MENU_TABLE_RPC=\"VIEW_PORT_MENU_TABLE_RPC\";const VIEW_PORT_MENU_ROW_RPC=\"VIEW_PORT_MENU_ROW_RPC\";const VIEW_PORT_MENU_RESP=\"VIEW_PORT_MENU_RESP\";const VIEW_PORT_MENU_REJ=\"VIEW_PORT_MENU_REJ\";const HB=\"HB\";const HB_RESP=\"HB_RESP\";const OPEN_TREE_NODE=\"OPEN_TREE_NODE\";const OPEN_TREE_SUCCESS=\"OPEN_TREE_SUCCESS\";const OPEN_TREE_REJECT=\"OPEN_TREE_REJECT\";const REMOVE_VP=\"REMOVE_VP\";const REMOVE_VP_REJECT=\"REMOVE_VP_REJECT\";const MENU_RPC_RESP=\"MENU_RPC_RESP\";const TABLE_ROW=\"TABLE_ROW\";const SIZE=\"SIZE\";const UPDATE=\"U\";function _check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function _class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function _class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function _class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function _class_private_field_get(receiver,privateMap){var descriptor=_class_extract_field_descriptor(receiver,privateMap,\"get\");return _class_apply_descriptor_get(receiver,descriptor)}function _class_private_field_init(obj,privateMap,value){_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function _class_private_field_set(receiver,privateMap,value){var descriptor=_class_extract_field_descriptor(receiver,privateMap,\"set\");_class_apply_descriptor_set(receiver,descriptor,value);return value}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}var _baseFrom=new WeakMap,_renderBufferSize=new WeakMap,_baseTo=new WeakMap;class RangeImpl{get reset(){return new RangeImpl(0,_class_private_field_get(this,_baseTo)-_class_private_field_get(this,_baseFrom),_class_private_field_get(this,_renderBufferSize))}get withBuffer(){return getFullRange(this,_class_private_field_get(this,_renderBufferSize))}equals(range){return range.from===_class_private_field_get(this,_baseFrom)&&range.to===_class_private_field_get(this,_baseTo)}toJson(){return{from:this.from,to:this.to,baseFrom:_class_private_field_get(this,_baseFrom),baseTo:_class_private_field_get(this,_baseTo),renderBufferSize:_class_private_field_get(this,_renderBufferSize)}}constructor(from,to,renderBufferSize=0){_define_property(this,\"from\",void 0);_define_property(this,\"to\",void 0);_class_private_field_init(this,_baseFrom,{writable:true,value:void 0});_class_private_field_init(this,_renderBufferSize,{writable:true,value:void 0});_class_private_field_init(this,_baseTo,{writable:true,value:void 0});this.from=from;this.to=to;_class_private_field_set(this,_renderBufferSize,0);_class_private_field_set(this,_baseFrom,from);_class_private_field_set(this,_baseTo,to);_class_private_field_set(this,_renderBufferSize,renderBufferSize)}}const Range=(from,to,renderBufferSize)=>new RangeImpl(from,to,renderBufferSize);const NULL_RANGE=Range(0,0);function getFullRange({from,to},bufferSize=0,maxRangeEnd=Number.MAX_SAFE_INTEGER){if(from===0&&to===0){return{from,to}}else if(bufferSize===0){if(maxRangeEnd<from){return{from:0,to:0}}else{return{from,to:Math.min(to,maxRangeEnd)}}}else if(from===0){return{from,to:Math.min(to+bufferSize,maxRangeEnd)}}else{const shortfallBefore=from-bufferSize<0;const shortfallAfter=maxRangeEnd-(to+bufferSize)<0;if(shortfallBefore&&shortfallAfter){return{from:0,to:maxRangeEnd}}else if(shortfallBefore){return{from:0,to:to+bufferSize}}else if(shortfallAfter){return{from:Math.max(0,from-bufferSize),to:maxRangeEnd}}else{return{from:from-bufferSize,to:to+bufferSize}}}}const withinRange=(value,{from,to})=>value>=from&&value<to;const rangeNewItems=({from:from1,to:to1},newRange)=>{const{from:from2,to:to2}=newRange;const noOverlap=from2>=to1||to2<=from1;const newFullySubsumesOld=from2<from1&&to2>to1;return noOverlap||newFullySubsumesOld?newRange:to2>to1?{from:to1,to:to2}:{from:from2,to:from1}};class WindowRange{isWithin(index){return withinRange(index,this)}overlap(from,to){return from>=this.to||to<this.from?[0,0]:[Math.max(from,this.from),Math.min(to,this.to)]}copy(){return new WindowRange(this.from,this.to)}constructor(from,to){_define_property(this,\"from\",void 0);_define_property(this,\"to\",void 0);this.from=from;this.to=to}}const constrainRangeWidth=(range,maxRangeWidth=Number.MAX_SAFE_INTEGER)=>{if(range.to-range.from<maxRangeWidth){return range}console.warn(`[range-utils] range ${range.from} - ${range.to} exceeds maxRangeWidth ${maxRangeWidth} for this table `);return{from:range.from,to:range.from+maxRangeWidth}};const constrainRange=(range,maxRangeEnd,maxRangeWidth)=>{if(maxRangeEnd>0&&maxRangeEnd<range.to){if(maxRangeEnd>range.from){return constrainRangeWidth({from:range.from,to:maxRangeEnd},maxRangeWidth)}else{throw Error(`constrainRange: cannot apply the maxRangeEnd ${maxRangeEnd} to range ${range.from} - ${range.to}`)}}else{return constrainRangeWidth(range,maxRangeWidth)}};function debug_utils_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:debug_utils_debug,debugEnabled:debug_utils_debugEnabled}=logger(\"range-monitor\");class RangeMonitor{isSet(){return this.timestamp!==0}set({from,to}){const{timestamp}=this;this.range.from=from;this.range.to=to;this.timestamp=performance.now();if(timestamp){debug_utils_debugEnabled&&debug_utils_debug(`<${this.source}> [${from}-${to}], ${(this.timestamp-timestamp).toFixed(0)} ms elapsed`)}else{return 0}}constructor(source){debug_utils_define_property(this,\"source\",void 0);debug_utils_define_property(this,\"range\",void 0);debug_utils_define_property(this,\"timestamp\",void 0);this.source=source;this.range={from:0,to:0};this.timestamp=0}};function keyset_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY=[];class KeySet{next(free=EMPTY){if(free.length>0){return free.shift()}else{return this.nextKeyValue++}}init({from,to}){this.keys.clear();this.freeKeys.length=0;this.nextKeyValue=0;for(let rowIndex=from;rowIndex<to;rowIndex++){const nextKeyValue=this.next();this.keys.set(rowIndex,nextKeyValue)}return true}reset({from,to}){this.range={from,to};const{freeKeys}=this;this.keys.forEach((keyValue,rowIndex)=>{if(rowIndex<from||rowIndex>=to){freeKeys.push(keyValue);this.keys.delete(rowIndex)}});let freeKeyIndex=0;for(let rowIndex=from;rowIndex<to;rowIndex++){if(!this.keys.has(rowIndex)){const nextKeyValue=freeKeyIndex<freeKeys.length?freeKeys[freeKeyIndex++]:this.nextKeyValue++;this.keys.set(rowIndex,nextKeyValue)}}if(freeKeyIndex>0){freeKeys.splice(0,freeKeyIndex)}return false}keyFor(rowIndex){const key=this.keys.get(rowIndex);if(key===undefined){console.log(`key not found\n keys: ${this.toDebugString()}\n `);throw Error(`KeySet, no key found for rowIndex ${rowIndex}`)}return key}toDebugString(){return`${this.keys.size} keys\n${Array.from(this.keys.entries()).sort(([key1],[key2])=>key1-key2).map(([k,v])=>`${k}=>${v}`).join(\",\")}]\n`}constructor(range){keyset_define_property(this,\"keys\",new Map);keyset_define_property(this,\"freeKeys\",[]);keyset_define_property(this,\"nextKeyValue\",0);keyset_define_property(this,\"range\",void 0);this.range={from:range.from,to:range.to};this.init(range)}};function array_backed_moving_window_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function array_backed_moving_window_class_private_field_get(receiver,privateMap){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,\"get\");return array_backed_moving_window_class_apply_descriptor_get(receiver,descriptor)}function array_backed_moving_window_class_private_field_init(obj,privateMap,value){array_backed_moving_window_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function array_backed_moving_window_class_private_field_set(receiver,privateMap,value){var descriptor=array_backed_moving_window_class_extract_field_descriptor(receiver,privateMap,\"set\");array_backed_moving_window_class_apply_descriptor_set(receiver,descriptor,value);return value}function array_backed_moving_window_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const EMPTY_ARRAY=[];const log=logger(\"array-backed-moving-window\");function dataIsUnchanged(newRow,existingRow){if(!existingRow){return false}if(existingRow.data.length!==newRow.data.length){return false}if(existingRow.sel!==newRow.sel){return false}for(let i=0;i<existingRow.data.length;i++){if(existingRow.data[i]!==newRow.data[i]){return false}}return true}var _range=new WeakMap;class ArrayBackedMovingWindow{get range(){return array_backed_moving_window_class_private_field_get(this,_range)}outOfRange(firstIndex,lastIndex){const{from,to}=this.range;if(lastIndex<from){return true}if(firstIndex>=to){return true}}setAtIndex(row){const{rowIndex:index}=row;const internalIndex=index-array_backed_moving_window_class_private_field_get(this,_range).from;if(dataIsUnchanged(row,this.internalData[internalIndex])){return false}const isWithinClientRange=this.isWithinClientRange(index);if(isWithinClientRange||this.isWithinRange(index)){if(!this.internalData[internalIndex]&&isWithinClientRange){this.rowsWithinRange+=1}this.internalData[internalIndex]=row}return isWithinClientRange}getAtIndex(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)&&this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]!=null?this.internalData[index-array_backed_moving_window_class_private_field_get(this,_range).from]:undefined}isWithinRange(index){return array_backed_moving_window_class_private_field_get(this,_range).isWithin(index)}isWithinClientRange(index){return this.clientRange.isWithin(index)}setClientRange(from,to){log.debug?.(`setClientRange ${from} - ${to}`);const currentFrom=this.clientRange.from;const currentTo=Math.min(this.clientRange.to,this.rowCount);if(from===currentFrom&&to===currentTo){this.clientRange.to=to;return[false,EMPTY_ARRAY]}const originalRange=this.clientRange.copy();this.clientRange.from=from;this.clientRange.to=to;this.rowsWithinRange=0;for(let i=from;i<to;i++){const internalIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[internalIndex]){this.rowsWithinRange+=1}}const clientRows=[];const offset=array_backed_moving_window_class_private_field_get(this,_range).from;for(let i=from;i<to;i++){if(i<originalRange.from||i>=originalRange.to){const row=this.internalData[i-offset];if(row){clientRows.push(row)}}}const serverDataRequired=this.bufferBreakout(from,to);return[serverDataRequired,clientRows]}setRange(from,to){if(from!==array_backed_moving_window_class_private_field_get(this,_range).from||to!==array_backed_moving_window_class_private_field_get(this,_range).to){log.debug?.(`setRange ${from} - ${to}`);const[overlapFrom,overlapTo]=array_backed_moving_window_class_private_field_get(this,_range).overlap(from,to);const newData=new Array(to-from);this.rowsWithinRange=0;for(let i=overlapFrom;i<overlapTo;i++){const row=this.getAtIndex(i);if(row){const index=i-from;newData[index]=row;if(this.isWithinClientRange(i)){this.rowsWithinRange+=1}}}this.internalData=newData;array_backed_moving_window_class_private_field_get(this,_range).from=from;array_backed_moving_window_class_private_field_get(this,_range).to=to}else{log.debug?.(`setRange ${from} - ${to} IGNORED because not changed`)}}get data(){return this.internalData}getData(){const{from,to}=array_backed_moving_window_class_private_field_get(this,_range);const{from:clientFrom,to:clientTo}=this.clientRange;const startOffset=Math.max(0,clientFrom-from);const endOffset=Math.min(to-from,to,clientTo-from,this.rowCount??to);return this.internalData.slice(startOffset,endOffset)}clear(){log.debug?.(\"clear\");this.internalData.length=0;this.rowsWithinRange=0;this.setRowCount(0)}getCurrentDataRange(){const rows=this.internalData;const len=rows.length;let[firstRow]=this.internalData;let lastRow=this.internalData[len-1];if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{for(let i=0;i<len;i++){if(rows[i]!==undefined){firstRow=rows[i];break}}for(let i=len-1;i>=0;i--){if(rows[i]!==undefined){lastRow=rows[i];break}}if(firstRow&&lastRow){return[firstRow.rowIndex,lastRow.rowIndex]}else{return[-1,-1]}}}constructor({from:clientFrom,to:clientTo},{from,to},bufferSize){array_backed_moving_window_class_private_field_init(this,_range,{writable:true,value:void 0});array_backed_moving_window_define_property(this,\"bufferSize\",void 0);array_backed_moving_window_define_property(this,\"internalData\",void 0);array_backed_moving_window_define_property(this,\"rowsWithinRange\",void 0);array_backed_moving_window_define_property(this,\"clientRange\",void 0);array_backed_moving_window_define_property(this,\"rowCount\",void 0);array_backed_moving_window_define_property(this,\"setRowCount\",rowCount=>{log.info?.(`setRowCount ${rowCount}`);const dataLength=Math.max(0,rowCount-array_backed_moving_window_class_private_field_get(this,_range).from);if(dataLength<this.internalData.length){this.internalData.length=dataLength}if(rowCount<this.rowCount){this.rowsWithinRange=0;const end=Math.min(rowCount,this.clientRange.to);for(let i=this.clientRange.from;i<end;i++){const rowIndex=i-array_backed_moving_window_class_private_field_get(this,_range).from;if(this.internalData[rowIndex]!==undefined){this.rowsWithinRange+=1}}}this.rowCount=rowCount});array_backed_moving_window_define_property(this,\"bufferBreakout\",(from,to)=>{const bufferPerimeter=this.bufferSize*.25;if(array_backed_moving_window_class_private_field_get(this,_range).to-to<bufferPerimeter){return true}else if(array_backed_moving_window_class_private_field_get(this,_range).from>0&&from-array_backed_moving_window_class_private_field_get(this,_range).from<bufferPerimeter){return true}else{return false}});this.bufferSize=bufferSize;this.clientRange=new WindowRange(clientFrom,clientTo);array_backed_moving_window_class_private_field_set(this,_range,new WindowRange(from,to));this.internalData=new Array(bufferSize);this.rowsWithinRange=0;this.rowCount=0}};function viewport_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function viewport_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function viewport_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function viewport_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function viewport_class_private_field_get(receiver,privateMap){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,\"get\");return viewport_class_apply_descriptor_get(receiver,descriptor)}function viewport_class_private_field_init(obj,privateMap,value){viewport_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function viewport_class_private_field_set(receiver,privateMap,value){var descriptor=viewport_class_extract_field_descriptor(receiver,privateMap,\"set\");viewport_class_apply_descriptor_set(receiver,descriptor,value);return value}function viewport_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const{debug:viewport_debug,debugEnabled:viewport_debugEnabled,error:viewport_error,info:viewport_info,infoEnabled:viewport_infoEnabled,warn:viewport_warn}=logger(\"Viewport\");const isLeafUpdate=({rowKey,updateType})=>updateType===\"U\"&&!rowKey.startsWith(\"$root\");const NO_DATA_UPDATE=[undefined,undefined];const NO_UPDATE_STATUS={count:0,mode:undefined,size:0,ts:0};var _status=new WeakMap,_clientRange=new WeakMap,_maxRangeEnd=new WeakMap;class Viewport{get hasUpdatesToProcess(){if(this.suspended){return false}return this.rowCountChanged||this.hasUpdates}get size(){return this.dataWindow.rowCount??0}get clientRange(){return viewport_class_private_field_get(this,_clientRange)}get status(){return viewport_class_private_field_get(this,_status)}set status(status){viewport_class_private_field_set(this,_status,status)}subscribe(){const{filter}=this.filter;this.status=viewport_class_private_field_get(this,_status)===\"subscribed\"?\"resubscribing\":\"subscribing\";return{type:CREATE_VP,table:this.table,range:getFullRange(viewport_class_private_field_get(this,_clientRange),this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter}}}handleSubscribed({viewPortId,aggregations,columns,filterSpec:filter,range,sort,groupBy,table},baseTableSchema){this.serverViewportId=viewPortId;this.status=\"subscribed\";this.aggregations=aggregations;this.columns=columns;this.groupBy=groupBy;this.isTree=groupBy&&groupBy.length>0;this.dataWindow.setRange(range.from,range.to);const tableSchema=table===baseTableSchema.table.table?baseTableSchema:{...baseTableSchema,table:{...baseTableSchema.table,session:table}};if(tableSchema.rangeLimits){viewport_class_private_field_set(this,_maxRangeEnd,tableSchema.rangeLimits?.maxRangeEnd)}return{aggregations,type:\"subscribed\",clientViewportId:this.clientViewportId,columns,filterSpec:filter,groupBy,range,sort,tableSchema}}awaitOperation(requestId,msg){this.pendingOperations.set(requestId,msg)}rejectOperation(requestId,_msg){const{pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to reject for requestId ${requestId}`);return}const{type}=pendingOperation;pendingOperations.delete(requestId);if(type===\"CHANGE_VP_RANGE\"){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.nacked=true;break}else{viewport_warn?.(\"range requests sent faster than they are being ACKed\")}}}}completeOperation(requestId,...params){const{clientViewportId,pendingOperations}=this;const pendingOperation=pendingOperations.get(requestId);if(!pendingOperation){viewport_error(`no matching operation found to complete for requestId ${requestId}`);return}const{type}=pendingOperation;viewport_info?.(`completeOperation ${type}`);pendingOperations.delete(requestId);if(type===\"CHANGE_VP_RANGE\"){const[from,to]=params;viewport_infoEnabled&&viewport_info(`completeOperation CHANGE_VP_RANGE\n window setRange (${from}:${to}) ${this.pendingRangeRequests.length} range requests pending`);this.dataWindow?.setRange(from,to);for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const pendingRangeRequest=this.pendingRangeRequests[i];if(pendingRangeRequest.requestId===requestId){pendingRangeRequest.acked=true;break}else{viewport_warn?.(\"range requests sent faster than they are being ACKed\")}}}else if(type===\"config\"){const{aggregations,columns,filterSpec:filter,groupBy,sort}=pendingOperation.data;this.aggregations=aggregations;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.sort=sort;if(groupBy.length>0){this.isTree=true}else if(this.isTree){this.isTree=false}viewport_debug?.(`config change confirmed, isTree : ${this.isTree}`);return{clientViewportId,type,config:pendingOperation.data}}else if(type===\"selection\"){}else if(type===\"disable\"){this.suspended=false;this.disabled=true;this.disabledActive=pendingOperation.disableActive;return{type:\"disabled\",clientViewportId}}else if(type===\"enable\"){this.disabled=false;this.disabledActive=false;return{type:\"enabled\",clientViewportId}}else if(type===\"freeze\"){this.frozen=true;return{type:\"frozen\",clientViewportId}}else if(type===\"unfreeze\"){this.frozen=false;return{type:\"unfrozen\",clientViewportId}}else if(type===\"CREATE_VISUAL_LINK\"){const[colName,parentViewportId,parentColName]=params;this.linkedParent={colName,parentViewportId,parentColName};this.pendingLinkedParent=undefined;return{requestId,type:\"vuu-link-created\",clientViewportId,colName,parentViewportId,parentColName}}else if(type===\"REMOVE_VISUAL_LINK\"){this.linkedParent=undefined;return{requestId,type:\"vuu-link-removed\",clientViewportId}}}rangeRequest(requestId,range){if(viewport_debugEnabled){this.rangeMonitor.set(range)}viewport_infoEnabled&&viewport_info(`(bufferSize ${this.bufferSize}) rangeRequest (${range.from}:${range.to}) current: window client (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), full (${this.dataWindow.range.from}:${this.dataWindow.range.to}) `);const type=\"CHANGE_VP_RANGE\";if(this.dataWindow){const[serverDataRequired,clientRows]=this.dataWindow.setClientRange(range.from,range.to);viewport_infoEnabled&&viewport_info(`updated: dataWindow clientRange (${this.dataWindow.clientRange.from}:${this.dataWindow.clientRange.to}), fullRange (${this.dataWindow.range.from}:${this.dataWindow.range.to}) serverDataRequired ${serverDataRequired?\"Y\":\"N\"} ${clientRows.length} rows returned from local buffer`);let debounceRequest;const maxRange=viewport_class_private_field_get(this,_maxRangeEnd);const serverRequest=serverDataRequired&&!this.rangeRequestAlreadyPending(range)?{type,viewPortId:this.serverViewportId,...getFullRange(range,this.bufferSize,maxRange)}:null;if(serverRequest){viewport_infoEnabled&&viewport_info(`create CHANGE_VP_RANGE: (${serverRequest.from} - ${serverRequest.to})`);viewport_debugEnabled&&viewport_debug?.(`create CHANGE_VP_RANGE: [${serverRequest.from} - ${serverRequest.to}]`);this.awaitOperation(requestId,{type});const pendingRequest=this.pendingRangeRequests.at(-1);if(pendingRequest){if(pendingRequest.acked){console.warn(\"Range Request before previous request is filled\")}else{const{from,to}=pendingRequest;if(this.dataWindow.outOfRange(from,to)){debounceRequest={clientViewportId:this.clientViewportId,type:\"debounce-begin\"}}else{viewport_warn?.(\"Range Request before previous request is acked\")}}}this.pendingRangeRequests.push({...serverRequest,requestId})}else if(clientRows.length>0){this.batchMode=false}this.keys.reset(this.dataWindow.clientRange);const toClient=this.isTree?toClientRowTree:toClientRow;if(clientRows.length){return[serverRequest,clientRows.map(row=>{return toClient(row,this.keys)})]}else if(debounceRequest){return[serverRequest,undefined,debounceRequest]}else{return[serverRequest]}}else{return[null]}}setLinks(links){this.links=links.filter(link=>link.parentVpId!==this.serverViewportId);return[{type:\"vuu-links\",links:this.links,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(menu){return{type:\"vuu-menu\",menu,clientViewportId:this.clientViewportId}}openTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);viewport_infoEnabled&&viewport_info(`treeKey ${treeKey}`);return{type:OPEN_TREE_NODE,vpId:this.serverViewportId,treeKey}}closeTreeNode(requestId,message){const treeKey=message.index===undefined?message.key:this.getKeyForRowAtIndex(message.index);return{type:CLOSE_TREE_NODE,vpId:this.serverViewportId,treeKey}}createLink(requestId,vuuCreateVisualLink){const message={...vuuCreateVisualLink,childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}removeLink(requestId){const message={type:\"REMOVE_VISUAL_LINK\",childVpId:this.serverViewportId};this.awaitOperation(requestId,message);return message}suspend(){this.suspended=true;this.pendingUpdates.length=0;viewport_info?.(\"suspend\")}resume(){this.suspended=false;if(viewport_debugEnabled){viewport_debug?.(`resume: ${this.currentData()}`)}return[this.size,this.currentData()]}currentData(){const out=[];if(this.dataWindow){const records=this.dataWindow.getData();const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;for(const row of records){if(row){out.push(toClient(row,keys))}}}return out}enable(requestId){this.awaitOperation(requestId,{type:\"enable\"});viewport_info?.(`enable: ${this.serverViewportId}`);return{type:ENABLE_VP,viewPortId:this.serverViewportId}}disable(requestId,disableActive=false){this.awaitOperation(requestId,{type:\"disable\",disableActive});viewport_info?.(`disable: ${this.serverViewportId}`);return{type:DISABLE_VP,viewPortId:this.serverViewportId}}freeze(requestId){this.awaitOperation(requestId,{type:\"freeze\"});viewport_info?.(`freeze: ${this.serverViewportId}`);return{type:\"FREEZE_VP\",viewPortId:this.serverViewportId}}unfreeze(requestId){this.awaitOperation(requestId,{type:\"unfreeze\"});viewport_info?.(`unfreeze: ${this.serverViewportId}`);this.frozen=false;return{type:\"UNFREEZE_VP\",viewPortId:this.serverViewportId}}setConfig(requestId,config){this.awaitOperation(requestId,{type:\"config\",data:config});const{filterSpec:filter,...remainingConfig}=config;viewport_debugEnabled?viewport_debug?.(`setConfig ${JSON.stringify(config)}`):viewport_info?.(`setConfig`);if(!this.isTree&&config.groupBy.length>0){this.dataWindow?.clear()}return this.createRequest({...remainingConfig,filterSpec:typeof filter?.filter===\"string\"?{filter:filter.filter}:{filter:\"\"}},true)}selectRequest(request){viewport_info?.(`selectRequest: ${request.type}`);if(this.serverViewportId){return{...request,vpId:this.serverViewportId}}else{throw Error(`[Viewport] cannot process ${request.type} before serverViewportId has been set`)}}removePendingRangeRequest(firstIndex,lastIndex){for(let i=this.pendingRangeRequests.length-1;i>=0;i--){const{from,to}=this.pendingRangeRequests[i];let isLast=true;if(firstIndex>=from&&firstIndex<to||lastIndex>from&&lastIndex<to){if(!isLast){console.warn(\"removePendingRangeRequest TABLE_ROWS are not for latest request\")}this.pendingRangeRequests.splice(i,1);break}else{isLast=false}}}clearCache(){this.dataWindow.setRowCount(0);this.postMessageToClient({clientViewportId:this.clientViewportId,type:\"viewport-clear\"})}updateRows(rows){const[firstRow,lastRow]=getFirstAndLastRows(rows);if(firstRow&&lastRow){this.removePendingRangeRequest(firstRow.rowIndex,lastRow.rowIndex)}if(rows.length===1){if(firstRow.vpSize===0&&this.disabled){viewport_debug?.(`ignore a SIZE=0 message on disabled viewport (${rows.length} rows)`);return}}for(const row of rows){if(this.isTree&&isLeafUpdate(row)){continue}else{if(row.updateType===\"SIZE\"||this.dataWindow?.rowCount!==row.vpSize){this.dataWindow?.setRowCount(row.vpSize);this.rowCountChanged=true}if(row.updateType===\"U\"){if(this.dataWindow?.setAtIndex(row)){if(this.suspended!==true){this.hasUpdates=true;if(!this.batchMode){this.pendingUpdates.push(row)}}}}}}}getKeyForRowAtIndex(rowIndex){const row=this.dataWindow.getAtIndex(rowIndex);return row?.rowKey}getClientRows(){let out=undefined;let mode=\"size-only\";if(!this.hasUpdates&&!this.rowCountChanged){return NO_DATA_UPDATE}if(this.hasUpdates){const{keys}=this;const toClient=this.isTree?toClientRowTree:toClientRow;if(this.updateThrottleTimer){self.clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}if(this.pendingUpdates.length>0){out=[];mode=\"update\";for(const row of this.pendingUpdates){out.push(toClient(row,keys))}}this.pendingUpdates.length=0;this.hasUpdates=false}if(this.throttleMessage(mode)){return NO_DATA_UPDATE}else{return[out,mode]}}createRequest(params,overWrite=false){if(overWrite){return{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,...params}}else{return{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...params}}}constructor({aggregations,bufferSize=50,columns,filterSpec:filter,groupBy=[],table,range,sort,title,viewport,visualLink},postMessageToClient){viewport_class_private_field_init(this,_status,{writable:true,value:\"\"});viewport_define_property(this,\"aggregations\",void 0);viewport_define_property(this,\"batchMode\",false);viewport_define_property(this,\"bufferSize\",void 0);viewport_class_private_field_init(this,_clientRange,{writable:true,value:void 0});viewport_define_property(this,\"columns\",void 0);viewport_define_property(this,\"dataWindow\",void 0);viewport_define_property(this,\"filter\",void 0);viewport_define_property(this,\"groupBy\",void 0);viewport_define_property(this,\"sort\",void 0);viewport_define_property(this,\"hasUpdates\",false);viewport_define_property(this,\"pendingUpdates\",[]);viewport_define_property(this,\"keys\",void 0);viewport_class_private_field_init(this,_maxRangeEnd,{writable:true,value:Number.MAX_SAFE_INTEGER});viewport_define_property(this,\"pendingLinkedParent\",void 0);viewport_define_property(this,\"pendingOperations\",new Map);viewport_define_property(this,\"pendingRangeRequests\",[]);viewport_define_property(this,\"postMessageToClient\",void 0);viewport_define_property(this,\"rowCountChanged\",false);viewport_define_property(this,\"lastUpdateStatus\",{...NO_UPDATE_STATUS});viewport_define_property(this,\"updateThrottleTimer\",undefined);viewport_define_property(this,\"rangeMonitor\",new RangeMonitor(\"ViewPort\"));viewport_define_property(this,\"clientViewportId\",void 0);viewport_define_property(this,\"disabled\",false);viewport_define_property(this,\"disabledActive\",false);viewport_define_property(this,\"frozen\",false);viewport_define_property(this,\"isTree\",false);viewport_define_property(this,\"links\",void 0);viewport_define_property(this,\"linkedParent\",void 0);viewport_define_property(this,\"serverViewportId\",void 0);viewport_define_property(this,\"suspended\",false);viewport_define_property(this,\"suspendTimer\",null);viewport_define_property(this,\"table\",void 0);viewport_define_property(this,\"title\",void 0);viewport_define_property(this,\"setLastSizeOnlyUpdateSize\",size=>{this.lastUpdateStatus.size=size});viewport_define_property(this,\"setLastUpdate\",mode=>{const{ts:lastTS,mode:lastMode}=this.lastUpdateStatus;let elapsedTime=0;if(lastMode===mode){const ts=Date.now();this.lastUpdateStatus.count+=1;this.lastUpdateStatus.ts=ts;elapsedTime=lastTS===0?0:ts-lastTS}else{this.lastUpdateStatus.count=1;this.lastUpdateStatus.ts=0;elapsedTime=0}this.lastUpdateStatus.mode=mode;return elapsedTime});viewport_define_property(this,\"rangeRequestAlreadyPending\",range=>{const{bufferSize}=this;const bufferThreshold=bufferSize*.25;let{from:stillPendingFrom}=range;for(const{from,to}of this.pendingRangeRequests){if(stillPendingFrom>=from&&stillPendingFrom<to){if(range.to+bufferThreshold<=to){return true}else{stillPendingFrom=to}}}return false});viewport_define_property(this,\"sendThrottledSizeMessage\",()=>{this.updateThrottleTimer=undefined;this.lastUpdateStatus.count=3;this.postMessageToClient({clientViewportId:this.clientViewportId,mode:\"size-only\",size:this.lastUpdateStatus.size,type:\"viewport-update\"})});viewport_define_property(this,\"shouldThrottleMessage\",mode=>{const elapsedTime=this.setLastUpdate(mode);return mode===\"size-only\"&&elapsedTime>0&&elapsedTime<500&&this.lastUpdateStatus.count>3});viewport_define_property(this,\"throttleMessage\",mode=>{if(this.shouldThrottleMessage(mode)){viewport_info?.(\"[Viewport] throttling updates setTimeout to 300\");this.setLastSizeOnlyUpdateSize(this.dataWindow.rowCount);if(this.updateThrottleTimer===undefined){this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,100)}return true}else if(this.updateThrottleTimer!==undefined){clearTimeout(this.updateThrottleTimer);this.updateThrottleTimer=undefined}return false});viewport_define_property(this,\"getNewRowCount\",()=>{if(this.rowCountChanged&&this.dataWindow){this.rowCountChanged=false;return this.dataWindow.rowCount}});this.aggregations=aggregations;this.bufferSize=bufferSize;viewport_class_private_field_set(this,_clientRange,range);this.clientViewportId=viewport;this.columns=columns;this.filter=filter;this.groupBy=groupBy;this.keys=new KeySet(range);this.pendingLinkedParent=visualLink;this.table=table;this.sort=sort;this.title=title;viewport_infoEnabled&&viewport_info?.(`${table.table} #${viewport}, bufferSize=${bufferSize}`);this.dataWindow=new ArrayBackedMovingWindow(viewport_class_private_field_get(this,_clientRange),range,this.bufferSize);this.postMessageToClient=postMessageToClient}}const viewport_isNew=false;const toClientRow=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{return[rowIndex,keys.keyFor(rowIndex),true,false,0,0,rowKey,isSelected,ts,viewport_isNew].concat(data)};const toClientRowTree=({rowIndex,rowKey,sel:isSelected,data,ts},keys)=>{const[depth,isExpanded,,isLeaf,,count,...rest]=data;return[rowIndex,keys.keyFor(rowIndex),isLeaf,isExpanded,depth,count,rowKey,isSelected,ts,viewport_isNew].concat(rest)};function event_emitter_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function event_emitter_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function event_emitter_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function event_emitter_class_private_field_get(receiver,privateMap){var descriptor=event_emitter_class_extract_field_descriptor(receiver,privateMap,\"get\");return event_emitter_class_apply_descriptor_get(receiver,descriptor)}function event_emitter_class_private_field_init(obj,privateMap,value){event_emitter_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function isArrayOfListeners(listeners){return Array.isArray(listeners)}function isOnlyListener(listeners){return!Array.isArray(listeners)}var _events=new WeakMap;class EventEmitter{addListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(!listeners){event_emitter_class_private_field_get(this,_events).set(event,listener)}else if(isArrayOfListeners(listeners)){listeners.push(listener)}else if(isOnlyListener(listeners)){event_emitter_class_private_field_get(this,_events).set(event,[listeners,listener])}}removeListener(event,listener){if(!event_emitter_class_private_field_get(this,_events).has(event)){return}const listenerOrListeners=event_emitter_class_private_field_get(this,_events).get(event);let position=-1;if(listenerOrListeners===listener){event_emitter_class_private_field_get(this,_events).delete(event)}else if(Array.isArray(listenerOrListeners)){for(let i=listenerOrListeners.length;i-- >0;){if(listenerOrListeners[i]===listener){position=i;break}}if(position<0){return}if(listenerOrListeners.length===1){listenerOrListeners.length=0;event_emitter_class_private_field_get(this,_events).delete(event)}else{listenerOrListeners.splice(position,1)}}}removeAllListeners(event){if(event&&event_emitter_class_private_field_get(this,_events).has(event)){event_emitter_class_private_field_get(this,_events).delete(event)}else if(event===undefined){event_emitter_class_private_field_get(this,_events).clear()}}emit(event,...args){if(event_emitter_class_private_field_get(this,_events)){const handler=event_emitter_class_private_field_get(this,_events).get(event);if(handler){this.invokeHandler(handler,args)}}}once(event,listener){const handler=(...args)=>{this.removeListener(event,handler);listener(...args)};this.on(event,handler)}on(event,listener){this.addListener(event,listener)}hasListener(event,listener){const listeners=event_emitter_class_private_field_get(this,_events).get(event);if(Array.isArray(listeners)){return listeners.includes(listener)}else{return listeners===listener}}invokeHandler(handler,args){if(isArrayOfListeners(handler)){handler.slice().forEach(listener=>this.invokeHandler(listener,args))}else{switch(args.length){case 0:handler();break;case 1:handler(args[0]);break;case 2:handler(args[0],args[1]);break;default:handler.call(null,...args)}}}constructor(){event_emitter_class_private_field_init(this,_events,{writable:true,value:new Map})}};function promise_utils_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function promise_utils_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function promise_utils_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function promise_utils_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function promise_utils_class_private_field_get(receiver,privateMap){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,\"get\");return promise_utils_class_apply_descriptor_get(receiver,descriptor)}function promise_utils_class_private_field_init(obj,privateMap,value){promise_utils_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function promise_utils_class_private_field_set(receiver,privateMap,value){var descriptor=promise_utils_class_extract_field_descriptor(receiver,privateMap,\"set\");promise_utils_class_apply_descriptor_set(receiver,descriptor,value);return value}var _promise=new WeakMap,_resolve=new WeakMap,_reject=new WeakMap,_resolved=new WeakMap;class DeferredPromise{get promise(){return promise_utils_class_private_field_get(this,_promise)}get isResolved(){return promise_utils_class_private_field_get(this,_resolved)}resolve(value){promise_utils_class_private_field_set(this,_resolved,true);return promise_utils_class_private_field_get(this,_resolve).call(this,value)}get reject(){return promise_utils_class_private_field_get(this,_reject)}constructor(){promise_utils_class_private_field_init(this,_promise,{writable:true,value:void 0});promise_utils_class_private_field_init(this,_resolve,{writable:true,value:()=>console.log(\"resolve was not set\")});promise_utils_class_private_field_init(this,_reject,{writable:true,value:()=>console.log(\"reject was not set\")});promise_utils_class_private_field_init(this,_resolved,{writable:true,value:false});promise_utils_class_private_field_set(this,_promise,new Promise((resolve,reject)=>{promise_utils_class_private_field_set(this,_resolve,resolve);promise_utils_class_private_field_set(this,_reject,reject)}))}};function WebSocketConnection_check_private_redeclaration(obj,privateCollection){if(privateCollection.has(obj)){throw new TypeError(\"Cannot initialize the same private elements twice on an object\")}}function WebSocketConnection_class_apply_descriptor_get(receiver,descriptor){if(descriptor.get)return descriptor.get.call(receiver);return descriptor.value}function WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value){if(descriptor.set)descriptor.set.call(receiver,value);else{if(!descriptor.writable){throw new TypeError(\"attempted to set read only private field\")}descriptor.value=value}}function WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,action){if(!privateMap.has(receiver))throw new TypeError(\"attempted to \"+action+\" private field on non-instance\");return privateMap.get(receiver)}function WebSocketConnection_class_private_field_get(receiver,privateMap){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,\"get\");return WebSocketConnection_class_apply_descriptor_get(receiver,descriptor)}function WebSocketConnection_class_private_field_init(obj,privateMap,value){WebSocketConnection_check_private_redeclaration(obj,privateMap);privateMap.set(obj,value)}function WebSocketConnection_class_private_field_set(receiver,privateMap,value){var descriptor=WebSocketConnection_class_extract_field_descriptor(receiver,privateMap,\"set\");WebSocketConnection_class_apply_descriptor_set(receiver,descriptor,value);return value}function WebSocketConnection_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}const isInvalidTokenReason=text=>text===\"Invalid token\"||text===\"Token has expired\";const isInvalidSessionReason=text=>text===\"Invalid session\"||text===\"User session limit exceeded\";const{debug:WebSocketConnection_debug,debugEnabled:WebSocketConnection_debugEnabled,info:WebSocketConnection_info}=logger(\"WebSocketConnection\");const isWebSocketConnectionStatus=msg=>typeof msg===\"string\"&&[\"connecting\",\"websocket-open\",\"connected\",\"reconnecting\",\"reconnected\",\"disconnected\",\"closed\",\"failed\"].includes(msg);const isConnected=status=>status===\"connected\"||status===\"reconnected\";const isLoginRejectedMessage=message=>message!==null&&\"type\"in message&&message.type===\"LOGIN_REJECTED\";const DEFAULT_CONNECTION_TIMEOUT=1e4;const parseWebSocketMessage=message=>{try{return JSON.parse(message)}catch(e){throw Error(`Error parsing JSON response from server ${message}`)}};var _callback=new WeakMap,_confirmedOpen=new WeakMap,_connectionPhase=new WeakMap,_connectionStatus=new WeakMap,_connectionTimeout=new WeakMap,_deferredOpen=new WeakMap,_protocols=new WeakMap,_url=new WeakMap,_ws=new WeakMap;class WebSocketConnection extends EventEmitter{get connectionTimeout(){return WebSocketConnection_class_private_field_get(this,_connectionTimeout)}get protocols(){return WebSocketConnection_class_private_field_get(this,_protocols)}get isClosed(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)===\"closed\"}get isDisconnected(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)===\"disconnected\"}get connectionPhase(){return WebSocketConnection_class_private_field_get(this,_connectionPhase)}get connectionStatus(){return WebSocketConnection_class_private_field_get(this,_connectionStatus)}set connectionStatus(connectionStatus){if(connectionStatus!==\"connecting\"&&connectionStatus!==\"reconnecting\"){WebSocketConnection_class_private_field_set(this,_connectionStatus,connectionStatus);this.emit(\"connection-status\",WebSocketConnection_class_private_field_get(this,_connectionStatus))}}get confirmedOpen(){return WebSocketConnection_class_private_field_get(this,_confirmedOpen)}set confirmedOpen(confirmedOpen){WebSocketConnection_class_private_field_set(this,_confirmedOpen,confirmedOpen);if(confirmedOpen&&WebSocketConnection_class_private_field_get(this,_connectionPhase)===\"initial-connection\"){WebSocketConnection_class_private_field_set(this,_connectionPhase,\"post-disconnect-reconnection\")}}get url(){return WebSocketConnection_class_private_field_get(this,_url)}async openWebSocket(){const initialConnect=WebSocketConnection_class_private_field_get(this,_connectionPhase)===\"initial-connection\";if(WebSocketConnection_class_private_field_get(this,_deferredOpen)===undefined){WebSocketConnection_class_private_field_set(this,_deferredOpen,new DeferredPromise)}const{connectionTimeout,protocols,url}=this;WebSocketConnection_class_private_field_set(this,_connectionStatus,initialConnect?\"connecting\":\"reconnecting\");const timer=setTimeout(()=>{throw Error(`Failed to open WebSocket connection to ${url}, timed out after ${connectionTimeout}ms`)},connectionTimeout);const ws=WebSocketConnection_class_private_field_set(this,_ws,new WebSocket(url,protocols));ws.onopen=()=>{this.connectionStatus=\"websocket-open\";clearTimeout(timer);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).resolve(undefined);WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}};ws.onerror=()=>{clearTimeout(timer)};ws.onclose=()=>{if(!this.isClosed){this.confirmedOpen=false;this.connectionStatus=\"disconnected\";this.close(\"failure\")}};ws.onmessage=evt=>{this.receive(evt)};return WebSocketConnection_class_private_field_get(this,_deferredOpen)?.promise}close(reason=\"shutdown\"){this.connectionStatus=\"closed\";if(reason===\"failure\"){if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){WebSocketConnection_class_private_field_get(this,_deferredOpen).reject(Error(\"connection failed\"));WebSocketConnection_class_private_field_set(this,_deferredOpen,undefined)}}else{WebSocketConnection_class_private_field_get(this,_ws)?.close()}WebSocketConnection_class_private_field_set(this,_ws,undefined)}constructor({callback,connectionTimeout=DEFAULT_CONNECTION_TIMEOUT,protocols,url}){super(),WebSocketConnection_class_private_field_init(this,_callback,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_confirmedOpen,{writable:true,value:false}),WebSocketConnection_class_private_field_init(this,_connectionPhase,{writable:true,value:\"initial-connection\"}),WebSocketConnection_class_private_field_init(this,_connectionStatus,{writable:true,value:\"closed\"}),WebSocketConnection_class_private_field_init(this,_connectionTimeout,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_deferredOpen,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_protocols,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_url,{writable:true,value:void 0}),WebSocketConnection_class_private_field_init(this,_ws,{writable:true,value:void 0}),WebSocketConnection_define_property(this,\"receive\",evt=>{if(isLoginErrorMessage(evt.data)){console.warn(`[WebSocketConnection] closed because of login issue`);if(WebSocketConnection_class_private_field_get(this,_deferredOpen)){console.warn(`... and we have a deferred connection`)}WebSocketConnection_class_private_field_get(this,_callback).call(this,{type:\"LOGIN_REJECTED\",reason:evt.data});this.close(evt.data)}else{const vuuMessageFromServer=parseWebSocketMessage(evt.data);if(WebSocketConnection_debugEnabled){if(vuuMessageFromServer.body.type!==\"HB\"){WebSocketConnection_debug(`<=== ${vuuMessageFromServer.body.type}`);if(vuuMessageFromServer.body.type===\"CHANGE_VP_SUCCESS\"){WebSocketConnection_debug(JSON.stringify(vuuMessageFromServer.body))}}}WebSocketConnection_class_private_field_get(this,_callback).call(this,vuuMessageFromServer);if(!this.confirmedOpen){if(vuuMessageFromServer.body.type===\"LOGIN_SUCCESS\"){this.connectionStatus=WebSocketConnection_class_private_field_get(this,_connectionPhase)===\"initial-connection\"?\"connected\":\"reconnected\";this.confirmedOpen=true}}}}),WebSocketConnection_define_property(this,\"send\",msg=>{if(msg.body.type===\"CHANGE_VP_RANGE\"){WebSocketConnection_info?.(`===> CHANGE_VP_RANGE<#${msg.requestId}> ${msg.body.from}-${msg.body.to}`)}WebSocketConnection_class_private_field_get(this,_ws)?.send(JSON.stringify(msg))});WebSocketConnection_class_private_field_set(this,_callback,callback);WebSocketConnection_class_private_field_set(this,_connectionTimeout,connectionTimeout);WebSocketConnection_class_private_field_set(this,_url,url);WebSocketConnection_class_private_field_set(this,_protocols,protocols)}};function server_proxy_define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}let _requestId=1;const TEST_setRequestId=id=>_requestId=id;const{debug:server_proxy_debug,debugEnabled:server_proxy_debugEnabled,error:server_proxy_error,info:server_proxy_info,infoEnabled:server_proxy_infoEnabled,warn:server_proxy_warn}=logger(\"ServerProxy\");const nextRequestId=()=>`${_requestId++}`;const DEFAULT_OPTIONS={};const isActiveViewport=viewPort=>viewPort.disabled!==true&&viewPort.suspended!==true;const addTitleToLinks=(links,serverViewportId,label)=>links.map(link=>link.parentVpId===serverViewportId?{...link,label}:link);function addLabelsToLinks(links,viewports){return links.map(linkDescriptor=>{const{parentVpId}=linkDescriptor;const viewport=viewports.get(parentVpId);if(viewport){return{...linkDescriptor,parentClientVpId:viewport.clientViewportId,label:viewport.title}}else{throw Error(\"addLabelsToLinks viewport not found\")}})}class ServerProxy{async login(authToken){if(authToken){this.authToken=authToken;return new Promise((resolve,reject)=>{this.sendMessageToServer({type:\"LOGIN\",token:this.authToken},\"\");this.pendingLogin={resolve,reject}})}else if(this.authToken===\"\"){server_proxy_error(\"login, cannot login until auth token has been obtained\")}}clearAllViewports(){this.viewports.forEach(viewport=>{viewport.clearCache()})}disconnect(){this.viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.unsubscribe(clientViewportId);this.postMessageToClient({clientViewportId,type:\"viewport-clear\"})})}async subscribe(message){if(!this.mapClientToServerViewport.has(message.viewport)){const pendingTableSchema=this.getTableMeta(message.table);const viewport=new Viewport(message,this.postMessageToClient);this.viewports.set(message.viewport,viewport);const pendingSubscription=this.awaitResponseToMessage(viewport.subscribe(),message.viewport);const[subscribeResponse,tableSchema]=await Promise.all([pendingSubscription,pendingTableSchema]);if(isErrorMessage(tableSchema)){this.postMessageToClient({clientViewportId:message.viewport,type:\"subscribe-failed\",msg:`failed to fetch schema for table ${message.table.table}: ${tableSchema.msg}`})}else if(isCreateVpSuccess(subscribeResponse)){const{viewPortId:serverViewportId}=subscribeResponse;const{status:previousViewportStatus}=viewport;if(message.viewport!==serverViewportId){this.viewports.delete(message.viewport);this.viewports.set(serverViewportId,viewport)}this.mapClientToServerViewport.set(message.viewport,serverViewportId);const clientResponse=viewport.handleSubscribed(subscribeResponse,tableSchema);if(clientResponse){this.postMessageToClient(clientResponse);if(server_proxy_debugEnabled){server_proxy_debug(`post DataSourceSubscribedMessage to client: ${JSON.stringify(clientResponse)}`)}}if(viewport.disabled){this.disableViewport(viewport)}if(this.queuedRequests.length>0){this.processQueuedRequests()}if(previousViewportStatus===\"subscribing\"&&!isSessionTable(viewport.table)){this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId:serverViewportId});this.sendMessageToServer({type:GET_VIEW_PORT_MENUS,vpId:serverViewportId});Array.from(this.viewports.entries()).filter(([id,{disabled,status}])=>id!==serverViewportId&&!disabled&&status===\"subscribed\").forEach(([vpId])=>{this.sendMessageToServer({type:GET_VP_VISUAL_LINKS,vpId})})}}else{this.postMessageToClient({clientViewportId:message.viewport,type:\"subscribe-failed\",msg:`failed to open subscription on table ${message.table.table}: ${subscribeResponse.msg}`})}}else{server_proxy_error(`spurious subscribe call ${message.viewport}`)}}addRequestToQueue(queuedRequest){const isDifferentTypeViewport=qr=>qr.clientViewportId!==queuedRequest.clientViewportId||queuedRequest.message.type!==qr.message.type;if(!this.queuedRequests.every(isDifferentTypeViewport)){this.queuedRequests=this.queuedRequests.filter(isDifferentTypeViewport)}this.queuedRequests.push(queuedRequest)}processQueuedRequests(){const newQueue=[];for(const queuedRequest of this.queuedRequests){const{clientViewportId,message,requestId}=queuedRequest;const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){this.sendMessageToServer({...message,viewPortId:serverViewportId},requestId)}else if(this.viewports.has(clientViewportId)){newQueue.push(queuedRequest)}else{console.warn(`ServerProxy processQueuedRequests, ${message.type} request not found ${clientViewportId}`)}}this.queuedRequests=newQueue}unsubscribe(clientViewportId){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){server_proxy_info?.(`Unsubscribe Message (Client to Server):\n ${serverViewportId}`);this.sendMessageToServer({type:REMOVE_VP,viewPortId:serverViewportId})}else{server_proxy_error(`failed to unsubscribe client viewport ${clientViewportId}, viewport not found`)}}getViewportForClient(clientViewportId,throws=true){const serverViewportId=this.mapClientToServerViewport.get(clientViewportId);if(serverViewportId){const viewport=this.viewports.get(serverViewportId);if(viewport){return viewport}else if(throws){throw Error(`Viewport not found for client viewport ${clientViewportId}`)}else{return null}}else if(this.viewports.has(clientViewportId)){return this.viewports.get(clientViewportId)}else if(throws){throw Error(`Viewport server id not found for client viewport ${clientViewportId}`)}else{return null}}setViewRange(viewport,message){const requestId=nextRequestId();server_proxy_infoEnabled&&server_proxy_info(`setViewRange (${message.range.from}:${message.range.to})`);const[serverRequest,rows,debounceRequest]=viewport.rangeRequest(requestId,message.range);if(viewport.status===\"subscribed\"){server_proxy_info?.(`setViewRange ${message.range.from} - ${message.range.to}`);if(serverRequest){if(true){server_proxy_info?.(`CHANGE_VP_RANGE (${message.range.from}-${message.range.to}) => (${serverRequest.from}-${serverRequest.to})`)}server_proxy_infoEnabled&&server_proxy_info(`setViewRange send CHANGE_VP_RANGE<#${requestId}> (${serverRequest.from}-${serverRequest.to})`);this.sendMessageToServer(serverRequest,requestId)}if(rows){server_proxy_info?.(`setViewRange ${rows.length} rows returned from cache`);this.postMessageToClient({mode:\"update\",type:\"viewport-update\",clientViewportId:viewport.clientViewportId,range:message.range,rows})}else if(debounceRequest){this.postMessageToClient(debounceRequest)}}else if(serverRequest){this.addRequestToQueue({clientViewportId:message.viewport,message:serverRequest,requestId})}}setConfig(viewport,message){const requestId=nextRequestId();const request=viewport.setConfig(requestId,message.config);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}setTitle(viewport,message){if(viewport){viewport.title=message.title;this.updateTitleOnVisualLinks(viewport)}}select(viewport,message){const[requestId,selectRequest]=stripRequestId(message);const request=viewport.selectRequest(selectRequest);this.sendMessageToServer(request,requestId)}disableAllActiveViewports(){console.log(`[ServerProxy] disableAllActiveViewports`);this.viewports.forEach(vp=>{if(isActiveViewport(vp)){this.disableViewport(vp,true)}})}enableAllActiveViewports(){this.viewports.forEach(vp=>{if(vp.disabledActive){this.enableViewport(vp)}})}disableViewport(viewport,disableActive=false){const requestId=nextRequestId();const request=viewport.disable(requestId,disableActive);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}enableViewport(viewport){if(viewport.disabled){const requestId=nextRequestId();const request=viewport.enable(requestId);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}}freezeViewport(viewport){const requestId=nextRequestId();const request=viewport.freeze(requestId);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}unfreezeViewport(viewport){if(viewport.frozen){const requestId=nextRequestId();const request=viewport.unfreeze(requestId);this.sendIfReady(request,requestId,viewport.status===\"subscribed\")}}suspendViewport(viewport,escalateToDisable=true,escalateDelay=3e3){viewport.suspend();if(escalateToDisable){viewport.suspendTimer=setTimeout(()=>{server_proxy_info?.(\"suspendTimer expired, escalate suspend to disable\");this.disableViewport(viewport)},escalateDelay)}}resumeViewport(viewport){if(viewport.suspendTimer){server_proxy_debug?.(\"clear suspend timer\");clearTimeout(viewport.suspendTimer);viewport.suspendTimer=null}const[size,rows]=viewport.resume();server_proxy_debug?.(`resumeViewport size ${size}, ${rows.length} rows sent to client`);this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:\"update\",rows,size,type:\"viewport-update\"})}openTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.openTreeNode(requestId,message),requestId,viewport.status===\"subscribed\")}}closeTreeNode(viewport,message){if(viewport.serverViewportId){const requestId=nextRequestId();this.sendIfReady(viewport.closeTreeNode(requestId,message),requestId,viewport.status===\"subscribed\")}}createLink(viewport,message){const[requestId,visualLinkRequest]=stripRequestId(message);const parentVpId=this.mapClientToServerViewport.get(message.parentVpId);if(parentVpId){const request=viewport.createLink(requestId,{...visualLinkRequest,parentVpId});this.sendMessageToServer(request,requestId)}else{throw Error(`createLink parent viewport not found ${message.parentVpId}`)}}removeLink(viewport,message){const{requestId}=message;const request=viewport.removeLink(requestId);this.sendMessageToServer(request,requestId)}updateTitleOnVisualLinks(viewport){const{serverViewportId,title}=viewport;for(const vp of this.viewports.values()){if(vp!==viewport&&vp.links&&serverViewportId&&title){if(vp.links?.some(link=>link.parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(addTitleToLinks(vp.links,serverViewportId,title));this.postMessageToClient(messageToClient)}}}}removeViewportFromVisualLinks(serverViewportId){for(const vp of this.viewports.values()){if(vp.links?.some(({parentVpId})=>parentVpId===serverViewportId)){const[messageToClient]=vp.setLinks(vp.links.filter(({parentVpId})=>parentVpId!==serverViewportId));this.postMessageToClient(messageToClient)}}}menuRpcCall(message){const viewport=this.getViewportForClient(message.vpId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,vpId:viewport.serverViewportId},requestId)}}rpcRequest(message){if(hasViewPortContext(message)){const viewport=this.getViewportForClient(message.context.viewPortId,false);if(viewport?.serverViewportId){const[requestId,rpcRequest]=stripRequestId(message);this.sendMessageToServer({...rpcRequest,context:{type:\"VIEWPORT_CONTEXT\",viewPortId:viewport.serverViewportId}},requestId)}}else{throw Error(`[ServerProxy] rpcRequest only supports VIEWPORT_CONTEXT at present`)}}handleMessageFromClient(message){if(isViewportMessage(message)||isVisualLinkMessage(message)){if(message.type===\"disable\"){const viewport=this.getViewportForClient(message.viewport,false);if(viewport!==null){return this.disableViewport(viewport)}else{return}}else{const viewport=isVisualLinkMessage(message)?this.getViewportForClient(message.childVpId):this.getViewportForClient(message.viewport);switch(message.type){case\"setViewRange\":return this.setViewRange(viewport,message);case\"config\":return this.setConfig(viewport,message);case\"suspend\":{const{escalateToDisable,escalateDelay}=message;return this.suspendViewport(viewport,escalateToDisable,escalateDelay)}case\"resume\":return this.resumeViewport(viewport);case\"enable\":return this.enableViewport(viewport);case\"FREEZE_VP\":return this.freezeViewport(viewport);case\"UNFREEZE_VP\":return this.unfreezeViewport(viewport);case\"openTreeNode\":return this.openTreeNode(viewport,message);case\"closeTreeNode\":return this.closeTreeNode(viewport,message);case\"CREATE_VISUAL_LINK\":return this.createLink(viewport,message);case\"REMOVE_VISUAL_LINK\":return this.removeLink(viewport,message);case\"setTitle\":return this.setTitle(viewport,message);default:}}}else if(isSelectRequest(message)){if(hasRequestId(message)){const viewport=this.getViewportForClient(message.vpId);return this.select(viewport,message)}else{console.warn(`selectRequest must have requestId`)}}else if(isRpcServiceRequest(message)){return this.rpcRequest(message)}else if(isVuuMenuRpcRequest(message)){return this.menuRpcCall(message)}else if(message.type===\"disconnect\"){return this.disconnect()}else if(message.type===\"disable-all-active\"){return this.disableAllActiveViewports()}else if(message.type===\"enable-all-active\"){return this.enableAllActiveViewports()}else{const{type,requestId}=message;switch(type){case\"GET_TABLE_LIST\":{this.tableList??(this.tableList=this.awaitResponseToMessage({type},requestId));this.tableList.then(response=>{this.postMessageToClient({type:\"TABLE_LIST_RESP\",tables:response.tables,requestId})});return}case\"GET_TABLE_META\":{this.getTableMeta(message.table,requestId).then(tableSchema=>{if(isErrorMessage(tableSchema)){}else if(tableSchema){this.postMessageToClient({type:\"TABLE_META_RESP\",tableSchema,requestId})}});return}default:}}server_proxy_error(`Vuu ServerProxy Unexpected message from client ${JSON.stringify(message)}`)}getTableMeta(table,requestId=nextRequestId()){if(isSessionTable(table)){return this.awaitResponseToMessage({type:\"GET_TABLE_META\",table},requestId).then(resp=>isErrorMessage(resp)?resp:createSchemaFromTableMetadata(resp))}const key=`${table.module}:${table.table}`;let tableMetaRequest=this.cachedTableMetaRequests.get(key);if(!tableMetaRequest){tableMetaRequest=this.awaitResponseToMessage({type:\"GET_TABLE_META\",table},requestId);this.cachedTableMetaRequests.set(key,tableMetaRequest)}return tableMetaRequest?.then(response=>{if(isErrorMessage(response)){return response}else{return this.cacheTableMeta(response)}})}awaitResponseToMessage(message,requestId=nextRequestId()){return new Promise((resolve,reject)=>{this.sendMessageToServer(message,requestId);this.pendingRequests.set(requestId,{reject,resolve})})}sendIfReady(message,requestId,isReady=true){if(isReady){this.sendMessageToServer(message,requestId)}return isReady}sendMessageToServer(body,requestId=`${_requestId++}`,options=DEFAULT_OPTIONS){const{module=\"CORE\"}=options;if(this.authToken){this.connection.send({requestId,sessionId:this.sessionId,module,body})}}handleMessageFromServer(message){if(isLoginRejectedMessage(message)){if(this.pendingLogin){this.pendingLogin.reject(message.reason);this.pendingLogin=undefined;this.authToken=\"\"}return}const{body,requestId,sessionId}=message;const pendingRequest=this.pendingRequests.get(requestId);if(pendingRequest){const{resolve}=pendingRequest;this.pendingRequests.delete(requestId);resolve(body);return}const{viewports}=this;switch(body.type){case\"HB\":this.sendMessageToServer({type:HB_RESP,ts:+new Date},\"NA\");break;case\"LOGIN_SUCCESS\":if(sessionId){this.sessionId=sessionId;this.pendingLogin?.resolve(sessionId);this.pendingLogin=undefined;this.postMessageToClient({...body,sessionId})}else{throw Error(\"LOGIN_SUCCESS did not provide sessionId\")}break;case\"REMOVE_VP_SUCCESS\":{const viewport=viewports.get(body.viewPortId);if(viewport){this.mapClientToServerViewport.delete(viewport.clientViewportId);viewports.delete(body.viewPortId);this.removeViewportFromVisualLinks(body.viewPortId)}}break;case\"SELECT_ALL_SUCCESS\":case\"SELECT_ROW_SUCCESS\":case\"SELECT_ROW_RANGE_SUCCESS\":case\"DESELECT_ROW_SUCCESS\":{const{type,selectedRowCount}=body;this.postMessageToClient({requestId,type,selectedRowCount});break}case\"DESELECT_ALL_SUCCESS\":{const{type}=body;this.postMessageToClient({requestId,type,selectedRowCount:0});break}case\"SELECT_ROW_REJECT\":case\"DESELECT_ROW_REJECT\":case\"SELECT_ROW_RANGE_REJECT\":case\"SELECT_ALL_REJECT\":case\"DESELECT_ALL_REJECT\":console.warn(`select error ${body.type} ${body.errorMsg}`);break;case CHANGE_VP_SUCCESS:case DISABLE_VP_SUCCESS:if(viewports.has(body.viewPortId)){const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response!==undefined){this.postMessageToClient(response);if(server_proxy_debugEnabled){server_proxy_debug(`postMessageToClient ${JSON.stringify(response)}`)}}}}break;case ENABLE_VP_SUCCESS:{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response);const[size,rows]=viewport.resume();this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode:\"update\",rows,size,type:\"viewport-update\"})}}}break;case\"FREEZE_VP_SUCCESS\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case\"UNFREEZE_VP_SUCCESS\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case\"TABLE_ROW\":{const viewportRowMap=groupRowsByViewport(body.rows);if(true&&server_proxy_debugEnabled){const[firstRow]=body.rows;if(body.rows.length===0){server_proxy_infoEnabled&&server_proxy_info(\"<=== TABLE_ROW 0 rows\")}else if(firstRow?.rowIndex===-1){if(body.rows.length===1){if(firstRow.updateType===\"SIZE\"){server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ONLY ${firstRow.vpSize}`)}else{server_proxy_infoEnabled&&server_proxy_info(`<=== [${firstRow.viewPortId}] TABLE_ROW SIZE ${firstRow.vpSize} rowIdx ${firstRow.rowIndex}`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows, SIZE ${firstRow.vpSize}, [${body.rows.map(r=>r.rowIndex).join(\",\")}]`)}}else{server_proxy_infoEnabled&&server_proxy_info(`<=== TABLE_ROW ${body.rows.length} rows [${body.rows.map(r=>r.rowIndex).join(\",\")}]`)}}for(const[viewportId,rows]of Object.entries(viewportRowMap)){const viewport=viewports.get(viewportId);if(viewport){viewport.updateRows(rows)}else{server_proxy_warn?.(`TABLE_ROW message received for non registered viewport ${viewportId}`)}}this.processUpdates()}break;case\"CHANGE_VP_RANGE_SUCCESS\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){const{from,to}=body;server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_SUCCESS<#${requestId}> ${from} - ${to}`);viewport.completeOperation(requestId,from,to)}}break;case\"CHANGE_VP_RANGE_REJECT\":{const viewport=this.viewports.get(body.viewPortId);if(viewport){server_proxy_infoEnabled&&server_proxy_info(`<=== CHANGE_VP_RANGE_REJECT<#${requestId}>`);viewport.rejectOperation(requestId,body.msg)}}break;case OPEN_TREE_SUCCESS:case CLOSE_TREE_SUCCESS:break;case\"CREATE_VISUAL_LINK_SUCCESS\":{const viewport=this.viewports.get(body.childVpId);const parentViewport=this.viewports.get(body.parentVpId);if(viewport&&parentViewport){const{childColumnName,parentColumnName}=body;const response=viewport.completeOperation(requestId,childColumnName,parentViewport.clientViewportId,parentColumnName);if(response){this.postMessageToClient(response)}}}break;case\"REMOVE_VISUAL_LINK_SUCCESS\":{const viewport=this.viewports.get(body.childVpId);if(viewport){const response=viewport.completeOperation(requestId);if(response){this.postMessageToClient(response)}}}break;case\"VP_VISUAL_LINKS_RESP\":{const activeLinkDescriptors=this.getActiveLinks(body.links);const viewport=this.viewports.get(body.vpId);if(activeLinkDescriptors.length&&viewport){const linkDescriptorsWithLabels=addLabelsToLinks(activeLinkDescriptors,this.viewports);const[clientMessage,pendingLink]=viewport.setLinks(linkDescriptorsWithLabels);this.postMessageToClient(clientMessage);if(pendingLink){const{link,parentClientVpId}=pendingLink;const requestId=nextRequestId();const parentVpId=this.mapClientToServerViewport.get(parentClientVpId);if(parentVpId){const message=viewport.createLink(requestId,{childVpId:body.vpId,childColumnName:link.fromColumn,parentColumnName:link.toColumn,parentVpId,type:\"CREATE_VISUAL_LINK\"});this.sendMessageToServer(message,requestId)}}}}break;case\"VIEW_PORT_MENUS_RESP\":if(body.menu?.name){const viewport=this.viewports.get(body.vpId);if(viewport){const clientMessage=viewport.setMenu(body.menu);this.postMessageToClient(clientMessage)}}break;case\"VIEW_PORT_MENU_REJ\":{const{error,rpcName,vpId}=body;const viewport=this.viewports.get(vpId);if(viewport){this.postMessageToClient({clientViewportId:viewport.clientViewportId,error,rpcName,type:\"VIEW_PORT_MENU_REJ\",requestId})}break}case\"VIEW_PORT_MENU_RESP\":{if(isSessionTableActionMessage(body)){const{action,rpcName}=body;this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:action.table}).then(response=>{const tableSchema=createSchemaFromTableMetadata(response);this.postMessageToClient({rpcName,type:\"VIEW_PORT_MENU_RESP\",action:{...action,tableSchema},tableAlreadyOpen:this.isTableOpen(action.table),requestId})})}else{const{action,rpcName}=body;this.postMessageToClient({action,rpcName,requestId,tableAlreadyOpen:isOpenDialogAction(action)&&this.isTableOpen(action.table),type:\"VIEW_PORT_MENU_RESP\"})}}break;case\"RPC_RESPONSE\":{const{action,error,result}=body;this.postMessageToClient({action,type:\"RPC_RESPONSE\",error,result,requestId})}break;case\"ERROR\":server_proxy_error(body.msg);break;default:server_proxy_infoEnabled&&server_proxy_info(`<=== ${body[\"type\"]}.`)}}cacheTableMeta(messageBody){const{module,table}=messageBody.table;const key=`${module}:${table}`;let tableSchema=this.cachedTableSchemas.get(key);if(!tableSchema){tableSchema=createSchemaFromTableMetadata(messageBody);this.cachedTableSchemas.set(key,tableSchema)}return tableSchema}isTableOpen(table){if(table){const tableName=table.table;for(const viewport of this.viewports.values()){if(!viewport.suspended&&viewport.table.table===tableName){return true}}}}getActiveLinks(linkDescriptors){return linkDescriptors.filter(linkDescriptor=>{const viewport=this.viewports.get(linkDescriptor.parentVpId);return viewport&&!viewport.suspended})}processUpdates(){this.viewports.forEach(viewport=>{if(viewport.hasUpdatesToProcess){const result=viewport.getClientRows();if(result!==NO_DATA_UPDATE){const[rows,mode]=result;const size=viewport.getNewRowCount();if(size!==undefined||rows&&rows.length>0){server_proxy_debugEnabled&&server_proxy_debug(`===> #${viewport.clientViewportId} viewport-update ${mode}, ${rows?.length??\"no\"} rows, size ${size}`);if(mode){this.postMessageToClient({clientViewportId:viewport.clientViewportId,mode,rows,size,type:\"viewport-update\"})}}}}})}constructor(connection,callback){server_proxy_define_property(this,\"connection\",void 0);server_proxy_define_property(this,\"postMessageToClient\",void 0);server_proxy_define_property(this,\"viewports\",void 0);server_proxy_define_property(this,\"mapClientToServerViewport\",void 0);server_proxy_define_property(this,\"authToken\",\"\");server_proxy_define_property(this,\"pendingLogin\",void 0);server_proxy_define_property(this,\"pendingRequests\",new Map);server_proxy_define_property(this,\"sessionId\",void 0);server_proxy_define_property(this,\"queuedRequests\",[]);server_proxy_define_property(this,\"cachedTableMetaRequests\",new Map);server_proxy_define_property(this,\"cachedTableSchemas\",new Map);server_proxy_define_property(this,\"tableList\",void 0);server_proxy_define_property(this,\"connectionStatusChanged\",status=>{if(status===\"disconnected\"){this.sessionId=undefined;this.clearAllViewports()}else if(status===\"reconnected\"){this.reconnect()}});server_proxy_define_property(this,\"reconnect\",async()=>{const[activeViewports,inactiveViewports]=partition(Array.from(this.viewports.values()),isActiveViewport);this.viewports.clear();this.mapClientToServerViewport.clear();const reconnectViewports=viewports=>{viewports.forEach(viewport=>{const{clientViewportId}=viewport;this.awaitResponseToMessage(viewport.subscribe(),clientViewportId).then(msg=>{if(msg.type===\"CREATE_VP_SUCCESS\"){this.mapClientToServerViewport.set(clientViewportId,msg.viewPortId);this.viewports.set(msg.viewPortId,viewport);viewport.status=\"subscribed\";viewport.serverViewportId=msg.viewPortId}else{}})})};reconnectViewports(activeViewports);setTimeout(()=>{reconnectViewports(inactiveViewports)},2e3)});this.connection=connection;this.postMessageToClient=callback;this.viewports=new Map;this.mapClientToServerViewport=new Map;connection.on(\"connection-status\",this.connectionStatusChanged)}};let serverProxy;let webSocketConnection;const{info:worker_info,infoEnabled:worker_infoEnabled}=logger(\"worker\");const sendMessageToClient=message=>{postMessage(message)};async function connectToServer(url,protocols,token){if(webSocketConnection===undefined&&serverProxy===undefined){webSocketConnection=new WebSocketConnection({callback:msg=>{if(isConnectionQualityMetrics(msg)){postMessage({type:\"connection-metrics\",messages:msg})}else{serverProxy.handleMessageFromServer(msg)}},protocols,url});webSocketConnection.on(\"connection-status\",postMessage);serverProxy=new ServerProxy(webSocketConnection,sendMessageToClient)}await webSocketConnection.openWebSocket();return serverProxy.login(token)}const handleMessageFromClient=async({data:message})=>{switch(message.type){case\"connect\":try{const sessionId=await connectToServer(message.url,message.protocol,message.token);postMessage({type:\"connected\",sessionId})}catch(err){postMessage({type:\"connection-failed\",reason:String(err)})}break;case\"disconnect\":serverProxy.disconnect();webSocketConnection?.close();break;case\"subscribe\":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.subscribe(message);break;case\"unsubscribe\":worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.unsubscribe(message.viewport);break;default:worker_infoEnabled&&worker_info(`===> ${JSON.stringify(message)}`);serverProxy.handleMessageFromClient(message)}};self.addEventListener(\"message\",handleMessageFromClient);postMessage({type:\"ready\"})})();";