@vertexvis/stream-api 1.0.0-testing.4 → 1.0.0-testing.5
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.
|
@@ -0,0 +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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"}
|
|
@@ -1077,4 +1077,4 @@ class WebSocketClientMock {
|
|
|
1077
1077
|
}
|
|
1078
1078
|
|
|
1079
1079
|
export { index as Fixtures, StreamApi, StreamRequestError, WebSocketClientImpl, WebSocketClientMock, appendSettingsToUrl, currentDateAsProtoTimestamp, decode, encode, protoToDate, toProtoDuration, toProtoTimestamp };
|
|
1080
|
-
//# sourceMappingURL=bundle.
|
|
1080
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vertexvis/stream-api",
|
|
3
|
-
"version": "1.0.0-testing.
|
|
3
|
+
"version": "1.0.0-testing.5",
|
|
4
4
|
"description": "A websocket client for interacting with Vertex's stream API.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Vertex Developers <support@vertexvis.com> (https://developer.vertexvis.com)",
|
|
@@ -12,9 +12,18 @@
|
|
|
12
12
|
"bugs": {
|
|
13
13
|
"url": "https://github.com/Vertexvis/vertex-web-sdk/issues"
|
|
14
14
|
},
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/bundle.cjs",
|
|
17
|
+
"module": "./dist/bundle.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/bundle.js",
|
|
23
|
+
"require": "./dist/bundle.cjs",
|
|
24
|
+
"default": "./dist/bundle.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
18
27
|
"publishConfig": {
|
|
19
28
|
"registry": "https://registry.npmjs.org",
|
|
20
29
|
"access": "public"
|
|
@@ -43,8 +52,8 @@
|
|
|
43
52
|
"@types/jest": "^29.5.14",
|
|
44
53
|
"@vertexvis/eslint-config-vertexvis-typescript": "^0.5.0",
|
|
45
54
|
"@vertexvis/jest-config-vertexvis": "^0.5.4",
|
|
46
|
-
"@vertexvis/utils": "1.0.0-testing.
|
|
47
|
-
"@vertexwebsdk/build": "1.0.0-testing.
|
|
55
|
+
"@vertexvis/utils": "1.0.0-testing.5",
|
|
56
|
+
"@vertexwebsdk/build": "1.0.0-testing.5",
|
|
48
57
|
"eslint": "^8.57.1",
|
|
49
58
|
"jest": "^29.5.14",
|
|
50
59
|
"jest-cli": "^29.5.14",
|
|
@@ -60,5 +69,5 @@
|
|
|
60
69
|
"protobufjs": ">=6.9.0 <8.0.0",
|
|
61
70
|
"tslib": ">=2.4.0"
|
|
62
71
|
},
|
|
63
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "a3800248a7642a91abff0f4e6a5fd53b2f05d05a"
|
|
64
73
|
}
|
package/dist/bundle.cjs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.cjs.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":["vertexvis","Uri","Objects","google","EventDispatcher","UUID"],"mappings":"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"}
|
package/dist/bundle.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.esm.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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"}
|