@vuu-ui/vuu-data-remote 0.8.20 → 0.8.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/vuu-data-remote/src/authenticate.ts", "../../../packages/vuu-data-remote/src/connection-manager.ts", "../../../packages/vuu-data-remote/src/data-source.ts", "../../../packages/vuu-data-remote/src/server-proxy/messages.ts", "../../../packages/vuu-data-remote/src/inlined-worker.js", "../../../packages/vuu-data-remote/src/constants.ts", "../../../packages/vuu-data-remote/src/message-utils.ts", "../../../packages/vuu-data-remote/src/vuu-data-source.ts"],
4
- "sourcesContent": ["const defaultAuthUrl = \"api/authn\";\n\nexport const authenticate = async (\n username: string,\n password: string,\n authUrl = defaultAuthUrl\n): Promise<string | void> =>\n fetch(authUrl, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"access-control-allow-origin\": location.host,\n },\n body: JSON.stringify({ username, password }),\n }).then((response) => {\n if (response.ok) {\n const authToken = response.headers.get(\"vuu-auth-token\");\n if (typeof authToken === \"string\" && authToken.length > 0) {\n return authToken;\n } else {\n throw Error(`Authentication failed auth token not returned by server`);\n }\n } else {\n throw Error(\n `Authentication failed ${response.status} ${response.statusText}`\n );\n }\n });\n", "import {\n ConnectionStatusMessage,\n DataSourceCallbackMessage,\n ServerProxySubscribeMessage,\n TableSchema,\n VuuUIMessageIn,\n VuuUIMessageInRPC,\n VuuUIMessageInTableList,\n VuuUIMessageInTableMeta,\n VuuUIMessageOut,\n WebSocketProtocol,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerTableList,\n ClientToServerTableMeta,\n ClientToServerViewportRpcCall,\n VuuRpcRequest,\n VuuTable,\n VuuTableList,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n EventEmitter,\n getLoggingConfigForWorker,\n isConnectionQualityMetrics,\n isConnectionStatusMessage,\n isTableSchema,\n messageHasResult,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { shouldMessageBeRoutedToDataSource as messageShouldBeRoutedToDataSource } from \"./data-source\";\nimport * as Message from \"./server-proxy/messages\";\n\n// Note: inlined-worker is a generated file, it must be built\nimport { ConnectionQualityMetrics } from \"@vuu-ui/vuu-data-types\";\nimport { workerSourceCode } from \"./inlined-worker\";\n\nconst workerBlob = new Blob([getLoggingConfigForWorker() + workerSourceCode], {\n type: \"text/javascript\",\n});\nconst workerBlobUrl = URL.createObjectURL(workerBlob);\n\ntype WorkerResolver = {\n resolve: (value: Worker | PromiseLike<Worker>) => void;\n};\n\nlet worker: Worker;\nlet pendingWorker: Promise<Worker>;\nconst pendingWorkerNoToken: WorkerResolver[] = [];\n\nlet resolveServer: (server: ServerAPI) => void;\nlet rejectServer: (err: unknown) => void;\n\nconst serverAPI = new Promise<ServerAPI>((resolve, reject) => {\n resolveServer = resolve;\n rejectServer = reject;\n});\n\nexport const getServerAPI = () => serverAPI;\n\nexport type PostMessageToClientCallback = (\n msg: DataSourceCallbackMessage\n) => void;\n\nconst viewports = new Map<\n string,\n {\n postMessageToClientDataSource: PostMessageToClientCallback;\n request: ServerProxySubscribeMessage;\n status: \"subscribing\";\n }\n>();\nconst pendingRequests = new Map();\n\ntype WorkerOptions = {\n protocol: WebSocketProtocol;\n retryLimitDisconnect?: number;\n retryLimitStartup?: number;\n url: string;\n token?: string;\n username: string | undefined;\n handleConnectionStatusChange: (msg: {\n data: ConnectionStatusMessage;\n }) => void;\n};\n\n// We do not resolve the worker until we have a connection, but we will get\n// connection status messages before that, so we forward them to caller\n// while they wait for worker.\nconst getWorker = async ({\n handleConnectionStatusChange,\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n token = \"\",\n username,\n url,\n}: WorkerOptions) => {\n if (token === \"\" && pendingWorker === undefined) {\n return new Promise<Worker>((resolve) => {\n pendingWorkerNoToken.push({ resolve });\n });\n }\n //FIXME If we have a pending request already and a new request arrives with a DIFFERENT\n // token, this would cause us to ignore the new request and ultimately resolve it with\n // the original request.\n return (\n pendingWorker ||\n // we get this far when we receive the first request with auth token\n (pendingWorker = new Promise((resolve) => {\n const worker = new Worker(workerBlobUrl);\n\n const timer: number | null = window.setTimeout(() => {\n console.error(\"timed out waiting for worker to load\");\n }, 1000);\n\n // This is the inial message handler only, it processes messages whilst we are\n // establishing a connection. When we resolve the worker, a runtime message\n // handler will replace this (see below)\n worker.onmessage = (msg: MessageEvent<VuuUIMessageIn>) => {\n const { data: message } = msg;\n if (message.type === \"ready\") {\n window.clearTimeout(timer);\n worker.postMessage({\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n token,\n type: \"connect\",\n url,\n username,\n });\n } else if (message.type === \"connected\") {\n worker.onmessage = handleMessageFromWorker;\n resolve(worker);\n for (const pendingWorkerRequest of pendingWorkerNoToken) {\n pendingWorkerRequest.resolve(worker);\n }\n pendingWorkerNoToken.length = 0;\n } else if (isConnectionStatusMessage(message)) {\n handleConnectionStatusChange({ data: message });\n } else {\n console.warn(\"ConnectionManager: Unexpected message from the worker\");\n }\n };\n // TODO handle error\n }))\n );\n};\n\nfunction handleMessageFromWorker({\n data: message,\n}: MessageEvent<VuuUIMessageIn | DataSourceCallbackMessage>) {\n if (messageShouldBeRoutedToDataSource(message)) {\n const viewport = viewports.get(message.clientViewportId);\n if (viewport) {\n viewport.postMessageToClientDataSource(message);\n } else {\n console.error(\n `[ConnectionManager] ${message.type} message received, viewport not found`\n );\n }\n } else if (isConnectionStatusMessage(message)) {\n ConnectionManager.emit(\"connection-status\", message);\n } else if (isConnectionQualityMetrics(message)) {\n ConnectionManager.emit(\"connection-metrics\", message);\n } else {\n const requestId = (message as VuuUIMessageInRPC).requestId;\n if (pendingRequests.has(requestId)) {\n const { resolve } = pendingRequests.get(requestId);\n pendingRequests.delete(requestId);\n const {\n type: _1,\n requestId: _2,\n ...rest\n } = message as\n | VuuUIMessageInRPC\n | VuuUIMessageInTableList\n | VuuUIMessageInTableMeta;\n\n if (messageHasResult(message)) {\n resolve(message.result);\n } else if (\n message.type === \"VP_EDIT_RPC_RESPONSE\" ||\n message.type === \"VP_EDIT_RPC_REJECT\"\n ) {\n resolve(message);\n } else if (isTableSchema(message)) {\n resolve(message.tableSchema);\n } else {\n resolve(rest);\n }\n } else {\n console.warn(\n \"%cConnectionManager Unexpected message from the worker\",\n \"color:red;font-weight:bold;\"\n );\n }\n }\n}\n\nconst asyncRequest = <T = unknown>(\n msg:\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerTableList\n | ClientToServerTableMeta\n | ClientToServerViewportRpcCall\n): Promise<T> => {\n const requestId = uuid();\n worker.postMessage({\n requestId,\n ...msg,\n });\n return new Promise((resolve, reject) => {\n pendingRequests.set(requestId, { resolve, reject });\n });\n};\n\nexport interface ServerAPI {\n destroy: (viewportId?: string) => void;\n getTableSchema: (table: VuuTable) => Promise<TableSchema>;\n getTableList: () => Promise<VuuTableList>;\n rpcCall: <T = unknown>(\n msg: VuuRpcRequest | ClientToServerMenuRPC | ClientToServerViewportRpcCall\n ) => Promise<T>;\n send: (message: VuuUIMessageOut) => void;\n subscribe: (\n message: ServerProxySubscribeMessage,\n callback: PostMessageToClientCallback\n ) => void;\n unsubscribe: (viewport: string) => void;\n}\n\nconst connectedServerAPI: ServerAPI = {\n subscribe: (message, callback) => {\n if (viewports.get(message.viewport)) {\n throw Error(\n `ConnectionManager attempting to subscribe with an existing viewport id`\n );\n }\n // TODO we never use this status\n viewports.set(message.viewport, {\n status: \"subscribing\",\n request: message,\n postMessageToClientDataSource: callback,\n });\n worker.postMessage({ type: \"subscribe\", ...message });\n },\n\n unsubscribe: (viewport) => {\n worker.postMessage({ type: \"unsubscribe\", viewport });\n },\n\n send: (message) => {\n worker.postMessage(message);\n },\n\n destroy: (viewportId?: string) => {\n if (viewportId && viewports.has(viewportId)) {\n viewports.delete(viewportId);\n }\n },\n\n rpcCall: async <T = unknown>(\n message:\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerViewportRpcCall\n ) => asyncRequest<T>(message),\n\n getTableList: async () =>\n asyncRequest<VuuTableList>({ type: \"GET_TABLE_LIST\" }),\n\n getTableSchema: async (table) =>\n asyncRequest<TableSchema>({\n type: Message.GET_TABLE_META,\n table,\n }),\n};\n\nexport type ConnectionEvents = {\n \"connection-status\": (message: ConnectionStatusMessage) => void;\n \"connection-metrics\": (message: ConnectionQualityMetrics) => void;\n};\n\nexport type ConnectOptions = {\n url: string;\n authToken?: string;\n username?: string;\n protocol?: WebSocketProtocol;\n /** Max number of reconnect attempts in the event of unsuccessful websocket connection at startup */\n retryLimitStartup?: number;\n /** Max number of reconnect attempts in the event of a disconnected websocket connection */\n retryLimitDisconnect?: number;\n};\n\nclass _ConnectionManager extends EventEmitter<ConnectionEvents> {\n // The first request must have the token. We can change this to block others until\n // the request with token is received.\n async connect({\n url,\n authToken,\n username,\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n }: ConnectOptions): Promise<ServerAPI> {\n // By passing handleMessageFromWorker here, we can get connection status\n //messages while we wait for worker to resolve.\n worker = await getWorker({\n protocol,\n url,\n token: authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n handleConnectionStatusChange: handleMessageFromWorker,\n });\n return connectedServerAPI;\n }\n\n destroy() {\n worker.terminate();\n }\n}\n\nexport const ConnectionManager = new _ConnectionManager();\n\n/**\n * Open a connection to the VuuServer. This method opens the websocket connection\n * and logs in. It can be called from whichever client code has access to the auth\n * token (eg. the login page, or just a hardcoded login script in a sample).\n * This will unblock any DataSources which may have already tried to subscribe to data,\n * but lacked access to the auth token.\n *\n * @param serverUrl\n * @param token\n */\nexport const connectToServer = async ({\n url,\n protocol = undefined,\n authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n}: ConnectOptions) => {\n try {\n const serverAPI = await ConnectionManager.connect({\n protocol,\n url,\n authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n });\n resolveServer(serverAPI);\n } catch (err: unknown) {\n console.error(\"Connection Error\", err);\n rejectServer(err);\n }\n};\n\nexport const makeRpcCall = async <T = unknown>(rpcRequest: VuuRpcRequest) => {\n try {\n return (await serverAPI).rpcCall<T>(rpcRequest);\n } catch (err) {\n throw Error(\"Error accessing server api\");\n }\n};\n", "import {\n DataSourceCallbackMessage,\n DataSourceConfig,\n DataSourceConfigMessage,\n DataSourceDataSizeMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ServerToClientBody,\n ServerToClientMenuSessionTableAction,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nexport const isSizeOnly = (\n message: DataSourceCallbackMessage\n): message is DataSourceDataSizeMessage =>\n message.type === \"viewport-update\" && message.mode === \"size-only\";\n\nexport const toDataSourceConfig = (\n message: DataSourceConfigMessage\n): DataSourceConfig => {\n switch (message.type) {\n case \"aggregate\":\n return { aggregations: message.aggregations };\n case \"columns\":\n return { columns: message.columns };\n case \"filter\":\n return { filter: message.filter };\n case \"groupBy\":\n return { groupBy: message.groupBy };\n case \"sort\":\n return { sort: message.sort };\n case \"config\":\n return message.config;\n }\n};\n\nconst datasourceMessages = [\n \"config\",\n \"aggregate\",\n \"viewport-update\",\n \"columns\",\n \"debounce-begin\",\n \"disabled\",\n \"enabled\",\n \"filter\",\n \"groupBy\",\n \"vuu-link-created\",\n \"vuu-link-removed\",\n \"vuu-links\",\n \"vuu-menu\",\n \"sort\",\n \"subscribed\",\n];\n\nexport const shouldMessageBeRoutedToDataSource = (\n message: unknown\n): message is DataSourceCallbackMessage => {\n const type = (message as DataSourceCallbackMessage).type;\n return datasourceMessages.includes(type);\n};\n\nexport const isDataSourceConfigMessage = (\n message: DataSourceCallbackMessage\n): message is DataSourceConfigMessage =>\n [\"config\", \"aggregate\", \"columns\", \"filter\", \"groupBy\", \"sort\"].includes(\n message.type\n );\n\nexport const isSessionTableActionMessage = (\n messageBody: ServerToClientBody\n): messageBody is ServerToClientMenuSessionTableAction =>\n messageBody.type === \"VIEW_PORT_MENU_RESP\" &&\n messageBody.action !== null &&\n isSessionTable(messageBody.action.table);\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n", "export const CHANGE_VP_SUCCESS = \"CHANGE_VP_SUCCESS\";\nexport const CHANGE_VP_RANGE_SUCCESS = \"CHANGE_VP_RANGE_SUCCESS\";\nexport const CLOSE_TREE_NODE = \"CLOSE_TREE_NODE\";\nexport const CLOSE_TREE_SUCCESS = \"CLOSE_TREE_SUCCESS\";\nexport const CLOSE_TREE_REJECT = \"CLOSE_TREE_REJECT\";\nexport const CREATE_VISUAL_LINK = \"CREATE_VISUAL_LINK\";\nexport const CREATE_VP = \"CREATE_VP\";\nexport const DISABLE_VP = \"DISABLE_VP\";\nexport const DISABLE_VP_SUCCESS = \"DISABLE_VP_SUCCESS\";\nexport const DISABLE_VP_REJECT = \"DISABLE_VP_REJECT\";\nexport const ENABLE_VP = \"ENABLE_VP\";\nexport const ENABLE_VP_SUCCESS = \"ENABLE_VP_SUCCESS\";\nexport const ENABLE_VP_REJECT = \"ENABLE_VP_REJECT\";\nexport const GET_TABLE_META = \"GET_TABLE_META\";\nexport const GET_VP_VISUAL_LINKS = \"GET_VP_VISUAL_LINKS\";\nexport const GET_VIEW_PORT_MENUS = \"GET_VIEW_PORT_MENUS\";\nexport const VIEW_PORT_MENUS_SELECT_RPC = \"VIEW_PORT_MENUS_SELECT_RPC\";\nexport const VIEW_PORT_MENU_CELL_RPC = \"VIEW_PORT_MENU_CELL_RPC\";\nexport const VIEW_PORT_MENU_TABLE_RPC = \"VIEW_PORT_MENU_TABLE_RPC\";\nexport const VIEW_PORT_MENU_ROW_RPC = \"VIEW_PORT_MENU_ROW_RPC\";\nexport const VIEW_PORT_MENU_RESP = \"VIEW_PORT_MENU_RESP\";\nexport const VIEW_PORT_MENU_REJ = \"VIEW_PORT_MENU_REJ\";\nexport const HB = \"HB\";\nexport const HB_RESP = \"HB_RESP\";\nexport const LOGIN = \"LOGIN\";\nexport const OPEN_TREE_NODE = \"OPEN_TREE_NODE\";\nexport const OPEN_TREE_SUCCESS = \"OPEN_TREE_SUCCESS\";\nexport const OPEN_TREE_REJECT = \"OPEN_TREE_REJECT\";\nexport const REMOVE_VP = \"REMOVE_VP\";\nexport const REMOVE_VP_REJECT = \"REMOVE_VP_REJECT\";\nexport const RPC_CALL = \"RPC_CALL\";\nexport const RPC_RESP = \"RPC_RESP\";\nexport const MENU_RPC_RESP = \"MENU_RPC_RESP\";\nexport const SET_SELECTION = \"SET_SELECTION\";\nexport const SET_SELECTION_SUCCESS = \"SET_SELECTION_SUCCESS\";\n\nexport const TABLE_ROW = \"TABLE_ROW\";\nexport const SIZE = \"SIZE\";\nexport const UPDATE = \"U\";\n", "export const workerSourceCode = `\nvar ie=(r,e,t)=>{if(!e.has(r))throw TypeError(\"Cannot \"+t)};var m=(r,e,t)=>(ie(r,e,\"read from private field\"),t?t.call(r):e.get(r)),ae=(r,e,t)=>{if(e.has(r))throw TypeError(\"Cannot add the same private member more than once\");e instanceof WeakSet?e.add(r):e.set(r,t)},ue=(r,e,t,s)=>(ie(r,e,\"write to private field\"),s?s.call(r,t):e.set(r,t),t);function le(r,e,t=[],s=[]){for(let n=0,o=r.length;n<o;n++)(e(r[n],n)?t:s).push(r[n]);return[t,s]}var \\$={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:6,SELECTED:7,count:8,PARENT_IDX:\"parent_idx\",IDX_POINTER:\"idx_pointer\",FILTER_COUNT:\"filter_count\",NEXT_FILTER_IDX:\"next_filter_idx\"};var{DEPTH:Pt,IS_LEAF:Lt}=\\$;var ce=r=>{var e,t;if(((e=globalThis.document)==null?void 0:e.cookie)!==void 0)return(t=globalThis.document.cookie.split(\"; \").find(s=>s.startsWith(\\`\\${r}=\\`)))==null?void 0:t.split(\"=\")[1]};function G({from:r,to:e},t=0,s=Number.MAX_SAFE_INTEGER){if(t===0)return s<r?{from:0,to:0}:{from:r,to:Math.min(e,s)};if(r===0)return{from:r,to:Math.min(e+t,s)};{let n=e-r,o=Math.round(t/2),i=r-o<0,u=s-(e+o)<0;return i&&u?{from:0,to:s}:i?{from:0,to:n+t}:u?{from:Math.max(0,s-(n+t)),to:s}:{from:r-o,to:e+o}}}var je=(r,{from:e,to:t})=>r>=e&&r<t;var D=class r{constructor(e,t){this.from=e,this.to=t}isWithin(e){return je(e,this)}overlap(e,t){return e>=this.to||t<this.from?[0,0]:[Math.max(e,this.from),Math.min(t,this.to)]}copy(){return new r(this.from,this.to)}};var pe=r=>r.type===\"connection-status\",de=r=>r.type===\"connection-metrics\";var ge=r=>\"viewport\"in r;var Qe=[\"error\",\"warn\",\"info\",\"debug\"],Ye=r=>typeof r==\"string\"&&Qe.includes(r),Ze=\"error\",P=()=>{},Xe=\"error\",{loggingLevel:L=Xe}=et(),b=r=>{let e=L===\"debug\",t=e||L===\"info\",s=t||L===\"warn\",n=s||L===\"error\",o=t?p=>console.info(\\`[\\${r}] \\${p}\\`):P,i=s?p=>console.warn(\\`[\\${r}] \\${p}\\`):P,u=e?p=>console.debug(\\`[\\${r}] \\${p}\\`):P;return{errorEnabled:n,error:n?p=>console.error(\\`[\\${r}] \\${p}\\`):P}};function et(){return typeof loggingSettings<\"u\"?loggingSettings:{loggingLevel:tt()}}function tt(){let r=ce(\"vuu-logging-level\");return Ye(r)?r:Ze}var{debug:st,debugEnabled:nt}=b(\"range-monitor\"),k=class{constructor(e){this.source=e;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:e,to:t}){let{timestamp:s}=this;if(this.range.from=e,this.range.to=t,this.timestamp=performance.now(),s)nt&&st(\\`<\\${this.source}> [\\${e}-\\${t}], \\${(this.timestamp-s).toFixed(0)} ms elapsed\\`);else return 0}};var O=class{constructor(e){this.keys=new Map,this.free=[],this.nextKeyValue=0,this.reset(e)}next(){return this.free.length>0?this.free.pop():this.nextKeyValue++}reset({from:e,to:t}){this.keys.forEach((n,o)=>{(o<e||o>=t)&&(this.free.push(n),this.keys.delete(o))});let s=t-e;this.keys.size+this.free.length>s&&(this.free.length=Math.max(0,s-this.keys.size));for(let n=e;n<t;n++)if(!this.keys.has(n)){let o=this.next();this.keys.set(n,o)}this.nextKeyValue>this.keys.size&&(this.nextKeyValue=this.keys.size)}keyFor(e){let t=this.keys.get(e);if(t===void 0)throw console.log(\\`key not found\n keys: \\${this.toDebugString()}\n free : \\${this.free.join(\",\")} \n \\`),Error(\\`KeySet, no key found for rowIndex \\${e}\\`);return t}toDebugString(){return Array.from(this.keys.entries()).map((e,t)=>\\`\\${e}=>\\${t}\\`).join(\",\")}};var{SELECTED:\\$t}=\\$,w={False:0,True:1,First:2,Last:4};var rt=(r,e)=>e>=r[0]&&e<=r[1],ot=w.True+w.First+w.Last,it=w.True+w.First,at=w.True+w.Last,z=(r,e)=>{for(let t of r)if(typeof t==\"number\"){if(t===e)return ot}else if(rt(t,e))return e===t[0]?it:e===t[1]?at:w.True;return w.False};var he=r=>{if(r.every(t=>typeof t==\"number\"))return r;let e=[];for(let t of r)if(typeof t==\"number\")e.push(t);else for(let s=t[0];s<=t[1];s++)e.push(s);return e};var fe=r=>r.type===\"VIEW_PORT_MENU_RESP\"&&r.action!==null&&x(r.action.table),x=r=>r!==null&&typeof r==\"object\"&&\"table\"in r&&\"module\"in r?r.table.startsWith(\"session\"):!1;var ut=[\"VIEW_PORT_MENUS_SELECT_RPC\",\"VIEW_PORT_MENU_TABLE_RPC\",\"VIEW_PORT_MENU_ROW_RPC\",\"VIEW_PORT_MENU_CELL_RPC\",\"VP_EDIT_CELL_RPC\",\"VP_EDIT_ROW_RPC\",\"VP_EDIT_ADD_ROW_RPC\",\"VP_EDIT_DELETE_CELL_RPC\",\"VP_EDIT_DELETE_ROW_RPC\",\"VP_EDIT_SUBMIT_FORM_RPC\"],me=r=>ut.includes(r.type),Ce=r=>r.type===\"VIEW_PORT_RPC_CALL\",A=({requestId:r,...e})=>[r,e],Re=r=>{let e=r.at(0);if(e.updateType===\"SIZE\"){if(r.length===1)return r;e=r.at(1)}let t=r.at(-1);return[e,t]},Se=r=>{let e={};for(let t of r)(e[t.viewPortId]||(e[t.viewPortId]=[])).push(t);return e},H=({columns:r,dataTypes:e,key:t,table:s})=>({table:s,columns:r.map((n,o)=>({name:n,serverDataType:e[o]})),key:t});var Te=\"CHANGE_VP_SUCCESS\";var be=\"CLOSE_TREE_NODE\",Ee=\"CLOSE_TREE_SUCCESS\";var we=\"CREATE_VP\",Ve=\"DISABLE_VP\",ve=\"DISABLE_VP_SUCCESS\";var ye=\"ENABLE_VP\",Me=\"ENABLE_VP_SUCCESS\";var K=\"GET_VP_VISUAL_LINKS\",_e=\"GET_VIEW_PORT_MENUS\";var Ie=\"HB\",De=\"HB_RESP\",Pe=\"LOGIN\",Le=\"OPEN_TREE_NODE\",ke=\"OPEN_TREE_SUCCESS\";var Oe=\"REMOVE_VP\";var xe=\"SET_SELECTION_SUCCESS\";var Ne=r=>{switch(r){case\"TypeAheadRpcHandler\":return\"TYPEAHEAD\";default:return\"SIMUL\"}};var Ue=[],R=b(\"array-backed-moving-window\");function lt(r,e){if(!e||e.data.length!==r.data.length||e.sel!==r.sel)return!1;for(let t=0;t<e.data.length;t++)if(e.data[t]!==r.data[t])return!1;return!0}var h,N=class{constructor({from:e,to:t},{from:s,to:n},o){ae(this,h,void 0);this.setRowCount=e=>{var t;if((t=R.info)==null||t.call(R,\\`setRowCount \\${e}\\`),e<this.internalData.length&&(this.internalData.length=e),e<this.rowCount){this.rowsWithinRange=0;let s=Math.min(e,this.clientRange.to);for(let n=this.clientRange.from;n<s;n++){let o=n-m(this,h).from;this.internalData[o]!==void 0&&(this.rowsWithinRange+=1)}}this.rowCount=e};this.bufferBreakout=(e,t)=>{let s=this.bufferSize*.25;return m(this,h).to-t<s?!0:m(this,h).from>0&&e-m(this,h).from<s};this.bufferSize=o,this.clientRange=new D(e,t),ue(this,h,new D(s,n)),this.internalData=new Array(o),this.rowsWithinRange=0,this.rowCount=0}get range(){return m(this,h)}get hasAllRowsWithinRange(){return this.rowsWithinRange===this.clientRange.to-this.clientRange.from||this.rowCount>0&&this.clientRange.from+this.rowsWithinRange===this.rowCount}outOfRange(e,t){let{from:s,to:n}=this.range;if(t<s||e>=n)return!0}setAtIndex(e){let{rowIndex:t}=e,s=t-m(this,h).from;if(lt(e,this.internalData[s]))return!1;let n=this.isWithinClientRange(t);return(n||this.isWithinRange(t))&&(!this.internalData[s]&&n&&(this.rowsWithinRange+=1),this.internalData[s]=e),n}getAtIndex(e){return m(this,h).isWithin(e)&&this.internalData[e-m(this,h).from]!=null?this.internalData[e-m(this,h).from]:void 0}isWithinRange(e){return m(this,h).isWithin(e)}isWithinClientRange(e){return this.clientRange.isWithin(e)}setClientRange(e,t){var p;(p=R.debug)==null||p.call(R,\\`setClientRange \\${e} - \\${t}\\`);let s=this.clientRange.from,n=Math.min(this.clientRange.to,this.rowCount);if(e===s&&t===n)return[!1,Ue];let o=this.clientRange.copy();this.clientRange.from=e,this.clientRange.to=t,this.rowsWithinRange=0;for(let a=e;a<t;a++){let l=a-m(this,h).from;this.internalData[l]&&(this.rowsWithinRange+=1)}let i=Ue,u=m(this,h).from;if(this.hasAllRowsWithinRange)if(t>o.to){let a=Math.max(e,o.to);i=this.internalData.slice(a-u,t-u)}else{let a=Math.min(o.from,t);i=this.internalData.slice(e-u,a-u)}return[this.bufferBreakout(e,t),i]}setRange(e,t){var s,n;if(e!==m(this,h).from||t!==m(this,h).to){(s=R.debug)==null||s.call(R,\\`setRange \\${e} - \\${t}\\`);let[o,i]=m(this,h).overlap(e,t),u=new Array(t-e);this.rowsWithinRange=0;for(let c=o;c<i;c++){let p=this.getAtIndex(c);if(p){let a=c-e;u[a]=p,this.isWithinClientRange(c)&&(this.rowsWithinRange+=1)}}this.internalData=u,m(this,h).from=e,m(this,h).to=t}else(n=R.debug)==null||n.call(R,\\`setRange \\${e} - \\${t} IGNORED because not changed\\`)}get data(){return this.internalData}getData(){var u;let{from:e,to:t}=m(this,h),{from:s,to:n}=this.clientRange,o=Math.max(0,s-e),i=Math.min(t-e,t,n-e,(u=this.rowCount)!=null?u:t);return this.internalData.slice(o,i)}clear(){var e;(e=R.debug)==null||e.call(R,\"clear\"),this.internalData.length=0,this.rowsWithinRange=0,this.setRowCount(0)}getCurrentDataRange(){let e=this.internalData,t=e.length,[s]=this.internalData,n=this.internalData[t-1];if(s&&n)return[s.rowIndex,n.rowIndex];for(let o=0;o<t;o++)if(e[o]!==void 0){s=e[o];break}for(let o=t-1;o>=0;o--)if(e[o]!==void 0){n=e[o];break}return s&&n?[s.rowIndex,n.rowIndex]:[-1,-1]}};h=new WeakMap;var ct=[],{debug:f,debugEnabled:U,error:pt,info:d,infoEnabled:dt,warn:y}=b(\"viewport\"),gt=({rowKey:r,updateType:e})=>e===\"U\"&&!r.startsWith(\"\\$root\"),W=[void 0,void 0],ht={count:0,mode:void 0,size:0,ts:0},q=class{constructor({aggregations:e,bufferSize:t=50,columns:s,filter:n,groupBy:o=[],table:i,range:u,sort:c,title:p,viewport:a,visualLink:l},g){this.batchMode=!0;this.hasUpdates=!1;this.pendingUpdates=[];this.pendingOperations=new Map;this.pendingRangeRequests=[];this.rowCountChanged=!1;this.selectedRows=[];this.useBatchMode=!0;this.lastUpdateStatus=ht;this.updateThrottleTimer=void 0;this.rangeMonitor=new k(\"ViewPort\");this.disabled=!1;this.isTree=!1;this.status=\"\";this.suspended=!1;this.suspendTimer=null;this.setLastSizeOnlyUpdateSize=e=>{this.lastUpdateStatus.size=e};this.setLastUpdate=e=>{let{ts:t,mode:s}=this.lastUpdateStatus,n=0;if(s===e){let o=Date.now();this.lastUpdateStatus.count+=1,this.lastUpdateStatus.ts=o,n=t===0?0:o-t}else this.lastUpdateStatus.count=1,this.lastUpdateStatus.ts=0,n=0;return this.lastUpdateStatus.mode=e,n};this.rangeRequestAlreadyPending=e=>{let{bufferSize:t}=this,s=t*.25,{from:n}=e;for(let{from:o,to:i}of this.pendingRangeRequests)if(n>=o&&n<i){if(e.to+s<=i)return!0;n=i}return!1};this.sendThrottledSizeMessage=()=>{this.updateThrottleTimer=void 0,this.lastUpdateStatus.count=3,this.postMessageToClient({clientViewportId:this.clientViewportId,mode:\"size-only\",size:this.lastUpdateStatus.size,type:\"viewport-update\"})};this.shouldThrottleMessage=e=>{let t=this.setLastUpdate(e);return e===\"size-only\"&&t>0&&t<500&&this.lastUpdateStatus.count>3};this.throttleMessage=e=>this.shouldThrottleMessage(e)?(d==null||d(\"throttling updates setTimeout to 2000\"),this.updateThrottleTimer===void 0&&(this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,2e3)),!0):(this.updateThrottleTimer!==void 0&&(clearTimeout(this.updateThrottleTimer),this.updateThrottleTimer=void 0),!1);this.getNewRowCount=()=>{if(this.rowCountChanged&&this.dataWindow)return this.rowCountChanged=!1,this.dataWindow.rowCount};this.aggregations=e,this.bufferSize=t,this.clientRange=u,this.clientViewportId=a,this.columns=s,this.filter=n,this.groupBy=o,this.keys=new O(u),this.pendingLinkedParent=l,this.table=i,this.sort=c,this.title=p,dt&&(d==null||d(\\`constructor #\\${a} \\${i.table} bufferSize=\\${t}\\`)),this.dataWindow=new N(this.clientRange,u,this.bufferSize),this.postMessageToClient=g}get hasUpdatesToProcess(){return this.suspended?!1:this.rowCountChanged||this.hasUpdates}get size(){var e;return(e=this.dataWindow.rowCount)!=null?e:0}subscribe(){let{filter:e}=this.filter;return this.status=this.status===\"subscribed\"?\"resubscribing\":\"subscribing\",{type:we,table:this.table,range:G(this.clientRange,this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:e}}}handleSubscribed({viewPortId:e,aggregations:t,columns:s,filterSpec:n,range:o,sort:i,groupBy:u},c){return this.serverViewportId=e,this.status=\"subscribed\",this.aggregations=t,this.columns=s,this.groupBy=u,this.isTree=u&&u.length>0,this.dataWindow.setRange(o.from,o.to),{aggregations:t,type:\"subscribed\",clientViewportId:this.clientViewportId,columns:s,filter:n,groupBy:u,range:o,sort:i,tableSchema:c}}awaitOperation(e,t){this.pendingOperations.set(e,t)}completeOperation(e,...t){var u;let{clientViewportId:s,pendingOperations:n}=this,o=n.get(e);if(!o){pt(\\`no matching operation found to complete for requestId \\${e}\\`);return}let{type:i}=o;if(d==null||d(\\`completeOperation \\${i}\\`),n.delete(e),i===\"CHANGE_VP_RANGE\"){let[c,p]=t;(u=this.dataWindow)==null||u.setRange(c,p);for(let a=this.pendingRangeRequests.length-1;a>=0;a--){let l=this.pendingRangeRequests[a];if(l.requestId===e){l.acked=!0;break}else y==null||y(\"range requests sent faster than they are being ACKed\")}}else if(i===\"config\"){let{aggregations:c,columns:p,filter:a,groupBy:l,sort:g}=o.data;return this.aggregations=c,this.columns=p,this.filter=a,this.groupBy=l,this.sort=g,l.length>0?this.isTree=!0:this.isTree&&(this.isTree=!1),f==null||f(\\`config change confirmed, isTree : \\${this.isTree}\\`),{clientViewportId:s,type:i,config:o.data}}else{if(i===\"groupBy\")return this.isTree=o.data.length>0,this.groupBy=o.data,f==null||f(\\`groupBy change confirmed, isTree : \\${this.isTree}\\`),{clientViewportId:s,type:i,groupBy:o.data};if(i===\"columns\")return this.columns=o.data,{clientViewportId:s,type:i,columns:o.data};if(i===\"filter\")return this.filter=o.data,{clientViewportId:s,type:i,filter:o.data};if(i===\"aggregate\")return this.aggregations=o.data,{clientViewportId:s,type:\"aggregate\",aggregations:this.aggregations};if(i===\"sort\")return this.sort=o.data,{clientViewportId:s,type:i,sort:this.sort};if(i!==\"selection\"){if(i===\"disable\")return this.disabled=!0,{type:\"disabled\",clientViewportId:s};if(i===\"enable\")return this.disabled=!1,{type:\"enabled\",clientViewportId:s};if(i===\"CREATE_VISUAL_LINK\"){let[c,p,a]=t;return this.linkedParent={colName:c,parentViewportId:p,parentColName:a},this.pendingLinkedParent=void 0,{type:\"vuu-link-created\",clientViewportId:s,colName:c,parentViewportId:p,parentColName:a}}else if(i===\"REMOVE_VISUAL_LINK\")return this.linkedParent=void 0,{type:\"vuu-link-removed\",clientViewportId:s}}}}rangeRequest(e,t){U&&this.rangeMonitor.set(t);let s=\"CHANGE_VP_RANGE\";if(this.dataWindow){let[n,o]=this.dataWindow.setClientRange(t.from,t.to),i,u=this.dataWindow.rowCount||void 0,c=n&&!this.rangeRequestAlreadyPending(t)?{type:s,viewPortId:this.serverViewportId,...G(t,this.bufferSize,u)}:null;if(c){U&&(f==null||f(\\`create CHANGE_VP_RANGE: [\\${c.from} - \\${c.to}]\\`)),this.awaitOperation(e,{type:s});let a=this.pendingRangeRequests.at(-1);if(a)if(a.acked)console.warn(\"Range Request before previous request is filled\");else{let{from:l,to:g}=a;this.dataWindow.outOfRange(l,g)?i={clientViewportId:this.clientViewportId,type:\"debounce-begin\"}:y==null||y(\"Range Request before previous request is acked\")}this.pendingRangeRequests.push({...c,requestId:e}),this.useBatchMode&&(this.batchMode=!0)}else o.length>0&&(this.batchMode=!1);this.keys.reset(this.dataWindow.clientRange);let p=this.isTree?j:J;return o.length?[c,o.map(a=>p(a,this.keys,this.selectedRows))]:i?[c,void 0,i]:[c]}else return[null]}setLinks(e){return this.links=e,[{type:\"vuu-links\",links:e,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(e){return{type:\"vuu-menu\",menu:e,clientViewportId:this.clientViewportId}}openTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:Le,vpId:this.serverViewportId,treeKey:t.key}}closeTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:be,vpId:this.serverViewportId,treeKey:t.key}}createLink(e,t,s,n){let o={type:\"CREATE_VISUAL_LINK\",parentVpId:s,childVpId:this.serverViewportId,parentColumnName:n,childColumnName:t};return this.awaitOperation(e,o),this.useBatchMode&&(this.batchMode=!0),o}removeLink(e){let t={type:\"REMOVE_VISUAL_LINK\",childVpId:this.serverViewportId};return this.awaitOperation(e,t),t}suspend(){this.suspended=!0,d==null||d(\"suspend\")}resume(){return this.suspended=!1,U&&(f==null||f(\\`resume: \\${this.currentData()}\\`)),[this.size,this.currentData()]}currentData(){let e=[];if(this.dataWindow){let t=this.dataWindow.getData(),{keys:s}=this,n=this.isTree?j:J;for(let o of t)o&&e.push(n(o,s,this.selectedRows))}return e}enable(e){return this.awaitOperation(e,{type:\"enable\"}),d==null||d(\\`enable: \\${this.serverViewportId}\\`),{type:ye,viewPortId:this.serverViewportId}}disable(e){return this.awaitOperation(e,{type:\"disable\"}),d==null||d(\\`disable: \\${this.serverViewportId}\\`),this.suspended=!1,{type:Ve,viewPortId:this.serverViewportId}}columnRequest(e,t){return this.awaitOperation(e,{type:\"columns\",data:t}),f==null||f(\\`columnRequest: \\${t}\\`),this.createRequest({columns:t})}filterRequest(e,t){this.awaitOperation(e,{type:\"filter\",data:t}),this.useBatchMode&&(this.batchMode=!0);let{filter:s}=t;return d==null||d(\\`filterRequest: \\${s}\\`),this.createRequest({filterSpec:{filter:s}})}setConfig(e,t){this.awaitOperation(e,{type:\"config\",data:t});let{filter:s,...n}=t;return this.useBatchMode&&(this.batchMode=!0),U?f==null||f(\\`setConfig \\${JSON.stringify(t)}\\`):d==null||d(\"setConfig\"),this.createRequest({...n,filterSpec:typeof(s==null?void 0:s.filter)==\"string\"?{filter:s.filter}:{filter:\"\"}},!0)}aggregateRequest(e,t){return this.awaitOperation(e,{type:\"aggregate\",data:t}),d==null||d(\\`aggregateRequest: \\${t}\\`),this.createRequest({aggregations:t})}sortRequest(e,t){return this.awaitOperation(e,{type:\"sort\",data:t}),d==null||d(\\`sortRequest: \\${JSON.stringify(t.sortDefs)}\\`),this.createRequest({sort:t})}groupByRequest(e,t=ct){var s;return this.awaitOperation(e,{type:\"groupBy\",data:t}),this.useBatchMode&&(this.batchMode=!0),this.isTree||(s=this.dataWindow)==null||s.clear(),this.createRequest({groupBy:t})}selectRequest(e,t){return this.selectedRows=t,this.awaitOperation(e,{type:\"selection\",data:t}),d==null||d(\\`selectRequest: \\${t}\\`),{type:\"SET_SELECTION\",vpId:this.serverViewportId,selection:he(t)}}removePendingRangeRequest(e,t){for(let s=this.pendingRangeRequests.length-1;s>=0;s--){let{from:n,to:o}=this.pendingRangeRequests[s],i=!0;if(e>=n&&e<o||t>n&&t<o){i||console.warn(\"removePendingRangeRequest TABLE_ROWS are not for latest request\"),this.pendingRangeRequests.splice(s,1);break}else i=!1}}updateRows(e){var n,o,i;let[t,s]=Re(e);if(t&&s&&this.removePendingRangeRequest(t.rowIndex,s.rowIndex),e.length===1)if(t.vpSize===0&&this.disabled){f==null||f(\\`ignore a SIZE=0 message on disabled viewport (\\${e.length} rows)\\`);return}else t.updateType===\"SIZE\"&&this.setLastSizeOnlyUpdateSize(t.vpSize);for(let u of e)this.isTree&&gt(u)||((u.updateType===\"SIZE\"||((n=this.dataWindow)==null?void 0:n.rowCount)!==u.vpSize)&&((o=this.dataWindow)==null||o.setRowCount(u.vpSize),this.rowCountChanged=!0),u.updateType===\"U\"&&(i=this.dataWindow)!=null&&i.setAtIndex(u)&&(this.hasUpdates=!0,this.batchMode||this.pendingUpdates.push(u)))}getClientRows(){let e,t=\"size-only\";if(!this.hasUpdates&&!this.rowCountChanged)return W;if(this.hasUpdates){let{keys:s,selectedRows:n}=this,o=this.isTree?j:J;if(this.updateThrottleTimer&&(self.clearTimeout(this.updateThrottleTimer),this.updateThrottleTimer=void 0),this.pendingUpdates.length>0){e=[],t=\"update\";for(let i of this.pendingUpdates)e.push(o(i,s,n));this.pendingUpdates.length=0}else{let i=this.dataWindow.getData();if(this.dataWindow.hasAllRowsWithinRange){e=[],t=\"batch\";for(let u of i)e.push(o(u,s,n));this.batchMode=!1}}this.hasUpdates=!1}return this.throttleMessage(t)?W:[e,t]}createRequest(e,t=!1){return t?{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,...e}:{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...e}}},J=({rowIndex:r,rowKey:e,sel:t,data:s},n,o)=>[r,n.keyFor(r),!0,!1,0,0,e,t?z(o,r):0].concat(s),j=({rowIndex:r,rowKey:e,sel:t,data:s},n,o)=>{let[i,u,,c,,p,...a]=s;return[r,n.keyFor(r),c,u,i,p,e,t?z(o,r):0].concat(a)};var We=1;var{debug:V,debugEnabled:Q,error:M,info:T,infoEnabled:ft,warn:Y}=b(\"server-proxy\"),C=()=>\\`\\${We++}\\`,mt={},Ct=r=>r.disabled!==!0&&r.suspended!==!0,Rt={type:\"NO_ACTION\"},St=(r,e,t)=>r.map(s=>s.parentVpId===e?{...s,label:t}:s);function Tt(r,e){return r.map(t=>{let{parentVpId:s}=t,n=e.get(s);if(n)return{...t,parentClientVpId:n.clientViewportId,label:n.title};throw Error(\"addLabelsToLinks viewport not found\")})}var F=class{constructor(e,t){this.authToken=\"\";this.user=\"user\";this.pendingRequests=new Map;this.queuedRequests=[];this.cachedTableMetaRequests=new Map;this.cachedTableSchemas=new Map;this.connection=e,this.postMessageToClient=t,this.viewports=new Map,this.mapClientToServerViewport=new Map}async reconnect(){await this.login(this.authToken);let[e,t]=le(Array.from(this.viewports.values()),Ct);this.viewports.clear(),this.mapClientToServerViewport.clear();let s=n=>{n.forEach(o=>{let{clientViewportId:i}=o;this.viewports.set(i,o),this.sendMessageToServer(o.subscribe(),i)})};s(e),setTimeout(()=>{s(t)},2e3)}async login(e,t=\"user\"){if(e)return this.authToken=e,this.user=t,new Promise((s,n)=>{this.sendMessageToServer({type:Pe,token:this.authToken,user:t},\"\"),this.pendingLogin={resolve:s,reject:n}});this.authToken===\"\"&&M(\"login, cannot login until auth token has been obtained\")}subscribe(e){if(this.mapClientToServerViewport.has(e.viewport))M(\\`spurious subscribe call \\${e.viewport}\\`);else{let t=this.getTableMeta(e.table),s=new q(e,this.postMessageToClient);this.viewports.set(e.viewport,s);let n=this.awaitResponseToMessage(s.subscribe(),e.viewport);Promise.all([n,t]).then(([i,u])=>{let{viewPortId:c}=i,{status:p}=s;e.viewport!==c&&(this.viewports.delete(e.viewport),this.viewports.set(c,s)),this.mapClientToServerViewport.set(e.viewport,c);let a=s.handleSubscribed(i,u);a&&(this.postMessageToClient(a),Q&&V(\\`post DataSourceSubscribedMessage to client: \\${JSON.stringify(a)}\\`)),s.disabled&&this.disableViewport(s),this.queuedRequests.length>0&&this.processQueuedRequests(),p===\"subscribing\"&&!x(s.table)&&(this.sendMessageToServer({type:K,vpId:c}),this.sendMessageToServer({type:_e,vpId:c}),Array.from(this.viewports.entries()).filter(([l,{disabled:g}])=>l!==c&&!g).forEach(([l])=>{this.sendMessageToServer({type:K,vpId:l})}))})}}processQueuedRequests(){let e={};for(;this.queuedRequests.length;){let t=this.queuedRequests.pop();if(t){let{clientViewportId:s,message:n,requestId:o}=t;if(n.type===\"CHANGE_VP_RANGE\"){if(e.CHANGE_VP_RANGE)continue;e.CHANGE_VP_RANGE=!0;let i=this.mapClientToServerViewport.get(s);i&&this.sendMessageToServer({...n,viewPortId:i},o)}}}}unsubscribe(e){let t=this.mapClientToServerViewport.get(e);t?(T==null||T(\\`Unsubscribe Message (Client to Server):\n \\${t}\\`),this.sendMessageToServer({type:Oe,viewPortId:t})):M(\\`failed to unsubscribe client viewport \\${e}, viewport not found\\`)}getViewportForClient(e,t=!0){let s=this.mapClientToServerViewport.get(e);if(s){let n=this.viewports.get(s);if(n)return n;if(t)throw Error(\\`Viewport not found for client viewport \\${e}\\`);return null}else{if(this.viewports.has(e))return this.viewports.get(e);if(t)throw Error(\\`Viewport server id not found for client viewport \\${e}\\`);return null}}setViewRange(e,t){let s=C(),[n,o,i]=e.rangeRequest(s,t.range);T==null||T(\\`setViewRange \\${t.range.from} - \\${t.range.to}\\`),n&&(this.sendIfReady(n,s,e.status===\"subscribed\")||this.queuedRequests.push({clientViewportId:t.viewport,message:n,requestId:s})),o?(T==null||T(\\`setViewRange \\${o.length} rows returned from cache\\`),this.postMessageToClient({mode:\"batch\",type:\"viewport-update\",clientViewportId:e.clientViewportId,rows:o})):i&&this.postMessageToClient(i)}setConfig(e,t){let s=C(),n=e.setConfig(s,t.config);this.sendIfReady(n,s,e.status===\"subscribed\")}aggregate(e,t){let s=C(),n=e.aggregateRequest(s,t.aggregations);this.sendIfReady(n,s,e.status===\"subscribed\")}sort(e,t){let s=C(),n=e.sortRequest(s,t.sort);this.sendIfReady(n,s,e.status===\"subscribed\")}groupBy(e,t){let s=C(),n=e.groupByRequest(s,t.groupBy);this.sendIfReady(n,s,e.status===\"subscribed\")}filter(e,t){let s=C(),{filter:n}=t,o=e.filterRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}setColumns(e,t){let s=C(),{columns:n}=t,o=e.columnRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}setTitle(e,t){e&&(e.title=t.title,this.updateTitleOnVisualLinks(e))}select(e,t){let s=C(),{selected:n}=t,o=e.selectRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}disableViewport(e){let t=C(),s=e.disable(t);this.sendIfReady(s,t,e.status===\"subscribed\")}enableViewport(e){if(e.disabled){let t=C(),s=e.enable(t);this.sendIfReady(s,t,e.status===\"subscribed\")}}suspendViewport(e){e.suspend(),e.suspendTimer=setTimeout(()=>{T==null||T(\"suspendTimer expired, escalate suspend to disable\"),this.disableViewport(e)},3e3)}resumeViewport(e){e.suspendTimer&&(V==null||V(\"clear suspend timer\"),clearTimeout(e.suspendTimer),e.suspendTimer=null);let[t,s]=e.resume();V==null||V(\\`resumeViewport size \\${t}, \\${s.length} rows sent to client\\`),this.postMessageToClient({clientViewportId:e.clientViewportId,mode:\"batch\",rows:s,size:t,type:\"viewport-update\"})}openTreeNode(e,t){if(e.serverViewportId){let s=C();this.sendIfReady(e.openTreeNode(s,t),s,e.status===\"subscribed\")}}closeTreeNode(e,t){if(e.serverViewportId){let s=C();this.sendIfReady(e.closeTreeNode(s,t),s,e.status===\"subscribed\")}}createLink(e,t){let{parentClientVpId:s,parentColumnName:n,childColumnName:o}=t,i=C(),u=this.mapClientToServerViewport.get(s);if(u){let c=e.createLink(i,o,u,n);this.sendMessageToServer(c,i)}else M(\"ServerProxy unable to create link, viewport not found\")}removeLink(e){let t=C(),s=e.removeLink(t);this.sendMessageToServer(s,t)}updateTitleOnVisualLinks(e){var n;let{serverViewportId:t,title:s}=e;for(let o of this.viewports.values())if(o!==e&&o.links&&t&&s&&(n=o.links)!=null&&n.some(i=>i.parentVpId===t)){let[i]=o.setLinks(St(o.links,t,s));this.postMessageToClient(i)}}removeViewportFromVisualLinks(e){var t;for(let s of this.viewports.values())if((t=s.links)!=null&&t.some(({parentVpId:n})=>n===e)){let[n]=s.setLinks(s.links.filter(({parentVpId:o})=>o!==e));this.postMessageToClient(n)}}menuRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[s,n]=A(e);this.sendMessageToServer({...n,vpId:t.serverViewportId},s)}}viewportRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[s,n]=A(e);this.sendMessageToServer({...n,vpId:t.serverViewportId,namedParams:{}},s)}}rpcCall(e){let[t,s]=A(e),n=Ne(s.service);this.sendMessageToServer(s,t,{module:n})}handleMessageFromClient(e){var t;if(ge(e))if(e.type===\"disable\"){let s=this.getViewportForClient(e.viewport,!1);return s!==null?this.disableViewport(s):void 0}else{let s=this.getViewportForClient(e.viewport);switch(e.type){case\"setViewRange\":return this.setViewRange(s,e);case\"config\":return this.setConfig(s,e);case\"aggregate\":return this.aggregate(s,e);case\"sort\":return this.sort(s,e);case\"groupBy\":return this.groupBy(s,e);case\"filter\":return this.filter(s,e);case\"select\":return this.select(s,e);case\"suspend\":return this.suspendViewport(s);case\"resume\":return this.resumeViewport(s);case\"enable\":return this.enableViewport(s);case\"openTreeNode\":return this.openTreeNode(s,e);case\"closeTreeNode\":return this.closeTreeNode(s,e);case\"createLink\":return this.createLink(s,e);case\"removeLink\":return this.removeLink(s);case\"setColumns\":return this.setColumns(s,e);case\"setTitle\":return this.setTitle(s,e);default:}}else{if(Ce(e))return this.viewportRpcCall(e);if(me(e))return this.menuRpcCall(e);{let{type:s,requestId:n}=e;switch(s){case\"GET_TABLE_LIST\":{(t=this.tableList)!=null||(this.tableList=this.awaitResponseToMessage({type:s},n)),this.tableList.then(o=>{this.postMessageToClient({type:\"TABLE_LIST_RESP\",tables:o.tables,requestId:n})});return}case\"GET_TABLE_META\":{this.getTableMeta(e.table,n).then(o=>{o&&this.postMessageToClient({type:\"TABLE_META_RESP\",tableSchema:o,requestId:n})});return}case\"RPC_CALL\":return this.rpcCall(e);default:}}}M(\\`Vuu ServerProxy Unexpected message from client \\${JSON.stringify(e)}\\`)}getTableMeta(e,t=C()){if(x(e))return Promise.resolve(void 0);let s=\\`\\${e.module}:\\${e.table}\\`,n=this.cachedTableMetaRequests.get(s);return n||(n=this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:e},t),this.cachedTableMetaRequests.set(s,n)),n==null?void 0:n.then(o=>this.cacheTableMeta(o))}awaitResponseToMessage(e,t=C()){return new Promise((s,n)=>{this.sendMessageToServer(e,t),this.pendingRequests.set(t,{reject:n,resolve:s})})}sendIfReady(e,t,s=!0){return s&&this.sendMessageToServer(e,t),s}sendMessageToServer(e,t=\\`\\${We++}\\`,s=mt){let{module:n=\"CORE\"}=s;this.authToken&&this.connection.send({requestId:t,sessionId:this.sessionId,token:this.authToken,user:this.user,module:n,body:e})}handleMessageFromServer(e){var u;let{body:t,requestId:s,sessionId:n}=e,o=this.pendingRequests.get(s);if(o){let{resolve:a}=o;this.pendingRequests.delete(s),a(t);return}let{viewports:i}=this;switch(t.type){case Ie:this.sendMessageToServer({type:De,ts:+new Date},\"NA\");break;case\"LOGIN_SUCCESS\":if(n)this.sessionId=n,(u=this.pendingLogin)==null||u.resolve(n),this.pendingLogin=void 0;else throw Error(\"LOGIN_SUCCESS did not provide sessionId\");break;case\"REMOVE_VP_SUCCESS\":{let a=i.get(t.viewPortId);a&&(this.mapClientToServerViewport.delete(a.clientViewportId),i.delete(t.viewPortId),this.removeViewportFromVisualLinks(t.viewPortId))}break;case xe:{let a=this.viewports.get(t.vpId);a&&a.completeOperation(s)}break;case Te:case ve:if(i.has(t.viewPortId)){let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(s);l!==void 0&&(this.postMessageToClient(l),Q&&V(\\`postMessageToClient \\${JSON.stringify(l)}\\`))}}break;case Me:{let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(s);if(l){this.postMessageToClient(l);let[g,S]=a.resume();this.postMessageToClient({clientViewportId:a.clientViewportId,mode:\"batch\",rows:S,size:g,type:\"viewport-update\"})}}}break;case\"TABLE_ROW\":{let a=Se(t.rows);for(let[l,g]of Object.entries(a)){let S=i.get(l);S?S.updateRows(g):Y==null||Y(\\`TABLE_ROW message received for non registered viewport \\${l}\\`)}this.processUpdates()}break;case\"CHANGE_VP_RANGE_SUCCESS\":{let a=this.viewports.get(t.viewPortId);if(a){let{from:l,to:g}=t;a.completeOperation(s,l,g)}}break;case ke:case Ee:break;case\"CREATE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId),l=this.viewports.get(t.parentVpId);if(a&&l){let{childColumnName:g,parentColumnName:S}=t,I=a.completeOperation(s,g,l.clientViewportId,S);I&&this.postMessageToClient(I)}}break;case\"REMOVE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId);if(a){let l=a.completeOperation(s);l&&this.postMessageToClient(l)}}break;case\"VP_VISUAL_LINKS_RESP\":{let a=this.getActiveLinks(t.links),l=this.viewports.get(t.vpId);if(a.length&&l){let g=Tt(a,this.viewports),[S,I]=l.setLinks(g);if(this.postMessageToClient(S),I){let{link:ne,parentClientVpId:Ke}=I,re=C(),oe=this.mapClientToServerViewport.get(Ke);if(oe){let Je=l.createLink(re,ne.fromColumn,oe,ne.toColumn);this.sendMessageToServer(Je,re)}}}}break;case\"VIEW_PORT_MENUS_RESP\":if(t.menu.name){let a=this.viewports.get(t.vpId);if(a){let l=a.setMenu(t.menu);this.postMessageToClient(l)}}break;case\"VP_EDIT_RPC_RESPONSE\":this.postMessageToClient({action:t.action,requestId:s,rpcName:t.rpcName,type:\"VP_EDIT_RPC_RESPONSE\"});break;case\"VP_EDIT_RPC_REJECT\":this.viewports.get(t.vpId)&&this.postMessageToClient({requestId:s,type:\"VP_EDIT_RPC_REJECT\",error:t.error});break;case\"VIEW_PORT_MENU_REJ\":{console.log(\"send menu error back to client\");let{error:a,rpcName:l,vpId:g}=t,S=this.viewports.get(g);S&&this.postMessageToClient({clientViewportId:S.clientViewportId,error:a,rpcName:l,type:\"VIEW_PORT_MENU_REJ\",requestId:s});break}case\"VIEW_PORT_MENU_RESP\":if(fe(t)){let{action:a,rpcName:l}=t;this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:a.table}).then(g=>{let S=H(g);this.postMessageToClient({rpcName:l,type:\"VIEW_PORT_MENU_RESP\",action:{...a,tableSchema:S},tableAlreadyOpen:this.isTableOpen(a.table),requestId:s})})}else{let{action:a}=t;this.postMessageToClient({type:\"VIEW_PORT_MENU_RESP\",action:a||Rt,tableAlreadyOpen:a!==null&&this.isTableOpen(a.table),requestId:s})}break;case\"RPC_RESP\":{let{method:a,result:l}=t;this.postMessageToClient({type:\"RPC_RESP\",method:a,result:l,requestId:s})}break;case\"VIEW_PORT_RPC_REPONSE\":{let{method:a,action:l}=t;this.postMessageToClient({type:\"VIEW_PORT_RPC_RESPONSE\",rpcName:a,action:l,requestId:s})}break;case\"ERROR\":M(t.msg);break;default:ft&&T(\\`handleMessageFromServer \\${t.type}.\\`)}}cacheTableMeta(e){let{module:t,table:s}=e.table,n=\\`\\${t}:\\${s}\\`,o=this.cachedTableSchemas.get(n);return o||(o=H(e),this.cachedTableSchemas.set(n,o)),o}isTableOpen(e){if(e){let t=e.table;for(let s of this.viewports.values())if(!s.suspended&&s.table.table===t)return!0}}getActiveLinks(e){return e.filter(t=>{let s=this.viewports.get(t.parentVpId);return s&&!s.suspended})}processUpdates(){this.viewports.forEach(e=>{var t;if(e.hasUpdatesToProcess){let s=e.getClientRows();if(s!==W){let[n,o]=s,i=e.getNewRowCount();(i!==void 0||n&&n.length>0)&&(Q&&V(\\`postMessageToClient #\\${e.clientViewportId} viewport-update \\${o}, \\${(t=n==null?void 0:n.length)!=null?t:\"no\"} rows, size \\${i}\\`),o&&this.postMessageToClient({clientViewportId:e.clientViewportId,mode:o,rows:n,size:i,type:\"viewport-update\"}))}}})}};var{debug:us,debugEnabled:ls,error:qe,info:E,infoEnabled:bt,warn:_}=b(\"websocket-connection\"),Fe=\"ws\",Et=r=>r.startsWith(Fe+\"://\")||r.startsWith(Fe+\"s://\"),Ge={},X=Symbol(\"setWebsocket\"),B=Symbol(\"connectionCallback\");async function ze(r,e,t,s=10,n=5){return Ge[r]={status:\"connecting\",connect:{allowed:n,remaining:n},reconnect:{allowed:s,remaining:s}},He(r,e,t)}async function Z(r){throw Error(\"connection broken\")}async function He(r,e,t,s){let{status:n,connect:o,reconnect:i}=Ge[r],u=n===\"connecting\"?o:i;try{t({type:\"connection-status\",status:\"connecting\"});let c=typeof s<\"u\",p=await Vt(r,e);console.info(\"%c\\u26A1 %cconnected\",\"font-size: 24px;color: green;font-weight: bold;\",\"color:green; font-size: 14px;\"),s!==void 0&&s[X](p);let a=s!=null?s:new ee(p,r,e,t),l=c?\"reconnected\":\"connection-open-awaiting-session\";return t({type:\"connection-status\",status:l}),a.status=l,u.remaining=u.allowed,a}catch{let p=--u.remaining>0;if(t({type:\"connection-status\",status:\"disconnected\",reason:\"failed to connect\",retry:p}),p)return wt(r,e,t,s,2e3);throw Error(\"Failed to establish connection\")}}var wt=(r,e,t,s,n)=>new Promise(o=>{setTimeout(()=>{o(He(r,e,t,s))},n)}),Vt=(r,e)=>new Promise((t,s)=>{let n=Et(r)?r:\\`wss://\\${r}\\`;bt&&e!==void 0&&E(\\`WebSocket Protocol \\${e==null?void 0:e.toString()}\\`);let o=new WebSocket(n,e);o.onopen=()=>t(o),o.onerror=i=>s(i)}),Be=()=>{_==null||_(\"Connection cannot be closed, socket not yet opened\")},\\$e=r=>{_==null||_(\\`Message cannot be sent, socket closed \\${r.body.type}\\`)},vt=r=>{try{return JSON.parse(r)}catch{throw Error(\\`Error parsing JSON response from server \\${r}\\`)}},ee=class{constructor(e,t,s,n){this.close=Be;this.requiresLogin=!0;this.send=\\$e;this.status=\"ready\";this.messagesCount=0;this.connectionMetricsInterval=null;this.handleWebsocketMessage=e=>{let t=vt(e.data);this.messagesCount+=1,this[B](t)};this.url=t,this.protocol=s,this[B]=n,this[X](e)}reconnect(){Z(this)}[(B,X)](e){let t=this[B];e.onmessage=o=>{this.status=\"connected\",e.onmessage=this.handleWebsocketMessage,this.handleWebsocketMessage(o)},this.connectionMetricsInterval=setInterval(()=>{t({type:\"connection-metrics\",messagesLength:this.messagesCount}),this.messagesCount=0},2e3),e.onerror=()=>{qe(\"\\u26A1 connection error\"),t({type:\"connection-status\",status:\"disconnected\",reason:\"error\"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status===\"connection-open-awaiting-session\"?qe(\"Websocket connection lost before Vuu session established, check websocket configuration\"):this.status!==\"closed\"&&(Z(this),this.send=n)},e.onclose=()=>{E==null||E(\"\\u26A1 connection close\"),t({type:\"connection-status\",status:\"disconnected\",reason:\"close\"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status!==\"closed\"&&(Z(this),this.send=n)};let s=o=>{e.send(JSON.stringify(o))},n=o=>{E==null||E(\\`TODO queue message until websocket reconnected \\${o.body.type}\\`)};this.send=s,this.close=()=>{this.status=\"closed\",e.close(),this.close=Be,this.send=\\$e,E==null||E(\"close websocket\")}}};var v,{info:te,infoEnabled:se}=b(\"worker\");async function yt(r,e,t,s,n,o,i){let u=await ze(r,e,c=>{de(c)?postMessage({type:\"connection-metrics\",messages:c}):pe(c)?(n(c),c.status===\"reconnected\"&&v.reconnect()):v.handleMessageFromServer(c)},o,i);v=new F(u,c=>Mt(c)),u.requiresLogin&&await v.login(t,s)}function Mt(r){postMessage(r)}var _t=async({data:r})=>{switch(r.type){case\"connect\":await yt(r.url,r.protocol,r.token,r.username,postMessage,r.retryLimitDisconnect,r.retryLimitStartup),postMessage({type:\"connected\"});break;case\"subscribe\":se&&te(\\`client subscribe: \\${JSON.stringify(r)}\\`),v.subscribe(r);break;case\"unsubscribe\":se&&te(\\`client unsubscribe: \\${JSON.stringify(r)}\\`),v.unsubscribe(r.viewport);break;default:se&&te(\\`client message: \\${JSON.stringify(r)}\\`),v.handleMessageFromClient(r)}};self.addEventListener(\"message\",_t);postMessage({type:\"ready\"});\n\n`;", "let _connectionId = 0;\n\nexport const connectionId = {\n get nextValue() {\n return _connectionId++;\n },\n};\n\nexport const msgType = {\n connect: \"connect\",\n connectionStatus: \"connection-status\",\n getFilterData: \"GetFilterData\",\n rowData: \"rowData\",\n rowSet: \"rowset\",\n select: \"select\",\n selectAll: \"selectAll\",\n selectNone: \"selectNone\",\n selected: \"selected\",\n snapshot: \"snapshot\",\n update: \"update\",\n createLink: \"createLink\",\n disable: \"disable\",\n enable: \"enable\",\n suspend: \"suspend\",\n resume: \"resume\",\n\n addSubscription: \"AddSubscription\",\n closeTreeNode: \"closeTreeNode\",\n columnList: \"ColumnList\",\n data: \"data\",\n openTreeNode: \"openTreeNode\",\n aggregate: \"aggregate\",\n filter: \"filter\",\n filterQuery: \"filterQuery\",\n filterData: \"filterData\",\n getSearchData: \"GetSearchData\",\n groupBy: \"groupBy\",\n modifySubscription: \"ModifySubscription\",\n searchData: \"searchData\",\n setGroupState: \"setGroupState\",\n size: \"size\",\n sort: \"sort\",\n subscribed: \"Subscribed\",\n tableList: \"TableList\",\n unsubscribe: \"TerminateSubscription\",\n viewRangeChanged: \"ViewRangeChanged\",\n};\n", "import {\n SchemaColumn,\n TableSchema,\n VuuUIMessageOut,\n WithRequestId,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n VuuRow,\n VuuRpcRequest,\n VuuTable,\n VuuTableMeta,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n \"VP_EDIT_CELL_RPC\",\n \"VP_EDIT_ROW_RPC\",\n \"VP_EDIT_ADD_ROW_RPC\",\n \"VP_EDIT_DELETE_CELL_RPC\",\n \"VP_EDIT_DELETE_ROW_RPC\",\n \"VP_EDIT_SUBMIT_FORM_RPC\",\n];\n\nexport const isVuuMenuRpcRequest = (\n message: VuuUIMessageOut | VuuRpcRequest | ClientToServerMenuRPC\n): message is ClientToServerMenuRPC => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isVuuRpcRequest = (\n message:\n | VuuUIMessageOut\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerViewportRpcCall\n): message is ClientToServerViewportRpcCall =>\n message[\"type\"] === \"VIEW_PORT_RPC_CALL\";\n\nexport const stripRequestId = <T>({\n requestId,\n ...rest\n}: WithRequestId<T>): [string, T] => [requestId, rest as T];\n\nexport const getFirstAndLastRows = (\n rows: VuuRow[]\n): [VuuRow, VuuRow] | [VuuRow] => {\n let firstRow = rows.at(0) as VuuRow;\n if (firstRow.updateType === \"SIZE\") {\n if (rows.length === 1) {\n return rows as [VuuRow];\n } else {\n firstRow = rows.at(1) as VuuRow;\n }\n }\n const lastRow = rows.at(-1) as VuuRow;\n return [firstRow, lastRow];\n};\n\nexport type ViewportRowMap = { [key: string]: VuuRow[] };\nexport const groupRowsByViewport = (rows: VuuRow[]): ViewportRowMap => {\n const result: ViewportRowMap = {};\n for (const row of rows) {\n const rowsForViewport =\n result[row.viewPortId] || (result[row.viewPortId] = []);\n rowsForViewport.push(row);\n }\n return result;\n};\n\nexport interface VuuTableMetaWithTable extends VuuTableMeta {\n table: VuuTable;\n}\n\nexport const createSchemaFromTableMetadata = ({\n columns,\n dataTypes,\n key,\n table,\n}: VuuTableMetaWithTable): Readonly<TableSchema> => {\n return {\n table,\n columns: columns.map((col, idx) => ({\n name: col,\n serverDataType: dataTypes[idx],\n })),\n key,\n };\n};\n", "import {\n DataSource,\n DataSourceCallbackMessage,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n OptimizeStrategy,\n RpcResponse,\n Selection,\n SubscribeCallback,\n SubscribeProps,\n TableSchema,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuDataRowDto,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuSort,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n configChanged,\n debounce,\n EventEmitter,\n isViewportMenusAction,\n isVisualLinksAction,\n itemsOrOrderChanged,\n logger,\n metadataKeys,\n throttle,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { getServerAPI, ServerAPI } from \"./connection-manager\";\nimport { isDataSourceConfigMessage } from \"./data-source\";\n\nimport { MenuRpcResponse } from \"@vuu-ui/vuu-data-types\";\n\ntype RangeRequest = (range: VuuRange) => void;\n\nconst { info } = logger(\"VuuDataSource\");\n\nconst { KEY } = metadataKeys;\n\n/*-----------------------------------------------------------------\n A RemoteDataSource manages a single subscription via the ServerProxy\n ----------------------------------------------------------------*/\nexport class VuuDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private bufferSize: number;\n private server: ServerAPI | null = null;\n private clientCallback: SubscribeCallback | undefined;\n private configChangePending: DataSourceConfig | undefined;\n private rangeRequest: RangeRequest;\n\n #config: WithFullConfig = vanillaConfig;\n #groupBy: VuuGroupBy = [];\n #links: LinkDescriptorWithLabel[] | undefined;\n #menu: VuuMenu | undefined;\n #optimize: OptimizeStrategy = \"throttle\";\n #range: VuuRange = { from: 0, to: 0 };\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n\n #title: string | undefined;\n\n public table: VuuTable;\n public tableSchema: TableSchema | undefined;\n public viewport: string | undefined;\n\n constructor({\n bufferSize = 100,\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n table,\n title,\n viewport,\n visualLink,\n }: DataSourceConstructorProps) {\n super();\n\n if (!table)\n throw Error(\"RemoteDataSource constructor called without table\");\n\n this.bufferSize = bufferSize;\n this.table = table;\n this.viewport = viewport;\n\n this.#config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n visualLink: visualLink || this.#config.visualLink,\n };\n\n this.#title = title;\n this.rangeRequest = this.throttleRangeRequest;\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filter,\n }: SubscribeProps,\n callback: SubscribeCallback\n ) {\n if (this.#status === \"disabled\" || this.#status === \"disabling\") {\n this.enable(callback);\n return;\n }\n this.clientCallback = callback;\n if (aggregations || columns || filter || groupBy || sort) {\n this.#config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this.#range = range;\n }\n\n if (\n this.#status !== \"initialising\" &&\n this.#status !== \"unsubscribed\"\n // We can subscribe to a disabled dataSource. No request will be\n // sent to server to create a new VP, just to enable the existing one.\n // The current subscribing client becomes the subscription owner\n ) {\n return;\n }\n\n this.#status = \"subscribing\";\n this.viewport = viewport;\n\n this.server = await getServerAPI();\n\n const { bufferSize } = this;\n\n this.server?.subscribe(\n {\n ...this.#config,\n bufferSize,\n viewport,\n table: this.table,\n range: this.#range,\n title: this.#title,\n },\n this.handleMessageFromServer\n );\n }\n\n handleMessageFromServer = (message: DataSourceCallbackMessage) => {\n if (message.type === \"subscribed\") {\n this.#status = \"subscribed\";\n if (message.tableSchema) {\n this.tableSchema = message.tableSchema;\n }\n this.clientCallback?.(message);\n } else if (message.type === \"disabled\") {\n this.#status = \"disabled\";\n } else if (message.type === \"enabled\") {\n this.#status = \"enabled\";\n } else if (isDataSourceConfigMessage(message)) {\n // This is an ACK for a CHANGE_VP message. Nothing to do here. We need\n // to wait for data to be returned before we can consider the change\n // to be in effect.\n return;\n } else if (message.type === \"debounce-begin\") {\n this.optimize = \"debounce\";\n } else {\n if (\n message.type === \"viewport-update\" &&\n message.size !== undefined &&\n message.size !== this.#size\n ) {\n this.#size = message.size;\n this.emit(\"resize\", message.size);\n }\n // This is used to remove any progress indication from the UI. We wait for actual data rather than\n // just the CHANGE_VP_SUCCESS ack as there is often a delay between receiving the ack and the data.\n // It may be a SIZE only message, eg in the case of removing a groupBy column from a multi-column\n // groupby, where no tree nodes are expanded.\n if (this.configChangePending) {\n this.setConfigPending();\n }\n\n if (isViewportMenusAction(message)) {\n this.#menu = message.menu;\n } else if (isVisualLinksAction(message)) {\n this.#links = message.links as LinkDescriptorWithLabel[];\n } else {\n this.clientCallback?.(message);\n }\n\n if (this.optimize === \"debounce\") {\n this.revertDebounce();\n }\n }\n };\n\n unsubscribe() {\n console.log(`unsubscribe #${this.viewport}`);\n info?.(`unsubscribe #${this.viewport}`);\n if (this.viewport) {\n this.server?.unsubscribe(this.viewport);\n }\n this.server?.destroy(this.viewport);\n this.server = null;\n this.removeAllListeners();\n this.#status = \"unsubscribed\";\n this.viewport = undefined;\n this.range = { from: 0, to: 0 };\n }\n\n suspend() {\n console.log(`suspend #${this.viewport}, current status ${this.#status}`);\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"suspended\";\n this.server?.send({\n type: \"suspend\",\n viewport: this.viewport,\n });\n }\n return this;\n }\n\n resume() {\n console.log(`resume #${this.viewport}, current status ${this.#status}`);\n\n const isDisabled = this.#status.startsWith(\"disabl\");\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n if (isDisabled) {\n this.enable();\n } else if (isSuspended) {\n this.server?.send({\n type: \"resume\",\n viewport: this.viewport,\n });\n this.#status = \"subscribed\";\n }\n }\n return this;\n }\n\n disable() {\n info?.(`disable #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"disabling\";\n this.server?.send({\n viewport: this.viewport,\n type: \"disable\",\n });\n }\n return this;\n }\n\n enable(callback?: SubscribeCallback) {\n info?.(`enable #${this.viewport}, current status ${this.#status}`);\n if (\n this.viewport &&\n (this.#status === \"disabled\" || this.#status === \"disabling\")\n ) {\n this.#status = \"enabling\";\n if (callback) {\n this.clientCallback = callback;\n }\n this.server?.send({\n viewport: this.viewport,\n type: \"enable\",\n });\n }\n return this;\n }\n\n select(selected: Selection) {\n //TODO this isn't always going to be correct - need to count\n // selection block items\n this.#selectedRowsCount = selected.length;\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"select\",\n selected,\n });\n }\n }\n\n openTreeNode(key: string) {\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"openTreeNode\",\n key,\n });\n }\n }\n\n closeTreeNode(key: string) {\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"closeTreeNode\",\n key,\n });\n }\n }\n\n get links() {\n return this.#links;\n }\n\n get menu() {\n return this.#menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get optimize() {\n return this.#optimize;\n }\n\n set optimize(optimize: OptimizeStrategy) {\n if (optimize !== this.#optimize) {\n this.#optimize = optimize;\n switch (optimize) {\n case \"none\":\n this.rangeRequest = this.rawRangeRequest;\n break;\n case \"debounce\":\n this.rangeRequest = this.debounceRangeRequest;\n break;\n case \"throttle\":\n this.rangeRequest = this.throttleRangeRequest;\n break;\n }\n this.emit(\"optimize\", optimize);\n }\n }\n\n private revertDebounce = debounce(() => {\n this.optimize = \"throttle\";\n }, 100);\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: VuuRange) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n this.#range = range;\n this.rangeRequest(range);\n }\n }\n\n private rawRangeRequest: RangeRequest = (range) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n };\n\n private debounceRangeRequest: RangeRequest = debounce((range: VuuRange) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n }, 50);\n\n private throttleRangeRequest: RangeRequest = throttle((range: VuuRange) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n }, 80);\n\n get config() {\n return this.#config;\n }\n\n set config(config: DataSourceConfig) {\n if (this.applyConfig(config)) {\n if (this.#config && this.viewport && this.server) {\n if (config) {\n this.server?.send({\n viewport: this.viewport,\n type: \"config\",\n config: this.#config,\n });\n }\n }\n this.emit(\"config\", this.#config);\n }\n }\n\n applyConfig(config: DataSourceConfig) {\n if (configChanged(this.#config, config)) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filter?.filter && config?.filter.filterStruct === undefined\n ? {\n ...config,\n filter: {\n filter: config.filter.filter,\n filterStruct: parseFilter(config.filter.filter),\n },\n }\n : config;\n this.#config = withConfigDefaults(newConfig);\n return true;\n }\n }\n }\n\n //TODO replace all these individual server calls with calls to setConfig\n get columns() {\n return this.#config.columns;\n }\n\n set columns(columns: string[]) {\n this.#config = {\n ...this.#config,\n columns,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"setColumns\",\n columns,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get aggregations() {\n return this.#config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.#config = {\n ...this.#config,\n aggregations,\n };\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"aggregate\",\n aggregations,\n });\n }\n this.emit(\"config\", this.#config);\n }\n\n get sort() {\n return this.#config.sort;\n }\n\n set sort(sort: VuuSort) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#config = {\n ...this.#config,\n sort,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"sort\",\n sort,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get filter() {\n return this.#config.filter;\n }\n\n set filter(filter: DataSourceFilter) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#config = {\n ...this.#config,\n filter,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"filter\",\n filter,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get groupBy() {\n return this.#config.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n if (itemsOrOrderChanged(this.groupBy, groupBy)) {\n const wasGrouped = this.#groupBy.length > 0;\n this.#config = {\n ...this.#config,\n groupBy,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"groupBy\",\n groupBy: this.#config.groupBy,\n } as const;\n\n if (this.server) {\n this.server.send(message);\n }\n }\n if (!wasGrouped && groupBy.length > 0 && this.viewport) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n type: \"viewport-update\",\n size: 0,\n rows: [],\n });\n }\n this.emit(\"config\", this.#config);\n this.setConfigPending({ groupBy });\n }\n }\n\n get title() {\n return this.#title;\n }\n\n set title(title: string | undefined) {\n this.#title = title;\n if (this.viewport && title) {\n this.server?.send({\n type: \"setTitle\",\n title,\n viewport: this.viewport,\n });\n }\n }\n\n get visualLink() {\n return this.#config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this.#config = {\n ...this.#config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"createLink\",\n parentClientVpId,\n parentColumnName: toColumn,\n childColumnName: fromColumn,\n });\n }\n } else {\n if (this.viewport) {\n this.server?.send({\n type: \"removeLink\",\n viewport: this.viewport,\n });\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n private setConfigPending(config?: DataSourceConfig) {\n const pendingConfig = this.configChangePending;\n this.configChangePending = config;\n\n if (config !== undefined) {\n this.emit(\"config\", config, false);\n } else {\n this.emit(\"config\", pendingConfig, true);\n }\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ) {\n if (this.viewport) {\n return this.server?.rpcCall<T>({\n vpId: this.viewport,\n ...rpcRequest,\n } as ClientToServerViewportRpcCall);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ) {\n if (this.viewport) {\n return this.server?.rpcCall<MenuRpcResponse>({\n vpId: this.viewport,\n ...rpcRequest,\n } as ClientToServerMenuRPC);\n }\n }\n\n applyEdit(row: DataSourceRow, columnName: string, value: VuuRowDataItemType) {\n return this.menuRpcCall({\n rowKey: row[KEY],\n field: columnName,\n value: value,\n type: \"VP_EDIT_CELL_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n\n insertRow(key: string, data: VuuDataRowDto) {\n return this.menuRpcCall({\n rowKey: key,\n data,\n type: \"VP_EDIT_ADD_ROW_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n deleteRow(rowKey: string) {\n return this.menuRpcCall({\n rowKey,\n type: \"VP_EDIT_DELETE_ROW_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["const defaultAuthUrl = \"api/authn\";\n\nexport const authenticate = async (\n username: string,\n password: string,\n authUrl = defaultAuthUrl\n): Promise<string | void> =>\n fetch(authUrl, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"access-control-allow-origin\": location.host,\n },\n body: JSON.stringify({ username, password }),\n }).then((response) => {\n if (response.ok) {\n const authToken = response.headers.get(\"vuu-auth-token\");\n if (typeof authToken === \"string\" && authToken.length > 0) {\n return authToken;\n } else {\n throw Error(`Authentication failed auth token not returned by server`);\n }\n } else {\n throw Error(\n `Authentication failed ${response.status} ${response.statusText}`\n );\n }\n });\n", "import {\n ConnectionStatusMessage,\n DataSourceCallbackMessage,\n ServerProxySubscribeMessage,\n TableSchema,\n VuuUIMessageIn,\n VuuUIMessageInRPC,\n VuuUIMessageInTableList,\n VuuUIMessageInTableMeta,\n VuuUIMessageOut,\n WebSocketProtocol,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerTableList,\n ClientToServerTableMeta,\n ClientToServerViewportRpcCall,\n VuuRpcRequest,\n VuuTable,\n VuuTableList,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n EventEmitter,\n getLoggingConfigForWorker,\n isConnectionQualityMetrics,\n isConnectionStatusMessage,\n isTableSchema,\n messageHasResult,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { shouldMessageBeRoutedToDataSource as messageShouldBeRoutedToDataSource } from \"./data-source\";\nimport * as Message from \"./server-proxy/messages\";\n\n// Note: inlined-worker is a generated file, it must be built\nimport { ConnectionQualityMetrics } from \"@vuu-ui/vuu-data-types\";\nimport { workerSourceCode } from \"./inlined-worker\";\n\nconst workerBlob = new Blob([getLoggingConfigForWorker() + workerSourceCode], {\n type: \"text/javascript\",\n});\nconst workerBlobUrl = URL.createObjectURL(workerBlob);\n\ntype WorkerResolver = {\n resolve: (value: Worker | PromiseLike<Worker>) => void;\n};\n\nlet worker: Worker;\nlet pendingWorker: Promise<Worker>;\nconst pendingWorkerNoToken: WorkerResolver[] = [];\n\nlet resolveServer: (server: ServerAPI) => void;\nlet rejectServer: (err: unknown) => void;\n\nconst serverAPI = new Promise<ServerAPI>((resolve, reject) => {\n resolveServer = resolve;\n rejectServer = reject;\n});\n\nexport const getServerAPI = () => serverAPI;\n\nexport type PostMessageToClientCallback = (\n msg: DataSourceCallbackMessage\n) => void;\n\nconst viewports = new Map<\n string,\n {\n postMessageToClientDataSource: PostMessageToClientCallback;\n request: ServerProxySubscribeMessage;\n status: \"subscribing\";\n }\n>();\nconst pendingRequests = new Map();\n\ntype WorkerOptions = {\n protocol: WebSocketProtocol;\n retryLimitDisconnect?: number;\n retryLimitStartup?: number;\n url: string;\n token?: string;\n username: string | undefined;\n handleConnectionStatusChange: (msg: {\n data: ConnectionStatusMessage;\n }) => void;\n};\n\n// We do not resolve the worker until we have a connection, but we will get\n// connection status messages before that, so we forward them to caller\n// while they wait for worker.\nconst getWorker = async ({\n handleConnectionStatusChange,\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n token = \"\",\n username,\n url,\n}: WorkerOptions) => {\n if (token === \"\" && pendingWorker === undefined) {\n return new Promise<Worker>((resolve) => {\n pendingWorkerNoToken.push({ resolve });\n });\n }\n //FIXME If we have a pending request already and a new request arrives with a DIFFERENT\n // token, this would cause us to ignore the new request and ultimately resolve it with\n // the original request.\n return (\n pendingWorker ||\n // we get this far when we receive the first request with auth token\n (pendingWorker = new Promise((resolve) => {\n const worker = new Worker(workerBlobUrl);\n\n const timer: number | null = window.setTimeout(() => {\n console.error(\"timed out waiting for worker to load\");\n }, 1000);\n\n // This is the inial message handler only, it processes messages whilst we are\n // establishing a connection. When we resolve the worker, a runtime message\n // handler will replace this (see below)\n worker.onmessage = (msg: MessageEvent<VuuUIMessageIn>) => {\n const { data: message } = msg;\n if (message.type === \"ready\") {\n window.clearTimeout(timer);\n worker.postMessage({\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n token,\n type: \"connect\",\n url,\n username,\n });\n } else if (message.type === \"connected\") {\n worker.onmessage = handleMessageFromWorker;\n resolve(worker);\n for (const pendingWorkerRequest of pendingWorkerNoToken) {\n pendingWorkerRequest.resolve(worker);\n }\n pendingWorkerNoToken.length = 0;\n } else if (isConnectionStatusMessage(message)) {\n handleConnectionStatusChange({ data: message });\n } else {\n console.warn(\"ConnectionManager: Unexpected message from the worker\");\n }\n };\n // TODO handle error\n }))\n );\n};\n\nfunction handleMessageFromWorker({\n data: message,\n}: MessageEvent<VuuUIMessageIn | DataSourceCallbackMessage>) {\n if (messageShouldBeRoutedToDataSource(message)) {\n const viewport = viewports.get(message.clientViewportId);\n if (viewport) {\n viewport.postMessageToClientDataSource(message);\n } else {\n console.error(\n `[ConnectionManager] ${message.type} message received, viewport not found`\n );\n }\n } else if (isConnectionStatusMessage(message)) {\n ConnectionManager.emit(\"connection-status\", message);\n } else if (isConnectionQualityMetrics(message)) {\n ConnectionManager.emit(\"connection-metrics\", message);\n } else {\n const requestId = (message as VuuUIMessageInRPC).requestId;\n if (pendingRequests.has(requestId)) {\n const { resolve } = pendingRequests.get(requestId);\n pendingRequests.delete(requestId);\n const {\n type: _1,\n requestId: _2,\n ...rest\n } = message as\n | VuuUIMessageInRPC\n | VuuUIMessageInTableList\n | VuuUIMessageInTableMeta;\n\n if (messageHasResult(message)) {\n resolve(message.result);\n } else if (\n message.type === \"VP_EDIT_RPC_RESPONSE\" ||\n message.type === \"VP_EDIT_RPC_REJECT\"\n ) {\n resolve(message);\n } else if (isTableSchema(message)) {\n resolve(message.tableSchema);\n } else {\n resolve(rest);\n }\n } else {\n console.warn(\n \"%cConnectionManager Unexpected message from the worker\",\n \"color:red;font-weight:bold;\"\n );\n }\n }\n}\n\nconst asyncRequest = <T = unknown>(\n msg:\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerTableList\n | ClientToServerTableMeta\n | ClientToServerViewportRpcCall\n): Promise<T> => {\n const requestId = uuid();\n worker.postMessage({\n requestId,\n ...msg,\n });\n return new Promise((resolve, reject) => {\n pendingRequests.set(requestId, { resolve, reject });\n });\n};\n\nexport interface ServerAPI {\n destroy: (viewportId?: string) => void;\n getTableSchema: (table: VuuTable) => Promise<TableSchema>;\n getTableList: () => Promise<VuuTableList>;\n rpcCall: <T = unknown>(\n msg: VuuRpcRequest | ClientToServerMenuRPC | ClientToServerViewportRpcCall\n ) => Promise<T>;\n send: (message: VuuUIMessageOut) => void;\n subscribe: (\n message: ServerProxySubscribeMessage,\n callback: PostMessageToClientCallback\n ) => void;\n unsubscribe: (viewport: string) => void;\n}\n\nconst connectedServerAPI: ServerAPI = {\n subscribe: (message, callback) => {\n if (viewports.get(message.viewport)) {\n throw Error(\n `ConnectionManager attempting to subscribe with an existing viewport id`\n );\n }\n // TODO we never use this status\n viewports.set(message.viewport, {\n status: \"subscribing\",\n request: message,\n postMessageToClientDataSource: callback,\n });\n worker.postMessage({ type: \"subscribe\", ...message });\n },\n\n unsubscribe: (viewport) => {\n worker.postMessage({ type: \"unsubscribe\", viewport });\n },\n\n send: (message) => {\n worker.postMessage(message);\n },\n\n destroy: (viewportId?: string) => {\n if (viewportId && viewports.has(viewportId)) {\n viewports.delete(viewportId);\n }\n },\n\n rpcCall: async <T = unknown>(\n message:\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerViewportRpcCall\n ) => asyncRequest<T>(message),\n\n getTableList: async () =>\n asyncRequest<VuuTableList>({ type: \"GET_TABLE_LIST\" }),\n\n getTableSchema: async (table) =>\n asyncRequest<TableSchema>({\n type: Message.GET_TABLE_META,\n table,\n }),\n};\n\nexport type ConnectionEvents = {\n \"connection-status\": (message: ConnectionStatusMessage) => void;\n \"connection-metrics\": (message: ConnectionQualityMetrics) => void;\n};\n\nexport type ConnectOptions = {\n url: string;\n authToken?: string;\n username?: string;\n protocol?: WebSocketProtocol;\n /** Max number of reconnect attempts in the event of unsuccessful websocket connection at startup */\n retryLimitStartup?: number;\n /** Max number of reconnect attempts in the event of a disconnected websocket connection */\n retryLimitDisconnect?: number;\n};\n\nclass _ConnectionManager extends EventEmitter<ConnectionEvents> {\n // The first request must have the token. We can change this to block others until\n // the request with token is received.\n async connect({\n url,\n authToken,\n username,\n protocol,\n retryLimitDisconnect,\n retryLimitStartup,\n }: ConnectOptions): Promise<ServerAPI> {\n // By passing handleMessageFromWorker here, we can get connection status\n //messages while we wait for worker to resolve.\n worker = await getWorker({\n protocol,\n url,\n token: authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n handleConnectionStatusChange: handleMessageFromWorker,\n });\n return connectedServerAPI;\n }\n\n destroy() {\n worker.terminate();\n }\n}\n\nexport const ConnectionManager = new _ConnectionManager();\n\n/**\n * Open a connection to the VuuServer. This method opens the websocket connection\n * and logs in. It can be called from whichever client code has access to the auth\n * token (eg. the login page, or just a hardcoded login script in a sample).\n * This will unblock any DataSources which may have already tried to subscribe to data,\n * but lacked access to the auth token.\n *\n * @param serverUrl\n * @param token\n */\nexport const connectToServer = async ({\n url,\n protocol = undefined,\n authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n}: ConnectOptions) => {\n try {\n const serverAPI = await ConnectionManager.connect({\n protocol,\n url,\n authToken,\n username,\n retryLimitDisconnect,\n retryLimitStartup,\n });\n resolveServer(serverAPI);\n } catch (err: unknown) {\n console.error(\"Connection Error\", err);\n rejectServer(err);\n }\n};\n\nexport const makeRpcCall = async <T = unknown>(rpcRequest: VuuRpcRequest) => {\n try {\n return (await serverAPI).rpcCall<T>(rpcRequest);\n } catch (err) {\n throw Error(\"Error accessing server api\");\n }\n};\n", "import {\n DataSourceCallbackMessage,\n DataSourceConfig,\n DataSourceConfigMessage,\n DataSourceDataSizeMessage,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ServerToClientBody,\n ServerToClientMenuSessionTableAction,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nexport const isSizeOnly = (\n message: DataSourceCallbackMessage\n): message is DataSourceDataSizeMessage =>\n message.type === \"viewport-update\" && message.mode === \"size-only\";\n\nexport const toDataSourceConfig = (\n message: DataSourceConfigMessage\n): DataSourceConfig => {\n switch (message.type) {\n case \"aggregate\":\n return { aggregations: message.aggregations };\n case \"columns\":\n return { columns: message.columns };\n case \"filter\":\n return { filter: message.filter };\n case \"groupBy\":\n return { groupBy: message.groupBy };\n case \"sort\":\n return { sort: message.sort };\n case \"config\":\n return message.config;\n }\n};\n\nconst datasourceMessages = [\n \"config\",\n \"aggregate\",\n \"viewport-update\",\n \"columns\",\n \"debounce-begin\",\n \"disabled\",\n \"enabled\",\n \"filter\",\n \"groupBy\",\n \"vuu-link-created\",\n \"vuu-link-removed\",\n \"vuu-links\",\n \"vuu-menu\",\n \"sort\",\n \"subscribed\",\n];\n\nexport const shouldMessageBeRoutedToDataSource = (\n message: unknown\n): message is DataSourceCallbackMessage => {\n const type = (message as DataSourceCallbackMessage).type;\n return datasourceMessages.includes(type);\n};\n\nexport const isDataSourceConfigMessage = (\n message: DataSourceCallbackMessage\n): message is DataSourceConfigMessage =>\n [\"config\", \"aggregate\", \"columns\", \"filter\", \"groupBy\", \"sort\"].includes(\n message.type\n );\n\nexport const isSessionTableActionMessage = (\n messageBody: ServerToClientBody\n): messageBody is ServerToClientMenuSessionTableAction =>\n messageBody.type === \"VIEW_PORT_MENU_RESP\" &&\n messageBody.action !== null &&\n isSessionTable(messageBody.action.table);\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n", "export const CHANGE_VP_SUCCESS = \"CHANGE_VP_SUCCESS\";\nexport const CHANGE_VP_RANGE_SUCCESS = \"CHANGE_VP_RANGE_SUCCESS\";\nexport const CLOSE_TREE_NODE = \"CLOSE_TREE_NODE\";\nexport const CLOSE_TREE_SUCCESS = \"CLOSE_TREE_SUCCESS\";\nexport const CLOSE_TREE_REJECT = \"CLOSE_TREE_REJECT\";\nexport const CREATE_VISUAL_LINK = \"CREATE_VISUAL_LINK\";\nexport const CREATE_VP = \"CREATE_VP\";\nexport const DISABLE_VP = \"DISABLE_VP\";\nexport const DISABLE_VP_SUCCESS = \"DISABLE_VP_SUCCESS\";\nexport const DISABLE_VP_REJECT = \"DISABLE_VP_REJECT\";\nexport const ENABLE_VP = \"ENABLE_VP\";\nexport const ENABLE_VP_SUCCESS = \"ENABLE_VP_SUCCESS\";\nexport const ENABLE_VP_REJECT = \"ENABLE_VP_REJECT\";\nexport const GET_TABLE_META = \"GET_TABLE_META\";\nexport const GET_VP_VISUAL_LINKS = \"GET_VP_VISUAL_LINKS\";\nexport const GET_VIEW_PORT_MENUS = \"GET_VIEW_PORT_MENUS\";\nexport const VIEW_PORT_MENUS_SELECT_RPC = \"VIEW_PORT_MENUS_SELECT_RPC\";\nexport const VIEW_PORT_MENU_CELL_RPC = \"VIEW_PORT_MENU_CELL_RPC\";\nexport const VIEW_PORT_MENU_TABLE_RPC = \"VIEW_PORT_MENU_TABLE_RPC\";\nexport const VIEW_PORT_MENU_ROW_RPC = \"VIEW_PORT_MENU_ROW_RPC\";\nexport const VIEW_PORT_MENU_RESP = \"VIEW_PORT_MENU_RESP\";\nexport const VIEW_PORT_MENU_REJ = \"VIEW_PORT_MENU_REJ\";\nexport const HB = \"HB\";\nexport const HB_RESP = \"HB_RESP\";\nexport const LOGIN = \"LOGIN\";\nexport const OPEN_TREE_NODE = \"OPEN_TREE_NODE\";\nexport const OPEN_TREE_SUCCESS = \"OPEN_TREE_SUCCESS\";\nexport const OPEN_TREE_REJECT = \"OPEN_TREE_REJECT\";\nexport const REMOVE_VP = \"REMOVE_VP\";\nexport const REMOVE_VP_REJECT = \"REMOVE_VP_REJECT\";\nexport const RPC_CALL = \"RPC_CALL\";\nexport const RPC_RESP = \"RPC_RESP\";\nexport const MENU_RPC_RESP = \"MENU_RPC_RESP\";\nexport const SET_SELECTION = \"SET_SELECTION\";\nexport const SET_SELECTION_SUCCESS = \"SET_SELECTION_SUCCESS\";\n\nexport const TABLE_ROW = \"TABLE_ROW\";\nexport const SIZE = \"SIZE\";\nexport const UPDATE = \"U\";\n", "export const workerSourceCode = `\nvar ie=(r,e,t)=>{if(!e.has(r))throw TypeError(\"Cannot \"+t)};var m=(r,e,t)=>(ie(r,e,\"read from private field\"),t?t.call(r):e.get(r)),ae=(r,e,t)=>{if(e.has(r))throw TypeError(\"Cannot add the same private member more than once\");e instanceof WeakSet?e.add(r):e.set(r,t)},ue=(r,e,t,s)=>(ie(r,e,\"write to private field\"),s?s.call(r,t):e.set(r,t),t);function le(r,e,t=[],s=[]){for(let n=0,o=r.length;n<o;n++)(e(r[n],n)?t:s).push(r[n]);return[t,s]}var \\$={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:6,SELECTED:7,count:8,PARENT_IDX:\"parent_idx\",IDX_POINTER:\"idx_pointer\",FILTER_COUNT:\"filter_count\",NEXT_FILTER_IDX:\"next_filter_idx\"};var{DEPTH:Pt,IS_LEAF:Lt}=\\$;var ce=r=>{var e,t;if(((e=globalThis.document)==null?void 0:e.cookie)!==void 0)return(t=globalThis.document.cookie.split(\"; \").find(s=>s.startsWith(\\`\\${r}=\\`)))==null?void 0:t.split(\"=\")[1]};function G({from:r,to:e},t=0,s=Number.MAX_SAFE_INTEGER){if(t===0)return s<r?{from:0,to:0}:{from:r,to:Math.min(e,s)};if(r===0)return{from:r,to:Math.min(e+t,s)};{let n=e-r,o=Math.round(t/2),i=r-o<0,u=s-(e+o)<0;return i&&u?{from:0,to:s}:i?{from:0,to:n+t}:u?{from:Math.max(0,s-(n+t)),to:s}:{from:r-o,to:e+o}}}var je=(r,{from:e,to:t})=>r>=e&&r<t;var D=class r{constructor(e,t){this.from=e,this.to=t}isWithin(e){return je(e,this)}overlap(e,t){return e>=this.to||t<this.from?[0,0]:[Math.max(e,this.from),Math.min(t,this.to)]}copy(){return new r(this.from,this.to)}};var pe=r=>r.type===\"connection-status\",de=r=>r.type===\"connection-metrics\";var ge=r=>\"viewport\"in r;var Qe=[\"error\",\"warn\",\"info\",\"debug\"],Ye=r=>typeof r==\"string\"&&Qe.includes(r),Ze=\"error\",P=()=>{},Xe=\"error\",{loggingLevel:L=Xe}=et(),b=r=>{let e=L===\"debug\",t=e||L===\"info\",s=t||L===\"warn\",n=s||L===\"error\",o=t?p=>console.info(\\`[\\${r}] \\${p}\\`):P,i=s?p=>console.warn(\\`[\\${r}] \\${p}\\`):P,u=e?p=>console.debug(\\`[\\${r}] \\${p}\\`):P;return{errorEnabled:n,error:n?p=>console.error(\\`[\\${r}] \\${p}\\`):P}};function et(){return typeof loggingSettings<\"u\"?loggingSettings:{loggingLevel:tt()}}function tt(){let r=ce(\"vuu-logging-level\");return Ye(r)?r:Ze}var{debug:st,debugEnabled:nt}=b(\"range-monitor\"),k=class{constructor(e){this.source=e;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:e,to:t}){let{timestamp:s}=this;if(this.range.from=e,this.range.to=t,this.timestamp=performance.now(),s)nt&&st(\\`<\\${this.source}> [\\${e}-\\${t}], \\${(this.timestamp-s).toFixed(0)} ms elapsed\\`);else return 0}};var O=class{constructor(e){this.keys=new Map,this.free=[],this.nextKeyValue=0,this.reset(e)}next(){return this.free.length>0?this.free.shift():this.nextKeyValue++}reset({from:e,to:t}){this.keys.forEach((n,o)=>{(o<e||o>=t)&&(this.free.push(n),this.keys.delete(o))});let s=t-e;this.keys.size+this.free.length>s&&(this.free.length=Math.max(0,s-this.keys.size));for(let n=e;n<t;n++)if(!this.keys.has(n)){let o=this.next();this.keys.set(n,o)}this.nextKeyValue>this.keys.size&&(this.nextKeyValue=this.keys.size)}keyFor(e){let t=this.keys.get(e);if(t===void 0)throw console.log(\\`key not found\n keys: \\${this.toDebugString()}\n free : \\${this.free.join(\",\")} \n \\`),Error(\\`KeySet, no key found for rowIndex \\${e}\\`);return t}toDebugString(){return Array.from(this.keys.entries()).map(([e,t])=>\\`\\${e}=>\\${t}\\`).join(\",\")}};var{SELECTED:\\$t}=\\$,w={False:0,True:1,First:2,Last:4};var rt=(r,e)=>e>=r[0]&&e<=r[1],ot=w.True+w.First+w.Last,it=w.True+w.First,at=w.True+w.Last,z=(r,e)=>{for(let t of r)if(typeof t==\"number\"){if(t===e)return ot}else if(rt(t,e))return e===t[0]?it:e===t[1]?at:w.True;return w.False};var he=r=>{if(r.every(t=>typeof t==\"number\"))return r;let e=[];for(let t of r)if(typeof t==\"number\")e.push(t);else for(let s=t[0];s<=t[1];s++)e.push(s);return e};var fe=r=>r.type===\"VIEW_PORT_MENU_RESP\"&&r.action!==null&&x(r.action.table),x=r=>r!==null&&typeof r==\"object\"&&\"table\"in r&&\"module\"in r?r.table.startsWith(\"session\"):!1;var ut=[\"VIEW_PORT_MENUS_SELECT_RPC\",\"VIEW_PORT_MENU_TABLE_RPC\",\"VIEW_PORT_MENU_ROW_RPC\",\"VIEW_PORT_MENU_CELL_RPC\",\"VP_EDIT_CELL_RPC\",\"VP_EDIT_ROW_RPC\",\"VP_EDIT_ADD_ROW_RPC\",\"VP_EDIT_DELETE_CELL_RPC\",\"VP_EDIT_DELETE_ROW_RPC\",\"VP_EDIT_SUBMIT_FORM_RPC\"],me=r=>ut.includes(r.type),Ce=r=>r.type===\"VIEW_PORT_RPC_CALL\",A=({requestId:r,...e})=>[r,e],Re=r=>{let e=r.at(0);if(e.updateType===\"SIZE\"){if(r.length===1)return r;e=r.at(1)}let t=r.at(-1);return[e,t]},Se=r=>{let e={};for(let t of r)(e[t.viewPortId]||(e[t.viewPortId]=[])).push(t);return e},H=({columns:r,dataTypes:e,key:t,table:s})=>({table:s,columns:r.map((n,o)=>({name:n,serverDataType:e[o]})),key:t});var Te=\"CHANGE_VP_SUCCESS\";var be=\"CLOSE_TREE_NODE\",Ee=\"CLOSE_TREE_SUCCESS\";var we=\"CREATE_VP\",Ve=\"DISABLE_VP\",ve=\"DISABLE_VP_SUCCESS\";var ye=\"ENABLE_VP\",Me=\"ENABLE_VP_SUCCESS\";var K=\"GET_VP_VISUAL_LINKS\",_e=\"GET_VIEW_PORT_MENUS\";var Ie=\"HB\",De=\"HB_RESP\",Pe=\"LOGIN\",Le=\"OPEN_TREE_NODE\",ke=\"OPEN_TREE_SUCCESS\";var Oe=\"REMOVE_VP\";var xe=\"SET_SELECTION_SUCCESS\";var Ne=r=>{switch(r){case\"TypeAheadRpcHandler\":return\"TYPEAHEAD\";default:return\"SIMUL\"}};var Ue=[],R=b(\"array-backed-moving-window\");function lt(r,e){if(!e||e.data.length!==r.data.length||e.sel!==r.sel)return!1;for(let t=0;t<e.data.length;t++)if(e.data[t]!==r.data[t])return!1;return!0}var h,N=class{constructor({from:e,to:t},{from:s,to:n},o){ae(this,h,void 0);this.setRowCount=e=>{var t;if((t=R.info)==null||t.call(R,\\`setRowCount \\${e}\\`),e<this.internalData.length&&(this.internalData.length=e),e<this.rowCount){this.rowsWithinRange=0;let s=Math.min(e,this.clientRange.to);for(let n=this.clientRange.from;n<s;n++){let o=n-m(this,h).from;this.internalData[o]!==void 0&&(this.rowsWithinRange+=1)}}this.rowCount=e};this.bufferBreakout=(e,t)=>{let s=this.bufferSize*.25;return m(this,h).to-t<s?!0:m(this,h).from>0&&e-m(this,h).from<s};this.bufferSize=o,this.clientRange=new D(e,t),ue(this,h,new D(s,n)),this.internalData=new Array(o),this.rowsWithinRange=0,this.rowCount=0}get range(){return m(this,h)}get hasAllRowsWithinRange(){return this.rowsWithinRange===this.clientRange.to-this.clientRange.from||this.rowCount>0&&this.clientRange.from+this.rowsWithinRange===this.rowCount}outOfRange(e,t){let{from:s,to:n}=this.range;if(t<s||e>=n)return!0}setAtIndex(e){let{rowIndex:t}=e,s=t-m(this,h).from;if(lt(e,this.internalData[s]))return!1;let n=this.isWithinClientRange(t);return(n||this.isWithinRange(t))&&(!this.internalData[s]&&n&&(this.rowsWithinRange+=1),this.internalData[s]=e),n}getAtIndex(e){return m(this,h).isWithin(e)&&this.internalData[e-m(this,h).from]!=null?this.internalData[e-m(this,h).from]:void 0}isWithinRange(e){return m(this,h).isWithin(e)}isWithinClientRange(e){return this.clientRange.isWithin(e)}setClientRange(e,t){var p;(p=R.debug)==null||p.call(R,\\`setClientRange \\${e} - \\${t}\\`);let s=this.clientRange.from,n=Math.min(this.clientRange.to,this.rowCount);if(e===s&&t===n)return[!1,Ue];let o=this.clientRange.copy();this.clientRange.from=e,this.clientRange.to=t,this.rowsWithinRange=0;for(let a=e;a<t;a++){let l=a-m(this,h).from;this.internalData[l]&&(this.rowsWithinRange+=1)}let i=Ue,u=m(this,h).from;if(this.hasAllRowsWithinRange)if(t>o.to){let a=Math.max(e,o.to);i=this.internalData.slice(a-u,t-u)}else{let a=Math.min(o.from,t);i=this.internalData.slice(e-u,a-u)}return[this.bufferBreakout(e,t),i]}setRange(e,t){var s,n;if(e!==m(this,h).from||t!==m(this,h).to){(s=R.debug)==null||s.call(R,\\`setRange \\${e} - \\${t}\\`);let[o,i]=m(this,h).overlap(e,t),u=new Array(t-e);this.rowsWithinRange=0;for(let c=o;c<i;c++){let p=this.getAtIndex(c);if(p){let a=c-e;u[a]=p,this.isWithinClientRange(c)&&(this.rowsWithinRange+=1)}}this.internalData=u,m(this,h).from=e,m(this,h).to=t}else(n=R.debug)==null||n.call(R,\\`setRange \\${e} - \\${t} IGNORED because not changed\\`)}get data(){return this.internalData}getData(){var u;let{from:e,to:t}=m(this,h),{from:s,to:n}=this.clientRange,o=Math.max(0,s-e),i=Math.min(t-e,t,n-e,(u=this.rowCount)!=null?u:t);return this.internalData.slice(o,i)}clear(){var e;(e=R.debug)==null||e.call(R,\"clear\"),this.internalData.length=0,this.rowsWithinRange=0,this.setRowCount(0)}getCurrentDataRange(){let e=this.internalData,t=e.length,[s]=this.internalData,n=this.internalData[t-1];if(s&&n)return[s.rowIndex,n.rowIndex];for(let o=0;o<t;o++)if(e[o]!==void 0){s=e[o];break}for(let o=t-1;o>=0;o--)if(e[o]!==void 0){n=e[o];break}return s&&n?[s.rowIndex,n.rowIndex]:[-1,-1]}};h=new WeakMap;var ct=[],{debug:f,debugEnabled:U,error:pt,info:d,infoEnabled:dt,warn:y}=b(\"viewport\"),gt=({rowKey:r,updateType:e})=>e===\"U\"&&!r.startsWith(\"\\$root\"),W=[void 0,void 0],ht={count:0,mode:void 0,size:0,ts:0},q=class{constructor({aggregations:e,bufferSize:t=50,columns:s,filter:n,groupBy:o=[],table:i,range:u,sort:c,title:p,viewport:a,visualLink:l},g){this.batchMode=!0;this.hasUpdates=!1;this.pendingUpdates=[];this.pendingOperations=new Map;this.pendingRangeRequests=[];this.rowCountChanged=!1;this.selectedRows=[];this.useBatchMode=!0;this.lastUpdateStatus=ht;this.updateThrottleTimer=void 0;this.rangeMonitor=new k(\"ViewPort\");this.disabled=!1;this.isTree=!1;this.status=\"\";this.suspended=!1;this.suspendTimer=null;this.setLastSizeOnlyUpdateSize=e=>{this.lastUpdateStatus.size=e};this.setLastUpdate=e=>{let{ts:t,mode:s}=this.lastUpdateStatus,n=0;if(s===e){let o=Date.now();this.lastUpdateStatus.count+=1,this.lastUpdateStatus.ts=o,n=t===0?0:o-t}else this.lastUpdateStatus.count=1,this.lastUpdateStatus.ts=0,n=0;return this.lastUpdateStatus.mode=e,n};this.rangeRequestAlreadyPending=e=>{let{bufferSize:t}=this,s=t*.25,{from:n}=e;for(let{from:o,to:i}of this.pendingRangeRequests)if(n>=o&&n<i){if(e.to+s<=i)return!0;n=i}return!1};this.sendThrottledSizeMessage=()=>{this.updateThrottleTimer=void 0,this.lastUpdateStatus.count=3,this.postMessageToClient({clientViewportId:this.clientViewportId,mode:\"size-only\",size:this.lastUpdateStatus.size,type:\"viewport-update\"})};this.shouldThrottleMessage=e=>{let t=this.setLastUpdate(e);return e===\"size-only\"&&t>0&&t<500&&this.lastUpdateStatus.count>3};this.throttleMessage=e=>this.shouldThrottleMessage(e)?(d==null||d(\"throttling updates setTimeout to 2000\"),this.updateThrottleTimer===void 0&&(this.updateThrottleTimer=setTimeout(this.sendThrottledSizeMessage,2e3)),!0):(this.updateThrottleTimer!==void 0&&(clearTimeout(this.updateThrottleTimer),this.updateThrottleTimer=void 0),!1);this.getNewRowCount=()=>{if(this.rowCountChanged&&this.dataWindow)return this.rowCountChanged=!1,this.dataWindow.rowCount};this.aggregations=e,this.bufferSize=t,this.clientRange=u,this.clientViewportId=a,this.columns=s,this.filter=n,this.groupBy=o,this.keys=new O(u),this.pendingLinkedParent=l,this.table=i,this.sort=c,this.title=p,dt&&(d==null||d(\\`constructor #\\${a} \\${i.table} bufferSize=\\${t}\\`)),this.dataWindow=new N(this.clientRange,u,this.bufferSize),this.postMessageToClient=g}get hasUpdatesToProcess(){return this.suspended?!1:this.rowCountChanged||this.hasUpdates}get size(){var e;return(e=this.dataWindow.rowCount)!=null?e:0}subscribe(){let{filter:e}=this.filter;return this.status=this.status===\"subscribed\"?\"resubscribing\":\"subscribing\",{type:we,table:this.table,range:G(this.clientRange,this.bufferSize),aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:e}}}handleSubscribed({viewPortId:e,aggregations:t,columns:s,filterSpec:n,range:o,sort:i,groupBy:u},c){return this.serverViewportId=e,this.status=\"subscribed\",this.aggregations=t,this.columns=s,this.groupBy=u,this.isTree=u&&u.length>0,this.dataWindow.setRange(o.from,o.to),{aggregations:t,type:\"subscribed\",clientViewportId:this.clientViewportId,columns:s,filter:n,groupBy:u,range:o,sort:i,tableSchema:c}}awaitOperation(e,t){this.pendingOperations.set(e,t)}completeOperation(e,...t){var u;let{clientViewportId:s,pendingOperations:n}=this,o=n.get(e);if(!o){pt(\\`no matching operation found to complete for requestId \\${e}\\`);return}let{type:i}=o;if(d==null||d(\\`completeOperation \\${i}\\`),n.delete(e),i===\"CHANGE_VP_RANGE\"){let[c,p]=t;(u=this.dataWindow)==null||u.setRange(c,p);for(let a=this.pendingRangeRequests.length-1;a>=0;a--){let l=this.pendingRangeRequests[a];if(l.requestId===e){l.acked=!0;break}else y==null||y(\"range requests sent faster than they are being ACKed\")}}else if(i===\"config\"){let{aggregations:c,columns:p,filter:a,groupBy:l,sort:g}=o.data;return this.aggregations=c,this.columns=p,this.filter=a,this.groupBy=l,this.sort=g,l.length>0?this.isTree=!0:this.isTree&&(this.isTree=!1),f==null||f(\\`config change confirmed, isTree : \\${this.isTree}\\`),{clientViewportId:s,type:i,config:o.data}}else{if(i===\"groupBy\")return this.isTree=o.data.length>0,this.groupBy=o.data,f==null||f(\\`groupBy change confirmed, isTree : \\${this.isTree}\\`),{clientViewportId:s,type:i,groupBy:o.data};if(i===\"columns\")return this.columns=o.data,{clientViewportId:s,type:i,columns:o.data};if(i===\"filter\")return this.filter=o.data,{clientViewportId:s,type:i,filter:o.data};if(i===\"aggregate\")return this.aggregations=o.data,{clientViewportId:s,type:\"aggregate\",aggregations:this.aggregations};if(i===\"sort\")return this.sort=o.data,{clientViewportId:s,type:i,sort:this.sort};if(i!==\"selection\"){if(i===\"disable\")return this.disabled=!0,{type:\"disabled\",clientViewportId:s};if(i===\"enable\")return this.disabled=!1,{type:\"enabled\",clientViewportId:s};if(i===\"CREATE_VISUAL_LINK\"){let[c,p,a]=t;return this.linkedParent={colName:c,parentViewportId:p,parentColName:a},this.pendingLinkedParent=void 0,{type:\"vuu-link-created\",clientViewportId:s,colName:c,parentViewportId:p,parentColName:a}}else if(i===\"REMOVE_VISUAL_LINK\")return this.linkedParent=void 0,{type:\"vuu-link-removed\",clientViewportId:s}}}}rangeRequest(e,t){U&&this.rangeMonitor.set(t);let s=\"CHANGE_VP_RANGE\";if(this.dataWindow){let[n,o]=this.dataWindow.setClientRange(t.from,t.to),i,u=this.dataWindow.rowCount||void 0,c=n&&!this.rangeRequestAlreadyPending(t)?{type:s,viewPortId:this.serverViewportId,...G(t,this.bufferSize,u)}:null;if(c){U&&(f==null||f(\\`create CHANGE_VP_RANGE: [\\${c.from} - \\${c.to}]\\`)),this.awaitOperation(e,{type:s});let a=this.pendingRangeRequests.at(-1);if(a)if(a.acked)console.warn(\"Range Request before previous request is filled\");else{let{from:l,to:g}=a;this.dataWindow.outOfRange(l,g)?i={clientViewportId:this.clientViewportId,type:\"debounce-begin\"}:y==null||y(\"Range Request before previous request is acked\")}this.pendingRangeRequests.push({...c,requestId:e}),this.useBatchMode&&(this.batchMode=!0)}else o.length>0&&(this.batchMode=!1);this.keys.reset(this.dataWindow.clientRange);let p=this.isTree?j:J;return o.length?[c,o.map(a=>p(a,this.keys,this.selectedRows))]:i?[c,void 0,i]:[c]}else return[null]}setLinks(e){return this.links=e,[{type:\"vuu-links\",links:e,clientViewportId:this.clientViewportId},this.pendingLinkedParent]}setMenu(e){return{type:\"vuu-menu\",menu:e,clientViewportId:this.clientViewportId}}openTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:Le,vpId:this.serverViewportId,treeKey:t.key}}closeTreeNode(e,t){return this.useBatchMode&&(this.batchMode=!0),{type:be,vpId:this.serverViewportId,treeKey:t.key}}createLink(e,t,s,n){let o={type:\"CREATE_VISUAL_LINK\",parentVpId:s,childVpId:this.serverViewportId,parentColumnName:n,childColumnName:t};return this.awaitOperation(e,o),this.useBatchMode&&(this.batchMode=!0),o}removeLink(e){let t={type:\"REMOVE_VISUAL_LINK\",childVpId:this.serverViewportId};return this.awaitOperation(e,t),t}suspend(){this.suspended=!0,d==null||d(\"suspend\")}resume(){return this.suspended=!1,U&&(f==null||f(\\`resume: \\${this.currentData()}\\`)),[this.size,this.currentData()]}currentData(){let e=[];if(this.dataWindow){let t=this.dataWindow.getData(),{keys:s}=this,n=this.isTree?j:J;for(let o of t)o&&e.push(n(o,s,this.selectedRows))}return e}enable(e){return this.awaitOperation(e,{type:\"enable\"}),d==null||d(\\`enable: \\${this.serverViewportId}\\`),{type:ye,viewPortId:this.serverViewportId}}disable(e){return this.awaitOperation(e,{type:\"disable\"}),d==null||d(\\`disable: \\${this.serverViewportId}\\`),this.suspended=!1,{type:Ve,viewPortId:this.serverViewportId}}columnRequest(e,t){return this.awaitOperation(e,{type:\"columns\",data:t}),f==null||f(\\`columnRequest: \\${t}\\`),this.createRequest({columns:t})}filterRequest(e,t){this.awaitOperation(e,{type:\"filter\",data:t}),this.useBatchMode&&(this.batchMode=!0);let{filter:s}=t;return d==null||d(\\`filterRequest: \\${s}\\`),this.createRequest({filterSpec:{filter:s}})}setConfig(e,t){this.awaitOperation(e,{type:\"config\",data:t});let{filter:s,...n}=t;return this.useBatchMode&&(this.batchMode=!0),U?f==null||f(\\`setConfig \\${JSON.stringify(t)}\\`):d==null||d(\"setConfig\"),this.createRequest({...n,filterSpec:typeof(s==null?void 0:s.filter)==\"string\"?{filter:s.filter}:{filter:\"\"}},!0)}aggregateRequest(e,t){return this.awaitOperation(e,{type:\"aggregate\",data:t}),d==null||d(\\`aggregateRequest: \\${t}\\`),this.createRequest({aggregations:t})}sortRequest(e,t){return this.awaitOperation(e,{type:\"sort\",data:t}),d==null||d(\\`sortRequest: \\${JSON.stringify(t.sortDefs)}\\`),this.createRequest({sort:t})}groupByRequest(e,t=ct){var s;return this.awaitOperation(e,{type:\"groupBy\",data:t}),this.useBatchMode&&(this.batchMode=!0),this.isTree||(s=this.dataWindow)==null||s.clear(),this.createRequest({groupBy:t})}selectRequest(e,t){return this.selectedRows=t,this.awaitOperation(e,{type:\"selection\",data:t}),d==null||d(\\`selectRequest: \\${t}\\`),{type:\"SET_SELECTION\",vpId:this.serverViewportId,selection:he(t)}}removePendingRangeRequest(e,t){for(let s=this.pendingRangeRequests.length-1;s>=0;s--){let{from:n,to:o}=this.pendingRangeRequests[s],i=!0;if(e>=n&&e<o||t>n&&t<o){i||console.warn(\"removePendingRangeRequest TABLE_ROWS are not for latest request\"),this.pendingRangeRequests.splice(s,1);break}else i=!1}}updateRows(e){var n,o,i;let[t,s]=Re(e);if(t&&s&&this.removePendingRangeRequest(t.rowIndex,s.rowIndex),e.length===1)if(t.vpSize===0&&this.disabled){f==null||f(\\`ignore a SIZE=0 message on disabled viewport (\\${e.length} rows)\\`);return}else t.updateType===\"SIZE\"&&this.setLastSizeOnlyUpdateSize(t.vpSize);for(let u of e)this.isTree&&gt(u)||((u.updateType===\"SIZE\"||((n=this.dataWindow)==null?void 0:n.rowCount)!==u.vpSize)&&((o=this.dataWindow)==null||o.setRowCount(u.vpSize),this.rowCountChanged=!0),u.updateType===\"U\"&&(i=this.dataWindow)!=null&&i.setAtIndex(u)&&(this.hasUpdates=!0,this.batchMode||this.pendingUpdates.push(u)))}getClientRows(){let e,t=\"size-only\";if(!this.hasUpdates&&!this.rowCountChanged)return W;if(this.hasUpdates){let{keys:s,selectedRows:n}=this,o=this.isTree?j:J;if(this.updateThrottleTimer&&(self.clearTimeout(this.updateThrottleTimer),this.updateThrottleTimer=void 0),this.pendingUpdates.length>0){e=[],t=\"update\";for(let i of this.pendingUpdates)e.push(o(i,s,n));this.pendingUpdates.length=0}else{let i=this.dataWindow.getData();if(this.dataWindow.hasAllRowsWithinRange){e=[],t=\"batch\";for(let u of i)e.push(o(u,s,n));this.batchMode=!1}}this.hasUpdates=!1}return this.throttleMessage(t)?W:[e,t]}createRequest(e,t=!1){return t?{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,...e}:{type:\"CHANGE_VP\",viewPortId:this.serverViewportId,aggregations:this.aggregations,columns:this.columns,sort:this.sort,groupBy:this.groupBy,filterSpec:{filter:this.filter.filter},...e}}},J=({rowIndex:r,rowKey:e,sel:t,data:s},n,o)=>[r,n.keyFor(r),!0,!1,0,0,e,t?z(o,r):0].concat(s),j=({rowIndex:r,rowKey:e,sel:t,data:s},n,o)=>{let[i,u,,c,,p,...a]=s;return[r,n.keyFor(r),c,u,i,p,e,t?z(o,r):0].concat(a)};var We=1;var{debug:V,debugEnabled:Q,error:M,info:T,infoEnabled:ft,warn:Y}=b(\"server-proxy\"),C=()=>\\`\\${We++}\\`,mt={},Ct=r=>r.disabled!==!0&&r.suspended!==!0,Rt={type:\"NO_ACTION\"},St=(r,e,t)=>r.map(s=>s.parentVpId===e?{...s,label:t}:s);function Tt(r,e){return r.map(t=>{let{parentVpId:s}=t,n=e.get(s);if(n)return{...t,parentClientVpId:n.clientViewportId,label:n.title};throw Error(\"addLabelsToLinks viewport not found\")})}var F=class{constructor(e,t){this.authToken=\"\";this.user=\"user\";this.pendingRequests=new Map;this.queuedRequests=[];this.cachedTableMetaRequests=new Map;this.cachedTableSchemas=new Map;this.connection=e,this.postMessageToClient=t,this.viewports=new Map,this.mapClientToServerViewport=new Map}async reconnect(){await this.login(this.authToken);let[e,t]=le(Array.from(this.viewports.values()),Ct);this.viewports.clear(),this.mapClientToServerViewport.clear();let s=n=>{n.forEach(o=>{let{clientViewportId:i}=o;this.viewports.set(i,o),this.sendMessageToServer(o.subscribe(),i)})};s(e),setTimeout(()=>{s(t)},2e3)}async login(e,t=\"user\"){if(e)return this.authToken=e,this.user=t,new Promise((s,n)=>{this.sendMessageToServer({type:Pe,token:this.authToken,user:t},\"\"),this.pendingLogin={resolve:s,reject:n}});this.authToken===\"\"&&M(\"login, cannot login until auth token has been obtained\")}subscribe(e){if(this.mapClientToServerViewport.has(e.viewport))M(\\`spurious subscribe call \\${e.viewport}\\`);else{let t=this.getTableMeta(e.table),s=new q(e,this.postMessageToClient);this.viewports.set(e.viewport,s);let n=this.awaitResponseToMessage(s.subscribe(),e.viewport);Promise.all([n,t]).then(([i,u])=>{let{viewPortId:c}=i,{status:p}=s;e.viewport!==c&&(this.viewports.delete(e.viewport),this.viewports.set(c,s)),this.mapClientToServerViewport.set(e.viewport,c);let a=s.handleSubscribed(i,u);a&&(this.postMessageToClient(a),Q&&V(\\`post DataSourceSubscribedMessage to client: \\${JSON.stringify(a)}\\`)),s.disabled&&this.disableViewport(s),this.queuedRequests.length>0&&this.processQueuedRequests(),p===\"subscribing\"&&!x(s.table)&&(this.sendMessageToServer({type:K,vpId:c}),this.sendMessageToServer({type:_e,vpId:c}),Array.from(this.viewports.entries()).filter(([l,{disabled:g}])=>l!==c&&!g).forEach(([l])=>{this.sendMessageToServer({type:K,vpId:l})}))})}}processQueuedRequests(){let e={};for(;this.queuedRequests.length;){let t=this.queuedRequests.pop();if(t){let{clientViewportId:s,message:n,requestId:o}=t;if(n.type===\"CHANGE_VP_RANGE\"){if(e.CHANGE_VP_RANGE)continue;e.CHANGE_VP_RANGE=!0;let i=this.mapClientToServerViewport.get(s);i&&this.sendMessageToServer({...n,viewPortId:i},o)}}}}unsubscribe(e){let t=this.mapClientToServerViewport.get(e);t?(T==null||T(\\`Unsubscribe Message (Client to Server):\n \\${t}\\`),this.sendMessageToServer({type:Oe,viewPortId:t})):M(\\`failed to unsubscribe client viewport \\${e}, viewport not found\\`)}getViewportForClient(e,t=!0){let s=this.mapClientToServerViewport.get(e);if(s){let n=this.viewports.get(s);if(n)return n;if(t)throw Error(\\`Viewport not found for client viewport \\${e}\\`);return null}else{if(this.viewports.has(e))return this.viewports.get(e);if(t)throw Error(\\`Viewport server id not found for client viewport \\${e}\\`);return null}}setViewRange(e,t){let s=C(),[n,o,i]=e.rangeRequest(s,t.range);T==null||T(\\`setViewRange \\${t.range.from} - \\${t.range.to}\\`),n&&(this.sendIfReady(n,s,e.status===\"subscribed\")||this.queuedRequests.push({clientViewportId:t.viewport,message:n,requestId:s})),o?(T==null||T(\\`setViewRange \\${o.length} rows returned from cache\\`),this.postMessageToClient({mode:\"batch\",type:\"viewport-update\",clientViewportId:e.clientViewportId,rows:o})):i&&this.postMessageToClient(i)}setConfig(e,t){let s=C(),n=e.setConfig(s,t.config);this.sendIfReady(n,s,e.status===\"subscribed\")}aggregate(e,t){let s=C(),n=e.aggregateRequest(s,t.aggregations);this.sendIfReady(n,s,e.status===\"subscribed\")}sort(e,t){let s=C(),n=e.sortRequest(s,t.sort);this.sendIfReady(n,s,e.status===\"subscribed\")}groupBy(e,t){let s=C(),n=e.groupByRequest(s,t.groupBy);this.sendIfReady(n,s,e.status===\"subscribed\")}filter(e,t){let s=C(),{filter:n}=t,o=e.filterRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}setColumns(e,t){let s=C(),{columns:n}=t,o=e.columnRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}setTitle(e,t){e&&(e.title=t.title,this.updateTitleOnVisualLinks(e))}select(e,t){let s=C(),{selected:n}=t,o=e.selectRequest(s,n);this.sendIfReady(o,s,e.status===\"subscribed\")}disableViewport(e){let t=C(),s=e.disable(t);this.sendIfReady(s,t,e.status===\"subscribed\")}enableViewport(e){if(e.disabled){let t=C(),s=e.enable(t);this.sendIfReady(s,t,e.status===\"subscribed\")}}suspendViewport(e){e.suspend(),e.suspendTimer=setTimeout(()=>{T==null||T(\"suspendTimer expired, escalate suspend to disable\"),this.disableViewport(e)},3e3)}resumeViewport(e){e.suspendTimer&&(V==null||V(\"clear suspend timer\"),clearTimeout(e.suspendTimer),e.suspendTimer=null);let[t,s]=e.resume();V==null||V(\\`resumeViewport size \\${t}, \\${s.length} rows sent to client\\`),this.postMessageToClient({clientViewportId:e.clientViewportId,mode:\"batch\",rows:s,size:t,type:\"viewport-update\"})}openTreeNode(e,t){if(e.serverViewportId){let s=C();this.sendIfReady(e.openTreeNode(s,t),s,e.status===\"subscribed\")}}closeTreeNode(e,t){if(e.serverViewportId){let s=C();this.sendIfReady(e.closeTreeNode(s,t),s,e.status===\"subscribed\")}}createLink(e,t){let{parentClientVpId:s,parentColumnName:n,childColumnName:o}=t,i=C(),u=this.mapClientToServerViewport.get(s);if(u){let c=e.createLink(i,o,u,n);this.sendMessageToServer(c,i)}else M(\"ServerProxy unable to create link, viewport not found\")}removeLink(e){let t=C(),s=e.removeLink(t);this.sendMessageToServer(s,t)}updateTitleOnVisualLinks(e){var n;let{serverViewportId:t,title:s}=e;for(let o of this.viewports.values())if(o!==e&&o.links&&t&&s&&(n=o.links)!=null&&n.some(i=>i.parentVpId===t)){let[i]=o.setLinks(St(o.links,t,s));this.postMessageToClient(i)}}removeViewportFromVisualLinks(e){var t;for(let s of this.viewports.values())if((t=s.links)!=null&&t.some(({parentVpId:n})=>n===e)){let[n]=s.setLinks(s.links.filter(({parentVpId:o})=>o!==e));this.postMessageToClient(n)}}menuRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[s,n]=A(e);this.sendMessageToServer({...n,vpId:t.serverViewportId},s)}}viewportRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[s,n]=A(e);this.sendMessageToServer({...n,vpId:t.serverViewportId,namedParams:{}},s)}}rpcCall(e){let[t,s]=A(e),n=Ne(s.service);this.sendMessageToServer(s,t,{module:n})}handleMessageFromClient(e){var t;if(ge(e))if(e.type===\"disable\"){let s=this.getViewportForClient(e.viewport,!1);return s!==null?this.disableViewport(s):void 0}else{let s=this.getViewportForClient(e.viewport);switch(e.type){case\"setViewRange\":return this.setViewRange(s,e);case\"config\":return this.setConfig(s,e);case\"aggregate\":return this.aggregate(s,e);case\"sort\":return this.sort(s,e);case\"groupBy\":return this.groupBy(s,e);case\"filter\":return this.filter(s,e);case\"select\":return this.select(s,e);case\"suspend\":return this.suspendViewport(s);case\"resume\":return this.resumeViewport(s);case\"enable\":return this.enableViewport(s);case\"openTreeNode\":return this.openTreeNode(s,e);case\"closeTreeNode\":return this.closeTreeNode(s,e);case\"createLink\":return this.createLink(s,e);case\"removeLink\":return this.removeLink(s);case\"setColumns\":return this.setColumns(s,e);case\"setTitle\":return this.setTitle(s,e);default:}}else{if(Ce(e))return this.viewportRpcCall(e);if(me(e))return this.menuRpcCall(e);{let{type:s,requestId:n}=e;switch(s){case\"GET_TABLE_LIST\":{(t=this.tableList)!=null||(this.tableList=this.awaitResponseToMessage({type:s},n)),this.tableList.then(o=>{this.postMessageToClient({type:\"TABLE_LIST_RESP\",tables:o.tables,requestId:n})});return}case\"GET_TABLE_META\":{this.getTableMeta(e.table,n).then(o=>{o&&this.postMessageToClient({type:\"TABLE_META_RESP\",tableSchema:o,requestId:n})});return}case\"RPC_CALL\":return this.rpcCall(e);default:}}}M(\\`Vuu ServerProxy Unexpected message from client \\${JSON.stringify(e)}\\`)}getTableMeta(e,t=C()){if(x(e))return Promise.resolve(void 0);let s=\\`\\${e.module}:\\${e.table}\\`,n=this.cachedTableMetaRequests.get(s);return n||(n=this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:e},t),this.cachedTableMetaRequests.set(s,n)),n==null?void 0:n.then(o=>this.cacheTableMeta(o))}awaitResponseToMessage(e,t=C()){return new Promise((s,n)=>{this.sendMessageToServer(e,t),this.pendingRequests.set(t,{reject:n,resolve:s})})}sendIfReady(e,t,s=!0){return s&&this.sendMessageToServer(e,t),s}sendMessageToServer(e,t=\\`\\${We++}\\`,s=mt){let{module:n=\"CORE\"}=s;this.authToken&&this.connection.send({requestId:t,sessionId:this.sessionId,token:this.authToken,user:this.user,module:n,body:e})}handleMessageFromServer(e){var u;let{body:t,requestId:s,sessionId:n}=e,o=this.pendingRequests.get(s);if(o){let{resolve:a}=o;this.pendingRequests.delete(s),a(t);return}let{viewports:i}=this;switch(t.type){case Ie:this.sendMessageToServer({type:De,ts:+new Date},\"NA\");break;case\"LOGIN_SUCCESS\":if(n)this.sessionId=n,(u=this.pendingLogin)==null||u.resolve(n),this.pendingLogin=void 0;else throw Error(\"LOGIN_SUCCESS did not provide sessionId\");break;case\"REMOVE_VP_SUCCESS\":{let a=i.get(t.viewPortId);a&&(this.mapClientToServerViewport.delete(a.clientViewportId),i.delete(t.viewPortId),this.removeViewportFromVisualLinks(t.viewPortId))}break;case xe:{let a=this.viewports.get(t.vpId);a&&a.completeOperation(s)}break;case Te:case ve:if(i.has(t.viewPortId)){let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(s);l!==void 0&&(this.postMessageToClient(l),Q&&V(\\`postMessageToClient \\${JSON.stringify(l)}\\`))}}break;case Me:{let a=this.viewports.get(t.viewPortId);if(a){let l=a.completeOperation(s);if(l){this.postMessageToClient(l);let[g,S]=a.resume();this.postMessageToClient({clientViewportId:a.clientViewportId,mode:\"batch\",rows:S,size:g,type:\"viewport-update\"})}}}break;case\"TABLE_ROW\":{let a=Se(t.rows);for(let[l,g]of Object.entries(a)){let S=i.get(l);S?S.updateRows(g):Y==null||Y(\\`TABLE_ROW message received for non registered viewport \\${l}\\`)}this.processUpdates()}break;case\"CHANGE_VP_RANGE_SUCCESS\":{let a=this.viewports.get(t.viewPortId);if(a){let{from:l,to:g}=t;a.completeOperation(s,l,g)}}break;case ke:case Ee:break;case\"CREATE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId),l=this.viewports.get(t.parentVpId);if(a&&l){let{childColumnName:g,parentColumnName:S}=t,I=a.completeOperation(s,g,l.clientViewportId,S);I&&this.postMessageToClient(I)}}break;case\"REMOVE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId);if(a){let l=a.completeOperation(s);l&&this.postMessageToClient(l)}}break;case\"VP_VISUAL_LINKS_RESP\":{let a=this.getActiveLinks(t.links),l=this.viewports.get(t.vpId);if(a.length&&l){let g=Tt(a,this.viewports),[S,I]=l.setLinks(g);if(this.postMessageToClient(S),I){let{link:ne,parentClientVpId:Ke}=I,re=C(),oe=this.mapClientToServerViewport.get(Ke);if(oe){let Je=l.createLink(re,ne.fromColumn,oe,ne.toColumn);this.sendMessageToServer(Je,re)}}}}break;case\"VIEW_PORT_MENUS_RESP\":if(t.menu.name){let a=this.viewports.get(t.vpId);if(a){let l=a.setMenu(t.menu);this.postMessageToClient(l)}}break;case\"VP_EDIT_RPC_RESPONSE\":this.postMessageToClient({action:t.action,requestId:s,rpcName:t.rpcName,type:\"VP_EDIT_RPC_RESPONSE\"});break;case\"VP_EDIT_RPC_REJECT\":this.viewports.get(t.vpId)&&this.postMessageToClient({requestId:s,type:\"VP_EDIT_RPC_REJECT\",error:t.error});break;case\"VIEW_PORT_MENU_REJ\":{console.log(\"send menu error back to client\");let{error:a,rpcName:l,vpId:g}=t,S=this.viewports.get(g);S&&this.postMessageToClient({clientViewportId:S.clientViewportId,error:a,rpcName:l,type:\"VIEW_PORT_MENU_REJ\",requestId:s});break}case\"VIEW_PORT_MENU_RESP\":if(fe(t)){let{action:a,rpcName:l}=t;this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:a.table}).then(g=>{let S=H(g);this.postMessageToClient({rpcName:l,type:\"VIEW_PORT_MENU_RESP\",action:{...a,tableSchema:S},tableAlreadyOpen:this.isTableOpen(a.table),requestId:s})})}else{let{action:a}=t;this.postMessageToClient({type:\"VIEW_PORT_MENU_RESP\",action:a||Rt,tableAlreadyOpen:a!==null&&this.isTableOpen(a.table),requestId:s})}break;case\"RPC_RESP\":{let{method:a,result:l}=t;this.postMessageToClient({type:\"RPC_RESP\",method:a,result:l,requestId:s})}break;case\"VIEW_PORT_RPC_REPONSE\":{let{method:a,action:l}=t;this.postMessageToClient({type:\"VIEW_PORT_RPC_RESPONSE\",rpcName:a,action:l,requestId:s})}break;case\"ERROR\":M(t.msg);break;default:ft&&T(\\`handleMessageFromServer \\${t.type}.\\`)}}cacheTableMeta(e){let{module:t,table:s}=e.table,n=\\`\\${t}:\\${s}\\`,o=this.cachedTableSchemas.get(n);return o||(o=H(e),this.cachedTableSchemas.set(n,o)),o}isTableOpen(e){if(e){let t=e.table;for(let s of this.viewports.values())if(!s.suspended&&s.table.table===t)return!0}}getActiveLinks(e){return e.filter(t=>{let s=this.viewports.get(t.parentVpId);return s&&!s.suspended})}processUpdates(){this.viewports.forEach(e=>{var t;if(e.hasUpdatesToProcess){let s=e.getClientRows();if(s!==W){let[n,o]=s,i=e.getNewRowCount();(i!==void 0||n&&n.length>0)&&(Q&&V(\\`postMessageToClient #\\${e.clientViewportId} viewport-update \\${o}, \\${(t=n==null?void 0:n.length)!=null?t:\"no\"} rows, size \\${i}\\`),o&&this.postMessageToClient({clientViewportId:e.clientViewportId,mode:o,rows:n,size:i,type:\"viewport-update\"}))}}})}};var{debug:us,debugEnabled:ls,error:qe,info:E,infoEnabled:bt,warn:_}=b(\"websocket-connection\"),Fe=\"ws\",Et=r=>r.startsWith(Fe+\"://\")||r.startsWith(Fe+\"s://\"),Ge={},X=Symbol(\"setWebsocket\"),B=Symbol(\"connectionCallback\");async function ze(r,e,t,s=10,n=5){return Ge[r]={status:\"connecting\",connect:{allowed:n,remaining:n},reconnect:{allowed:s,remaining:s}},He(r,e,t)}async function Z(r){throw Error(\"connection broken\")}async function He(r,e,t,s){let{status:n,connect:o,reconnect:i}=Ge[r],u=n===\"connecting\"?o:i;try{t({type:\"connection-status\",status:\"connecting\"});let c=typeof s<\"u\",p=await Vt(r,e);console.info(\"%c\\u26A1 %cconnected\",\"font-size: 24px;color: green;font-weight: bold;\",\"color:green; font-size: 14px;\"),s!==void 0&&s[X](p);let a=s!=null?s:new ee(p,r,e,t),l=c?\"reconnected\":\"connection-open-awaiting-session\";return t({type:\"connection-status\",status:l}),a.status=l,u.remaining=u.allowed,a}catch{let p=--u.remaining>0;if(t({type:\"connection-status\",status:\"disconnected\",reason:\"failed to connect\",retry:p}),p)return wt(r,e,t,s,2e3);throw Error(\"Failed to establish connection\")}}var wt=(r,e,t,s,n)=>new Promise(o=>{setTimeout(()=>{o(He(r,e,t,s))},n)}),Vt=(r,e)=>new Promise((t,s)=>{let n=Et(r)?r:\\`wss://\\${r}\\`;bt&&e!==void 0&&E(\\`WebSocket Protocol \\${e==null?void 0:e.toString()}\\`);let o=new WebSocket(n,e);o.onopen=()=>t(o),o.onerror=i=>s(i)}),Be=()=>{_==null||_(\"Connection cannot be closed, socket not yet opened\")},\\$e=r=>{_==null||_(\\`Message cannot be sent, socket closed \\${r.body.type}\\`)},vt=r=>{try{return JSON.parse(r)}catch{throw Error(\\`Error parsing JSON response from server \\${r}\\`)}},ee=class{constructor(e,t,s,n){this.close=Be;this.requiresLogin=!0;this.send=\\$e;this.status=\"ready\";this.messagesCount=0;this.connectionMetricsInterval=null;this.handleWebsocketMessage=e=>{let t=vt(e.data);this.messagesCount+=1,this[B](t)};this.url=t,this.protocol=s,this[B]=n,this[X](e)}reconnect(){Z(this)}[(B,X)](e){let t=this[B];e.onmessage=o=>{this.status=\"connected\",e.onmessage=this.handleWebsocketMessage,this.handleWebsocketMessage(o)},this.connectionMetricsInterval=setInterval(()=>{t({type:\"connection-metrics\",messagesLength:this.messagesCount}),this.messagesCount=0},2e3),e.onerror=()=>{qe(\"\\u26A1 connection error\"),t({type:\"connection-status\",status:\"disconnected\",reason:\"error\"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status===\"connection-open-awaiting-session\"?qe(\"Websocket connection lost before Vuu session established, check websocket configuration\"):this.status!==\"closed\"&&(Z(this),this.send=n)},e.onclose=()=>{E==null||E(\"\\u26A1 connection close\"),t({type:\"connection-status\",status:\"disconnected\",reason:\"close\"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status!==\"closed\"&&(Z(this),this.send=n)};let s=o=>{e.send(JSON.stringify(o))},n=o=>{E==null||E(\\`TODO queue message until websocket reconnected \\${o.body.type}\\`)};this.send=s,this.close=()=>{this.status=\"closed\",e.close(),this.close=Be,this.send=\\$e,E==null||E(\"close websocket\")}}};var v,{info:te,infoEnabled:se}=b(\"worker\");async function yt(r,e,t,s,n,o,i){let u=await ze(r,e,c=>{de(c)?postMessage({type:\"connection-metrics\",messages:c}):pe(c)?(n(c),c.status===\"reconnected\"&&v.reconnect()):v.handleMessageFromServer(c)},o,i);v=new F(u,c=>Mt(c)),u.requiresLogin&&await v.login(t,s)}function Mt(r){postMessage(r)}var _t=async({data:r})=>{switch(r.type){case\"connect\":await yt(r.url,r.protocol,r.token,r.username,postMessage,r.retryLimitDisconnect,r.retryLimitStartup),postMessage({type:\"connected\"});break;case\"subscribe\":se&&te(\\`client subscribe: \\${JSON.stringify(r)}\\`),v.subscribe(r);break;case\"unsubscribe\":se&&te(\\`client unsubscribe: \\${JSON.stringify(r)}\\`),v.unsubscribe(r.viewport);break;default:se&&te(\\`client message: \\${JSON.stringify(r)}\\`),v.handleMessageFromClient(r)}};self.addEventListener(\"message\",_t);postMessage({type:\"ready\"});\n\n`;", "let _connectionId = 0;\n\nexport const connectionId = {\n get nextValue() {\n return _connectionId++;\n },\n};\n\nexport const msgType = {\n connect: \"connect\",\n connectionStatus: \"connection-status\",\n getFilterData: \"GetFilterData\",\n rowData: \"rowData\",\n rowSet: \"rowset\",\n select: \"select\",\n selectAll: \"selectAll\",\n selectNone: \"selectNone\",\n selected: \"selected\",\n snapshot: \"snapshot\",\n update: \"update\",\n createLink: \"createLink\",\n disable: \"disable\",\n enable: \"enable\",\n suspend: \"suspend\",\n resume: \"resume\",\n\n addSubscription: \"AddSubscription\",\n closeTreeNode: \"closeTreeNode\",\n columnList: \"ColumnList\",\n data: \"data\",\n openTreeNode: \"openTreeNode\",\n aggregate: \"aggregate\",\n filter: \"filter\",\n filterQuery: \"filterQuery\",\n filterData: \"filterData\",\n getSearchData: \"GetSearchData\",\n groupBy: \"groupBy\",\n modifySubscription: \"ModifySubscription\",\n searchData: \"searchData\",\n setGroupState: \"setGroupState\",\n size: \"size\",\n sort: \"sort\",\n subscribed: \"Subscribed\",\n tableList: \"TableList\",\n unsubscribe: \"TerminateSubscription\",\n viewRangeChanged: \"ViewRangeChanged\",\n};\n", "import {\n SchemaColumn,\n TableSchema,\n VuuUIMessageOut,\n WithRequestId,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n VuuRow,\n VuuRpcRequest,\n VuuTable,\n VuuTableMeta,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n \"VP_EDIT_CELL_RPC\",\n \"VP_EDIT_ROW_RPC\",\n \"VP_EDIT_ADD_ROW_RPC\",\n \"VP_EDIT_DELETE_CELL_RPC\",\n \"VP_EDIT_DELETE_ROW_RPC\",\n \"VP_EDIT_SUBMIT_FORM_RPC\",\n];\n\nexport const isVuuMenuRpcRequest = (\n message: VuuUIMessageOut | VuuRpcRequest | ClientToServerMenuRPC\n): message is ClientToServerMenuRPC => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isVuuRpcRequest = (\n message:\n | VuuUIMessageOut\n | VuuRpcRequest\n | ClientToServerMenuRPC\n | ClientToServerViewportRpcCall\n): message is ClientToServerViewportRpcCall =>\n message[\"type\"] === \"VIEW_PORT_RPC_CALL\";\n\nexport const stripRequestId = <T>({\n requestId,\n ...rest\n}: WithRequestId<T>): [string, T] => [requestId, rest as T];\n\nexport const getFirstAndLastRows = (\n rows: VuuRow[]\n): [VuuRow, VuuRow] | [VuuRow] => {\n let firstRow = rows.at(0) as VuuRow;\n if (firstRow.updateType === \"SIZE\") {\n if (rows.length === 1) {\n return rows as [VuuRow];\n } else {\n firstRow = rows.at(1) as VuuRow;\n }\n }\n const lastRow = rows.at(-1) as VuuRow;\n return [firstRow, lastRow];\n};\n\nexport type ViewportRowMap = { [key: string]: VuuRow[] };\nexport const groupRowsByViewport = (rows: VuuRow[]): ViewportRowMap => {\n const result: ViewportRowMap = {};\n for (const row of rows) {\n const rowsForViewport =\n result[row.viewPortId] || (result[row.viewPortId] = []);\n rowsForViewport.push(row);\n }\n return result;\n};\n\nexport interface VuuTableMetaWithTable extends VuuTableMeta {\n table: VuuTable;\n}\n\nexport const createSchemaFromTableMetadata = ({\n columns,\n dataTypes,\n key,\n table,\n}: VuuTableMetaWithTable): Readonly<TableSchema> => {\n return {\n table,\n columns: columns.map((col, idx) => ({\n name: col,\n serverDataType: dataTypes[idx],\n })),\n key,\n };\n};\n", "import {\n DataSource,\n DataSourceCallbackMessage,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n OptimizeStrategy,\n RpcResponse,\n Selection,\n SubscribeCallback,\n SubscribeProps,\n TableSchema,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuDataRowDto,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuSort,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n configChanged,\n debounce,\n EventEmitter,\n isViewportMenusAction,\n isVisualLinksAction,\n itemsOrOrderChanged,\n logger,\n metadataKeys,\n throttle,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { getServerAPI, ServerAPI } from \"./connection-manager\";\nimport { isDataSourceConfigMessage } from \"./data-source\";\n\nimport { MenuRpcResponse } from \"@vuu-ui/vuu-data-types\";\n\ntype RangeRequest = (range: VuuRange) => void;\n\nconst { info } = logger(\"VuuDataSource\");\n\nconst { KEY } = metadataKeys;\n\n/*-----------------------------------------------------------------\n A RemoteDataSource manages a single subscription via the ServerProxy\n ----------------------------------------------------------------*/\nexport class VuuDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private bufferSize: number;\n private server: ServerAPI | null = null;\n private clientCallback: SubscribeCallback | undefined;\n private configChangePending: DataSourceConfig | undefined;\n private rangeRequest: RangeRequest;\n\n #config: WithFullConfig = vanillaConfig;\n #groupBy: VuuGroupBy = [];\n #links: LinkDescriptorWithLabel[] | undefined;\n #menu: VuuMenu | undefined;\n #optimize: OptimizeStrategy = \"throttle\";\n #range: VuuRange = { from: 0, to: 0 };\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n\n #title: string | undefined;\n\n public table: VuuTable;\n public tableSchema: TableSchema | undefined;\n public viewport: string | undefined;\n\n constructor({\n bufferSize = 100,\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n table,\n title,\n viewport,\n visualLink,\n }: DataSourceConstructorProps) {\n super();\n\n if (!table)\n throw Error(\"RemoteDataSource constructor called without table\");\n\n this.bufferSize = bufferSize;\n this.table = table;\n this.viewport = viewport;\n\n this.#config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n visualLink: visualLink || this.#config.visualLink,\n };\n\n this.#title = title;\n this.rangeRequest = this.throttleRangeRequest;\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filter,\n }: SubscribeProps,\n callback: SubscribeCallback\n ) {\n if (this.#status === \"disabled\" || this.#status === \"disabling\") {\n this.enable(callback);\n return;\n }\n this.clientCallback = callback;\n if (aggregations || columns || filter || groupBy || sort) {\n this.#config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this.#range = range;\n }\n\n if (\n this.#status !== \"initialising\" &&\n this.#status !== \"unsubscribed\"\n // We can subscribe to a disabled dataSource. No request will be\n // sent to server to create a new VP, just to enable the existing one.\n // The current subscribing client becomes the subscription owner\n ) {\n return;\n }\n\n this.#status = \"subscribing\";\n this.viewport = viewport;\n\n this.server = await getServerAPI();\n\n const { bufferSize } = this;\n\n this.server?.subscribe(\n {\n ...this.#config,\n bufferSize,\n viewport,\n table: this.table,\n range: this.#range,\n title: this.#title,\n },\n this.handleMessageFromServer\n );\n }\n\n handleMessageFromServer = (message: DataSourceCallbackMessage) => {\n if (message.type === \"subscribed\") {\n this.#status = \"subscribed\";\n if (message.tableSchema) {\n this.tableSchema = message.tableSchema;\n }\n this.clientCallback?.(message);\n } else if (message.type === \"disabled\") {\n this.#status = \"disabled\";\n } else if (message.type === \"enabled\") {\n this.#status = \"enabled\";\n } else if (isDataSourceConfigMessage(message)) {\n // This is an ACK for a CHANGE_VP message. Nothing to do here. We need\n // to wait for data to be returned before we can consider the change\n // to be in effect.\n return;\n } else if (message.type === \"debounce-begin\") {\n this.optimize = \"debounce\";\n } else {\n if (\n message.type === \"viewport-update\" &&\n message.size !== undefined &&\n message.size !== this.#size\n ) {\n this.#size = message.size;\n this.emit(\"resize\", message.size);\n }\n // This is used to remove any progress indication from the UI. We wait for actual data rather than\n // just the CHANGE_VP_SUCCESS ack as there is often a delay between receiving the ack and the data.\n // It may be a SIZE only message, eg in the case of removing a groupBy column from a multi-column\n // groupby, where no tree nodes are expanded.\n if (this.configChangePending) {\n this.setConfigPending();\n }\n\n if (isViewportMenusAction(message)) {\n this.#menu = message.menu;\n } else if (isVisualLinksAction(message)) {\n this.#links = message.links as LinkDescriptorWithLabel[];\n } else {\n this.clientCallback?.(message);\n }\n\n if (this.optimize === \"debounce\") {\n this.revertDebounce();\n }\n }\n };\n\n unsubscribe() {\n console.log(`unsubscribe #${this.viewport}`);\n info?.(`unsubscribe #${this.viewport}`);\n if (this.viewport) {\n this.server?.unsubscribe(this.viewport);\n }\n this.server?.destroy(this.viewport);\n this.server = null;\n this.removeAllListeners();\n this.#status = \"unsubscribed\";\n this.viewport = undefined;\n this.range = { from: 0, to: 0 };\n }\n\n suspend() {\n console.log(`suspend #${this.viewport}, current status ${this.#status}`);\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"suspended\";\n this.server?.send({\n type: \"suspend\",\n viewport: this.viewport,\n });\n }\n return this;\n }\n\n resume() {\n console.log(`resume #${this.viewport}, current status ${this.#status}`);\n const isDisabled = this.#status.startsWith(\"disabl\");\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n if (isDisabled) {\n this.enable();\n } else if (isSuspended) {\n this.server?.send({\n type: \"resume\",\n viewport: this.viewport,\n });\n this.#status = \"subscribed\";\n }\n }\n return this;\n }\n\n disable() {\n info?.(`disable #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"disabling\";\n this.server?.send({\n viewport: this.viewport,\n type: \"disable\",\n });\n }\n return this;\n }\n\n enable(callback?: SubscribeCallback) {\n info?.(`enable #${this.viewport}, current status ${this.#status}`);\n if (\n this.viewport &&\n (this.#status === \"disabled\" || this.#status === \"disabling\")\n ) {\n this.#status = \"enabling\";\n if (callback) {\n this.clientCallback = callback;\n }\n this.server?.send({\n viewport: this.viewport,\n type: \"enable\",\n });\n }\n return this;\n }\n\n select(selected: Selection) {\n //TODO this isn't always going to be correct - need to count\n // selection block items\n this.#selectedRowsCount = selected.length;\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"select\",\n selected,\n });\n }\n }\n\n openTreeNode(key: string) {\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"openTreeNode\",\n key,\n });\n }\n }\n\n closeTreeNode(key: string) {\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"closeTreeNode\",\n key,\n });\n }\n }\n\n get links() {\n return this.#links;\n }\n\n get menu() {\n return this.#menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get optimize() {\n return this.#optimize;\n }\n\n set optimize(optimize: OptimizeStrategy) {\n if (optimize !== this.#optimize) {\n this.#optimize = optimize;\n switch (optimize) {\n case \"none\":\n this.rangeRequest = this.rawRangeRequest;\n break;\n case \"debounce\":\n this.rangeRequest = this.debounceRangeRequest;\n break;\n case \"throttle\":\n this.rangeRequest = this.throttleRangeRequest;\n break;\n }\n this.emit(\"optimize\", optimize);\n }\n }\n\n private revertDebounce = debounce(() => {\n this.optimize = \"throttle\";\n }, 100);\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: VuuRange) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n this.#range = range;\n this.rangeRequest(range);\n }\n }\n\n private rawRangeRequest: RangeRequest = (range) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n };\n\n private debounceRangeRequest: RangeRequest = debounce((range: VuuRange) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n }, 50);\n\n private throttleRangeRequest: RangeRequest = throttle((range: VuuRange) => {\n if (this.viewport && this.server) {\n this.server.send({\n viewport: this.viewport,\n type: \"setViewRange\",\n range,\n });\n }\n }, 80);\n\n get config() {\n return this.#config;\n }\n\n set config(config: DataSourceConfig) {\n if (this.applyConfig(config)) {\n if (this.#config && this.viewport && this.server) {\n if (config) {\n this.server?.send({\n viewport: this.viewport,\n type: \"config\",\n config: this.#config,\n });\n }\n }\n this.emit(\"config\", this.#config);\n }\n }\n\n applyConfig(config: DataSourceConfig) {\n if (configChanged(this.#config, config)) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filter?.filter && config?.filter.filterStruct === undefined\n ? {\n ...config,\n filter: {\n filter: config.filter.filter,\n filterStruct: parseFilter(config.filter.filter),\n },\n }\n : config;\n this.#config = withConfigDefaults(newConfig);\n return true;\n }\n }\n }\n\n //TODO replace all these individual server calls with calls to setConfig\n get columns() {\n return this.#config.columns;\n }\n\n set columns(columns: string[]) {\n this.#config = {\n ...this.#config,\n columns,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"setColumns\",\n columns,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get aggregations() {\n return this.#config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.#config = {\n ...this.#config,\n aggregations,\n };\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"aggregate\",\n aggregations,\n });\n }\n this.emit(\"config\", this.#config);\n }\n\n get sort() {\n return this.#config.sort;\n }\n\n set sort(sort: VuuSort) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#config = {\n ...this.#config,\n sort,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"sort\",\n sort,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get filter() {\n return this.#config.filter;\n }\n\n set filter(filter: DataSourceFilter) {\n // TODO should we wait until server ACK before we assign #sort ?\n this.#config = {\n ...this.#config,\n filter,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"filter\",\n filter,\n } as const;\n if (this.server) {\n this.server.send(message);\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n get groupBy() {\n return this.#config.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n if (itemsOrOrderChanged(this.groupBy, groupBy)) {\n const wasGrouped = this.#groupBy.length > 0;\n this.#config = {\n ...this.#config,\n groupBy,\n };\n if (this.viewport) {\n const message = {\n viewport: this.viewport,\n type: \"groupBy\",\n groupBy: this.#config.groupBy,\n } as const;\n\n if (this.server) {\n this.server.send(message);\n }\n }\n if (!wasGrouped && groupBy.length > 0 && this.viewport) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n type: \"viewport-update\",\n size: 0,\n rows: [],\n });\n }\n this.emit(\"config\", this.#config);\n this.setConfigPending({ groupBy });\n }\n }\n\n get title() {\n return this.#title;\n }\n\n set title(title: string | undefined) {\n this.#title = title;\n if (this.viewport && title) {\n this.server?.send({\n type: \"setTitle\",\n title,\n viewport: this.viewport,\n });\n }\n }\n\n get visualLink() {\n return this.#config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this.#config = {\n ...this.#config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"createLink\",\n parentClientVpId,\n parentColumnName: toColumn,\n childColumnName: fromColumn,\n });\n }\n } else {\n if (this.viewport) {\n this.server?.send({\n type: \"removeLink\",\n viewport: this.viewport,\n });\n }\n }\n this.emit(\"config\", this.#config);\n }\n\n private setConfigPending(config?: DataSourceConfig) {\n const pendingConfig = this.configChangePending;\n this.configChangePending = config;\n\n if (config !== undefined) {\n this.emit(\"config\", config, false);\n } else {\n this.emit(\"config\", pendingConfig, true);\n }\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ) {\n if (this.viewport) {\n return this.server?.rpcCall<T>({\n vpId: this.viewport,\n ...rpcRequest,\n } as ClientToServerViewportRpcCall);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ) {\n if (this.viewport) {\n return this.server?.rpcCall<MenuRpcResponse>({\n vpId: this.viewport,\n ...rpcRequest,\n } as ClientToServerMenuRPC);\n }\n }\n\n applyEdit(row: DataSourceRow, columnName: string, value: VuuRowDataItemType) {\n return this.menuRpcCall({\n rowKey: row[KEY],\n field: columnName,\n value: value,\n type: \"VP_EDIT_CELL_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n\n insertRow(key: string, data: VuuDataRowDto) {\n return this.menuRpcCall({\n rowKey: key,\n data,\n type: \"VP_EDIT_ADD_ROW_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n deleteRow(rowKey: string) {\n return this.menuRpcCall({\n rowKey,\n type: \"VP_EDIT_DELETE_ROW_RPC\",\n }).then((response) => {\n if (response?.error) {\n return response.error;\n } else {\n return true;\n }\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["defaultAuthUrl", "authenticate", "username", "password", "authUrl", "response", "authToken", "EventEmitter", "getLoggingConfigForWorker", "isConnectionQualityMetrics", "isConnectionStatusMessage", "isTableSchema", "messageHasResult", "uuid", "isSizeOnly", "message", "toDataSourceConfig", "datasourceMessages", "shouldMessageBeRoutedToDataSource", "type", "isDataSourceConfigMessage", "isSessionTableActionMessage", "messageBody", "isSessionTable", "table", "GET_TABLE_META", "workerSourceCode", "workerBlob", "getLoggingConfigForWorker", "workerSourceCode", "workerBlobUrl", "worker", "pendingWorker", "pendingWorkerNoToken", "resolveServer", "rejectServer", "serverAPI", "resolve", "reject", "getServerAPI", "viewports", "pendingRequests", "getWorker", "handleConnectionStatusChange", "protocol", "retryLimitDisconnect", "retryLimitStartup", "token", "username", "url", "timer", "msg", "message", "handleMessageFromWorker", "pendingWorkerRequest", "isConnectionStatusMessage", "shouldMessageBeRoutedToDataSource", "viewport", "ConnectionManager", "isConnectionQualityMetrics", "requestId", "_1", "_2", "rest", "messageHasResult", "isTableSchema", "asyncRequest", "uuid", "connectedServerAPI", "callback", "viewportId", "table", "GET_TABLE_META", "_ConnectionManager", "EventEmitter", "authToken", "connectToServer", "err", "makeRpcCall", "rpcRequest", "_connectionId", "connectionId", "msgType", "MENU_RPC_TYPES", "isVuuMenuRpcRequest", "message", "isVuuRpcRequest", "stripRequestId", "requestId", "rest", "getFirstAndLastRows", "rows", "firstRow", "lastRow", "groupRowsByViewport", "result", "row", "createSchemaFromTableMetadata", "columns", "dataTypes", "key", "table", "col", "idx", "parseFilter", "configChanged", "debounce", "EventEmitter", "isViewportMenusAction", "isVisualLinksAction", "itemsOrOrderChanged", "logger", "metadataKeys", "throttle", "uuid", "vanillaConfig", "withConfigDefaults", "info", "logger", "KEY", "metadataKeys", "_config", "_groupBy", "_links", "_menu", "_optimize", "_range", "_selectedRowsCount", "_size", "_status", "_title", "VuuDataSource", "EventEmitter", "bufferSize", "aggregations", "columns", "filter", "groupBy", "sort", "table", "title", "viewport", "visualLink", "__privateAdd", "vanillaConfig", "message", "_a", "_b", "__privateSet", "isDataSourceConfigMessage", "__privateGet", "isViewportMenusAction", "isVisualLinksAction", "debounce", "range", "throttle", "uuid", "callback", "getServerAPI", "isDisabled", "isSuspended", "selected", "key", "optimize", "config", "configChanged", "newConfig", "parseFilter", "withConfigDefaults", "itemsOrOrderChanged", "wasGrouped", "parentClientVpId", "fromColumn", "toColumn", "pendingConfig", "rpcRequest", "row", "columnName", "value", "response", "data", "rowKey"]
7
7
  }
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@vuu-ui/vuu-data-remote",
3
- "version": "0.8.20",
3
+ "version": "0.8.21",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
6
  "devDependencies": {
7
- "@vuu-ui/vuu-data-types": "0.8.20",
8
- "@vuu-ui/vuu-table-types": "0.8.20",
9
- "@vuu-ui/vuu-filter-types": "0.8.20",
10
- "@vuu-ui/vuu-protocol-types": "0.8.20"
7
+ "@vuu-ui/vuu-data-types": "0.8.21",
8
+ "@vuu-ui/vuu-table-types": "0.8.21",
9
+ "@vuu-ui/vuu-filter-types": "0.8.21",
10
+ "@vuu-ui/vuu-protocol-types": "0.8.21"
11
11
  },
12
12
  "dependencies": {
13
- "@vuu-ui/vuu-filter-parser": "0.8.20",
14
- "@vuu-ui/vuu-utils": "0.8.20"
13
+ "@vuu-ui/vuu-filter-parser": "0.8.21",
14
+ "@vuu-ui/vuu-utils": "0.8.21"
15
15
  },
16
16
  "files": [
17
17
  "cjs",