@dxos/edge-client 0.8.2-main.f11618f → 0.8.2-staging.7ac8446

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.
Files changed (44) hide show
  1. package/dist/lib/browser/chunk-ZWJXA37R.mjs +113 -0
  2. package/dist/lib/browser/chunk-ZWJXA37R.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +299 -87
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +20 -32
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/chunk-ANV2HBEH.cjs +136 -0
  9. package/dist/lib/node/chunk-ANV2HBEH.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +297 -76
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +21 -31
  14. package/dist/lib/node/testing/index.cjs.map +3 -3
  15. package/dist/lib/node-esm/chunk-HNVT57AU.mjs +115 -0
  16. package/dist/lib/node-esm/chunk-HNVT57AU.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +299 -87
  18. package/dist/lib/node-esm/index.mjs.map +4 -4
  19. package/dist/lib/node-esm/meta.json +1 -1
  20. package/dist/lib/node-esm/testing/index.mjs +20 -32
  21. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  22. package/dist/types/src/edge-client.d.ts +2 -7
  23. package/dist/types/src/edge-client.d.ts.map +1 -1
  24. package/dist/types/src/edge-ws-connection.d.ts +0 -5
  25. package/dist/types/src/edge-ws-connection.d.ts.map +1 -1
  26. package/dist/types/src/index.d.ts +0 -1
  27. package/dist/types/src/index.d.ts.map +1 -1
  28. package/dist/types/src/testing/test-utils.d.ts +2 -6
  29. package/dist/types/src/testing/test-utils.d.ts.map +1 -1
  30. package/package.json +14 -14
  31. package/src/edge-client.test.ts +4 -5
  32. package/src/edge-client.ts +8 -16
  33. package/src/edge-ws-connection.ts +15 -38
  34. package/src/index.ts +0 -1
  35. package/src/testing/test-utils.ts +26 -33
  36. package/dist/lib/browser/chunk-5DDWS5EC.mjs +0 -546
  37. package/dist/lib/browser/chunk-5DDWS5EC.mjs.map +0 -7
  38. package/dist/lib/node/chunk-CNAHGYSS.cjs +0 -579
  39. package/dist/lib/node/chunk-CNAHGYSS.cjs.map +0 -7
  40. package/dist/lib/node-esm/chunk-O4TFZRSP.mjs +0 -548
  41. package/dist/lib/node-esm/chunk-O4TFZRSP.mjs.map +0 -7
  42. package/dist/types/src/edge-ws-muxer.d.ts +0 -23
  43. package/dist/types/src/edge-ws-muxer.d.ts.map +0 -1
  44. package/src/edge-ws-muxer.ts +0 -187
@@ -1 +1 @@
1
- {"version":3,"file":"edge-ws-connection.d.ts","sourceRoot":"","sources":["../../../src/edge-ws-connection.ts"],"names":[],"mappings":"AAOA,OAAO,EAAW,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIlD,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAGzF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD;;GAEG;AACH,eAAO,MAAM,0BAA0B,eAAe,CAAC;AAEvD,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,QAAQ;IAM1C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP7B,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,QAAQ,CAA6B;gBAG1B,SAAS,EAAE,YAAY,EACvB,eAAe,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EACtD,UAAU,EAAE,yBAAyB;IAKxD,IACW,IAAI;;;;MAMd;IAEM,IAAI,CAAC,OAAO,EAAE,OAAO;cAoBH,KAAK;cA+DL,MAAM;IAgB/B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,2BAA2B;CAiBpC"}
1
+ {"version":3,"file":"edge-ws-connection.d.ts","sourceRoot":"","sources":["../../../src/edge-ws-connection.ts"],"names":[],"mappings":"AAOA,OAAO,EAAW,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIlD,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAGzF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,QAAQ;IAK1C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN7B,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,GAAG,CAAwB;gBAGhB,SAAS,EAAE,YAAY,EACvB,eAAe,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EACtD,UAAU,EAAE,yBAAyB;IAKxD,IACW,IAAI;;;;MAMd;IAEM,IAAI,CAAC,OAAO,EAAE,OAAO;cAeH,KAAK;cAkDL,MAAM;IAc/B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,2BAA2B;CAiBpC"}
@@ -6,5 +6,4 @@ export * from './errors';
6
6
  export * from './auth';
7
7
  export * from './edge-http-client';
8
8
  export * from './edge-identity';
9
- export * from './edge-ws-muxer';
10
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,4CAA4C,CAAC;AAE3D,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,4CAA4C,CAAC;AAE3D,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import WebSocket from 'isomorphic-ws';
2
2
  import { Trigger } from '@dxos/async';
3
3
  import { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
4
- import { WebSocketMuxer } from '../edge-ws-muxer';
5
4
  export declare const DEFAULT_PORT = 8080;
6
5
  type TestEdgeWsServerParams = {
7
6
  admitConnection?: Trigger;
@@ -14,12 +13,9 @@ export declare const createTestEdgeWsServer: (port?: number, params?: TestEdgeWs
14
13
  messageSourceLog: any[];
15
14
  endpoint: string;
16
15
  cleanup: () => void;
17
- currentConnection: () => {
18
- ws: WebSocket;
19
- muxer: WebSocketMuxer;
20
- } | undefined;
16
+ currentConnection: () => WebSocket | undefined;
21
17
  sendResponseMessage: (request: Message, responsePayload: Uint8Array) => void;
22
- sendMessage: (msg: Message) => Promise<void>;
18
+ sendMessage: (msg: Message) => void;
23
19
  closeConnection: () => Promise<void>;
24
20
  }>;
25
21
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-utils.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAI5G,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,KAAK,sBAAsB,GAAG;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,GAAG,CAAC;IAC9C,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CACpE,CAAC;AAEF,eAAO,MAAM,sBAAsB,2BAAwC,sBAAsB;;;;;;;YAOzE,SAAS;eAAS,cAAc;;mCAwErC,OAAO,mBAAmB,UAAU;uBA1BhC,OAAO;;EAS7B,CAAC"}
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-utils.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAK5G,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,KAAK,sBAAsB,GAAG;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,GAAG,CAAC;IAC9C,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CACpE,CAAC;AAEF,eAAO,MAAM,sBAAsB,2BAAwC,sBAAsB;;;;;;;mCAsE9E,OAAO,mBAAmB,UAAU;uBA1BhC,OAAO;;EAS7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/edge-client",
3
- "version": "0.8.2-main.f11618f",
3
+ "version": "0.8.2-staging.7ac8446",
4
4
  "description": "EDGE Client",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -36,21 +36,21 @@
36
36
  "dependencies": {
37
37
  "isomorphic-ws": "^5.0.0",
38
38
  "ws": "^8.14.2",
39
- "@dxos/credentials": "0.8.2-main.f11618f",
40
- "@dxos/context": "0.8.2-main.f11618f",
41
- "@dxos/crypto": "0.8.2-main.f11618f",
42
- "@dxos/async": "0.8.2-main.f11618f",
43
- "@dxos/invariant": "0.8.2-main.f11618f",
44
- "@dxos/keyring": "0.8.2-main.f11618f",
45
- "@dxos/debug": "0.8.2-main.f11618f",
46
- "@dxos/log": "0.8.2-main.f11618f",
47
- "@dxos/keys": "0.8.2-main.f11618f",
48
- "@dxos/node-std": "0.8.2-main.f11618f",
49
- "@dxos/protocols": "0.8.2-main.f11618f",
50
- "@dxos/util": "0.8.2-main.f11618f"
39
+ "@dxos/async": "0.8.2-staging.7ac8446",
40
+ "@dxos/context": "0.8.2-staging.7ac8446",
41
+ "@dxos/credentials": "0.8.2-staging.7ac8446",
42
+ "@dxos/crypto": "0.8.2-staging.7ac8446",
43
+ "@dxos/keyring": "0.8.2-staging.7ac8446",
44
+ "@dxos/debug": "0.8.2-staging.7ac8446",
45
+ "@dxos/keys": "0.8.2-staging.7ac8446",
46
+ "@dxos/invariant": "0.8.2-staging.7ac8446",
47
+ "@dxos/log": "0.8.2-staging.7ac8446",
48
+ "@dxos/protocols": "0.8.2-staging.7ac8446",
49
+ "@dxos/node-std": "0.8.2-staging.7ac8446",
50
+ "@dxos/util": "0.8.2-staging.7ac8446"
51
51
  },
52
52
  "devDependencies": {
53
- "@dxos/test-utils": "0.8.2-main.f11618f"
53
+ "@dxos/test-utils": "0.8.2-staging.7ac8446"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"
@@ -7,7 +7,6 @@ import { describe, expect, onTestFinished, test } from 'vitest';
7
7
  import { Trigger } from '@dxos/async';
8
8
  import { Keyring } from '@dxos/keyring';
9
9
  import { TextMessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
10
- import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
11
10
  import { openAndClose } from '@dxos/test-utils';
12
11
 
13
12
  import { createEphemeralEdgeIdentity, createTestHaloEdgeIdentity } from './auth';
@@ -41,17 +40,17 @@ describe('EdgeClient', () => {
41
40
 
42
41
  const { client } = await openNewClient(endpoint);
43
42
 
44
- expect(client.status).toBe(EdgeStatus.NOT_CONNECTED);
43
+ expect(client.isConnected).toBeFalsy();
45
44
  admitConnection.wake();
46
- await expect.poll(() => client.status).toBe(EdgeStatus.CONNECTED);
45
+ await expect.poll(() => client.isConnected).toBeTruthy();
47
46
 
48
47
  admitConnection.reset();
49
48
  await closeConnection();
50
49
  expect(client.isOpen).is.true;
51
- await expect.poll(() => client.status).toBe(EdgeStatus.NOT_CONNECTED);
50
+ await expect.poll(() => client.isConnected).toBeFalsy();
52
51
 
53
52
  admitConnection.wake();
54
- await expect.poll(() => client.status).toBe(EdgeStatus.CONNECTED);
53
+ await expect.poll(() => client.isConnected).toBeTruthy();
55
54
  });
56
55
 
57
56
  test('set identity reconnects', async () => {
@@ -2,11 +2,10 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Trigger, scheduleMicroTask, TriggerState, PersistentLifecycle, Event } from '@dxos/async';
5
+ import { Trigger, scheduleMicroTask, TriggerState, PersistentLifecycle } from '@dxos/async';
6
6
  import { Resource, type Lifecycle } from '@dxos/context';
7
7
  import { log, logInfo } from '@dxos/log';
8
8
  import { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
9
- import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
10
9
 
11
10
  import { protocol } from './defs';
12
11
  import { type EdgeIdentity, handleAuthChallenge } from './edge-identity';
@@ -21,12 +20,11 @@ export type MessageListener = (message: Message) => void;
21
20
  export type ReconnectListener = () => void;
22
21
 
23
22
  export interface EdgeConnection extends Required<Lifecycle> {
24
- statusChanged: Event<EdgeStatus>;
25
23
  get info(): any;
26
24
  get identityKey(): string;
27
25
  get peerKey(): string;
28
26
  get isOpen(): boolean;
29
- get status(): EdgeStatus;
27
+ get isConnected(): boolean;
30
28
  setIdentity(identity: EdgeIdentity): void;
31
29
  onMessage(listener: MessageListener): () => void;
32
30
  onReconnected(listener: ReconnectListener): () => void;
@@ -47,8 +45,6 @@ export type MessengerConfig = {
47
45
  * - Dispatches connection state and message notifications.
48
46
  */
49
47
  export class EdgeClient extends Resource implements EdgeConnection {
50
- public readonly statusChanged = new Event<EdgeStatus>();
51
-
52
48
  private readonly _persistentLifecycle = new PersistentLifecycle<EdgeWsConnection>({
53
49
  start: async () => this._connect(),
54
50
  stop: async (state: EdgeWsConnection) => this._disconnect(state),
@@ -56,8 +52,10 @@ export class EdgeClient extends Resource implements EdgeConnection {
56
52
 
57
53
  private readonly _messageListeners = new Set<MessageListener>();
58
54
  private readonly _reconnectListeners = new Set<ReconnectListener>();
55
+
59
56
  private readonly _baseWsUrl: string;
60
57
  private readonly _baseHttpUrl: string;
58
+
61
59
  private _currentConnection?: EdgeWsConnection = undefined;
62
60
  private _ready = new Trigger();
63
61
 
@@ -74,16 +72,13 @@ export class EdgeClient extends Resource implements EdgeConnection {
74
72
  public get info() {
75
73
  return {
76
74
  open: this.isOpen,
77
- status: this.status,
78
75
  identity: this._identity.identityKey,
79
76
  device: this._identity.peerKey,
80
77
  };
81
78
  }
82
79
 
83
- get status(): EdgeStatus {
84
- return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED
85
- ? EdgeStatus.CONNECTED
86
- : EdgeStatus.NOT_CONNECTED;
80
+ get isConnected() {
81
+ return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED;
87
82
  }
88
83
 
89
84
  get identityKey() {
@@ -99,7 +94,7 @@ export class EdgeClient extends Resource implements EdgeConnection {
99
94
  log('Edge identity changed', { identity, oldIdentity: this._identity });
100
95
  this._identity = identity;
101
96
  this._closeCurrentConnection(new EdgeIdentityChangedError());
102
- void this._persistentLifecycle.scheduleRestart();
97
+ this._persistentLifecycle.scheduleRestart();
103
98
  }
104
99
  }
105
100
 
@@ -176,7 +171,7 @@ export class EdgeClient extends Resource implements EdgeConnection {
176
171
  onRestartRequired: () => {
177
172
  if (this._isActive(connection)) {
178
173
  this._closeCurrentConnection();
179
- void this._persistentLifecycle.scheduleRestart();
174
+ this._persistentLifecycle.scheduleRestart();
180
175
  } else {
181
176
  log.verbose('restart requested by inactive connection');
182
177
  }
@@ -206,18 +201,15 @@ export class EdgeClient extends Resource implements EdgeConnection {
206
201
 
207
202
  private async _disconnect(state: EdgeWsConnection) {
208
203
  await state.close();
209
- this.statusChanged.emit(this.status);
210
204
  }
211
205
 
212
206
  private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()) {
213
207
  this._currentConnection = undefined;
214
208
  this._ready.throw(error);
215
209
  this._ready.reset();
216
- this.statusChanged.emit(this.status);
217
210
  }
218
211
 
219
212
  private _notifyReconnected() {
220
- this.statusChanged.emit(this.status);
221
213
  for (const listener of this._reconnectListeners) {
222
214
  try {
223
215
  listener();
@@ -13,17 +13,15 @@ import { MessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messe
13
13
 
14
14
  import { protocol } from './defs';
15
15
  import { type EdgeIdentity } from './edge-identity';
16
- import { CLOUDFLARE_MESSAGE_LENGTH_LIMIT, WebSocketMuxer } from './edge-ws-muxer';
17
16
  import { toUint8Array } from './protocol';
18
17
 
19
18
  const SIGNAL_KEEPALIVE_INTERVAL = 4_000;
20
19
  const SIGNAL_KEEPALIVE_TIMEOUT = 12_000;
21
20
 
22
- const EDGE_WEBSOCKET_PROTOCOL_V0 = 'edge-ws-v0';
23
21
  /**
24
- * Supports message segmentation and muxing.
22
+ * 1MB websocket message limit: https://developers.cloudflare.com/durable-objects/platform/limits/
25
23
  */
26
- export const EDGE_WEBSOCKET_PROTOCOL_V1 = 'edge-ws-v1';
24
+ const CLOUDFLARE_MESSAGE_LENGTH_LIMIT = 1024 * 1024;
27
25
 
28
26
  export type EdgeWsConnectionCallbacks = {
29
27
  onConnected: () => void;
@@ -34,7 +32,6 @@ export type EdgeWsConnectionCallbacks = {
34
32
  export class EdgeWsConnection extends Resource {
35
33
  private _inactivityTimeoutCtx: Context | undefined;
36
34
  private _ws: WebSocket | undefined;
37
- private _wsMuxer: WebSocketMuxer | undefined;
38
35
 
39
36
  constructor(
40
37
  private readonly _identity: EdgeIdentity,
@@ -55,34 +52,24 @@ export class EdgeWsConnection extends Resource {
55
52
 
56
53
  public send(message: Message) {
57
54
  invariant(this._ws);
58
- invariant(this._wsMuxer);
59
55
  log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });
60
- if (this._ws?.protocol.includes(EDGE_WEBSOCKET_PROTOCOL_V0)) {
61
- const binary = buf.toBinary(MessageSchema, message);
62
- if (binary.length > CLOUDFLARE_MESSAGE_LENGTH_LIMIT) {
63
- log.error('Message dropped because it was too large (>1MB).', {
64
- byteLength: binary.byteLength,
65
- serviceId: message.serviceId,
66
- payload: protocol.getPayloadType(message),
67
- });
68
- return;
69
- }
70
- this._ws.send(binary);
71
- } else {
72
- this._wsMuxer.send(message).catch((e) => log.catch(e));
56
+ const encoded = buf.toBinary(MessageSchema, message);
57
+ if (encoded.byteLength >= CLOUDFLARE_MESSAGE_LENGTH_LIMIT) {
58
+ log.error('edge message dropped due to websocket message limit', {
59
+ byteLength: encoded.byteLength,
60
+ serviceId: message.serviceId,
61
+ payload: protocol.getPayloadType(message),
62
+ });
63
+ return;
73
64
  }
65
+ this._ws.send(encoded);
74
66
  }
75
67
 
76
68
  protected override async _open() {
77
- const baseProtocols = [EDGE_WEBSOCKET_PROTOCOL_V0, EDGE_WEBSOCKET_PROTOCOL_V1];
78
69
  this._ws = new WebSocket(
79
70
  this._connectionInfo.url.toString(),
80
- this._connectionInfo.protocolHeader
81
- ? [...baseProtocols, this._connectionInfo.protocolHeader]
82
- : [...baseProtocols],
71
+ this._connectionInfo.protocolHeader ? [this._connectionInfo.protocolHeader] : [],
83
72
  );
84
- const muxer = new WebSocketMuxer(this._ws);
85
- this._wsMuxer = muxer;
86
73
 
87
74
  this._ws.onopen = () => {
88
75
  if (this.isOpen) {
@@ -97,7 +84,6 @@ export class EdgeWsConnection extends Resource {
97
84
  if (this.isOpen) {
98
85
  log.warn('disconnected while being open', { code: event.code, reason: event.reason });
99
86
  this._callbacks.onRestartRequired();
100
- muxer.destroy();
101
87
  }
102
88
  };
103
89
  this._ws.onerror = (event) => {
@@ -120,16 +106,9 @@ export class EdgeWsConnection extends Resource {
120
106
  this._rescheduleHeartbeatTimeout();
121
107
  return;
122
108
  }
123
- const bytes = await toUint8Array(event.data);
124
- if (!this.isOpen) {
125
- return;
126
- }
127
-
128
- const message = this._ws?.protocol?.includes(EDGE_WEBSOCKET_PROTOCOL_V0)
129
- ? buf.fromBinary(MessageSchema, bytes)
130
- : muxer.receiveData(bytes);
131
-
132
- if (message) {
109
+ const data = await toUint8Array(event.data);
110
+ if (this.isOpen) {
111
+ const message = buf.fromBinary(MessageSchema, data);
133
112
  log('received', { from: message.source, payload: protocol.getPayloadType(message) });
134
113
  this._callbacks.onMessage(message);
135
114
  }
@@ -142,8 +121,6 @@ export class EdgeWsConnection extends Resource {
142
121
  try {
143
122
  this._ws?.close();
144
123
  this._ws = undefined;
145
- this._wsMuxer?.destroy();
146
- this._wsMuxer = undefined;
147
124
  } catch (err) {
148
125
  if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {
149
126
  return;
package/src/index.ts CHANGED
@@ -11,4 +11,3 @@ export * from './errors';
11
11
  export * from './auth';
12
12
  export * from './edge-http-client';
13
13
  export * from './edge-identity';
14
- export * from './edge-ws-muxer';
@@ -10,8 +10,6 @@ import { buf } from '@dxos/protocols/buf';
10
10
  import { MessageSchema, TextMessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
11
11
 
12
12
  import { protocol } from '../defs';
13
- import { EDGE_WEBSOCKET_PROTOCOL_V1 } from '../edge-ws-connection';
14
- import { WebSocketMuxer } from '../edge-ws-muxer';
15
13
  import { toUint8Array } from '../protocol';
16
14
 
17
15
  export const DEFAULT_PORT = 8080;
@@ -23,33 +21,24 @@ type TestEdgeWsServerParams = {
23
21
  };
24
22
 
25
23
  export const createTestEdgeWsServer = async (port = DEFAULT_PORT, params?: TestEdgeWsServerParams) => {
26
- const wsServer = new WebSocket.Server({
27
- port,
28
- verifyClient: createConnectionDelayHandler(params),
29
- handleProtocols: () => [EDGE_WEBSOCKET_PROTOCOL_V1],
30
- });
24
+ const server = new WebSocket.Server({ port, verifyClient: createConnectionDelayHandler(params) });
31
25
 
32
- let connection: { ws: WebSocket; muxer: WebSocketMuxer } | undefined;
26
+ let connection: WebSocket | undefined;
33
27
 
34
28
  const messageSink: any[] = [];
35
29
  const messageSourceLog: any[] = [];
36
30
  const closeTrigger = new Trigger();
37
- const sendResponseMessage = createResponseSender(() => connection!.muxer);
31
+ const sendResponseMessage = createResponseSender(() => connection!);
38
32
 
39
- wsServer.on('connection', (ws) => {
40
- const muxer = new WebSocketMuxer(ws);
41
- connection = { ws, muxer };
33
+ server.on('connection', (ws) => {
34
+ connection = ws;
42
35
  ws.on('error', (err) => log.catch(err));
43
36
  ws.on('message', async (data) => {
44
37
  if (String(data) === '__ping__') {
45
38
  ws.send('__pong__');
46
39
  return;
47
40
  }
48
- const message = muxer.receiveData(await toUint8Array(data));
49
- if (!message) {
50
- return;
51
- }
52
- const { request, requestPayload } = await decodePayload(message, params);
41
+ const { request, requestPayload } = await decodeRequest(params, data);
53
42
  messageSourceLog.push(request.source);
54
43
  if (params?.messageHandler) {
55
44
  const responsePayload = await params.messageHandler(requestPayload);
@@ -68,19 +57,19 @@ export const createTestEdgeWsServer = async (port = DEFAULT_PORT, params?: TestE
68
57
  });
69
58
 
70
59
  return {
71
- server: wsServer,
60
+ server,
72
61
  messageSink,
73
62
  messageSourceLog,
74
- endpoint: `ws://127.0.0.1:${port}`,
75
- cleanup: () => wsServer.close(),
63
+ endpoint: `ws://localhost:${port}`,
64
+ cleanup: () => server.close(),
76
65
  currentConnection: () => connection,
77
66
  sendResponseMessage,
78
67
  sendMessage: (msg: Message) => {
79
- return connection!.muxer.send(msg);
68
+ connection!.send(buf.toBinary(MessageSchema, msg));
80
69
  },
81
70
  closeConnection: () => {
82
71
  closeTrigger.reset();
83
- connection!.ws.close(1011);
72
+ connection!.close(1011);
84
73
  return closeTrigger.wait();
85
74
  },
86
75
  };
@@ -100,23 +89,27 @@ const createConnectionDelayHandler = (params: TestEdgeWsServerParams | undefined
100
89
  };
101
90
  };
102
91
 
103
- const createResponseSender = (connection: () => WebSocketMuxer) => {
92
+ const createResponseSender = (connection: () => WebSocket) => {
104
93
  return (request: Message, responsePayload: Uint8Array) => {
105
94
  const recipient = request.source!;
106
- void connection().send(
107
- buf.create(MessageSchema, {
108
- source: {
109
- identityKey: recipient.identityKey,
110
- peerKey: recipient.peerKey,
111
- },
112
- serviceId: request.serviceId!,
113
- payload: { value: responsePayload },
114
- }),
95
+ connection().send(
96
+ buf.toBinary(
97
+ MessageSchema,
98
+ buf.create(MessageSchema, {
99
+ source: {
100
+ identityKey: recipient.identityKey,
101
+ peerKey: recipient.peerKey,
102
+ },
103
+ serviceId: request.serviceId!,
104
+ payload: { value: responsePayload },
105
+ }),
106
+ ),
115
107
  );
116
108
  };
117
109
  };
118
110
 
119
- const decodePayload = async (request: Message, params: TestEdgeWsServerParams | undefined) => {
111
+ const decodeRequest = async (params: TestEdgeWsServerParams | undefined, data: any) => {
112
+ const request = buf.fromBinary(MessageSchema, await toUint8Array(data));
120
113
  const requestPayload = params?.payloadDecoder
121
114
  ? params.payloadDecoder(request.payload!.value!)
122
115
  : protocol.getPayload(request, TextMessageSchema);