@vuu-ui/vuu-data-remote 0.8.32 → 0.8.33

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/README.md DELETED
@@ -1,19 +0,0 @@
1
- # vuu-data
2
-
3
- This package allows a web application to consume data from a [VUU](https://https://vuu.finos.org/docs/introduction/intro/) server instance.
4
-
5
- ## RPC calls
6
-
7
- There are two flavours of RPC call, 'direct' RPC calls and 'menu' RPC calls.
8
-
9
- This package supports both, direct RPC calls are made via the ConnectionManager - the useRpcService hook can be used from a React component. Menu RPC calls always pertain to a specific viewport and are made via the DataSource.
10
-
11
- Currently there are two direct Rpc requests, both provided by the TYPEAHEAD module , the two methods are:
12
-
13
- - getUniqueFieldValues
14
- - getUniqueFieldValuesStartingWith
15
-
16
- There are two menu Rpc requests, provided by the CORE module. The rpcNames are
17
-
18
- - ADD_ROWS_TO_ORDERS
19
- - SET_SPEED_MED | SET_SPEED_SLOW | SET_SPEED_FAST
package/cjs/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../packages/vuu-data-remote/src/index.ts", "../../../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": ["export * from \"./authenticate\";\nexport * from \"./connection-manager\";\nexport type { ServerAPI } from \"./connection-manager\";\nexport * from \"./constants\";\nexport * from \"./data-source\";\nexport * from \"./message-utils\";\nexport * from \"./vuu-data-source\";\n", "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 reject: (message: string | PromiseLike<string>) => void;\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\n/**\n * returns a promise for serverApi. This will be resolved when the\n * connectToServer call succeeds. If client never calls connectToServer\n * serverAPI will never be resolved.\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, reject) => {\n pendingWorkerNoToken.push({ resolve, reject });\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, reject) => {\n const worker = new Worker(workerBlobUrl);\n\n const timer: number | null = window.setTimeout(() => {\n reject(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 if (message.type === \"connection-failed\") {\n reject(message.reason);\n for (const pendingWorkerRequest of pendingWorkerNoToken) {\n pendingWorkerRequest.reject(message.reason);\n }\n pendingWorkerNoToken.length = 0;\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): Promise<\"connected\" | \"rejected\"> => {\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 return \"connected\";\n } catch (err: unknown) {\n rejectServer(err);\n return \"rejected\";\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,n)=>(ie(r,e,\"write to private field\"),n?n.call(r,t):e.set(r,t),t);function le(r,e,t=[],n=[]){for(let s=0,o=r.length;s<o;s++)(e(r[s],s)?t:n).push(r[s]);return[t,n]}var Je=6,B={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:Je,SELECTED:7,count:8,PARENT_IDX:\"parent_idx\",IDX_POINTER:\"idx_pointer\",FILTER_COUNT:\"filter_count\",NEXT_FILTER_IDX:\"next_filter_idx\"};var{DEPTH:It,IS_LEAF:Pt}=B;var ce=r=>{var e,t;if(((e=globalThis.document)==null?void 0:e.cookie)!==void 0)return(t=globalThis.document.cookie.split(\"; \").find(n=>n.startsWith(\\`\\${r}=\\`)))==null?void 0:t.split(\"=\")[1]};function G({from:r,to:e},t=0,n=Number.MAX_SAFE_INTEGER){if(r===0&&e===0)return{from:r,to:e};if(t===0)return n<r?{from:0,to:0}:{from:r,to:Math.min(e,n)};if(r===0)return{from:r,to:Math.min(e+t,n)};{let s=r-t<0,o=n-(e+t)<0;return s&&o?{from:0,to:n}:s?{from:0,to:e+t}:o?{from:Math.max(0,r-t),to:n}:{from:r-t,to:e+t}}}var je=(r,{from:e,to:t})=>r>=e&&r<t;var I=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 Ye=[\"error\",\"warn\",\"info\",\"debug\"],Qe=r=>typeof r==\"string\"&&Ye.includes(r),Xe=\"error\",P=()=>{},Ze=\"error\",{loggingLevel:L=Ze}=et(),b=r=>{let e=L===\"debug\",t=e||L===\"info\",n=t||L===\"warn\",s=n||L===\"error\",o=t?p=>console.info(\\`[\\${r}] \\${p}\\`):P,i=n?p=>console.warn(\\`[\\${r}] \\${p}\\`):P,u=e?p=>console.debug(\\`[\\${r}] \\${p}\\`):P;return{errorEnabled:s,error:s?p=>console.error(\\`[\\${r}] \\${p}\\`):P}};function et(){return typeof loggingSettings<\"u\"?loggingSettings:{loggingLevel:tt()}}function tt(){let r=ce(\"vuu-logging-level\");return Qe(r)?r:Xe}var{debug:nt,debugEnabled:st}=b(\"range-monitor\"),x=class{constructor(e){this.source=e;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:e,to:t}){let{timestamp:n}=this;if(this.range.from=e,this.range.to=t,this.timestamp=performance.now(),n)st&&nt(\\`<\\${this.source}> [\\${e}-\\${t}], \\${(this.timestamp-n).toFixed(0)} ms elapsed\\`);else return 0}};var rt=[],k=class{constructor(e){this.keys=new Map;this.nextKeyValue=0;this.range=e,this.init(e)}next(e=rt){return e.length>0?e.shift():this.nextKeyValue++}init({from:e,to:t}){this.keys.clear(),this.nextKeyValue=0;for(let n=e;n<t;n++){let s=this.next();this.keys.set(n,s)}return!0}reset(e){let{from:t,to:n}=e,s=n-t,o=this.range.to-this.range.from;if(this.range=e,o>s)return this.init(e);let i=[];this.keys.forEach((u,l)=>{(l<t||l>=n)&&(i.push(u),this.keys.delete(l))});for(let u=t;u<n;u++)if(!this.keys.has(u)){let l=this.next(i);this.keys.set(u,l)}return!1}keyFor(e){let t=this.keys.get(e);if(t===void 0)throw console.log(\\`key not found\n keys: \\${this.toDebugString()}\n \\`),Error(\\`KeySet, no key found for rowIndex \\${e}\\`);return t}toDebugString(){return\\`\\${this.keys.size} keys\n\\${Array.from(this.keys.entries()).sort(([e],[t])=>e-t).map(([e,t])=>\\`\\${e}=>\\${t}\\`).join(\",\")}]\n\\`}};var{SELECTED:\\$t}=B,E={False:0,True:1,First:2,Last:4};var ot=(r,e)=>e>=r[0]&&e<=r[1],it=E.True+E.First+E.Last,at=E.True+E.First,ut=E.True+E.Last,H=(r,e)=>{for(let t of r)if(typeof t==\"number\"){if(t===e)return it}else if(ot(t,e))return e===t[0]?at:e===t[1]?ut:E.True;return E.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 n=t[0];n<=t[1];n++)e.push(n);return e};var fe=r=>r.type===\"VIEW_PORT_MENU_RESP\"&&r.action!==null&&O(r.action.table),O=r=>r!==null&&typeof r==\"object\"&&\"table\"in r&&\"module\"in r?r.table.startsWith(\"session\"):!1;var lt=[\"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=>lt.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},z=({columns:r,dataTypes:e,key:t,table:n})=>({table:n,columns:r.map((s,o)=>({name:s,serverDataType:e[o]})),key:t});var Te=\"CHANGE_VP_SUCCESS\";var be=\"CLOSE_TREE_NODE\",we=\"CLOSE_TREE_SUCCESS\";var Ee=\"CREATE_VP\",Ve=\"DISABLE_VP\",ve=\"DISABLE_VP_SUCCESS\";var Me=\"ENABLE_VP\",ye=\"ENABLE_VP_SUCCESS\";var K=\"GET_VP_VISUAL_LINKS\",_e=\"GET_VIEW_PORT_MENUS\";var De=\"HB\",Ie=\"HB_RESP\",Pe=\"LOGIN\",Le=\"OPEN_TREE_NODE\",xe=\"OPEN_TREE_SUCCESS\";var ke=\"REMOVE_VP\";var Oe=\"SET_SELECTION_SUCCESS\";var We=r=>{switch(r){case\"TypeAheadRpcHandler\":return\"TYPEAHEAD\";default:return\"SIMUL\"}};var Ne=[],C=b(\"array-backed-moving-window\");function ct(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,W=class{constructor({from:e,to:t},{from:n,to:s},o){ae(this,h,void 0);this.setRowCount=e=>{var t;if((t=C.info)==null||t.call(C,\\`setRowCount \\${e}\\`),e<this.internalData.length&&(this.internalData.length=e),e<this.rowCount){this.rowsWithinRange=0;let n=Math.min(e,this.clientRange.to);for(let s=this.clientRange.from;s<n;s++){let o=s-m(this,h).from;this.internalData[o]!==void 0&&(this.rowsWithinRange+=1)}}this.rowCount=e};this.bufferBreakout=(e,t)=>{let n=this.bufferSize*.25;return m(this,h).to-t<n?!0:m(this,h).from>0&&e-m(this,h).from<n};this.bufferSize=o,this.clientRange=new I(e,t),ue(this,h,new I(n,s)),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:n,to:s}=this.range;if(t<n||e>=s)return!0}setAtIndex(e){let{rowIndex:t}=e,n=t-m(this,h).from;if(ct(e,this.internalData[n]))return!1;let s=this.isWithinClientRange(t);return(s||this.isWithinRange(t))&&(!this.internalData[n]&&s&&(this.rowsWithinRange+=1),this.internalData[n]=e),s}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=C.debug)==null||p.call(C,\\`setClientRange \\${e} - \\${t}\\`);let n=this.clientRange.from,s=Math.min(this.clientRange.to,this.rowCount);if(e===n&&t===s)return[!1,Ne];let o=this.clientRange.copy();this.clientRange.from=e,this.clientRange.to=t,this.rowsWithinRange=0;for(let a=e;a<t;a++){let c=a-m(this,h).from;this.internalData[c]&&(this.rowsWithinRange+=1)}let i=Ne,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 n,s;if(e!==m(this,h).from||t!==m(this,h).to){(n=C.debug)==null||n.call(C,\\`setRange \\${e} - \\${t}\\`);let[o,i]=m(this,h).overlap(e,t),u=new Array(t-e);this.rowsWithinRange=0;for(let l=o;l<i;l++){let p=this.getAtIndex(l);if(p){let a=l-e;u[a]=p,this.isWithinClientRange(l)&&(this.rowsWithinRange+=1)}}this.internalData=u,m(this,h).from=e,m(this,h).to=t}else(s=C.debug)==null||s.call(C,\\`setRange \\${e} - \\${t} IGNORED because not changed\\`)}get data(){return this.internalData}getData(){var u;let{from:e,to:t}=m(this,h),{from:n,to:s}=this.clientRange,o=Math.max(0,n-e),i=Math.min(t-e,t,s-e,(u=this.rowCount)!=null?u:t);return this.internalData.slice(o,i)}clear(){var e;(e=C.debug)==null||e.call(C,\"clear\"),this.internalData.length=0,this.rowsWithinRange=0,this.setRowCount(0)}getCurrentDataRange(){let e=this.internalData,t=e.length,[n]=this.internalData,s=this.internalData[t-1];if(n&&s)return[n.rowIndex,s.rowIndex];for(let o=0;o<t;o++)if(e[o]!==void 0){n=e[o];break}for(let o=t-1;o>=0;o--)if(e[o]!==void 0){s=e[o];break}return n&&s?[n.rowIndex,s.rowIndex]:[-1,-1]}};h=new WeakMap;var{debug:f,debugEnabled:N,error:pt,info:d,infoEnabled:dt,warn:M}=b(\"viewport\"),gt=({rowKey:r,updateType:e})=>e===\"U\"&&!r.startsWith(\"\\$root\"),U=[void 0,void 0],ht={count:0,mode:void 0,size:0,ts:0},q=class{constructor({aggregations:e,bufferSize:t=50,columns:n,filter:s,groupBy:o=[],table:i,range:u,sort:l,title:p,viewport:a,visualLink:c},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 x(\"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:n}=this.lastUpdateStatus,s=0;if(n===e){let o=Date.now();this.lastUpdateStatus.count+=1,this.lastUpdateStatus.ts=o,s=t===0?0:o-t}else this.lastUpdateStatus.count=1,this.lastUpdateStatus.ts=0,s=0;return this.lastUpdateStatus.mode=e,s};this.rangeRequestAlreadyPending=e=>{let{bufferSize:t}=this,n=t*.25,{from:s}=e;for(let{from:o,to:i}of this.pendingRangeRequests)if(s>=o&&s<i){if(e.to+n<=i)return!0;s=i}return!1};this.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=n,this.filter=s,this.groupBy=o,this.keys=new k(u),this.pendingLinkedParent=c,this.table=i,this.sort=l,this.title=p,dt&&(d==null||d(\\`constructor #\\${a} \\${i.table} bufferSize=\\${t}\\`)),this.dataWindow=new W(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:Ee,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:n,filterSpec:s,range:o,sort:i,groupBy:u,table:l},p){this.serverViewportId=e,this.status=\"subscribed\",this.aggregations=t,this.columns=n,this.groupBy=u,this.isTree=u&&u.length>0,this.dataWindow.setRange(o.from,o.to);let a=l===p.table.table?p:{...p,table:{...p.table,session:l}};return{aggregations:t,type:\"subscribed\",clientViewportId:this.clientViewportId,columns:n,filter:s,groupBy:u,range:o,sort:i,tableSchema:a}}awaitOperation(e,t){this.pendingOperations.set(e,t)}completeOperation(e,...t){var u;let{clientViewportId:n,pendingOperations:s}=this,o=s.get(e);if(!o){pt(\\`no matching operation found to complete for requestId \\${e}\\`);return}let{type:i}=o;if(d==null||d(\\`completeOperation \\${i}\\`),s.delete(e),i===\"CHANGE_VP_RANGE\"){let[l,p]=t;(u=this.dataWindow)==null||u.setRange(l,p);for(let a=this.pendingRangeRequests.length-1;a>=0;a--){let c=this.pendingRangeRequests[a];if(c.requestId===e){c.acked=!0;break}else M==null||M(\"range requests sent faster than they are being ACKed\")}}else if(i===\"config\"){let{aggregations:l,columns:p,filter:a,groupBy:c,sort:g}=o.data;return this.aggregations=l,this.columns=p,this.filter=a,this.groupBy=c,this.sort=g,c.length>0?this.isTree=!0:this.isTree&&(this.isTree=!1),f==null||f(\\`config change confirmed, isTree : \\${this.isTree}\\`),{clientViewportId:n,type:i,config:o.data}}else{if(i===\"groupBy\")return this.isTree=o.data.length>0,this.groupBy=o.data,f==null||f(\\`groupBy change confirmed, isTree : \\${this.isTree}\\`),{clientViewportId:n,type:i,groupBy:o.data};if(i===\"columns\")return this.columns=o.data,{clientViewportId:n,type:i,columns:o.data};if(i===\"filter\")return this.filter=o.data,{clientViewportId:n,type:i,filter:o.data};if(i===\"aggregate\")return this.aggregations=o.data,{clientViewportId:n,type:\"aggregate\",aggregations:this.aggregations};if(i===\"sort\")return this.sort=o.data,{clientViewportId:n,type:i,sort:this.sort};if(i!==\"selection\"){if(i===\"disable\")return this.disabled=!0,{type:\"disabled\",clientViewportId:n};if(i===\"enable\")return this.disabled=!1,{type:\"enabled\",clientViewportId:n};if(i===\"CREATE_VISUAL_LINK\"){let[l,p,a]=t;return this.linkedParent={colName:l,parentViewportId:p,parentColName:a},this.pendingLinkedParent=void 0,{type:\"vuu-link-created\",clientViewportId:n,colName:l,parentViewportId:p,parentColName:a}}else if(i===\"REMOVE_VISUAL_LINK\")return this.linkedParent=void 0,{type:\"vuu-link-removed\",clientViewportId:n}}}}rangeRequest(e,t){N&&this.rangeMonitor.set(t);let n=\"CHANGE_VP_RANGE\";if(this.dataWindow){let[s,o]=this.dataWindow.setClientRange(t.from,t.to),i,u=this.dataWindow.rowCount||void 0,l=s&&!this.rangeRequestAlreadyPending(t)?{type:n,viewPortId:this.serverViewportId,...G(t,this.bufferSize,u)}:null;if(l){N&&(f==null||f(\\`create CHANGE_VP_RANGE: [\\${l.from} - \\${l.to}]\\`)),this.awaitOperation(e,{type:n});let a=this.pendingRangeRequests.at(-1);if(a)if(a.acked)console.warn(\"Range Request before previous request is filled\");else{let{from:c,to:g}=a;this.dataWindow.outOfRange(c,g)?i={clientViewportId:this.clientViewportId,type:\"debounce-begin\"}:M==null||M(\"Range Request before previous request is acked\")}this.pendingRangeRequests.push({...l,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?[l,o.map(a=>p(a,this.keys,this.selectedRows))]:i?[l,void 0,i]:[l]}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,n,s){let o={type:\"CREATE_VISUAL_LINK\",parentVpId:n,childVpId:this.serverViewportId,parentColumnName:s,childColumnName:t};return this.awaitOperation(e,o),this.useBatchMode&&(this.batchMode=!0),o}removeLink(e){let t={type:\"REMOVE_VISUAL_LINK\",childVpId:this.serverViewportId};return this.awaitOperation(e,t),t}suspend(){this.suspended=!0,d==null||d(\"suspend\")}resume(){return this.suspended=!1,N&&(f==null||f(\\`resume: \\${this.currentData()}\\`)),[this.size,this.currentData()]}currentData(){let e=[];if(this.dataWindow){let t=this.dataWindow.getData(),{keys:n}=this,s=this.isTree?j:J;for(let o of t)o&&e.push(s(o,n,this.selectedRows))}return e}enable(e){return this.awaitOperation(e,{type:\"enable\"}),d==null||d(\\`enable: \\${this.serverViewportId}\\`),{type:Me,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})}setConfig(e,t){var o;this.awaitOperation(e,{type:\"config\",data:t});let{filter:n,...s}=t;return this.useBatchMode&&(this.batchMode=!0),N?f==null||f(\\`setConfig \\${JSON.stringify(t)}\\`):d==null||d(\"setConfig\"),!this.isTree&&t.groupBy.length>0&&((o=this.dataWindow)==null||o.clear()),this.createRequest({...s,filterSpec:typeof(n==null?void 0:n.filter)==\"string\"?{filter:n.filter}:{filter:\"\"}},!0)}aggregateRequest(e,t){return this.awaitOperation(e,{type:\"aggregate\",data:t}),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})}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 n=this.pendingRangeRequests.length-1;n>=0;n--){let{from:s,to:o}=this.pendingRangeRequests[n],i=!0;if(e>=s&&e<o||t>s&&t<o){i||console.warn(\"removePendingRangeRequest TABLE_ROWS are not for latest request\"),this.pendingRangeRequests.splice(n,1);break}else i=!1}}updateRows(e){var s,o,i;let[t,n]=Re(e);if(t&&n&&this.removePendingRangeRequest(t.rowIndex,n.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\"||((s=this.dataWindow)==null?void 0:s.rowCount)!==u.vpSize)&&((o=this.dataWindow)==null||o.setRowCount(u.vpSize),this.rowCountChanged=!0),u.updateType===\"U\"&&(i=this.dataWindow)!=null&&i.setAtIndex(u)&&(this.hasUpdates=!0,this.batchMode||this.pendingUpdates.push(u)))}getClientRows(){let e,t=\"size-only\";if(!this.hasUpdates&&!this.rowCountChanged)return U;if(this.hasUpdates){let{keys:n,selectedRows:s}=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,n,s));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,n,s));this.batchMode=!1}}this.hasUpdates=!1}return this.throttleMessage(t)?U:[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:n},s,o)=>[r,s.keyFor(r),!0,!1,0,0,e,t?H(o,r):0].concat(n),j=({rowIndex:r,rowKey:e,sel:t,data:n},s,o)=>{let[i,u,,l,,p,...a]=n;return[r,s.keyFor(r),l,u,i,p,e,t?H(o,r):0].concat(a)};var Ue=1;var{debug:V,debugEnabled:Y,error:y,info:T,infoEnabled:ft,warn:Q}=b(\"server-proxy\"),R=()=>\\`\\${Ue++}\\`,mt={},Ct=r=>r.disabled!==!0&&r.suspended!==!0,Rt={type:\"NO_ACTION\"},St=(r,e,t)=>r.map(n=>n.parentVpId===e?{...n,label:t}:n);function Tt(r,e){return r.map(t=>{let{parentVpId:n}=t,s=e.get(n);if(s)return{...t,parentClientVpId:s.clientViewportId,label:s.title};throw Error(\"addLabelsToLinks viewport not found\")})}var 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 n=s=>{s.forEach(o=>{let{clientViewportId:i}=o;this.viewports.set(i,o),this.sendMessageToServer(o.subscribe(),i)})};n(e),setTimeout(()=>{n(t)},2e3)}async login(e,t=\"user\"){if(e)return this.authToken=e,this.user=t,new Promise((n,s)=>{this.sendMessageToServer({type:Pe,token:this.authToken,user:t},\"\"),this.pendingLogin={resolve:n,reject:s}});this.authToken===\"\"&&y(\"login, cannot login until auth token has been obtained\")}subscribe(e){if(this.mapClientToServerViewport.has(e.viewport))y(\\`spurious subscribe call \\${e.viewport}\\`);else{let t=this.getTableMeta(e.table),n=new q(e,this.postMessageToClient);this.viewports.set(e.viewport,n);let s=this.awaitResponseToMessage(n.subscribe(),e.viewport);Promise.all([s,t]).then(([i,u])=>{let{viewPortId:l}=i,{status:p}=n;e.viewport!==l&&(this.viewports.delete(e.viewport),this.viewports.set(l,n)),this.mapClientToServerViewport.set(e.viewport,l);let a=n.handleSubscribed(i,u);a&&(this.postMessageToClient(a),Y&&V(\\`post DataSourceSubscribedMessage to client: \\${JSON.stringify(a)}\\`)),n.disabled&&this.disableViewport(n),this.queuedRequests.length>0&&this.processQueuedRequests(),p===\"subscribing\"&&!O(n.table)&&(this.sendMessageToServer({type:K,vpId:l}),this.sendMessageToServer({type:_e,vpId:l}),Array.from(this.viewports.entries()).filter(([c,{disabled:g}])=>c!==l&&!g).forEach(([c])=>{this.sendMessageToServer({type:K,vpId:c})}))})}}processQueuedRequests(){let e={};for(;this.queuedRequests.length;){let t=this.queuedRequests.pop();if(t){let{clientViewportId:n,message:s,requestId:o}=t;if(s.type===\"CHANGE_VP_RANGE\"){if(e.CHANGE_VP_RANGE)continue;e.CHANGE_VP_RANGE=!0;let i=this.mapClientToServerViewport.get(n);i&&this.sendMessageToServer({...s,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:ke,viewPortId:t})):y(\\`failed to unsubscribe client viewport \\${e}, viewport not found\\`)}getViewportForClient(e,t=!0){let n=this.mapClientToServerViewport.get(e);if(n){let s=this.viewports.get(n);if(s)return s;if(t)throw Error(\\`Viewport not found for client viewport \\${e}\\`);return null}else{if(this.viewports.has(e))return this.viewports.get(e);if(t)throw Error(\\`Viewport server id not found for client viewport \\${e}\\`);return null}}setViewRange(e,t){let n=R(),[s,o,i]=e.rangeRequest(n,t.range);T==null||T(\\`setViewRange \\${t.range.from} - \\${t.range.to}\\`),s&&(this.sendIfReady(s,n,e.status===\"subscribed\")||this.queuedRequests.push({clientViewportId:t.viewport,message:s,requestId:n})),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 n=R(),s=e.setConfig(n,t.config);this.sendIfReady(s,n,e.status===\"subscribed\")}aggregate(e,t){let n=R(),s=e.aggregateRequest(n,t.aggregations);this.sendIfReady(s,n,e.status===\"subscribed\")}sort(e,t){let n=R(),s=e.sortRequest(n,t.sort);this.sendIfReady(s,n,e.status===\"subscribed\")}setColumns(e,t){let n=R(),{columns:s}=t,o=e.columnRequest(n,s);this.sendIfReady(o,n,e.status===\"subscribed\")}setTitle(e,t){e&&(e.title=t.title,this.updateTitleOnVisualLinks(e))}select(e,t){let n=R(),{selected:s}=t,o=e.selectRequest(n,s);this.sendIfReady(o,n,e.status===\"subscribed\")}disableViewport(e){let t=R(),n=e.disable(t);this.sendIfReady(n,t,e.status===\"subscribed\")}enableViewport(e){if(e.disabled){let t=R(),n=e.enable(t);this.sendIfReady(n,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,n]=e.resume();V==null||V(\\`resumeViewport size \\${t}, \\${n.length} rows sent to client\\`),this.postMessageToClient({clientViewportId:e.clientViewportId,mode:\"batch\",rows:n,size:t,type:\"viewport-update\"})}openTreeNode(e,t){if(e.serverViewportId){let n=R();this.sendIfReady(e.openTreeNode(n,t),n,e.status===\"subscribed\")}}closeTreeNode(e,t){if(e.serverViewportId){let n=R();this.sendIfReady(e.closeTreeNode(n,t),n,e.status===\"subscribed\")}}createLink(e,t){let{parentClientVpId:n,parentColumnName:s,childColumnName:o}=t,i=R(),u=this.mapClientToServerViewport.get(n);if(u){let l=e.createLink(i,o,u,s);this.sendMessageToServer(l,i)}else y(\"ServerProxy unable to create link, viewport not found\")}removeLink(e){let t=R(),n=e.removeLink(t);this.sendMessageToServer(n,t)}updateTitleOnVisualLinks(e){var s;let{serverViewportId:t,title:n}=e;for(let o of this.viewports.values())if(o!==e&&o.links&&t&&n&&(s=o.links)!=null&&s.some(i=>i.parentVpId===t)){let[i]=o.setLinks(St(o.links,t,n));this.postMessageToClient(i)}}removeViewportFromVisualLinks(e){var t;for(let n of this.viewports.values())if((t=n.links)!=null&&t.some(({parentVpId:s})=>s===e)){let[s]=n.setLinks(n.links.filter(({parentVpId:o})=>o!==e));this.postMessageToClient(s)}}menuRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[n,s]=A(e);this.sendMessageToServer({...s,vpId:t.serverViewportId},n)}}viewportRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[n,s]=A(e);this.sendMessageToServer({...s,vpId:t.serverViewportId,namedParams:{}},n)}}rpcCall(e){let[t,n]=A(e),s=We(n.service);this.sendMessageToServer(n,t,{module:s})}handleMessageFromClient(e){var t;if(ge(e))if(e.type===\"disable\"){let n=this.getViewportForClient(e.viewport,!1);return n!==null?this.disableViewport(n):void 0}else{let n=this.getViewportForClient(e.viewport);switch(e.type){case\"setViewRange\":return this.setViewRange(n,e);case\"config\":return this.setConfig(n,e);case\"aggregate\":return this.aggregate(n,e);case\"sort\":return this.sort(n,e);case\"select\":return this.select(n,e);case\"suspend\":return this.suspendViewport(n);case\"resume\":return this.resumeViewport(n);case\"enable\":return this.enableViewport(n);case\"openTreeNode\":return this.openTreeNode(n,e);case\"closeTreeNode\":return this.closeTreeNode(n,e);case\"createLink\":return this.createLink(n,e);case\"removeLink\":return this.removeLink(n);case\"setColumns\":return this.setColumns(n,e);case\"setTitle\":return this.setTitle(n,e);default:}}else{if(Ce(e))return this.viewportRpcCall(e);if(me(e))return this.menuRpcCall(e);{let{type:n,requestId:s}=e;switch(n){case\"GET_TABLE_LIST\":{(t=this.tableList)!=null||(this.tableList=this.awaitResponseToMessage({type:n},s)),this.tableList.then(o=>{this.postMessageToClient({type:\"TABLE_LIST_RESP\",tables:o.tables,requestId:s})});return}case\"GET_TABLE_META\":{this.getTableMeta(e.table,s).then(o=>{o&&this.postMessageToClient({type:\"TABLE_META_RESP\",tableSchema:o,requestId:s})});return}case\"RPC_CALL\":return this.rpcCall(e);default:}}}y(\\`Vuu ServerProxy Unexpected message from client \\${JSON.stringify(e)}\\`)}getTableMeta(e,t=R()){if(O(e))return Promise.resolve(void 0);let n=\\`\\${e.module}:\\${e.table}\\`,s=this.cachedTableMetaRequests.get(n);return s||(s=this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:e},t),this.cachedTableMetaRequests.set(n,s)),s==null?void 0:s.then(o=>this.cacheTableMeta(o))}awaitResponseToMessage(e,t=R()){return new Promise((n,s)=>{this.sendMessageToServer(e,t),this.pendingRequests.set(t,{reject:s,resolve:n})})}sendIfReady(e,t,n=!0){return n&&this.sendMessageToServer(e,t),n}sendMessageToServer(e,t=\\`\\${Ue++}\\`,n=mt){let{module:s=\"CORE\"}=n;this.authToken&&this.connection.send({requestId:t,sessionId:this.sessionId,token:this.authToken,user:this.user,module:s,body:e})}handleMessageFromServer(e){var u;let{body:t,requestId:n,sessionId:s}=e,o=this.pendingRequests.get(n);if(o){let{resolve:a}=o;this.pendingRequests.delete(n),a(t);return}let{viewports:i}=this;switch(t.type){case De:this.sendMessageToServer({type:Ie,ts:+new Date},\"NA\");break;case\"LOGIN_SUCCESS\":if(s)this.sessionId=s,(u=this.pendingLogin)==null||u.resolve(s),this.pendingLogin=void 0;else throw Error(\"LOGIN_SUCCESS did not provide sessionId\");break;case\"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 Oe:{let a=this.viewports.get(t.vpId);a&&a.completeOperation(n)}break;case Te:case ve:if(i.has(t.viewPortId)){let a=this.viewports.get(t.viewPortId);if(a){let c=a.completeOperation(n);c!==void 0&&(this.postMessageToClient(c),Y&&V(\\`postMessageToClient \\${JSON.stringify(c)}\\`))}}break;case ye:{let a=this.viewports.get(t.viewPortId);if(a){let c=a.completeOperation(n);if(c){this.postMessageToClient(c);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[c,g]of Object.entries(a)){let S=i.get(c);S?S.updateRows(g):Q==null||Q(\\`TABLE_ROW message received for non registered viewport \\${c}\\`)}this.processUpdates()}break;case\"CHANGE_VP_RANGE_SUCCESS\":{let a=this.viewports.get(t.viewPortId);if(a){let{from:c,to:g}=t;a.completeOperation(n,c,g)}}break;case xe:case we:break;case\"CREATE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId),c=this.viewports.get(t.parentVpId);if(a&&c){let{childColumnName:g,parentColumnName:S}=t,D=a.completeOperation(n,g,c.clientViewportId,S);D&&this.postMessageToClient(D)}}break;case\"REMOVE_VISUAL_LINK_SUCCESS\":{let a=this.viewports.get(t.childVpId);if(a){let c=a.completeOperation(n);c&&this.postMessageToClient(c)}}break;case\"VP_VISUAL_LINKS_RESP\":{let a=this.getActiveLinks(t.links),c=this.viewports.get(t.vpId);if(a.length&&c){let g=Tt(a,this.viewports),[S,D]=c.setLinks(g);if(this.postMessageToClient(S),D){let{link:se,parentClientVpId:ze}=D,re=R(),oe=this.mapClientToServerViewport.get(ze);if(oe){let Ke=c.createLink(re,se.fromColumn,oe,se.toColumn);this.sendMessageToServer(Ke,re)}}}}break;case\"VIEW_PORT_MENUS_RESP\":if(t.menu.name){let a=this.viewports.get(t.vpId);if(a){let c=a.setMenu(t.menu);this.postMessageToClient(c)}}break;case\"VP_EDIT_RPC_RESPONSE\":this.postMessageToClient({action:t.action,requestId:n,rpcName:t.rpcName,type:\"VP_EDIT_RPC_RESPONSE\"});break;case\"VP_EDIT_RPC_REJECT\":this.viewports.get(t.vpId)&&this.postMessageToClient({requestId:n,type:\"VP_EDIT_RPC_REJECT\",error:t.error});break;case\"VIEW_PORT_MENU_REJ\":{console.log(\"send menu error back to client\");let{error:a,rpcName:c,vpId:g}=t,S=this.viewports.get(g);S&&this.postMessageToClient({clientViewportId:S.clientViewportId,error:a,rpcName:c,type:\"VIEW_PORT_MENU_REJ\",requestId:n});break}case\"VIEW_PORT_MENU_RESP\":if(fe(t)){let{action:a,rpcName:c}=t;this.awaitResponseToMessage({type:\"GET_TABLE_META\",table:a.table}).then(g=>{let S=z(g);this.postMessageToClient({rpcName:c,type:\"VIEW_PORT_MENU_RESP\",action:{...a,tableSchema:S},tableAlreadyOpen:this.isTableOpen(a.table),requestId:n})})}else{let{action:a}=t;this.postMessageToClient({type:\"VIEW_PORT_MENU_RESP\",action:a||Rt,tableAlreadyOpen:a!==null&&this.isTableOpen(a.table),requestId:n})}break;case\"RPC_RESP\":{let{method:a,result:c}=t;this.postMessageToClient({type:\"RPC_RESP\",method:a,result:c,requestId:n})}break;case\"VIEW_PORT_RPC_REPONSE\":{let{method:a,action:c}=t;this.postMessageToClient({type:\"VIEW_PORT_RPC_RESPONSE\",rpcName:a,action:c,requestId:n})}break;case\"ERROR\":y(t.msg);break;default:ft&&T(\\`handleMessageFromServer \\${t.type}.\\`)}}cacheTableMeta(e){let{module:t,table:n}=e.table,s=\\`\\${t}:\\${n}\\`,o=this.cachedTableSchemas.get(s);return o||(o=z(e),this.cachedTableSchemas.set(s,o)),o}isTableOpen(e){if(e){let t=e.table;for(let n of this.viewports.values())if(!n.suspended&&n.table.table===t)return!0}}getActiveLinks(e){return e.filter(t=>{let n=this.viewports.get(t.parentVpId);return n&&!n.suspended})}processUpdates(){this.viewports.forEach(e=>{var t;if(e.hasUpdatesToProcess){let n=e.getClientRows();if(n!==U){let[s,o]=n,i=e.getNewRowCount();(i!==void 0||s&&s.length>0)&&(Y&&V(\\`postMessageToClient #\\${e.clientViewportId} viewport-update \\${o}, \\${(t=s==null?void 0:s.length)!=null?t:\"no\"} rows, size \\${i}\\`),o&&this.postMessageToClient({clientViewportId:e.clientViewportId,mode:o,rows:s,size:i,type:\"viewport-update\"}))}}})}};var{debug:un,debugEnabled:ln,error:qe,info:w,infoEnabled:bt,warn:_}=b(\"websocket-connection\"),Be={},Z=Symbol(\"setWebsocket\"),\\$=Symbol(\"connectionCallback\");async function Ge(r,e,t,n=10,s=5){return Be[r]={status:\"connecting\",connect:{allowed:s,remaining:s},reconnect:{allowed:n,remaining:n}},He(r,e,t)}async function X(r){throw Error(\"connection broken\")}async function He(r,e,t,n){let{status:s,connect:o,reconnect:i}=Be[r],u=s===\"connecting\"?o:i;try{t({type:\"connection-status\",status:\"connecting\"});let l=typeof n<\"u\",p=await Et(r,e);console.info(\"%c\\u26A1 %cconnected\",\"font-size: 24px;color: green;font-weight: bold;\",\"color:green; font-size: 14px;\"),n!==void 0&&n[Z](p);let a=n!=null?n:new ee(p,r,e,t),c=l?\"reconnected\":\"connection-open-awaiting-session\";return t({type:\"connection-status\",status:c}),a.status=c,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,n,2e3);throw t({type:\"connection-status\",status:\"failed\",reason:\"unable to connect\",retry:p}),Error(\"Failed to establish connection\")}}var wt=(r,e,t,n,s)=>new Promise(o=>{setTimeout(()=>{o(He(r,e,t,n))},s)}),Et=(r,e)=>new Promise((t,n)=>{bt&&e!==void 0&&w(\\`WebSocket Protocol \\${e==null?void 0:e.toString()}\\`);let s=new WebSocket(r,e);s.onopen=()=>t(s),s.onerror=o=>n(o)}),Fe=()=>{_==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,n,s){this.close=Fe;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[\\$](t)};this.url=t,this.protocol=n,this[\\$]=s,this[Z](e)}reconnect(){X(this)}[(\\$,Z)](e){let t=this[\\$];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\"&&(X(this),this.send=s)},e.onclose=()=>{w==null||w(\"\\u26A1 connection close\"),t({type:\"connection-status\",status:\"disconnected\",reason:\"close\"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status!==\"closed\"&&(X(this),this.send=s)};let n=o=>{e.send(JSON.stringify(o))},s=o=>{w==null||w(\\`TODO queue message until websocket reconnected \\${o.body.type}\\`)};this.send=n,this.close=()=>{this.status=\"closed\",e.close(),this.close=Fe,this.send=\\$e,w==null||w(\"close websocket\")}}};var v,{info:te,infoEnabled:ne}=b(\"worker\");async function vt(r,e,t,n,s,o,i){let u=await Ge(r,e,l=>{de(l)?postMessage({type:\"connection-metrics\",messages:l}):pe(l)?(s(l),l.status===\"reconnected\"&&v.reconnect()):v.handleMessageFromServer(l)},o,i);v=new F(u,l=>Mt(l)),u.requiresLogin&&await v.login(t,n)}function Mt(r){postMessage(r)}var yt=async({data:r})=>{switch(r.type){case\"connect\":try{await vt(r.url,r.protocol,r.token,r.username,postMessage,r.retryLimitDisconnect,r.retryLimitStartup),postMessage({type:\"connected\"})}catch(e){postMessage({type:\"connection-failed\",reason:String(e)})}break;case\"subscribe\":ne&&te(\\`client subscribe: \\${JSON.stringify(r)}\\`),v.subscribe(r);break;case\"unsubscribe\":ne&&te(\\`client unsubscribe: \\${JSON.stringify(r)}\\`),v.unsubscribe(r.viewport);break;default:ne&&te(\\`client message: \\${JSON.stringify(r)}\\`),v.handleMessageFromClient(r)}};self.addEventListener(\"message\",yt);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 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 isConfigChanged,\n debounce,\n EventEmitter,\n isViewportMenusAction,\n isVisualLinksAction,\n itemsOrOrderChanged,\n logger,\n metadataKeys,\n throttle,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n DataSourceConfigChanges,\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 const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (this.#config && this.viewport) {\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, undefined, configChanges);\n }\n }\n\n applyConfig(config: DataSourceConfig): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this.#config,\n config\n );\n if (noChanges !== true) {\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 otherChanges;\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 this.server?.send(message);\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 this.config = {\n ...this.#config,\n filter,\n };\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\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, undefined, {\n // ...NO_CONFIG_CHANGES,\n // groupByChanged: true,\n // });\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
- "names": ["src_exports", "__export", "ConnectionManager", "VuuDataSource", "authenticate", "connectToServer", "connectionId", "createSchemaFromTableMetadata", "getFirstAndLastRows", "getServerAPI", "groupRowsByViewport", "isDataSourceConfigMessage", "isSessionTable", "isSessionTableActionMessage", "isSizeOnly", "isVuuMenuRpcRequest", "isVuuRpcRequest", "makeRpcCall", "msgType", "shouldMessageBeRoutedToDataSource", "stripRequestId", "toDataSourceConfig", "__toCommonJS", "defaultAuthUrl", "authenticate", "username", "password", "authUrl", "response", "authToken", "import_vuu_utils", "isSizeOnly", "message", "toDataSourceConfig", "datasourceMessages", "shouldMessageBeRoutedToDataSource", "type", "isDataSourceConfigMessage", "isSessionTableActionMessage", "messageBody", "isSessionTable", "table", "GET_TABLE_META", "workerSourceCode", "workerBlob", "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", "shouldMessageBeRoutedToDataSource", "viewport", "ConnectionManager", "requestId", "_1", "_2", "rest", "asyncRequest", "connectedServerAPI", "callback", "viewportId", "table", "GET_TABLE_META", "_ConnectionManager", "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", "import_vuu_filter_parser", "import_vuu_utils", "info", "KEY", "_config", "_groupBy", "_links", "_menu", "_optimize", "_range", "_selectedRowsCount", "_size", "_status", "_title", "VuuDataSource", "bufferSize", "aggregations", "columns", "filter", "groupBy", "sort", "table", "title", "viewport", "visualLink", "__privateAdd", "message", "_a", "_b", "__privateSet", "isDataSourceConfigMessage", "__privateGet", "range", "callback", "getServerAPI", "isDisabled", "isSuspended", "selected", "key", "optimize", "config", "configChanges", "noChanges", "otherChanges", "newConfig", "wasGrouped", "parentClientVpId", "fromColumn", "toColumn", "pendingConfig", "rpcRequest", "row", "columnName", "value", "response", "data", "rowKey"]
7
- }
package/esm/index.js DELETED
@@ -1,2 +0,0 @@
1
- var A=(t,r,e)=>{if(!r.has(t))throw TypeError("Cannot "+e)};var i=(t,r,e)=>(A(t,r,"read from private field"),e?e.call(t):r.get(t)),p=(t,r,e)=>{if(r.has(t))throw TypeError("Cannot add the same private member more than once");r instanceof WeakSet?r.add(t):r.set(t,e)},l=(t,r,e,s)=>(A(t,r,"write to private field"),s?s.call(t,e):r.set(t,e),e);var j="api/authn",_e=async(t,r,e=j)=>fetch(e,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json","access-control-allow-origin":location.host},body:JSON.stringify({username:t,password:r})}).then(s=>{if(s.ok){let o=s.headers.get("vuu-auth-token");if(typeof o=="string"&&o.length>0)return o;throw Error("Authentication failed auth token not returned by server")}else throw Error(`Authentication failed ${s.status} ${s.statusText}`)});import{EventEmitter as Y,getLoggingConfigForWorker as ee,isConnectionQualityMetrics as te,isConnectionStatusMessage as $,isTableSchema as se,messageHasResult as ie,uuid as re}from"@vuu-ui/vuu-utils";var Ie=t=>t.type==="viewport-update"&&t.mode==="size-only",Ve=t=>{switch(t.type){case"aggregate":return{aggregations:t.aggregations};case"columns":return{columns:t.columns};case"filter":return{filter:t.filter};case"groupBy":return{groupBy:t.groupBy};case"sort":return{sort:t.sort};case"config":return t.config}},X=["config","aggregate","viewport-update","columns","debounce-begin","disabled","enabled","filter","groupBy","vuu-link-created","vuu-link-removed","vuu-links","vuu-menu","sort","subscribed"],W=t=>{let r=t.type;return X.includes(r)},U=t=>["config","aggregate","columns","filter","groupBy","sort"].includes(t.type),Pe=t=>t.type==="VIEW_PORT_MENU_RESP"&&t.action!==null&&Z(t.action.table),Z=t=>t!==null&&typeof t=="object"&&"table"in t&&"module"in t?t.table.startsWith("session"):!1;var q="GET_TABLE_META";var x='\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,n)=>(ie(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t);function le(r,e,t=[],n=[]){for(let s=0,o=r.length;s<o;s++)(e(r[s],s)?t:n).push(r[s]);return[t,n]}var Je=6,B={IDX:0,RENDER_IDX:1,IS_LEAF:2,IS_EXPANDED:3,DEPTH:4,COUNT:5,KEY:Je,SELECTED:7,count:8,PARENT_IDX:"parent_idx",IDX_POINTER:"idx_pointer",FILTER_COUNT:"filter_count",NEXT_FILTER_IDX:"next_filter_idx"};var{DEPTH:It,IS_LEAF:Pt}=B;var ce=r=>{var e,t;if(((e=globalThis.document)==null?void 0:e.cookie)!==void 0)return(t=globalThis.document.cookie.split("; ").find(n=>n.startsWith(`${r}=`)))==null?void 0:t.split("=")[1]};function G({from:r,to:e},t=0,n=Number.MAX_SAFE_INTEGER){if(r===0&&e===0)return{from:r,to:e};if(t===0)return n<r?{from:0,to:0}:{from:r,to:Math.min(e,n)};if(r===0)return{from:r,to:Math.min(e+t,n)};{let s=r-t<0,o=n-(e+t)<0;return s&&o?{from:0,to:n}:s?{from:0,to:e+t}:o?{from:Math.max(0,r-t),to:n}:{from:r-t,to:e+t}}}var je=(r,{from:e,to:t})=>r>=e&&r<t;var I=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 Ye=["error","warn","info","debug"],Qe=r=>typeof r=="string"&&Ye.includes(r),Xe="error",P=()=>{},Ze="error",{loggingLevel:L=Ze}=et(),b=r=>{let e=L==="debug",t=e||L==="info",n=t||L==="warn",s=n||L==="error",o=t?p=>console.info(`[${r}] ${p}`):P,i=n?p=>console.warn(`[${r}] ${p}`):P,u=e?p=>console.debug(`[${r}] ${p}`):P;return{errorEnabled:s,error:s?p=>console.error(`[${r}] ${p}`):P}};function et(){return typeof loggingSettings<"u"?loggingSettings:{loggingLevel:tt()}}function tt(){let r=ce("vuu-logging-level");return Qe(r)?r:Xe}var{debug:nt,debugEnabled:st}=b("range-monitor"),x=class{constructor(e){this.source=e;this.range={from:0,to:0};this.timestamp=0}isSet(){return this.timestamp!==0}set({from:e,to:t}){let{timestamp:n}=this;if(this.range.from=e,this.range.to=t,this.timestamp=performance.now(),n)st&&nt(`<${this.source}> [${e}-${t}], ${(this.timestamp-n).toFixed(0)} ms elapsed`);else return 0}};var rt=[],k=class{constructor(e){this.keys=new Map;this.nextKeyValue=0;this.range=e,this.init(e)}next(e=rt){return e.length>0?e.shift():this.nextKeyValue++}init({from:e,to:t}){this.keys.clear(),this.nextKeyValue=0;for(let n=e;n<t;n++){let s=this.next();this.keys.set(n,s)}return!0}reset(e){let{from:t,to:n}=e,s=n-t,o=this.range.to-this.range.from;if(this.range=e,o>s)return this.init(e);let i=[];this.keys.forEach((u,l)=>{(l<t||l>=n)&&(i.push(u),this.keys.delete(l))});for(let u=t;u<n;u++)if(!this.keys.has(u)){let l=this.next(i);this.keys.set(u,l)}return!1}keyFor(e){let t=this.keys.get(e);if(t===void 0)throw console.log(`key not found\n keys: ${this.toDebugString()}\n `),Error(`KeySet, no key found for rowIndex ${e}`);return t}toDebugString(){return`${this.keys.size} keys\n${Array.from(this.keys.entries()).sort(([e],[t])=>e-t).map(([e,t])=>`${e}=>${t}`).join(",")}]\n`}};var{SELECTED:$t}=B,E={False:0,True:1,First:2,Last:4};var ot=(r,e)=>e>=r[0]&&e<=r[1],it=E.True+E.First+E.Last,at=E.True+E.First,ut=E.True+E.Last,H=(r,e)=>{for(let t of r)if(typeof t=="number"){if(t===e)return it}else if(ot(t,e))return e===t[0]?at:e===t[1]?ut:E.True;return E.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 n=t[0];n<=t[1];n++)e.push(n);return e};var fe=r=>r.type==="VIEW_PORT_MENU_RESP"&&r.action!==null&&O(r.action.table),O=r=>r!==null&&typeof r=="object"&&"table"in r&&"module"in r?r.table.startsWith("session"):!1;var lt=["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=>lt.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},z=({columns:r,dataTypes:e,key:t,table:n})=>({table:n,columns:r.map((s,o)=>({name:s,serverDataType:e[o]})),key:t});var Te="CHANGE_VP_SUCCESS";var be="CLOSE_TREE_NODE",we="CLOSE_TREE_SUCCESS";var Ee="CREATE_VP",Ve="DISABLE_VP",ve="DISABLE_VP_SUCCESS";var Me="ENABLE_VP",ye="ENABLE_VP_SUCCESS";var K="GET_VP_VISUAL_LINKS",_e="GET_VIEW_PORT_MENUS";var De="HB",Ie="HB_RESP",Pe="LOGIN",Le="OPEN_TREE_NODE",xe="OPEN_TREE_SUCCESS";var ke="REMOVE_VP";var Oe="SET_SELECTION_SUCCESS";var We=r=>{switch(r){case"TypeAheadRpcHandler":return"TYPEAHEAD";default:return"SIMUL"}};var Ne=[],C=b("array-backed-moving-window");function ct(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,W=class{constructor({from:e,to:t},{from:n,to:s},o){ae(this,h,void 0);this.setRowCount=e=>{var t;if((t=C.info)==null||t.call(C,`setRowCount ${e}`),e<this.internalData.length&&(this.internalData.length=e),e<this.rowCount){this.rowsWithinRange=0;let n=Math.min(e,this.clientRange.to);for(let s=this.clientRange.from;s<n;s++){let o=s-m(this,h).from;this.internalData[o]!==void 0&&(this.rowsWithinRange+=1)}}this.rowCount=e};this.bufferBreakout=(e,t)=>{let n=this.bufferSize*.25;return m(this,h).to-t<n?!0:m(this,h).from>0&&e-m(this,h).from<n};this.bufferSize=o,this.clientRange=new I(e,t),ue(this,h,new I(n,s)),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:n,to:s}=this.range;if(t<n||e>=s)return!0}setAtIndex(e){let{rowIndex:t}=e,n=t-m(this,h).from;if(ct(e,this.internalData[n]))return!1;let s=this.isWithinClientRange(t);return(s||this.isWithinRange(t))&&(!this.internalData[n]&&s&&(this.rowsWithinRange+=1),this.internalData[n]=e),s}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=C.debug)==null||p.call(C,`setClientRange ${e} - ${t}`);let n=this.clientRange.from,s=Math.min(this.clientRange.to,this.rowCount);if(e===n&&t===s)return[!1,Ne];let o=this.clientRange.copy();this.clientRange.from=e,this.clientRange.to=t,this.rowsWithinRange=0;for(let a=e;a<t;a++){let c=a-m(this,h).from;this.internalData[c]&&(this.rowsWithinRange+=1)}let i=Ne,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 n,s;if(e!==m(this,h).from||t!==m(this,h).to){(n=C.debug)==null||n.call(C,`setRange ${e} - ${t}`);let[o,i]=m(this,h).overlap(e,t),u=new Array(t-e);this.rowsWithinRange=0;for(let l=o;l<i;l++){let p=this.getAtIndex(l);if(p){let a=l-e;u[a]=p,this.isWithinClientRange(l)&&(this.rowsWithinRange+=1)}}this.internalData=u,m(this,h).from=e,m(this,h).to=t}else(s=C.debug)==null||s.call(C,`setRange ${e} - ${t} IGNORED because not changed`)}get data(){return this.internalData}getData(){var u;let{from:e,to:t}=m(this,h),{from:n,to:s}=this.clientRange,o=Math.max(0,n-e),i=Math.min(t-e,t,s-e,(u=this.rowCount)!=null?u:t);return this.internalData.slice(o,i)}clear(){var e;(e=C.debug)==null||e.call(C,"clear"),this.internalData.length=0,this.rowsWithinRange=0,this.setRowCount(0)}getCurrentDataRange(){let e=this.internalData,t=e.length,[n]=this.internalData,s=this.internalData[t-1];if(n&&s)return[n.rowIndex,s.rowIndex];for(let o=0;o<t;o++)if(e[o]!==void 0){n=e[o];break}for(let o=t-1;o>=0;o--)if(e[o]!==void 0){s=e[o];break}return n&&s?[n.rowIndex,s.rowIndex]:[-1,-1]}};h=new WeakMap;var{debug:f,debugEnabled:N,error:pt,info:d,infoEnabled:dt,warn:M}=b("viewport"),gt=({rowKey:r,updateType:e})=>e==="U"&&!r.startsWith("$root"),U=[void 0,void 0],ht={count:0,mode:void 0,size:0,ts:0},q=class{constructor({aggregations:e,bufferSize:t=50,columns:n,filter:s,groupBy:o=[],table:i,range:u,sort:l,title:p,viewport:a,visualLink:c},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 x("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:n}=this.lastUpdateStatus,s=0;if(n===e){let o=Date.now();this.lastUpdateStatus.count+=1,this.lastUpdateStatus.ts=o,s=t===0?0:o-t}else this.lastUpdateStatus.count=1,this.lastUpdateStatus.ts=0,s=0;return this.lastUpdateStatus.mode=e,s};this.rangeRequestAlreadyPending=e=>{let{bufferSize:t}=this,n=t*.25,{from:s}=e;for(let{from:o,to:i}of this.pendingRangeRequests)if(s>=o&&s<i){if(e.to+n<=i)return!0;s=i}return!1};this.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=n,this.filter=s,this.groupBy=o,this.keys=new k(u),this.pendingLinkedParent=c,this.table=i,this.sort=l,this.title=p,dt&&(d==null||d(`constructor #${a} ${i.table} bufferSize=${t}`)),this.dataWindow=new W(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:Ee,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:n,filterSpec:s,range:o,sort:i,groupBy:u,table:l},p){this.serverViewportId=e,this.status="subscribed",this.aggregations=t,this.columns=n,this.groupBy=u,this.isTree=u&&u.length>0,this.dataWindow.setRange(o.from,o.to);let a=l===p.table.table?p:{...p,table:{...p.table,session:l}};return{aggregations:t,type:"subscribed",clientViewportId:this.clientViewportId,columns:n,filter:s,groupBy:u,range:o,sort:i,tableSchema:a}}awaitOperation(e,t){this.pendingOperations.set(e,t)}completeOperation(e,...t){var u;let{clientViewportId:n,pendingOperations:s}=this,o=s.get(e);if(!o){pt(`no matching operation found to complete for requestId ${e}`);return}let{type:i}=o;if(d==null||d(`completeOperation ${i}`),s.delete(e),i==="CHANGE_VP_RANGE"){let[l,p]=t;(u=this.dataWindow)==null||u.setRange(l,p);for(let a=this.pendingRangeRequests.length-1;a>=0;a--){let c=this.pendingRangeRequests[a];if(c.requestId===e){c.acked=!0;break}else M==null||M("range requests sent faster than they are being ACKed")}}else if(i==="config"){let{aggregations:l,columns:p,filter:a,groupBy:c,sort:g}=o.data;return this.aggregations=l,this.columns=p,this.filter=a,this.groupBy=c,this.sort=g,c.length>0?this.isTree=!0:this.isTree&&(this.isTree=!1),f==null||f(`config change confirmed, isTree : ${this.isTree}`),{clientViewportId:n,type:i,config:o.data}}else{if(i==="groupBy")return this.isTree=o.data.length>0,this.groupBy=o.data,f==null||f(`groupBy change confirmed, isTree : ${this.isTree}`),{clientViewportId:n,type:i,groupBy:o.data};if(i==="columns")return this.columns=o.data,{clientViewportId:n,type:i,columns:o.data};if(i==="filter")return this.filter=o.data,{clientViewportId:n,type:i,filter:o.data};if(i==="aggregate")return this.aggregations=o.data,{clientViewportId:n,type:"aggregate",aggregations:this.aggregations};if(i==="sort")return this.sort=o.data,{clientViewportId:n,type:i,sort:this.sort};if(i!=="selection"){if(i==="disable")return this.disabled=!0,{type:"disabled",clientViewportId:n};if(i==="enable")return this.disabled=!1,{type:"enabled",clientViewportId:n};if(i==="CREATE_VISUAL_LINK"){let[l,p,a]=t;return this.linkedParent={colName:l,parentViewportId:p,parentColName:a},this.pendingLinkedParent=void 0,{type:"vuu-link-created",clientViewportId:n,colName:l,parentViewportId:p,parentColName:a}}else if(i==="REMOVE_VISUAL_LINK")return this.linkedParent=void 0,{type:"vuu-link-removed",clientViewportId:n}}}}rangeRequest(e,t){N&&this.rangeMonitor.set(t);let n="CHANGE_VP_RANGE";if(this.dataWindow){let[s,o]=this.dataWindow.setClientRange(t.from,t.to),i,u=this.dataWindow.rowCount||void 0,l=s&&!this.rangeRequestAlreadyPending(t)?{type:n,viewPortId:this.serverViewportId,...G(t,this.bufferSize,u)}:null;if(l){N&&(f==null||f(`create CHANGE_VP_RANGE: [${l.from} - ${l.to}]`)),this.awaitOperation(e,{type:n});let a=this.pendingRangeRequests.at(-1);if(a)if(a.acked)console.warn("Range Request before previous request is filled");else{let{from:c,to:g}=a;this.dataWindow.outOfRange(c,g)?i={clientViewportId:this.clientViewportId,type:"debounce-begin"}:M==null||M("Range Request before previous request is acked")}this.pendingRangeRequests.push({...l,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?[l,o.map(a=>p(a,this.keys,this.selectedRows))]:i?[l,void 0,i]:[l]}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,n,s){let o={type:"CREATE_VISUAL_LINK",parentVpId:n,childVpId:this.serverViewportId,parentColumnName:s,childColumnName:t};return this.awaitOperation(e,o),this.useBatchMode&&(this.batchMode=!0),o}removeLink(e){let t={type:"REMOVE_VISUAL_LINK",childVpId:this.serverViewportId};return this.awaitOperation(e,t),t}suspend(){this.suspended=!0,d==null||d("suspend")}resume(){return this.suspended=!1,N&&(f==null||f(`resume: ${this.currentData()}`)),[this.size,this.currentData()]}currentData(){let e=[];if(this.dataWindow){let t=this.dataWindow.getData(),{keys:n}=this,s=this.isTree?j:J;for(let o of t)o&&e.push(s(o,n,this.selectedRows))}return e}enable(e){return this.awaitOperation(e,{type:"enable"}),d==null||d(`enable: ${this.serverViewportId}`),{type:Me,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})}setConfig(e,t){var o;this.awaitOperation(e,{type:"config",data:t});let{filter:n,...s}=t;return this.useBatchMode&&(this.batchMode=!0),N?f==null||f(`setConfig ${JSON.stringify(t)}`):d==null||d("setConfig"),!this.isTree&&t.groupBy.length>0&&((o=this.dataWindow)==null||o.clear()),this.createRequest({...s,filterSpec:typeof(n==null?void 0:n.filter)=="string"?{filter:n.filter}:{filter:""}},!0)}aggregateRequest(e,t){return this.awaitOperation(e,{type:"aggregate",data:t}),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})}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 n=this.pendingRangeRequests.length-1;n>=0;n--){let{from:s,to:o}=this.pendingRangeRequests[n],i=!0;if(e>=s&&e<o||t>s&&t<o){i||console.warn("removePendingRangeRequest TABLE_ROWS are not for latest request"),this.pendingRangeRequests.splice(n,1);break}else i=!1}}updateRows(e){var s,o,i;let[t,n]=Re(e);if(t&&n&&this.removePendingRangeRequest(t.rowIndex,n.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"||((s=this.dataWindow)==null?void 0:s.rowCount)!==u.vpSize)&&((o=this.dataWindow)==null||o.setRowCount(u.vpSize),this.rowCountChanged=!0),u.updateType==="U"&&(i=this.dataWindow)!=null&&i.setAtIndex(u)&&(this.hasUpdates=!0,this.batchMode||this.pendingUpdates.push(u)))}getClientRows(){let e,t="size-only";if(!this.hasUpdates&&!this.rowCountChanged)return U;if(this.hasUpdates){let{keys:n,selectedRows:s}=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,n,s));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,n,s));this.batchMode=!1}}this.hasUpdates=!1}return this.throttleMessage(t)?U:[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:n},s,o)=>[r,s.keyFor(r),!0,!1,0,0,e,t?H(o,r):0].concat(n),j=({rowIndex:r,rowKey:e,sel:t,data:n},s,o)=>{let[i,u,,l,,p,...a]=n;return[r,s.keyFor(r),l,u,i,p,e,t?H(o,r):0].concat(a)};var Ue=1;var{debug:V,debugEnabled:Y,error:y,info:T,infoEnabled:ft,warn:Q}=b("server-proxy"),R=()=>`${Ue++}`,mt={},Ct=r=>r.disabled!==!0&&r.suspended!==!0,Rt={type:"NO_ACTION"},St=(r,e,t)=>r.map(n=>n.parentVpId===e?{...n,label:t}:n);function Tt(r,e){return r.map(t=>{let{parentVpId:n}=t,s=e.get(n);if(s)return{...t,parentClientVpId:s.clientViewportId,label:s.title};throw Error("addLabelsToLinks viewport not found")})}var 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 n=s=>{s.forEach(o=>{let{clientViewportId:i}=o;this.viewports.set(i,o),this.sendMessageToServer(o.subscribe(),i)})};n(e),setTimeout(()=>{n(t)},2e3)}async login(e,t="user"){if(e)return this.authToken=e,this.user=t,new Promise((n,s)=>{this.sendMessageToServer({type:Pe,token:this.authToken,user:t},""),this.pendingLogin={resolve:n,reject:s}});this.authToken===""&&y("login, cannot login until auth token has been obtained")}subscribe(e){if(this.mapClientToServerViewport.has(e.viewport))y(`spurious subscribe call ${e.viewport}`);else{let t=this.getTableMeta(e.table),n=new q(e,this.postMessageToClient);this.viewports.set(e.viewport,n);let s=this.awaitResponseToMessage(n.subscribe(),e.viewport);Promise.all([s,t]).then(([i,u])=>{let{viewPortId:l}=i,{status:p}=n;e.viewport!==l&&(this.viewports.delete(e.viewport),this.viewports.set(l,n)),this.mapClientToServerViewport.set(e.viewport,l);let a=n.handleSubscribed(i,u);a&&(this.postMessageToClient(a),Y&&V(`post DataSourceSubscribedMessage to client: ${JSON.stringify(a)}`)),n.disabled&&this.disableViewport(n),this.queuedRequests.length>0&&this.processQueuedRequests(),p==="subscribing"&&!O(n.table)&&(this.sendMessageToServer({type:K,vpId:l}),this.sendMessageToServer({type:_e,vpId:l}),Array.from(this.viewports.entries()).filter(([c,{disabled:g}])=>c!==l&&!g).forEach(([c])=>{this.sendMessageToServer({type:K,vpId:c})}))})}}processQueuedRequests(){let e={};for(;this.queuedRequests.length;){let t=this.queuedRequests.pop();if(t){let{clientViewportId:n,message:s,requestId:o}=t;if(s.type==="CHANGE_VP_RANGE"){if(e.CHANGE_VP_RANGE)continue;e.CHANGE_VP_RANGE=!0;let i=this.mapClientToServerViewport.get(n);i&&this.sendMessageToServer({...s,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:ke,viewPortId:t})):y(`failed to unsubscribe client viewport ${e}, viewport not found`)}getViewportForClient(e,t=!0){let n=this.mapClientToServerViewport.get(e);if(n){let s=this.viewports.get(n);if(s)return s;if(t)throw Error(`Viewport not found for client viewport ${e}`);return null}else{if(this.viewports.has(e))return this.viewports.get(e);if(t)throw Error(`Viewport server id not found for client viewport ${e}`);return null}}setViewRange(e,t){let n=R(),[s,o,i]=e.rangeRequest(n,t.range);T==null||T(`setViewRange ${t.range.from} - ${t.range.to}`),s&&(this.sendIfReady(s,n,e.status==="subscribed")||this.queuedRequests.push({clientViewportId:t.viewport,message:s,requestId:n})),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 n=R(),s=e.setConfig(n,t.config);this.sendIfReady(s,n,e.status==="subscribed")}aggregate(e,t){let n=R(),s=e.aggregateRequest(n,t.aggregations);this.sendIfReady(s,n,e.status==="subscribed")}sort(e,t){let n=R(),s=e.sortRequest(n,t.sort);this.sendIfReady(s,n,e.status==="subscribed")}setColumns(e,t){let n=R(),{columns:s}=t,o=e.columnRequest(n,s);this.sendIfReady(o,n,e.status==="subscribed")}setTitle(e,t){e&&(e.title=t.title,this.updateTitleOnVisualLinks(e))}select(e,t){let n=R(),{selected:s}=t,o=e.selectRequest(n,s);this.sendIfReady(o,n,e.status==="subscribed")}disableViewport(e){let t=R(),n=e.disable(t);this.sendIfReady(n,t,e.status==="subscribed")}enableViewport(e){if(e.disabled){let t=R(),n=e.enable(t);this.sendIfReady(n,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,n]=e.resume();V==null||V(`resumeViewport size ${t}, ${n.length} rows sent to client`),this.postMessageToClient({clientViewportId:e.clientViewportId,mode:"batch",rows:n,size:t,type:"viewport-update"})}openTreeNode(e,t){if(e.serverViewportId){let n=R();this.sendIfReady(e.openTreeNode(n,t),n,e.status==="subscribed")}}closeTreeNode(e,t){if(e.serverViewportId){let n=R();this.sendIfReady(e.closeTreeNode(n,t),n,e.status==="subscribed")}}createLink(e,t){let{parentClientVpId:n,parentColumnName:s,childColumnName:o}=t,i=R(),u=this.mapClientToServerViewport.get(n);if(u){let l=e.createLink(i,o,u,s);this.sendMessageToServer(l,i)}else y("ServerProxy unable to create link, viewport not found")}removeLink(e){let t=R(),n=e.removeLink(t);this.sendMessageToServer(n,t)}updateTitleOnVisualLinks(e){var s;let{serverViewportId:t,title:n}=e;for(let o of this.viewports.values())if(o!==e&&o.links&&t&&n&&(s=o.links)!=null&&s.some(i=>i.parentVpId===t)){let[i]=o.setLinks(St(o.links,t,n));this.postMessageToClient(i)}}removeViewportFromVisualLinks(e){var t;for(let n of this.viewports.values())if((t=n.links)!=null&&t.some(({parentVpId:s})=>s===e)){let[s]=n.setLinks(n.links.filter(({parentVpId:o})=>o!==e));this.postMessageToClient(s)}}menuRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[n,s]=A(e);this.sendMessageToServer({...s,vpId:t.serverViewportId},n)}}viewportRpcCall(e){let t=this.getViewportForClient(e.vpId,!1);if(t!=null&&t.serverViewportId){let[n,s]=A(e);this.sendMessageToServer({...s,vpId:t.serverViewportId,namedParams:{}},n)}}rpcCall(e){let[t,n]=A(e),s=We(n.service);this.sendMessageToServer(n,t,{module:s})}handleMessageFromClient(e){var t;if(ge(e))if(e.type==="disable"){let n=this.getViewportForClient(e.viewport,!1);return n!==null?this.disableViewport(n):void 0}else{let n=this.getViewportForClient(e.viewport);switch(e.type){case"setViewRange":return this.setViewRange(n,e);case"config":return this.setConfig(n,e);case"aggregate":return this.aggregate(n,e);case"sort":return this.sort(n,e);case"select":return this.select(n,e);case"suspend":return this.suspendViewport(n);case"resume":return this.resumeViewport(n);case"enable":return this.enableViewport(n);case"openTreeNode":return this.openTreeNode(n,e);case"closeTreeNode":return this.closeTreeNode(n,e);case"createLink":return this.createLink(n,e);case"removeLink":return this.removeLink(n);case"setColumns":return this.setColumns(n,e);case"setTitle":return this.setTitle(n,e);default:}}else{if(Ce(e))return this.viewportRpcCall(e);if(me(e))return this.menuRpcCall(e);{let{type:n,requestId:s}=e;switch(n){case"GET_TABLE_LIST":{(t=this.tableList)!=null||(this.tableList=this.awaitResponseToMessage({type:n},s)),this.tableList.then(o=>{this.postMessageToClient({type:"TABLE_LIST_RESP",tables:o.tables,requestId:s})});return}case"GET_TABLE_META":{this.getTableMeta(e.table,s).then(o=>{o&&this.postMessageToClient({type:"TABLE_META_RESP",tableSchema:o,requestId:s})});return}case"RPC_CALL":return this.rpcCall(e);default:}}}y(`Vuu ServerProxy Unexpected message from client ${JSON.stringify(e)}`)}getTableMeta(e,t=R()){if(O(e))return Promise.resolve(void 0);let n=`${e.module}:${e.table}`,s=this.cachedTableMetaRequests.get(n);return s||(s=this.awaitResponseToMessage({type:"GET_TABLE_META",table:e},t),this.cachedTableMetaRequests.set(n,s)),s==null?void 0:s.then(o=>this.cacheTableMeta(o))}awaitResponseToMessage(e,t=R()){return new Promise((n,s)=>{this.sendMessageToServer(e,t),this.pendingRequests.set(t,{reject:s,resolve:n})})}sendIfReady(e,t,n=!0){return n&&this.sendMessageToServer(e,t),n}sendMessageToServer(e,t=`${Ue++}`,n=mt){let{module:s="CORE"}=n;this.authToken&&this.connection.send({requestId:t,sessionId:this.sessionId,token:this.authToken,user:this.user,module:s,body:e})}handleMessageFromServer(e){var u;let{body:t,requestId:n,sessionId:s}=e,o=this.pendingRequests.get(n);if(o){let{resolve:a}=o;this.pendingRequests.delete(n),a(t);return}let{viewports:i}=this;switch(t.type){case De:this.sendMessageToServer({type:Ie,ts:+new Date},"NA");break;case"LOGIN_SUCCESS":if(s)this.sessionId=s,(u=this.pendingLogin)==null||u.resolve(s),this.pendingLogin=void 0;else throw Error("LOGIN_SUCCESS did not provide sessionId");break;case"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 Oe:{let a=this.viewports.get(t.vpId);a&&a.completeOperation(n)}break;case Te:case ve:if(i.has(t.viewPortId)){let a=this.viewports.get(t.viewPortId);if(a){let c=a.completeOperation(n);c!==void 0&&(this.postMessageToClient(c),Y&&V(`postMessageToClient ${JSON.stringify(c)}`))}}break;case ye:{let a=this.viewports.get(t.viewPortId);if(a){let c=a.completeOperation(n);if(c){this.postMessageToClient(c);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[c,g]of Object.entries(a)){let S=i.get(c);S?S.updateRows(g):Q==null||Q(`TABLE_ROW message received for non registered viewport ${c}`)}this.processUpdates()}break;case"CHANGE_VP_RANGE_SUCCESS":{let a=this.viewports.get(t.viewPortId);if(a){let{from:c,to:g}=t;a.completeOperation(n,c,g)}}break;case xe:case we:break;case"CREATE_VISUAL_LINK_SUCCESS":{let a=this.viewports.get(t.childVpId),c=this.viewports.get(t.parentVpId);if(a&&c){let{childColumnName:g,parentColumnName:S}=t,D=a.completeOperation(n,g,c.clientViewportId,S);D&&this.postMessageToClient(D)}}break;case"REMOVE_VISUAL_LINK_SUCCESS":{let a=this.viewports.get(t.childVpId);if(a){let c=a.completeOperation(n);c&&this.postMessageToClient(c)}}break;case"VP_VISUAL_LINKS_RESP":{let a=this.getActiveLinks(t.links),c=this.viewports.get(t.vpId);if(a.length&&c){let g=Tt(a,this.viewports),[S,D]=c.setLinks(g);if(this.postMessageToClient(S),D){let{link:se,parentClientVpId:ze}=D,re=R(),oe=this.mapClientToServerViewport.get(ze);if(oe){let Ke=c.createLink(re,se.fromColumn,oe,se.toColumn);this.sendMessageToServer(Ke,re)}}}}break;case"VIEW_PORT_MENUS_RESP":if(t.menu.name){let a=this.viewports.get(t.vpId);if(a){let c=a.setMenu(t.menu);this.postMessageToClient(c)}}break;case"VP_EDIT_RPC_RESPONSE":this.postMessageToClient({action:t.action,requestId:n,rpcName:t.rpcName,type:"VP_EDIT_RPC_RESPONSE"});break;case"VP_EDIT_RPC_REJECT":this.viewports.get(t.vpId)&&this.postMessageToClient({requestId:n,type:"VP_EDIT_RPC_REJECT",error:t.error});break;case"VIEW_PORT_MENU_REJ":{console.log("send menu error back to client");let{error:a,rpcName:c,vpId:g}=t,S=this.viewports.get(g);S&&this.postMessageToClient({clientViewportId:S.clientViewportId,error:a,rpcName:c,type:"VIEW_PORT_MENU_REJ",requestId:n});break}case"VIEW_PORT_MENU_RESP":if(fe(t)){let{action:a,rpcName:c}=t;this.awaitResponseToMessage({type:"GET_TABLE_META",table:a.table}).then(g=>{let S=z(g);this.postMessageToClient({rpcName:c,type:"VIEW_PORT_MENU_RESP",action:{...a,tableSchema:S},tableAlreadyOpen:this.isTableOpen(a.table),requestId:n})})}else{let{action:a}=t;this.postMessageToClient({type:"VIEW_PORT_MENU_RESP",action:a||Rt,tableAlreadyOpen:a!==null&&this.isTableOpen(a.table),requestId:n})}break;case"RPC_RESP":{let{method:a,result:c}=t;this.postMessageToClient({type:"RPC_RESP",method:a,result:c,requestId:n})}break;case"VIEW_PORT_RPC_REPONSE":{let{method:a,action:c}=t;this.postMessageToClient({type:"VIEW_PORT_RPC_RESPONSE",rpcName:a,action:c,requestId:n})}break;case"ERROR":y(t.msg);break;default:ft&&T(`handleMessageFromServer ${t.type}.`)}}cacheTableMeta(e){let{module:t,table:n}=e.table,s=`${t}:${n}`,o=this.cachedTableSchemas.get(s);return o||(o=z(e),this.cachedTableSchemas.set(s,o)),o}isTableOpen(e){if(e){let t=e.table;for(let n of this.viewports.values())if(!n.suspended&&n.table.table===t)return!0}}getActiveLinks(e){return e.filter(t=>{let n=this.viewports.get(t.parentVpId);return n&&!n.suspended})}processUpdates(){this.viewports.forEach(e=>{var t;if(e.hasUpdatesToProcess){let n=e.getClientRows();if(n!==U){let[s,o]=n,i=e.getNewRowCount();(i!==void 0||s&&s.length>0)&&(Y&&V(`postMessageToClient #${e.clientViewportId} viewport-update ${o}, ${(t=s==null?void 0:s.length)!=null?t:"no"} rows, size ${i}`),o&&this.postMessageToClient({clientViewportId:e.clientViewportId,mode:o,rows:s,size:i,type:"viewport-update"}))}}})}};var{debug:un,debugEnabled:ln,error:qe,info:w,infoEnabled:bt,warn:_}=b("websocket-connection"),Be={},Z=Symbol("setWebsocket"),$=Symbol("connectionCallback");async function Ge(r,e,t,n=10,s=5){return Be[r]={status:"connecting",connect:{allowed:s,remaining:s},reconnect:{allowed:n,remaining:n}},He(r,e,t)}async function X(r){throw Error("connection broken")}async function He(r,e,t,n){let{status:s,connect:o,reconnect:i}=Be[r],u=s==="connecting"?o:i;try{t({type:"connection-status",status:"connecting"});let l=typeof n<"u",p=await Et(r,e);console.info("%c\u26A1 %cconnected","font-size: 24px;color: green;font-weight: bold;","color:green; font-size: 14px;"),n!==void 0&&n[Z](p);let a=n!=null?n:new ee(p,r,e,t),c=l?"reconnected":"connection-open-awaiting-session";return t({type:"connection-status",status:c}),a.status=c,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,n,2e3);throw t({type:"connection-status",status:"failed",reason:"unable to connect",retry:p}),Error("Failed to establish connection")}}var wt=(r,e,t,n,s)=>new Promise(o=>{setTimeout(()=>{o(He(r,e,t,n))},s)}),Et=(r,e)=>new Promise((t,n)=>{bt&&e!==void 0&&w(`WebSocket Protocol ${e==null?void 0:e.toString()}`);let s=new WebSocket(r,e);s.onopen=()=>t(s),s.onerror=o=>n(o)}),Fe=()=>{_==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,n,s){this.close=Fe;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[$](t)};this.url=t,this.protocol=n,this[$]=s,this[Z](e)}reconnect(){X(this)}[($,Z)](e){let t=this[$];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"&&(X(this),this.send=s)},e.onclose=()=>{w==null||w("\u26A1 connection close"),t({type:"connection-status",status:"disconnected",reason:"close"}),this.connectionMetricsInterval&&(clearInterval(this.connectionMetricsInterval),this.connectionMetricsInterval=null),this.status!=="closed"&&(X(this),this.send=s)};let n=o=>{e.send(JSON.stringify(o))},s=o=>{w==null||w(`TODO queue message until websocket reconnected ${o.body.type}`)};this.send=n,this.close=()=>{this.status="closed",e.close(),this.close=Fe,this.send=$e,w==null||w("close websocket")}}};var v,{info:te,infoEnabled:ne}=b("worker");async function vt(r,e,t,n,s,o,i){let u=await Ge(r,e,l=>{de(l)?postMessage({type:"connection-metrics",messages:l}):pe(l)?(s(l),l.status==="reconnected"&&v.reconnect()):v.handleMessageFromServer(l)},o,i);v=new F(u,l=>Mt(l)),u.requiresLogin&&await v.login(t,n)}function Mt(r){postMessage(r)}var yt=async({data:r})=>{switch(r.type){case"connect":try{await vt(r.url,r.protocol,r.token,r.username,postMessage,r.retryLimitDisconnect,r.retryLimitStartup),postMessage({type:"connected"})}catch(e){postMessage({type:"connection-failed",reason:String(e)})}break;case"subscribe":ne&&te(`client subscribe: ${JSON.stringify(r)}`),v.subscribe(r);break;case"unsubscribe":ne&&te(`client unsubscribe: ${JSON.stringify(r)}`),v.unsubscribe(r.viewport);break;default:ne&&te(`client message: ${JSON.stringify(r)}`),v.handleMessageFromClient(r)}};self.addEventListener("message",yt);postMessage({type:"ready"});\n\n';var ne=new Blob([ee()+x],{type:"text/javascript"}),oe=URL.createObjectURL(ne),b,L,m=[],B,z,G=new Promise((t,r)=>{B=t,z=r}),F=()=>G,_=new Map,P=new Map,ae=async({handleConnectionStatusChange:t,protocol:r,retryLimitDisconnect:e,retryLimitStartup:s,token:o="",username:u,url:c})=>o===""&&L===void 0?new Promise((d,g)=>{m.push({resolve:d,reject:g})}):L||(L=new Promise((d,g)=>{let f=new Worker(oe),T=window.setTimeout(()=>{g(Error("timed out waiting for worker to load"))},1e3);f.onmessage=S=>{let{data:w}=S;if(w.type==="ready")window.clearTimeout(T),f.postMessage({protocol:r,retryLimitDisconnect:e,retryLimitStartup:s,token:o,type:"connect",url:c,username:u});else if(w.type==="connected"){f.onmessage=J,d(f);for(let k of m)k.resolve(f);m.length=0}else if($(w))t({data:w});else if(w.type==="connection-failed"){g(w.reason);for(let k of m)k.reject(w.reason);m.length=0}else console.warn("ConnectionManager: Unexpected message from the worker")}}));function J({data:t}){if(W(t)){let r=_.get(t.clientViewportId);r?r.postMessageToClientDataSource(t):console.error(`[ConnectionManager] ${t.type} message received, viewport not found`)}else if($(t))D.emit("connection-status",t);else if(te(t))D.emit("connection-metrics",t);else{let r=t.requestId;if(P.has(r)){let{resolve:e}=P.get(r);P.delete(r);let{type:s,requestId:o,...u}=t;ie(t)?e(t.result):t.type==="VP_EDIT_RPC_RESPONSE"||t.type==="VP_EDIT_RPC_REJECT"?e(t):se(t)?e(t.tableSchema):e(u)}else console.warn("%cConnectionManager Unexpected message from the worker","color:red;font-weight:bold;")}}var O=t=>{let r=re();return b.postMessage({requestId:r,...t}),new Promise((e,s)=>{P.set(r,{resolve:e,reject:s})})},le={subscribe:(t,r)=>{if(_.get(t.viewport))throw Error("ConnectionManager attempting to subscribe with an existing viewport id");_.set(t.viewport,{status:"subscribing",request:t,postMessageToClientDataSource:r}),b.postMessage({type:"subscribe",...t})},unsubscribe:t=>{b.postMessage({type:"unsubscribe",viewport:t})},send:t=>{b.postMessage(t)},destroy:t=>{t&&_.has(t)&&_.delete(t)},rpcCall:async t=>O(t),getTableList:async()=>O({type:"GET_TABLE_LIST"}),getTableSchema:async t=>O({type:q,table:t})},N=class extends Y{async connect({url:r,authToken:e,username:s,protocol:o,retryLimitDisconnect:u,retryLimitStartup:c}){return b=await ae({protocol:o,url:r,token:e,username:s,retryLimitDisconnect:u,retryLimitStartup:c,handleConnectionStatusChange:J}),le}destroy(){b.terminate()}},D=new N,De=async({url:t,protocol:r=void 0,authToken:e,username:s,retryLimitDisconnect:o,retryLimitStartup:u})=>{try{let c=await D.connect({protocol:r,url:t,authToken:e,username:s,retryLimitDisconnect:o,retryLimitStartup:u});return B(c),"connected"}catch(c){return z(c),"rejected"}},Ae=async t=>{try{return(await G).rpcCall(t)}catch{throw Error("Error accessing server api")}};var ue=0,Ue={get nextValue(){return ue++}},qe={connect:"connect",connectionStatus:"connection-status",getFilterData:"GetFilterData",rowData:"rowData",rowSet:"rowset",select:"select",selectAll:"selectAll",selectNone:"selectNone",selected:"selected",snapshot:"snapshot",update:"update",createLink:"createLink",disable:"disable",enable:"enable",suspend:"suspend",resume:"resume",addSubscription:"AddSubscription",closeTreeNode:"closeTreeNode",columnList:"ColumnList",data:"data",openTreeNode:"openTreeNode",aggregate:"aggregate",filter:"filter",filterQuery:"filterQuery",filterData:"filterData",getSearchData:"GetSearchData",groupBy:"groupBy",modifySubscription:"ModifySubscription",searchData:"searchData",setGroupState:"setGroupState",size:"size",sort:"sort",subscribed:"Subscribed",tableList:"TableList",unsubscribe:"TerminateSubscription",viewRangeChanged:"ViewRangeChanged"};var ce=["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"],$e=t=>ce.includes(t.type),Be=t=>t.type==="VIEW_PORT_RPC_CALL",ze=({requestId:t,...r})=>[t,r],Ge=t=>{let r=t.at(0);if(r.updateType==="SIZE"){if(t.length===1)return t;r=t.at(1)}let e=t.at(-1);return[r,e]},Fe=t=>{let r={};for(let e of t)(r[e.viewPortId]||(r[e.viewPortId]=[])).push(e);return r},Je=({columns:t,dataTypes:r,key:e,table:s})=>({table:s,columns:t.map((o,u)=>({name:o,serverDataType:r[u]})),key:e});import{parseFilter as he}from"@vuu-ui/vuu-filter-parser";import{isConfigChanged as pe,debounce as K,EventEmitter as de,isViewportMenusAction as ge,isVisualLinksAction as fe,itemsOrOrderChanged as we,logger as ve,metadataKeys as Re,throttle as be,uuid as Ee,vanillaConfig as Ce,withConfigDefaults as Te}from"@vuu-ui/vuu-utils";var{info:h}=ve("VuuDataSource"),{KEY:Se}=Re,n,M,y,I,E,v,V,C,a,R,H=class extends de{constructor({bufferSize:e=100,aggregations:s,columns:o,filter:u,groupBy:c,sort:d,table:g,title:f,viewport:T,visualLink:S}){super();this.server=null;p(this,n,Ce);p(this,M,[]);p(this,y,void 0);p(this,I,void 0);p(this,E,"throttle");p(this,v,{from:0,to:0});p(this,V,0);p(this,C,0);p(this,a,"initialising");p(this,R,void 0);this.handleMessageFromServer=e=>{var s,o;if(e.type==="subscribed")l(this,a,"subscribed"),e.tableSchema&&(this.tableSchema=e.tableSchema),(s=this.clientCallback)==null||s.call(this,e);else if(e.type==="disabled")l(this,a,"disabled");else if(e.type==="enabled")l(this,a,"enabled");else{if(U(e))return;e.type==="debounce-begin"?this.optimize="debounce":(e.type==="viewport-update"&&e.size!==void 0&&e.size!==i(this,C)&&(l(this,C,e.size),this.emit("resize",e.size)),this.configChangePending&&this.setConfigPending(),ge(e)?l(this,I,e.menu):fe(e)?l(this,y,e.links):(o=this.clientCallback)==null||o.call(this,e),this.optimize==="debounce"&&this.revertDebounce())}};this.revertDebounce=K(()=>{this.optimize="throttle"},100);this.rawRangeRequest=e=>{this.viewport&&this.server&&this.server.send({viewport:this.viewport,type:"setViewRange",range:e})};this.debounceRangeRequest=K(e=>{this.viewport&&this.server&&this.server.send({viewport:this.viewport,type:"setViewRange",range:e})},50);this.throttleRangeRequest=be(e=>{this.viewport&&this.server&&this.server.send({viewport:this.viewport,type:"setViewRange",range:e})},80);if(!g)throw Error("RemoteDataSource constructor called without table");this.bufferSize=e,this.table=g,this.viewport=T,l(this,n,{...i(this,n),aggregations:s||i(this,n).aggregations,columns:o||i(this,n).columns,filter:u||i(this,n).filter,groupBy:c||i(this,n).groupBy,sort:d||i(this,n).sort,visualLink:S||i(this,n).visualLink}),l(this,R,f),this.rangeRequest=this.throttleRangeRequest}async subscribe({viewport:e=(T=>(T=this.viewport)!=null?T:this.viewport=Ee())(),columns:s,aggregations:o,range:u,sort:c,groupBy:d,filter:g},f){var w;if(i(this,a)==="disabled"||i(this,a)==="disabling"){this.enable(f);return}if(this.clientCallback=f,(o||s||g||d||c)&&l(this,n,{...i(this,n),aggregations:o||i(this,n).aggregations,columns:s||i(this,n).columns,filter:g||i(this,n).filter,groupBy:d||i(this,n).groupBy,sort:c||i(this,n).sort}),u&&l(this,v,u),i(this,a)!=="initialising"&&i(this,a)!=="unsubscribed")return;l(this,a,"subscribing"),this.viewport=e,this.server=await F();let{bufferSize:S}=this;(w=this.server)==null||w.subscribe({...i(this,n),bufferSize:S,viewport:e,table:this.table,range:i(this,v),title:i(this,R)},this.handleMessageFromServer)}unsubscribe(){var e,s;console.log(`unsubscribe #${this.viewport}`),h==null||h(`unsubscribe #${this.viewport}`),this.viewport&&((e=this.server)==null||e.unsubscribe(this.viewport)),(s=this.server)==null||s.destroy(this.viewport),this.server=null,this.removeAllListeners(),l(this,a,"unsubscribed"),this.viewport=void 0,this.range={from:0,to:0}}suspend(){var e;return console.log(`suspend #${this.viewport}, current status ${i(this,a)}`),h==null||h(`suspend #${this.viewport}, current status ${i(this,a)}`),this.viewport&&(l(this,a,"suspended"),(e=this.server)==null||e.send({type:"suspend",viewport:this.viewport})),this}resume(){var o;console.log(`resume #${this.viewport}, current status ${i(this,a)}`);let e=i(this,a).startsWith("disabl"),s=i(this,a)==="suspended";return h==null||h(`resume #${this.viewport}, current status ${i(this,a)}`),this.viewport&&(e?this.enable():s&&((o=this.server)==null||o.send({type:"resume",viewport:this.viewport}),l(this,a,"subscribed"))),this}disable(){var e;return h==null||h(`disable #${this.viewport}, current status ${i(this,a)}`),this.viewport&&(l(this,a,"disabling"),(e=this.server)==null||e.send({viewport:this.viewport,type:"disable"})),this}enable(e){var s;return h==null||h(`enable #${this.viewport}, current status ${i(this,a)}`),this.viewport&&(i(this,a)==="disabled"||i(this,a)==="disabling")&&(l(this,a,"enabling"),e&&(this.clientCallback=e),(s=this.server)==null||s.send({viewport:this.viewport,type:"enable"})),this}select(e){var s;l(this,V,e.length),this.viewport&&((s=this.server)==null||s.send({viewport:this.viewport,type:"select",selected:e}))}openTreeNode(e){var s;this.viewport&&((s=this.server)==null||s.send({viewport:this.viewport,type:"openTreeNode",key:e}))}closeTreeNode(e){var s;this.viewport&&((s=this.server)==null||s.send({viewport:this.viewport,type:"closeTreeNode",key:e}))}get links(){return i(this,y)}get menu(){return i(this,I)}get status(){return i(this,a)}get optimize(){return i(this,E)}set optimize(e){if(e!==i(this,E)){switch(l(this,E,e),e){case"none":this.rangeRequest=this.rawRangeRequest;break;case"debounce":this.rangeRequest=this.debounceRangeRequest;break;case"throttle":this.rangeRequest=this.throttleRangeRequest;break}this.emit("optimize",e)}}get selectedRowsCount(){return i(this,V)}get size(){return i(this,C)}get range(){return i(this,v)}set range(e){(e.from!==i(this,v).from||e.to!==i(this,v).to)&&(l(this,v,e),this.rangeRequest(e))}get config(){return i(this,n)}set config(e){var o;let s=this.applyConfig(e);s&&(i(this,n)&&this.viewport&&e&&((o=this.server)==null||o.send({viewport:this.viewport,type:"config",config:i(this,n)})),this.emit("config",i(this,n),void 0,s))}applyConfig(e){var u;let{noChanges:s,...o}=pe(i(this,n),e);if(s!==!0&&e){let c=(u=e==null?void 0:e.filter)!=null&&u.filter&&(e==null?void 0:e.filter.filterStruct)===void 0?{...e,filter:{filter:e.filter.filter,filterStruct:he(e.filter.filter)}}:e;return l(this,n,Te(c)),o}}get columns(){return i(this,n).columns}set columns(e){if(l(this,n,{...i(this,n),columns:e}),this.viewport){let s={viewport:this.viewport,type:"setColumns",columns:e};this.server&&this.server.send(s)}this.emit("config",i(this,n))}get aggregations(){return i(this,n).aggregations}set aggregations(e){var s;l(this,n,{...i(this,n),aggregations:e}),this.viewport&&((s=this.server)==null||s.send({viewport:this.viewport,type:"aggregate",aggregations:e})),this.emit("config",i(this,n))}get sort(){return i(this,n).sort}set sort(e){var s;if(l(this,n,{...i(this,n),sort:e}),this.viewport){let o={viewport:this.viewport,type:"sort",sort:e};(s=this.server)==null||s.send(o)}this.emit("config",i(this,n))}get filter(){return i(this,n).filter}set filter(e){this.config={...i(this,n),filter:e}}get groupBy(){return i(this,n).groupBy}set groupBy(e){var s;if(we(this.groupBy,e)){let o=i(this,M).length>0;this.config={...i(this,n),groupBy:e},!o&&e.length>0&&this.viewport&&((s=this.clientCallback)==null||s.call(this,{clientViewportId:this.viewport,mode:"batch",type:"viewport-update",size:0,rows:[]})),this.setConfigPending({groupBy:e})}}get title(){return i(this,R)}set title(e){var s;l(this,R,e),this.viewport&&e&&((s=this.server)==null||s.send({type:"setTitle",title:e,viewport:this.viewport}))}get visualLink(){return i(this,n).visualLink}set visualLink(e){var s,o;if(l(this,n,{...i(this,n),visualLink:e}),e){let{parentClientVpId:u,link:{fromColumn:c,toColumn:d}}=e;this.viewport&&((s=this.server)==null||s.send({viewport:this.viewport,type:"createLink",parentClientVpId:u,parentColumnName:d,childColumnName:c}))}else this.viewport&&((o=this.server)==null||o.send({type:"removeLink",viewport:this.viewport}));this.emit("config",i(this,n))}setConfigPending(e){let s=this.configChangePending;this.configChangePending=e,e!==void 0?this.emit("config",e,!1):this.emit("config",s,!0)}async rpcCall(e){var s;if(this.viewport)return(s=this.server)==null?void 0:s.rpcCall({vpId:this.viewport,...e})}async menuRpcCall(e){var s;if(this.viewport)return(s=this.server)==null?void 0:s.rpcCall({vpId:this.viewport,...e})}applyEdit(e,s,o){return this.menuRpcCall({rowKey:e[Se],field:s,value:o,type:"VP_EDIT_CELL_RPC"}).then(u=>u!=null&&u.error?u.error:!0)}insertRow(e,s){return this.menuRpcCall({rowKey:e,data:s,type:"VP_EDIT_ADD_ROW_RPC"}).then(o=>o!=null&&o.error?o.error:!0)}deleteRow(e){return this.menuRpcCall({rowKey:e,type:"VP_EDIT_DELETE_ROW_RPC"}).then(s=>s!=null&&s.error?s.error:!0)}};n=new WeakMap,M=new WeakMap,y=new WeakMap,I=new WeakMap,E=new WeakMap,v=new WeakMap,V=new WeakMap,C=new WeakMap,a=new WeakMap,R=new WeakMap;export{D as ConnectionManager,H as VuuDataSource,_e as authenticate,De as connectToServer,Ue as connectionId,Je as createSchemaFromTableMetadata,Ge as getFirstAndLastRows,F as getServerAPI,Fe as groupRowsByViewport,U as isDataSourceConfigMessage,Z as isSessionTable,Pe as isSessionTableActionMessage,Ie as isSizeOnly,$e as isVuuMenuRpcRequest,Be as isVuuRpcRequest,Ae as makeRpcCall,qe as msgType,W as shouldMessageBeRoutedToDataSource,ze as stripRequestId,Ve as toDataSourceConfig};
2
- //# sourceMappingURL=index.js.map