@vertexvis/stream-api 1.1.3-canary.0 → 1.1.3-canary.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.cjs CHANGED
@@ -168,8 +168,8 @@ function validateOrthographicCamera(camera) {
168
168
  validateVector(camera.up, true));
169
169
  }
170
170
  function validateDimensions(dimensions) {
171
- return (validatePositiveNumber(dimensions === null || dimensions === void 0 ? void 0 : dimensions.height) &&
172
- validatePositiveNumber(dimensions === null || dimensions === void 0 ? void 0 : dimensions.width));
171
+ return (validatePositiveNumber(dimensions?.height) &&
172
+ validatePositiveNumber(dimensions?.width));
173
173
  }
174
174
  function validateNumber(number) {
175
175
  return typeof number === 'number' && Number.isFinite(number);
@@ -183,7 +183,7 @@ function validateFovY(number: number | null | undefined): boolean {
183
183
  }
184
184
  */
185
185
  function validatePoint(point) {
186
- return validateNumber(point === null || point === void 0 ? void 0 : point.x) && validateNumber(point === null || point === void 0 ? void 0 : point.y);
186
+ return validateNumber(point?.x) && validateNumber(point?.y);
187
187
  }
188
188
  function validateVector(vector, verifyNonZeroLength) {
189
189
  if (vector == null) {
@@ -259,12 +259,22 @@ class WebSocketClientImpl {
259
259
  }
260
260
  send(data) {
261
261
  if (this.webSocket != null) {
262
+ if (typeof SharedArrayBuffer !== 'undefined') {
263
+ if (data instanceof SharedArrayBuffer) {
264
+ this.webSocket.send(new Uint8Array(data).slice());
265
+ return;
266
+ }
267
+ if (ArrayBuffer.isView(data) &&
268
+ data.buffer instanceof SharedArrayBuffer) {
269
+ this.webSocket.send(new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice());
270
+ return;
271
+ }
272
+ }
262
273
  this.webSocket.send(data);
263
274
  }
264
275
  }
265
276
  removeWebSocketListeners(webSocketId) {
266
- var _a;
267
- (_a = this.listeners[webSocketId]) === null || _a === void 0 ? void 0 : _a.dispose();
277
+ this.listeners[webSocketId]?.dispose();
268
278
  }
269
279
  onOpen(resolve) {
270
280
  resolve();
@@ -276,13 +286,12 @@ class WebSocketClientImpl {
276
286
  */
277
287
  class StreamApi {
278
288
  constructor(websocket = new WebSocketClientImpl(), opts = {}) {
279
- var _a;
280
289
  this.websocket = websocket;
281
290
  this.onResponseDispatcher = new utils.EventDispatcher();
282
291
  this.onRequestDispatcher = new utils.EventDispatcher();
283
292
  this.onEventDispatcher = new utils.EventDispatcher();
284
293
  this.opts = {
285
- loggingEnabled: (_a = opts.loggingEnabled) !== null && _a !== void 0 ? _a : false,
294
+ loggingEnabled: opts.loggingEnabled ?? false,
286
295
  };
287
296
  }
288
297
  /**
@@ -309,9 +318,8 @@ class StreamApi {
309
318
  * Closes any open WS connections and disposes of resources.
310
319
  */
311
320
  dispose() {
312
- var _a;
313
321
  this.websocket.close();
314
- (_a = this.messageSubscription) === null || _a === void 0 ? void 0 : _a.dispose();
322
+ this.messageSubscription?.dispose();
315
323
  }
316
324
  /**
317
325
  * Adds a callback that is invoked when the client receives a request from the
@@ -525,9 +533,8 @@ class StreamApi {
525
533
  * Defaults to `true`.
526
534
  */
527
535
  updateCrossSectioning(payload, withResponse = true) {
528
- var _a, _b;
529
536
  // If a section plane is provided, verify it is valid
530
- const invalidSectionPlane = (_b = (_a = payload.crossSectioning) === null || _a === void 0 ? void 0 : _a.sectionPlanes) === null || _b === void 0 ? void 0 : _b.some((plane) => {
537
+ const invalidSectionPlane = payload.crossSectioning?.sectionPlanes?.some((plane) => {
531
538
  const validNormal = plane.normal != null && validateVector(plane.normal, true);
532
539
  const validOffset = plane.offset != null && validateNumber(plane.offset);
533
540
  return !validNormal || !validOffset;
@@ -705,7 +712,7 @@ class StreamApi {
705
712
  handleMessage(message) {
706
713
  const msg = decode(message.data);
707
714
  this.log('WS message received', msg);
708
- if ((msg === null || msg === void 0 ? void 0 : msg.sentAtTime) != null) {
715
+ if (msg?.sentAtTime != null) {
709
716
  if (msg.response != null) {
710
717
  this.onResponseDispatcher.emit({
711
718
  sentAtTime: msg.sentAtTime,
@@ -741,14 +748,13 @@ class StreamApi {
741
748
  const request = { ...req, requestId: { value: requestId } };
742
749
  return new Promise((resolve, reject) => {
743
750
  const subscription = this.onResponse((msg) => {
744
- var _a;
745
- if (requestId === ((_a = msg.response.requestId) === null || _a === void 0 ? void 0 : _a.value)) {
751
+ if (requestId === msg.response.requestId?.value) {
746
752
  if (msg.response.error == null) {
747
753
  resolve(msg.response);
748
754
  }
749
755
  else {
750
756
  const { message: summary, details } = msg.response.error;
751
- reject(new StreamRequestError(requestId, req, summary === null || summary === void 0 ? void 0 : summary.value, details === null || details === void 0 ? void 0 : details.value));
757
+ reject(new StreamRequestError(requestId, req, summary?.value, details?.value));
752
758
  }
753
759
  subscription.dispose();
754
760
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.cjs","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage,\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array,\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined,\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed',\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: Array<ParamsBuilder<S>>\n): ParamsBuilder<S> {\n return (settings) =>\n Object.assign({}, ...definitions.map((def) => def(settings)));\n}\n\ntype KeysOfType<S, V> = {\n [K in keyof S]-?: NonNullable<S[K]> extends V ? K : never;\n}[keyof S];\n\nfunction transformValue<T, R>({\n guard,\n transform,\n}: {\n guard: (v: unknown) => v is T;\n transform: (v: T) => R;\n}): (v: unknown) => R | undefined {\n return (v) => (guard(v) ? transform(v) : undefined);\n}\n\nexport function defineBoolean<\n S,\n P extends KeysOfType<S, boolean> = KeysOfType<S, boolean>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'boolean',\n transform: (v) => (v ? 'on' : 'off'),\n }),\n );\n}\n\nexport function defineNumber<\n S,\n P extends KeysOfType<S, number> = KeysOfType<S, number>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'number',\n transform: (v) => v.toString(),\n }),\n );\n}\n\nexport function defineString<\n S,\n P extends KeysOfType<S, string> = KeysOfType<S, string>,\n>(param: string, prop: P): 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';\nimport Long from 'long';\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/**\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'\n ? time.seconds\n : Long.fromValue(time.seconds).toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\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 return (\n boundingBox != null &&\n validateNumber(boundingBox.xmax) &&\n validateNumber(boundingBox.xmin) &&\n validateNumber(boundingBox.ymax) &&\n validateNumber(boundingBox.ymin) &&\n validateNumber(boundingBox.zmax) &&\n validateNumber(boundingBox.zmin)\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 return (\n validateVector(camera.lookAt, false) &&\n validateVector(camera.position, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera,\n): boolean {\n return (\n validatePositiveNumber(camera.fovHeight) &&\n validateVector(camera.lookAt, false) &&\n validateVector(camera.viewVector, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions,\n): boolean {\n return (\n validatePositiveNumber(dimensions?.height) &&\n validatePositiveNumber(dimensions?.width)\n );\n}\n\nexport function validateNumber(\n number: number | null | undefined,\n): number is number {\n return typeof number === 'number' && Number.isFinite(number);\n}\n\nfunction validatePositiveNumber(number: number | null | undefined): boolean {\n return validateNumber(number) && number > 0;\n}\n\n/*\nfunction validateFovY(number: number | null | undefined): boolean {\n return validateNumber(number) && number >= 1 && number <= 179;\n}\n*/\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint | null | undefined,\n): boolean {\n return validateNumber(point?.x) && validateNumber(point?.y);\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f | null | undefined,\n verifyNonZeroLength: boolean,\n): boolean {\n if (vector == null) {\n return false;\n }\n const { x, y, z } = vector;\n const vectorComponentsValid =\n validateNumber(x) && validateNumber(y) && validateNumber(z);\n\n if (verifyNonZeroLength) {\n if (!vectorComponentsValid) {\n return false;\n }\n\n const vectorMagnitudeSquared = x * x + y * y + z * z;\n return vectorMagnitudeSquared !== 0;\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 | ArrayBufferLike | Blob | 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: 3600 },\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: 3600 },\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: 3600 },\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 closing = false;\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n if (this.closing) return;\n this.closing = true;\n try {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n } finally {\n this.closing = false;\n }\n }\n\n public connect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n public onClose(handler: CloseHandler): Disposable {\n this.closeHandlers.add(handler);\n return { dispose: () => this.closeHandlers.delete(handler) };\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n this.msgHandlers.add(handler);\n return { dispose: () => this.msgHandlers.delete(handler) };\n }\n\n public send(data: WebSocketSendData): void {\n this.sentMessages.push(data);\n }\n\n public reconnect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Simulates a websocket message that was sent by the server and received by\n * the client.\n *\n * @param data The websocket message data.\n */\n public receiveMessage(data: WebSocketSendData): void {\n this.msgHandlers.forEach((handler) =>\n handler(new MessageEvent('message', { data })),\n );\n }\n\n /**\n * Resets the internal state of the mock by clearing any accrued sent messages\n * and removing all handlers.\n */\n public reset(): void {\n this.sentMessages = [];\n this.msgHandlers.clear();\n this.closeHandlers.clear();\n }\n\n /**\n * Returns `true` if there are remaining sent messages..\n */\n public hasNextSent(): boolean {\n return this.sentMessages.length > 0;\n }\n\n /**\n * Decodes and returns the next message that was sent on this websocket.\n *\n * @example\n *\n * const ws = new WebSocketClientMock();\n * const decoder = str => parseInt(str)\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(decoder); // 1\n * ws.nextSent(decoder); // 2\n *\n * @param decoder A function to decode a message.\n */\n public nextSent<T>(decoder: (data: WebSocketSendData) => T): T;\n\n /**\n * Returns the next message that was sent on this websocket.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(); // \"1\"\n * ws.nextSent(); // \"2\"\n * ```\n */\n public nextSent(): WebSocketSendData;\n public nextSent<T>(\n decoder?: (data: WebSocketSendData) => T,\n ): T | WebSocketSendData {\n const next = this.sentMessages.shift();\n if (next != null) {\n if (decoder != null) {\n return decoder(next);\n } else {\n return next;\n }\n } else {\n throw new Error('Sent messages is empty');\n }\n }\n\n /**\n * Skips the next N sent messages.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n * ws.send(\"3\");\n *\n * ws.skipSent(2);\n * ws.nextSent(); // \"3\"\n * ```\n *\n * @param n The number of sent messages to skip over.\n */\n public skipSent(n = 1): this {\n if (n <= this.sentMessages.length) {\n for (let i = 0; i < n; i++) {\n this.nextSent();\n }\n } else {\n throw new Error(\n `Cannot skip the next ${n} messages. Sent message queue only has ${this.sentMessages.length} messages.`,\n );\n }\n return this;\n }\n}\n"],"names":["vertexvis","Uri","Objects","google","EventDispatcher","UUID"],"mappings":"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"}
1
+ {"version":3,"file":"bundle.cjs","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage,\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array,\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined,\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed',\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: Array<ParamsBuilder<S>>\n): ParamsBuilder<S> {\n return (settings) =>\n Object.assign({}, ...definitions.map((def) => def(settings)));\n}\n\ntype KeysOfType<S, V> = {\n [K in keyof S]-?: NonNullable<S[K]> extends V ? K : never;\n}[keyof S];\n\nfunction transformValue<T, R>({\n guard,\n transform,\n}: {\n guard: (v: unknown) => v is T;\n transform: (v: T) => R;\n}): (v: unknown) => R | undefined {\n return (v) => (guard(v) ? transform(v) : undefined);\n}\n\nexport function defineBoolean<\n S,\n P extends KeysOfType<S, boolean> = KeysOfType<S, boolean>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'boolean',\n transform: (v) => (v ? 'on' : 'off'),\n }),\n );\n}\n\nexport function defineNumber<\n S,\n P extends KeysOfType<S, number> = KeysOfType<S, number>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'number',\n transform: (v) => v.toString(),\n }),\n );\n}\n\nexport function defineString<\n S,\n P extends KeysOfType<S, string> = KeysOfType<S, string>,\n>(param: string, prop: P): 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';\nimport Long from 'long';\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/**\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'\n ? time.seconds\n : Long.fromValue(time.seconds).toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\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 return (\n boundingBox != null &&\n validateNumber(boundingBox.xmax) &&\n validateNumber(boundingBox.xmin) &&\n validateNumber(boundingBox.ymax) &&\n validateNumber(boundingBox.ymin) &&\n validateNumber(boundingBox.zmax) &&\n validateNumber(boundingBox.zmin)\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 return (\n validateVector(camera.lookAt, false) &&\n validateVector(camera.position, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera,\n): boolean {\n return (\n validatePositiveNumber(camera.fovHeight) &&\n validateVector(camera.lookAt, false) &&\n validateVector(camera.viewVector, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions,\n): boolean {\n return (\n validatePositiveNumber(dimensions?.height) &&\n validatePositiveNumber(dimensions?.width)\n );\n}\n\nexport function validateNumber(\n number: number | null | undefined,\n): number is number {\n return typeof number === 'number' && Number.isFinite(number);\n}\n\nfunction validatePositiveNumber(number: number | null | undefined): boolean {\n return validateNumber(number) && number > 0;\n}\n\n/*\nfunction validateFovY(number: number | null | undefined): boolean {\n return validateNumber(number) && number >= 1 && number <= 179;\n}\n*/\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint | null | undefined,\n): boolean {\n return validateNumber(point?.x) && validateNumber(point?.y);\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f | null | undefined,\n verifyNonZeroLength: boolean,\n): boolean {\n if (vector == null) {\n return false;\n }\n const { x, y, z } = vector;\n const vectorComponentsValid =\n validateNumber(x) && validateNumber(y) && validateNumber(z);\n\n if (verifyNonZeroLength) {\n if (!vectorComponentsValid) {\n return false;\n }\n\n const vectorMagnitudeSquared = x * x + y * y + z * z;\n return vectorMagnitudeSquared !== 0;\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 | ArrayBufferLike | Blob | 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 if (typeof SharedArrayBuffer !== 'undefined') {\n if (data instanceof SharedArrayBuffer) {\n this.webSocket.send(new Uint8Array(data).slice());\n return;\n }\n\n if (\n ArrayBuffer.isView(data) &&\n data.buffer instanceof SharedArrayBuffer\n ) {\n this.webSocket.send(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ).slice(),\n );\n return;\n }\n }\n\n this.webSocket.send(data as string | Blob | BufferSource);\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: 3600 },\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: 3600 },\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: 3600 },\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 closing = false;\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n if (this.closing) return;\n this.closing = true;\n try {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n } finally {\n this.closing = false;\n }\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.js CHANGED
@@ -166,8 +166,8 @@ function validateOrthographicCamera(camera) {
166
166
  validateVector(camera.up, true));
167
167
  }
168
168
  function validateDimensions(dimensions) {
169
- return (validatePositiveNumber(dimensions === null || dimensions === void 0 ? void 0 : dimensions.height) &&
170
- validatePositiveNumber(dimensions === null || dimensions === void 0 ? void 0 : dimensions.width));
169
+ return (validatePositiveNumber(dimensions?.height) &&
170
+ validatePositiveNumber(dimensions?.width));
171
171
  }
172
172
  function validateNumber(number) {
173
173
  return typeof number === 'number' && Number.isFinite(number);
@@ -181,7 +181,7 @@ function validateFovY(number: number | null | undefined): boolean {
181
181
  }
182
182
  */
183
183
  function validatePoint(point) {
184
- return validateNumber(point === null || point === void 0 ? void 0 : point.x) && validateNumber(point === null || point === void 0 ? void 0 : point.y);
184
+ return validateNumber(point?.x) && validateNumber(point?.y);
185
185
  }
186
186
  function validateVector(vector, verifyNonZeroLength) {
187
187
  if (vector == null) {
@@ -257,12 +257,22 @@ class WebSocketClientImpl {
257
257
  }
258
258
  send(data) {
259
259
  if (this.webSocket != null) {
260
+ if (typeof SharedArrayBuffer !== 'undefined') {
261
+ if (data instanceof SharedArrayBuffer) {
262
+ this.webSocket.send(new Uint8Array(data).slice());
263
+ return;
264
+ }
265
+ if (ArrayBuffer.isView(data) &&
266
+ data.buffer instanceof SharedArrayBuffer) {
267
+ this.webSocket.send(new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice());
268
+ return;
269
+ }
270
+ }
260
271
  this.webSocket.send(data);
261
272
  }
262
273
  }
263
274
  removeWebSocketListeners(webSocketId) {
264
- var _a;
265
- (_a = this.listeners[webSocketId]) === null || _a === void 0 ? void 0 : _a.dispose();
275
+ this.listeners[webSocketId]?.dispose();
266
276
  }
267
277
  onOpen(resolve) {
268
278
  resolve();
@@ -274,13 +284,12 @@ class WebSocketClientImpl {
274
284
  */
275
285
  class StreamApi {
276
286
  constructor(websocket = new WebSocketClientImpl(), opts = {}) {
277
- var _a;
278
287
  this.websocket = websocket;
279
288
  this.onResponseDispatcher = new EventDispatcher();
280
289
  this.onRequestDispatcher = new EventDispatcher();
281
290
  this.onEventDispatcher = new EventDispatcher();
282
291
  this.opts = {
283
- loggingEnabled: (_a = opts.loggingEnabled) !== null && _a !== void 0 ? _a : false,
292
+ loggingEnabled: opts.loggingEnabled ?? false,
284
293
  };
285
294
  }
286
295
  /**
@@ -307,9 +316,8 @@ class StreamApi {
307
316
  * Closes any open WS connections and disposes of resources.
308
317
  */
309
318
  dispose() {
310
- var _a;
311
319
  this.websocket.close();
312
- (_a = this.messageSubscription) === null || _a === void 0 ? void 0 : _a.dispose();
320
+ this.messageSubscription?.dispose();
313
321
  }
314
322
  /**
315
323
  * Adds a callback that is invoked when the client receives a request from the
@@ -523,9 +531,8 @@ class StreamApi {
523
531
  * Defaults to `true`.
524
532
  */
525
533
  updateCrossSectioning(payload, withResponse = true) {
526
- var _a, _b;
527
534
  // If a section plane is provided, verify it is valid
528
- const invalidSectionPlane = (_b = (_a = payload.crossSectioning) === null || _a === void 0 ? void 0 : _a.sectionPlanes) === null || _b === void 0 ? void 0 : _b.some((plane) => {
535
+ const invalidSectionPlane = payload.crossSectioning?.sectionPlanes?.some((plane) => {
529
536
  const validNormal = plane.normal != null && validateVector(plane.normal, true);
530
537
  const validOffset = plane.offset != null && validateNumber(plane.offset);
531
538
  return !validNormal || !validOffset;
@@ -703,7 +710,7 @@ class StreamApi {
703
710
  handleMessage(message) {
704
711
  const msg = decode(message.data);
705
712
  this.log('WS message received', msg);
706
- if ((msg === null || msg === void 0 ? void 0 : msg.sentAtTime) != null) {
713
+ if (msg?.sentAtTime != null) {
707
714
  if (msg.response != null) {
708
715
  this.onResponseDispatcher.emit({
709
716
  sentAtTime: msg.sentAtTime,
@@ -739,14 +746,13 @@ class StreamApi {
739
746
  const request = { ...req, requestId: { value: requestId } };
740
747
  return new Promise((resolve, reject) => {
741
748
  const subscription = this.onResponse((msg) => {
742
- var _a;
743
- if (requestId === ((_a = msg.response.requestId) === null || _a === void 0 ? void 0 : _a.value)) {
749
+ if (requestId === msg.response.requestId?.value) {
744
750
  if (msg.response.error == null) {
745
751
  resolve(msg.response);
746
752
  }
747
753
  else {
748
754
  const { message: summary, details } = msg.response.error;
749
- reject(new StreamRequestError(requestId, req, summary === null || summary === void 0 ? void 0 : summary.value, details === null || details === void 0 ? void 0 : details.value));
755
+ reject(new StreamRequestError(requestId, req, summary?.value, details?.value));
750
756
  }
751
757
  subscription.dispose();
752
758
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage,\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array,\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined,\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed',\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: Array<ParamsBuilder<S>>\n): ParamsBuilder<S> {\n return (settings) =>\n Object.assign({}, ...definitions.map((def) => def(settings)));\n}\n\ntype KeysOfType<S, V> = {\n [K in keyof S]-?: NonNullable<S[K]> extends V ? K : never;\n}[keyof S];\n\nfunction transformValue<T, R>({\n guard,\n transform,\n}: {\n guard: (v: unknown) => v is T;\n transform: (v: T) => R;\n}): (v: unknown) => R | undefined {\n return (v) => (guard(v) ? transform(v) : undefined);\n}\n\nexport function defineBoolean<\n S,\n P extends KeysOfType<S, boolean> = KeysOfType<S, boolean>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'boolean',\n transform: (v) => (v ? 'on' : 'off'),\n }),\n );\n}\n\nexport function defineNumber<\n S,\n P extends KeysOfType<S, number> = KeysOfType<S, number>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'number',\n transform: (v) => v.toString(),\n }),\n );\n}\n\nexport function defineString<\n S,\n P extends KeysOfType<S, string> = KeysOfType<S, string>,\n>(param: string, prop: P): 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';\nimport Long from 'long';\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/**\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'\n ? time.seconds\n : Long.fromValue(time.seconds).toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\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 return (\n boundingBox != null &&\n validateNumber(boundingBox.xmax) &&\n validateNumber(boundingBox.xmin) &&\n validateNumber(boundingBox.ymax) &&\n validateNumber(boundingBox.ymin) &&\n validateNumber(boundingBox.zmax) &&\n validateNumber(boundingBox.zmin)\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 return (\n validateVector(camera.lookAt, false) &&\n validateVector(camera.position, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera,\n): boolean {\n return (\n validatePositiveNumber(camera.fovHeight) &&\n validateVector(camera.lookAt, false) &&\n validateVector(camera.viewVector, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions,\n): boolean {\n return (\n validatePositiveNumber(dimensions?.height) &&\n validatePositiveNumber(dimensions?.width)\n );\n}\n\nexport function validateNumber(\n number: number | null | undefined,\n): number is number {\n return typeof number === 'number' && Number.isFinite(number);\n}\n\nfunction validatePositiveNumber(number: number | null | undefined): boolean {\n return validateNumber(number) && number > 0;\n}\n\n/*\nfunction validateFovY(number: number | null | undefined): boolean {\n return validateNumber(number) && number >= 1 && number <= 179;\n}\n*/\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint | null | undefined,\n): boolean {\n return validateNumber(point?.x) && validateNumber(point?.y);\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f | null | undefined,\n verifyNonZeroLength: boolean,\n): boolean {\n if (vector == null) {\n return false;\n }\n const { x, y, z } = vector;\n const vectorComponentsValid =\n validateNumber(x) && validateNumber(y) && validateNumber(z);\n\n if (verifyNonZeroLength) {\n if (!vectorComponentsValid) {\n return false;\n }\n\n const vectorMagnitudeSquared = x * x + y * y + z * z;\n return vectorMagnitudeSquared !== 0;\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 | ArrayBufferLike | Blob | 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: 3600 },\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: 3600 },\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: 3600 },\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 closing = false;\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n if (this.closing) return;\n this.closing = true;\n try {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n } finally {\n this.closing = false;\n }\n }\n\n public connect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n public onClose(handler: CloseHandler): Disposable {\n this.closeHandlers.add(handler);\n return { dispose: () => this.closeHandlers.delete(handler) };\n }\n\n public onMessage(handler: MessageHandler): Disposable {\n this.msgHandlers.add(handler);\n return { dispose: () => this.msgHandlers.delete(handler) };\n }\n\n public send(data: WebSocketSendData): void {\n this.sentMessages.push(data);\n }\n\n public reconnect(descriptor: ConnectionDescriptor): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Simulates a websocket message that was sent by the server and received by\n * the client.\n *\n * @param data The websocket message data.\n */\n public receiveMessage(data: WebSocketSendData): void {\n this.msgHandlers.forEach((handler) =>\n handler(new MessageEvent('message', { data })),\n );\n }\n\n /**\n * Resets the internal state of the mock by clearing any accrued sent messages\n * and removing all handlers.\n */\n public reset(): void {\n this.sentMessages = [];\n this.msgHandlers.clear();\n this.closeHandlers.clear();\n }\n\n /**\n * Returns `true` if there are remaining sent messages..\n */\n public hasNextSent(): boolean {\n return this.sentMessages.length > 0;\n }\n\n /**\n * Decodes and returns the next message that was sent on this websocket.\n *\n * @example\n *\n * const ws = new WebSocketClientMock();\n * const decoder = str => parseInt(str)\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(decoder); // 1\n * ws.nextSent(decoder); // 2\n *\n * @param decoder A function to decode a message.\n */\n public nextSent<T>(decoder: (data: WebSocketSendData) => T): T;\n\n /**\n * Returns the next message that was sent on this websocket.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n *\n * ws.nextSent(); // \"1\"\n * ws.nextSent(); // \"2\"\n * ```\n */\n public nextSent(): WebSocketSendData;\n public nextSent<T>(\n decoder?: (data: WebSocketSendData) => T,\n ): T | WebSocketSendData {\n const next = this.sentMessages.shift();\n if (next != null) {\n if (decoder != null) {\n return decoder(next);\n } else {\n return next;\n }\n } else {\n throw new Error('Sent messages is empty');\n }\n }\n\n /**\n * Skips the next N sent messages.\n *\n * @example\n * ```\n * const ws = new WebSocketClientMock();\n * ws.send(\"1\");\n * ws.send(\"2\");\n * ws.send(\"3\");\n *\n * ws.skipSent(2);\n * ws.nextSent(); // \"3\"\n * ```\n *\n * @param n The number of sent messages to skip over.\n */\n public skipSent(n = 1): this {\n if (n <= this.sentMessages.length) {\n for (let i = 0; i < n; i++) {\n this.nextSent();\n }\n } else {\n throw new Error(\n `Cannot skip the next ${n} messages. Sent message queue only has ${this.sentMessages.length} messages.`,\n );\n }\n return this;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundle.js","sources":["../src/encoder.ts","../src/errors.ts","../src/paramsBuilder.ts","../src/settings.ts","../src/time.ts","../src/validators.ts","../src/webSocketClient.ts","../src/streamApi.ts","../src/testing/fixtures/events.ts","../src/testing/fixtures/requests.ts","../src/testing/fixtures/responses.ts","../src/testing/webSocketClientMock.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport function encode(\n message: vertexvis.protobuf.stream.IStreamMessage,\n): Uint8Array {\n return vertexvis.protobuf.stream.StreamMessage.encode(message).finish();\n}\n\nexport function decode(\n bufferOrBytes: ArrayBuffer | Uint8Array,\n): vertexvis.protobuf.stream.IStreamMessage {\n const bytes =\n bufferOrBytes instanceof ArrayBuffer\n ? new Uint8Array(bufferOrBytes)\n : bufferOrBytes;\n const message = vertexvis.protobuf.stream.StreamMessage.decode(bytes);\n return vertexvis.protobuf.stream.StreamMessage.toObject(message, {\n defaults: true,\n });\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nexport class StreamRequestError extends Error {\n public constructor(\n public readonly requestId: string,\n public readonly requestPayload: vertexvis.protobuf.stream.IStreamRequest,\n public readonly summary: string | null | undefined,\n public readonly details: string | null | undefined,\n ) {\n super(\n summary != null && summary.length > 0\n ? `Stream request failed (${summary})`\n : 'Stream request failed',\n );\n\n // Allows for `instanceof` checks. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, StreamRequestError.prototype);\n }\n}\n","export type ParamsBuilder<S> = (settings: S) => Record<string, string>;\n\nexport function defineParams<S>(\n ...definitions: Array<ParamsBuilder<S>>\n): ParamsBuilder<S> {\n return (settings) =>\n Object.assign({}, ...definitions.map((def) => def(settings)));\n}\n\ntype KeysOfType<S, V> = {\n [K in keyof S]-?: NonNullable<S[K]> extends V ? K : never;\n}[keyof S];\n\nfunction transformValue<T, R>({\n guard,\n transform,\n}: {\n guard: (v: unknown) => v is T;\n transform: (v: T) => R;\n}): (v: unknown) => R | undefined {\n return (v) => (guard(v) ? transform(v) : undefined);\n}\n\nexport function defineBoolean<\n S,\n P extends KeysOfType<S, boolean> = KeysOfType<S, boolean>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'boolean',\n transform: (v) => (v ? 'on' : 'off'),\n }),\n );\n}\n\nexport function defineNumber<\n S,\n P extends KeysOfType<S, number> = KeysOfType<S, number>,\n>(param: string, prop: P): ParamsBuilder<S> {\n return defineValue(\n param,\n prop,\n transformValue({\n guard: (v) => typeof v === 'number',\n transform: (v) => v.toString(),\n }),\n );\n}\n\nexport function defineString<\n S,\n P extends KeysOfType<S, string> = KeysOfType<S, string>,\n>(param: string, prop: P): 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';\nimport Long from 'long';\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/**\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'\n ? time.seconds\n : Long.fromValue(time.seconds).toNumber();\n return new Date(seconds * 1000 + time.nanos / 1000000);\n }\n}\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 return (\n boundingBox != null &&\n validateNumber(boundingBox.xmax) &&\n validateNumber(boundingBox.xmin) &&\n validateNumber(boundingBox.ymax) &&\n validateNumber(boundingBox.ymin) &&\n validateNumber(boundingBox.zmax) &&\n validateNumber(boundingBox.zmin)\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 return (\n validateVector(camera.lookAt, false) &&\n validateVector(camera.position, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateOrthographicCamera(\n camera: vertexvis.protobuf.stream.IOrthographicCamera,\n): boolean {\n return (\n validatePositiveNumber(camera.fovHeight) &&\n validateVector(camera.lookAt, false) &&\n validateVector(camera.viewVector, false) &&\n validateVector(camera.up, true)\n );\n}\n\nexport function validateDimensions(\n dimensions: vertexvis.protobuf.stream.IDimensions,\n): boolean {\n return (\n validatePositiveNumber(dimensions?.height) &&\n validatePositiveNumber(dimensions?.width)\n );\n}\n\nexport function validateNumber(\n number: number | null | undefined,\n): number is number {\n return typeof number === 'number' && Number.isFinite(number);\n}\n\nfunction validatePositiveNumber(number: number | null | undefined): boolean {\n return validateNumber(number) && number > 0;\n}\n\n/*\nfunction validateFovY(number: number | null | undefined): boolean {\n return validateNumber(number) && number >= 1 && number <= 179;\n}\n*/\n\nexport function validatePoint(\n point: vertexvis.protobuf.stream.IPoint | null | undefined,\n): boolean {\n return validateNumber(point?.x) && validateNumber(point?.y);\n}\n\nexport function validateVector(\n vector: vertexvis.protobuf.core.IVector3f | null | undefined,\n verifyNonZeroLength: boolean,\n): boolean {\n if (vector == null) {\n return false;\n }\n const { x, y, z } = vector;\n const vectorComponentsValid =\n validateNumber(x) && validateNumber(y) && validateNumber(z);\n\n if (verifyNonZeroLength) {\n if (!vectorComponentsValid) {\n return false;\n }\n\n const vectorMagnitudeSquared = x * x + y * y + z * z;\n return vectorMagnitudeSquared !== 0;\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 | ArrayBufferLike | Blob | 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 if (typeof SharedArrayBuffer !== 'undefined') {\n if (data instanceof SharedArrayBuffer) {\n this.webSocket.send(new Uint8Array(data).slice());\n return;\n }\n\n if (\n ArrayBuffer.isView(data) &&\n data.buffer instanceof SharedArrayBuffer\n ) {\n this.webSocket.send(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength,\n ).slice(),\n );\n return;\n }\n }\n\n this.webSocket.send(data as string | Blob | BufferSource);\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: 3600 },\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: 3600 },\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: 3600 },\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 closing = false;\n private closeHandlers = new Set<CloseHandler>();\n private msgHandlers = new Set<MessageHandler>();\n private sentMessages = new Array<WebSocketSendData>();\n\n public close(): void {\n if (this.closing) return;\n this.closing = true;\n try {\n this.closeHandlers.forEach((handler) => handler(new CloseEvent('close')));\n } finally {\n this.closing = false;\n }\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.1.3-canary.0",
3
+ "version": "1.1.3-canary.2",
4
4
  "description": "A websocket client for interacting with Vertex's stream API.",
5
5
  "license": "MIT",
6
6
  "author": "Vertex Developers <support@vertex3d.com> (https://developer.vertex3d.com)",
@@ -51,20 +51,20 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@vertexvis/eslint-config-vertexvis-typescript": "^0.6.2",
54
- "@vertexvis/utils": "1.1.3-canary.0",
55
- "@vertexwebsdk/build": "1.1.3-canary.0",
56
- "@vitest/coverage-v8": "4.1.12",
54
+ "@vertexvis/utils": "1.1.3-canary.2",
55
+ "@vertexwebsdk/build": "1.1.3-canary.2",
56
+ "@vitest/coverage-v8": "5.0.5",
57
57
  "eslint": "^10.13.0",
58
58
  "protobufjs": "^7.6.6",
59
- "rollup": "^4.65.0",
59
+ "rollup": "^4.65.1",
60
60
  "tslib": "^2.8.1",
61
- "typescript": "^5.9.3",
62
- "vitest": "4.1.12"
61
+ "typescript": "^6.0.3",
62
+ "vitest": "^5.0.5"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "@vertexvis/utils": ">=0.23.0",
66
66
  "protobufjs": ">=7.6.3 <8.0.0",
67
67
  "tslib": ">=2.4.0"
68
68
  },
69
- "gitHead": "c68f35fa821e6fe58a5ac691d0fd4539196a6986"
69
+ "gitHead": "77925396433ffad3d185865ebcf0fef4a9ca68ec"
70
70
  }