@mml-io/delta-net-web 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,5 +3,5 @@
3
3
 
4
4
  [![npm version](https://img.shields.io/npm/v/@mml-io/delta-net-web.svg?style=flat)](https://www.npmjs.com/package/@mml-io/delta-net-web)
5
5
 
6
- This package contains the `DeltaNetClientWebsocket` class which can connect to a WebSocket server using the `delta-net-v0.1` protocol and interact with a `DeltaNetServer`.
6
+ This package contains the `DeltaNetClientWebsocket` class which can connect to a WebSocket server using the DeltaNet protocol (`delta-net-v0.1` or `delta-net-v0.2`, negotiated automatically) and interact with a `DeltaNetServer`.
7
7
 
@@ -54,6 +54,7 @@ export declare class DeltaNetClientWebsocket {
54
54
  private options;
55
55
  private timeCallback?;
56
56
  private statusUpdateCallback?;
57
+ private resolveProtocol?;
57
58
  private websocket;
58
59
  private websocketAdapter;
59
60
  private stopped;
@@ -66,7 +67,7 @@ export declare class DeltaNetClientWebsocket {
66
67
  stateBytesPerSecond: number;
67
68
  lastSecondStateBufferSizes: Array<[number, number]>;
68
69
  static createWebSocket(url: string): WebSocket;
69
- constructor(url: string, websocketFactory: DeltaNetClientWebsocketFactory, token: string, options: DeltaNetClientWebsocketOptions, timeCallback?: ((time: number) => void) | undefined, statusUpdateCallback?: ((status: DeltaNetClientWebsocketStatus) => void) | undefined);
70
+ constructor(url: string, websocketFactory: DeltaNetClientWebsocketFactory, token: string, options: DeltaNetClientWebsocketOptions, timeCallback?: ((time: number) => void) | undefined, statusUpdateCallback?: ((status: DeltaNetClientWebsocketStatus) => void) | undefined, resolveProtocol?: ((websocketProtocol: string) => string | null) | undefined);
70
71
  private setStatus;
71
72
  getStatus(): DeltaNetClientWebsocketStatus;
72
73
  private createWebsocketWithTimeout;
@@ -1 +1 @@
1
- {"version":3,"file":"DeltaNetClientWebsocket.d.ts","sourceRoot":"","sources":["../src/DeltaNetClientWebsocket.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,8BAA8B,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;AAExE,oBAAY,6BAA6B;IACvC,UAAU,IAAA;IACV,cAAc,IAAA,CAAE,8EAA8E;IAC9F,SAAS,IAAA,CAAE,uEAAuE;IAClF,YAAY,IAAA;IACZ,YAAY,IAAA;CACb;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,6BAA6B,GACpC,MAAM,CAeR;AAED,MAAM,MAAM,sCAAsC,GAAG;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IACjF,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,CAAC,SAAS,EAAE,gCAAgC,KAAK,IAAI,CAAC;IACnE,iBAAiB,EAAE,CAAC,eAAe,EAAE,sCAAsC,KAAK,IAAI,CAAC;IACrF,MAAM,EAAE,CAAC,IAAI,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACpD,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/E,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CACjB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KACnC,IAAI,CAAC;IACV,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAsBF;;;;;GAKG;AACH,qBAAa,uBAAuB;IAoBhC,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,oBAAoB,CAAC;IAxB/B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,gBAAgB,CAA+C;IAEvE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,MAAM,CAA2E;IAElF,kBAAkB,SAAK;IACvB,sBAAsB,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAM;IACrD,uBAAuB,SAAK;IAC5B,8BAA8B,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAM;IAC7D,mBAAmB,SAAK;IACxB,0BAA0B,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAM;WAElD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;gBAK3C,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,8BAA8B,EAChD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,8BAA8B,EACvC,YAAY,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,aAAA,EACrC,oBAAoB,CAAC,GAAE,CAAC,MAAM,EAAE,6BAA6B,KAAK,IAAI,aAAA;IAMhF,OAAO,CAAC,SAAS;IASV,SAAS,IAAI,6BAA6B;YAInC,0BAA0B;YAqI1B,eAAe;YAUf,+BAA+B;IAoBtC,IAAI;IAUJ,iBAAiB,CACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAOjC,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAK9D"}
1
+ {"version":3,"file":"DeltaNetClientWebsocket.d.ts","sourceRoot":"","sources":["../src/DeltaNetClientWebsocket.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,13 @@
1
+ import { BufferReader, DecodeServerMessageOptions, DeltaNetServerMessage } from "@mml-io/delta-net-protocol";
1
2
  import { DeltaNetClientWebsocketAdapter, DeltaNetClientWebsocketOptions } from "./DeltaNetClientWebsocket";
2
- export declare class DeltaNetClientWebsocketV01Adapter implements DeltaNetClientWebsocketAdapter {
3
+ export type ServerMessageDecoder = (buffer: BufferReader, opts?: DecodeServerMessageOptions) => Array<DeltaNetServerMessage>;
4
+ export declare class DeltaNetClientWebsocketAdapterImpl implements DeltaNetClientWebsocketAdapter {
3
5
  private websocket;
4
6
  private connectedCallback;
5
7
  private options;
6
8
  private token;
7
9
  private internalOptions;
10
+ private decodeServerMessages;
8
11
  private timeCallback?;
9
12
  private gotInitialCheckout;
10
13
  private sentUserConnect;
@@ -20,7 +23,7 @@ export declare class DeltaNetClientWebsocketV01Adapter implements DeltaNetClient
20
23
  receivedStateBytes: (bytes: number, now: number) => void;
21
24
  onError: (errorType: string, errorMessage: string, retryable: boolean) => void;
22
25
  onWarning: (warning: string) => void;
23
- }, timeCallback?: ((time: number) => void) | undefined);
26
+ }, decodeServerMessages: ServerMessageDecoder, timeCallback?: ((time: number) => void) | undefined);
24
27
  private sendConnectUser;
25
28
  setUserComponents(components: Map<number, bigint>, changedStates: Map<number, Uint8Array>): void;
26
29
  private send;
@@ -36,4 +39,4 @@ export declare class DeltaNetClientWebsocketV01Adapter implements DeltaNetClient
36
39
  private handleTick;
37
40
  dispose(): void;
38
41
  }
39
- //# sourceMappingURL=DeltaNetClientWebsocketV01Adapter.d.ts.map
42
+ //# sourceMappingURL=DeltaNetClientWebsocketAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeltaNetClientWebsocketAdapter.d.ts","sourceRoot":"","sources":["../src/DeltaNetClientWebsocketAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGZ,0BAA0B,EAO1B,qBAAqB,EAKtB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,EAC/B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,oBAAoB,GAAG,CACjC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,KAC9B,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAUlC,qBAAa,kCAAmC,YAAW,8BAA8B;IAWrF,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,YAAY,CAAC;IAtBvB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;gBAGlB,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,MAAM,IAAI,EAC7B,OAAO,EAAE,8BAA8B,EACvC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE;QACvB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QACpD,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7D,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QACzD,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;QAC/E,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KACtC,EACO,oBAAoB,EAAE,oBAAoB,EAC1C,YAAY,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,aAAA;IAW/C,OAAO,CAAC,eAAe;IAkBhB,iBAAiB,CACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAgDxC,OAAO,CAAC,IAAI;IAML,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IActD,cAAc,CAAC,KAAK,EAAE,YAAY;IAyBzC,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAInB,UAAU,IAAI,OAAO;IAI5B,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,UAAU;IA2BlB,OAAO;CAGR"}
package/build/index.js CHANGED
@@ -292,16 +292,19 @@ var DeltaNetClientState = class {
292
292
  };
293
293
 
294
294
  // src/DeltaNetClientWebsocket.ts
295
- import { deltaNetProtocolSubProtocol_v0_1 } from "@mml-io/delta-net-protocol";
295
+ import {
296
+ decodeServerMessages,
297
+ decodeServerMessagesV02,
298
+ deltaNetSupportedSubProtocols,
299
+ deltaNetProtocolSubProtocol_v0_1,
300
+ deltaNetProtocolSubProtocol_v0_2
301
+ } from "@mml-io/delta-net-protocol";
296
302
 
297
- // src/DeltaNetClientWebsocketV01Adapter.ts
303
+ // src/DeltaNetClientWebsocketAdapter.ts
298
304
  import {
299
305
  BufferReader,
300
306
  BufferWriter,
301
- decodeServerMessages,
302
- encodeClientMessage,
303
- lastInitialCheckoutDebugData,
304
- lastTickDebugData
307
+ encodeClientMessage
305
308
  } from "@mml-io/delta-net-protocol";
306
309
  function areUint8ArraysEqual(a, b) {
307
310
  if (a.length !== b.length) return false;
@@ -310,13 +313,14 @@ function areUint8ArraysEqual(a, b) {
310
313
  }
311
314
  return true;
312
315
  }
313
- var DeltaNetClientWebsocketV01Adapter = class {
314
- constructor(websocket, connectedCallback, options, token, internalOptions, timeCallback) {
316
+ var DeltaNetClientWebsocketAdapterImpl = class {
317
+ constructor(websocket, connectedCallback, options, token, internalOptions, decodeServerMessages2, timeCallback) {
315
318
  this.websocket = websocket;
316
319
  this.connectedCallback = connectedCallback;
317
320
  this.options = options;
318
321
  this.token = token;
319
322
  this.internalOptions = internalOptions;
323
+ this.decodeServerMessages = decodeServerMessages2;
320
324
  this.timeCallback = timeCallback;
321
325
  this.websocket.binaryType = "arraybuffer";
322
326
  this.isObserver = options.observer ?? false;
@@ -347,7 +351,7 @@ var DeltaNetClientWebsocketV01Adapter = class {
347
351
  }
348
352
  setUserComponents(components, changedStates) {
349
353
  if (this.disposed) {
350
- throw new Error("DeltaNetClientWebsocketV01Adapter is disposed");
354
+ throw new Error("DeltaNetClientWebsocketAdapter is disposed");
351
355
  }
352
356
  const messageComponents = [];
353
357
  for (const [componentId, value] of components) {
@@ -409,14 +413,22 @@ var DeltaNetClientWebsocketV01Adapter = class {
409
413
  const now = Date.now();
410
414
  this.internalOptions.receivedBytes(buffer.byteLength, now);
411
415
  const reader = new BufferReader(buffer);
412
- const messages = decodeServerMessages(reader, {
413
- ignoreData: this.options.ignoreData
416
+ const debugData = { componentsByteLength: 0, statesByteLength: 0 };
417
+ const messages = this.decodeServerMessages(reader, {
418
+ ignoreData: this.options.ignoreData,
419
+ debugData
414
420
  });
415
421
  for (const message of messages) {
416
- this.applyMessage(message, now);
422
+ this.applyMessage(message);
423
+ }
424
+ if (debugData.componentsByteLength > 0) {
425
+ this.internalOptions.receivedComponentBytes(debugData.componentsByteLength, now);
426
+ }
427
+ if (debugData.statesByteLength > 0) {
428
+ this.internalOptions.receivedStateBytes(debugData.statesByteLength, now);
417
429
  }
418
430
  }
419
- applyMessage(message, now) {
431
+ applyMessage(message) {
420
432
  switch (message.type) {
421
433
  case "error":
422
434
  console.error("Error from server", message);
@@ -427,11 +439,11 @@ var DeltaNetClientWebsocketV01Adapter = class {
427
439
  this.internalOptions.onWarning(message.message);
428
440
  break;
429
441
  case "initialCheckout":
430
- this.handleInitialCheckout(message, now);
442
+ this.handleInitialCheckout(message);
431
443
  this.connectedCallback();
432
444
  break;
433
445
  case "tick":
434
- this.handleTick(message, now);
446
+ this.handleTick(message);
435
447
  break;
436
448
  case "userIndex":
437
449
  this.handleUserIndex(message);
@@ -482,7 +494,7 @@ var DeltaNetClientWebsocketV01Adapter = class {
482
494
  didConnect() {
483
495
  return this.gotInitialCheckout;
484
496
  }
485
- handleInitialCheckout(message, now) {
497
+ handleInitialCheckout(message) {
486
498
  this.gotInitialCheckout = true;
487
499
  if (this.options.ignoreData) {
488
500
  return;
@@ -495,18 +507,13 @@ var DeltaNetClientWebsocketV01Adapter = class {
495
507
  for (const { stateId, values } of message.states) {
496
508
  allStates.set(stateId, values);
497
509
  }
498
- this.internalOptions.receivedComponentBytes(
499
- lastInitialCheckoutDebugData.componentsByteLength,
500
- now
501
- );
502
- this.internalOptions.receivedStateBytes(lastInitialCheckoutDebugData.statesByteLength, now);
503
510
  this.options.onInitialCheckout({
504
511
  indicesCount: message.indicesCount,
505
512
  initialComponents: components,
506
513
  initialStates: allStates
507
514
  });
508
515
  }
509
- handleTick(message, now) {
516
+ handleTick(message) {
510
517
  var _a;
511
518
  if (this.options.ignoreData) {
512
519
  return;
@@ -524,8 +531,6 @@ var DeltaNetClientWebsocketV01Adapter = class {
524
531
  }
525
532
  stateChanges.set(stateChange.stateId, updatedStates);
526
533
  }
527
- this.internalOptions.receivedComponentBytes(lastTickDebugData.componentsByteLength, now);
528
- this.internalOptions.receivedStateBytes(lastTickDebugData.statesByteLength, now);
529
534
  this.options.onTick({
530
535
  unoccupying: message.removedIndices,
531
536
  indicesCount: message.indicesCount,
@@ -582,13 +587,14 @@ function updateLastSecondArray(records, size, time) {
582
587
  return sizeChange;
583
588
  }
584
589
  var DeltaNetClientWebsocket = class {
585
- constructor(url, websocketFactory, token, options, timeCallback, statusUpdateCallback) {
590
+ constructor(url, websocketFactory, token, options, timeCallback, statusUpdateCallback, resolveProtocol) {
586
591
  this.url = url;
587
592
  this.websocketFactory = websocketFactory;
588
593
  this.token = token;
589
594
  this.options = options;
590
595
  this.timeCallback = timeCallback;
591
596
  this.statusUpdateCallback = statusUpdateCallback;
597
+ this.resolveProtocol = resolveProtocol;
592
598
  this.setStatus(0 /* Connecting */);
593
599
  this.startWebSocketConnectionAttempt();
594
600
  }
@@ -607,7 +613,7 @@ var DeltaNetClientWebsocket = class {
607
613
  lastSecondStateBufferSizes = [];
608
614
  // Timestamp in ms, size in bytes
609
615
  static createWebSocket(url) {
610
- return new WebSocket(url, [deltaNetProtocolSubProtocol_v0_1]);
616
+ return new WebSocket(url, [...deltaNetSupportedSubProtocols]);
611
617
  }
612
618
  setStatus(status) {
613
619
  if (this.status !== status) {
@@ -631,51 +637,72 @@ var DeltaNetClientWebsocket = class {
631
637
  websocket.addEventListener("open", () => {
632
638
  clearTimeout(timeoutId);
633
639
  this.websocket = websocket;
634
- const websocketAdapter = new DeltaNetClientWebsocketV01Adapter(
635
- websocket,
636
- () => {
637
- this.backoffTime = startingBackoffTimeMilliseconds;
638
- this.setStatus(2 /* Connected */);
640
+ const adapterInternalOptions = {
641
+ receivedBytes: (bytes, now) => {
642
+ this.bandwidthPerSecond += updateLastSecondArray(
643
+ this.lastSecondMessageSizes,
644
+ bytes,
645
+ now
646
+ );
639
647
  },
640
- this.options,
641
- this.token,
642
- {
643
- receivedBytes: (bytes, now) => {
644
- this.bandwidthPerSecond += updateLastSecondArray(
645
- this.lastSecondMessageSizes,
646
- bytes,
647
- now
648
- );
649
- },
650
- receivedComponentBytes: (bytes, now) => {
651
- this.componentBytesPerSecond += updateLastSecondArray(
652
- this.lastSecondComponentBufferSizes,
653
- bytes,
654
- now
655
- );
656
- },
657
- receivedStateBytes: (bytes, now) => {
658
- this.stateBytesPerSecond += updateLastSecondArray(
659
- this.lastSecondStateBufferSizes,
660
- bytes,
661
- now
662
- );
663
- },
664
- onError: (errorType, errorMessage, retryable) => {
665
- var _a, _b;
666
- this.options.onError(errorType, errorMessage, retryable);
667
- if (this.websocket === websocket) {
668
- (_a = this.websocket) == null ? void 0 : _a.close();
669
- this.websocket = null;
670
- (_b = this.websocketAdapter) == null ? void 0 : _b.dispose();
671
- this.websocketAdapter = null;
672
- onWebsocketClose(retryable);
673
- }
674
- },
675
- onWarning: (warning) => {
676
- this.options.onWarning(warning);
648
+ receivedComponentBytes: (bytes, now) => {
649
+ this.componentBytesPerSecond += updateLastSecondArray(
650
+ this.lastSecondComponentBufferSizes,
651
+ bytes,
652
+ now
653
+ );
654
+ },
655
+ receivedStateBytes: (bytes, now) => {
656
+ this.stateBytesPerSecond += updateLastSecondArray(
657
+ this.lastSecondStateBufferSizes,
658
+ bytes,
659
+ now
660
+ );
661
+ },
662
+ onError: (errorType, errorMessage, retryable) => {
663
+ var _a, _b;
664
+ this.options.onError(errorType, errorMessage, retryable);
665
+ if (this.websocket === websocket) {
666
+ (_a = this.websocket) == null ? void 0 : _a.close();
667
+ this.websocket = null;
668
+ (_b = this.websocketAdapter) == null ? void 0 : _b.dispose();
669
+ this.websocketAdapter = null;
670
+ onWebsocketClose(retryable);
677
671
  }
678
672
  },
673
+ onWarning: (warning) => {
674
+ this.options.onWarning(warning);
675
+ }
676
+ };
677
+ const connectedCallback = () => {
678
+ this.backoffTime = startingBackoffTimeMilliseconds;
679
+ this.setStatus(2 /* Connected */);
680
+ };
681
+ const resolvedProtocol = this.resolveProtocol ? this.resolveProtocol(websocket.protocol) ?? websocket.protocol : websocket.protocol;
682
+ let decoder;
683
+ if (resolvedProtocol === deltaNetProtocolSubProtocol_v0_2) {
684
+ decoder = decodeServerMessagesV02;
685
+ } else if (resolvedProtocol === deltaNetProtocolSubProtocol_v0_1) {
686
+ decoder = decodeServerMessages;
687
+ } else if (resolvedProtocol === "") {
688
+ console.warn(
689
+ "DeltaNetClientWebsocket: no sub-protocol negotiated, falling back to v0.1 decoding"
690
+ );
691
+ decoder = decodeServerMessages;
692
+ } else {
693
+ const errorMsg = `DeltaNetClientWebsocket: unrecognized protocol "${resolvedProtocol}"`;
694
+ console.error(errorMsg);
695
+ websocket.close(1002, "Unrecognized protocol");
696
+ reject(new Error(errorMsg));
697
+ return;
698
+ }
699
+ const websocketAdapter = new DeltaNetClientWebsocketAdapterImpl(
700
+ websocket,
701
+ connectedCallback,
702
+ this.options,
703
+ this.token,
704
+ adapterInternalOptions,
705
+ decoder,
679
706
  this.timeCallback
680
707
  );
681
708
  this.websocketAdapter = websocketAdapter;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/DeltaNetClientState.ts", "../src/DeltaNetClientWebsocket.ts", "../src/DeltaNetClientWebsocketV01Adapter.ts"],
4
- "sourcesContent": ["import {\n DeltaNetClientWebsocketInitialCheckout,\n DeltaNetClientWebsocketTick,\n} from \"./DeltaNetClientWebsocket\";\n\nexport type EntityStateUpdate = { stableId: number; stateId: number; state: Uint8Array };\n\nexport type EntityInfo = {\n stableId: number;\n components: Map<number, bigint>;\n states: Map<number, Uint8Array>;\n};\n\nexport type DeltaNetClientComponent = {\n values: BigInt64Array;\n deltas: BigInt64Array;\n deltaDeltas: BigInt64Array;\n};\n\nexport class DeltaNetClientState {\n private componentValues = new Map<number, DeltaNetClientComponent>();\n private allStates = new Map<number, Array<Uint8Array>>();\n\n public byStableId: Map<number, EntityInfo> = new Map();\n\n private localClientIndex: number = -1;\n\n private indicesCount: number = 0;\n\n private stableIdToIndex = new Map<number, number>();\n private stableIds: Array<number> = [];\n private stableIdCounter = 1000; // Start at 1000 to avoid confusion with indices\n\n constructor() {\n this.reset();\n }\n\n /**\n * Reset all state to initial values. This should be called when reconnecting\n * to ensure that stale data from previous connections doesn't interfere.\n */\n public reset() {\n this.componentValues.clear();\n this.allStates.clear();\n this.byStableId.clear();\n this.localClientIndex = -1;\n this.indicesCount = 0;\n this.stableIdToIndex.clear();\n this.stableIds.length = 0;\n this.stableIdCounter = 1000;\n }\n\n public getComponentValues(): Map<number, DeltaNetClientComponent> {\n return this.componentValues;\n }\n\n public getStateById(stateId: number): Array<Uint8Array | null> | null {\n return this.allStates.get(stateId) ?? null;\n }\n\n public getAllStates(): Map<number, Array<Uint8Array | null>> {\n return this.allStates;\n }\n\n public getLocalClientIndex(): number {\n return this.localClientIndex;\n }\n\n public getIndicesCount(): number {\n return this.indicesCount;\n }\n\n public getStableIds(): Array<number> {\n return this.stableIds;\n }\n\n public getComponentValueForStableId(stableId: number, componentId: number): bigint | null {\n const index = this.stableIdToIndex.get(stableId);\n if (index === undefined) {\n return null;\n }\n const componentValue = this.componentValues.get(componentId);\n if (!componentValue) {\n return null;\n }\n return componentValue.values[index] ?? null;\n }\n\n public getComponentsForStableId(stableId: number): Map<number, bigint> | null {\n const index = this.stableIdToIndex.get(stableId);\n if (index === undefined) {\n return null;\n }\n const componentMap = new Map<number, bigint>();\n for (const [key, componentValue] of this.componentValues) {\n if (componentValue === undefined) {\n throw new Error(`Component value for key ${key} is undefined`);\n }\n componentMap.set(key, componentValue.values[index]);\n }\n return componentMap;\n }\n\n public handleInitialCheckout(initialCheckout: DeltaNetClientWebsocketInitialCheckout): {\n addedStableIds: Array<number>;\n } {\n const { indicesCount, initialComponents, initialStates } = initialCheckout;\n const addedStableIds: Array<number> = [];\n for (let i = 0; i < indicesCount; i++) {\n const stableId = this.stableIdCounter++;\n this.stableIds.push(stableId);\n this.stableIdToIndex.set(stableId, i);\n const entityInfo: EntityInfo = {\n stableId,\n components: new Map(),\n states: new Map(),\n };\n this.byStableId.set(stableId, entityInfo);\n addedStableIds.push(stableId);\n }\n this.indicesCount = indicesCount;\n\n const deltaDeltas = new BigInt64Array(indicesCount);\n for (let i = 0; i < deltaDeltas.length; i++) {\n deltaDeltas[i] = BigInt(0);\n }\n\n for (const [key, value] of initialComponents) {\n this.componentValues.set(key, {\n values: value.values,\n deltas: value.deltas,\n deltaDeltas,\n });\n\n for (let i = 0; i < this.stableIds.length; i++) {\n const stableId = this.stableIds[i];\n const entityInfo = this.byStableId.get(stableId);\n if (entityInfo) {\n entityInfo.components.set(key, value.values[i]);\n }\n }\n }\n\n for (const [stateId, values] of initialStates) {\n this.allStates.set(stateId, values);\n\n for (let i = 0; i < this.stableIds.length; i++) {\n const stableId = this.stableIds[i];\n const entityInfo = this.byStableId.get(stableId);\n const stateValue = values[i];\n if (entityInfo) {\n entityInfo.states.set(stateId, stateValue);\n }\n }\n }\n\n return { addedStableIds };\n }\n\n public handleTick(tick: DeltaNetClientWebsocketTick): {\n stateUpdates: Array<EntityStateUpdate>;\n removedStableIds: Array<number>;\n addedStableIds: Array<number>;\n } {\n const { unoccupying, indicesCount, componentDeltaDeltas, stateChanges } = tick;\n\n let removedStableIds: Array<number> = [];\n\n if (unoccupying.length > 0) {\n // Collect stableIds to remove before mutating stableIds\n const stableIdsToRemove = unoccupying.map((index) => this.stableIds[index]);\n removedStableIds = stableIdsToRemove.filter((stableId) => stableId !== undefined);\n\n // Remove unoccupying indices from component values\n for (const [componentId, component] of this.componentValues) {\n this.removeIndicesFromBigInt64Array(unoccupying, component.values);\n this.removeIndicesFromBigInt64Array(unoccupying, component.deltas);\n }\n\n // Remove unoccupying indices from states\n for (const [stateId, state] of this.allStates) {\n this.removeIndicesFromState(unoccupying, state);\n }\n\n // Update localClientIndex\n let decrementIndex = 0;\n for (const index of unoccupying) {\n if (index <= this.localClientIndex) {\n decrementIndex++;\n }\n }\n this.localClientIndex -= decrementIndex;\n\n // Update indices count\n this.indicesCount -= unoccupying.length;\n\n // Update stable indices and stableIds array\n this.removeIndices(unoccupying);\n\n // Remove unoccupied stables from byStableId\n for (const stableId of stableIdsToRemove) {\n if (stableId === undefined) {\n throw new Error(`stableId is undefined`);\n }\n this.byStableId.delete(stableId);\n }\n }\n\n const addedStableIds: Array<number> = [];\n\n if (indicesCount > this.indicesCount) {\n const addedIndices = indicesCount - this.indicesCount;\n\n for (let i = 0; i < addedIndices; i++) {\n const stableId = this.stableIdCounter++;\n this.stableIds.push(stableId);\n this.stableIdToIndex.set(stableId, this.stableIds.length - 1);\n const entityInfo: EntityInfo = {\n stableId,\n components: new Map(),\n states: new Map(),\n };\n this.byStableId.set(stableId, entityInfo);\n addedStableIds.push(stableId);\n }\n }\n\n this.indicesCount = indicesCount;\n\n // Update component values\n for (const [key, deltaDeltas] of componentDeltaDeltas) {\n if (deltaDeltas.length !== indicesCount) {\n throw new Error(\n `DeltaDeltas length (${deltaDeltas.length}) does not match indices count (${indicesCount})`,\n );\n }\n const existingComponent = this.componentValues.get(key);\n if (!existingComponent) {\n const values = new BigInt64Array(deltaDeltas);\n const deltas = new BigInt64Array(deltaDeltas);\n this.componentValues.set(key, { values, deltas, deltaDeltas });\n } else {\n if (existingComponent.values.length < deltaDeltas.length) {\n // Resize the arrays\n const newValues = new BigInt64Array(deltaDeltas.length);\n newValues.set(existingComponent.values);\n const newDeltas = new BigInt64Array(deltaDeltas.length);\n newDeltas.set(existingComponent.deltas);\n const newDeltaDelta = new BigInt64Array(deltaDeltas.length);\n newDeltaDelta.set(existingComponent.deltaDeltas);\n for (let i = existingComponent.values.length; i < deltaDeltas.length; i++) {\n newValues[i] = BigInt(0);\n newDeltas[i] = BigInt(0);\n newDeltaDelta[i] = BigInt(0);\n }\n existingComponent.values = newValues;\n existingComponent.deltas = newDeltas;\n existingComponent.deltaDeltas = newDeltaDelta;\n }\n\n for (let i = 0; i < deltaDeltas.length; i++) {\n const deltaDelta = deltaDeltas[i];\n const stableId = this.stableIds[i];\n\n existingComponent.deltaDeltas[i] = deltaDelta;\n existingComponent.deltas[i] += deltaDelta;\n existingComponent.values[i] += existingComponent.deltas[i];\n\n // Update byStableId map with new component values\n const entityInfo = this.byStableId.get(stableId);\n if (entityInfo) {\n entityInfo.components.set(key, existingComponent.values[i]);\n }\n }\n }\n }\n\n const stateUpdates: Array<EntityStateUpdate> = [];\n\n // Update states\n for (const [stateId, states] of stateChanges) {\n let state = this.allStates.get(stateId);\n if (!state) {\n state = [];\n this.allStates.set(stateId, state);\n }\n\n for (const [index, value] of states) {\n const stableId = this.stableIds[index];\n\n if (stableId === undefined) {\n throw new Error(`Stable ID is undefined for index ${index} in state ${stateId}`);\n }\n\n stateUpdates.push({\n stableId,\n stateId,\n state: value,\n });\n state[index] = value;\n\n // Update byStableId map with new state values\n const entityInfo = this.byStableId.get(stableId);\n if (entityInfo) {\n entityInfo.states.set(stateId, value);\n }\n }\n }\n\n return { stateUpdates, removedStableIds, addedStableIds };\n }\n\n public setLocalIndex(index: number) {\n this.localClientIndex = index;\n }\n\n private removeIndices(removing: Array<number>) {\n if (removing.length === 0) {\n return;\n }\n\n let writeIndex = 0;\n let skipIndex = 0;\n\n for (let readIndex = 0; readIndex < this.stableIds.length; readIndex++) {\n if (skipIndex < removing.length && readIndex === removing[skipIndex]) {\n skipIndex++;\n continue;\n }\n\n const stableId = this.stableIds[readIndex];\n if (writeIndex !== readIndex) {\n this.stableIds[writeIndex] = this.stableIds[readIndex];\n }\n // Update the mapping for all remaining elements to their new indices\n this.stableIdToIndex.set(stableId, writeIndex);\n\n writeIndex++;\n }\n\n // Actually shrink the array to the correct size\n this.stableIds.length = writeIndex;\n }\n\n private removeIndicesFromBigInt64Array(removing: Array<number>, array: BigInt64Array) {\n if (removing.length === 0) {\n return;\n }\n\n let writeIndex = 0;\n let skipIndex = 0;\n\n for (let readIndex = 0; readIndex < array.length; readIndex++) {\n if (skipIndex < removing.length && readIndex === removing[skipIndex]) {\n skipIndex++;\n continue;\n }\n\n if (writeIndex !== readIndex) {\n array[writeIndex] = array[readIndex];\n }\n\n writeIndex++;\n }\n for (let i = writeIndex; i < array.length; i++) {\n array[i] = BigInt(0);\n }\n }\n\n private removeIndicesFromState(removing: Array<number>, state: Array<Uint8Array | null>) {\n if (removing.length === 0) {\n return;\n }\n\n let writeIndex = 0;\n let skipIndex = 0;\n\n for (let readIndex = 0; readIndex < state.length; readIndex++) {\n if (skipIndex < removing.length && readIndex === removing[skipIndex]) {\n skipIndex++;\n continue;\n }\n\n if (writeIndex !== readIndex) {\n state[writeIndex] = state[readIndex];\n }\n\n writeIndex++;\n }\n }\n}\n", "import { deltaNetProtocolSubProtocol_v0_1 } from \"@mml-io/delta-net-protocol\";\n\nimport { DeltaNetClientWebsocketV01Adapter } from \"./DeltaNetClientWebsocketV01Adapter\";\n\nconst startingBackoffTimeMilliseconds = 100;\nconst maximumBackoffTimeMilliseconds = 10000;\nconst maximumWebsocketConnectionTimeout = 5000;\n\nexport type DeltaNetClientWebsocketFactory = (url: string) => WebSocket;\n\nexport enum DeltaNetClientWebsocketStatus {\n Connecting,\n ConnectionOpen, // The websocket is open and connected, but no messages have been received yet\n Connected, // The websocket is open and connected, and messages are being received\n Reconnecting,\n Disconnected,\n}\n\nexport function DeltaNetClientWebsocketStatusToString(\n status: DeltaNetClientWebsocketStatus,\n): string {\n switch (status) {\n case DeltaNetClientWebsocketStatus.Connecting:\n return \"Connecting...\";\n case DeltaNetClientWebsocketStatus.ConnectionOpen:\n return \"Connection Open\";\n case DeltaNetClientWebsocketStatus.Connected:\n return \"Connected\";\n case DeltaNetClientWebsocketStatus.Reconnecting:\n return \"Reconnecting...\";\n case DeltaNetClientWebsocketStatus.Disconnected:\n return \"Disconnected\";\n default:\n return \"Unknown\";\n }\n}\n\nexport type DeltaNetClientWebsocketInitialCheckout = {\n indicesCount: number;\n initialComponents: Map<number, { values: BigInt64Array; deltas: BigInt64Array }>;\n initialStates: Map<number, Array<Uint8Array>>;\n};\n\nexport type DeltaNetClientWebsocketTick = {\n unoccupying: Array<number>;\n indicesCount: number;\n componentDeltaDeltas: Map<number, BigInt64Array>;\n stateChanges: Map<number, Map<number, Uint8Array>>;\n};\n\nexport type DeltaNetClientWebsocketUserIndex = {\n userIndex: number;\n};\n\nexport type DeltaNetClientWebsocketOptions = {\n ignoreData?: boolean;\n observer?: boolean;\n onUserIndex: (userIndex: DeltaNetClientWebsocketUserIndex) => void;\n onInitialCheckout: (initialCheckout: DeltaNetClientWebsocketInitialCheckout) => void;\n onTick: (tick: DeltaNetClientWebsocketTick) => void;\n onError: (errorType: string, errorMessage: string, retryable: boolean) => void;\n onWarning: (warning: string) => void;\n onServerCustom?: (customType: number, contents: string) => void;\n};\n\nexport type DeltaNetClientWebsocketAdapter = {\n receiveMessage: (message: MessageEvent) => void;\n setUserComponents: (\n components: Map<number, bigint>,\n changedStates: Map<number, Uint8Array>,\n ) => void;\n sendCustomMessage: (customType: number, contents: string) => void;\n didConnect: () => boolean;\n dispose: () => void;\n};\n\nfunction updateLastSecondArray(\n records: Array<[number, number]>,\n size: number,\n time: number,\n): number {\n let sizeChange = size;\n const oneSecondAgo = time - 1000;\n records.push([time, size]);\n let i;\n for (i = 0; i < records.length; i++) {\n if (records[i][0] < oneSecondAgo) {\n sizeChange -= records[i][1];\n } else {\n break;\n }\n }\n records.splice(0, i);\n return sizeChange;\n}\n\n/**\n * DeltaNetClientWebsocket is a client for a DeltaNetServer. It connects to a server on the provided url and receives\n * updates to the DOM. It also sends events to the server for interactions with the DOM.\n *\n * The DeltaNetClientWebsocket is attached to a parentElement and synchronizes the received DOM under that element.\n */\nexport class DeltaNetClientWebsocket {\n private websocket: WebSocket | null = null;\n private websocketAdapter: DeltaNetClientWebsocketAdapter | null = null;\n\n private stopped = false;\n private backoffTime = startingBackoffTimeMilliseconds;\n private status: DeltaNetClientWebsocketStatus = DeltaNetClientWebsocketStatus.Connecting;\n\n public bandwidthPerSecond = 0;\n public lastSecondMessageSizes: Array<[number, number]> = []; // Timestamp in ms, size in bytes\n public componentBytesPerSecond = 0;\n public lastSecondComponentBufferSizes: Array<[number, number]> = []; // Timestamp in ms, size in bytes\n public stateBytesPerSecond = 0;\n public lastSecondStateBufferSizes: Array<[number, number]> = []; // Timestamp in ms, size in bytes\n\n public static createWebSocket(url: string): WebSocket {\n return new WebSocket(url, [deltaNetProtocolSubProtocol_v0_1]);\n }\n\n constructor(\n private url: string,\n private websocketFactory: DeltaNetClientWebsocketFactory,\n private token: string,\n private options: DeltaNetClientWebsocketOptions,\n private timeCallback?: (time: number) => void,\n private statusUpdateCallback?: (status: DeltaNetClientWebsocketStatus) => void,\n ) {\n this.setStatus(DeltaNetClientWebsocketStatus.Connecting);\n this.startWebSocketConnectionAttempt();\n }\n\n private setStatus(status: DeltaNetClientWebsocketStatus) {\n if (this.status !== status) {\n this.status = status;\n if (this.statusUpdateCallback) {\n this.statusUpdateCallback(status);\n }\n }\n }\n\n public getStatus(): DeltaNetClientWebsocketStatus {\n return this.status;\n }\n\n private async createWebsocketWithTimeout(timeout: number): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const websocket = this.websocketFactory(this.url);\n const timeoutId = setTimeout(() => {\n reject(new Error(\"websocket connection timed out\"));\n websocket.close();\n }, timeout);\n websocket.binaryType = \"arraybuffer\";\n websocket.addEventListener(\"open\", () => {\n clearTimeout(timeoutId);\n\n this.websocket = websocket;\n const websocketAdapter: DeltaNetClientWebsocketAdapter =\n new DeltaNetClientWebsocketV01Adapter(\n websocket,\n () => {\n this.backoffTime = startingBackoffTimeMilliseconds;\n this.setStatus(DeltaNetClientWebsocketStatus.Connected);\n },\n this.options,\n this.token,\n {\n receivedBytes: (bytes: number, now: number) => {\n this.bandwidthPerSecond += updateLastSecondArray(\n this.lastSecondMessageSizes,\n bytes,\n now,\n );\n },\n receivedComponentBytes: (bytes: number, now: number) => {\n this.componentBytesPerSecond += updateLastSecondArray(\n this.lastSecondComponentBufferSizes,\n bytes,\n now,\n );\n },\n receivedStateBytes: (bytes: number, now: number) => {\n this.stateBytesPerSecond += updateLastSecondArray(\n this.lastSecondStateBufferSizes,\n bytes,\n now,\n );\n },\n onError: (errorType: string, errorMessage: string, retryable: boolean) => {\n this.options.onError(errorType, errorMessage, retryable);\n if (this.websocket === websocket) {\n this.websocket?.close();\n this.websocket = null;\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n onWebsocketClose(retryable);\n }\n },\n onWarning: (warning: string) => {\n this.options.onWarning(warning);\n },\n },\n this.timeCallback,\n );\n\n this.websocketAdapter = websocketAdapter;\n\n websocket.addEventListener(\"message\", (event) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket message event because it is no longer current\");\n websocket.close();\n return;\n }\n if (this.stopped) {\n console.warn(\"Ignoring websocket message event because the client is stopped\");\n return;\n }\n\n websocketAdapter.receiveMessage(event);\n });\n\n const onWebsocketClose = async (retryable: boolean = true) => {\n let didConnect = false;\n if (this.websocketAdapter) {\n didConnect = this.websocketAdapter.didConnect();\n }\n if (this.stopped) {\n // This closing is expected. The client closed the websocket.\n this.setStatus(DeltaNetClientWebsocketStatus.Disconnected);\n return;\n }\n if (retryable) {\n if (!didConnect) {\n // The websocket did not deliver any contents.\n // It may have been successfully opened, but immediately closed.\n // This client should back off to prevent this happening in a rapid loop.\n await this.waitBackoffTime();\n }\n // The websocket closed unexpectedly. Try to reconnect.\n this.setStatus(DeltaNetClientWebsocketStatus.Reconnecting);\n this.startWebSocketConnectionAttempt();\n } else {\n this.setStatus(DeltaNetClientWebsocketStatus.Disconnected);\n }\n };\n\n websocket.addEventListener(\"close\", () => {\n if (websocket !== this.websocket) {\n console.warn(\"Ignoring websocket close event because it is no longer current\");\n return;\n }\n this.websocket = null;\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n onWebsocketClose();\n });\n websocket.addEventListener(\"error\", (e) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket error event because it is no longer current\");\n return;\n }\n console.error(\"DeltaNetClientWebsocket error\", e);\n this.websocket = null;\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n onWebsocketClose();\n });\n\n this.setStatus(DeltaNetClientWebsocketStatus.ConnectionOpen);\n resolve(websocket);\n });\n websocket.addEventListener(\"error\", (e) => {\n clearTimeout(timeoutId);\n reject(e);\n });\n });\n }\n\n private async waitBackoffTime(): Promise<void> {\n console.warn(`Websocket connection to '${this.url}' failed: retrying in ${this.backoffTime}ms`);\n await new Promise((resolve) => setTimeout(resolve, this.backoffTime));\n this.backoffTime = Math.min(\n // Introduce a small amount of randomness to prevent clients from retrying in lockstep\n this.backoffTime * (1.5 + Math.random() * 0.5),\n maximumBackoffTimeMilliseconds,\n );\n }\n\n private async startWebSocketConnectionAttempt() {\n if (this.stopped) {\n return;\n }\n while (true) {\n if (this.stopped) {\n return;\n }\n try {\n await this.createWebsocketWithTimeout(maximumWebsocketConnectionTimeout);\n break;\n } catch (e) {\n console.error(\"Websocket connection failed\", e);\n // Connection failed, retry with backoff\n this.setStatus(DeltaNetClientWebsocketStatus.Reconnecting);\n await this.waitBackoffTime();\n }\n }\n }\n\n public stop() {\n this.stopped = true;\n if (this.websocket !== null) {\n this.websocket.close();\n this.websocket = null;\n }\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n }\n\n public setUserComponents(\n components: Map<number, bigint>,\n changedStates: Map<number, Uint8Array>,\n ) {\n if (this.websocketAdapter) {\n this.websocketAdapter.setUserComponents(components, changedStates);\n }\n }\n\n public sendCustomMessage(customType: number, contents: string) {\n if (this.websocketAdapter) {\n this.websocketAdapter.sendCustomMessage(customType, contents);\n }\n }\n}\n", "import {\n BufferReader,\n BufferWriter,\n decodeServerMessages,\n DeltaNetV01ClientMessage,\n DeltaNetV01ClientCustomMessage,\n DeltaNetV01InitialCheckoutMessage,\n DeltaNetV01PingMessage,\n DeltaNetV01ServerMessage,\n DeltaNetV01ServerCustomMessage,\n DeltaNetV01SetUserComponentsMessage,\n DeltaNetV01Tick,\n DeltaNetV01UserIndexMessage,\n encodeClientMessage,\n lastInitialCheckoutDebugData,\n lastTickDebugData,\n} from \"@mml-io/delta-net-protocol\";\nimport { DeltaNetV01ConnectUserMessage } from \"@mml-io/delta-net-protocol/src\";\n\nimport {\n DeltaNetClientWebsocketAdapter,\n DeltaNetClientWebsocketOptions,\n} from \"./DeltaNetClientWebsocket\";\n\nfunction areUint8ArraysEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport class DeltaNetClientWebsocketV01Adapter implements DeltaNetClientWebsocketAdapter {\n private gotInitialCheckout = false;\n private sentUserConnect = false;\n private receivedUserIndex = false;\n private queuedStateUpdates = new Map<number, Uint8Array>();\n private components = new Map<number, bigint>();\n private states = new Map<number, Uint8Array>();\n private disposed = false;\n private isObserver: boolean;\n\n constructor(\n private websocket: WebSocket,\n private connectedCallback: () => void,\n private options: DeltaNetClientWebsocketOptions,\n private token: string,\n private internalOptions: {\n receivedBytes: (bytes: number, now: number) => void;\n receivedComponentBytes: (bytes: number, now: number) => void;\n receivedStateBytes: (bytes: number, now: number) => void;\n onError: (errorType: string, errorMessage: string, retryable: boolean) => void;\n onWarning: (warning: string) => void;\n },\n private timeCallback?: (time: number) => void,\n ) {\n this.websocket.binaryType = \"arraybuffer\";\n this.isObserver = options.observer ?? false;\n\n // Observers need to send connectUser message immediately since they won't call setUserComponents\n if (this.isObserver) {\n this.sendConnectUser([], []);\n }\n }\n\n private sendConnectUser(\n components: Array<[number, bigint]>,\n states: Array<[number, Uint8Array]>,\n ) {\n if (this.sentUserConnect) {\n return;\n }\n\n this.sentUserConnect = true;\n this.send({\n type: \"connectUser\",\n token: this.token,\n observer: this.isObserver,\n components: this.isObserver ? [] : components,\n states: this.isObserver ? [] : states,\n } satisfies DeltaNetV01ConnectUserMessage);\n }\n\n public setUserComponents(\n components: Map<number, bigint>,\n changedStates: Map<number, Uint8Array>,\n ) {\n if (this.disposed) {\n throw new Error(\"DeltaNetClientWebsocketV01Adapter is disposed\");\n }\n\n const messageComponents: Array<[number, bigint]> = [];\n for (const [componentId, value] of components) {\n messageComponents.push([componentId, value]);\n this.components.set(componentId, value);\n }\n\n const messageStates: Array<[number, Uint8Array]> = [];\n for (const [stateId, value] of changedStates) {\n const currentState = this.states.get(stateId);\n if (currentState && areUint8ArraysEqual(currentState, value)) {\n continue;\n }\n this.states.set(stateId, value);\n messageStates.push([stateId, value]);\n }\n\n if (!this.sentUserConnect) {\n this.sendConnectUser(messageComponents, messageStates);\n return;\n }\n\n // Observers should not send component updates after initial connection\n if (this.isObserver) {\n return;\n }\n\n if (this.receivedUserIndex) {\n if (messageComponents.length > 0 || messageStates.length > 0) {\n const setUserComponents: DeltaNetV01SetUserComponentsMessage = {\n type: \"setUserComponents\",\n components: messageComponents,\n states: messageStates,\n };\n this.send(setUserComponents);\n }\n } else {\n for (const [stateId, value] of messageStates) {\n this.queuedStateUpdates.set(stateId, value);\n }\n }\n }\n\n private send(message: DeltaNetV01ClientMessage) {\n const writer = new BufferWriter(256);\n encodeClientMessage(message, writer);\n this.websocket.send(writer.getBuffer());\n }\n\n public sendCustomMessage(customType: number, contents: string) {\n if (this.disposed) {\n return;\n }\n\n const customMessage: DeltaNetV01ClientCustomMessage = {\n type: \"clientCustom\",\n customType,\n contents,\n };\n\n this.send(customMessage);\n }\n\n public receiveMessage(event: MessageEvent) {\n if (this.disposed) {\n return;\n }\n\n const buffer = new Uint8Array(event.data);\n const now = Date.now();\n this.internalOptions.receivedBytes(buffer.byteLength, now);\n const reader = new BufferReader(buffer);\n const messages = decodeServerMessages(reader, {\n ignoreData: this.options.ignoreData,\n });\n for (const message of messages) {\n this.applyMessage(message, now);\n }\n }\n\n private applyMessage(message: DeltaNetV01ServerMessage, now: number) {\n switch (message.type) {\n case \"error\":\n console.error(\"Error from server\", message);\n this.internalOptions.onError(message.errorType, message.message, message.retryable);\n break;\n case \"warning\":\n console.warn(\"Warning from server\", message);\n this.internalOptions.onWarning(message.message);\n break;\n case \"initialCheckout\":\n this.handleInitialCheckout(message, now);\n this.connectedCallback();\n break;\n case \"tick\":\n this.handleTick(message, now);\n break;\n case \"userIndex\":\n this.handleUserIndex(message);\n break;\n case \"ping\":\n this.handlePing(message);\n break;\n case \"serverCustom\":\n this.handleServerCustom(message);\n break;\n default:\n console.warn(\"unknown message type\", message);\n break;\n }\n }\n\n private handleUserIndex(message: DeltaNetV01UserIndexMessage) {\n this.receivedUserIndex = true;\n\n this.options.onUserIndex({\n userIndex: message.index,\n });\n\n this.sendQueuedUpdates();\n }\n\n private sendQueuedUpdates() {\n if (this.queuedStateUpdates.size > 0) {\n const queuedStatesArray: Array<[number, Uint8Array]> = [];\n for (const [stateId, value] of this.queuedStateUpdates) {\n queuedStatesArray.push([stateId, value]);\n }\n const setUserComponents: DeltaNetV01SetUserComponentsMessage = {\n type: \"setUserComponents\",\n components: Array.from(this.components.entries()),\n states: queuedStatesArray,\n };\n this.send(setUserComponents);\n this.queuedStateUpdates.clear();\n }\n }\n\n private handlePing(message: DeltaNetV01PingMessage) {\n this.send({\n type: \"pong\",\n pong: message.ping,\n });\n }\n\n private handleServerCustom(message: DeltaNetV01ServerCustomMessage) {\n this.options.onServerCustom?.(message.customType, message.contents);\n }\n\n public didConnect(): boolean {\n return this.gotInitialCheckout;\n }\n\n private handleInitialCheckout(message: DeltaNetV01InitialCheckoutMessage, now: number) {\n this.gotInitialCheckout = true;\n\n if (this.options.ignoreData) {\n return;\n }\n\n const components = new Map<number, { values: BigInt64Array; deltas: BigInt64Array }>();\n for (const { componentId, deltas, values } of message.components) {\n components.set(componentId, { values, deltas });\n }\n\n const allStates = new Map<number, Array<Uint8Array>>();\n for (const { stateId, values } of message.states) {\n allStates.set(stateId, values);\n }\n\n this.internalOptions.receivedComponentBytes(\n lastInitialCheckoutDebugData.componentsByteLength,\n now,\n );\n this.internalOptions.receivedStateBytes(lastInitialCheckoutDebugData.statesByteLength, now);\n\n this.options.onInitialCheckout({\n indicesCount: message.indicesCount,\n initialComponents: components,\n initialStates: allStates,\n });\n }\n\n private handleTick(message: DeltaNetV01Tick, now: number) {\n if (this.options.ignoreData) {\n return;\n }\n this.timeCallback?.(message.serverTime);\n const components = new Map<number, BigInt64Array>();\n for (const { componentId, deltaDeltas } of message.componentDeltaDeltas) {\n components.set(componentId, deltaDeltas);\n }\n\n const stateChanges = new Map<number, Map<number, Uint8Array>>();\n for (const stateChange of message.states) {\n const updatedStates = new Map<number, Uint8Array>();\n for (const [index, value] of stateChange.updatedStates) {\n updatedStates.set(index, value);\n }\n stateChanges.set(stateChange.stateId, updatedStates);\n }\n\n this.internalOptions.receivedComponentBytes(lastTickDebugData.componentsByteLength, now);\n this.internalOptions.receivedStateBytes(lastTickDebugData.statesByteLength, now);\n\n this.options.onTick({\n unoccupying: message.removedIndices,\n indicesCount: message.indicesCount,\n componentDeltaDeltas: components,\n stateChanges,\n });\n }\n\n dispose() {\n this.disposed = true;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["DeltaNetClientWebsocketStatus"]
3
+ "sources": ["../src/DeltaNetClientState.ts", "../src/DeltaNetClientWebsocket.ts", "../src/DeltaNetClientWebsocketAdapter.ts"],
4
+ "sourcesContent": ["import {\n DeltaNetClientWebsocketInitialCheckout,\n DeltaNetClientWebsocketTick,\n} from \"./DeltaNetClientWebsocket\";\n\nexport type EntityStateUpdate = { stableId: number; stateId: number; state: Uint8Array };\n\nexport type EntityInfo = {\n stableId: number;\n components: Map<number, bigint>;\n states: Map<number, Uint8Array>;\n};\n\nexport type DeltaNetClientComponent = {\n values: BigInt64Array;\n deltas: BigInt64Array;\n deltaDeltas: BigInt64Array;\n};\n\nexport class DeltaNetClientState {\n private componentValues = new Map<number, DeltaNetClientComponent>();\n private allStates = new Map<number, Array<Uint8Array>>();\n\n public byStableId: Map<number, EntityInfo> = new Map();\n\n private localClientIndex: number = -1;\n\n private indicesCount: number = 0;\n\n private stableIdToIndex = new Map<number, number>();\n private stableIds: Array<number> = [];\n private stableIdCounter = 1000; // Start at 1000 to avoid confusion with indices\n\n constructor() {\n this.reset();\n }\n\n /**\n * Reset all state to initial values. This should be called when reconnecting\n * to ensure that stale data from previous connections doesn't interfere.\n */\n public reset() {\n this.componentValues.clear();\n this.allStates.clear();\n this.byStableId.clear();\n this.localClientIndex = -1;\n this.indicesCount = 0;\n this.stableIdToIndex.clear();\n this.stableIds.length = 0;\n this.stableIdCounter = 1000;\n }\n\n public getComponentValues(): Map<number, DeltaNetClientComponent> {\n return this.componentValues;\n }\n\n public getStateById(stateId: number): Array<Uint8Array | null> | null {\n return this.allStates.get(stateId) ?? null;\n }\n\n public getAllStates(): Map<number, Array<Uint8Array | null>> {\n return this.allStates;\n }\n\n public getLocalClientIndex(): number {\n return this.localClientIndex;\n }\n\n public getIndicesCount(): number {\n return this.indicesCount;\n }\n\n public getStableIds(): Array<number> {\n return this.stableIds;\n }\n\n public getComponentValueForStableId(stableId: number, componentId: number): bigint | null {\n const index = this.stableIdToIndex.get(stableId);\n if (index === undefined) {\n return null;\n }\n const componentValue = this.componentValues.get(componentId);\n if (!componentValue) {\n return null;\n }\n return componentValue.values[index] ?? null;\n }\n\n public getComponentsForStableId(stableId: number): Map<number, bigint> | null {\n const index = this.stableIdToIndex.get(stableId);\n if (index === undefined) {\n return null;\n }\n const componentMap = new Map<number, bigint>();\n for (const [key, componentValue] of this.componentValues) {\n if (componentValue === undefined) {\n throw new Error(`Component value for key ${key} is undefined`);\n }\n componentMap.set(key, componentValue.values[index]);\n }\n return componentMap;\n }\n\n public handleInitialCheckout(initialCheckout: DeltaNetClientWebsocketInitialCheckout): {\n addedStableIds: Array<number>;\n } {\n const { indicesCount, initialComponents, initialStates } = initialCheckout;\n const addedStableIds: Array<number> = [];\n for (let i = 0; i < indicesCount; i++) {\n const stableId = this.stableIdCounter++;\n this.stableIds.push(stableId);\n this.stableIdToIndex.set(stableId, i);\n const entityInfo: EntityInfo = {\n stableId,\n components: new Map(),\n states: new Map(),\n };\n this.byStableId.set(stableId, entityInfo);\n addedStableIds.push(stableId);\n }\n this.indicesCount = indicesCount;\n\n const deltaDeltas = new BigInt64Array(indicesCount);\n for (let i = 0; i < deltaDeltas.length; i++) {\n deltaDeltas[i] = BigInt(0);\n }\n\n for (const [key, value] of initialComponents) {\n this.componentValues.set(key, {\n values: value.values,\n deltas: value.deltas,\n deltaDeltas,\n });\n\n for (let i = 0; i < this.stableIds.length; i++) {\n const stableId = this.stableIds[i];\n const entityInfo = this.byStableId.get(stableId);\n if (entityInfo) {\n entityInfo.components.set(key, value.values[i]);\n }\n }\n }\n\n for (const [stateId, values] of initialStates) {\n this.allStates.set(stateId, values);\n\n for (let i = 0; i < this.stableIds.length; i++) {\n const stableId = this.stableIds[i];\n const entityInfo = this.byStableId.get(stableId);\n const stateValue = values[i];\n if (entityInfo) {\n entityInfo.states.set(stateId, stateValue);\n }\n }\n }\n\n return { addedStableIds };\n }\n\n public handleTick(tick: DeltaNetClientWebsocketTick): {\n stateUpdates: Array<EntityStateUpdate>;\n removedStableIds: Array<number>;\n addedStableIds: Array<number>;\n } {\n const { unoccupying, indicesCount, componentDeltaDeltas, stateChanges } = tick;\n\n let removedStableIds: Array<number> = [];\n\n if (unoccupying.length > 0) {\n // Collect stableIds to remove before mutating stableIds\n const stableIdsToRemove = unoccupying.map((index) => this.stableIds[index]);\n removedStableIds = stableIdsToRemove.filter((stableId) => stableId !== undefined);\n\n // Remove unoccupying indices from component values\n for (const [componentId, component] of this.componentValues) {\n this.removeIndicesFromBigInt64Array(unoccupying, component.values);\n this.removeIndicesFromBigInt64Array(unoccupying, component.deltas);\n }\n\n // Remove unoccupying indices from states\n for (const [stateId, state] of this.allStates) {\n this.removeIndicesFromState(unoccupying, state);\n }\n\n // Update localClientIndex\n let decrementIndex = 0;\n for (const index of unoccupying) {\n if (index <= this.localClientIndex) {\n decrementIndex++;\n }\n }\n this.localClientIndex -= decrementIndex;\n\n // Update indices count\n this.indicesCount -= unoccupying.length;\n\n // Update stable indices and stableIds array\n this.removeIndices(unoccupying);\n\n // Remove unoccupied stables from byStableId\n for (const stableId of stableIdsToRemove) {\n if (stableId === undefined) {\n throw new Error(`stableId is undefined`);\n }\n this.byStableId.delete(stableId);\n }\n }\n\n const addedStableIds: Array<number> = [];\n\n if (indicesCount > this.indicesCount) {\n const addedIndices = indicesCount - this.indicesCount;\n\n for (let i = 0; i < addedIndices; i++) {\n const stableId = this.stableIdCounter++;\n this.stableIds.push(stableId);\n this.stableIdToIndex.set(stableId, this.stableIds.length - 1);\n const entityInfo: EntityInfo = {\n stableId,\n components: new Map(),\n states: new Map(),\n };\n this.byStableId.set(stableId, entityInfo);\n addedStableIds.push(stableId);\n }\n }\n\n this.indicesCount = indicesCount;\n\n // Update component values\n for (const [key, deltaDeltas] of componentDeltaDeltas) {\n if (deltaDeltas.length !== indicesCount) {\n throw new Error(\n `DeltaDeltas length (${deltaDeltas.length}) does not match indices count (${indicesCount})`,\n );\n }\n const existingComponent = this.componentValues.get(key);\n if (!existingComponent) {\n const values = new BigInt64Array(deltaDeltas);\n const deltas = new BigInt64Array(deltaDeltas);\n this.componentValues.set(key, { values, deltas, deltaDeltas });\n } else {\n if (existingComponent.values.length < deltaDeltas.length) {\n // Resize the arrays\n const newValues = new BigInt64Array(deltaDeltas.length);\n newValues.set(existingComponent.values);\n const newDeltas = new BigInt64Array(deltaDeltas.length);\n newDeltas.set(existingComponent.deltas);\n const newDeltaDelta = new BigInt64Array(deltaDeltas.length);\n newDeltaDelta.set(existingComponent.deltaDeltas);\n for (let i = existingComponent.values.length; i < deltaDeltas.length; i++) {\n newValues[i] = BigInt(0);\n newDeltas[i] = BigInt(0);\n newDeltaDelta[i] = BigInt(0);\n }\n existingComponent.values = newValues;\n existingComponent.deltas = newDeltas;\n existingComponent.deltaDeltas = newDeltaDelta;\n }\n\n for (let i = 0; i < deltaDeltas.length; i++) {\n const deltaDelta = deltaDeltas[i];\n const stableId = this.stableIds[i];\n\n existingComponent.deltaDeltas[i] = deltaDelta;\n existingComponent.deltas[i] += deltaDelta;\n existingComponent.values[i] += existingComponent.deltas[i];\n\n // Update byStableId map with new component values\n const entityInfo = this.byStableId.get(stableId);\n if (entityInfo) {\n entityInfo.components.set(key, existingComponent.values[i]);\n }\n }\n }\n }\n\n const stateUpdates: Array<EntityStateUpdate> = [];\n\n // Update states\n for (const [stateId, states] of stateChanges) {\n let state = this.allStates.get(stateId);\n if (!state) {\n state = [];\n this.allStates.set(stateId, state);\n }\n\n for (const [index, value] of states) {\n const stableId = this.stableIds[index];\n\n if (stableId === undefined) {\n throw new Error(`Stable ID is undefined for index ${index} in state ${stateId}`);\n }\n\n stateUpdates.push({\n stableId,\n stateId,\n state: value,\n });\n state[index] = value;\n\n // Update byStableId map with new state values\n const entityInfo = this.byStableId.get(stableId);\n if (entityInfo) {\n entityInfo.states.set(stateId, value);\n }\n }\n }\n\n return { stateUpdates, removedStableIds, addedStableIds };\n }\n\n public setLocalIndex(index: number) {\n this.localClientIndex = index;\n }\n\n private removeIndices(removing: Array<number>) {\n if (removing.length === 0) {\n return;\n }\n\n let writeIndex = 0;\n let skipIndex = 0;\n\n for (let readIndex = 0; readIndex < this.stableIds.length; readIndex++) {\n if (skipIndex < removing.length && readIndex === removing[skipIndex]) {\n skipIndex++;\n continue;\n }\n\n const stableId = this.stableIds[readIndex];\n if (writeIndex !== readIndex) {\n this.stableIds[writeIndex] = this.stableIds[readIndex];\n }\n // Update the mapping for all remaining elements to their new indices\n this.stableIdToIndex.set(stableId, writeIndex);\n\n writeIndex++;\n }\n\n // Actually shrink the array to the correct size\n this.stableIds.length = writeIndex;\n }\n\n private removeIndicesFromBigInt64Array(removing: Array<number>, array: BigInt64Array) {\n if (removing.length === 0) {\n return;\n }\n\n let writeIndex = 0;\n let skipIndex = 0;\n\n for (let readIndex = 0; readIndex < array.length; readIndex++) {\n if (skipIndex < removing.length && readIndex === removing[skipIndex]) {\n skipIndex++;\n continue;\n }\n\n if (writeIndex !== readIndex) {\n array[writeIndex] = array[readIndex];\n }\n\n writeIndex++;\n }\n for (let i = writeIndex; i < array.length; i++) {\n array[i] = BigInt(0);\n }\n }\n\n private removeIndicesFromState(removing: Array<number>, state: Array<Uint8Array | null>) {\n if (removing.length === 0) {\n return;\n }\n\n let writeIndex = 0;\n let skipIndex = 0;\n\n for (let readIndex = 0; readIndex < state.length; readIndex++) {\n if (skipIndex < removing.length && readIndex === removing[skipIndex]) {\n skipIndex++;\n continue;\n }\n\n if (writeIndex !== readIndex) {\n state[writeIndex] = state[readIndex];\n }\n\n writeIndex++;\n }\n }\n}\n", "import {\n decodeServerMessages,\n decodeServerMessagesV02,\n deltaNetSupportedSubProtocols,\n deltaNetProtocolSubProtocol_v0_1,\n deltaNetProtocolSubProtocol_v0_2,\n} from \"@mml-io/delta-net-protocol\";\n\nimport { DeltaNetClientWebsocketAdapterImpl } from \"./DeltaNetClientWebsocketAdapter\";\n\nconst startingBackoffTimeMilliseconds = 100;\nconst maximumBackoffTimeMilliseconds = 10000;\nconst maximumWebsocketConnectionTimeout = 5000;\n\nexport type DeltaNetClientWebsocketFactory = (url: string) => WebSocket;\n\nexport enum DeltaNetClientWebsocketStatus {\n Connecting,\n ConnectionOpen, // The websocket is open and connected, but no messages have been received yet\n Connected, // The websocket is open and connected, and messages are being received\n Reconnecting,\n Disconnected,\n}\n\nexport function DeltaNetClientWebsocketStatusToString(\n status: DeltaNetClientWebsocketStatus,\n): string {\n switch (status) {\n case DeltaNetClientWebsocketStatus.Connecting:\n return \"Connecting...\";\n case DeltaNetClientWebsocketStatus.ConnectionOpen:\n return \"Connection Open\";\n case DeltaNetClientWebsocketStatus.Connected:\n return \"Connected\";\n case DeltaNetClientWebsocketStatus.Reconnecting:\n return \"Reconnecting...\";\n case DeltaNetClientWebsocketStatus.Disconnected:\n return \"Disconnected\";\n default:\n return \"Unknown\";\n }\n}\n\nexport type DeltaNetClientWebsocketInitialCheckout = {\n indicesCount: number;\n initialComponents: Map<number, { values: BigInt64Array; deltas: BigInt64Array }>;\n initialStates: Map<number, Array<Uint8Array>>;\n};\n\nexport type DeltaNetClientWebsocketTick = {\n unoccupying: Array<number>;\n indicesCount: number;\n componentDeltaDeltas: Map<number, BigInt64Array>;\n stateChanges: Map<number, Map<number, Uint8Array>>;\n};\n\nexport type DeltaNetClientWebsocketUserIndex = {\n userIndex: number;\n};\n\nexport type DeltaNetClientWebsocketOptions = {\n ignoreData?: boolean;\n observer?: boolean;\n onUserIndex: (userIndex: DeltaNetClientWebsocketUserIndex) => void;\n onInitialCheckout: (initialCheckout: DeltaNetClientWebsocketInitialCheckout) => void;\n onTick: (tick: DeltaNetClientWebsocketTick) => void;\n onError: (errorType: string, errorMessage: string, retryable: boolean) => void;\n onWarning: (warning: string) => void;\n onServerCustom?: (customType: number, contents: string) => void;\n};\n\nexport type DeltaNetClientWebsocketAdapter = {\n receiveMessage: (message: MessageEvent) => void;\n setUserComponents: (\n components: Map<number, bigint>,\n changedStates: Map<number, Uint8Array>,\n ) => void;\n sendCustomMessage: (customType: number, contents: string) => void;\n didConnect: () => boolean;\n dispose: () => void;\n};\n\nfunction updateLastSecondArray(\n records: Array<[number, number]>,\n size: number,\n time: number,\n): number {\n let sizeChange = size;\n const oneSecondAgo = time - 1000;\n records.push([time, size]);\n let i;\n for (i = 0; i < records.length; i++) {\n if (records[i][0] < oneSecondAgo) {\n sizeChange -= records[i][1];\n } else {\n break;\n }\n }\n records.splice(0, i);\n return sizeChange;\n}\n\n/**\n * DeltaNetClientWebsocket is a client for a DeltaNetServer. It connects to a server on the provided url and receives\n * updates to the DOM. It also sends events to the server for interactions with the DOM.\n *\n * The DeltaNetClientWebsocket is attached to a parentElement and synchronizes the received DOM under that element.\n */\nexport class DeltaNetClientWebsocket {\n private websocket: WebSocket | null = null;\n private websocketAdapter: DeltaNetClientWebsocketAdapter | null = null;\n\n private stopped = false;\n private backoffTime = startingBackoffTimeMilliseconds;\n private status: DeltaNetClientWebsocketStatus = DeltaNetClientWebsocketStatus.Connecting;\n\n public bandwidthPerSecond = 0;\n public lastSecondMessageSizes: Array<[number, number]> = []; // Timestamp in ms, size in bytes\n public componentBytesPerSecond = 0;\n public lastSecondComponentBufferSizes: Array<[number, number]> = []; // Timestamp in ms, size in bytes\n public stateBytesPerSecond = 0;\n public lastSecondStateBufferSizes: Array<[number, number]> = []; // Timestamp in ms, size in bytes\n\n public static createWebSocket(url: string): WebSocket {\n // Spread into a mutable array because the WebSocket constructor doesn't accept readonly string[]\n return new WebSocket(url, [...deltaNetSupportedSubProtocols]);\n }\n\n constructor(\n private url: string,\n private websocketFactory: DeltaNetClientWebsocketFactory,\n private token: string,\n private options: DeltaNetClientWebsocketOptions,\n private timeCallback?: (time: number) => void,\n private statusUpdateCallback?: (status: DeltaNetClientWebsocketStatus) => void,\n private resolveProtocol?: (websocketProtocol: string) => string | null,\n ) {\n this.setStatus(DeltaNetClientWebsocketStatus.Connecting);\n this.startWebSocketConnectionAttempt();\n }\n\n private setStatus(status: DeltaNetClientWebsocketStatus) {\n if (this.status !== status) {\n this.status = status;\n if (this.statusUpdateCallback) {\n this.statusUpdateCallback(status);\n }\n }\n }\n\n public getStatus(): DeltaNetClientWebsocketStatus {\n return this.status;\n }\n\n private async createWebsocketWithTimeout(timeout: number): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const websocket = this.websocketFactory(this.url);\n const timeoutId = setTimeout(() => {\n reject(new Error(\"websocket connection timed out\"));\n websocket.close();\n }, timeout);\n websocket.binaryType = \"arraybuffer\";\n websocket.addEventListener(\"open\", () => {\n clearTimeout(timeoutId);\n\n this.websocket = websocket;\n\n const adapterInternalOptions = {\n receivedBytes: (bytes: number, now: number) => {\n this.bandwidthPerSecond += updateLastSecondArray(\n this.lastSecondMessageSizes,\n bytes,\n now,\n );\n },\n receivedComponentBytes: (bytes: number, now: number) => {\n this.componentBytesPerSecond += updateLastSecondArray(\n this.lastSecondComponentBufferSizes,\n bytes,\n now,\n );\n },\n receivedStateBytes: (bytes: number, now: number) => {\n this.stateBytesPerSecond += updateLastSecondArray(\n this.lastSecondStateBufferSizes,\n bytes,\n now,\n );\n },\n onError: (errorType: string, errorMessage: string, retryable: boolean) => {\n this.options.onError(errorType, errorMessage, retryable);\n if (this.websocket === websocket) {\n this.websocket?.close();\n this.websocket = null;\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n onWebsocketClose(retryable);\n }\n },\n onWarning: (warning: string) => {\n this.options.onWarning(warning);\n },\n };\n\n const connectedCallback = () => {\n this.backoffTime = startingBackoffTimeMilliseconds;\n this.setStatus(DeltaNetClientWebsocketStatus.Connected);\n };\n\n const resolvedProtocol = this.resolveProtocol\n ? (this.resolveProtocol(websocket.protocol) ?? websocket.protocol)\n : websocket.protocol;\n let decoder: typeof decodeServerMessages;\n if (resolvedProtocol === deltaNetProtocolSubProtocol_v0_2) {\n decoder = decodeServerMessagesV02;\n } else if (resolvedProtocol === deltaNetProtocolSubProtocol_v0_1) {\n decoder = decodeServerMessages;\n } else if (resolvedProtocol === \"\") {\n console.warn(\n \"DeltaNetClientWebsocket: no sub-protocol negotiated, falling back to v0.1 decoding\",\n );\n decoder = decodeServerMessages;\n } else {\n const errorMsg = `DeltaNetClientWebsocket: unrecognized protocol \"${resolvedProtocol}\"`;\n console.error(errorMsg);\n websocket.close(1002, \"Unrecognized protocol\");\n reject(new Error(errorMsg));\n return;\n }\n\n const websocketAdapter: DeltaNetClientWebsocketAdapter =\n new DeltaNetClientWebsocketAdapterImpl(\n websocket,\n connectedCallback,\n this.options,\n this.token,\n adapterInternalOptions,\n decoder,\n this.timeCallback,\n );\n\n this.websocketAdapter = websocketAdapter;\n\n websocket.addEventListener(\"message\", (event) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket message event because it is no longer current\");\n websocket.close();\n return;\n }\n if (this.stopped) {\n console.warn(\"Ignoring websocket message event because the client is stopped\");\n return;\n }\n\n websocketAdapter.receiveMessage(event);\n });\n\n const onWebsocketClose = async (retryable: boolean = true) => {\n let didConnect = false;\n if (this.websocketAdapter) {\n didConnect = this.websocketAdapter.didConnect();\n }\n if (this.stopped) {\n // This closing is expected. The client closed the websocket.\n this.setStatus(DeltaNetClientWebsocketStatus.Disconnected);\n return;\n }\n if (retryable) {\n if (!didConnect) {\n // The websocket did not deliver any contents.\n // It may have been successfully opened, but immediately closed.\n // This client should back off to prevent this happening in a rapid loop.\n await this.waitBackoffTime();\n }\n // The websocket closed unexpectedly. Try to reconnect.\n this.setStatus(DeltaNetClientWebsocketStatus.Reconnecting);\n this.startWebSocketConnectionAttempt();\n } else {\n this.setStatus(DeltaNetClientWebsocketStatus.Disconnected);\n }\n };\n\n websocket.addEventListener(\"close\", () => {\n if (websocket !== this.websocket) {\n console.warn(\"Ignoring websocket close event because it is no longer current\");\n return;\n }\n this.websocket = null;\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n onWebsocketClose();\n });\n websocket.addEventListener(\"error\", (e) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket error event because it is no longer current\");\n return;\n }\n console.error(\"DeltaNetClientWebsocket error\", e);\n this.websocket = null;\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n onWebsocketClose();\n });\n\n this.setStatus(DeltaNetClientWebsocketStatus.ConnectionOpen);\n resolve(websocket);\n });\n websocket.addEventListener(\"error\", (e) => {\n clearTimeout(timeoutId);\n reject(e);\n });\n });\n }\n\n private async waitBackoffTime(): Promise<void> {\n console.warn(`Websocket connection to '${this.url}' failed: retrying in ${this.backoffTime}ms`);\n await new Promise((resolve) => setTimeout(resolve, this.backoffTime));\n this.backoffTime = Math.min(\n // Introduce a small amount of randomness to prevent clients from retrying in lockstep\n this.backoffTime * (1.5 + Math.random() * 0.5),\n maximumBackoffTimeMilliseconds,\n );\n }\n\n private async startWebSocketConnectionAttempt() {\n if (this.stopped) {\n return;\n }\n while (true) {\n if (this.stopped) {\n return;\n }\n try {\n await this.createWebsocketWithTimeout(maximumWebsocketConnectionTimeout);\n break;\n } catch (e) {\n console.error(\"Websocket connection failed\", e);\n // Connection failed, retry with backoff\n this.setStatus(DeltaNetClientWebsocketStatus.Reconnecting);\n await this.waitBackoffTime();\n }\n }\n }\n\n public stop() {\n this.stopped = true;\n if (this.websocket !== null) {\n this.websocket.close();\n this.websocket = null;\n }\n this.websocketAdapter?.dispose();\n this.websocketAdapter = null;\n }\n\n public setUserComponents(\n components: Map<number, bigint>,\n changedStates: Map<number, Uint8Array>,\n ) {\n if (this.websocketAdapter) {\n this.websocketAdapter.setUserComponents(components, changedStates);\n }\n }\n\n public sendCustomMessage(customType: number, contents: string) {\n if (this.websocketAdapter) {\n this.websocketAdapter.sendCustomMessage(customType, contents);\n }\n }\n}\n", "import {\n BufferReader,\n BufferWriter,\n DecodeDebugData,\n DecodeServerMessageOptions,\n DeltaNetClientCustomMessage,\n DeltaNetClientMessage,\n DeltaNetConnectUserMessage,\n DeltaNetInitialCheckoutMessage,\n DeltaNetPingMessage,\n DeltaNetServerCustomMessage,\n DeltaNetServerMessage,\n DeltaNetSetUserComponentsMessage,\n DeltaNetTick,\n DeltaNetUserIndexMessage,\n encodeClientMessage,\n} from \"@mml-io/delta-net-protocol\";\n\nimport {\n DeltaNetClientWebsocketAdapter,\n DeltaNetClientWebsocketOptions,\n} from \"./DeltaNetClientWebsocket\";\n\nexport type ServerMessageDecoder = (\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n) => Array<DeltaNetServerMessage>;\n\nfunction areUint8ArraysEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nexport class DeltaNetClientWebsocketAdapterImpl implements DeltaNetClientWebsocketAdapter {\n private gotInitialCheckout = false;\n private sentUserConnect = false;\n private receivedUserIndex = false;\n private queuedStateUpdates = new Map<number, Uint8Array>();\n private components = new Map<number, bigint>();\n private states = new Map<number, Uint8Array>();\n private disposed = false;\n private isObserver: boolean;\n\n constructor(\n private websocket: WebSocket,\n private connectedCallback: () => void,\n private options: DeltaNetClientWebsocketOptions,\n private token: string,\n private internalOptions: {\n receivedBytes: (bytes: number, now: number) => void;\n receivedComponentBytes: (bytes: number, now: number) => void;\n receivedStateBytes: (bytes: number, now: number) => void;\n onError: (errorType: string, errorMessage: string, retryable: boolean) => void;\n onWarning: (warning: string) => void;\n },\n private decodeServerMessages: ServerMessageDecoder,\n private timeCallback?: (time: number) => void,\n ) {\n this.websocket.binaryType = \"arraybuffer\";\n this.isObserver = options.observer ?? false;\n\n // Observers need to send connectUser message immediately since they won't call setUserComponents\n if (this.isObserver) {\n this.sendConnectUser([], []);\n }\n }\n\n private sendConnectUser(\n components: Array<[number, bigint]>,\n states: Array<[number, Uint8Array]>,\n ) {\n if (this.sentUserConnect) {\n return;\n }\n\n this.sentUserConnect = true;\n this.send({\n type: \"connectUser\",\n token: this.token,\n observer: this.isObserver,\n components: this.isObserver ? [] : components,\n states: this.isObserver ? [] : states,\n } satisfies DeltaNetConnectUserMessage);\n }\n\n public setUserComponents(\n components: Map<number, bigint>,\n changedStates: Map<number, Uint8Array>,\n ) {\n if (this.disposed) {\n throw new Error(\"DeltaNetClientWebsocketAdapter is disposed\");\n }\n\n const messageComponents: Array<[number, bigint]> = [];\n for (const [componentId, value] of components) {\n messageComponents.push([componentId, value]);\n this.components.set(componentId, value);\n }\n\n const messageStates: Array<[number, Uint8Array]> = [];\n for (const [stateId, value] of changedStates) {\n const currentState = this.states.get(stateId);\n if (currentState && areUint8ArraysEqual(currentState, value)) {\n continue;\n }\n this.states.set(stateId, value);\n messageStates.push([stateId, value]);\n }\n\n if (!this.sentUserConnect) {\n this.sendConnectUser(messageComponents, messageStates);\n return;\n }\n\n // Observers should not send component updates after initial connection\n if (this.isObserver) {\n return;\n }\n\n if (this.receivedUserIndex) {\n if (messageComponents.length > 0 || messageStates.length > 0) {\n const setUserComponents: DeltaNetSetUserComponentsMessage = {\n type: \"setUserComponents\",\n components: messageComponents,\n states: messageStates,\n };\n this.send(setUserComponents);\n }\n } else {\n for (const [stateId, value] of messageStates) {\n this.queuedStateUpdates.set(stateId, value);\n }\n }\n }\n\n private send(message: DeltaNetClientMessage) {\n const writer = new BufferWriter(256);\n encodeClientMessage(message, writer);\n this.websocket.send(writer.getBuffer());\n }\n\n public sendCustomMessage(customType: number, contents: string) {\n if (this.disposed) {\n return;\n }\n\n const customMessage: DeltaNetClientCustomMessage = {\n type: \"clientCustom\",\n customType,\n contents,\n };\n\n this.send(customMessage);\n }\n\n public receiveMessage(event: MessageEvent) {\n if (this.disposed) {\n return;\n }\n\n const buffer = new Uint8Array(event.data);\n const now = Date.now();\n this.internalOptions.receivedBytes(buffer.byteLength, now);\n const reader = new BufferReader(buffer);\n const debugData: DecodeDebugData = { componentsByteLength: 0, statesByteLength: 0 };\n const messages = this.decodeServerMessages(reader, {\n ignoreData: this.options.ignoreData,\n debugData,\n });\n for (const message of messages) {\n this.applyMessage(message);\n }\n if (debugData.componentsByteLength > 0) {\n this.internalOptions.receivedComponentBytes(debugData.componentsByteLength, now);\n }\n if (debugData.statesByteLength > 0) {\n this.internalOptions.receivedStateBytes(debugData.statesByteLength, now);\n }\n }\n\n private applyMessage(message: DeltaNetServerMessage) {\n switch (message.type) {\n case \"error\":\n console.error(\"Error from server\", message);\n this.internalOptions.onError(message.errorType, message.message, message.retryable);\n break;\n case \"warning\":\n console.warn(\"Warning from server\", message);\n this.internalOptions.onWarning(message.message);\n break;\n case \"initialCheckout\":\n this.handleInitialCheckout(message);\n this.connectedCallback();\n break;\n case \"tick\":\n this.handleTick(message);\n break;\n case \"userIndex\":\n this.handleUserIndex(message);\n break;\n case \"ping\":\n this.handlePing(message);\n break;\n case \"serverCustom\":\n this.handleServerCustom(message);\n break;\n default:\n console.warn(\"unknown message type\", message);\n break;\n }\n }\n\n private handleUserIndex(message: DeltaNetUserIndexMessage) {\n this.receivedUserIndex = true;\n\n this.options.onUserIndex({\n userIndex: message.index,\n });\n\n this.sendQueuedUpdates();\n }\n\n private sendQueuedUpdates() {\n if (this.queuedStateUpdates.size > 0) {\n const queuedStatesArray: Array<[number, Uint8Array]> = [];\n for (const [stateId, value] of this.queuedStateUpdates) {\n queuedStatesArray.push([stateId, value]);\n }\n const setUserComponents: DeltaNetSetUserComponentsMessage = {\n type: \"setUserComponents\",\n components: Array.from(this.components.entries()),\n states: queuedStatesArray,\n };\n this.send(setUserComponents);\n this.queuedStateUpdates.clear();\n }\n }\n\n private handlePing(message: DeltaNetPingMessage) {\n this.send({\n type: \"pong\",\n pong: message.ping,\n });\n }\n\n private handleServerCustom(message: DeltaNetServerCustomMessage) {\n this.options.onServerCustom?.(message.customType, message.contents);\n }\n\n public didConnect(): boolean {\n return this.gotInitialCheckout;\n }\n\n private handleInitialCheckout(message: DeltaNetInitialCheckoutMessage) {\n this.gotInitialCheckout = true;\n\n if (this.options.ignoreData) {\n return;\n }\n\n const components = new Map<number, { values: BigInt64Array; deltas: BigInt64Array }>();\n for (const { componentId, deltas, values } of message.components) {\n components.set(componentId, { values, deltas });\n }\n\n const allStates = new Map<number, Array<Uint8Array>>();\n for (const { stateId, values } of message.states) {\n allStates.set(stateId, values);\n }\n\n this.options.onInitialCheckout({\n indicesCount: message.indicesCount,\n initialComponents: components,\n initialStates: allStates,\n });\n }\n\n private handleTick(message: DeltaNetTick) {\n if (this.options.ignoreData) {\n return;\n }\n this.timeCallback?.(message.serverTime);\n const components = new Map<number, BigInt64Array>();\n for (const { componentId, deltaDeltas } of message.componentDeltaDeltas) {\n components.set(componentId, deltaDeltas);\n }\n\n const stateChanges = new Map<number, Map<number, Uint8Array>>();\n for (const stateChange of message.states) {\n const updatedStates = new Map<number, Uint8Array>();\n for (const [index, value] of stateChange.updatedStates) {\n updatedStates.set(index, value);\n }\n stateChanges.set(stateChange.stateId, updatedStates);\n }\n\n this.options.onTick({\n unoccupying: message.removedIndices,\n indicesCount: message.indicesCount,\n componentDeltaDeltas: components,\n stateChanges,\n });\n }\n\n dispose() {\n this.disposed = true;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["decodeServerMessages", "DeltaNetClientWebsocketStatus"]
7
7
  }
package/package.json CHANGED
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "name": "@mml-io/delta-net-web",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/mml-io/3d-web-experience.git",
10
+ "directory": "packages/deltanet/delta-net-web"
11
+ },
7
12
  "main": "./build/index.js",
8
13
  "types": "./build/index.d.ts",
9
14
  "type": "module",
@@ -20,7 +25,7 @@
20
25
  "test-iterate": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --watch"
21
26
  },
22
27
  "dependencies": {
23
- "@mml-io/delta-net-protocol": "^0.26.0"
28
+ "@mml-io/delta-net-protocol": "^0.27.0"
24
29
  },
25
30
  "devDependencies": {
26
31
  "jest-canvas-mock": "2.5.2",
@@ -28,5 +33,5 @@
28
33
  "jest-expect-message": "1.1.3",
29
34
  "jest-junit": "16.0.0"
30
35
  },
31
- "gitHead": "2a3c26bb10a6db0452450b08a5d9d921a5084963"
36
+ "gitHead": "4038d512f99c0700d77337a0daa6f49b281dce87"
32
37
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeltaNetClientWebsocketV01Adapter.d.ts","sourceRoot":"","sources":["../src/DeltaNetClientWebsocketV01Adapter.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,EAC/B,MAAM,2BAA2B,CAAC;AAUnC,qBAAa,iCAAkC,YAAW,8BAA8B;IAWpF,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,YAAY,CAAC;IArBvB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;gBAGlB,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,MAAM,IAAI,EAC7B,OAAO,EAAE,8BAA8B,EACvC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE;QACvB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QACpD,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7D,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QACzD,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;QAC/E,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KACtC,EACO,YAAY,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,aAAA;IAW/C,OAAO,CAAC,eAAe;IAkBhB,iBAAiB,CACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAgDxC,OAAO,CAAC,IAAI;IAML,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IActD,cAAc,CAAC,KAAK,EAAE,YAAY;IAiBzC,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAInB,UAAU,IAAI,OAAO;IAI5B,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,UAAU;IA8BlB,OAAO;CAGR"}