@vertexvis/stream-api 1.0.2-canary.0 → 1.0.2-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.cjs CHANGED
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var frameStreamingProtos = require('@vertexvis/frame-streaming-protos');
6
4
  var utils = require('@vertexvis/utils');
7
5
 
@@ -173,7 +171,7 @@ function validatePerspectiveCamera(camera) {
173
171
  const upYValid = ((_h = camera.up) === null || _h === void 0 ? void 0 : _h.y) != null && Number.isFinite(camera.up.y);
174
172
  const upZValid = ((_j = camera.up) === null || _j === void 0 ? void 0 : _j.z) != null && Number.isFinite(camera.up.z);
175
173
  // Validate up vector has non-zero length
176
- const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z }, true);
174
+ const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z });
177
175
  return (lookAtXValid &&
178
176
  lookAtYValid &&
179
177
  lookAtZValid &&
@@ -198,7 +196,7 @@ function validateOrthographicCamera(camera) {
198
196
  const viewVectorYValid = ((_h = camera.viewVector) === null || _h === void 0 ? void 0 : _h.y) != null && Number.isFinite(camera.viewVector.y);
199
197
  const viewVectorZValid = ((_j = camera.viewVector) === null || _j === void 0 ? void 0 : _j.z) != null && Number.isFinite(camera.viewVector.z);
200
198
  // Validate up vector has non-zero length
201
- const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z }, true);
199
+ const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z });
202
200
  return (fovHeightValid &&
203
201
  lookAtXValid &&
204
202
  lookAtYValid &&
@@ -233,7 +231,7 @@ function validateVector(vector, verifyNonZeroLength) {
233
231
  const yValid = (vector === null || vector === void 0 ? void 0 : vector.y) != null && Number.isFinite(vector.y);
234
232
  const zValid = (vector === null || vector === void 0 ? void 0 : vector.z) != null && Number.isFinite(vector.z);
235
233
  const vectorComponentsValid = xValid && yValid && zValid;
236
- if (verifyNonZeroLength) {
234
+ {
237
235
  if ((vector === null || vector === void 0 ? void 0 : vector.x) != null && (vector === null || vector === void 0 ? void 0 : vector.y) != null && (vector === null || vector === void 0 ? void 0 : vector.z) != null) {
238
236
  const vectorMagnitudeSquared = vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
239
237
  const vectorHasNonZeroLength = vectorMagnitudeSquared !== 0;
@@ -244,7 +242,6 @@ function validateVector(vector, verifyNonZeroLength) {
244
242
  return false;
245
243
  }
246
244
  }
247
- return vectorComponentsValid;
248
245
  }
249
246
 
250
247
  class WebSocketClientImpl {
@@ -574,7 +571,7 @@ class StreamApi {
574
571
  var _a, _b;
575
572
  // If a section plane is provided, verify it is valid
576
573
  const invalidSectionPlane = (_b = (_a = payload.crossSectioning) === null || _a === void 0 ? void 0 : _a.sectionPlanes) === null || _b === void 0 ? void 0 : _b.some((plane) => {
577
- const validNormal = plane.normal != null && validateVector(plane.normal, true);
574
+ const validNormal = plane.normal != null && validateVector(plane.normal);
578
575
  const validOffset = plane.offset != null && validateNumber(plane.offset);
579
576
  return !validNormal || !validOffset;
580
577
  });
@@ -973,11 +970,11 @@ function refreshToken(res = {}, meta) {
973
970
 
974
971
  var responses = /*#__PURE__*/Object.freeze({
975
972
  __proto__: null,
976
- startStream: startStream,
977
- syncTime: syncTime,
978
- reconnect: reconnect,
979
973
  loadSceneViewState: loadSceneViewState,
980
- refreshToken: refreshToken
974
+ reconnect: reconnect,
975
+ refreshToken: refreshToken,
976
+ startStream: startStream,
977
+ syncTime: syncTime
981
978
  });
982
979
 
983
980
  var index = /*#__PURE__*/Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.cjs","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed'\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: ParamsBuilder<S>[]\n): ParamsBuilder<S> {\n return (settings) => {\n return definitions.reduce(\n (result, def) => ({ ...result, ...def(settings) }),\n {}\n );\n };\n}\n\nexport function defineBoolean<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) => {\n if (typeof v === 'boolean') {\n return v ? 'on' : 'off';\n } else {\n return undefined;\n }\n });\n}\n\nexport function defineNumber<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'number' ? v.toString() : undefined\n );\n}\n\nexport function defineString<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'string' ? v : undefined\n );\n}\n\nfunction defineValue<S, P extends keyof S = keyof S>(\n param: string,\n prop: P,\n f: (prop: unknown) => string | undefined\n): ParamsBuilder<S> {\n return (settings) => {\n const value = f(settings[prop]);\n if (value != null) {\n return { [param]: value };\n } else {\n return {};\n }\n };\n}\n","import { Objects, Uri } from '@vertexvis/utils';\n\nimport {\n defineBoolean,\n defineNumber,\n defineParams,\n defineString,\n ParamsBuilder,\n} from './paramsBuilder';\n\n/**\n * Settings to configure the delivery of images over the websocket connection.\n */\nexport interface FrameDeliverySettings {\n /**\n * Indicates if the rate limiting of frame delivery is enabled based on\n * detected internet throughput.\n */\n rateLimitingEnabled?: boolean;\n\n /**\n * Enables rate limiting when the variation coefficient of frame latencies\n * exceeds this threshold. The variation coefficient is defined by the\n * standard deviation of latencies over the average of recorded latencies.\n *\n * Lower numbers will increase the aggressiveness of packet loss detection,\n * but may trigger unexpected delivery rate limiting.\n */\n packetLossThreshold?: number;\n\n /**\n * The maximum number of latencies to record. Higher numbers could result in\n * more delay before packet loss is detected. Lower numbers could result in\n * packet loss not being detected.\n */\n historyMaxSize?: number;\n\n /**\n * The duration at which point a frame will be considered failed if the server\n * has not received an acknowledgement.\n */\n timeout?: string;\n\n /**\n * Enables rate limiting when the number of frames that failed to receive an\n * acknowledgement within the timeout window exceeds this ratio.\n */\n timeoutRatioThreshold?: number;\n}\n\n/**\n * Settings to configure the adaptive rendering of images. If enabled, the\n * performance of delivering images is analyzed, and will be adjusted to deliver\n * frames quicker to the client.\n */\nexport interface AdaptiveRenderingSettings {\n /**\n * Indicates if adaptive rendering is enabled.\n */\n enabled?: boolean;\n\n /**\n * The adaptive rendering algorithm to use. Defaults to `median`.\n */\n method?:\n | 'median'\n | 'average'\n | 'smoothed-median'\n | 'median-of-smoothed-median'\n | 'average-of-smoothed-median';\n\n /**\n * A number between 1 and 100 representing the minimum JPEG quality for\n * rendered frames.\n */\n jpegMinQuality?: number;\n\n /**\n * A number between 1 and 100 representing the maximum JPEG quality for\n * rendered frames.\n */\n jpegMaxQuality?: number;\n\n /**\n * A number between 0 and 1 representing the minimum scale factor for rendered\n * frames.\n */\n imageMinScale?: number;\n\n /**\n * A number between 0 and 1 representing the maximum scale factor for rendered\n * frames.\n */\n imageMaxScale?: number;\n\n /**\n * The window size to use for smoothing based adaptive rendering methods. This\n * applies to: `smoothed-median`, `median-of-smoothed-median`,\n * `average-of-smoothed-median`. Higher window sizes will result in values\n * that are more smoothed, and have less \"wave\" like behavior to image\n * quality. However, higher window sizes will take longer to respond to\n * changes in network conditions.\n */\n windowSize?: number;\n}\n\n/**\n * Settings to configure the quality of service metrics used by the server.\n */\nexport interface QualityOfServiceSettings {\n /**\n * Specifies how many timings to track before old timings are purged.\n */\n historyMaxSize?: number;\n}\n\n/**\n * Settings to configure the frame stream and its websocket connection.\n */\nexport interface Settings {\n /**\n * **EXPERIMENTAL.** Settings to configure the delivery of frames.\n */\n EXPERIMENTAL_frameDelivery?: FrameDeliverySettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure adaptive rendering of frames.\n */\n EXPERIMENTAL_adaptiveRendering?: AdaptiveRenderingSettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure quality of service.\n */\n EXPERIMENTAL_qualityOfService?: QualityOfServiceSettings;\n}\n\nexport function appendSettingsToUrl(url: string, settings: Settings): string {\n const defaults: Settings = {\n // Settings that you want to set on each WS connection should go here.\n };\n\n const uri = Uri.parse(url);\n const builder = defineParams(\n toFrameDeliverySettingsParams(defaults.EXPERIMENTAL_frameDelivery),\n toAdaptiveRenderingSettingsParams(defaults.EXPERIMENTAL_adaptiveRendering),\n toQualityOfServiceSettingsParams(defaults.EXPERIMENTAL_qualityOfService)\n );\n const params = builder(settings);\n return Uri.toString(Uri.addQueryParams(params, uri));\n}\n\nfunction toFrameDeliverySettingsParams(\n defaults: FrameDeliverySettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_frameDelivery,\n defaults,\n defineParams(\n defineBoolean('frame-delivery.rate-limit-enabled', 'rateLimitingEnabled'),\n defineNumber(\n 'frame-delivery.packet-loss-threshold',\n 'packetLossThreshold'\n ),\n defineNumber('frame-delivery.history-max-size', 'historyMaxSize'),\n defineString('frame-delivery.timeout', 'timeout'),\n defineNumber(\n 'frame-delivery.timeout-ratio-threshold',\n 'timeoutRatioThreshold'\n )\n )\n );\n}\n\nfunction toAdaptiveRenderingSettingsParams(\n defaults: AdaptiveRenderingSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_adaptiveRendering,\n defaults,\n defineParams(\n defineBoolean('adaptive-rendering.enabled', 'enabled'),\n defineString('adaptive-rendering.method', 'method'),\n defineNumber('adaptive-rendering.jpeg-quality-min', 'jpegMinQuality'),\n defineNumber('adaptive-rendering.jpeg-quality-max', 'jpegMaxQuality'),\n defineNumber('adaptive-rendering.image-scale-min', 'imageMinScale'),\n defineNumber('adaptive-rendering.image-scale-max', 'imageMaxScale'),\n defineNumber('adaptive-rendering.window-size', 'windowSize')\n )\n );\n}\n\nfunction toQualityOfServiceSettingsParams(\n defaults: QualityOfServiceSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_qualityOfService,\n defaults,\n defineParams(defineNumber('qos.history-max-size', 'historyMaxSize'))\n );\n}\n\nfunction defineSettings<S, T>(\n getter: (settings: S) => T | undefined,\n defaults: T | undefined,\n builder: ParamsBuilder<T>\n): ParamsBuilder<S> {\n return (settings) => {\n const merged = Objects.defaults(getter(settings) || {}, defaults);\n return builder(merged);\n };\n}\n","import { google } from '@vertexvis/frame-streaming-protos';\n\ntype MaybeTimestampOrDuration = Pick<\n google.protobuf.ITimestamp,\n 'seconds' | 'nanos'\n>;\n\ntype DefinedTimestampOrDuration = Required<\n Pick<google.protobuf.ITimestamp, 'seconds' | 'nanos'>\n>;\n\n/**\n * Converts a JS date type to a `google.protobuf.Timestamp`. The returned time\n * will be represented as UTC.\n *\n * @param date The date to convert.\n */\nexport function toProtoTimestamp(date: Date): google.protobuf.Timestamp {\n const millis = date.getTime();\n return google.protobuf.Timestamp.create(parseEpochMillis(millis));\n}\n\n/**\n * Returns the current date and time as a `google.protobuf.Timestamp`.\n */\nexport function currentDateAsProtoTimestamp(): google.protobuf.Timestamp {\n return toProtoTimestamp(new Date());\n}\n\n/**\n * Converts the given milliseconds into a `google.protobuf.Duration`.\n *\n * @param ms The milliseconds to convert.\n */\nexport function toProtoDuration(ms: number): google.protobuf.Duration;\n\n/**\n * Converts the two dates into a `google.protobuf.Duration`, where the duration\n * is `end - start`. If `end` is before `start`, then the duration will be\n * negative.\n *\n * @param start The starting time.\n * @param end The ending time.\n */\nexport function toProtoDuration(\n start: Date,\n end: Date\n): google.protobuf.Duration;\n\nexport function toProtoDuration(...args: unknown[]): google.protobuf.Duration {\n if (args.length === 2) {\n const start = args[0] as Date;\n const end = args[1] as Date;\n const millis = end.getTime() - start.getTime();\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else if (args.length === 1) {\n const millis = args[0] as number;\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else {\n throw new Error('Expected input to be a number or start and end date.');\n }\n}\n\n/* eslint-disable padding-line-between-statements */\n/**\n * Converts a protobuf timestamp or duration to a JS date.\n *\n * @param time The timestamp or duration to convert.\n */\nexport function protoToDate(time: DefinedTimestampOrDuration): Date;\nexport function protoToDate(time: MaybeTimestampOrDuration): Date | undefined;\nexport function protoToDate(\n time: MaybeTimestampOrDuration | DefinedTimestampOrDuration\n): Date | undefined {\n if (time.seconds != null && time.nanos != null) {\n const seconds =\n typeof time.seconds === 'number' ? time.seconds : time.seconds.toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\n/* eslint-enable padding-line-between-statements */\n\nfunction parseEpochMillis(millis: number): DefinedTimestampOrDuration {\n const seconds = Math.floor(Math.abs(millis) / 1000);\n const nanos = (millis % 1000) * 1000000;\n return { seconds: seconds * (millis < 0 ? -1 : 1), nanos };\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function validateBoundingBox(\n boundingBox: vertexvis.protobuf.core.IBoundingBox3f\n): boolean {\n const boundingBoxXMaxValid =\n boundingBox?.xmax != null && Number.isFinite(boundingBox.xmax);\n const boundingBoxXMinValid =\n boundingBox?.xmin != null && Number.isFinite(boundingBox.xmin);\n const boundingBoxYMaxValid =\n boundingBox?.ymax != null && Number.isFinite(boundingBox.ymax);\n const boundingBoxYMinValid =\n boundingBox?.ymin != null && Number.isFinite(boundingBox.ymin);\n const boundingBoxZMaxValid =\n boundingBox?.zmax != null && Number.isFinite(boundingBox.zmax);\n const boundingBoxZMinValid =\n boundingBox?.zmin != null && Number.isFinite(boundingBox.zmin);\n\n return (\n boundingBoxXMaxValid &&\n boundingBoxXMinValid &&\n boundingBoxYMaxValid &&\n boundingBoxYMinValid &&\n boundingBoxZMaxValid &&\n boundingBoxZMinValid\n );\n}\n\nexport function validateCamera(\n camera: vertexvis.protobuf.stream.ICamera\n): boolean {\n // If a perspective camera is provided, verify it is valid\n if (camera.perspective != null) {\n const perspectiveCameraIsValid = validatePerspectiveCamera(\n camera.perspective\n );\n return perspectiveCameraIsValid;\n }\n\n // If an orthographic camera is provided, verify it is valid\n if (camera.orthographic != null) {\n const orthographicCameraIsValid = validateOrthographicCamera(\n camera.orthographic\n );\n return orthographicCameraIsValid;\n }\n\n return false;\n}\n\nexport function validatePerspectiveCamera(\n camera: vertexvis.protobuf.stream.IPerspectiveCamera\n): boolean {\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const positionXValid =\n camera.position?.x != null && Number.isFinite(camera.position.x);\n const positionYValid =\n camera.position?.y != null && Number.isFinite(camera.position.y);\n const positionZValid =\n camera.position?.z != null && Number.isFinite(camera.position.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n positionXValid &&\n positionYValid &&\n positionZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera\n): boolean {\n const fovHeightValid =\n camera.fovHeight != null && Number.isFinite(camera.fovHeight);\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n const viewVectorXValid =\n camera.viewVector?.x != null && Number.isFinite(camera.viewVector.x);\n const viewVectorYValid =\n camera.viewVector?.y != null && Number.isFinite(camera.viewVector.y);\n const viewVectorZValid =\n camera.viewVector?.z != null && Number.isFinite(camera.viewVector.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n fovHeightValid &&\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n viewVectorXValid &&\n viewVectorYValid &&\n viewVectorZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions\n): boolean {\n const heightValid =\n dimensions?.height != null &&\n Number.isFinite(dimensions.height) &&\n dimensions.height > 0;\n const widthValid =\n dimensions?.width != null &&\n Number.isFinite(dimensions.width) &&\n dimensions.width > 0;\n\n return heightValid && widthValid;\n}\n\nexport function validateNumber(number: number): boolean {\n return number != null && Number.isFinite(number);\n}\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint\n): boolean {\n const xValid = point?.x != null && Number.isFinite(point.x);\n const yValid = point?.y != null && Number.isFinite(point.y);\n\n return xValid && yValid;\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f,\n verifyNonZeroLength: boolean\n): boolean {\n const xValid = vector?.x != null && Number.isFinite(vector.x);\n const yValid = vector?.y != null && Number.isFinite(vector.y);\n const zValid = vector?.z != null && Number.isFinite(vector.z);\n\n const vectorComponentsValid = xValid && yValid && zValid;\n\n if (verifyNonZeroLength) {\n if (vector?.x != null && vector?.y != null && vector?.z != null) {\n const vectorMagnitudeSquared =\n vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;\n const vectorHasNonZeroLength = vectorMagnitudeSquared !== 0;\n\n return vectorComponentsValid && vectorHasNonZeroLength;\n } else {\n // If one or more components are undefined, then the vector does not have non-zero length\n return false;\n }\n }\n\n return vectorComponentsValid;\n}\n","import { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\n\nexport type WebSocketSendData =\n | string\n | ArrayBufferLike\n | Blob\n | ArrayBufferView;\n\nexport type MessageHandler = (event: MessageEvent) => void;\n\nexport type CloseHandler = (event: CloseEvent) => void;\n\nexport interface WebSocketClient {\n close(): void;\n connect(descriptor: ConnectionDescriptor): Promise<void>;\n onMessage(handler: MessageHandler): Disposable;\n onClose(handler: CloseHandler): Disposable;\n send(data: WebSocketSendData): void;\n}\n\nexport class WebSocketClientImpl implements WebSocketClient {\n private webSocket?: WebSocket;\n private listeners: Record<UUID.UUID, Disposable> = {};\n\n private onMessageDispatcher = new EventDispatcher<MessageEvent>();\n private onCloseDispatcher = new EventDispatcher<CloseEvent>();\n\n public close(): void {\n if (this.webSocket != null) {\n this.webSocket.close();\n }\n }\n\n public async connect(descriptor: ConnectionDescriptor): Promise<void> {\n const id = UUID.create();\n\n // Ensure that any existing websocket connection has been closed prior\n // to opening a new one to ensure we don't leave open connections.\n if (this.webSocket != null) {\n this.close();\n }\n\n this.webSocket = new WebSocket(descriptor.url, descriptor.protocols);\n this.webSocket.binaryType = 'arraybuffer';\n\n return new Promise((resolve, reject) => {\n if (this.webSocket != null) {\n this.listeners[id] = this.addWebSocketListeners(\n this.webSocket,\n id,\n resolve,\n reject\n );\n }\n });\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n return this.onMessageDispatcher.on(handler);\n }\n\n public onClose(handler: CloseHandler): Disposable {\n return this.onCloseDispatcher.on(handler);\n }\n\n public send(data: WebSocketSendData): void {\n if (this.webSocket != null) {\n this.webSocket.send(data);\n }\n }\n\n private addWebSocketListeners = (\n ws: WebSocket,\n wsId: UUID.UUID,\n resolve: VoidFunction,\n reject: VoidFunction\n ): Disposable => {\n const onOpen = (): void => this.onOpen(resolve);\n const onError = (): void => reject();\n const onClose = (event: CloseEvent): void => this.handleClose(event, wsId);\n\n ws.addEventListener('message', this.handleMessage);\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n\n return {\n dispose: () => {\n ws.removeEventListener('message', this.handleMessage);\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n },\n };\n };\n\n private removeWebSocketListeners(webSocketId: UUID.UUID): void {\n this.listeners[webSocketId]?.dispose();\n }\n\n private handleMessage = (event: MessageEvent): void => {\n this.onMessageDispatcher.emit(event);\n };\n\n private handleClose = (event: CloseEvent, webSocketId: UUID.UUID): void => {\n this.onCloseDispatcher.emit(event);\n this.removeWebSocketListeners(webSocketId);\n };\n\n private onOpen(resolve: VoidFunction): void {\n resolve();\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\nimport { decode, encode } from './encoder';\nimport { StreamRequestError } from './errors';\nimport { appendSettingsToUrl, Settings } from './settings';\nimport { currentDateAsProtoTimestamp } from './time';\nimport {\n BeginInteractionPayload,\n EndInteractionPayload,\n EventMessage,\n GetStencilBufferPayload,\n HitItemsPayload,\n LoadSceneViewStatePayload,\n ReconnectPayload,\n RecordPerformancePayload,\n ReplaceCameraPayload,\n RequestMessage,\n ResponseError,\n ResponseMessage,\n ResponseResult,\n StartStreamPayload,\n SyncTimePayload,\n UpdateCrossSectioningPayload,\n UpdateDimensionsPayload,\n UpdateInteractionPayload,\n UpdateModelViewPayload,\n UpdateStreamPayload,\n} from './types';\nimport {\n validateBoundingBox,\n validateCamera,\n validateDimensions,\n validateNumber,\n validatePoint,\n validateVector,\n} from './validators';\nimport { WebSocketClient, WebSocketClientImpl } from './webSocketClient';\n\nexport type RequestMessageHandler = (msg: RequestMessage) => void;\n\nexport type ResponseMessageHandler = (msg: ResponseMessage) => void;\n\nexport type EventMessageHandler = (msg: EventMessage) => void;\n\nexport type CloseEventHandler = (evt: CloseEvent) => void;\n\nexport interface StreamApiOptions {\n loggingEnabled?: boolean;\n}\n\n/**\n * The API client to interact with Vertex's streaming API.\n */\nexport class StreamApi {\n private onResponseDispatcher = new EventDispatcher<ResponseMessage>();\n private onRequestDispatcher = new EventDispatcher<RequestMessage>();\n private onEventDispatcher = new EventDispatcher<EventMessage>();\n private messageSubscription?: Disposable;\n\n private opts: Required<StreamApiOptions>;\n\n public constructor(\n private websocket: WebSocketClient = new WebSocketClientImpl(),\n opts: StreamApiOptions = {}\n ) {\n this.opts = {\n loggingEnabled: opts.loggingEnabled ?? false,\n };\n }\n\n /**\n * Initiates a websocket connection to Vertex's streaming API. Returns a\n * promise that resolves once the connection is established and can begin\n * accepting messages.\n *\n * @param descriptor A function that returns a description of how to establish\n * a WS connection.\n * @param settings A configuration to use when initializing the WS connection.\n */\n public async connect(\n descriptor: ConnectionDescriptor,\n settings: Settings = {}\n ): Promise<Disposable> {\n const desc = {\n ...descriptor,\n url: appendSettingsToUrl(descriptor.url, settings),\n };\n await this.websocket.connect(desc);\n this.messageSubscription = this.websocket.onMessage((message) => {\n this.handleMessage(message);\n });\n\n return { dispose: () => this.dispose() };\n }\n\n /**\n * Closes any open WS connections and disposes of resources.\n */\n public dispose(): void {\n this.websocket.close();\n this.messageSubscription?.dispose();\n }\n\n /**\n * Adds a callback that is invoked when the client receives a request from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler A handler function.\n */\n public onRequest(handler: RequestMessageHandler): Disposable {\n return this.onRequestDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the client receives an event from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler - A handler function.\n */\n public onEvent(handler: EventMessageHandler): Disposable {\n return this.onEventDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the websocket connection is closed.\n *\n * @param handler A handler function.\n */\n public onClose(handler: CloseEventHandler): Disposable {\n return this.websocket.onClose(handler);\n }\n\n /**\n * Sends a request to initiate a streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public startStream(\n payload: StartStreamPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ startStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to reconnect to an existing streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public async reconnect(\n payload: ReconnectPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ reconnect: payload }, withResponse);\n }\n\n public async updateStream(\n payload: UpdateStreamPayload,\n withResponse = false\n ): Promise<vertexvis.protobuf.stream.IUpdateStreamResult> {\n return this.sendRequest({ updateStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to signal to the rendering pipeline that an interaction has\n * started. The rendering pipeline will use this as a hint to perform more\n * aggressive rendering optimizations at the expense of rendering quality.\n * Call `endInteraction` to signal to the rendering pipeline that an\n * interaction has finished.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param data The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public beginInteraction(\n payload: BeginInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ beginInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public replaceCamera(\n payload: ReplaceCameraPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn(\n 'Invalid camera provided. Canceling replaceCamera operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateCamera: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera as a fly operation\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public flyTo(\n payload: vertexvis.protobuf.stream.IFlyToPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a bounding box is provided, verify it is valid\n if (payload.boundingBox != null) {\n const validBoundingBox = validateBoundingBox(payload.boundingBox);\n\n if (!validBoundingBox) {\n console.warn(\n 'Invalid bounding box provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn('Invalid camera provided. Canceling flyTo operation.');\n return Promise.resolve({});\n }\n }\n\n // If a base camera is provided, verify it is valid\n if (payload.baseCamera != null) {\n const baseCameraIsValid = validateCamera(payload.baseCamera);\n\n if (!baseCameraIsValid) {\n console.warn(\n 'Invalid base camera provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ flyTo: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the specified interaction.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateInteraction(\n payload: UpdateInteractionPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the dimensions of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateDimensions(\n payload: UpdateDimensionsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // Verify the provided dimensions are valid\n if (payload.dimensions != null) {\n const validDimensions = validateDimensions(payload.dimensions);\n\n if (!validDimensions) {\n console.warn(\n 'Invalid dimensions provided. Canceling updateDimensions operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateDimensions: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the cross sectioning planes of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateCrossSectioning(\n payload: UpdateCrossSectioningPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a section plane is provided, verify it is valid\n const invalidSectionPlane = payload.crossSectioning?.sectionPlanes?.some(\n (plane) => {\n const validNormal =\n plane.normal != null && validateVector(plane.normal, true);\n const validOffset =\n plane.offset != null && validateNumber(plane.offset);\n\n return !validNormal || !validOffset;\n }\n );\n\n if (invalidSectionPlane) {\n console.warn(\n 'Invalid cross section plane provided. Canceling updateCrossSectioning operation.'\n );\n return Promise.resolve({});\n }\n\n return this.sendRequest({ updateCrossSectioning: payload }, withResponse);\n }\n\n /**\n * Sends a request to set or clear the model view of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateModelView(\n payload: UpdateModelViewPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateModelView: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform hit detection.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public hitItems(\n payload: HitItemsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a point is provided, verify it is valid\n if (payload.point != null) {\n const validPoint = validatePoint(payload.point);\n\n if (!validPoint) {\n console.warn('Invalid point provided. Canceling hitItems operation.');\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ hitItems: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform an alteration to a scene. Alterations include\n * changing item visibility and changing the materials of items.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public createSceneAlteration(\n payload: vertexvis.protobuf.stream.ICreateSceneAlterationPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ createSceneAlteration: payload }, withResponse);\n }\n\n /**\n * Sends a request to reset all overrides for a given scene and optionally to\n * reset the camera to that of the base scene.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public resetSceneView(\n payload: vertexvis.protobuf.stream.IResetViewPlayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ resetView: payload }, withResponse);\n }\n\n /**\n * Sends a request to tell the rendering pipeline that an interaction has\n * ended.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public endInteraction(\n payload: EndInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IBeginInteractionResult> {\n return this.sendRequest({ endInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to sync the clocks between the client and server.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public syncTime(\n payload: SyncTimePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ syncTime: payload }, withResponse);\n }\n\n /**\n * Sends a request to record performance timings that were measured in the\n * client. The server may use these timings as hints to optimize the rendering\n * performance to provide a better experience.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public recordPerformance(\n payload: RecordPerformancePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ recordPerformance: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the current scene view with the state present\n * in the specified scene view state.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public loadSceneViewState(\n payload: LoadSceneViewStatePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ loadSceneViewState: payload }, withResponse);\n }\n\n /**\n * Sends a request to get a stencil buffer image for the current scene view.\n */\n public getStencilBuffer(\n payload: GetStencilBufferPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ getStencilBuffer: payload }, withResponse);\n }\n\n /**\n * Sends a request to retrieve a new token. This token can be used to\n * authenticate with other Vertex services.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * @returns A promise that completes with the refreshed token.\n */\n public refreshToken(\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ refreshToken: {} }, withResponse);\n }\n\n /**\n * Acknowledges a successful request by sending a reply back to the server\n * with an optional result body.\n *\n * @param reqId The ID of the received request.\n * @param result A result to reply with.\n */\n public replyResult(reqId: string, result: ResponseResult): void {\n this.sendResponse({ requestId: { value: reqId }, ...result });\n }\n\n /**\n * Acknowledges a failed request by sending a reply back to the server.\n *\n * @param reqId The ID of the received request.\n * @param error An error to reply with.\n */\n public replyError(reqId: string, error: ResponseError): void {\n this.sendResponse({ requestId: { value: reqId }, error });\n }\n\n protected handleMessage(message: MessageEvent): void {\n const msg = decode(message.data);\n this.log('WS message received', msg);\n\n if (msg?.sentAtTime != null) {\n if (msg.response != null) {\n this.onResponseDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n response: msg.response,\n });\n }\n\n if (msg.request != null) {\n this.onRequestDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n request: msg.request,\n });\n }\n\n if (msg.event != null) {\n this.onEventDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n event: msg.event,\n });\n }\n }\n }\n\n protected onResponse(handler: ResponseMessageHandler): Disposable {\n return this.onResponseDispatcher.on(handler);\n }\n\n protected log(msg: string, ...other: unknown[]): void {\n if (this.opts.loggingEnabled) {\n console.debug(msg, ...other);\n }\n }\n\n private sendRequest(\n req: vertexvis.protobuf.stream.IStreamRequest,\n withResponse: boolean\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n const sentAtTime = currentDateAsProtoTimestamp();\n if (withResponse) {\n const requestId = UUID.create();\n const request = { ...req, requestId: { value: requestId } };\n\n return new Promise((resolve, reject) => {\n const subscription = this.onResponse((msg) => {\n if (requestId === msg.response.requestId?.value) {\n if (msg.response.error == null) {\n resolve(msg.response);\n } else {\n const { message: summary, details } = msg.response.error;\n reject(\n new StreamRequestError(\n requestId,\n req,\n summary?.value,\n details?.value\n )\n );\n }\n subscription.dispose();\n }\n });\n this.sendMessage({ sentAtTime, request });\n });\n }\n this.sendMessage({ sentAtTime, request: req });\n return Promise.resolve({});\n }\n\n private sendMessage(msg: vertexvis.protobuf.stream.IStreamMessage): void {\n this.websocket.send(encode(msg));\n this.log('WS message sent', msg);\n }\n\n private sendResponse(\n response: vertexvis.protobuf.stream.IStreamResponse\n ): void {\n const sentAtTime = currentDateAsProtoTimestamp();\n this.websocket.send(encode({ sentAtTime, response }));\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n AnimationCompletedEvent,\n EventMessage,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ntype Event = vertexvis.protobuf.stream.IStreamEvent;\n\nfunction event(req: Event, meta?: Metadata): EventMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n event: {\n ...req,\n },\n ...meta,\n };\n}\n\nexport function animationCompleted(id: string): EventMessage {\n const def: AnimationCompletedEvent = {\n animationId: { hex: id },\n };\n return event({\n animationCompleted: {\n ...def,\n },\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n DrawFramePayload,\n GracefulReconnectPayload,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ntype Request = RequestId &\n Payload<Omit<vertexvis.protobuf.stream.IStreamRequest, 'requestId'>>;\n\ninterface Payload<P> {\n payload?: P;\n}\n\ntype DrawFrameRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IDrawFramePayload>;\n\ntype GracefulReconnectRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IGracefulReconnectionPayload>;\n\nfunction request(req: Request, meta?: Metadata): RequestMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n request: {\n requestId: req.requestId != null ? { value: req.requestId } : undefined,\n ...req.payload,\n },\n };\n}\n\nexport function drawFrame(\n req: DrawFrameRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: DrawFramePayload = {\n sequenceNumber: 1,\n sceneAttributes: {\n camera: {\n position: { x: 0, y: 0, z: 1 },\n lookAt: { x: 0, y: 0, z: 0 },\n up: { x: 0, y: 1, z: 0 },\n },\n visibleBoundingBox: {\n xmin: -1,\n ymin: -1,\n zmin: -1,\n xmax: 1,\n ymax: 1,\n zmax: 1,\n },\n crossSectioning: {\n sectionPlanes: [],\n },\n displayListSummary: {\n visibleSummary: {\n count: 100,\n },\n selectedVisibleSummary: {\n count: 0,\n },\n },\n },\n imageAttributes: {\n frameDimensions: { width: 200, height: 150 },\n imageRect: { x: 0, y: 0, width: 200, height: 150 },\n scaleFactor: 1,\n },\n frameCorrelationIds: ['123'],\n image: new Uint8Array(),\n };\n return request(\n {\n requestId: req.requestId,\n payload: { drawFrame: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n\nexport function gracefulReconnect(\n req: GracefulReconnectRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: GracefulReconnectPayload = {\n streamId: { hex: UUID.create() },\n timeToReconnectDuration: { seconds: 1, nanos: 0 },\n };\n return request(\n {\n requestId: req.requestId,\n payload: { gracefulReconnection: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { RefreshTokenResult } from '../..';\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n LoadSceneViewStateResult,\n ReconnectResult,\n ResponseMessage,\n StartStreamResult,\n SyncTimeResult,\n} from '../../types';\n\ntype Metadata = Partial<Pick<ResponseMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ninterface Result<T> {\n result?: T;\n}\n\ntype Response = RequestId &\n Result<Omit<vertexvis.protobuf.stream.IStreamResponse, 'requestId'>>;\n\ntype StartStreamResponse = RequestId &\n Result<vertexvis.protobuf.stream.IStartStreamResult>;\n\ntype SyncTimeResponse = RequestId &\n Result<vertexvis.protobuf.stream.ISyncTimeResult>;\n\ntype ReconnectResponse = RequestId &\n Result<vertexvis.protobuf.stream.IReconnectResult>;\n\ntype LoadSceneViewStateResponse = RequestId &\n Result<vertexvis.protobuf.stream.ILoadSceneViewStateResult>;\n\ntype RefreshTokenResponse = RequestId &\n Result<vertexvis.protobuf.stream.IRefreshTokenResult>;\n\nfunction response(res: Response, meta?: Metadata): ResponseMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n response: {\n requestId: res.requestId != null ? { value: res.requestId } : undefined,\n ...res.result,\n },\n };\n}\n\nexport function startStream(\n res: StartStreamResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: StartStreamResult = {\n streamId: { hex: UUID.create() },\n sceneId: { hex: UUID.create() },\n sceneViewId: { hex: UUID.create() },\n sessionId: { hex: UUID.create() },\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n worldOrientation: {\n front: { x: 0, y: 0, z: 1 },\n up: { x: 0, y: 1, z: 0 },\n },\n };\n return response(\n {\n requestId: res.requestId,\n result: { startStream: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function syncTime(\n res: SyncTimeResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: SyncTimeResult = { replyTime: { seconds: 1, nanos: 0 } };\n return response({\n requestId: res.requestId,\n result: { syncTime: Objects.defaults(res.result, def) },\n });\n}\n\nexport function reconnect(\n res: ReconnectResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: ReconnectResult = {\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { reconnect: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function loadSceneViewState(\n res: LoadSceneViewStateResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: LoadSceneViewStateResult = {};\n return response(\n {\n requestId: res.requestId,\n result: { loadSceneViewState: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function refreshToken(\n res: RefreshTokenResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: RefreshTokenResult = {\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { refreshToken: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n","import { Disposable } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from '../connection';\nimport {\n CloseHandler,\n MessageHandler,\n WebSocketClient,\n WebSocketSendData,\n} from '../webSocketClient';\n\nexport class WebSocketClientMock implements WebSocketClient {\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n }\n\n public connect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n public onClose(handler: CloseHandler): Disposable {\n this.closeHandlers.add(handler);\n return { dispose: () => this.closeHandlers.delete(handler) };\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n this.msgHandlers.add(handler);\n return { dispose: () => this.msgHandlers.delete(handler) };\n }\n\n public send(data: WebSocketSendData): void {\n this.sentMessages.push(data);\n }\n\n public reconnect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Simulates a websocket message that was sent by the server and received by\n * the client.\n *\n * @param data The websocket message data.\n */\n public receiveMessage(data: WebSocketSendData): void {\n this.msgHandlers.forEach((handler) =>\n handler(new MessageEvent('message', { data }))\n );\n }\n\n /**\n * Resets the internal state of the mock by clearing any accrued sent messages\n * and removing all handlers.\n */\n public reset(): void {\n this.sentMessages = [];\n this.msgHandlers.clear();\n this.closeHandlers.clear();\n }\n\n /**\n * Returns `true` if there are remaining sent messages..\n */\n public hasNextSent(): boolean {\n return this.sentMessages.length > 0;\n }\n\n /**\n * Decodes and returns the next message that was sent on this websocket.\n *\n * @example\n *\n * const ws = new WebSocketClientMock();\n * const decoder = str => parseInt(str)\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(decoder); // 1\n * ws.nextSent(decoder); // 2\n *\n * @param decoder A function to decode a message.\n */\n public nextSent<T>(decoder: (data: WebSocketSendData) => T): T;\n\n /**\n * Returns the next message that was sent on this websocket.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(); // \"1\"\n * ws.nextSent(); // \"2\"\n * ```\n */\n public nextSent(): WebSocketSendData;\n public nextSent<T>(\n decoder?: (data: WebSocketSendData) => T\n ): T | WebSocketSendData {\n const next = this.sentMessages.shift();\n if (next != null) {\n if (decoder != null) {\n return decoder(next);\n } else {\n return next;\n }\n } else {\n throw new Error('Sent messages is empty');\n }\n }\n\n /**\n * Skips the next N sent messages.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n * ws.send(\"3\");\n *\n * ws.skipSent(2);\n * ws.nextSent(); // \"3\"\n * ```\n *\n * @param n The number of sent messages to skip over.\n */\n public skipSent(n = 1): this {\n if (n <= this.sentMessages.length) {\n for (let i = 0; i < n; i++) {\n this.nextSent();\n }\n } else {\n throw new Error(\n `Cannot skip the next ${n} messages. Sent message queue only has ${this.sentMessages.length} messages.`\n );\n }\n return this;\n }\n}\n"],"names":["vertexvis","Uri","Objects","google","EventDispatcher","UUID"],"mappings":"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"}
1
+ {"version":3,"file":"bundle.cjs","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed'\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: ParamsBuilder<S>[]\n): ParamsBuilder<S> {\n return (settings) => {\n return definitions.reduce(\n (result, def) => ({ ...result, ...def(settings) }),\n {}\n );\n };\n}\n\nexport function defineBoolean<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) => {\n if (typeof v === 'boolean') {\n return v ? 'on' : 'off';\n } else {\n return undefined;\n }\n });\n}\n\nexport function defineNumber<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'number' ? v.toString() : undefined\n );\n}\n\nexport function defineString<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'string' ? v : undefined\n );\n}\n\nfunction defineValue<S, P extends keyof S = keyof S>(\n param: string,\n prop: P,\n f: (prop: unknown) => string | undefined\n): ParamsBuilder<S> {\n return (settings) => {\n const value = f(settings[prop]);\n if (value != null) {\n return { [param]: value };\n } else {\n return {};\n }\n };\n}\n","import { Objects, Uri } from '@vertexvis/utils';\n\nimport {\n defineBoolean,\n defineNumber,\n defineParams,\n defineString,\n ParamsBuilder,\n} from './paramsBuilder';\n\n/**\n * Settings to configure the delivery of images over the websocket connection.\n */\nexport interface FrameDeliverySettings {\n /**\n * Indicates if the rate limiting of frame delivery is enabled based on\n * detected internet throughput.\n */\n rateLimitingEnabled?: boolean;\n\n /**\n * Enables rate limiting when the variation coefficient of frame latencies\n * exceeds this threshold. The variation coefficient is defined by the\n * standard deviation of latencies over the average of recorded latencies.\n *\n * Lower numbers will increase the aggressiveness of packet loss detection,\n * but may trigger unexpected delivery rate limiting.\n */\n packetLossThreshold?: number;\n\n /**\n * The maximum number of latencies to record. Higher numbers could result in\n * more delay before packet loss is detected. Lower numbers could result in\n * packet loss not being detected.\n */\n historyMaxSize?: number;\n\n /**\n * The duration at which point a frame will be considered failed if the server\n * has not received an acknowledgement.\n */\n timeout?: string;\n\n /**\n * Enables rate limiting when the number of frames that failed to receive an\n * acknowledgement within the timeout window exceeds this ratio.\n */\n timeoutRatioThreshold?: number;\n}\n\n/**\n * Settings to configure the adaptive rendering of images. If enabled, the\n * performance of delivering images is analyzed, and will be adjusted to deliver\n * frames quicker to the client.\n */\nexport interface AdaptiveRenderingSettings {\n /**\n * Indicates if adaptive rendering is enabled.\n */\n enabled?: boolean;\n\n /**\n * The adaptive rendering algorithm to use. Defaults to `median`.\n */\n method?:\n | 'median'\n | 'average'\n | 'smoothed-median'\n | 'median-of-smoothed-median'\n | 'average-of-smoothed-median';\n\n /**\n * A number between 1 and 100 representing the minimum JPEG quality for\n * rendered frames.\n */\n jpegMinQuality?: number;\n\n /**\n * A number between 1 and 100 representing the maximum JPEG quality for\n * rendered frames.\n */\n jpegMaxQuality?: number;\n\n /**\n * A number between 0 and 1 representing the minimum scale factor for rendered\n * frames.\n */\n imageMinScale?: number;\n\n /**\n * A number between 0 and 1 representing the maximum scale factor for rendered\n * frames.\n */\n imageMaxScale?: number;\n\n /**\n * The window size to use for smoothing based adaptive rendering methods. This\n * applies to: `smoothed-median`, `median-of-smoothed-median`,\n * `average-of-smoothed-median`. Higher window sizes will result in values\n * that are more smoothed, and have less \"wave\" like behavior to image\n * quality. However, higher window sizes will take longer to respond to\n * changes in network conditions.\n */\n windowSize?: number;\n}\n\n/**\n * Settings to configure the quality of service metrics used by the server.\n */\nexport interface QualityOfServiceSettings {\n /**\n * Specifies how many timings to track before old timings are purged.\n */\n historyMaxSize?: number;\n}\n\n/**\n * Settings to configure the frame stream and its websocket connection.\n */\nexport interface Settings {\n /**\n * **EXPERIMENTAL.** Settings to configure the delivery of frames.\n */\n EXPERIMENTAL_frameDelivery?: FrameDeliverySettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure adaptive rendering of frames.\n */\n EXPERIMENTAL_adaptiveRendering?: AdaptiveRenderingSettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure quality of service.\n */\n EXPERIMENTAL_qualityOfService?: QualityOfServiceSettings;\n}\n\nexport function appendSettingsToUrl(url: string, settings: Settings): string {\n const defaults: Settings = {\n // Settings that you want to set on each WS connection should go here.\n };\n\n const uri = Uri.parse(url);\n const builder = defineParams(\n toFrameDeliverySettingsParams(defaults.EXPERIMENTAL_frameDelivery),\n toAdaptiveRenderingSettingsParams(defaults.EXPERIMENTAL_adaptiveRendering),\n toQualityOfServiceSettingsParams(defaults.EXPERIMENTAL_qualityOfService)\n );\n const params = builder(settings);\n return Uri.toString(Uri.addQueryParams(params, uri));\n}\n\nfunction toFrameDeliverySettingsParams(\n defaults: FrameDeliverySettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_frameDelivery,\n defaults,\n defineParams(\n defineBoolean('frame-delivery.rate-limit-enabled', 'rateLimitingEnabled'),\n defineNumber(\n 'frame-delivery.packet-loss-threshold',\n 'packetLossThreshold'\n ),\n defineNumber('frame-delivery.history-max-size', 'historyMaxSize'),\n defineString('frame-delivery.timeout', 'timeout'),\n defineNumber(\n 'frame-delivery.timeout-ratio-threshold',\n 'timeoutRatioThreshold'\n )\n )\n );\n}\n\nfunction toAdaptiveRenderingSettingsParams(\n defaults: AdaptiveRenderingSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_adaptiveRendering,\n defaults,\n defineParams(\n defineBoolean('adaptive-rendering.enabled', 'enabled'),\n defineString('adaptive-rendering.method', 'method'),\n defineNumber('adaptive-rendering.jpeg-quality-min', 'jpegMinQuality'),\n defineNumber('adaptive-rendering.jpeg-quality-max', 'jpegMaxQuality'),\n defineNumber('adaptive-rendering.image-scale-min', 'imageMinScale'),\n defineNumber('adaptive-rendering.image-scale-max', 'imageMaxScale'),\n defineNumber('adaptive-rendering.window-size', 'windowSize')\n )\n );\n}\n\nfunction toQualityOfServiceSettingsParams(\n defaults: QualityOfServiceSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_qualityOfService,\n defaults,\n defineParams(defineNumber('qos.history-max-size', 'historyMaxSize'))\n );\n}\n\nfunction defineSettings<S, T>(\n getter: (settings: S) => T | undefined,\n defaults: T | undefined,\n builder: ParamsBuilder<T>\n): ParamsBuilder<S> {\n return (settings) => {\n const merged = Objects.defaults(getter(settings) || {}, defaults);\n return builder(merged);\n };\n}\n","import { google } from '@vertexvis/frame-streaming-protos';\n\ntype MaybeTimestampOrDuration = Pick<\n google.protobuf.ITimestamp,\n 'seconds' | 'nanos'\n>;\n\ntype DefinedTimestampOrDuration = Required<\n Pick<google.protobuf.ITimestamp, 'seconds' | 'nanos'>\n>;\n\n/**\n * Converts a JS date type to a `google.protobuf.Timestamp`. The returned time\n * will be represented as UTC.\n *\n * @param date The date to convert.\n */\nexport function toProtoTimestamp(date: Date): google.protobuf.Timestamp {\n const millis = date.getTime();\n return google.protobuf.Timestamp.create(parseEpochMillis(millis));\n}\n\n/**\n * Returns the current date and time as a `google.protobuf.Timestamp`.\n */\nexport function currentDateAsProtoTimestamp(): google.protobuf.Timestamp {\n return toProtoTimestamp(new Date());\n}\n\n/**\n * Converts the given milliseconds into a `google.protobuf.Duration`.\n *\n * @param ms The milliseconds to convert.\n */\nexport function toProtoDuration(ms: number): google.protobuf.Duration;\n\n/**\n * Converts the two dates into a `google.protobuf.Duration`, where the duration\n * is `end - start`. If `end` is before `start`, then the duration will be\n * negative.\n *\n * @param start The starting time.\n * @param end The ending time.\n */\nexport function toProtoDuration(\n start: Date,\n end: Date\n): google.protobuf.Duration;\n\nexport function toProtoDuration(...args: unknown[]): google.protobuf.Duration {\n if (args.length === 2) {\n const start = args[0] as Date;\n const end = args[1] as Date;\n const millis = end.getTime() - start.getTime();\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else if (args.length === 1) {\n const millis = args[0] as number;\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else {\n throw new Error('Expected input to be a number or start and end date.');\n }\n}\n\n/* eslint-disable padding-line-between-statements */\n/**\n * Converts a protobuf timestamp or duration to a JS date.\n *\n * @param time The timestamp or duration to convert.\n */\nexport function protoToDate(time: DefinedTimestampOrDuration): Date;\nexport function protoToDate(time: MaybeTimestampOrDuration): Date | undefined;\nexport function protoToDate(\n time: MaybeTimestampOrDuration | DefinedTimestampOrDuration\n): Date | undefined {\n if (time.seconds != null && time.nanos != null) {\n const seconds =\n typeof time.seconds === 'number' ? time.seconds : time.seconds.toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\n/* eslint-enable padding-line-between-statements */\n\nfunction parseEpochMillis(millis: number): DefinedTimestampOrDuration {\n const seconds = Math.floor(Math.abs(millis) / 1000);\n const nanos = (millis % 1000) * 1000000;\n return { seconds: seconds * (millis < 0 ? -1 : 1), nanos };\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function validateBoundingBox(\n boundingBox: vertexvis.protobuf.core.IBoundingBox3f\n): boolean {\n const boundingBoxXMaxValid =\n boundingBox?.xmax != null && Number.isFinite(boundingBox.xmax);\n const boundingBoxXMinValid =\n boundingBox?.xmin != null && Number.isFinite(boundingBox.xmin);\n const boundingBoxYMaxValid =\n boundingBox?.ymax != null && Number.isFinite(boundingBox.ymax);\n const boundingBoxYMinValid =\n boundingBox?.ymin != null && Number.isFinite(boundingBox.ymin);\n const boundingBoxZMaxValid =\n boundingBox?.zmax != null && Number.isFinite(boundingBox.zmax);\n const boundingBoxZMinValid =\n boundingBox?.zmin != null && Number.isFinite(boundingBox.zmin);\n\n return (\n boundingBoxXMaxValid &&\n boundingBoxXMinValid &&\n boundingBoxYMaxValid &&\n boundingBoxYMinValid &&\n boundingBoxZMaxValid &&\n boundingBoxZMinValid\n );\n}\n\nexport function validateCamera(\n camera: vertexvis.protobuf.stream.ICamera\n): boolean {\n // If a perspective camera is provided, verify it is valid\n if (camera.perspective != null) {\n const perspectiveCameraIsValid = validatePerspectiveCamera(\n camera.perspective\n );\n return perspectiveCameraIsValid;\n }\n\n // If an orthographic camera is provided, verify it is valid\n if (camera.orthographic != null) {\n const orthographicCameraIsValid = validateOrthographicCamera(\n camera.orthographic\n );\n return orthographicCameraIsValid;\n }\n\n return false;\n}\n\nexport function validatePerspectiveCamera(\n camera: vertexvis.protobuf.stream.IPerspectiveCamera\n): boolean {\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const positionXValid =\n camera.position?.x != null && Number.isFinite(camera.position.x);\n const positionYValid =\n camera.position?.y != null && Number.isFinite(camera.position.y);\n const positionZValid =\n camera.position?.z != null && Number.isFinite(camera.position.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n positionXValid &&\n positionYValid &&\n positionZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera\n): boolean {\n const fovHeightValid =\n camera.fovHeight != null && Number.isFinite(camera.fovHeight);\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n const viewVectorXValid =\n camera.viewVector?.x != null && Number.isFinite(camera.viewVector.x);\n const viewVectorYValid =\n camera.viewVector?.y != null && Number.isFinite(camera.viewVector.y);\n const viewVectorZValid =\n camera.viewVector?.z != null && Number.isFinite(camera.viewVector.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n fovHeightValid &&\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n viewVectorXValid &&\n viewVectorYValid &&\n viewVectorZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions\n): boolean {\n const heightValid =\n dimensions?.height != null &&\n Number.isFinite(dimensions.height) &&\n dimensions.height > 0;\n const widthValid =\n dimensions?.width != null &&\n Number.isFinite(dimensions.width) &&\n dimensions.width > 0;\n\n return heightValid && widthValid;\n}\n\nexport function validateNumber(number: number): boolean {\n return number != null && Number.isFinite(number);\n}\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint\n): boolean {\n const xValid = point?.x != null && Number.isFinite(point.x);\n const yValid = point?.y != null && Number.isFinite(point.y);\n\n return xValid && yValid;\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f,\n verifyNonZeroLength: boolean\n): boolean {\n const xValid = vector?.x != null && Number.isFinite(vector.x);\n const yValid = vector?.y != null && Number.isFinite(vector.y);\n const zValid = vector?.z != null && Number.isFinite(vector.z);\n\n const vectorComponentsValid = xValid && yValid && zValid;\n\n if (verifyNonZeroLength) {\n if (vector?.x != null && vector?.y != null && vector?.z != null) {\n const vectorMagnitudeSquared =\n vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;\n const vectorHasNonZeroLength = vectorMagnitudeSquared !== 0;\n\n return vectorComponentsValid && vectorHasNonZeroLength;\n } else {\n // If one or more components are undefined, then the vector does not have non-zero length\n return false;\n }\n }\n\n return vectorComponentsValid;\n}\n","import { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\n\nexport type WebSocketSendData =\n | string\n | ArrayBufferLike\n | Blob\n | ArrayBufferView;\n\nexport type MessageHandler = (event: MessageEvent) => void;\n\nexport type CloseHandler = (event: CloseEvent) => void;\n\nexport interface WebSocketClient {\n close(): void;\n connect(descriptor: ConnectionDescriptor): Promise<void>;\n onMessage(handler: MessageHandler): Disposable;\n onClose(handler: CloseHandler): Disposable;\n send(data: WebSocketSendData): void;\n}\n\nexport class WebSocketClientImpl implements WebSocketClient {\n private webSocket?: WebSocket;\n private listeners: Record<UUID.UUID, Disposable> = {};\n\n private onMessageDispatcher = new EventDispatcher<MessageEvent>();\n private onCloseDispatcher = new EventDispatcher<CloseEvent>();\n\n public close(): void {\n if (this.webSocket != null) {\n this.webSocket.close();\n }\n }\n\n public async connect(descriptor: ConnectionDescriptor): Promise<void> {\n const id = UUID.create();\n\n // Ensure that any existing websocket connection has been closed prior\n // to opening a new one to ensure we don't leave open connections.\n if (this.webSocket != null) {\n this.close();\n }\n\n this.webSocket = new WebSocket(descriptor.url, descriptor.protocols);\n this.webSocket.binaryType = 'arraybuffer';\n\n return new Promise((resolve, reject) => {\n if (this.webSocket != null) {\n this.listeners[id] = this.addWebSocketListeners(\n this.webSocket,\n id,\n resolve,\n reject\n );\n }\n });\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n return this.onMessageDispatcher.on(handler);\n }\n\n public onClose(handler: CloseHandler): Disposable {\n return this.onCloseDispatcher.on(handler);\n }\n\n public send(data: WebSocketSendData): void {\n if (this.webSocket != null) {\n this.webSocket.send(data);\n }\n }\n\n private addWebSocketListeners = (\n ws: WebSocket,\n wsId: UUID.UUID,\n resolve: VoidFunction,\n reject: VoidFunction\n ): Disposable => {\n const onOpen = (): void => this.onOpen(resolve);\n const onError = (): void => reject();\n const onClose = (event: CloseEvent): void => this.handleClose(event, wsId);\n\n ws.addEventListener('message', this.handleMessage);\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n\n return {\n dispose: () => {\n ws.removeEventListener('message', this.handleMessage);\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n },\n };\n };\n\n private removeWebSocketListeners(webSocketId: UUID.UUID): void {\n this.listeners[webSocketId]?.dispose();\n }\n\n private handleMessage = (event: MessageEvent): void => {\n this.onMessageDispatcher.emit(event);\n };\n\n private handleClose = (event: CloseEvent, webSocketId: UUID.UUID): void => {\n this.onCloseDispatcher.emit(event);\n this.removeWebSocketListeners(webSocketId);\n };\n\n private onOpen(resolve: VoidFunction): void {\n resolve();\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\nimport { decode, encode } from './encoder';\nimport { StreamRequestError } from './errors';\nimport { appendSettingsToUrl, Settings } from './settings';\nimport { currentDateAsProtoTimestamp } from './time';\nimport {\n BeginInteractionPayload,\n EndInteractionPayload,\n EventMessage,\n GetStencilBufferPayload,\n HitItemsPayload,\n LoadSceneViewStatePayload,\n ReconnectPayload,\n RecordPerformancePayload,\n ReplaceCameraPayload,\n RequestMessage,\n ResponseError,\n ResponseMessage,\n ResponseResult,\n StartStreamPayload,\n SyncTimePayload,\n UpdateCrossSectioningPayload,\n UpdateDimensionsPayload,\n UpdateInteractionPayload,\n UpdateModelViewPayload,\n UpdateStreamPayload,\n} from './types';\nimport {\n validateBoundingBox,\n validateCamera,\n validateDimensions,\n validateNumber,\n validatePoint,\n validateVector,\n} from './validators';\nimport { WebSocketClient, WebSocketClientImpl } from './webSocketClient';\n\nexport type RequestMessageHandler = (msg: RequestMessage) => void;\n\nexport type ResponseMessageHandler = (msg: ResponseMessage) => void;\n\nexport type EventMessageHandler = (msg: EventMessage) => void;\n\nexport type CloseEventHandler = (evt: CloseEvent) => void;\n\nexport interface StreamApiOptions {\n loggingEnabled?: boolean;\n}\n\n/**\n * The API client to interact with Vertex's streaming API.\n */\nexport class StreamApi {\n private onResponseDispatcher = new EventDispatcher<ResponseMessage>();\n private onRequestDispatcher = new EventDispatcher<RequestMessage>();\n private onEventDispatcher = new EventDispatcher<EventMessage>();\n private messageSubscription?: Disposable;\n\n private opts: Required<StreamApiOptions>;\n\n public constructor(\n private websocket: WebSocketClient = new WebSocketClientImpl(),\n opts: StreamApiOptions = {}\n ) {\n this.opts = {\n loggingEnabled: opts.loggingEnabled ?? false,\n };\n }\n\n /**\n * Initiates a websocket connection to Vertex's streaming API. Returns a\n * promise that resolves once the connection is established and can begin\n * accepting messages.\n *\n * @param descriptor A function that returns a description of how to establish\n * a WS connection.\n * @param settings A configuration to use when initializing the WS connection.\n */\n public async connect(\n descriptor: ConnectionDescriptor,\n settings: Settings = {}\n ): Promise<Disposable> {\n const desc = {\n ...descriptor,\n url: appendSettingsToUrl(descriptor.url, settings),\n };\n await this.websocket.connect(desc);\n this.messageSubscription = this.websocket.onMessage((message) => {\n this.handleMessage(message);\n });\n\n return { dispose: () => this.dispose() };\n }\n\n /**\n * Closes any open WS connections and disposes of resources.\n */\n public dispose(): void {\n this.websocket.close();\n this.messageSubscription?.dispose();\n }\n\n /**\n * Adds a callback that is invoked when the client receives a request from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler A handler function.\n */\n public onRequest(handler: RequestMessageHandler): Disposable {\n return this.onRequestDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the client receives an event from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler - A handler function.\n */\n public onEvent(handler: EventMessageHandler): Disposable {\n return this.onEventDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the websocket connection is closed.\n *\n * @param handler A handler function.\n */\n public onClose(handler: CloseEventHandler): Disposable {\n return this.websocket.onClose(handler);\n }\n\n /**\n * Sends a request to initiate a streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public startStream(\n payload: StartStreamPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ startStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to reconnect to an existing streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public async reconnect(\n payload: ReconnectPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ reconnect: payload }, withResponse);\n }\n\n public async updateStream(\n payload: UpdateStreamPayload,\n withResponse = false\n ): Promise<vertexvis.protobuf.stream.IUpdateStreamResult> {\n return this.sendRequest({ updateStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to signal to the rendering pipeline that an interaction has\n * started. The rendering pipeline will use this as a hint to perform more\n * aggressive rendering optimizations at the expense of rendering quality.\n * Call `endInteraction` to signal to the rendering pipeline that an\n * interaction has finished.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param data The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public beginInteraction(\n payload: BeginInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ beginInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public replaceCamera(\n payload: ReplaceCameraPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn(\n 'Invalid camera provided. Canceling replaceCamera operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateCamera: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera as a fly operation\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public flyTo(\n payload: vertexvis.protobuf.stream.IFlyToPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a bounding box is provided, verify it is valid\n if (payload.boundingBox != null) {\n const validBoundingBox = validateBoundingBox(payload.boundingBox);\n\n if (!validBoundingBox) {\n console.warn(\n 'Invalid bounding box provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn('Invalid camera provided. Canceling flyTo operation.');\n return Promise.resolve({});\n }\n }\n\n // If a base camera is provided, verify it is valid\n if (payload.baseCamera != null) {\n const baseCameraIsValid = validateCamera(payload.baseCamera);\n\n if (!baseCameraIsValid) {\n console.warn(\n 'Invalid base camera provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ flyTo: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the specified interaction.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateInteraction(\n payload: UpdateInteractionPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the dimensions of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateDimensions(\n payload: UpdateDimensionsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // Verify the provided dimensions are valid\n if (payload.dimensions != null) {\n const validDimensions = validateDimensions(payload.dimensions);\n\n if (!validDimensions) {\n console.warn(\n 'Invalid dimensions provided. Canceling updateDimensions operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateDimensions: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the cross sectioning planes of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateCrossSectioning(\n payload: UpdateCrossSectioningPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a section plane is provided, verify it is valid\n const invalidSectionPlane = payload.crossSectioning?.sectionPlanes?.some(\n (plane) => {\n const validNormal =\n plane.normal != null && validateVector(plane.normal, true);\n const validOffset =\n plane.offset != null && validateNumber(plane.offset);\n\n return !validNormal || !validOffset;\n }\n );\n\n if (invalidSectionPlane) {\n console.warn(\n 'Invalid cross section plane provided. Canceling updateCrossSectioning operation.'\n );\n return Promise.resolve({});\n }\n\n return this.sendRequest({ updateCrossSectioning: payload }, withResponse);\n }\n\n /**\n * Sends a request to set or clear the model view of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateModelView(\n payload: UpdateModelViewPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateModelView: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform hit detection.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public hitItems(\n payload: HitItemsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a point is provided, verify it is valid\n if (payload.point != null) {\n const validPoint = validatePoint(payload.point);\n\n if (!validPoint) {\n console.warn('Invalid point provided. Canceling hitItems operation.');\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ hitItems: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform an alteration to a scene. Alterations include\n * changing item visibility and changing the materials of items.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public createSceneAlteration(\n payload: vertexvis.protobuf.stream.ICreateSceneAlterationPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ createSceneAlteration: payload }, withResponse);\n }\n\n /**\n * Sends a request to reset all overrides for a given scene and optionally to\n * reset the camera to that of the base scene.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public resetSceneView(\n payload: vertexvis.protobuf.stream.IResetViewPlayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ resetView: payload }, withResponse);\n }\n\n /**\n * Sends a request to tell the rendering pipeline that an interaction has\n * ended.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public endInteraction(\n payload: EndInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IBeginInteractionResult> {\n return this.sendRequest({ endInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to sync the clocks between the client and server.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public syncTime(\n payload: SyncTimePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ syncTime: payload }, withResponse);\n }\n\n /**\n * Sends a request to record performance timings that were measured in the\n * client. The server may use these timings as hints to optimize the rendering\n * performance to provide a better experience.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public recordPerformance(\n payload: RecordPerformancePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ recordPerformance: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the current scene view with the state present\n * in the specified scene view state.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public loadSceneViewState(\n payload: LoadSceneViewStatePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ loadSceneViewState: payload }, withResponse);\n }\n\n /**\n * Sends a request to get a stencil buffer image for the current scene view.\n */\n public getStencilBuffer(\n payload: GetStencilBufferPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ getStencilBuffer: payload }, withResponse);\n }\n\n /**\n * Sends a request to retrieve a new token. This token can be used to\n * authenticate with other Vertex services.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * @returns A promise that completes with the refreshed token.\n */\n public refreshToken(\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ refreshToken: {} }, withResponse);\n }\n\n /**\n * Acknowledges a successful request by sending a reply back to the server\n * with an optional result body.\n *\n * @param reqId The ID of the received request.\n * @param result A result to reply with.\n */\n public replyResult(reqId: string, result: ResponseResult): void {\n this.sendResponse({ requestId: { value: reqId }, ...result });\n }\n\n /**\n * Acknowledges a failed request by sending a reply back to the server.\n *\n * @param reqId The ID of the received request.\n * @param error An error to reply with.\n */\n public replyError(reqId: string, error: ResponseError): void {\n this.sendResponse({ requestId: { value: reqId }, error });\n }\n\n protected handleMessage(message: MessageEvent): void {\n const msg = decode(message.data);\n this.log('WS message received', msg);\n\n if (msg?.sentAtTime != null) {\n if (msg.response != null) {\n this.onResponseDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n response: msg.response,\n });\n }\n\n if (msg.request != null) {\n this.onRequestDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n request: msg.request,\n });\n }\n\n if (msg.event != null) {\n this.onEventDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n event: msg.event,\n });\n }\n }\n }\n\n protected onResponse(handler: ResponseMessageHandler): Disposable {\n return this.onResponseDispatcher.on(handler);\n }\n\n protected log(msg: string, ...other: unknown[]): void {\n if (this.opts.loggingEnabled) {\n console.debug(msg, ...other);\n }\n }\n\n private sendRequest(\n req: vertexvis.protobuf.stream.IStreamRequest,\n withResponse: boolean\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n const sentAtTime = currentDateAsProtoTimestamp();\n if (withResponse) {\n const requestId = UUID.create();\n const request = { ...req, requestId: { value: requestId } };\n\n return new Promise((resolve, reject) => {\n const subscription = this.onResponse((msg) => {\n if (requestId === msg.response.requestId?.value) {\n if (msg.response.error == null) {\n resolve(msg.response);\n } else {\n const { message: summary, details } = msg.response.error;\n reject(\n new StreamRequestError(\n requestId,\n req,\n summary?.value,\n details?.value\n )\n );\n }\n subscription.dispose();\n }\n });\n this.sendMessage({ sentAtTime, request });\n });\n }\n this.sendMessage({ sentAtTime, request: req });\n return Promise.resolve({});\n }\n\n private sendMessage(msg: vertexvis.protobuf.stream.IStreamMessage): void {\n this.websocket.send(encode(msg));\n this.log('WS message sent', msg);\n }\n\n private sendResponse(\n response: vertexvis.protobuf.stream.IStreamResponse\n ): void {\n const sentAtTime = currentDateAsProtoTimestamp();\n this.websocket.send(encode({ sentAtTime, response }));\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n AnimationCompletedEvent,\n EventMessage,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ntype Event = vertexvis.protobuf.stream.IStreamEvent;\n\nfunction event(req: Event, meta?: Metadata): EventMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n event: {\n ...req,\n },\n ...meta,\n };\n}\n\nexport function animationCompleted(id: string): EventMessage {\n const def: AnimationCompletedEvent = {\n animationId: { hex: id },\n };\n return event({\n animationCompleted: {\n ...def,\n },\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n DrawFramePayload,\n GracefulReconnectPayload,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ntype Request = RequestId &\n Payload<Omit<vertexvis.protobuf.stream.IStreamRequest, 'requestId'>>;\n\ninterface Payload<P> {\n payload?: P;\n}\n\ntype DrawFrameRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IDrawFramePayload>;\n\ntype GracefulReconnectRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IGracefulReconnectionPayload>;\n\nfunction request(req: Request, meta?: Metadata): RequestMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n request: {\n requestId: req.requestId != null ? { value: req.requestId } : undefined,\n ...req.payload,\n },\n };\n}\n\nexport function drawFrame(\n req: DrawFrameRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: DrawFramePayload = {\n sequenceNumber: 1,\n sceneAttributes: {\n camera: {\n position: { x: 0, y: 0, z: 1 },\n lookAt: { x: 0, y: 0, z: 0 },\n up: { x: 0, y: 1, z: 0 },\n },\n visibleBoundingBox: {\n xmin: -1,\n ymin: -1,\n zmin: -1,\n xmax: 1,\n ymax: 1,\n zmax: 1,\n },\n crossSectioning: {\n sectionPlanes: [],\n },\n displayListSummary: {\n visibleSummary: {\n count: 100,\n },\n selectedVisibleSummary: {\n count: 0,\n },\n },\n },\n imageAttributes: {\n frameDimensions: { width: 200, height: 150 },\n imageRect: { x: 0, y: 0, width: 200, height: 150 },\n scaleFactor: 1,\n },\n frameCorrelationIds: ['123'],\n image: new Uint8Array(),\n };\n return request(\n {\n requestId: req.requestId,\n payload: { drawFrame: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n\nexport function gracefulReconnect(\n req: GracefulReconnectRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: GracefulReconnectPayload = {\n streamId: { hex: UUID.create() },\n timeToReconnectDuration: { seconds: 1, nanos: 0 },\n };\n return request(\n {\n requestId: req.requestId,\n payload: { gracefulReconnection: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { RefreshTokenResult } from '../..';\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n LoadSceneViewStateResult,\n ReconnectResult,\n ResponseMessage,\n StartStreamResult,\n SyncTimeResult,\n} from '../../types';\n\ntype Metadata = Partial<Pick<ResponseMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ninterface Result<T> {\n result?: T;\n}\n\ntype Response = RequestId &\n Result<Omit<vertexvis.protobuf.stream.IStreamResponse, 'requestId'>>;\n\ntype StartStreamResponse = RequestId &\n Result<vertexvis.protobuf.stream.IStartStreamResult>;\n\ntype SyncTimeResponse = RequestId &\n Result<vertexvis.protobuf.stream.ISyncTimeResult>;\n\ntype ReconnectResponse = RequestId &\n Result<vertexvis.protobuf.stream.IReconnectResult>;\n\ntype LoadSceneViewStateResponse = RequestId &\n Result<vertexvis.protobuf.stream.ILoadSceneViewStateResult>;\n\ntype RefreshTokenResponse = RequestId &\n Result<vertexvis.protobuf.stream.IRefreshTokenResult>;\n\nfunction response(res: Response, meta?: Metadata): ResponseMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n response: {\n requestId: res.requestId != null ? { value: res.requestId } : undefined,\n ...res.result,\n },\n };\n}\n\nexport function startStream(\n res: StartStreamResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: StartStreamResult = {\n streamId: { hex: UUID.create() },\n sceneId: { hex: UUID.create() },\n sceneViewId: { hex: UUID.create() },\n sessionId: { hex: UUID.create() },\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n worldOrientation: {\n front: { x: 0, y: 0, z: 1 },\n up: { x: 0, y: 1, z: 0 },\n },\n };\n return response(\n {\n requestId: res.requestId,\n result: { startStream: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function syncTime(\n res: SyncTimeResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: SyncTimeResult = { replyTime: { seconds: 1, nanos: 0 } };\n return response({\n requestId: res.requestId,\n result: { syncTime: Objects.defaults(res.result, def) },\n });\n}\n\nexport function reconnect(\n res: ReconnectResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: ReconnectResult = {\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { reconnect: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function loadSceneViewState(\n res: LoadSceneViewStateResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: LoadSceneViewStateResult = {};\n return response(\n {\n requestId: res.requestId,\n result: { loadSceneViewState: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function refreshToken(\n res: RefreshTokenResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: RefreshTokenResult = {\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { refreshToken: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n","import { Disposable } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from '../connection';\nimport {\n CloseHandler,\n MessageHandler,\n WebSocketClient,\n WebSocketSendData,\n} from '../webSocketClient';\n\nexport class WebSocketClientMock implements WebSocketClient {\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n }\n\n public connect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n public onClose(handler: CloseHandler): Disposable {\n this.closeHandlers.add(handler);\n return { dispose: () => this.closeHandlers.delete(handler) };\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n this.msgHandlers.add(handler);\n return { dispose: () => this.msgHandlers.delete(handler) };\n }\n\n public send(data: WebSocketSendData): void {\n this.sentMessages.push(data);\n }\n\n public reconnect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Simulates a websocket message that was sent by the server and received by\n * the client.\n *\n * @param data The websocket message data.\n */\n public receiveMessage(data: WebSocketSendData): void {\n this.msgHandlers.forEach((handler) =>\n handler(new MessageEvent('message', { data }))\n );\n }\n\n /**\n * Resets the internal state of the mock by clearing any accrued sent messages\n * and removing all handlers.\n */\n public reset(): void {\n this.sentMessages = [];\n this.msgHandlers.clear();\n this.closeHandlers.clear();\n }\n\n /**\n * Returns `true` if there are remaining sent messages..\n */\n public hasNextSent(): boolean {\n return this.sentMessages.length > 0;\n }\n\n /**\n * Decodes and returns the next message that was sent on this websocket.\n *\n * @example\n *\n * const ws = new WebSocketClientMock();\n * const decoder = str => parseInt(str)\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(decoder); // 1\n * ws.nextSent(decoder); // 2\n *\n * @param decoder A function to decode a message.\n */\n public nextSent<T>(decoder: (data: WebSocketSendData) => T): T;\n\n /**\n * Returns the next message that was sent on this websocket.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(); // \"1\"\n * ws.nextSent(); // \"2\"\n * ```\n */\n public nextSent(): WebSocketSendData;\n public nextSent<T>(\n decoder?: (data: WebSocketSendData) => T\n ): T | WebSocketSendData {\n const next = this.sentMessages.shift();\n if (next != null) {\n if (decoder != null) {\n return decoder(next);\n } else {\n return next;\n }\n } else {\n throw new Error('Sent messages is empty');\n }\n }\n\n /**\n * Skips the next N sent messages.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n * ws.send(\"3\");\n *\n * ws.skipSent(2);\n * ws.nextSent(); // \"3\"\n * ```\n *\n * @param n The number of sent messages to skip over.\n */\n public skipSent(n = 1): this {\n if (n <= this.sentMessages.length) {\n for (let i = 0; i < n; i++) {\n this.nextSent();\n }\n } else {\n throw new Error(\n `Cannot skip the next ${n} messages. Sent message queue only has ${this.sentMessages.length} messages.`\n );\n }\n return this;\n }\n}\n"],"names":["vertexvis","Uri","Objects","google","EventDispatcher","UUID"],"mappings":";;;;;AAEM,SAAU,MAAM,CACpB,OAAiD,EAAA;AAEjD,IAAA,OAAOA,8BAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;AACzE;AAEM,SAAU,MAAM,CACpB,aAAuC,EAAA;AAEvC,IAAA,MAAM,KAAK,GACT,aAAa,YAAY;AACvB,UAAE,IAAI,UAAU,CAAC,aAAa;UAC5B,aAAa;AACnB,IAAA,MAAM,OAAO,GAAGA,8BAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;IACrE,OAAOA,8BAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE;AAC/D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACJ;;ACjBM,MAAO,kBAAmB,SAAQ,KAAK,CAAA;AAC3C,IAAA,WAAA,CACkB,SAAiB,EACjB,cAAwD,EACxD,OAAkC,EAClC,OAAkC,EAAA;QAElD,KAAK,CACH,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG;cAChC,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA;cACjC,uBAAuB,CAC5B;QATe,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,OAAO,GAAP,OAAO;;QASvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC;IAC3D;AACD;;AChBK,SAAU,YAAY,CAC1B,GAAG,WAA+B,EAAA;IAElC,OAAO,CAAC,QAAQ,KAAI;QAClB,OAAO,WAAW,CAAC,MAAM,CACvB,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAClD,EAAE,CACH;AACH,IAAA,CAAC;AACH;AAEM,SAAU,aAAa,CAC3B,KAAa,EACb,IAAO,EAAA;IAEP,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAI;AACpC,QAAA,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE;YAC1B,OAAO,CAAC,GAAG,IAAI,GAAG,KAAK;QACzB;aAAO;AACL,YAAA,OAAO,SAAS;QAClB;AACF,IAAA,CAAC,CAAC;AACJ;AAEM,SAAU,YAAY,CAC1B,KAAa,EACb,IAAO,EAAA;IAEP,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAChC,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,SAAS,CACjD;AACH;AAEM,SAAU,YAAY,CAC1B,KAAa,EACb,IAAO,EAAA;IAEP,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAChC,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,SAAS,CACtC;AACH;AAEA,SAAS,WAAW,CAClB,KAAa,EACb,IAAO,EACP,CAAwC,EAAA;IAExC,OAAO,CAAC,QAAQ,KAAI;QAClB,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/B,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,YAAA,OAAO,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE;QAC3B;aAAO;AACL,YAAA,OAAO,EAAE;QACX;AACF,IAAA,CAAC;AACH;;AC+EM,SAAU,mBAAmB,CAAC,GAAW,EAAE,QAAkB,EAAA;AACjE,IAAA,MAAM,QAAQ,GAAa;;KAE1B;IAED,MAAM,GAAG,GAAGC,SAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IAC1B,MAAM,OAAO,GAAG,YAAY,CAC1B,6BAA6B,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAClE,iCAAiC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAC1E,gCAAgC,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CACzE;AACD,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;AAChC,IAAA,OAAOA,SAAG,CAAC,QAAQ,CAACA,SAAG,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtD;AAEA,SAAS,6BAA6B,CACpC,QAA2C,EAAA;IAE3C,OAAO,cAAc,CACnB,CAAC,CAAC,KAAK,CAAC,CAAC,0BAA0B,EACnC,QAAQ,EACR,YAAY,CACV,aAAa,CAAC,mCAAmC,EAAE,qBAAqB,CAAC,EACzE,YAAY,CACV,sCAAsC,EACtC,qBAAqB,CACtB,EACD,YAAY,CAAC,iCAAiC,EAAE,gBAAgB,CAAC,EACjE,YAAY,CAAC,wBAAwB,EAAE,SAAS,CAAC,EACjD,YAAY,CACV,wCAAwC,EACxC,uBAAuB,CACxB,CACF,CACF;AACH;AAEA,SAAS,iCAAiC,CACxC,QAA+C,EAAA;AAE/C,IAAA,OAAO,cAAc,CACnB,CAAC,CAAC,KAAK,CAAC,CAAC,8BAA8B,EACvC,QAAQ,EACR,YAAY,CACV,aAAa,CAAC,4BAA4B,EAAE,SAAS,CAAC,EACtD,YAAY,CAAC,2BAA2B,EAAE,QAAQ,CAAC,EACnD,YAAY,CAAC,qCAAqC,EAAE,gBAAgB,CAAC,EACrE,YAAY,CAAC,qCAAqC,EAAE,gBAAgB,CAAC,EACrE,YAAY,CAAC,oCAAoC,EAAE,eAAe,CAAC,EACnE,YAAY,CAAC,oCAAoC,EAAE,eAAe,CAAC,EACnE,YAAY,CAAC,gCAAgC,EAAE,YAAY,CAAC,CAC7D,CACF;AACH;AAEA,SAAS,gCAAgC,CACvC,QAA8C,EAAA;IAE9C,OAAO,cAAc,CACnB,CAAC,CAAC,KAAK,CAAC,CAAC,6BAA6B,EACtC,QAAQ,EACR,YAAY,CAAC,YAAY,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC,CACrE;AACH;AAEA,SAAS,cAAc,CACrB,MAAsC,EACtC,QAAuB,EACvB,OAAyB,EAAA;IAEzB,OAAO,CAAC,QAAQ,KAAI;AAClB,QAAA,MAAM,MAAM,GAAGC,aAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC;AACjE,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,IAAA,CAAC;AACH;;ACvMA;;;;;AAKG;AACG,SAAU,gBAAgB,CAAC,IAAU,EAAA;AACzC,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;AAC7B,IAAA,OAAOC,2BAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACnE;AAEA;;AAEG;SACa,2BAA2B,GAAA;AACzC,IAAA,OAAO,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC;AACrC;AAsBM,SAAU,eAAe,CAAC,GAAG,IAAe,EAAA;AAChD,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAS;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAS;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;AAC9C,QAAA,OAAOA,2BAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClE;AAAO,SAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAW;AAChC,QAAA,OAAOA,2BAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClE;SAAO;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;IACzE;AACF;AAUM,SAAU,WAAW,CACzB,IAA2D,EAAA;AAE3D,IAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;QAC9C,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AAC3E,QAAA,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;IACxD;AACF;AACA;AAEA,SAAS,gBAAgB,CAAC,MAAc,EAAA;AACtC,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACnD,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,IAAI,IAAI,OAAO;IACvC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE;AAC5D;;ACpFM,SAAU,mBAAmB,CACjC,WAAmD,EAAA;IAEnD,MAAM,oBAAoB,GACxB,CAAA,WAAW,aAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,IAAI,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;IAChE,MAAM,oBAAoB,GACxB,CAAA,WAAW,aAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,IAAI,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;IAChE,MAAM,oBAAoB,GACxB,CAAA,WAAW,aAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,IAAI,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;IAChE,MAAM,oBAAoB,GACxB,CAAA,WAAW,aAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,IAAI,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;IAChE,MAAM,oBAAoB,GACxB,CAAA,WAAW,aAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,IAAI,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;IAChE,MAAM,oBAAoB,GACxB,CAAA,WAAW,aAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,IAAI,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;AAEhE,IAAA,QACE,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;AACpB,QAAA,oBAAoB;AAExB;AAEM,SAAU,cAAc,CAC5B,MAAyC,EAAA;;AAGzC,IAAA,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,EAAE;QAC9B,MAAM,wBAAwB,GAAG,yBAAyB,CACxD,MAAM,CAAC,WAAW,CACnB;AACD,QAAA,OAAO,wBAAwB;IACjC;;AAGA,IAAA,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE;QAC/B,MAAM,yBAAyB,GAAG,0BAA0B,CAC1D,MAAM,CAAC,YAAY,CACpB;AACD,QAAA,OAAO,yBAAyB;IAClC;AAEA,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,yBAAyB,CACvC,MAAoD,EAAA;;IAEpD,MAAM,YAAY,GAChB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAChB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAChB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,cAAc,GAClB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,cAAc,GAClB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,cAAc,GAClB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;;IAGrE,MAAM,aAAa,GAAG,cAAc,CAClC,EAAE,CAAC,EAAE,MAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,EAAE,CAAC,EAAE,CAAA,EAAA,GAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,EAAE,CAAC,EAAE,CAAA,EAAA,GAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,EAClD,CACL;AAED,IAAA,QACE,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,cAAc;QACd,cAAc;QACd,cAAc;QACd,QAAQ;QACR,QAAQ;QACR,QAAQ;AACR,QAAA,aAAa;AAEjB;AAEM,SAAU,0BAA0B,CACxC,MAAqD,EAAA;;AAErD,IAAA,MAAM,cAAc,GAClB,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/D,MAAM,YAAY,GAChB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAChB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,YAAY,GAChB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,gBAAgB,GACpB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACtE,MAAM,gBAAgB,GACpB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACtE,MAAM,gBAAgB,GACpB,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;;IAGtE,MAAM,aAAa,GAAG,cAAc,CAClC,EAAE,CAAC,EAAE,MAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,EAAE,CAAC,EAAE,CAAA,EAAA,GAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,EAAE,CAAC,EAAE,CAAA,EAAA,GAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,CAAC,EAClD,CACL;AAED,IAAA,QACE,cAAc;QACd,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,gBAAgB;QAChB,gBAAgB;QAChB,gBAAgB;QAChB,QAAQ;QACR,QAAQ;QACR,QAAQ;AACR,QAAA,aAAa;AAEjB;AAEM,SAAU,kBAAkB,CAChC,UAAiD,EAAA;IAEjD,MAAM,WAAW,GACf,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAA,MAAA,GAAV,UAAU,CAAE,MAAM,KAAI,IAAI;AAC1B,QAAA,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;AAClC,QAAA,UAAU,CAAC,MAAM,GAAG,CAAC;IACvB,MAAM,UAAU,GACd,CAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAA,MAAA,GAAV,UAAU,CAAE,KAAK,KAAI,IAAI;AACzB,QAAA,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;AACjC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC;IAEtB,OAAO,WAAW,IAAI,UAAU;AAClC;AAEM,SAAU,cAAc,CAAC,MAAc,EAAA;IAC3C,OAAO,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAClD;AAEM,SAAU,aAAa,CAC3B,KAAuC,EAAA;IAEvC,MAAM,MAAM,GAAG,CAAA,KAAK,aAAL,KAAK,KAAA,MAAA,GAAA,MAAA,GAAL,KAAK,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,CAAA,KAAK,aAAL,KAAK,KAAA,MAAA,GAAA,MAAA,GAAL,KAAK,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3D,OAAO,MAAM,IAAI,MAAM;AACzB;AAEM,SAAU,cAAc,CAC5B,MAAyC,EACzC,mBAA4B,EAAA;IAE5B,MAAM,MAAM,GAAG,CAAA,MAAM,aAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,CAAA,MAAM,aAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,CAAA,MAAM,aAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,CAAC,KAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAE7D,IAAA,MAAM,qBAAqB,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM;IAE/B;AACvB,QAAA,IAAI,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,uBAAN,MAAM,CAAE,CAAC,KAAI,IAAI,IAAI,CAAA,MAAM,aAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,CAAC,KAAI,IAAI,IAAI,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,CAAC,KAAI,IAAI,EAAE;YAC/D,MAAM,sBAAsB,GAC1B,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AACjE,YAAA,MAAM,sBAAsB,GAAG,sBAAsB,KAAK,CAAC;YAE3D,OAAO,qBAAqB,IAAI,sBAAsB;QACxD;aAAO;;AAEL,YAAA,OAAO,KAAK;QACd;IACF;AAGF;;MCjKa,mBAAmB,CAAA;AAAhC,IAAA,WAAA,GAAA;QAEU,IAAA,CAAA,SAAS,GAAkC,EAAE;AAE7C,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAIC,qBAAe,EAAgB;AACzD,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAIA,qBAAe,EAAc;QA8CrD,IAAA,CAAA,qBAAqB,GAAG,CAC9B,EAAa,EACb,IAAe,EACf,OAAqB,EACrB,MAAoB,KACN;YACd,MAAM,MAAM,GAAG,MAAY,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAC/C,YAAA,MAAM,OAAO,GAAG,MAAY,MAAM,EAAE;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,KAAiB,KAAW,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;YAE1E,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;AAClD,YAAA,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;AACnC,YAAA,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;AACrC,YAAA,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;YAErC,OAAO;gBACL,OAAO,EAAE,MAAK;oBACZ,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;AACrD,oBAAA,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;AACtC,oBAAA,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;AACxC,oBAAA,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC1C,CAAC;aACF;AACH,QAAA,CAAC;AAMO,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAmB,KAAU;AACpD,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;AACtC,QAAA,CAAC;AAEO,QAAA,IAAA,CAAA,WAAW,GAAG,CAAC,KAAiB,EAAE,WAAsB,KAAU;AACxE,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,YAAA,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC;AAC5C,QAAA,CAAC;IAKH;IArFS,KAAK,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QACxB;IACF;IAEO,MAAM,OAAO,CAAC,UAAgC,EAAA;AACnD,QAAA,MAAM,EAAE,GAAGC,UAAI,CAAC,MAAM,EAAE;;;AAIxB,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;YAC1B,IAAI,CAAC,KAAK,EAAE;QACd;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC;AACpE,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,aAAa;QAEzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;gBAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAC7C,IAAI,CAAC,SAAS,EACd,EAAE,EACF,OAAO,EACP,MAAM,CACP;YACH;AACF,QAAA,CAAC,CAAC;IACJ;AAEO,IAAA,SAAS,CAAC,OAAuB,EAAA;QACtC,OAAO,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC;IAC7C;AAEO,IAAA,OAAO,CAAC,OAAqB,EAAA;QAClC,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC;IAC3C;AAEO,IAAA,IAAI,CAAC,IAAuB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B;IACF;AA2BQ,IAAA,wBAAwB,CAAC,WAAsB,EAAA;;QACrD,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,EAAE;IACxC;AAWQ,IAAA,MAAM,CAAC,OAAqB,EAAA;AAClC,QAAA,OAAO,EAAE;IACX;AACD;;AC9DD;;AAEG;MACU,SAAS,CAAA;AAQpB,IAAA,WAAA,CACU,YAA6B,IAAI,mBAAmB,EAAE,EAC9D,OAAyB,EAAE,EAAA;;QADnB,IAAA,CAAA,SAAS,GAAT,SAAS;AARX,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAID,qBAAe,EAAmB;AAC7D,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAIA,qBAAe,EAAkB;AAC3D,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAIA,qBAAe,EAAgB;QAS7D,IAAI,CAAC,IAAI,GAAG;AACV,YAAA,cAAc,EAAE,CAAA,EAAA,GAAA,IAAI,CAAC,cAAc,mCAAI,KAAK;SAC7C;IACH;AAEA;;;;;;;;AAQG;AACI,IAAA,MAAM,OAAO,CAClB,UAAgC,EAChC,WAAqB,EAAE,EAAA;AAEvB,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,GAAG,UAAU;YACb,GAAG,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACnD;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,KAAI;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7B,QAAA,CAAC,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE;IAC1C;AAEA;;AAEG;IACI,OAAO,GAAA;;AACZ,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,QAAA,CAAA,EAAA,GAAA,IAAI,CAAC,mBAAmB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,EAAE;IACrC;AAEA;;;;;AAKG;AACI,IAAA,SAAS,CAAC,OAA8B,EAAA;QAC7C,OAAO,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC;IAC7C;AAEA;;;;;AAKG;AACI,IAAA,OAAO,CAAC,OAA4B,EAAA;QACzC,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC;IAC3C;AAEA;;;;AAIG;AACI,IAAA,OAAO,CAAC,OAA0B,EAAA;QACvC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;IACxC;AAEA;;;;;;;;;;;;;;;AAeG;AACI,IAAA,WAAW,CAChB,OAA2B,EAC3B,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACjE;AAEA;;;;;;;;;;;;;;;AAeG;AACI,IAAA,MAAM,SAAS,CACpB,OAAyB,EACzB,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC/D;AAEO,IAAA,MAAM,YAAY,CACvB,OAA4B,EAC5B,YAAY,GAAG,KAAK,EAAA;AAEpB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAClE;AAEA;;;;;;;;;;;;;;AAcG;AACI,IAAA,gBAAgB,CACrB,OAAA,GAAmC,EAAE,EACrC,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACtE;AAEA;;;;;;;;;;;;;;;AAeG;AACI,IAAA,aAAa,CAClB,OAA6B,EAC7B,YAAY,GAAG,IAAI,EAAA;;AAGnB,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE;YAC1B,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;YAEpD,IAAI,CAAC,aAAa,EAAE;AAClB,gBAAA,OAAO,CAAC,IAAI,CACV,6DAA6D,CAC9D;AACD,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B;QACF;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAClE;AAEA;;;;;;;;;;;;;;AAcG;AACI,IAAA,KAAK,CACV,OAAgD,EAChD,YAAY,GAAG,IAAI,EAAA;;AAGnB,QAAA,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE;YAC/B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC;YAEjE,IAAI,CAAC,gBAAgB,EAAE;AACrB,gBAAA,OAAO,CAAC,IAAI,CACV,2DAA2D,CAC5D;AACD,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B;QACF;;AAGA,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE;YAC1B,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;YAEpD,IAAI,CAAC,aAAa,EAAE;AAClB,gBAAA,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC;AACnE,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B;QACF;;AAGA,QAAA,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,EAAE;YAC9B,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC;YAE5D,IAAI,CAAC,iBAAiB,EAAE;AACtB,gBAAA,OAAO,CAAC,IAAI,CACV,0DAA0D,CAC3D;AACD,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B;QACF;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC3D;AAEA;;;;;;;;;;AAUG;AACI,IAAA,iBAAiB,CACtB,OAAiC,EACjC,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACvE;AAEA;;;;;;;;;;;;;;;AAeG;AACI,IAAA,gBAAgB,CACrB,OAAgC,EAChC,YAAY,GAAG,IAAI,EAAA;;AAGnB,QAAA,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,EAAE;YAC9B,MAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC;YAE9D,IAAI,CAAC,eAAe,EAAE;AACpB,gBAAA,OAAO,CAAC,IAAI,CACV,oEAAoE,CACrE;AACD,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B;QACF;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACtE;AAEA;;;;;;;;;;;;;;;AAeG;AACI,IAAA,qBAAqB,CAC1B,OAAqC,EACrC,YAAY,GAAG,IAAI,EAAA;;;AAGnB,QAAA,MAAM,mBAAmB,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAO,CAAC,eAAe,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,aAAa,0CAAE,IAAI,CACtE,CAAC,KAAK,KAAI;AACR,YAAA,MAAM,WAAW,GACf,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,MAAY,CAAC;AAC5D,YAAA,MAAM,WAAW,GACf,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;AAEtD,YAAA,OAAO,CAAC,WAAW,IAAI,CAAC,WAAW;AACrC,QAAA,CAAC,CACF;QAED,IAAI,mBAAmB,EAAE;AACvB,YAAA,OAAO,CAAC,IAAI,CACV,kFAAkF,CACnF;AACD,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,qBAAqB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC3E;AAEA;;;;;;;;;;;;;;;AAeG;AACI,IAAA,eAAe,CACpB,OAA+B,EAC/B,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACrE;AAEA;;;;;;;;;;AAUG;AACI,IAAA,QAAQ,CACb,OAAwB,EACxB,YAAY,GAAG,IAAI,EAAA;;AAGnB,QAAA,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE;YACzB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;YAE/C,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC;AACrE,gBAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B;QACF;AAEA,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC9D;AAEA;;;;;;;;;;;AAWG;AACI,IAAA,qBAAqB,CAC1B,OAAgE,EAChE,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,qBAAqB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC3E;AAEA;;;;;;;;;;;AAWG;AACI,IAAA,cAAc,CACnB,OAAqD,EACrD,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC/D;AAEA;;;;;;;;;;AAUG;AACI,IAAA,cAAc,CACnB,OAAA,GAAiC,EAAE,EACnC,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACpE;AAEA;;;;;;;;;;AAUG;AACI,IAAA,QAAQ,CACb,OAAwB,EACxB,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC9D;AAEA;;;;;;;;;;;;AAYG;AACI,IAAA,iBAAiB,CACtB,OAAiC,EACjC,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACvE;AAEA;;;;;;;;;;AAUG;AACI,IAAA,kBAAkB,CACvB,OAAkC,EAClC,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACxE;AAEA;;AAEG;AACI,IAAA,gBAAgB,CACrB,OAAgC,EAChC,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IACtE;AAEA;;;;;;AAMG;IACI,YAAY,CACjB,YAAY,GAAG,IAAI,EAAA;AAEnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC;IAC7D;AAEA;;;;;;AAMG;IACI,WAAW,CAAC,KAAa,EAAE,MAAsB,EAAA;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/D;AAEA;;;;;AAKG;IACI,UAAU,CAAC,KAAa,EAAE,KAAoB,EAAA;AACnD,QAAA,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;IAC3D;AAEU,IAAA,aAAa,CAAC,OAAqB,EAAA;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC;QAEpC,IAAI,CAAA,GAAG,KAAA,IAAA,IAAH,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAE,UAAU,KAAI,IAAI,EAAE;AAC3B,YAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE;AACxB,gBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;oBAC7B,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;AACvB,iBAAA,CAAC;YACJ;AAEA,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE;AACvB,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;oBAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;AACrB,iBAAA,CAAC;YACJ;AAEA,YAAA,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE;AACrB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;oBAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;AACjB,iBAAA,CAAC;YACJ;QACF;IACF;AAEU,IAAA,UAAU,CAAC,OAA+B,EAAA;QAClD,OAAO,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,OAAO,CAAC;IAC9C;AAEU,IAAA,GAAG,CAAC,GAAW,EAAE,GAAG,KAAgB,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAC9B;IACF;IAEQ,WAAW,CACjB,GAA6C,EAC7C,YAAqB,EAAA;AAErB,QAAA,MAAM,UAAU,GAAG,2BAA2B,EAAE;QAChD,IAAI,YAAY,EAAE;AAChB,YAAA,MAAM,SAAS,GAAGC,UAAI,CAAC,MAAM,EAAE;AAC/B,YAAA,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAE3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;gBACrC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,KAAI;;AAC3C,oBAAA,IAAI,SAAS,MAAK,CAAA,EAAA,GAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,CAAA,EAAE;wBAC/C,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,EAAE;AAC9B,4BAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;wBACvB;6BAAO;AACL,4BAAA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK;4BACxD,MAAM,CACJ,IAAI,kBAAkB,CACpB,SAAS,EACT,GAAG,EACH,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,KAAK,EACd,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,KAAK,CACf,CACF;wBACH;wBACA,YAAY,CAAC,OAAO,EAAE;oBACxB;AACF,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC3C,YAAA,CAAC,CAAC;QACJ;QACA,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC9C,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5B;AAEQ,IAAA,WAAW,CAAC,GAA6C,EAAA;QAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC;IAClC;AAEQ,IAAA,YAAY,CAClB,QAAmD,EAAA;AAEnD,QAAA,MAAM,UAAU,GAAG,2BAA2B,EAAE;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD;AACD;;ACjqBD,SAAS,KAAK,CAAC,GAAU,EAAE,IAAe,EAAA;IACxC,OAAO;QACL,UAAU,EAAE,2BAA2B,EAAE;AACzC,QAAA,KAAK,EAAE;AACL,YAAA,GAAG,GAAG;AACP,SAAA;AACD,QAAA,GAAG,IAAI;KACR;AACH;AAEM,SAAU,kBAAkB,CAAC,EAAU,EAAA;AAC3C,IAAA,MAAM,GAAG,GAA4B;AACnC,QAAA,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;KACzB;AACD,IAAA,OAAO,KAAK,CAAC;AACX,QAAA,kBAAkB,EAAE;AAClB,YAAA,GAAG,GAAG;AACP,SAAA;AACF,KAAA,CAAC;AACJ;;;;;;;ACHA,SAAS,OAAO,CAAC,GAAY,EAAE,IAAe,EAAA;IAC5C,OAAO;QACL,UAAU,EAAE,2BAA2B,EAAE;AACzC,QAAA,GAAG,IAAI;AACP,QAAA,OAAO,EAAE;AACP,YAAA,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,SAAS;YACvE,GAAG,GAAG,CAAC,OAAO;AACf,SAAA;KACF;AACH;SAEgB,SAAS,CACvB,GAAA,GAAwB,EAAE,EAC1B,IAAe,EAAA;AAEf,IAAA,MAAM,GAAG,GAAqB;AAC5B,QAAA,cAAc,EAAE,CAAC;AACjB,QAAA,eAAe,EAAE;AACf,YAAA,MAAM,EAAE;AACN,gBAAA,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC9B,gBAAA,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC5B,gBAAA,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACzB,aAAA;AACD,YAAA,kBAAkB,EAAE;gBAClB,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,EAAE;AACR,gBAAA,IAAI,EAAE,CAAC;AACP,gBAAA,IAAI,EAAE,CAAC;AACP,gBAAA,IAAI,EAAE,CAAC;AACR,aAAA;AACD,YAAA,eAAe,EAAE;AACf,gBAAA,aAAa,EAAE,EAAE;AAClB,aAAA;AACD,YAAA,kBAAkB,EAAE;AAClB,gBAAA,cAAc,EAAE;AACd,oBAAA,KAAK,EAAE,GAAG;AACX,iBAAA;AACD,gBAAA,sBAAsB,EAAE;AACtB,oBAAA,KAAK,EAAE,CAAC;AACT,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,eAAe,EAAE;YACf,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;AAC5C,YAAA,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;AAClD,YAAA,WAAW,EAAE,CAAC;AACf,SAAA;QACD,mBAAmB,EAAE,CAAC,KAAK,CAAC;QAC5B,KAAK,EAAE,IAAI,UAAU,EAAE;KACxB;AACD,IAAA,OAAO,OAAO,CACZ;QACE,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,QAAA,OAAO,EAAE,EAAE,SAAS,EAAEH,aAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;KAC3D,EACD,IAAI,CACL;AACH;SAEgB,iBAAiB,CAC/B,GAAA,GAAgC,EAAE,EAClC,IAAe,EAAA;AAEf,IAAA,MAAM,GAAG,GAA6B;QACpC,QAAQ,EAAE,EAAE,GAAG,EAAEG,UAAI,CAAC,MAAM,EAAE,EAAE;QAChC,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KAClD;AACD,IAAA,OAAO,OAAO,CACZ;QACE,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,QAAA,OAAO,EAAE,EAAE,oBAAoB,EAAEH,aAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;KACtE,EACD,IAAI,CACL;AACH;;;;;;;;AC/DA,SAAS,QAAQ,CAAC,GAAa,EAAE,IAAe,EAAA;IAC9C,OAAO;QACL,UAAU,EAAE,2BAA2B,EAAE;AACzC,QAAA,GAAG,IAAI;AACP,QAAA,QAAQ,EAAE;AACR,YAAA,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,SAAS;YACvE,GAAG,GAAG,CAAC,MAAM;AACd,SAAA;KACF;AACH;SAEgB,WAAW,CACzB,GAAA,GAA2B,EAAE,EAC7B,IAAe,EAAA;AAEf,IAAA,MAAM,GAAG,GAAsB;QAC7B,QAAQ,EAAE,EAAE,GAAG,EAAEG,UAAI,CAAC,MAAM,EAAE,EAAE;QAChC,OAAO,EAAE,EAAE,GAAG,EAAEA,UAAI,CAAC,MAAM,EAAE,EAAE;QAC/B,WAAW,EAAE,EAAE,GAAG,EAAEA,UAAI,CAAC,MAAM,EAAE,EAAE;QACnC,SAAS,EAAE,EAAE,GAAG,EAAEA,UAAI,CAAC,MAAM,EAAE,EAAE;AACjC,QAAA,GAAG,EAAE,KAAK;AACV,QAAA,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE;AAClE,QAAA,gBAAgB,EAAE;AAChB,YAAA,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC3B,YAAA,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACzB,SAAA;KACF;AACD,IAAA,OAAO,QAAQ,CACb;QACE,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,QAAA,MAAM,EAAE,EAAE,WAAW,EAAEH,aAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;KAC3D,EACD,IAAI,CACL;AACH;SAEgB,QAAQ,CACtB,GAAA,GAAwB,EAAE,EAC1B,IAAe,EAAA;AAEf,IAAA,MAAM,GAAG,GAAmB,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;AACnE,IAAA,OAAO,QAAQ,CAAC;QACd,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,QAAA,MAAM,EAAE,EAAE,QAAQ,EAAEA,aAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AACxD,KAAA,CAAC;AACJ;SAEgB,SAAS,CACvB,GAAA,GAAyB,EAAE,EAC3B,IAAe,EAAA;AAEf,IAAA,MAAM,GAAG,GAAoB;AAC3B,QAAA,GAAG,EAAE,KAAK;AACV,QAAA,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE;KACnE;AACD,IAAA,OAAO,QAAQ,CACb;QACE,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,QAAA,MAAM,EAAE,EAAE,SAAS,EAAEA,aAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;KACzD,EACD,IAAI,CACL;AACH;SAEgB,kBAAkB,CAChC,GAAA,GAAkC,EAAE,EACpC,IAAe,EAAA;IAEf,MAAM,GAAG,GAA6B,EAAE;AACxC,IAAA,OAAO,QAAQ,CACb;QACE,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,QAAA,MAAM,EAAE,EAAE,kBAAkB,EAAEA,aAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;KAClE,EACD,IAAI,CACL;AACH;SAEgB,YAAY,CAC1B,GAAA,GAA4B,EAAE,EAC9B,IAAe,EAAA;AAEf,IAAA,MAAM,GAAG,GAAuB;AAC9B,QAAA,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE;KACnE;AACD,IAAA,OAAO,QAAQ,CACb;QACE,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,QAAA,MAAM,EAAE,EAAE,YAAY,EAAEA,aAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;KAC5D,EACD,IAAI,CACL;AACH;;;;;;;;;;;;;;;;;;MC3Ha,mBAAmB,CAAA;AAAhC,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAgB;AACvC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAkB;AACvC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,KAAK,EAAqB;IAmIvD;IAjIS,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E;AAEO,IAAA,OAAO,CAAC,UAAgC,EAAA;AAC7C,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;IAC1B;AAEO,IAAA,OAAO,CAAC,OAAqB,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/B,QAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;IAC9D;AAEO,IAAA,SAAS,CAAC,OAAuB,EAAA;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7B,QAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;IAC5D;AAEO,IAAA,IAAI,CAAC,IAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEO,IAAA,SAAS,CAAC,UAAgC,EAAA;AAC/C,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;IAC1B;AAEA;;;;;AAKG;AACI,IAAA,cAAc,CAAC,IAAuB,EAAA;QAC3C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,KAC/B,OAAO,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAC/C;IACH;AAEA;;;AAGG;IACI,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;IAC5B;AAEA;;AAEG;IACI,WAAW,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IACrC;AAiCO,IAAA,QAAQ,CACb,OAAwC,EAAA;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACtC,QAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAChB,YAAA,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,gBAAA,OAAO,OAAO,CAAC,IAAI,CAAC;YACtB;iBAAO;AACL,gBAAA,OAAO,IAAI;YACb;QACF;aAAO;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;QAC3C;IACF;AAEA;;;;;;;;;;;;;;;AAeG;IACI,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAA;QACnB,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACjC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,IAAI,CAAC,QAAQ,EAAE;YACjB;QACF;aAAO;AACL,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,qBAAA,EAAwB,CAAC,CAAA,uCAAA,EAA0C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA,UAAA,CAAY,CACxG;QACH;AACA,QAAA,OAAO,IAAI;IACb;AACD;;;;;;;;;;;;;;;"}
package/dist/bundle.js CHANGED
@@ -169,7 +169,7 @@ function validatePerspectiveCamera(camera) {
169
169
  const upYValid = ((_h = camera.up) === null || _h === void 0 ? void 0 : _h.y) != null && Number.isFinite(camera.up.y);
170
170
  const upZValid = ((_j = camera.up) === null || _j === void 0 ? void 0 : _j.z) != null && Number.isFinite(camera.up.z);
171
171
  // Validate up vector has non-zero length
172
- const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z }, true);
172
+ const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z });
173
173
  return (lookAtXValid &&
174
174
  lookAtYValid &&
175
175
  lookAtZValid &&
@@ -194,7 +194,7 @@ function validateOrthographicCamera(camera) {
194
194
  const viewVectorYValid = ((_h = camera.viewVector) === null || _h === void 0 ? void 0 : _h.y) != null && Number.isFinite(camera.viewVector.y);
195
195
  const viewVectorZValid = ((_j = camera.viewVector) === null || _j === void 0 ? void 0 : _j.z) != null && Number.isFinite(camera.viewVector.z);
196
196
  // Validate up vector has non-zero length
197
- const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z }, true);
197
+ const upVectorValid = validateVector({ x: (_k = camera === null || camera === void 0 ? void 0 : camera.up) === null || _k === void 0 ? void 0 : _k.x, y: (_l = camera === null || camera === void 0 ? void 0 : camera.up) === null || _l === void 0 ? void 0 : _l.y, z: (_m = camera === null || camera === void 0 ? void 0 : camera.up) === null || _m === void 0 ? void 0 : _m.z });
198
198
  return (fovHeightValid &&
199
199
  lookAtXValid &&
200
200
  lookAtYValid &&
@@ -229,7 +229,7 @@ function validateVector(vector, verifyNonZeroLength) {
229
229
  const yValid = (vector === null || vector === void 0 ? void 0 : vector.y) != null && Number.isFinite(vector.y);
230
230
  const zValid = (vector === null || vector === void 0 ? void 0 : vector.z) != null && Number.isFinite(vector.z);
231
231
  const vectorComponentsValid = xValid && yValid && zValid;
232
- if (verifyNonZeroLength) {
232
+ {
233
233
  if ((vector === null || vector === void 0 ? void 0 : vector.x) != null && (vector === null || vector === void 0 ? void 0 : vector.y) != null && (vector === null || vector === void 0 ? void 0 : vector.z) != null) {
234
234
  const vectorMagnitudeSquared = vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
235
235
  const vectorHasNonZeroLength = vectorMagnitudeSquared !== 0;
@@ -240,7 +240,6 @@ function validateVector(vector, verifyNonZeroLength) {
240
240
  return false;
241
241
  }
242
242
  }
243
- return vectorComponentsValid;
244
243
  }
245
244
 
246
245
  class WebSocketClientImpl {
@@ -570,7 +569,7 @@ class StreamApi {
570
569
  var _a, _b;
571
570
  // If a section plane is provided, verify it is valid
572
571
  const invalidSectionPlane = (_b = (_a = payload.crossSectioning) === null || _a === void 0 ? void 0 : _a.sectionPlanes) === null || _b === void 0 ? void 0 : _b.some((plane) => {
573
- const validNormal = plane.normal != null && validateVector(plane.normal, true);
572
+ const validNormal = plane.normal != null && validateVector(plane.normal);
574
573
  const validOffset = plane.offset != null && validateNumber(plane.offset);
575
574
  return !validNormal || !validOffset;
576
575
  });
@@ -969,11 +968,11 @@ function refreshToken(res = {}, meta) {
969
968
 
970
969
  var responses = /*#__PURE__*/Object.freeze({
971
970
  __proto__: null,
972
- startStream: startStream,
973
- syncTime: syncTime,
974
- reconnect: reconnect,
975
971
  loadSceneViewState: loadSceneViewState,
976
- refreshToken: refreshToken
972
+ reconnect: reconnect,
973
+ refreshToken: refreshToken,
974
+ startStream: startStream,
975
+ syncTime: syncTime
977
976
  });
978
977
 
979
978
  var index = /*#__PURE__*/Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed'\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: ParamsBuilder<S>[]\n): ParamsBuilder<S> {\n return (settings) => {\n return definitions.reduce(\n (result, def) => ({ ...result, ...def(settings) }),\n {}\n );\n };\n}\n\nexport function defineBoolean<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) => {\n if (typeof v === 'boolean') {\n return v ? 'on' : 'off';\n } else {\n return undefined;\n }\n });\n}\n\nexport function defineNumber<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'number' ? v.toString() : undefined\n );\n}\n\nexport function defineString<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'string' ? v : undefined\n );\n}\n\nfunction defineValue<S, P extends keyof S = keyof S>(\n param: string,\n prop: P,\n f: (prop: unknown) => string | undefined\n): ParamsBuilder<S> {\n return (settings) => {\n const value = f(settings[prop]);\n if (value != null) {\n return { [param]: value };\n } else {\n return {};\n }\n };\n}\n","import { Objects, Uri } from '@vertexvis/utils';\n\nimport {\n defineBoolean,\n defineNumber,\n defineParams,\n defineString,\n ParamsBuilder,\n} from './paramsBuilder';\n\n/**\n * Settings to configure the delivery of images over the websocket connection.\n */\nexport interface FrameDeliverySettings {\n /**\n * Indicates if the rate limiting of frame delivery is enabled based on\n * detected internet throughput.\n */\n rateLimitingEnabled?: boolean;\n\n /**\n * Enables rate limiting when the variation coefficient of frame latencies\n * exceeds this threshold. The variation coefficient is defined by the\n * standard deviation of latencies over the average of recorded latencies.\n *\n * Lower numbers will increase the aggressiveness of packet loss detection,\n * but may trigger unexpected delivery rate limiting.\n */\n packetLossThreshold?: number;\n\n /**\n * The maximum number of latencies to record. Higher numbers could result in\n * more delay before packet loss is detected. Lower numbers could result in\n * packet loss not being detected.\n */\n historyMaxSize?: number;\n\n /**\n * The duration at which point a frame will be considered failed if the server\n * has not received an acknowledgement.\n */\n timeout?: string;\n\n /**\n * Enables rate limiting when the number of frames that failed to receive an\n * acknowledgement within the timeout window exceeds this ratio.\n */\n timeoutRatioThreshold?: number;\n}\n\n/**\n * Settings to configure the adaptive rendering of images. If enabled, the\n * performance of delivering images is analyzed, and will be adjusted to deliver\n * frames quicker to the client.\n */\nexport interface AdaptiveRenderingSettings {\n /**\n * Indicates if adaptive rendering is enabled.\n */\n enabled?: boolean;\n\n /**\n * The adaptive rendering algorithm to use. Defaults to `median`.\n */\n method?:\n | 'median'\n | 'average'\n | 'smoothed-median'\n | 'median-of-smoothed-median'\n | 'average-of-smoothed-median';\n\n /**\n * A number between 1 and 100 representing the minimum JPEG quality for\n * rendered frames.\n */\n jpegMinQuality?: number;\n\n /**\n * A number between 1 and 100 representing the maximum JPEG quality for\n * rendered frames.\n */\n jpegMaxQuality?: number;\n\n /**\n * A number between 0 and 1 representing the minimum scale factor for rendered\n * frames.\n */\n imageMinScale?: number;\n\n /**\n * A number between 0 and 1 representing the maximum scale factor for rendered\n * frames.\n */\n imageMaxScale?: number;\n\n /**\n * The window size to use for smoothing based adaptive rendering methods. This\n * applies to: `smoothed-median`, `median-of-smoothed-median`,\n * `average-of-smoothed-median`. Higher window sizes will result in values\n * that are more smoothed, and have less \"wave\" like behavior to image\n * quality. However, higher window sizes will take longer to respond to\n * changes in network conditions.\n */\n windowSize?: number;\n}\n\n/**\n * Settings to configure the quality of service metrics used by the server.\n */\nexport interface QualityOfServiceSettings {\n /**\n * Specifies how many timings to track before old timings are purged.\n */\n historyMaxSize?: number;\n}\n\n/**\n * Settings to configure the frame stream and its websocket connection.\n */\nexport interface Settings {\n /**\n * **EXPERIMENTAL.** Settings to configure the delivery of frames.\n */\n EXPERIMENTAL_frameDelivery?: FrameDeliverySettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure adaptive rendering of frames.\n */\n EXPERIMENTAL_adaptiveRendering?: AdaptiveRenderingSettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure quality of service.\n */\n EXPERIMENTAL_qualityOfService?: QualityOfServiceSettings;\n}\n\nexport function appendSettingsToUrl(url: string, settings: Settings): string {\n const defaults: Settings = {\n // Settings that you want to set on each WS connection should go here.\n };\n\n const uri = Uri.parse(url);\n const builder = defineParams(\n toFrameDeliverySettingsParams(defaults.EXPERIMENTAL_frameDelivery),\n toAdaptiveRenderingSettingsParams(defaults.EXPERIMENTAL_adaptiveRendering),\n toQualityOfServiceSettingsParams(defaults.EXPERIMENTAL_qualityOfService)\n );\n const params = builder(settings);\n return Uri.toString(Uri.addQueryParams(params, uri));\n}\n\nfunction toFrameDeliverySettingsParams(\n defaults: FrameDeliverySettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_frameDelivery,\n defaults,\n defineParams(\n defineBoolean('frame-delivery.rate-limit-enabled', 'rateLimitingEnabled'),\n defineNumber(\n 'frame-delivery.packet-loss-threshold',\n 'packetLossThreshold'\n ),\n defineNumber('frame-delivery.history-max-size', 'historyMaxSize'),\n defineString('frame-delivery.timeout', 'timeout'),\n defineNumber(\n 'frame-delivery.timeout-ratio-threshold',\n 'timeoutRatioThreshold'\n )\n )\n );\n}\n\nfunction toAdaptiveRenderingSettingsParams(\n defaults: AdaptiveRenderingSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_adaptiveRendering,\n defaults,\n defineParams(\n defineBoolean('adaptive-rendering.enabled', 'enabled'),\n defineString('adaptive-rendering.method', 'method'),\n defineNumber('adaptive-rendering.jpeg-quality-min', 'jpegMinQuality'),\n defineNumber('adaptive-rendering.jpeg-quality-max', 'jpegMaxQuality'),\n defineNumber('adaptive-rendering.image-scale-min', 'imageMinScale'),\n defineNumber('adaptive-rendering.image-scale-max', 'imageMaxScale'),\n defineNumber('adaptive-rendering.window-size', 'windowSize')\n )\n );\n}\n\nfunction toQualityOfServiceSettingsParams(\n defaults: QualityOfServiceSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_qualityOfService,\n defaults,\n defineParams(defineNumber('qos.history-max-size', 'historyMaxSize'))\n );\n}\n\nfunction defineSettings<S, T>(\n getter: (settings: S) => T | undefined,\n defaults: T | undefined,\n builder: ParamsBuilder<T>\n): ParamsBuilder<S> {\n return (settings) => {\n const merged = Objects.defaults(getter(settings) || {}, defaults);\n return builder(merged);\n };\n}\n","import { google } from '@vertexvis/frame-streaming-protos';\n\ntype MaybeTimestampOrDuration = Pick<\n google.protobuf.ITimestamp,\n 'seconds' | 'nanos'\n>;\n\ntype DefinedTimestampOrDuration = Required<\n Pick<google.protobuf.ITimestamp, 'seconds' | 'nanos'>\n>;\n\n/**\n * Converts a JS date type to a `google.protobuf.Timestamp`. The returned time\n * will be represented as UTC.\n *\n * @param date The date to convert.\n */\nexport function toProtoTimestamp(date: Date): google.protobuf.Timestamp {\n const millis = date.getTime();\n return google.protobuf.Timestamp.create(parseEpochMillis(millis));\n}\n\n/**\n * Returns the current date and time as a `google.protobuf.Timestamp`.\n */\nexport function currentDateAsProtoTimestamp(): google.protobuf.Timestamp {\n return toProtoTimestamp(new Date());\n}\n\n/**\n * Converts the given milliseconds into a `google.protobuf.Duration`.\n *\n * @param ms The milliseconds to convert.\n */\nexport function toProtoDuration(ms: number): google.protobuf.Duration;\n\n/**\n * Converts the two dates into a `google.protobuf.Duration`, where the duration\n * is `end - start`. If `end` is before `start`, then the duration will be\n * negative.\n *\n * @param start The starting time.\n * @param end The ending time.\n */\nexport function toProtoDuration(\n start: Date,\n end: Date\n): google.protobuf.Duration;\n\nexport function toProtoDuration(...args: unknown[]): google.protobuf.Duration {\n if (args.length === 2) {\n const start = args[0] as Date;\n const end = args[1] as Date;\n const millis = end.getTime() - start.getTime();\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else if (args.length === 1) {\n const millis = args[0] as number;\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else {\n throw new Error('Expected input to be a number or start and end date.');\n }\n}\n\n/* eslint-disable padding-line-between-statements */\n/**\n * Converts a protobuf timestamp or duration to a JS date.\n *\n * @param time The timestamp or duration to convert.\n */\nexport function protoToDate(time: DefinedTimestampOrDuration): Date;\nexport function protoToDate(time: MaybeTimestampOrDuration): Date | undefined;\nexport function protoToDate(\n time: MaybeTimestampOrDuration | DefinedTimestampOrDuration\n): Date | undefined {\n if (time.seconds != null && time.nanos != null) {\n const seconds =\n typeof time.seconds === 'number' ? time.seconds : time.seconds.toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\n/* eslint-enable padding-line-between-statements */\n\nfunction parseEpochMillis(millis: number): DefinedTimestampOrDuration {\n const seconds = Math.floor(Math.abs(millis) / 1000);\n const nanos = (millis % 1000) * 1000000;\n return { seconds: seconds * (millis < 0 ? -1 : 1), nanos };\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function validateBoundingBox(\n boundingBox: vertexvis.protobuf.core.IBoundingBox3f\n): boolean {\n const boundingBoxXMaxValid =\n boundingBox?.xmax != null && Number.isFinite(boundingBox.xmax);\n const boundingBoxXMinValid =\n boundingBox?.xmin != null && Number.isFinite(boundingBox.xmin);\n const boundingBoxYMaxValid =\n boundingBox?.ymax != null && Number.isFinite(boundingBox.ymax);\n const boundingBoxYMinValid =\n boundingBox?.ymin != null && Number.isFinite(boundingBox.ymin);\n const boundingBoxZMaxValid =\n boundingBox?.zmax != null && Number.isFinite(boundingBox.zmax);\n const boundingBoxZMinValid =\n boundingBox?.zmin != null && Number.isFinite(boundingBox.zmin);\n\n return (\n boundingBoxXMaxValid &&\n boundingBoxXMinValid &&\n boundingBoxYMaxValid &&\n boundingBoxYMinValid &&\n boundingBoxZMaxValid &&\n boundingBoxZMinValid\n );\n}\n\nexport function validateCamera(\n camera: vertexvis.protobuf.stream.ICamera\n): boolean {\n // If a perspective camera is provided, verify it is valid\n if (camera.perspective != null) {\n const perspectiveCameraIsValid = validatePerspectiveCamera(\n camera.perspective\n );\n return perspectiveCameraIsValid;\n }\n\n // If an orthographic camera is provided, verify it is valid\n if (camera.orthographic != null) {\n const orthographicCameraIsValid = validateOrthographicCamera(\n camera.orthographic\n );\n return orthographicCameraIsValid;\n }\n\n return false;\n}\n\nexport function validatePerspectiveCamera(\n camera: vertexvis.protobuf.stream.IPerspectiveCamera\n): boolean {\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const positionXValid =\n camera.position?.x != null && Number.isFinite(camera.position.x);\n const positionYValid =\n camera.position?.y != null && Number.isFinite(camera.position.y);\n const positionZValid =\n camera.position?.z != null && Number.isFinite(camera.position.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n positionXValid &&\n positionYValid &&\n positionZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera\n): boolean {\n const fovHeightValid =\n camera.fovHeight != null && Number.isFinite(camera.fovHeight);\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n const viewVectorXValid =\n camera.viewVector?.x != null && Number.isFinite(camera.viewVector.x);\n const viewVectorYValid =\n camera.viewVector?.y != null && Number.isFinite(camera.viewVector.y);\n const viewVectorZValid =\n camera.viewVector?.z != null && Number.isFinite(camera.viewVector.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n fovHeightValid &&\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n viewVectorXValid &&\n viewVectorYValid &&\n viewVectorZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions\n): boolean {\n const heightValid =\n dimensions?.height != null &&\n Number.isFinite(dimensions.height) &&\n dimensions.height > 0;\n const widthValid =\n dimensions?.width != null &&\n Number.isFinite(dimensions.width) &&\n dimensions.width > 0;\n\n return heightValid && widthValid;\n}\n\nexport function validateNumber(number: number): boolean {\n return number != null && Number.isFinite(number);\n}\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint\n): boolean {\n const xValid = point?.x != null && Number.isFinite(point.x);\n const yValid = point?.y != null && Number.isFinite(point.y);\n\n return xValid && yValid;\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f,\n verifyNonZeroLength: boolean\n): boolean {\n const xValid = vector?.x != null && Number.isFinite(vector.x);\n const yValid = vector?.y != null && Number.isFinite(vector.y);\n const zValid = vector?.z != null && Number.isFinite(vector.z);\n\n const vectorComponentsValid = xValid && yValid && zValid;\n\n if (verifyNonZeroLength) {\n if (vector?.x != null && vector?.y != null && vector?.z != null) {\n const vectorMagnitudeSquared =\n vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;\n const vectorHasNonZeroLength = vectorMagnitudeSquared !== 0;\n\n return vectorComponentsValid && vectorHasNonZeroLength;\n } else {\n // If one or more components are undefined, then the vector does not have non-zero length\n return false;\n }\n }\n\n return vectorComponentsValid;\n}\n","import { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\n\nexport type WebSocketSendData =\n | string\n | ArrayBufferLike\n | Blob\n | ArrayBufferView;\n\nexport type MessageHandler = (event: MessageEvent) => void;\n\nexport type CloseHandler = (event: CloseEvent) => void;\n\nexport interface WebSocketClient {\n close(): void;\n connect(descriptor: ConnectionDescriptor): Promise<void>;\n onMessage(handler: MessageHandler): Disposable;\n onClose(handler: CloseHandler): Disposable;\n send(data: WebSocketSendData): void;\n}\n\nexport class WebSocketClientImpl implements WebSocketClient {\n private webSocket?: WebSocket;\n private listeners: Record<UUID.UUID, Disposable> = {};\n\n private onMessageDispatcher = new EventDispatcher<MessageEvent>();\n private onCloseDispatcher = new EventDispatcher<CloseEvent>();\n\n public close(): void {\n if (this.webSocket != null) {\n this.webSocket.close();\n }\n }\n\n public async connect(descriptor: ConnectionDescriptor): Promise<void> {\n const id = UUID.create();\n\n // Ensure that any existing websocket connection has been closed prior\n // to opening a new one to ensure we don't leave open connections.\n if (this.webSocket != null) {\n this.close();\n }\n\n this.webSocket = new WebSocket(descriptor.url, descriptor.protocols);\n this.webSocket.binaryType = 'arraybuffer';\n\n return new Promise((resolve, reject) => {\n if (this.webSocket != null) {\n this.listeners[id] = this.addWebSocketListeners(\n this.webSocket,\n id,\n resolve,\n reject\n );\n }\n });\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n return this.onMessageDispatcher.on(handler);\n }\n\n public onClose(handler: CloseHandler): Disposable {\n return this.onCloseDispatcher.on(handler);\n }\n\n public send(data: WebSocketSendData): void {\n if (this.webSocket != null) {\n this.webSocket.send(data);\n }\n }\n\n private addWebSocketListeners = (\n ws: WebSocket,\n wsId: UUID.UUID,\n resolve: VoidFunction,\n reject: VoidFunction\n ): Disposable => {\n const onOpen = (): void => this.onOpen(resolve);\n const onError = (): void => reject();\n const onClose = (event: CloseEvent): void => this.handleClose(event, wsId);\n\n ws.addEventListener('message', this.handleMessage);\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n\n return {\n dispose: () => {\n ws.removeEventListener('message', this.handleMessage);\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n },\n };\n };\n\n private removeWebSocketListeners(webSocketId: UUID.UUID): void {\n this.listeners[webSocketId]?.dispose();\n }\n\n private handleMessage = (event: MessageEvent): void => {\n this.onMessageDispatcher.emit(event);\n };\n\n private handleClose = (event: CloseEvent, webSocketId: UUID.UUID): void => {\n this.onCloseDispatcher.emit(event);\n this.removeWebSocketListeners(webSocketId);\n };\n\n private onOpen(resolve: VoidFunction): void {\n resolve();\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\nimport { decode, encode } from './encoder';\nimport { StreamRequestError } from './errors';\nimport { appendSettingsToUrl, Settings } from './settings';\nimport { currentDateAsProtoTimestamp } from './time';\nimport {\n BeginInteractionPayload,\n EndInteractionPayload,\n EventMessage,\n GetStencilBufferPayload,\n HitItemsPayload,\n LoadSceneViewStatePayload,\n ReconnectPayload,\n RecordPerformancePayload,\n ReplaceCameraPayload,\n RequestMessage,\n ResponseError,\n ResponseMessage,\n ResponseResult,\n StartStreamPayload,\n SyncTimePayload,\n UpdateCrossSectioningPayload,\n UpdateDimensionsPayload,\n UpdateInteractionPayload,\n UpdateModelViewPayload,\n UpdateStreamPayload,\n} from './types';\nimport {\n validateBoundingBox,\n validateCamera,\n validateDimensions,\n validateNumber,\n validatePoint,\n validateVector,\n} from './validators';\nimport { WebSocketClient, WebSocketClientImpl } from './webSocketClient';\n\nexport type RequestMessageHandler = (msg: RequestMessage) => void;\n\nexport type ResponseMessageHandler = (msg: ResponseMessage) => void;\n\nexport type EventMessageHandler = (msg: EventMessage) => void;\n\nexport type CloseEventHandler = (evt: CloseEvent) => void;\n\nexport interface StreamApiOptions {\n loggingEnabled?: boolean;\n}\n\n/**\n * The API client to interact with Vertex's streaming API.\n */\nexport class StreamApi {\n private onResponseDispatcher = new EventDispatcher<ResponseMessage>();\n private onRequestDispatcher = new EventDispatcher<RequestMessage>();\n private onEventDispatcher = new EventDispatcher<EventMessage>();\n private messageSubscription?: Disposable;\n\n private opts: Required<StreamApiOptions>;\n\n public constructor(\n private websocket: WebSocketClient = new WebSocketClientImpl(),\n opts: StreamApiOptions = {}\n ) {\n this.opts = {\n loggingEnabled: opts.loggingEnabled ?? false,\n };\n }\n\n /**\n * Initiates a websocket connection to Vertex's streaming API. Returns a\n * promise that resolves once the connection is established and can begin\n * accepting messages.\n *\n * @param descriptor A function that returns a description of how to establish\n * a WS connection.\n * @param settings A configuration to use when initializing the WS connection.\n */\n public async connect(\n descriptor: ConnectionDescriptor,\n settings: Settings = {}\n ): Promise<Disposable> {\n const desc = {\n ...descriptor,\n url: appendSettingsToUrl(descriptor.url, settings),\n };\n await this.websocket.connect(desc);\n this.messageSubscription = this.websocket.onMessage((message) => {\n this.handleMessage(message);\n });\n\n return { dispose: () => this.dispose() };\n }\n\n /**\n * Closes any open WS connections and disposes of resources.\n */\n public dispose(): void {\n this.websocket.close();\n this.messageSubscription?.dispose();\n }\n\n /**\n * Adds a callback that is invoked when the client receives a request from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler A handler function.\n */\n public onRequest(handler: RequestMessageHandler): Disposable {\n return this.onRequestDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the client receives an event from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler - A handler function.\n */\n public onEvent(handler: EventMessageHandler): Disposable {\n return this.onEventDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the websocket connection is closed.\n *\n * @param handler A handler function.\n */\n public onClose(handler: CloseEventHandler): Disposable {\n return this.websocket.onClose(handler);\n }\n\n /**\n * Sends a request to initiate a streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public startStream(\n payload: StartStreamPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ startStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to reconnect to an existing streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public async reconnect(\n payload: ReconnectPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ reconnect: payload }, withResponse);\n }\n\n public async updateStream(\n payload: UpdateStreamPayload,\n withResponse = false\n ): Promise<vertexvis.protobuf.stream.IUpdateStreamResult> {\n return this.sendRequest({ updateStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to signal to the rendering pipeline that an interaction has\n * started. The rendering pipeline will use this as a hint to perform more\n * aggressive rendering optimizations at the expense of rendering quality.\n * Call `endInteraction` to signal to the rendering pipeline that an\n * interaction has finished.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param data The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public beginInteraction(\n payload: BeginInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ beginInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public replaceCamera(\n payload: ReplaceCameraPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn(\n 'Invalid camera provided. Canceling replaceCamera operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateCamera: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera as a fly operation\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public flyTo(\n payload: vertexvis.protobuf.stream.IFlyToPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a bounding box is provided, verify it is valid\n if (payload.boundingBox != null) {\n const validBoundingBox = validateBoundingBox(payload.boundingBox);\n\n if (!validBoundingBox) {\n console.warn(\n 'Invalid bounding box provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn('Invalid camera provided. Canceling flyTo operation.');\n return Promise.resolve({});\n }\n }\n\n // If a base camera is provided, verify it is valid\n if (payload.baseCamera != null) {\n const baseCameraIsValid = validateCamera(payload.baseCamera);\n\n if (!baseCameraIsValid) {\n console.warn(\n 'Invalid base camera provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ flyTo: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the specified interaction.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateInteraction(\n payload: UpdateInteractionPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the dimensions of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateDimensions(\n payload: UpdateDimensionsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // Verify the provided dimensions are valid\n if (payload.dimensions != null) {\n const validDimensions = validateDimensions(payload.dimensions);\n\n if (!validDimensions) {\n console.warn(\n 'Invalid dimensions provided. Canceling updateDimensions operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateDimensions: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the cross sectioning planes of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateCrossSectioning(\n payload: UpdateCrossSectioningPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a section plane is provided, verify it is valid\n const invalidSectionPlane = payload.crossSectioning?.sectionPlanes?.some(\n (plane) => {\n const validNormal =\n plane.normal != null && validateVector(plane.normal, true);\n const validOffset =\n plane.offset != null && validateNumber(plane.offset);\n\n return !validNormal || !validOffset;\n }\n );\n\n if (invalidSectionPlane) {\n console.warn(\n 'Invalid cross section plane provided. Canceling updateCrossSectioning operation.'\n );\n return Promise.resolve({});\n }\n\n return this.sendRequest({ updateCrossSectioning: payload }, withResponse);\n }\n\n /**\n * Sends a request to set or clear the model view of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateModelView(\n payload: UpdateModelViewPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateModelView: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform hit detection.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public hitItems(\n payload: HitItemsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a point is provided, verify it is valid\n if (payload.point != null) {\n const validPoint = validatePoint(payload.point);\n\n if (!validPoint) {\n console.warn('Invalid point provided. Canceling hitItems operation.');\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ hitItems: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform an alteration to a scene. Alterations include\n * changing item visibility and changing the materials of items.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public createSceneAlteration(\n payload: vertexvis.protobuf.stream.ICreateSceneAlterationPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ createSceneAlteration: payload }, withResponse);\n }\n\n /**\n * Sends a request to reset all overrides for a given scene and optionally to\n * reset the camera to that of the base scene.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public resetSceneView(\n payload: vertexvis.protobuf.stream.IResetViewPlayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ resetView: payload }, withResponse);\n }\n\n /**\n * Sends a request to tell the rendering pipeline that an interaction has\n * ended.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public endInteraction(\n payload: EndInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IBeginInteractionResult> {\n return this.sendRequest({ endInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to sync the clocks between the client and server.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public syncTime(\n payload: SyncTimePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ syncTime: payload }, withResponse);\n }\n\n /**\n * Sends a request to record performance timings that were measured in the\n * client. The server may use these timings as hints to optimize the rendering\n * performance to provide a better experience.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public recordPerformance(\n payload: RecordPerformancePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ recordPerformance: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the current scene view with the state present\n * in the specified scene view state.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public loadSceneViewState(\n payload: LoadSceneViewStatePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ loadSceneViewState: payload }, withResponse);\n }\n\n /**\n * Sends a request to get a stencil buffer image for the current scene view.\n */\n public getStencilBuffer(\n payload: GetStencilBufferPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ getStencilBuffer: payload }, withResponse);\n }\n\n /**\n * Sends a request to retrieve a new token. This token can be used to\n * authenticate with other Vertex services.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * @returns A promise that completes with the refreshed token.\n */\n public refreshToken(\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ refreshToken: {} }, withResponse);\n }\n\n /**\n * Acknowledges a successful request by sending a reply back to the server\n * with an optional result body.\n *\n * @param reqId The ID of the received request.\n * @param result A result to reply with.\n */\n public replyResult(reqId: string, result: ResponseResult): void {\n this.sendResponse({ requestId: { value: reqId }, ...result });\n }\n\n /**\n * Acknowledges a failed request by sending a reply back to the server.\n *\n * @param reqId The ID of the received request.\n * @param error An error to reply with.\n */\n public replyError(reqId: string, error: ResponseError): void {\n this.sendResponse({ requestId: { value: reqId }, error });\n }\n\n protected handleMessage(message: MessageEvent): void {\n const msg = decode(message.data);\n this.log('WS message received', msg);\n\n if (msg?.sentAtTime != null) {\n if (msg.response != null) {\n this.onResponseDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n response: msg.response,\n });\n }\n\n if (msg.request != null) {\n this.onRequestDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n request: msg.request,\n });\n }\n\n if (msg.event != null) {\n this.onEventDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n event: msg.event,\n });\n }\n }\n }\n\n protected onResponse(handler: ResponseMessageHandler): Disposable {\n return this.onResponseDispatcher.on(handler);\n }\n\n protected log(msg: string, ...other: unknown[]): void {\n if (this.opts.loggingEnabled) {\n console.debug(msg, ...other);\n }\n }\n\n private sendRequest(\n req: vertexvis.protobuf.stream.IStreamRequest,\n withResponse: boolean\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n const sentAtTime = currentDateAsProtoTimestamp();\n if (withResponse) {\n const requestId = UUID.create();\n const request = { ...req, requestId: { value: requestId } };\n\n return new Promise((resolve, reject) => {\n const subscription = this.onResponse((msg) => {\n if (requestId === msg.response.requestId?.value) {\n if (msg.response.error == null) {\n resolve(msg.response);\n } else {\n const { message: summary, details } = msg.response.error;\n reject(\n new StreamRequestError(\n requestId,\n req,\n summary?.value,\n details?.value\n )\n );\n }\n subscription.dispose();\n }\n });\n this.sendMessage({ sentAtTime, request });\n });\n }\n this.sendMessage({ sentAtTime, request: req });\n return Promise.resolve({});\n }\n\n private sendMessage(msg: vertexvis.protobuf.stream.IStreamMessage): void {\n this.websocket.send(encode(msg));\n this.log('WS message sent', msg);\n }\n\n private sendResponse(\n response: vertexvis.protobuf.stream.IStreamResponse\n ): void {\n const sentAtTime = currentDateAsProtoTimestamp();\n this.websocket.send(encode({ sentAtTime, response }));\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n AnimationCompletedEvent,\n EventMessage,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ntype Event = vertexvis.protobuf.stream.IStreamEvent;\n\nfunction event(req: Event, meta?: Metadata): EventMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n event: {\n ...req,\n },\n ...meta,\n };\n}\n\nexport function animationCompleted(id: string): EventMessage {\n const def: AnimationCompletedEvent = {\n animationId: { hex: id },\n };\n return event({\n animationCompleted: {\n ...def,\n },\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n DrawFramePayload,\n GracefulReconnectPayload,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ntype Request = RequestId &\n Payload<Omit<vertexvis.protobuf.stream.IStreamRequest, 'requestId'>>;\n\ninterface Payload<P> {\n payload?: P;\n}\n\ntype DrawFrameRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IDrawFramePayload>;\n\ntype GracefulReconnectRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IGracefulReconnectionPayload>;\n\nfunction request(req: Request, meta?: Metadata): RequestMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n request: {\n requestId: req.requestId != null ? { value: req.requestId } : undefined,\n ...req.payload,\n },\n };\n}\n\nexport function drawFrame(\n req: DrawFrameRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: DrawFramePayload = {\n sequenceNumber: 1,\n sceneAttributes: {\n camera: {\n position: { x: 0, y: 0, z: 1 },\n lookAt: { x: 0, y: 0, z: 0 },\n up: { x: 0, y: 1, z: 0 },\n },\n visibleBoundingBox: {\n xmin: -1,\n ymin: -1,\n zmin: -1,\n xmax: 1,\n ymax: 1,\n zmax: 1,\n },\n crossSectioning: {\n sectionPlanes: [],\n },\n displayListSummary: {\n visibleSummary: {\n count: 100,\n },\n selectedVisibleSummary: {\n count: 0,\n },\n },\n },\n imageAttributes: {\n frameDimensions: { width: 200, height: 150 },\n imageRect: { x: 0, y: 0, width: 200, height: 150 },\n scaleFactor: 1,\n },\n frameCorrelationIds: ['123'],\n image: new Uint8Array(),\n };\n return request(\n {\n requestId: req.requestId,\n payload: { drawFrame: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n\nexport function gracefulReconnect(\n req: GracefulReconnectRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: GracefulReconnectPayload = {\n streamId: { hex: UUID.create() },\n timeToReconnectDuration: { seconds: 1, nanos: 0 },\n };\n return request(\n {\n requestId: req.requestId,\n payload: { gracefulReconnection: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { RefreshTokenResult } from '../..';\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n LoadSceneViewStateResult,\n ReconnectResult,\n ResponseMessage,\n StartStreamResult,\n SyncTimeResult,\n} from '../../types';\n\ntype Metadata = Partial<Pick<ResponseMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ninterface Result<T> {\n result?: T;\n}\n\ntype Response = RequestId &\n Result<Omit<vertexvis.protobuf.stream.IStreamResponse, 'requestId'>>;\n\ntype StartStreamResponse = RequestId &\n Result<vertexvis.protobuf.stream.IStartStreamResult>;\n\ntype SyncTimeResponse = RequestId &\n Result<vertexvis.protobuf.stream.ISyncTimeResult>;\n\ntype ReconnectResponse = RequestId &\n Result<vertexvis.protobuf.stream.IReconnectResult>;\n\ntype LoadSceneViewStateResponse = RequestId &\n Result<vertexvis.protobuf.stream.ILoadSceneViewStateResult>;\n\ntype RefreshTokenResponse = RequestId &\n Result<vertexvis.protobuf.stream.IRefreshTokenResult>;\n\nfunction response(res: Response, meta?: Metadata): ResponseMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n response: {\n requestId: res.requestId != null ? { value: res.requestId } : undefined,\n ...res.result,\n },\n };\n}\n\nexport function startStream(\n res: StartStreamResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: StartStreamResult = {\n streamId: { hex: UUID.create() },\n sceneId: { hex: UUID.create() },\n sceneViewId: { hex: UUID.create() },\n sessionId: { hex: UUID.create() },\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n worldOrientation: {\n front: { x: 0, y: 0, z: 1 },\n up: { x: 0, y: 1, z: 0 },\n },\n };\n return response(\n {\n requestId: res.requestId,\n result: { startStream: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function syncTime(\n res: SyncTimeResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: SyncTimeResult = { replyTime: { seconds: 1, nanos: 0 } };\n return response({\n requestId: res.requestId,\n result: { syncTime: Objects.defaults(res.result, def) },\n });\n}\n\nexport function reconnect(\n res: ReconnectResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: ReconnectResult = {\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { reconnect: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function loadSceneViewState(\n res: LoadSceneViewStateResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: LoadSceneViewStateResult = {};\n return response(\n {\n requestId: res.requestId,\n result: { loadSceneViewState: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function refreshToken(\n res: RefreshTokenResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: RefreshTokenResult = {\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { refreshToken: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n","import { Disposable } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from '../connection';\nimport {\n CloseHandler,\n MessageHandler,\n WebSocketClient,\n WebSocketSendData,\n} from '../webSocketClient';\n\nexport class WebSocketClientMock implements WebSocketClient {\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n }\n\n public connect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n public onClose(handler: CloseHandler): Disposable {\n this.closeHandlers.add(handler);\n return { dispose: () => this.closeHandlers.delete(handler) };\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n this.msgHandlers.add(handler);\n return { dispose: () => this.msgHandlers.delete(handler) };\n }\n\n public send(data: WebSocketSendData): void {\n this.sentMessages.push(data);\n }\n\n public reconnect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Simulates a websocket message that was sent by the server and received by\n * the client.\n *\n * @param data The websocket message data.\n */\n public receiveMessage(data: WebSocketSendData): void {\n this.msgHandlers.forEach((handler) =>\n handler(new MessageEvent('message', { data }))\n );\n }\n\n /**\n * Resets the internal state of the mock by clearing any accrued sent messages\n * and removing all handlers.\n */\n public reset(): void {\n this.sentMessages = [];\n this.msgHandlers.clear();\n this.closeHandlers.clear();\n }\n\n /**\n * Returns `true` if there are remaining sent messages..\n */\n public hasNextSent(): boolean {\n return this.sentMessages.length > 0;\n }\n\n /**\n * Decodes and returns the next message that was sent on this websocket.\n *\n * @example\n *\n * const ws = new WebSocketClientMock();\n * const decoder = str => parseInt(str)\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(decoder); // 1\n * ws.nextSent(decoder); // 2\n *\n * @param decoder A function to decode a message.\n */\n public nextSent<T>(decoder: (data: WebSocketSendData) => T): T;\n\n /**\n * Returns the next message that was sent on this websocket.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(); // \"1\"\n * ws.nextSent(); // \"2\"\n * ```\n */\n public nextSent(): WebSocketSendData;\n public nextSent<T>(\n decoder?: (data: WebSocketSendData) => T\n ): T | WebSocketSendData {\n const next = this.sentMessages.shift();\n if (next != null) {\n if (decoder != null) {\n return decoder(next);\n } else {\n return next;\n }\n } else {\n throw new Error('Sent messages is empty');\n }\n }\n\n /**\n * Skips the next N sent messages.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n * ws.send(\"3\");\n *\n * ws.skipSent(2);\n * ws.nextSent(); // \"3\"\n * ```\n *\n * @param n The number of sent messages to skip over.\n */\n public skipSent(n = 1): this {\n if (n <= this.sentMessages.length) {\n for (let i = 0; i < n; i++) {\n this.nextSent();\n }\n } else {\n throw new Error(\n `Cannot skip the next ${n} messages. Sent message queue only has ${this.sentMessages.length} messages.`\n );\n }\n return this;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundle.js","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed'\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: ParamsBuilder<S>[]\n): ParamsBuilder<S> {\n return (settings) => {\n return definitions.reduce(\n (result, def) => ({ ...result, ...def(settings) }),\n {}\n );\n };\n}\n\nexport function defineBoolean<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) => {\n if (typeof v === 'boolean') {\n return v ? 'on' : 'off';\n } else {\n return undefined;\n }\n });\n}\n\nexport function defineNumber<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'number' ? v.toString() : undefined\n );\n}\n\nexport function defineString<S, P extends keyof S = keyof S>(\n param: string,\n prop: P\n): ParamsBuilder<S> {\n return defineValue(param, prop, (v) =>\n typeof v === 'string' ? v : undefined\n );\n}\n\nfunction defineValue<S, P extends keyof S = keyof S>(\n param: string,\n prop: P,\n f: (prop: unknown) => string | undefined\n): ParamsBuilder<S> {\n return (settings) => {\n const value = f(settings[prop]);\n if (value != null) {\n return { [param]: value };\n } else {\n return {};\n }\n };\n}\n","import { Objects, Uri } from '@vertexvis/utils';\n\nimport {\n defineBoolean,\n defineNumber,\n defineParams,\n defineString,\n ParamsBuilder,\n} from './paramsBuilder';\n\n/**\n * Settings to configure the delivery of images over the websocket connection.\n */\nexport interface FrameDeliverySettings {\n /**\n * Indicates if the rate limiting of frame delivery is enabled based on\n * detected internet throughput.\n */\n rateLimitingEnabled?: boolean;\n\n /**\n * Enables rate limiting when the variation coefficient of frame latencies\n * exceeds this threshold. The variation coefficient is defined by the\n * standard deviation of latencies over the average of recorded latencies.\n *\n * Lower numbers will increase the aggressiveness of packet loss detection,\n * but may trigger unexpected delivery rate limiting.\n */\n packetLossThreshold?: number;\n\n /**\n * The maximum number of latencies to record. Higher numbers could result in\n * more delay before packet loss is detected. Lower numbers could result in\n * packet loss not being detected.\n */\n historyMaxSize?: number;\n\n /**\n * The duration at which point a frame will be considered failed if the server\n * has not received an acknowledgement.\n */\n timeout?: string;\n\n /**\n * Enables rate limiting when the number of frames that failed to receive an\n * acknowledgement within the timeout window exceeds this ratio.\n */\n timeoutRatioThreshold?: number;\n}\n\n/**\n * Settings to configure the adaptive rendering of images. If enabled, the\n * performance of delivering images is analyzed, and will be adjusted to deliver\n * frames quicker to the client.\n */\nexport interface AdaptiveRenderingSettings {\n /**\n * Indicates if adaptive rendering is enabled.\n */\n enabled?: boolean;\n\n /**\n * The adaptive rendering algorithm to use. Defaults to `median`.\n */\n method?:\n | 'median'\n | 'average'\n | 'smoothed-median'\n | 'median-of-smoothed-median'\n | 'average-of-smoothed-median';\n\n /**\n * A number between 1 and 100 representing the minimum JPEG quality for\n * rendered frames.\n */\n jpegMinQuality?: number;\n\n /**\n * A number between 1 and 100 representing the maximum JPEG quality for\n * rendered frames.\n */\n jpegMaxQuality?: number;\n\n /**\n * A number between 0 and 1 representing the minimum scale factor for rendered\n * frames.\n */\n imageMinScale?: number;\n\n /**\n * A number between 0 and 1 representing the maximum scale factor for rendered\n * frames.\n */\n imageMaxScale?: number;\n\n /**\n * The window size to use for smoothing based adaptive rendering methods. This\n * applies to: `smoothed-median`, `median-of-smoothed-median`,\n * `average-of-smoothed-median`. Higher window sizes will result in values\n * that are more smoothed, and have less \"wave\" like behavior to image\n * quality. However, higher window sizes will take longer to respond to\n * changes in network conditions.\n */\n windowSize?: number;\n}\n\n/**\n * Settings to configure the quality of service metrics used by the server.\n */\nexport interface QualityOfServiceSettings {\n /**\n * Specifies how many timings to track before old timings are purged.\n */\n historyMaxSize?: number;\n}\n\n/**\n * Settings to configure the frame stream and its websocket connection.\n */\nexport interface Settings {\n /**\n * **EXPERIMENTAL.** Settings to configure the delivery of frames.\n */\n EXPERIMENTAL_frameDelivery?: FrameDeliverySettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure adaptive rendering of frames.\n */\n EXPERIMENTAL_adaptiveRendering?: AdaptiveRenderingSettings;\n\n /**\n * **EXPERIMENTAL.** Settings to configure quality of service.\n */\n EXPERIMENTAL_qualityOfService?: QualityOfServiceSettings;\n}\n\nexport function appendSettingsToUrl(url: string, settings: Settings): string {\n const defaults: Settings = {\n // Settings that you want to set on each WS connection should go here.\n };\n\n const uri = Uri.parse(url);\n const builder = defineParams(\n toFrameDeliverySettingsParams(defaults.EXPERIMENTAL_frameDelivery),\n toAdaptiveRenderingSettingsParams(defaults.EXPERIMENTAL_adaptiveRendering),\n toQualityOfServiceSettingsParams(defaults.EXPERIMENTAL_qualityOfService)\n );\n const params = builder(settings);\n return Uri.toString(Uri.addQueryParams(params, uri));\n}\n\nfunction toFrameDeliverySettingsParams(\n defaults: FrameDeliverySettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_frameDelivery,\n defaults,\n defineParams(\n defineBoolean('frame-delivery.rate-limit-enabled', 'rateLimitingEnabled'),\n defineNumber(\n 'frame-delivery.packet-loss-threshold',\n 'packetLossThreshold'\n ),\n defineNumber('frame-delivery.history-max-size', 'historyMaxSize'),\n defineString('frame-delivery.timeout', 'timeout'),\n defineNumber(\n 'frame-delivery.timeout-ratio-threshold',\n 'timeoutRatioThreshold'\n )\n )\n );\n}\n\nfunction toAdaptiveRenderingSettingsParams(\n defaults: AdaptiveRenderingSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_adaptiveRendering,\n defaults,\n defineParams(\n defineBoolean('adaptive-rendering.enabled', 'enabled'),\n defineString('adaptive-rendering.method', 'method'),\n defineNumber('adaptive-rendering.jpeg-quality-min', 'jpegMinQuality'),\n defineNumber('adaptive-rendering.jpeg-quality-max', 'jpegMaxQuality'),\n defineNumber('adaptive-rendering.image-scale-min', 'imageMinScale'),\n defineNumber('adaptive-rendering.image-scale-max', 'imageMaxScale'),\n defineNumber('adaptive-rendering.window-size', 'windowSize')\n )\n );\n}\n\nfunction toQualityOfServiceSettingsParams(\n defaults: QualityOfServiceSettings | undefined\n): ParamsBuilder<Settings> {\n return defineSettings(\n (s) => s.EXPERIMENTAL_qualityOfService,\n defaults,\n defineParams(defineNumber('qos.history-max-size', 'historyMaxSize'))\n );\n}\n\nfunction defineSettings<S, T>(\n getter: (settings: S) => T | undefined,\n defaults: T | undefined,\n builder: ParamsBuilder<T>\n): ParamsBuilder<S> {\n return (settings) => {\n const merged = Objects.defaults(getter(settings) || {}, defaults);\n return builder(merged);\n };\n}\n","import { google } from '@vertexvis/frame-streaming-protos';\n\ntype MaybeTimestampOrDuration = Pick<\n google.protobuf.ITimestamp,\n 'seconds' | 'nanos'\n>;\n\ntype DefinedTimestampOrDuration = Required<\n Pick<google.protobuf.ITimestamp, 'seconds' | 'nanos'>\n>;\n\n/**\n * Converts a JS date type to a `google.protobuf.Timestamp`. The returned time\n * will be represented as UTC.\n *\n * @param date The date to convert.\n */\nexport function toProtoTimestamp(date: Date): google.protobuf.Timestamp {\n const millis = date.getTime();\n return google.protobuf.Timestamp.create(parseEpochMillis(millis));\n}\n\n/**\n * Returns the current date and time as a `google.protobuf.Timestamp`.\n */\nexport function currentDateAsProtoTimestamp(): google.protobuf.Timestamp {\n return toProtoTimestamp(new Date());\n}\n\n/**\n * Converts the given milliseconds into a `google.protobuf.Duration`.\n *\n * @param ms The milliseconds to convert.\n */\nexport function toProtoDuration(ms: number): google.protobuf.Duration;\n\n/**\n * Converts the two dates into a `google.protobuf.Duration`, where the duration\n * is `end - start`. If `end` is before `start`, then the duration will be\n * negative.\n *\n * @param start The starting time.\n * @param end The ending time.\n */\nexport function toProtoDuration(\n start: Date,\n end: Date\n): google.protobuf.Duration;\n\nexport function toProtoDuration(...args: unknown[]): google.protobuf.Duration {\n if (args.length === 2) {\n const start = args[0] as Date;\n const end = args[1] as Date;\n const millis = end.getTime() - start.getTime();\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else if (args.length === 1) {\n const millis = args[0] as number;\n return google.protobuf.Duration.create(parseEpochMillis(millis));\n } else {\n throw new Error('Expected input to be a number or start and end date.');\n }\n}\n\n/* eslint-disable padding-line-between-statements */\n/**\n * Converts a protobuf timestamp or duration to a JS date.\n *\n * @param time The timestamp or duration to convert.\n */\nexport function protoToDate(time: DefinedTimestampOrDuration): Date;\nexport function protoToDate(time: MaybeTimestampOrDuration): Date | undefined;\nexport function protoToDate(\n time: MaybeTimestampOrDuration | DefinedTimestampOrDuration\n): Date | undefined {\n if (time.seconds != null && time.nanos != null) {\n const seconds =\n typeof time.seconds === 'number' ? time.seconds : time.seconds.toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\n/* eslint-enable padding-line-between-statements */\n\nfunction parseEpochMillis(millis: number): DefinedTimestampOrDuration {\n const seconds = Math.floor(Math.abs(millis) / 1000);\n const nanos = (millis % 1000) * 1000000;\n return { seconds: seconds * (millis < 0 ? -1 : 1), nanos };\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function validateBoundingBox(\n boundingBox: vertexvis.protobuf.core.IBoundingBox3f\n): boolean {\n const boundingBoxXMaxValid =\n boundingBox?.xmax != null && Number.isFinite(boundingBox.xmax);\n const boundingBoxXMinValid =\n boundingBox?.xmin != null && Number.isFinite(boundingBox.xmin);\n const boundingBoxYMaxValid =\n boundingBox?.ymax != null && Number.isFinite(boundingBox.ymax);\n const boundingBoxYMinValid =\n boundingBox?.ymin != null && Number.isFinite(boundingBox.ymin);\n const boundingBoxZMaxValid =\n boundingBox?.zmax != null && Number.isFinite(boundingBox.zmax);\n const boundingBoxZMinValid =\n boundingBox?.zmin != null && Number.isFinite(boundingBox.zmin);\n\n return (\n boundingBoxXMaxValid &&\n boundingBoxXMinValid &&\n boundingBoxYMaxValid &&\n boundingBoxYMinValid &&\n boundingBoxZMaxValid &&\n boundingBoxZMinValid\n );\n}\n\nexport function validateCamera(\n camera: vertexvis.protobuf.stream.ICamera\n): boolean {\n // If a perspective camera is provided, verify it is valid\n if (camera.perspective != null) {\n const perspectiveCameraIsValid = validatePerspectiveCamera(\n camera.perspective\n );\n return perspectiveCameraIsValid;\n }\n\n // If an orthographic camera is provided, verify it is valid\n if (camera.orthographic != null) {\n const orthographicCameraIsValid = validateOrthographicCamera(\n camera.orthographic\n );\n return orthographicCameraIsValid;\n }\n\n return false;\n}\n\nexport function validatePerspectiveCamera(\n camera: vertexvis.protobuf.stream.IPerspectiveCamera\n): boolean {\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const positionXValid =\n camera.position?.x != null && Number.isFinite(camera.position.x);\n const positionYValid =\n camera.position?.y != null && Number.isFinite(camera.position.y);\n const positionZValid =\n camera.position?.z != null && Number.isFinite(camera.position.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n positionXValid &&\n positionYValid &&\n positionZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera\n): boolean {\n const fovHeightValid =\n camera.fovHeight != null && Number.isFinite(camera.fovHeight);\n const lookAtXValid =\n camera.lookAt?.x != null && Number.isFinite(camera.lookAt.x);\n const lookAtYValid =\n camera.lookAt?.y != null && Number.isFinite(camera.lookAt.y);\n const lookAtZValid =\n camera.lookAt?.z != null && Number.isFinite(camera.lookAt.z);\n const upXValid = camera.up?.x != null && Number.isFinite(camera.up.x);\n const upYValid = camera.up?.y != null && Number.isFinite(camera.up.y);\n const upZValid = camera.up?.z != null && Number.isFinite(camera.up.z);\n const viewVectorXValid =\n camera.viewVector?.x != null && Number.isFinite(camera.viewVector.x);\n const viewVectorYValid =\n camera.viewVector?.y != null && Number.isFinite(camera.viewVector.y);\n const viewVectorZValid =\n camera.viewVector?.z != null && Number.isFinite(camera.viewVector.z);\n\n // Validate up vector has non-zero length\n const upVectorValid = validateVector(\n { x: camera?.up?.x, y: camera?.up?.y, z: camera?.up?.z },\n true\n );\n\n return (\n fovHeightValid &&\n lookAtXValid &&\n lookAtYValid &&\n lookAtZValid &&\n viewVectorXValid &&\n viewVectorYValid &&\n viewVectorZValid &&\n upXValid &&\n upYValid &&\n upZValid &&\n upVectorValid\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions\n): boolean {\n const heightValid =\n dimensions?.height != null &&\n Number.isFinite(dimensions.height) &&\n dimensions.height > 0;\n const widthValid =\n dimensions?.width != null &&\n Number.isFinite(dimensions.width) &&\n dimensions.width > 0;\n\n return heightValid && widthValid;\n}\n\nexport function validateNumber(number: number): boolean {\n return number != null && Number.isFinite(number);\n}\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint\n): boolean {\n const xValid = point?.x != null && Number.isFinite(point.x);\n const yValid = point?.y != null && Number.isFinite(point.y);\n\n return xValid && yValid;\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f,\n verifyNonZeroLength: boolean\n): boolean {\n const xValid = vector?.x != null && Number.isFinite(vector.x);\n const yValid = vector?.y != null && Number.isFinite(vector.y);\n const zValid = vector?.z != null && Number.isFinite(vector.z);\n\n const vectorComponentsValid = xValid && yValid && zValid;\n\n if (verifyNonZeroLength) {\n if (vector?.x != null && vector?.y != null && vector?.z != null) {\n const vectorMagnitudeSquared =\n vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;\n const vectorHasNonZeroLength = vectorMagnitudeSquared !== 0;\n\n return vectorComponentsValid && vectorHasNonZeroLength;\n } else {\n // If one or more components are undefined, then the vector does not have non-zero length\n return false;\n }\n }\n\n return vectorComponentsValid;\n}\n","import { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\n\nexport type WebSocketSendData =\n | string\n | ArrayBufferLike\n | Blob\n | ArrayBufferView;\n\nexport type MessageHandler = (event: MessageEvent) => void;\n\nexport type CloseHandler = (event: CloseEvent) => void;\n\nexport interface WebSocketClient {\n close(): void;\n connect(descriptor: ConnectionDescriptor): Promise<void>;\n onMessage(handler: MessageHandler): Disposable;\n onClose(handler: CloseHandler): Disposable;\n send(data: WebSocketSendData): void;\n}\n\nexport class WebSocketClientImpl implements WebSocketClient {\n private webSocket?: WebSocket;\n private listeners: Record<UUID.UUID, Disposable> = {};\n\n private onMessageDispatcher = new EventDispatcher<MessageEvent>();\n private onCloseDispatcher = new EventDispatcher<CloseEvent>();\n\n public close(): void {\n if (this.webSocket != null) {\n this.webSocket.close();\n }\n }\n\n public async connect(descriptor: ConnectionDescriptor): Promise<void> {\n const id = UUID.create();\n\n // Ensure that any existing websocket connection has been closed prior\n // to opening a new one to ensure we don't leave open connections.\n if (this.webSocket != null) {\n this.close();\n }\n\n this.webSocket = new WebSocket(descriptor.url, descriptor.protocols);\n this.webSocket.binaryType = 'arraybuffer';\n\n return new Promise((resolve, reject) => {\n if (this.webSocket != null) {\n this.listeners[id] = this.addWebSocketListeners(\n this.webSocket,\n id,\n resolve,\n reject\n );\n }\n });\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n return this.onMessageDispatcher.on(handler);\n }\n\n public onClose(handler: CloseHandler): Disposable {\n return this.onCloseDispatcher.on(handler);\n }\n\n public send(data: WebSocketSendData): void {\n if (this.webSocket != null) {\n this.webSocket.send(data);\n }\n }\n\n private addWebSocketListeners = (\n ws: WebSocket,\n wsId: UUID.UUID,\n resolve: VoidFunction,\n reject: VoidFunction\n ): Disposable => {\n const onOpen = (): void => this.onOpen(resolve);\n const onError = (): void => reject();\n const onClose = (event: CloseEvent): void => this.handleClose(event, wsId);\n\n ws.addEventListener('message', this.handleMessage);\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n\n return {\n dispose: () => {\n ws.removeEventListener('message', this.handleMessage);\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n },\n };\n };\n\n private removeWebSocketListeners(webSocketId: UUID.UUID): void {\n this.listeners[webSocketId]?.dispose();\n }\n\n private handleMessage = (event: MessageEvent): void => {\n this.onMessageDispatcher.emit(event);\n };\n\n private handleClose = (event: CloseEvent, webSocketId: UUID.UUID): void => {\n this.onCloseDispatcher.emit(event);\n this.removeWebSocketListeners(webSocketId);\n };\n\n private onOpen(resolve: VoidFunction): void {\n resolve();\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from './connection';\nimport { decode, encode } from './encoder';\nimport { StreamRequestError } from './errors';\nimport { appendSettingsToUrl, Settings } from './settings';\nimport { currentDateAsProtoTimestamp } from './time';\nimport {\n BeginInteractionPayload,\n EndInteractionPayload,\n EventMessage,\n GetStencilBufferPayload,\n HitItemsPayload,\n LoadSceneViewStatePayload,\n ReconnectPayload,\n RecordPerformancePayload,\n ReplaceCameraPayload,\n RequestMessage,\n ResponseError,\n ResponseMessage,\n ResponseResult,\n StartStreamPayload,\n SyncTimePayload,\n UpdateCrossSectioningPayload,\n UpdateDimensionsPayload,\n UpdateInteractionPayload,\n UpdateModelViewPayload,\n UpdateStreamPayload,\n} from './types';\nimport {\n validateBoundingBox,\n validateCamera,\n validateDimensions,\n validateNumber,\n validatePoint,\n validateVector,\n} from './validators';\nimport { WebSocketClient, WebSocketClientImpl } from './webSocketClient';\n\nexport type RequestMessageHandler = (msg: RequestMessage) => void;\n\nexport type ResponseMessageHandler = (msg: ResponseMessage) => void;\n\nexport type EventMessageHandler = (msg: EventMessage) => void;\n\nexport type CloseEventHandler = (evt: CloseEvent) => void;\n\nexport interface StreamApiOptions {\n loggingEnabled?: boolean;\n}\n\n/**\n * The API client to interact with Vertex's streaming API.\n */\nexport class StreamApi {\n private onResponseDispatcher = new EventDispatcher<ResponseMessage>();\n private onRequestDispatcher = new EventDispatcher<RequestMessage>();\n private onEventDispatcher = new EventDispatcher<EventMessage>();\n private messageSubscription?: Disposable;\n\n private opts: Required<StreamApiOptions>;\n\n public constructor(\n private websocket: WebSocketClient = new WebSocketClientImpl(),\n opts: StreamApiOptions = {}\n ) {\n this.opts = {\n loggingEnabled: opts.loggingEnabled ?? false,\n };\n }\n\n /**\n * Initiates a websocket connection to Vertex's streaming API. Returns a\n * promise that resolves once the connection is established and can begin\n * accepting messages.\n *\n * @param descriptor A function that returns a description of how to establish\n * a WS connection.\n * @param settings A configuration to use when initializing the WS connection.\n */\n public async connect(\n descriptor: ConnectionDescriptor,\n settings: Settings = {}\n ): Promise<Disposable> {\n const desc = {\n ...descriptor,\n url: appendSettingsToUrl(descriptor.url, settings),\n };\n await this.websocket.connect(desc);\n this.messageSubscription = this.websocket.onMessage((message) => {\n this.handleMessage(message);\n });\n\n return { dispose: () => this.dispose() };\n }\n\n /**\n * Closes any open WS connections and disposes of resources.\n */\n public dispose(): void {\n this.websocket.close();\n this.messageSubscription?.dispose();\n }\n\n /**\n * Adds a callback that is invoked when the client receives a request from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler A handler function.\n */\n public onRequest(handler: RequestMessageHandler): Disposable {\n return this.onRequestDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the client receives an event from the\n * server. Returns a `Disposable` that can be used to remove the listener.\n *\n * @param handler - A handler function.\n */\n public onEvent(handler: EventMessageHandler): Disposable {\n return this.onEventDispatcher.on(handler);\n }\n\n /**\n * Adds a callback that is invoked when the websocket connection is closed.\n *\n * @param handler A handler function.\n */\n public onClose(handler: CloseEventHandler): Disposable {\n return this.websocket.onClose(handler);\n }\n\n /**\n * Sends a request to initiate a streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public startStream(\n payload: StartStreamPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ startStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to reconnect to an existing streaming session.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public async reconnect(\n payload: ReconnectPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ reconnect: payload }, withResponse);\n }\n\n public async updateStream(\n payload: UpdateStreamPayload,\n withResponse = false\n ): Promise<vertexvis.protobuf.stream.IUpdateStreamResult> {\n return this.sendRequest({ updateStream: payload }, withResponse);\n }\n\n /**\n * Sends a request to signal to the rendering pipeline that an interaction has\n * started. The rendering pipeline will use this as a hint to perform more\n * aggressive rendering optimizations at the expense of rendering quality.\n * Call `endInteraction` to signal to the rendering pipeline that an\n * interaction has finished.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param data The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public beginInteraction(\n payload: BeginInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ beginInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public replaceCamera(\n payload: ReplaceCameraPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn(\n 'Invalid camera provided. Canceling replaceCamera operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateCamera: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the position of the scene's camera as a fly operation\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public flyTo(\n payload: vertexvis.protobuf.stream.IFlyToPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a bounding box is provided, verify it is valid\n if (payload.boundingBox != null) {\n const validBoundingBox = validateBoundingBox(payload.boundingBox);\n\n if (!validBoundingBox) {\n console.warn(\n 'Invalid bounding box provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n // If a camera is provided, verify it is valid\n if (payload.camera != null) {\n const cameraIsValid = validateCamera(payload.camera);\n\n if (!cameraIsValid) {\n console.warn('Invalid camera provided. Canceling flyTo operation.');\n return Promise.resolve({});\n }\n }\n\n // If a base camera is provided, verify it is valid\n if (payload.baseCamera != null) {\n const baseCameraIsValid = validateCamera(payload.baseCamera);\n\n if (!baseCameraIsValid) {\n console.warn(\n 'Invalid base camera provided. Canceling flyTo operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ flyTo: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the specified interaction.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateInteraction(\n payload: UpdateInteractionPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the dimensions of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateDimensions(\n payload: UpdateDimensionsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // Verify the provided dimensions are valid\n if (payload.dimensions != null) {\n const validDimensions = validateDimensions(payload.dimensions);\n\n if (!validDimensions) {\n console.warn(\n 'Invalid dimensions provided. Canceling updateDimensions operation.'\n );\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ updateDimensions: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the cross sectioning planes of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateCrossSectioning(\n payload: UpdateCrossSectioningPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a section plane is provided, verify it is valid\n const invalidSectionPlane = payload.crossSectioning?.sectionPlanes?.some(\n (plane) => {\n const validNormal =\n plane.normal != null && validateVector(plane.normal, true);\n const validOffset =\n plane.offset != null && validateNumber(plane.offset);\n\n return !validNormal || !validOffset;\n }\n );\n\n if (invalidSectionPlane) {\n console.warn(\n 'Invalid cross section plane provided. Canceling updateCrossSectioning operation.'\n );\n return Promise.resolve({});\n }\n\n return this.sendRequest({ updateCrossSectioning: payload }, withResponse);\n }\n\n /**\n * Sends a request to set or clear the model view of the frame.\n *\n * The payload accepts an optional `frameCorrelationId` that will be sent\n * back on the frame that is associated to this request. Use `onRequest` to\n * add a callback that'll be invoked when the server sends a request to draw\n * the frame.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public updateModelView(\n payload: UpdateModelViewPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ updateModelView: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform hit detection.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public hitItems(\n payload: HitItemsPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n // If a point is provided, verify it is valid\n if (payload.point != null) {\n const validPoint = validatePoint(payload.point);\n\n if (!validPoint) {\n console.warn('Invalid point provided. Canceling hitItems operation.');\n return Promise.resolve({});\n }\n }\n\n return this.sendRequest({ hitItems: payload }, withResponse);\n }\n\n /**\n * Sends a request to perform an alteration to a scene. Alterations include\n * changing item visibility and changing the materials of items.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public createSceneAlteration(\n payload: vertexvis.protobuf.stream.ICreateSceneAlterationPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ createSceneAlteration: payload }, withResponse);\n }\n\n /**\n * Sends a request to reset all overrides for a given scene and optionally to\n * reset the camera to that of the base scene.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The payload of the request.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public resetSceneView(\n payload: vertexvis.protobuf.stream.IResetViewPlayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ resetView: payload }, withResponse);\n }\n\n /**\n * Sends a request to tell the rendering pipeline that an interaction has\n * ended.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public endInteraction(\n payload: EndInteractionPayload = {},\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IBeginInteractionResult> {\n return this.sendRequest({ endInteraction: payload }, withResponse);\n }\n\n /**\n * Sends a request to sync the clocks between the client and server.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload.\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public syncTime(\n payload: SyncTimePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ syncTime: payload }, withResponse);\n }\n\n /**\n * Sends a request to record performance timings that were measured in the\n * client. The server may use these timings as hints to optimize the rendering\n * performance to provide a better experience.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload The request payload\n * @param withResponse Indicates if the server should reply with a response.\n * Defaults to `true`.\n */\n public recordPerformance(\n payload: RecordPerformancePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ recordPerformance: payload }, withResponse);\n }\n\n /**\n * Sends a request to update the current scene view with the state present\n * in the specified scene view state.\n *\n * Use `withResponse` to indicate if the server should reply with a response.\n * If `false`, the returned promise will complete immediately. Otherwise,\n * it'll complete when a response is received.\n *\n * @param payload\n * @param withResponse\n */\n public loadSceneViewState(\n payload: LoadSceneViewStatePayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ loadSceneViewState: payload }, withResponse);\n }\n\n /**\n * Sends a request to get a stencil buffer image for the current scene view.\n */\n public getStencilBuffer(\n payload: GetStencilBufferPayload,\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ getStencilBuffer: payload }, withResponse);\n }\n\n /**\n * Sends a request to retrieve a new token. This token can be used to\n * authenticate with other Vertex services.\n *\n * @param withResponse Indicates if the server should reply with a response.\n * @returns A promise that completes with the refreshed token.\n */\n public refreshToken(\n withResponse = true\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n return this.sendRequest({ refreshToken: {} }, withResponse);\n }\n\n /**\n * Acknowledges a successful request by sending a reply back to the server\n * with an optional result body.\n *\n * @param reqId The ID of the received request.\n * @param result A result to reply with.\n */\n public replyResult(reqId: string, result: ResponseResult): void {\n this.sendResponse({ requestId: { value: reqId }, ...result });\n }\n\n /**\n * Acknowledges a failed request by sending a reply back to the server.\n *\n * @param reqId The ID of the received request.\n * @param error An error to reply with.\n */\n public replyError(reqId: string, error: ResponseError): void {\n this.sendResponse({ requestId: { value: reqId }, error });\n }\n\n protected handleMessage(message: MessageEvent): void {\n const msg = decode(message.data);\n this.log('WS message received', msg);\n\n if (msg?.sentAtTime != null) {\n if (msg.response != null) {\n this.onResponseDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n response: msg.response,\n });\n }\n\n if (msg.request != null) {\n this.onRequestDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n request: msg.request,\n });\n }\n\n if (msg.event != null) {\n this.onEventDispatcher.emit({\n sentAtTime: msg.sentAtTime,\n event: msg.event,\n });\n }\n }\n }\n\n protected onResponse(handler: ResponseMessageHandler): Disposable {\n return this.onResponseDispatcher.on(handler);\n }\n\n protected log(msg: string, ...other: unknown[]): void {\n if (this.opts.loggingEnabled) {\n console.debug(msg, ...other);\n }\n }\n\n private sendRequest(\n req: vertexvis.protobuf.stream.IStreamRequest,\n withResponse: boolean\n ): Promise<vertexvis.protobuf.stream.IStreamResponse> {\n const sentAtTime = currentDateAsProtoTimestamp();\n if (withResponse) {\n const requestId = UUID.create();\n const request = { ...req, requestId: { value: requestId } };\n\n return new Promise((resolve, reject) => {\n const subscription = this.onResponse((msg) => {\n if (requestId === msg.response.requestId?.value) {\n if (msg.response.error == null) {\n resolve(msg.response);\n } else {\n const { message: summary, details } = msg.response.error;\n reject(\n new StreamRequestError(\n requestId,\n req,\n summary?.value,\n details?.value\n )\n );\n }\n subscription.dispose();\n }\n });\n this.sendMessage({ sentAtTime, request });\n });\n }\n this.sendMessage({ sentAtTime, request: req });\n return Promise.resolve({});\n }\n\n private sendMessage(msg: vertexvis.protobuf.stream.IStreamMessage): void {\n this.websocket.send(encode(msg));\n this.log('WS message sent', msg);\n }\n\n private sendResponse(\n response: vertexvis.protobuf.stream.IStreamResponse\n ): void {\n const sentAtTime = currentDateAsProtoTimestamp();\n this.websocket.send(encode({ sentAtTime, response }));\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n AnimationCompletedEvent,\n EventMessage,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ntype Event = vertexvis.protobuf.stream.IStreamEvent;\n\nfunction event(req: Event, meta?: Metadata): EventMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n event: {\n ...req,\n },\n ...meta,\n };\n}\n\nexport function animationCompleted(id: string): EventMessage {\n const def: AnimationCompletedEvent = {\n animationId: { hex: id },\n };\n return event({\n animationCompleted: {\n ...def,\n },\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n DrawFramePayload,\n GracefulReconnectPayload,\n RequestMessage,\n} from '../../types';\n\ntype Metadata = Partial<Pick<RequestMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ntype Request = RequestId &\n Payload<Omit<vertexvis.protobuf.stream.IStreamRequest, 'requestId'>>;\n\ninterface Payload<P> {\n payload?: P;\n}\n\ntype DrawFrameRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IDrawFramePayload>;\n\ntype GracefulReconnectRequest = RequestId &\n Payload<vertexvis.protobuf.stream.IGracefulReconnectionPayload>;\n\nfunction request(req: Request, meta?: Metadata): RequestMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n request: {\n requestId: req.requestId != null ? { value: req.requestId } : undefined,\n ...req.payload,\n },\n };\n}\n\nexport function drawFrame(\n req: DrawFrameRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: DrawFramePayload = {\n sequenceNumber: 1,\n sceneAttributes: {\n camera: {\n position: { x: 0, y: 0, z: 1 },\n lookAt: { x: 0, y: 0, z: 0 },\n up: { x: 0, y: 1, z: 0 },\n },\n visibleBoundingBox: {\n xmin: -1,\n ymin: -1,\n zmin: -1,\n xmax: 1,\n ymax: 1,\n zmax: 1,\n },\n crossSectioning: {\n sectionPlanes: [],\n },\n displayListSummary: {\n visibleSummary: {\n count: 100,\n },\n selectedVisibleSummary: {\n count: 0,\n },\n },\n },\n imageAttributes: {\n frameDimensions: { width: 200, height: 150 },\n imageRect: { x: 0, y: 0, width: 200, height: 150 },\n scaleFactor: 1,\n },\n frameCorrelationIds: ['123'],\n image: new Uint8Array(),\n };\n return request(\n {\n requestId: req.requestId,\n payload: { drawFrame: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n\nexport function gracefulReconnect(\n req: GracefulReconnectRequest = {},\n meta?: Metadata\n): RequestMessage {\n const def: GracefulReconnectPayload = {\n streamId: { hex: UUID.create() },\n timeToReconnectDuration: { seconds: 1, nanos: 0 },\n };\n return request(\n {\n requestId: req.requestId,\n payload: { gracefulReconnection: Objects.defaults(req.payload, def) },\n },\n meta\n );\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Objects, UUID } from '@vertexvis/utils';\n\nimport { RefreshTokenResult } from '../..';\nimport { currentDateAsProtoTimestamp } from '../../time';\nimport {\n LoadSceneViewStateResult,\n ReconnectResult,\n ResponseMessage,\n StartStreamResult,\n SyncTimeResult,\n} from '../../types';\n\ntype Metadata = Partial<Pick<ResponseMessage, 'sentAtTime'>>;\n\ninterface RequestId {\n requestId?: string;\n}\n\ninterface Result<T> {\n result?: T;\n}\n\ntype Response = RequestId &\n Result<Omit<vertexvis.protobuf.stream.IStreamResponse, 'requestId'>>;\n\ntype StartStreamResponse = RequestId &\n Result<vertexvis.protobuf.stream.IStartStreamResult>;\n\ntype SyncTimeResponse = RequestId &\n Result<vertexvis.protobuf.stream.ISyncTimeResult>;\n\ntype ReconnectResponse = RequestId &\n Result<vertexvis.protobuf.stream.IReconnectResult>;\n\ntype LoadSceneViewStateResponse = RequestId &\n Result<vertexvis.protobuf.stream.ILoadSceneViewStateResult>;\n\ntype RefreshTokenResponse = RequestId &\n Result<vertexvis.protobuf.stream.IRefreshTokenResult>;\n\nfunction response(res: Response, meta?: Metadata): ResponseMessage {\n return {\n sentAtTime: currentDateAsProtoTimestamp(),\n ...meta,\n response: {\n requestId: res.requestId != null ? { value: res.requestId } : undefined,\n ...res.result,\n },\n };\n}\n\nexport function startStream(\n res: StartStreamResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: StartStreamResult = {\n streamId: { hex: UUID.create() },\n sceneId: { hex: UUID.create() },\n sceneViewId: { hex: UUID.create() },\n sessionId: { hex: UUID.create() },\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n worldOrientation: {\n front: { x: 0, y: 0, z: 1 },\n up: { x: 0, y: 1, z: 0 },\n },\n };\n return response(\n {\n requestId: res.requestId,\n result: { startStream: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function syncTime(\n res: SyncTimeResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: SyncTimeResult = { replyTime: { seconds: 1, nanos: 0 } };\n return response({\n requestId: res.requestId,\n result: { syncTime: Objects.defaults(res.result, def) },\n });\n}\n\nexport function reconnect(\n res: ReconnectResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: ReconnectResult = {\n jwt: 'jwt',\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { reconnect: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function loadSceneViewState(\n res: LoadSceneViewStateResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: LoadSceneViewStateResult = {};\n return response(\n {\n requestId: res.requestId,\n result: { loadSceneViewState: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n\nexport function refreshToken(\n res: RefreshTokenResponse = {},\n meta?: Metadata\n): ResponseMessage {\n const def: RefreshTokenResult = {\n token: { token: 'token', expiresIn: new Date().getTime() + 10000 },\n };\n return response(\n {\n requestId: res.requestId,\n result: { refreshToken: Objects.defaults(res.result, def) },\n },\n meta\n );\n}\n","import { Disposable } from '@vertexvis/utils';\n\nimport { ConnectionDescriptor } from '../connection';\nimport {\n CloseHandler,\n MessageHandler,\n WebSocketClient,\n WebSocketSendData,\n} from '../webSocketClient';\n\nexport class WebSocketClientMock implements WebSocketClient {\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n }\n\n public connect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n public onClose(handler: CloseHandler): Disposable {\n this.closeHandlers.add(handler);\n return { dispose: () => this.closeHandlers.delete(handler) };\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n this.msgHandlers.add(handler);\n return { dispose: () => this.msgHandlers.delete(handler) };\n }\n\n public send(data: WebSocketSendData): void {\n this.sentMessages.push(data);\n }\n\n public reconnect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Simulates a websocket message that was sent by the server and received by\n * the client.\n *\n * @param data The websocket message data.\n */\n public receiveMessage(data: WebSocketSendData): void {\n this.msgHandlers.forEach((handler) =>\n handler(new MessageEvent('message', { data }))\n );\n }\n\n /**\n * Resets the internal state of the mock by clearing any accrued sent messages\n * and removing all handlers.\n */\n public reset(): void {\n this.sentMessages = [];\n this.msgHandlers.clear();\n this.closeHandlers.clear();\n }\n\n /**\n * Returns `true` if there are remaining sent messages..\n */\n public hasNextSent(): boolean {\n return this.sentMessages.length > 0;\n }\n\n /**\n * Decodes and returns the next message that was sent on this websocket.\n *\n * @example\n *\n * const ws = new WebSocketClientMock();\n * const decoder = str => parseInt(str)\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(decoder); // 1\n * ws.nextSent(decoder); // 2\n *\n * @param decoder A function to decode a message.\n */\n public nextSent<T>(decoder: (data: WebSocketSendData) => T): T;\n\n /**\n * Returns the next message that was sent on this websocket.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(); // \"1\"\n * ws.nextSent(); // \"2\"\n * ```\n */\n public nextSent(): WebSocketSendData;\n public nextSent<T>(\n decoder?: (data: WebSocketSendData) => T\n ): T | WebSocketSendData {\n const next = this.sentMessages.shift();\n if (next != null) {\n if (decoder != null) {\n return decoder(next);\n } else {\n return next;\n }\n } else {\n throw new Error('Sent messages is empty');\n }\n }\n\n /**\n * Skips the next N sent messages.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n * ws.send(\"3\");\n *\n * ws.skipSent(2);\n * ws.nextSent(); // \"3\"\n * ```\n *\n * @param n The number of sent messages to skip over.\n */\n public skipSent(n = 1): this {\n if (n <= this.sentMessages.length) {\n for (let i = 0; i < n; i++) {\n this.nextSent();\n }\n } else {\n throw new Error(\n `Cannot skip the next ${n} messages. Sent message queue only has ${this.sentMessages.length} messages.`\n );\n }\n return this;\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertexvis/stream-api",
3
- "version": "1.0.2-canary.0",
3
+ "version": "1.0.2-canary.1",
4
4
  "description": "A websocket client for interacting with Vertex's stream API.",
5
5
  "license": "MIT",
6
6
  "author": "Vertex Developers <support@vertex3d.com> (https://developer.vertex3d.com)",
@@ -52,14 +52,14 @@
52
52
  "@types/jest": "^29.5.14",
53
53
  "@vertexvis/eslint-config-vertexvis-typescript": "^0.5.0",
54
54
  "@vertexvis/jest-config-vertexvis": "^0.5.4",
55
- "@vertexvis/utils": "1.0.2-canary.0",
56
- "@vertexwebsdk/build": "1.0.2-canary.0",
55
+ "@vertexvis/utils": "1.0.2-canary.1",
56
+ "@vertexwebsdk/build": "1.0.2-canary.1",
57
57
  "eslint": "^8.57.1",
58
58
  "jest": "^29.5.14",
59
59
  "jest-cli": "^29.5.14",
60
60
  "jest-environment-jsdom": "^29.7.0",
61
61
  "protobufjs": "^7.5.4",
62
- "rollup": "^2.80.0",
62
+ "rollup": "^4.62.2",
63
63
  "ts-jest": "^29.4.11",
64
64
  "tslib": "^2.4.0",
65
65
  "typescript": "^5.2.0"
@@ -69,5 +69,5 @@
69
69
  "protobufjs": ">=6.9.0 <8.0.0",
70
70
  "tslib": ">=2.4.0"
71
71
  },
72
- "gitHead": "b8c4518d4d807883a29bf9cfec928a1e1c4d0457"
72
+ "gitHead": "a0204c75eba947bd16592999dc0da87714085ecf"
73
73
  }