@vuu-ui/vuu-data-remote 0.13.75 → 0.13.77

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.
@@ -1 +1 @@
1
- {"version":3,"file":"message-utils.js","sources":["../../../packages/vuu-data-remote/src/message-utils.ts"],"sourcesContent":["import { TableSchema, WithRequestId } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuTableMetaResponse,\n VuuRow,\n VuuRange,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nexport const hasRequestId = <T extends object>(\n message: T,\n): message is WithRequestId<T> => {\n return \"requestId\" in message;\n};\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[] };\n\nconst insertRow = (rows: VuuRow[], row: VuuRow) => {\n const lastRow = rows.at(-1);\n if (lastRow === undefined || row.rowIndex > lastRow.rowIndex) {\n rows.push(row);\n } else {\n for (let i = 0; i < rows.length; i++) {\n if (row.rowIndex < rows[i].rowIndex) {\n rows.splice(i, 0, row);\n return;\n } else if (row.rowIndex === rows[i].rowIndex) {\n if (row.ts < rows[i].ts) {\n // ignore an earlier update\n } else {\n rows[i] = row;\n }\n return;\n }\n }\n throw Error(\"don't expect to get this far\");\n }\n};\n\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 insertRow(rowsForViewport, row);\n }\n return result;\n};\n\nexport const createSchemaFromTableMetadata = ({\n columns,\n dataTypes,\n key,\n table,\n}: Omit<VuuTableMetaResponse, \"type\">): 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\n/**\n * This is called when we have row updates to process and\n * we have rows in local cache to fill client range.\n * We check here to see if there is any gap between this\n * set of updates and the last set of rows sent to client.\n * If so, it indicates that we have previously received\n * updates but that we did not have all ther rows needed\n * to satisfy client range request, so they were not sent\n * to client. Now we can send them all.\n */\nexport const gapBetweenLastRowSentToClient = (\n lastRowsReturnedToClient: [number, number],\n pendingUpdates: VuuRow[],\n clientRange: VuuRange,\n rowCount: number,\n): VuuRange | undefined => {\n const firstPendingUpdate = pendingUpdates.at(0);\n const lastPendingUpdate = pendingUpdates.at(-1);\n\n if (firstPendingUpdate && lastPendingUpdate) {\n const maxTo = Math.min(rowCount, clientRange.to);\n\n const [firstRowIndex, lastRowIndex] = lastRowsReturnedToClient;\n if (\n lastRowIndex < firstPendingUpdate.rowIndex - 1 &&\n clientRange.from < firstPendingUpdate.rowIndex\n ) {\n return {\n from: Math.max(lastRowIndex + 1, clientRange.from),\n to: firstPendingUpdate.rowIndex,\n };\n } else if (\n firstRowIndex > lastPendingUpdate.rowIndex + 1 &&\n maxTo > lastPendingUpdate.rowIndex\n ) {\n return {\n from: lastPendingUpdate.rowIndex + 1,\n to: Math.min(maxTo, firstRowIndex),\n };\n } else if (firstRowIndex === -1 && lastRowIndex === -1) {\n if (clientRange.from < firstPendingUpdate.rowIndex) {\n return {\n from: clientRange.from,\n to: firstPendingUpdate.rowIndex,\n };\n } else if (maxTo > lastPendingUpdate.rowIndex + 1) {\n return {\n from: lastPendingUpdate.rowIndex + 1,\n to: maxTo,\n };\n }\n }\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-utils.js","sources":["../../../packages/vuu-data-remote/src/message-utils.ts"],"sourcesContent":["import { TableSchema, WithRequestId } from \"@vuu-ui/vuu-data-types\";\nimport { VuuTableMetaResponse, VuuRow } from \"@vuu-ui/vuu-protocol-types\";\n\nexport const hasRequestId = <T extends object>(\n message: T,\n): message is WithRequestId<T> => {\n return \"requestId\" in message;\n};\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[] };\n\nconst insertRow = (rows: VuuRow[], row: VuuRow) => {\n const lastRow = rows.at(-1);\n if (lastRow === undefined || row.rowIndex > lastRow.rowIndex) {\n rows.push(row);\n } else {\n for (let i = 0; i < rows.length; i++) {\n if (row.rowIndex < rows[i].rowIndex) {\n rows.splice(i, 0, row);\n return;\n } else if (row.rowIndex === rows[i].rowIndex) {\n if (row.ts < rows[i].ts) {\n // ignore an earlier update\n } else {\n rows[i] = row;\n }\n return;\n }\n }\n throw Error(\"don't expect to get this far\");\n }\n};\n\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 insertRow(rowsForViewport, row);\n }\n return result;\n};\n\nexport const createSchemaFromTableMetadata = ({\n columns,\n dataTypes,\n key,\n table,\n}: Omit<VuuTableMetaResponse, \"type\">): 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\n/**\n * This is called when we have row updates to process and\n * we have rows in local cache to fill client range.\n * We check here to see if there is any gap between this\n * set of updates and the last set of rows sent to client.\n * If so, it indicates that we have previously received\n * updates but that we did not have all ther rows needed\n * to satisfy client range request, so they were not sent\n * to client. Now we can send them all.\n */\n// export const gapBetweenLastRowSentToClient = (\n// lastRowsReturnedToClient: [number, number],\n// pendingUpdates: VuuRow[],\n// clientRange: VuuRange,\n// rowCount: number,\n// ): VuuRange | undefined => {\n// const firstPendingUpdate = pendingUpdates.at(0);\n// const lastPendingUpdate = pendingUpdates.at(-1);\n\n// if (firstPendingUpdate && lastPendingUpdate) {\n// const maxTo = Math.min(rowCount, clientRange.to);\n\n// const [firstRowIndex, lastRowIndex] = lastRowsReturnedToClient;\n// if (\n// lastRowIndex < firstPendingUpdate.rowIndex - 1 &&\n// clientRange.from < firstPendingUpdate.rowIndex\n// ) {\n// return {\n// from: Math.max(lastRowIndex + 1, clientRange.from),\n// to: firstPendingUpdate.rowIndex,\n// };\n// } else if (\n// firstRowIndex > lastPendingUpdate.rowIndex + 1 &&\n// maxTo > lastPendingUpdate.rowIndex\n// ) {\n// return {\n// from: lastPendingUpdate.rowIndex + 1,\n// to: Math.min(maxTo, firstRowIndex),\n// };\n// } else if (firstRowIndex === -1 && lastRowIndex === -1) {\n// if (clientRange.from < firstPendingUpdate.rowIndex) {\n// return {\n// from: clientRange.from,\n// to: firstPendingUpdate.rowIndex,\n// };\n// } else if (maxTo > lastPendingUpdate.rowIndex + 1) {\n// return {\n// from: lastPendingUpdate.rowIndex + 1,\n// to: maxTo,\n// };\n// }\n// }\n// }\n// };\n"],"names":[],"mappings":";;AAGa,MAAA,YAAA,GAAe,CAC1B,OACgC,KAAA;AAChC,EAAA,OAAO,WAAe,IAAA,OAAA;AACxB;AAEO,MAAM,iBAAiB,CAAI;AAAA,EAChC,SAAA;AAAA,EACA,GAAG;AACL,CAAqC,KAAA,CAAC,WAAW,IAAS;AAE7C,MAAA,mBAAA,GAAsB,CACjC,IACgC,KAAA;AAChC,EAAI,IAAA,QAAA,GAAW,IAAK,CAAA,EAAA,CAAG,CAAC,CAAA;AACxB,EAAI,IAAA,QAAA,CAAS,eAAe,MAAQ,EAAA;AAClC,IAAI,IAAA,IAAA,CAAK,WAAW,CAAG,EAAA;AACrB,MAAO,OAAA,IAAA;AAAA,KACF,MAAA;AACL,MAAW,QAAA,GAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA;AACtB;AAEF,EAAM,MAAA,OAAA,GAAU,IAAK,CAAA,EAAA,CAAG,CAAE,CAAA,CAAA;AAC1B,EAAO,OAAA,CAAC,UAAU,OAAO,CAAA;AAC3B;AAIA,MAAM,SAAA,GAAY,CAAC,IAAA,EAAgB,GAAgB,KAAA;AACjD,EAAM,MAAA,OAAA,GAAU,IAAK,CAAA,EAAA,CAAG,CAAE,CAAA,CAAA;AAC1B,EAAA,IAAI,OAAY,KAAA,KAAA,CAAA,IAAa,GAAI,CAAA,QAAA,GAAW,QAAQ,QAAU,EAAA;AAC5D,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,GACR,MAAA;AACL,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACpC,MAAA,IAAI,GAAI,CAAA,QAAA,GAAW,IAAK,CAAA,CAAC,EAAE,QAAU,EAAA;AACnC,QAAK,IAAA,CAAA,MAAA,CAAO,CAAG,EAAA,CAAA,EAAG,GAAG,CAAA;AACrB,QAAA;AAAA,iBACS,GAAI,CAAA,QAAA,KAAa,IAAK,CAAA,CAAC,EAAE,QAAU,EAAA;AAC5C,QAAA,IAAI,GAAI,CAAA,EAAA,GAAK,IAAK,CAAA,CAAC,EAAE,EAAI,EAAA,CAElB,MAAA;AACL,UAAA,IAAA,CAAK,CAAC,CAAI,GAAA,GAAA;AAAA;AAEZ,QAAA;AAAA;AACF;AAEF,IAAA,MAAM,MAAM,8BAA8B,CAAA;AAAA;AAE9C,CAAA;AAEa,MAAA,mBAAA,GAAsB,CAAC,IAAmC,KAAA;AACrE,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAM,MAAA,eAAA,GACJ,OAAO,GAAI,CAAA,UAAU,MAAM,MAAO,CAAA,GAAA,CAAI,UAAU,CAAA,GAAI,EAAC,CAAA;AACvD,IAAA,SAAA,CAAU,iBAAiB,GAAG,CAAA;AAAA;AAEhC,EAAO,OAAA,MAAA;AACT;AAEO,MAAM,gCAAgC,CAAC;AAAA,EAC5C,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAiE,KAAA;AAC/D,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,OAAS,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,KAAK,GAAS,MAAA;AAAA,MAClC,IAAM,EAAA,GAAA;AAAA,MACN,cAAA,EAAgB,UAAU,GAAG;AAAA,KAC7B,CAAA,CAAA;AAAA,IACF;AAAA,GACF;AACF;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { logger, BaseDataSource, debounce, throttle, uuid, combineFilters, Range, isSelectSuccessWithRowCount, itemsOrOrderChanged, vuuEditCellRequest, isViewportMenusAction, isVisualLinksAction } from '@vuu-ui/vuu-utils';
1
+ import { logger, BaseDataSource, debounce, throttle, uuid, combineFilters, Range, isSelectSuccessWithRowCount, isConfigChanged, itemsOrOrderChanged, vuuEditCellRequest, isViewportMenusAction, isVisualLinksAction } from '@vuu-ui/vuu-utils';
2
2
  import ConnectionManager from './ConnectionManager.js';
3
3
  import { isDataSourceConfigMessage } from './data-source.js';
4
4
 
@@ -330,7 +330,8 @@ class VuuDataSource extends BaseDataSource {
330
330
  return super.config;
331
331
  }
332
332
  set config(config) {
333
- if (config !== this.config) {
333
+ const { noChanges } = isConfigChanged(this.config, config);
334
+ if (!noChanges) {
334
335
  super.config = config;
335
336
  const { columns, ...dataSourceConfig } = combineFilters(this.config);
336
337
  const serverConfig = {
@@ -358,13 +359,13 @@ class VuuDataSource extends BaseDataSource {
358
359
  }
359
360
  }
360
361
  get groupBy() {
361
- return this._config.groupBy;
362
+ return this._configWithVisualLink.groupBy;
362
363
  }
363
364
  set groupBy(groupBy) {
364
365
  if (itemsOrOrderChanged(this.groupBy, groupBy)) {
365
366
  const wasGrouped = this.groupBy.length > 0;
366
367
  this.impendingConfig = {
367
- ...this._config,
368
+ ...this._configWithVisualLink,
368
369
  groupBy
369
370
  };
370
371
  if (!wasGrouped && groupBy.length > 0 && this.viewport) {
@@ -392,11 +393,11 @@ class VuuDataSource extends BaseDataSource {
392
393
  }
393
394
  }
394
395
  get visualLink() {
395
- return this._config.visualLink;
396
+ return this._configWithVisualLink.visualLink;
396
397
  }
397
398
  set visualLink(visualLink) {
398
- this._config = {
399
- ...this._config,
399
+ this._configWithVisualLink = {
400
+ ...this._configWithVisualLink,
400
401
  visualLink
401
402
  };
402
403
  if (visualLink) {
@@ -425,7 +426,7 @@ class VuuDataSource extends BaseDataSource {
425
426
  });
426
427
  }
427
428
  }
428
- this.emit("config", this._config, this.range);
429
+ this.emit("config", this._configWithVisualLink, this.range);
429
430
  }
430
431
  async remoteProcedureCall() {
431
432
  return Promise.reject();
@@ -1 +1 @@
1
- {"version":3,"file":"VuuDataSource.js","sources":["../../../packages/vuu-data-remote/src/VuuDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceCallbackMessage,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceVisualLinkCreatedMessage,\n OptimizeStrategy,\n ServerAPI,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n LinkDescriptorWithLabel,\n RpcResultError,\n RpcResultSuccess,\n SelectRequest,\n VuuCreateVisualLink,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuRpcEditError,\n VuuRpcEditRequest,\n VuuRpcEditResponse,\n VuuRpcMenuRequest,\n VuuRpcResponse,\n VuuRpcServiceRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nimport {\n BaseDataSource,\n combineFilters,\n debounce,\n isSelectSuccessWithRowCount,\n isViewportMenusAction,\n isVisualLinksAction,\n itemsOrOrderChanged,\n logger,\n Range,\n throttle,\n uuid,\n vuuEditCellRequest,\n} from \"@vuu-ui/vuu-utils\";\nimport ConnectionManager from \"./ConnectionManager\";\nimport { isDataSourceConfigMessage } from \"./data-source\";\n\nimport { MenuRpcResponse } from \"@vuu-ui/vuu-data-types\";\n\ntype RangeRequest = (range: VuuRange) => void;\n\nconst { info, infoEnabled } = logger(\"VuuDataSource\");\n\n/**\n * Autosubscribe columns ar always included in a subscription.\n * The same columns may or may not be included in subscription\n * requested by client and client may change column list over\n * lifetime of dataSource. Always make sure we include the\n * autosubscription columns, but never repeat them\n */\nconst ensureAutosubscribeColumnsIncluded = (\n columns: string[],\n autosubscribeColumns: string[] = [],\n) => {\n if (autosubscribeColumns.length === 0) {\n return columns;\n } else {\n const out = columns.slice();\n autosubscribeColumns.forEach((name) => {\n if (!out.includes(name)) {\n out.push(name);\n }\n });\n return out;\n }\n};\n\n/*---------------------------------------------------------------------\n A VuuDataSource manages a single subscription via the ServerProxy\n ---------------------------------------------------------------------*/\nexport class VuuDataSource extends BaseDataSource implements DataSource {\n private bufferSize: number;\n private server: ServerAPI | null = null;\n rangeRequest: RangeRequest;\n\n #autosubscribeColumns: string[] = [];\n #pendingVisualLink?: LinkDescriptorWithLabel;\n #links: LinkDescriptorWithLabel[] | undefined;\n #menu: VuuMenu | undefined;\n #optimize: OptimizeStrategy = \"throttle\";\n #selectedRowsCount = 0;\n #status: DataSourceStatus = \"initialising\";\n #tableSchema: TableSchema | undefined;\n\n public table: VuuTable;\n\n constructor(props: DataSourceConstructorProps) {\n super(props);\n\n const { bufferSize = 100, table, visualLink } = props;\n\n if (!table)\n throw Error(\"RemoteDataSource constructor called without table\");\n\n this.bufferSize = bufferSize;\n this.table = table;\n\n this.#pendingVisualLink = visualLink;\n\n // this.rangeRequest = this.throttleRangeRequest;\n this.rangeRequest = this.rawRangeRequest;\n\n if (props.autosubscribeColumns) {\n this.#autosubscribeColumns = props.autosubscribeColumns;\n }\n }\n\n async subscribe(\n subscribeProps: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n super.subscribe(subscribeProps, callback);\n const { viewport = this.viewport || (this.viewport = uuid()) } =\n subscribeProps;\n\n if (this.#status === \"disabled\" || this.#status === \"disabling\") {\n this.enable(callback);\n return;\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.#selectedRowsCount = selectionCount(selectedIndexValues);\n\n this.server = await ConnectionManager.serverAPI;\n\n const { bufferSize } = this;\n\n const { columns, ...dataSourceConfig } = combineFilters(this.config);\n\n // TODO and await response here\n this.server?.subscribe(\n {\n ...dataSourceConfig,\n bufferSize,\n columns: ensureAutosubscribeColumnsIncluded(\n columns,\n this.#autosubscribeColumns,\n ),\n range: this._range,\n table: this.table,\n title: this._title,\n viewport,\n },\n this.handleMessageFromServer,\n );\n }\n\n handleMessageFromServer = (message: DataSourceCallbackMessage) => {\n if (message.type === \"subscribed\") {\n this.#status = \"subscribed\";\n this.tableSchema = message.tableSchema;\n this._clientCallback?.(message);\n if (this.#pendingVisualLink) {\n this.visualLink = this.#pendingVisualLink;\n this.#pendingVisualLink = undefined;\n }\n this.emit(\"subscribed\", 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 } else if (message.type === \"viewport-clear\") {\n this.size = 0;\n this.emit(\"resize\", 0);\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.isAwaitingConfirmationOfConfigChange) {\n this.confirmConfigChange();\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 if (infoEnabled && message.type === \"viewport-update\") {\n info(\n `handleMessageFromServer<viewport-update> range (${message.range?.from}:${message.range?.to}) rows ${message.rows?.at(0)?.[0]} - ${message.rows?.at(-1)?.[0]}`,\n );\n }\n this._clientCallback?.(message);\n }\n\n if (this.optimize === \"debounce\") {\n this.revertDebounce();\n }\n }\n };\n\n unsubscribe() {\n if (this.#status !== \"unsubscribed\") {\n info?.(`unsubscribe #${this.viewport}`);\n if (this.viewport) {\n this.server?.unsubscribe(this.viewport);\n this.emit(\"unsubscribed\", this.viewport);\n }\n this.server?.destroy(this.viewport);\n this.server = null;\n this.removeAllListeners();\n this.#status = \"unsubscribed\";\n this.viewport = \"\";\n this.range = Range(0, 0);\n }\n }\n\n suspend(\n escalateToDisable = this._defaultSuspenseProps.escalateToDisable,\n escalateDelay = this._defaultSuspenseProps.escalateDelay,\n ) {\n if (this.#status !== \"unsubscribed\") {\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"suspended\";\n this.server?.send({\n escalateDelay,\n escalateToDisable,\n type: \"suspend\",\n viewport: this.viewport,\n });\n this.emit(\"suspended\", this.viewport);\n }\n }\n }\n\n resume(callback?: DataSourceSubscribeCallback) {\n const isDisabled = this.#status.startsWith(\"disabl\");\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (callback) {\n this._clientCallback = callback;\n }\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 this.emit(\"resumed\", this.viewport);\n }\n }\n }\n\n freeze() {\n super.freeze();\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"FREEZE_VP\",\n });\n }\n }\n\n unfreeze() {\n super.unfreeze();\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"UNFREEZE_VP\",\n });\n }\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 this.emit(\"disabled\", this.viewport);\n }\n }\n\n enable(callback?: DataSourceSubscribeCallback) {\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 this.emit(\"enabled\", this.viewport);\n }\n }\n\n async select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n if (this.viewport && this.server) {\n const response = await this.server.select({\n ...selectRequest,\n vpId: this.viewport,\n } as SelectRequest);\n if (isSelectSuccessWithRowCount(response)) {\n this.#selectedRowsCount = response.selectedRowCount;\n this.emit(\"row-selection\", response.selectedRowCount);\n } else {\n console.warn(`select error`);\n }\n }\n }\n\n openTreeNode(keyOrIndex: string | number) {\n if (this.viewport) {\n const [key, index] =\n typeof keyOrIndex === \"string\" ? [keyOrIndex] : [undefined, keyOrIndex];\n this.server?.send({\n index,\n key,\n type: \"openTreeNode\",\n viewport: this.viewport,\n });\n }\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n if (this.viewport) {\n const [key, index] =\n typeof keyOrIndex === \"string\" ? [keyOrIndex] : [undefined, keyOrIndex];\n this.server?.send({\n index,\n key,\n type: \"closeTreeNode\",\n viewport: this.viewport,\n });\n }\n }\n\n get tableSchema() {\n return this.#tableSchema;\n }\n\n set tableSchema(tableSchema: TableSchema | undefined) {\n this.#tableSchema = tableSchema;\n // TOSO emit an event\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 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 super.config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n if (config !== this.config) {\n super.config = config;\n\n const { columns, ...dataSourceConfig } = combineFilters(this.config);\n const serverConfig = {\n ...dataSourceConfig,\n columns: ensureAutosubscribeColumnsIncluded(\n columns,\n this.#autosubscribeColumns,\n ),\n };\n\n this.server?.send({\n viewport: this.viewport,\n type: \"config\",\n config: serverConfig,\n });\n }\n }\n\n set impendingConfig(config: WithBaseFilter<WithFullConfig>) {\n if (config !== this.config) {\n super.impendingConfig = config;\n this.server?.send({\n viewport: this.viewport,\n type: \"config\",\n config: combineFilters(this.config),\n });\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.impendingConfig = {\n ...this._config,\n groupBy,\n };\n\n if (!wasGrouped && groupBy.length > 0 && this.viewport) {\n // clear data from table whilst we wait for grouped data from server\n this._clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n type: \"viewport-update\",\n size: 0,\n rows: [],\n });\n }\n }\n }\n\n get title() {\n return super.title || `${this.table.module} ${this.table.table}`;\n }\n\n set title(title: string) {\n super.title = title;\n if (this.viewport && title) {\n // This message doesn't actually trigger a message to Vuu server\n // it will be used to recompute visual link labels\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\n ?.rpcCall<DataSourceVisualLinkCreatedMessage>({\n childColumnName: fromColumn,\n childVpId: this.viewport,\n parentColumnName: toColumn,\n parentVpId: parentClientVpId,\n type: \"CREATE_VISUAL_LINK\",\n } as VuuCreateVisualLink)\n .then((response) => {\n this.emit(\"visual-link-created\", response);\n });\n }\n } else {\n if (this.viewport) {\n this.server\n ?.rpcCall({\n type: \"REMOVE_VISUAL_LINK\",\n childVpId: this.viewport,\n })\n .then(() => {\n this.emit(\"visual-link-removed\");\n });\n }\n }\n\n this.emit(\"config\", this._config, this.range);\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async rpcRequest(rpcRequest: Omit<VuuRpcServiceRequest, \"context\">) {\n if (this.viewport && this.server) {\n return this.server?.rpcCall<RpcResultSuccess | RpcResultError>({\n ...rpcRequest,\n context: { type: \"VIEWPORT_CONTEXT\", viewPortId: this.viewport },\n } as VuuRpcServiceRequest);\n } else {\n throw Error(`rpcCall server or viewport are undefined`);\n }\n }\n\n async menuRpcCall(rpcRequest: Omit<VuuRpcMenuRequest, \"vpId\">) {\n if (this.viewport) {\n return this.server?.rpcCall<MenuRpcResponse>({\n ...rpcRequest,\n vpId: this.viewport,\n } as VuuRpcMenuRequest);\n }\n }\n\n async editRpcCall(rpcRequest: Omit<VuuRpcEditRequest, \"vpId\">) {\n if (this.viewport && this.server) {\n return this.server.rpcCall<VuuRpcEditResponse>({\n ...rpcRequest,\n vpId: this.viewport,\n });\n } else {\n return {\n error: \"Either viewport or server is undefined\",\n type: \"VP_EDIT_RPC_REJECT\",\n } as VuuRpcEditError;\n }\n }\n\n applyEdit(rowKey: string, columnName: string, value: VuuRowDataItemType) {\n return this.editRpcCall(vuuEditCellRequest(rowKey, columnName, value)).then(\n (response) => {\n if (response.type === \"VP_EDIT_RPC_REJECT\") {\n return response.error;\n } else {\n return true;\n }\n },\n );\n }\n\n insertRow() {\n return Promise.resolve(\"not supported\");\n // return this.menuRpcCall(vuuAddRowRequest(rowKey, data)).then((response) => {\n // if (response?.error) {\n // return response.error;\n // } else {\n // return true;\n // }\n // });\n }\n deleteRow() {\n return Promise.resolve(\"not supported\");\n // return this.menuRpcCall(vuuDeleteRowRequest(rowKey)).then((response) => {\n // if (response?.error) {\n // return response.error;\n // } else {\n // return true;\n // }\n // });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VuuDataSource.js","sources":["../../../packages/vuu-data-remote/src/VuuDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceCallbackMessage,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceVisualLinkCreatedMessage,\n OptimizeStrategy,\n ServerAPI,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n LinkDescriptorWithLabel,\n RpcResultError,\n RpcResultSuccess,\n SelectRequest,\n VuuCreateVisualLink,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuRpcEditError,\n VuuRpcEditRequest,\n VuuRpcEditResponse,\n VuuRpcMenuRequest,\n VuuRpcResponse,\n VuuRpcServiceRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nimport {\n BaseDataSource,\n combineFilters,\n debounce,\n isConfigChanged,\n isSelectSuccessWithRowCount,\n isViewportMenusAction,\n isVisualLinksAction,\n itemsOrOrderChanged,\n logger,\n Range,\n throttle,\n uuid,\n vuuEditCellRequest,\n} from \"@vuu-ui/vuu-utils\";\nimport ConnectionManager from \"./ConnectionManager\";\nimport { isDataSourceConfigMessage } from \"./data-source\";\n\nimport { MenuRpcResponse } from \"@vuu-ui/vuu-data-types\";\n\ntype RangeRequest = (range: VuuRange) => void;\n\nconst { info, infoEnabled } = logger(\"VuuDataSource\");\n\n/**\n * Autosubscribe columns ar always included in a subscription.\n * The same columns may or may not be included in subscription\n * requested by client and client may change column list over\n * lifetime of dataSource. Always make sure we include the\n * autosubscription columns, but never repeat them\n */\nconst ensureAutosubscribeColumnsIncluded = (\n columns: string[],\n autosubscribeColumns: string[] = [],\n) => {\n if (autosubscribeColumns.length === 0) {\n return columns;\n } else {\n const out = columns.slice();\n autosubscribeColumns.forEach((name) => {\n if (!out.includes(name)) {\n out.push(name);\n }\n });\n return out;\n }\n};\n\n/*---------------------------------------------------------------------\n A VuuDataSource manages a single subscription via the ServerProxy\n ---------------------------------------------------------------------*/\nexport class VuuDataSource extends BaseDataSource implements DataSource {\n private bufferSize: number;\n private server: ServerAPI | null = null;\n rangeRequest: RangeRequest;\n\n #autosubscribeColumns: string[] = [];\n #pendingVisualLink?: LinkDescriptorWithLabel;\n #links: LinkDescriptorWithLabel[] | undefined;\n #menu: VuuMenu | undefined;\n #optimize: OptimizeStrategy = \"throttle\";\n #selectedRowsCount = 0;\n #status: DataSourceStatus = \"initialising\";\n #tableSchema: TableSchema | undefined;\n\n public table: VuuTable;\n\n constructor(props: DataSourceConstructorProps) {\n super(props);\n\n const { bufferSize = 100, table, visualLink } = props;\n\n if (!table)\n throw Error(\"RemoteDataSource constructor called without table\");\n\n this.bufferSize = bufferSize;\n this.table = table;\n\n this.#pendingVisualLink = visualLink;\n\n // this.rangeRequest = this.throttleRangeRequest;\n this.rangeRequest = this.rawRangeRequest;\n\n if (props.autosubscribeColumns) {\n this.#autosubscribeColumns = props.autosubscribeColumns;\n }\n }\n\n async subscribe(\n subscribeProps: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n super.subscribe(subscribeProps, callback);\n const { viewport = this.viewport || (this.viewport = uuid()) } =\n subscribeProps;\n\n if (this.#status === \"disabled\" || this.#status === \"disabling\") {\n this.enable(callback);\n return;\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.#selectedRowsCount = selectionCount(selectedIndexValues);\n\n this.server = await ConnectionManager.serverAPI;\n\n const { bufferSize } = this;\n\n const { columns, ...dataSourceConfig } = combineFilters(this.config);\n\n // TODO and await response here\n this.server?.subscribe(\n {\n ...dataSourceConfig,\n bufferSize,\n columns: ensureAutosubscribeColumnsIncluded(\n columns,\n this.#autosubscribeColumns,\n ),\n range: this._range,\n table: this.table,\n title: this._title,\n viewport,\n },\n this.handleMessageFromServer,\n );\n }\n\n handleMessageFromServer = (message: DataSourceCallbackMessage) => {\n if (message.type === \"subscribed\") {\n this.#status = \"subscribed\";\n this.tableSchema = message.tableSchema;\n this._clientCallback?.(message);\n if (this.#pendingVisualLink) {\n this.visualLink = this.#pendingVisualLink;\n this.#pendingVisualLink = undefined;\n }\n this.emit(\"subscribed\", 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 } else if (message.type === \"viewport-clear\") {\n this.size = 0;\n this.emit(\"resize\", 0);\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.isAwaitingConfirmationOfConfigChange) {\n this.confirmConfigChange();\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 if (infoEnabled && message.type === \"viewport-update\") {\n info(\n `handleMessageFromServer<viewport-update> range (${message.range?.from}:${message.range?.to}) rows ${message.rows?.at(0)?.[0]} - ${message.rows?.at(-1)?.[0]}`,\n );\n }\n this._clientCallback?.(message);\n }\n\n if (this.optimize === \"debounce\") {\n this.revertDebounce();\n }\n }\n };\n\n unsubscribe() {\n if (this.#status !== \"unsubscribed\") {\n info?.(`unsubscribe #${this.viewport}`);\n if (this.viewport) {\n this.server?.unsubscribe(this.viewport);\n this.emit(\"unsubscribed\", this.viewport);\n }\n this.server?.destroy(this.viewport);\n this.server = null;\n this.removeAllListeners();\n this.#status = \"unsubscribed\";\n this.viewport = \"\";\n this.range = Range(0, 0);\n }\n }\n\n suspend(\n escalateToDisable = this._defaultSuspenseProps.escalateToDisable,\n escalateDelay = this._defaultSuspenseProps.escalateDelay,\n ) {\n if (this.#status !== \"unsubscribed\") {\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n if (this.viewport) {\n this.#status = \"suspended\";\n this.server?.send({\n escalateDelay,\n escalateToDisable,\n type: \"suspend\",\n viewport: this.viewport,\n });\n this.emit(\"suspended\", this.viewport);\n }\n }\n }\n\n resume(callback?: DataSourceSubscribeCallback) {\n const isDisabled = this.#status.startsWith(\"disabl\");\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (callback) {\n this._clientCallback = callback;\n }\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 this.emit(\"resumed\", this.viewport);\n }\n }\n }\n\n freeze() {\n super.freeze();\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"FREEZE_VP\",\n });\n }\n }\n\n unfreeze() {\n super.unfreeze();\n if (this.viewport) {\n this.server?.send({\n viewport: this.viewport,\n type: \"UNFREEZE_VP\",\n });\n }\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 this.emit(\"disabled\", this.viewport);\n }\n }\n\n enable(callback?: DataSourceSubscribeCallback) {\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 this.emit(\"enabled\", this.viewport);\n }\n }\n\n async select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n if (this.viewport && this.server) {\n const response = await this.server.select({\n ...selectRequest,\n vpId: this.viewport,\n } as SelectRequest);\n if (isSelectSuccessWithRowCount(response)) {\n this.#selectedRowsCount = response.selectedRowCount;\n this.emit(\"row-selection\", response.selectedRowCount);\n } else {\n console.warn(`select error`);\n }\n }\n }\n\n openTreeNode(keyOrIndex: string | number) {\n if (this.viewport) {\n const [key, index] =\n typeof keyOrIndex === \"string\" ? [keyOrIndex] : [undefined, keyOrIndex];\n this.server?.send({\n index,\n key,\n type: \"openTreeNode\",\n viewport: this.viewport,\n });\n }\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n if (this.viewport) {\n const [key, index] =\n typeof keyOrIndex === \"string\" ? [keyOrIndex] : [undefined, keyOrIndex];\n this.server?.send({\n index,\n key,\n type: \"closeTreeNode\",\n viewport: this.viewport,\n });\n }\n }\n\n get tableSchema() {\n return this.#tableSchema;\n }\n\n set tableSchema(tableSchema: TableSchema | undefined) {\n this.#tableSchema = tableSchema;\n // TOSO emit an event\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 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 super.config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const { noChanges } = isConfigChanged(this.config, config);\n if (!noChanges) {\n super.config = config;\n\n const { columns, ...dataSourceConfig } = combineFilters(this.config);\n const serverConfig: WithFullConfig = {\n ...dataSourceConfig,\n columns: ensureAutosubscribeColumnsIncluded(\n columns,\n this.#autosubscribeColumns,\n ),\n };\n\n this.server?.send({\n viewport: this.viewport,\n type: \"config\",\n config: serverConfig,\n });\n }\n }\n\n set impendingConfig(config: WithBaseFilter<WithFullConfig>) {\n if (config !== this.config) {\n super.impendingConfig = config;\n this.server?.send({\n viewport: this.viewport,\n type: \"config\",\n config: combineFilters(this.config),\n });\n }\n }\n\n get groupBy() {\n return this._configWithVisualLink.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n if (itemsOrOrderChanged(this.groupBy, groupBy)) {\n const wasGrouped = this.groupBy.length > 0;\n\n this.impendingConfig = {\n ...this._configWithVisualLink,\n groupBy,\n };\n\n if (!wasGrouped && groupBy.length > 0 && this.viewport) {\n // clear data from table whilst we wait for grouped data from server\n this._clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n type: \"viewport-update\",\n size: 0,\n rows: [],\n });\n }\n }\n }\n\n get title() {\n return super.title || `${this.table.module} ${this.table.table}`;\n }\n\n set title(title: string) {\n super.title = title;\n if (this.viewport && title) {\n // This message doesn't actually trigger a message to Vuu server\n // it will be used to recompute visual link labels\n this.server?.send({\n type: \"setTitle\",\n title,\n viewport: this.viewport,\n });\n }\n }\n\n get visualLink() {\n return this._configWithVisualLink.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\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\n ?.rpcCall<DataSourceVisualLinkCreatedMessage>({\n childColumnName: fromColumn,\n childVpId: this.viewport,\n parentColumnName: toColumn,\n parentVpId: parentClientVpId,\n type: \"CREATE_VISUAL_LINK\",\n } as VuuCreateVisualLink)\n .then((response) => {\n this.emit(\"visual-link-created\", response);\n });\n }\n } else {\n if (this.viewport) {\n this.server\n ?.rpcCall({\n type: \"REMOVE_VISUAL_LINK\",\n childVpId: this.viewport,\n })\n .then(() => {\n this.emit(\"visual-link-removed\");\n });\n }\n }\n\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async rpcRequest(rpcRequest: Omit<VuuRpcServiceRequest, \"context\">) {\n if (this.viewport && this.server) {\n return this.server?.rpcCall<RpcResultSuccess | RpcResultError>({\n ...rpcRequest,\n context: { type: \"VIEWPORT_CONTEXT\", viewPortId: this.viewport },\n } as VuuRpcServiceRequest);\n } else {\n throw Error(`rpcCall server or viewport are undefined`);\n }\n }\n\n async menuRpcCall(rpcRequest: Omit<VuuRpcMenuRequest, \"vpId\">) {\n if (this.viewport) {\n return this.server?.rpcCall<MenuRpcResponse>({\n ...rpcRequest,\n vpId: this.viewport,\n } as VuuRpcMenuRequest);\n }\n }\n\n async editRpcCall(rpcRequest: Omit<VuuRpcEditRequest, \"vpId\">) {\n if (this.viewport && this.server) {\n return this.server.rpcCall<VuuRpcEditResponse>({\n ...rpcRequest,\n vpId: this.viewport,\n });\n } else {\n return {\n error: \"Either viewport or server is undefined\",\n type: \"VP_EDIT_RPC_REJECT\",\n } as VuuRpcEditError;\n }\n }\n\n applyEdit(rowKey: string, columnName: string, value: VuuRowDataItemType) {\n return this.editRpcCall(vuuEditCellRequest(rowKey, columnName, value)).then(\n (response) => {\n if (response.type === \"VP_EDIT_RPC_REJECT\") {\n return response.error;\n } else {\n return true;\n }\n },\n );\n }\n\n insertRow() {\n return Promise.resolve(\"not supported\");\n // return this.menuRpcCall(vuuAddRowRequest(rowKey, data)).then((response) => {\n // if (response?.error) {\n // return response.error;\n // } else {\n // return true;\n // }\n // });\n }\n deleteRow() {\n return Promise.resolve(\"not supported\");\n // return this.menuRpcCall(vuuDeleteRowRequest(rowKey)).then((response) => {\n // if (response?.error) {\n // return response.error;\n // } else {\n // return true;\n // }\n // });\n }\n}\n"],"names":[],"mappings":"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"}
package/esm/index.js CHANGED
@@ -2,7 +2,7 @@ export { authenticate, parseVuuUserFromToken } from './authenticate.js';
2
2
  export { default as ConnectionManager } from './ConnectionManager.js';
3
3
  export { connectionId, msgType } from './constants.js';
4
4
  export { isDataSourceConfigMessage, isSizeOnly, shouldMessageBeRoutedToDataSource, toDataSourceConfig } from './data-source.js';
5
- export { createSchemaFromTableMetadata, gapBetweenLastRowSentToClient, getFirstAndLastRows, groupRowsByViewport, hasRequestId, stripRequestId } from './message-utils.js';
5
+ export { createSchemaFromTableMetadata, getFirstAndLastRows, groupRowsByViewport, hasRequestId, stripRequestId } from './message-utils.js';
6
6
  export { VuuDataSource } from './VuuDataSource.js';
7
7
  export { isConnected } from './WebSocketConnection.js';
8
8
  //# sourceMappingURL=index.js.map
@@ -536,37 +536,6 @@ var createSchemaFromTableMetadata = ({
536
536
  key
537
537
  };
538
538
  };
539
- var gapBetweenLastRowSentToClient = (lastRowsReturnedToClient, pendingUpdates, clientRange, rowCount) => {
540
- const firstPendingUpdate = pendingUpdates.at(0);
541
- const lastPendingUpdate = pendingUpdates.at(-1);
542
- if (firstPendingUpdate && lastPendingUpdate) {
543
- const maxTo = Math.min(rowCount, clientRange.to);
544
- const [firstRowIndex, lastRowIndex] = lastRowsReturnedToClient;
545
- if (lastRowIndex < firstPendingUpdate.rowIndex - 1 && clientRange.from < firstPendingUpdate.rowIndex) {
546
- return {
547
- from: Math.max(lastRowIndex + 1, clientRange.from),
548
- to: firstPendingUpdate.rowIndex
549
- };
550
- } else if (firstRowIndex > lastPendingUpdate.rowIndex + 1 && maxTo > lastPendingUpdate.rowIndex) {
551
- return {
552
- from: lastPendingUpdate.rowIndex + 1,
553
- to: Math.min(maxTo, firstRowIndex)
554
- };
555
- } else if (firstRowIndex === -1 && lastRowIndex === -1) {
556
- if (clientRange.from < firstPendingUpdate.rowIndex) {
557
- return {
558
- from: clientRange.from,
559
- to: firstPendingUpdate.rowIndex
560
- };
561
- } else if (maxTo > lastPendingUpdate.rowIndex + 1) {
562
- return {
563
- from: lastPendingUpdate.rowIndex + 1,
564
- to: maxTo
565
- };
566
- }
567
- }
568
- }
569
- };
570
539
 
571
540
  // src/server-proxy/messages.ts
572
541
  var CHANGE_VP_SUCCESS = "CHANGE_VP_SUCCESS";
@@ -653,10 +622,8 @@ var ArrayBackedMovingWindow = class {
653
622
  get range() {
654
623
  return __privateGet(this, _range);
655
624
  }
656
- // TODO we should probably have a hasAllClientRowsWithinRange
657
625
  get hasAllRowsWithinRange() {
658
- return this.rowsWithinRange === this.clientRange.to - this.clientRange.from || // this.rowsWithinRange === this.range.to - this.range.from ||
659
- this.rowCount > 0 && this.clientRange.from + this.rowsWithinRange === this.rowCount;
626
+ return this.rowsWithinRange === this.clientRange.to - this.clientRange.from || this.rowCount > 0 && this.clientRange.from + this.rowsWithinRange === this.rowCount;
660
627
  }
661
628
  // Check to see if set of rows is outside the current viewport range, indicating
662
629
  // that veiwport is being scrolled quickly and server is not able to keep up.
@@ -693,18 +660,14 @@ var ArrayBackedMovingWindow = class {
693
660
  isWithinClientRange(index) {
694
661
  return this.clientRange.isWithin(index);
695
662
  }
696
- // Returns [false] or [serverDataRequired, clientRows, holdingRows]
663
+ // Returns [false] or [serverDataRequired, clientRows]
697
664
  setClientRange(from, to) {
698
665
  var _a;
699
666
  (_a = log.debug) == null ? void 0 : _a.call(log, \`setClientRange \${from} - \${to}\`);
700
667
  const currentFrom = this.clientRange.from;
701
668
  const currentTo = Math.min(this.clientRange.to, this.rowCount);
702
669
  if (from === currentFrom && to === currentTo) {
703
- return [
704
- false,
705
- EMPTY_ARRAY
706
- /*, EMPTY_ARRAY*/
707
- ];
670
+ return [false, EMPTY_ARRAY];
708
671
  }
709
672
  const originalRange = this.clientRange.copy();
710
673
  this.clientRange.from = from;
@@ -716,17 +679,24 @@ var ArrayBackedMovingWindow = class {
716
679
  this.rowsWithinRange += 1;
717
680
  }
718
681
  }
719
- let clientRows = EMPTY_ARRAY;
682
+ const clientRows = [];
720
683
  const offset = __privateGet(this, _range).from;
721
- if (this.hasAllRowsWithinRange) {
722
- if (to > originalRange.to) {
723
- const start = Math.max(from, originalRange.to);
724
- clientRows = this.internalData.slice(start - offset, to - offset);
725
- } else {
726
- const end = Math.min(originalRange.from, to);
727
- clientRows = this.internalData.slice(from - offset, end - offset);
684
+ if (to > originalRange.to) {
685
+ const start = Math.max(from, originalRange.to);
686
+ for (let i = start - offset; i < to - offset; i++) {
687
+ const row = this.internalData[i];
688
+ if (row) {
689
+ clientRows.push(row);
690
+ }
691
+ }
692
+ } else {
693
+ const end = Math.min(originalRange.from, to);
694
+ for (let i = from - offset; i < end - offset; i++) {
695
+ const row = this.internalData[i];
696
+ if (row) {
697
+ clientRows.push(row);
698
+ }
728
699
  }
729
- } else if (this.rowsWithinRange > 0) {
730
700
  }
731
701
  const serverDataRequired = this.bufferBreakout(from, to);
732
702
  return [serverDataRequired, clientRows];
@@ -863,7 +833,6 @@ var Viewport = class {
863
833
  __publicField(this, "rowCountChanged", false);
864
834
  __publicField(this, "lastUpdateStatus", NO_UPDATE_STATUS);
865
835
  __publicField(this, "updateThrottleTimer");
866
- __publicField(this, "lastRowsReturnedToClient", [-1, -1]);
867
836
  __publicField(this, "rangeMonitor", new RangeMonitor("ViewPort"));
868
837
  __publicField(this, "clientViewportId");
869
838
  __publicField(this, "disabled", false);
@@ -880,10 +849,6 @@ var Viewport = class {
880
849
  // Records SIZE only updates
881
850
  __publicField(this, "setLastSizeOnlyUpdateSize", (size) => {
882
851
  this.lastUpdateStatus.size = size;
883
- if (size === 0) {
884
- this.lastRowsReturnedToClient[0] = -1;
885
- this.lastRowsReturnedToClient[1] = -1;
886
- }
887
852
  });
888
853
  __publicField(this, "setLastUpdate", (mode) => {
889
854
  const { ts: lastTS, mode: lastMode } = this.lastUpdateStatus;
@@ -935,11 +900,12 @@ var Viewport = class {
935
900
  });
936
901
  __publicField(this, "throttleMessage", (mode) => {
937
902
  if (this.shouldThrottleMessage(mode)) {
938
- info == null ? void 0 : info("throttling updates setTimeout to 2000");
903
+ info == null ? void 0 : info("[Viewport] throttling updates setTimeout to 300");
904
+ this.setLastSizeOnlyUpdateSize(this.dataWindow.rowCount);
939
905
  if (this.updateThrottleTimer === void 0) {
940
906
  this.updateThrottleTimer = setTimeout(
941
907
  this.sendThrottledSizeMessage,
942
- 2e3
908
+ 100
943
909
  );
944
910
  }
945
911
  return true;
@@ -1159,7 +1125,6 @@ var Viewport = class {
1159
1125
  // When not scrolling, any server data is an update
1160
1126
  // When scrolling, we are in batch mode
1161
1127
  rangeRequest(requestId, range) {
1162
- var _a, _b;
1163
1128
  if (debugEnabled2) {
1164
1129
  this.rangeMonitor.set(range);
1165
1130
  }
@@ -1213,8 +1178,6 @@ var Viewport = class {
1213
1178
  this.keys.reset(this.dataWindow.clientRange);
1214
1179
  const toClient = this.isTree ? toClientRowTree : toClientRow;
1215
1180
  if (clientRows.length) {
1216
- this.lastRowsReturnedToClient[0] = clientRows[0].rowIndex;
1217
- this.lastRowsReturnedToClient[1] = (_b = (_a = clientRows.at(-1)) == null ? void 0 : _a.rowIndex) != null ? _b : -1;
1218
1181
  return [
1219
1182
  serverRequest,
1220
1183
  clientRows.map((row) => {
@@ -1348,8 +1311,6 @@ var Viewport = class {
1348
1311
  debugEnabled2 ? debug2 == null ? void 0 : debug2(\`setConfig \${JSON.stringify(config)}\`) : info == null ? void 0 : info(\`setConfig\`);
1349
1312
  if (!this.isTree && config.groupBy.length > 0) {
1350
1313
  (_a = this.dataWindow) == null ? void 0 : _a.clear();
1351
- this.lastRowsReturnedToClient[0] = -1;
1352
- this.lastRowsReturnedToClient[1] = -1;
1353
1314
  }
1354
1315
  return this.createRequest(
1355
1316
  {
@@ -1412,8 +1373,6 @@ var Viewport = class {
1412
1373
  \`ignore a SIZE=0 message on disabled viewport (\${rows.length} rows)\`
1413
1374
  );
1414
1375
  return;
1415
- } else if (firstRow.updateType === "SIZE") {
1416
- this.setLastSizeOnlyUpdateSize(firstRow.vpSize);
1417
1376
  }
1418
1377
  }
1419
1378
  for (const row of rows) {
@@ -1442,7 +1401,6 @@ var Viewport = class {
1442
1401
  // This is called only after new data has been received from server - data
1443
1402
  // returned direcly from buffer does not use this.
1444
1403
  getClientRows() {
1445
- var _a, _b, _c, _d;
1446
1404
  let out = void 0;
1447
1405
  let mode = "size-only";
1448
1406
  if (!this.hasUpdates && !this.rowCountChanged) {
@@ -1455,40 +1413,12 @@ var Viewport = class {
1455
1413
  self.clearTimeout(this.updateThrottleTimer);
1456
1414
  this.updateThrottleTimer = void 0;
1457
1415
  }
1458
- if (this.pendingUpdates.length > 0 && this.dataWindow.hasAllRowsWithinRange) {
1416
+ if (this.pendingUpdates.length > 0) {
1459
1417
  out = [];
1460
1418
  mode = "update";
1461
- const missingRows = gapBetweenLastRowSentToClient(
1462
- this.lastRowsReturnedToClient,
1463
- this.pendingUpdates,
1464
- this.dataWindow.clientRange,
1465
- this.dataWindow.rowCount
1466
- );
1467
- if (missingRows) {
1468
- for (let i = missingRows.from; i < missingRows.to; i++) {
1469
- const row = this.dataWindow.getAtIndex(i);
1470
- if (row) {
1471
- out.push(toClient(row, keys));
1472
- } else {
1473
- console.warn("[Viewport] missing row not in data cache");
1474
- }
1475
- }
1476
- for (const row of this.pendingUpdates) {
1477
- out.push(toClient(row, keys));
1478
- }
1479
- out.sort(
1480
- ([idx1], [idx2]) => idx1 - idx2
1481
- );
1482
- } else {
1483
- for (const row of this.pendingUpdates) {
1484
- out.push(toClient(row, keys));
1485
- }
1419
+ for (const row of this.pendingUpdates) {
1420
+ out.push(toClient(row, keys));
1486
1421
  }
1487
- this.lastRowsReturnedToClient[0] = (_b = (_a = out.at(0)) == null ? void 0 : _a[0]) != null ? _b : -1;
1488
- this.lastRowsReturnedToClient[1] = (_d = (_c = out.at(-1)) == null ? void 0 : _c[0]) != null ? _d : -1;
1489
- } else if (this.pendingUpdates.length > 0) {
1490
- this.lastRowsReturnedToClient[0] = -1;
1491
- this.lastRowsReturnedToClient[1] = -1;
1492
1422
  }
1493
1423
  this.pendingUpdates.length = 0;
1494
1424
  this.hasUpdates = false;