@dxos/edge-client 0.8.2-main.12df754 → 0.8.2-main.2f9c567

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 (50) hide show
  1. package/dist/lib/browser/chunk-TKYUZ5ZK.mjs +302 -0
  2. package/dist/lib/browser/chunk-TKYUZ5ZK.mjs.map +7 -0
  3. package/dist/lib/browser/edge-ws-muxer.mjs +11 -0
  4. package/dist/lib/browser/edge-ws-muxer.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +70 -32
  6. package/dist/lib/browser/index.mjs.map +3 -3
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +32 -20
  9. package/dist/lib/browser/testing/index.mjs.map +3 -3
  10. package/dist/lib/node/chunk-ZOL3YSDR.cjs +322 -0
  11. package/dist/lib/node/chunk-ZOL3YSDR.cjs.map +7 -0
  12. package/dist/lib/node/edge-ws-muxer.cjs +33 -0
  13. package/dist/lib/node/edge-ws-muxer.cjs.map +7 -0
  14. package/dist/lib/node/index.cjs +83 -45
  15. package/dist/lib/node/index.cjs.map +3 -3
  16. package/dist/lib/node/meta.json +1 -1
  17. package/dist/lib/node/testing/index.cjs +32 -21
  18. package/dist/lib/node/testing/index.cjs.map +3 -3
  19. package/dist/lib/node-esm/chunk-25HGRGNZ.mjs +304 -0
  20. package/dist/lib/node-esm/chunk-25HGRGNZ.mjs.map +7 -0
  21. package/dist/lib/node-esm/edge-ws-muxer.mjs +12 -0
  22. package/dist/lib/node-esm/edge-ws-muxer.mjs.map +7 -0
  23. package/dist/lib/node-esm/index.mjs +70 -32
  24. package/dist/lib/node-esm/index.mjs.map +3 -3
  25. package/dist/lib/node-esm/meta.json +1 -1
  26. package/dist/lib/node-esm/testing/index.mjs +32 -20
  27. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  28. package/dist/types/src/edge-ws-connection.d.ts +1 -0
  29. package/dist/types/src/edge-ws-connection.d.ts.map +1 -1
  30. package/dist/types/src/edge-ws-muxer.d.ts +35 -0
  31. package/dist/types/src/edge-ws-muxer.d.ts.map +1 -0
  32. package/dist/types/src/edge-ws-muxer.test.d.ts +2 -0
  33. package/dist/types/src/edge-ws-muxer.test.d.ts.map +1 -0
  34. package/dist/types/src/index.d.ts +1 -0
  35. package/dist/types/src/index.d.ts.map +1 -1
  36. package/dist/types/src/testing/test-utils.d.ts +6 -2
  37. package/dist/types/src/testing/test-utils.d.ts.map +1 -1
  38. package/package.json +19 -14
  39. package/src/edge-client.ts +2 -2
  40. package/src/edge-ws-connection.ts +36 -18
  41. package/src/edge-ws-muxer.test.ts +55 -0
  42. package/src/edge-ws-muxer.ts +217 -0
  43. package/src/index.ts +1 -0
  44. package/src/testing/test-utils.ts +33 -26
  45. package/dist/lib/browser/chunk-ZWJXA37R.mjs +0 -113
  46. package/dist/lib/browser/chunk-ZWJXA37R.mjs.map +0 -7
  47. package/dist/lib/node/chunk-ANV2HBEH.cjs +0 -136
  48. package/dist/lib/node/chunk-ANV2HBEH.cjs.map +0 -7
  49. package/dist/lib/node-esm/chunk-HNVT57AU.mjs +0 -115
  50. package/dist/lib/node-esm/chunk-HNVT57AU.mjs.map +0 -7
@@ -1 +1 @@
1
- {"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytes":10334,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/defs.ts":{"bytes":1607,"imports":[{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytes":4069,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytes":21466,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/errors.ts":{"bytes":1265,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/utils.ts":{"bytes":1451,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytes":35583,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-connection.ts","kind":"import-statement","original":"./edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/auth.ts":{"bytes":12314,"imports":[{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytes":34436,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/index.ts":{"bytes":1228,"imports":[{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-client.ts","kind":"import-statement","original":"./edge-client"},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/auth.ts","kind":"import-statement","original":"./auth"},{"path":"packages/core/mesh/edge-client/src/edge-http-client.ts","kind":"import-statement","original":"./edge-http-client"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytes":13201,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"../defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"../protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytes":516,"imports":[{"path":"packages/core/mesh/edge-client/src/testing/test-utils.ts","kind":"import-statement","original":"./test-utils"}],"format":"esm"}},"outputs":{"packages/core/mesh/edge-client/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":52198},"packages/core/mesh/edge-client/dist/lib/node-esm/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs","kind":"import-statement"},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["EdgeClient","EdgeConnectionClosedError","EdgeHttpClient","EdgeIdentityChangedError","Protocol","createChainEdgeIdentity","createDeviceEdgeIdentity","createEphemeralEdgeIdentity","createStubEdgeIdentity","createTestHaloEdgeIdentity","getTypename","handleAuthChallenge","protocol","toUint8Array"],"entryPoint":"packages/core/mesh/edge-client/src/index.ts","inputs":{"packages/core/mesh/edge-client/src/index.ts":{"bytesInOutput":60},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytesInOutput":9413},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytesInOutput":1150},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytesInOutput":6334},"packages/core/mesh/edge-client/src/errors.ts":{"bytesInOutput":232},"packages/core/mesh/edge-client/src/utils.ts":{"bytesInOutput":244},"packages/core/mesh/edge-client/src/auth.ts":{"bytesInOutput":2993},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytesInOutput":8021}},"bytes":29464},"packages/core/mesh/edge-client/dist/lib/node-esm/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":6742},"packages/core/mesh/edge-client/dist/lib/node-esm/testing/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs","kind":"import-statement"},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["DEFAULT_PORT","createTestEdgeWsServer"],"entryPoint":"packages/core/mesh/edge-client/src/testing/index.ts","inputs":{"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytesInOutput":3466},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytesInOutput":0}},"bytes":3775},"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5678},"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs":{"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["Protocol","getTypename","protocol","toUint8Array"],"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytesInOutput":2600},"packages/core/mesh/edge-client/src/defs.ts":{"bytesInOutput":298}},"bytes":3199}}}
1
+ {"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytes":10334,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/defs.ts":{"bytes":1607,"imports":[{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-muxer.ts":{"bytes":24403,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytes":4069,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytes":24442,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","kind":"import-statement","original":"./edge-ws-muxer"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/errors.ts":{"bytes":1265,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/utils.ts":{"bytes":1451,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytes":35621,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-connection.ts","kind":"import-statement","original":"./edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/auth.ts":{"bytes":12314,"imports":[{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytes":34436,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/index.ts":{"bytes":1333,"imports":[{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-client.ts","kind":"import-statement","original":"./edge-client"},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/auth.ts","kind":"import-statement","original":"./auth"},{"path":"packages/core/mesh/edge-client/src/edge-http-client.ts","kind":"import-statement","original":"./edge-http-client"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","kind":"import-statement","original":"./edge-ws-muxer"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytes":14258,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"../defs"},{"path":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","kind":"import-statement","original":"../edge-ws-muxer"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"../protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytes":516,"imports":[{"path":"packages/core/mesh/edge-client/src/testing/test-utils.ts","kind":"import-statement","original":"./test-utils"}],"format":"esm"}},"outputs":{"packages/core/mesh/edge-client/dist/lib/node-esm/edge-ws-muxer.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/core/mesh/edge-client/dist/lib/node-esm/edge-ws-muxer.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-25HGRGNZ.mjs","kind":"import-statement"}],"exports":["CLOUDFLARE_MESSAGE_MAX_BYTES","CLOUDFLARE_RPC_MAX_BYTES","WebSocketMuxer"],"entryPoint":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","inputs":{},"bytes":341},"packages/core/mesh/edge-client/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":53559},"packages/core/mesh/edge-client/dist/lib/node-esm/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-25HGRGNZ.mjs","kind":"import-statement"},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["CLOUDFLARE_MESSAGE_MAX_BYTES","CLOUDFLARE_RPC_MAX_BYTES","EdgeClient","EdgeConnectionClosedError","EdgeHttpClient","EdgeIdentityChangedError","Protocol","WebSocketMuxer","createChainEdgeIdentity","createDeviceEdgeIdentity","createEphemeralEdgeIdentity","createStubEdgeIdentity","createTestHaloEdgeIdentity","getTypename","handleAuthChallenge","protocol","toUint8Array"],"entryPoint":"packages/core/mesh/edge-client/src/index.ts","inputs":{"packages/core/mesh/edge-client/src/index.ts":{"bytesInOutput":60},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytesInOutput":9423},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytesInOutput":1150},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytesInOutput":7189},"packages/core/mesh/edge-client/src/errors.ts":{"bytesInOutput":232},"packages/core/mesh/edge-client/src/utils.ts":{"bytesInOutput":244},"packages/core/mesh/edge-client/src/auth.ts":{"bytesInOutput":2993},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytesInOutput":8021}},"bytes":30485},"packages/core/mesh/edge-client/dist/lib/node-esm/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":7239},"packages/core/mesh/edge-client/dist/lib/node-esm/testing/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-25HGRGNZ.mjs","kind":"import-statement"},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["DEFAULT_PORT","createTestEdgeWsServer"],"entryPoint":"packages/core/mesh/edge-client/src/testing/index.ts","inputs":{"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytesInOutput":3688},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytesInOutput":0}},"bytes":4015},"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-25HGRGNZ.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":17303},"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-25HGRGNZ.mjs":{"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["CLOUDFLARE_MESSAGE_MAX_BYTES","CLOUDFLARE_RPC_MAX_BYTES","Protocol","WebSocketMuxer","getTypename","protocol","toUint8Array"],"inputs":{"packages/core/mesh/edge-client/src/edge-ws-muxer.ts":{"bytesInOutput":5858},"packages/core/mesh/edge-client/src/defs.ts":{"bytesInOutput":298},"packages/core/mesh/edge-client/src/protocol.ts":{"bytesInOutput":2600}},"bytes":9294}}}
@@ -1,32 +1,41 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
+ WebSocketMuxer,
3
4
  protocol,
4
5
  toUint8Array
5
- } from "../chunk-HNVT57AU.mjs";
6
+ } from "../chunk-25HGRGNZ.mjs";
6
7
 
7
8
  // packages/core/mesh/edge-client/src/testing/test-utils.ts
8
9
  import WebSocket from "isomorphic-ws";
9
10
  import { Trigger } from "@dxos/async";
10
11
  import { log } from "@dxos/log";
12
+ import { EdgeWebsocketProtocol } from "@dxos/protocols";
11
13
  import { buf } from "@dxos/protocols/buf";
12
14
  import { MessageSchema, TextMessageSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
13
15
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/edge-client/src/testing/test-utils.ts";
14
16
  var DEFAULT_PORT = 8080;
15
17
  var createTestEdgeWsServer = async (port = DEFAULT_PORT, params) => {
16
- const server = new WebSocket.Server({
18
+ const wsServer = new WebSocket.Server({
17
19
  port,
18
- verifyClient: createConnectionDelayHandler(params)
20
+ verifyClient: createConnectionDelayHandler(params),
21
+ handleProtocols: () => [
22
+ EdgeWebsocketProtocol.V1
23
+ ]
19
24
  });
20
25
  let connection;
21
26
  const messageSink = [];
22
27
  const messageSourceLog = [];
23
28
  const closeTrigger = new Trigger();
24
- const sendResponseMessage = createResponseSender(() => connection);
25
- server.on("connection", (ws) => {
26
- connection = ws;
29
+ const sendResponseMessage = createResponseSender(() => connection.muxer);
30
+ wsServer.on("connection", (ws) => {
31
+ const muxer = new WebSocketMuxer(ws);
32
+ connection = {
33
+ ws,
34
+ muxer
35
+ };
27
36
  ws.on("error", (err) => log.catch(err, void 0, {
28
37
  F: __dxlog_file,
29
- L: 35,
38
+ L: 42,
30
39
  S: void 0,
31
40
  C: (f, a) => f(...a)
32
41
  }));
@@ -35,7 +44,11 @@ var createTestEdgeWsServer = async (port = DEFAULT_PORT, params) => {
35
44
  ws.send("__pong__");
36
45
  return;
37
46
  }
38
- const { request, requestPayload } = await decodeRequest(params, data);
47
+ const message = muxer.receiveData(await toUint8Array(data));
48
+ if (!message) {
49
+ return;
50
+ }
51
+ const { request, requestPayload } = await decodePayload(message, params);
39
52
  messageSourceLog.push(request.source);
40
53
  if (params?.messageHandler) {
41
54
  const responsePayload = await params.messageHandler(requestPayload);
@@ -47,7 +60,7 @@ var createTestEdgeWsServer = async (port = DEFAULT_PORT, params) => {
47
60
  payload: requestPayload
48
61
  }, {
49
62
  F: __dxlog_file,
50
- L: 49,
63
+ L: 60,
51
64
  S: void 0,
52
65
  C: (f, a) => f(...a)
53
66
  });
@@ -59,19 +72,19 @@ var createTestEdgeWsServer = async (port = DEFAULT_PORT, params) => {
59
72
  });
60
73
  });
61
74
  return {
62
- server,
75
+ server: wsServer,
63
76
  messageSink,
64
77
  messageSourceLog,
65
- endpoint: `ws://localhost:${port}`,
66
- cleanup: () => server.close(),
78
+ endpoint: `ws://127.0.0.1:${port}`,
79
+ cleanup: () => wsServer.close(),
67
80
  currentConnection: () => connection,
68
81
  sendResponseMessage,
69
82
  sendMessage: (msg) => {
70
- connection.send(buf.toBinary(MessageSchema, msg));
83
+ return connection.muxer.send(msg);
71
84
  },
72
85
  closeConnection: () => {
73
86
  closeTrigger.reset();
74
- connection.close(1011);
87
+ connection.ws.close(1011);
75
88
  return closeTrigger.wait();
76
89
  }
77
90
  };
@@ -81,7 +94,7 @@ var createConnectionDelayHandler = (params) => {
81
94
  if (params?.admitConnection) {
82
95
  log("delaying edge connection admission", void 0, {
83
96
  F: __dxlog_file,
84
- L: 81,
97
+ L: 92,
85
98
  S: void 0,
86
99
  C: (f, a) => f(...a)
87
100
  });
@@ -89,7 +102,7 @@ var createConnectionDelayHandler = (params) => {
89
102
  callback(true);
90
103
  log("edge connection admitted", void 0, {
91
104
  F: __dxlog_file,
92
- L: 84,
105
+ L: 95,
93
106
  S: void 0,
94
107
  C: (f, a) => f(...a)
95
108
  });
@@ -102,7 +115,7 @@ var createConnectionDelayHandler = (params) => {
102
115
  var createResponseSender = (connection) => {
103
116
  return (request, responsePayload) => {
104
117
  const recipient = request.source;
105
- connection().send(buf.toBinary(MessageSchema, buf.create(MessageSchema, {
118
+ void connection().send(buf.create(MessageSchema, {
106
119
  source: {
107
120
  identityKey: recipient.identityKey,
108
121
  peerKey: recipient.peerKey
@@ -111,11 +124,10 @@ var createResponseSender = (connection) => {
111
124
  payload: {
112
125
  value: responsePayload
113
126
  }
114
- })));
127
+ }));
115
128
  };
116
129
  };
117
- var decodeRequest = async (params, data) => {
118
- const request = buf.fromBinary(MessageSchema, await toUint8Array(data));
130
+ var decodePayload = async (request, params) => {
119
131
  const requestPayload = params?.payloadDecoder ? params.payloadDecoder(request.payload.value) : protocol.getPayload(request, TextMessageSchema);
120
132
  return {
121
133
  request,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/testing/test-utils.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\nimport { MessageSchema, TextMessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from '../defs';\nimport { toUint8Array } from '../protocol';\n\nexport const DEFAULT_PORT = 8080;\n\ntype TestEdgeWsServerParams = {\n admitConnection?: Trigger;\n payloadDecoder?: (payload: Uint8Array) => any;\n messageHandler?: (payload: any) => Promise<Uint8Array | undefined>;\n};\n\nexport const createTestEdgeWsServer = async (port = DEFAULT_PORT, params?: TestEdgeWsServerParams) => {\n const server = new WebSocket.Server({ port, verifyClient: createConnectionDelayHandler(params) });\n\n let connection: WebSocket | undefined;\n\n const messageSink: any[] = [];\n const messageSourceLog: any[] = [];\n const closeTrigger = new Trigger();\n const sendResponseMessage = createResponseSender(() => connection!);\n\n server.on('connection', (ws) => {\n connection = ws;\n ws.on('error', (err) => log.catch(err));\n ws.on('message', async (data) => {\n if (String(data) === '__ping__') {\n ws.send('__pong__');\n return;\n }\n const { request, requestPayload } = await decodeRequest(params, data);\n messageSourceLog.push(request.source);\n if (params?.messageHandler) {\n const responsePayload = await params.messageHandler(requestPayload);\n if (responsePayload && connection) {\n sendResponseMessage(request, responsePayload);\n }\n }\n log('message', { payload: requestPayload });\n messageSink.push(requestPayload);\n });\n\n ws.on('close', () => {\n connection = undefined;\n closeTrigger.wake();\n });\n });\n\n return {\n server,\n messageSink,\n messageSourceLog,\n endpoint: `ws://localhost:${port}`,\n cleanup: () => server.close(),\n currentConnection: () => connection,\n sendResponseMessage,\n sendMessage: (msg: Message) => {\n connection!.send(buf.toBinary(MessageSchema, msg));\n },\n closeConnection: () => {\n closeTrigger.reset();\n connection!.close(1011);\n return closeTrigger.wait();\n },\n };\n};\n\nconst createConnectionDelayHandler = (params: TestEdgeWsServerParams | undefined) => {\n return (_: any, callback: (admit: boolean) => void) => {\n if (params?.admitConnection) {\n log('delaying edge connection admission');\n void params.admitConnection.wait().then(() => {\n callback(true);\n log('edge connection admitted');\n });\n } else {\n callback(true);\n }\n };\n};\n\nconst createResponseSender = (connection: () => WebSocket) => {\n return (request: Message, responsePayload: Uint8Array) => {\n const recipient = request.source!;\n connection().send(\n buf.toBinary(\n MessageSchema,\n buf.create(MessageSchema, {\n source: {\n identityKey: recipient.identityKey,\n peerKey: recipient.peerKey,\n },\n serviceId: request.serviceId!,\n payload: { value: responsePayload },\n }),\n ),\n );\n };\n};\n\nconst decodeRequest = async (params: TestEdgeWsServerParams | undefined, data: any) => {\n const request = buf.fromBinary(MessageSchema, await toUint8Array(data));\n const requestPayload = params?.payloadDecoder\n ? params.payloadDecoder(request.payload!.value!)\n : protocol.getPayload(request, TextMessageSchema);\n return { request, requestPayload };\n};\n"],
5
- "mappings": "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",
6
- "names": ["WebSocket", "Trigger", "log", "buf", "MessageSchema", "TextMessageSchema", "DEFAULT_PORT", "createTestEdgeWsServer", "port", "params", "server", "WebSocket", "Server", "verifyClient", "createConnectionDelayHandler", "connection", "messageSink", "messageSourceLog", "closeTrigger", "Trigger", "sendResponseMessage", "createResponseSender", "on", "ws", "err", "log", "catch", "data", "String", "send", "request", "requestPayload", "decodeRequest", "push", "source", "messageHandler", "responsePayload", "payload", "undefined", "wake", "endpoint", "cleanup", "close", "currentConnection", "sendMessage", "msg", "buf", "toBinary", "MessageSchema", "closeConnection", "reset", "wait", "_", "callback", "admitConnection", "then", "recipient", "create", "identityKey", "peerKey", "serviceId", "value", "fromBinary", "toUint8Array", "payloadDecoder", "protocol", "getPayload", "TextMessageSchema"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { EdgeWebsocketProtocol } from '@dxos/protocols';\nimport { buf } from '@dxos/protocols/buf';\nimport { MessageSchema, TextMessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from '../defs';\nimport { WebSocketMuxer } from '../edge-ws-muxer';\nimport { toUint8Array } from '../protocol';\n\nexport const DEFAULT_PORT = 8080;\n\ntype TestEdgeWsServerParams = {\n admitConnection?: Trigger;\n payloadDecoder?: (payload: Uint8Array) => any;\n messageHandler?: (payload: any) => Promise<Uint8Array | undefined>;\n};\n\nexport const createTestEdgeWsServer = async (port = DEFAULT_PORT, params?: TestEdgeWsServerParams) => {\n const wsServer = new WebSocket.Server({\n port,\n verifyClient: createConnectionDelayHandler(params),\n handleProtocols: () => [EdgeWebsocketProtocol.V1],\n });\n\n let connection: { ws: WebSocket; muxer: WebSocketMuxer } | undefined;\n\n const messageSink: any[] = [];\n const messageSourceLog: any[] = [];\n const closeTrigger = new Trigger();\n const sendResponseMessage = createResponseSender(() => connection!.muxer);\n\n wsServer.on('connection', (ws) => {\n const muxer = new WebSocketMuxer(ws);\n connection = { ws, muxer };\n ws.on('error', (err) => log.catch(err));\n ws.on('message', async (data) => {\n if (String(data) === '__ping__') {\n ws.send('__pong__');\n return;\n }\n const message = muxer.receiveData(await toUint8Array(data));\n if (!message) {\n return;\n }\n const { request, requestPayload } = await decodePayload(message, params);\n messageSourceLog.push(request.source);\n if (params?.messageHandler) {\n const responsePayload = await params.messageHandler(requestPayload);\n if (responsePayload && connection) {\n sendResponseMessage(request, responsePayload);\n }\n }\n log('message', { payload: requestPayload });\n messageSink.push(requestPayload);\n });\n\n ws.on('close', () => {\n connection = undefined;\n closeTrigger.wake();\n });\n });\n\n return {\n server: wsServer,\n messageSink,\n messageSourceLog,\n endpoint: `ws://127.0.0.1:${port}`,\n cleanup: () => wsServer.close(),\n currentConnection: () => connection,\n sendResponseMessage,\n sendMessage: (msg: Message) => {\n return connection!.muxer.send(msg);\n },\n closeConnection: () => {\n closeTrigger.reset();\n connection!.ws.close(1011);\n return closeTrigger.wait();\n },\n };\n};\n\nconst createConnectionDelayHandler = (params: TestEdgeWsServerParams | undefined) => {\n return (_: any, callback: (admit: boolean) => void) => {\n if (params?.admitConnection) {\n log('delaying edge connection admission');\n void params.admitConnection.wait().then(() => {\n callback(true);\n log('edge connection admitted');\n });\n } else {\n callback(true);\n }\n };\n};\n\nconst createResponseSender = (connection: () => WebSocketMuxer) => {\n return (request: Message, responsePayload: Uint8Array) => {\n const recipient = request.source!;\n void connection().send(\n buf.create(MessageSchema, {\n source: {\n identityKey: recipient.identityKey,\n peerKey: recipient.peerKey,\n },\n serviceId: request.serviceId!,\n payload: { value: responsePayload },\n }),\n );\n };\n};\n\nconst decodePayload = async (request: Message, params: TestEdgeWsServerParams | undefined) => {\n const requestPayload = params?.payloadDecoder\n ? params.payloadDecoder(request.payload!.value!)\n : protocol.getPayload(request, TextMessageSchema);\n return { request, requestPayload };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["WebSocket", "Trigger", "log", "EdgeWebsocketProtocol", "buf", "MessageSchema", "TextMessageSchema", "DEFAULT_PORT", "createTestEdgeWsServer", "port", "params", "wsServer", "WebSocket", "Server", "verifyClient", "createConnectionDelayHandler", "handleProtocols", "EdgeWebsocketProtocol", "V1", "connection", "messageSink", "messageSourceLog", "closeTrigger", "Trigger", "sendResponseMessage", "createResponseSender", "muxer", "on", "ws", "WebSocketMuxer", "err", "log", "catch", "data", "String", "send", "message", "receiveData", "toUint8Array", "request", "requestPayload", "decodePayload", "push", "source", "messageHandler", "responsePayload", "payload", "undefined", "wake", "server", "endpoint", "cleanup", "close", "currentConnection", "sendMessage", "msg", "closeConnection", "reset", "wait", "_", "callback", "admitConnection", "then", "recipient", "buf", "create", "MessageSchema", "identityKey", "peerKey", "serviceId", "value", "payloadDecoder", "protocol", "getPayload", "TextMessageSchema"]
7
7
  }
@@ -12,6 +12,7 @@ export declare class EdgeWsConnection extends Resource {
12
12
  private readonly _callbacks;
13
13
  private _inactivityTimeoutCtx;
14
14
  private _ws;
15
+ private _wsMuxer;
15
16
  constructor(_identity: EdgeIdentity, _connectionInfo: {
16
17
  url: URL;
17
18
  protocolHeader?: string;
@@ -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;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"}
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;AAKlD,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAGzF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,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"}
@@ -0,0 +1,35 @@
1
+ import { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
2
+ /**
3
+ * https://developers.cloudflare.com/durable-objects/platform/limits/
4
+ */
5
+ export declare const CLOUDFLARE_MESSAGE_MAX_BYTES: number;
6
+ export declare const CLOUDFLARE_RPC_MAX_BYTES: number;
7
+ export declare class WebSocketMuxer {
8
+ private readonly _ws;
9
+ private readonly _inMessageAccumulator;
10
+ private readonly _outMessageChunks;
11
+ private readonly _outMessageChannelByService;
12
+ private _sendTimeout;
13
+ private readonly _maxChunkLength;
14
+ constructor(_ws: WebSocketCompat, config?: {
15
+ maxChunkLength: number;
16
+ });
17
+ /**
18
+ * Resolves when all the message chunks get enqueued for sending.
19
+ */
20
+ send(message: Message): Promise<void>;
21
+ receiveData(data: Uint8Array): Message | undefined;
22
+ destroy(): void;
23
+ private _sendChunkedMessages;
24
+ private _resolveChannel;
25
+ }
26
+ type WebSocketCompat = {
27
+ readonly readyState: number;
28
+ /**
29
+ * Not available in workerd.
30
+ */
31
+ bufferedAmount?: number;
32
+ send(message: (ArrayBuffer | ArrayBufferView) | string): void;
33
+ };
34
+ export {};
35
+ //# sourceMappingURL=edge-ws-muxer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-ws-muxer.d.ts","sourceRoot":"","sources":["../../../src/edge-ws-muxer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAkBzF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAc,CAAC;AACxD,eAAO,MAAM,wBAAwB,QAAmB,CAAC;AAMzD,qBAAa,cAAc;IAUvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IATtB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA+B;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IACvE,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAA6B;IAEzE,OAAO,CAAC,YAAY,CAAkB;IAEtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAGtB,GAAG,EAAE,eAAe,EACrC,MAAM,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;IAKrC;;OAEG;IACU,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD3C,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS;IAuBlD,OAAO;IAad,OAAO,CAAC,oBAAoB;IA0C5B,OAAO,CAAC,eAAe;CAWxB;AAED,KAAK,eAAe,GAAG;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,GAAG,eAAe,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;CAC/D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=edge-ws-muxer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-ws-muxer.test.d.ts","sourceRoot":"","sources":["../../../src/edge-ws-muxer.test.ts"],"names":[],"mappings":""}
@@ -6,4 +6,5 @@ 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';
9
10
  //# 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"}
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,6 +1,7 @@
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';
4
5
  export declare const DEFAULT_PORT = 8080;
5
6
  type TestEdgeWsServerParams = {
6
7
  admitConnection?: Trigger;
@@ -13,9 +14,12 @@ export declare const createTestEdgeWsServer: (port?: number, params?: TestEdgeWs
13
14
  messageSourceLog: any[];
14
15
  endpoint: string;
15
16
  cleanup: () => void;
16
- currentConnection: () => WebSocket | undefined;
17
+ currentConnection: () => {
18
+ ws: WebSocket;
19
+ muxer: WebSocketMuxer;
20
+ } | undefined;
17
21
  sendResponseMessage: (request: Message, responsePayload: Uint8Array) => void;
18
- sendMessage: (msg: Message) => void;
22
+ sendMessage: (msg: Message) => Promise<void>;
19
23
  closeConnection: () => Promise<void>;
20
24
  }>;
21
25
  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;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"}
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;AAItC,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAG5G,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/edge-client",
3
- "version": "0.8.2-main.12df754",
3
+ "version": "0.8.2-main.2f9c567",
4
4
  "description": "EDGE Client",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -14,6 +14,11 @@
14
14
  "browser": "./dist/lib/browser/index.mjs",
15
15
  "node": "./dist/lib/node-esm/index.mjs"
16
16
  },
17
+ "./muxer": {
18
+ "types": "./dist/types/src/edge-ws-muxer.d.ts",
19
+ "browser": "./dist/lib/browser/edge-ws-muxer.mjs",
20
+ "node": "./dist/lib/node-esm/edge-ws-muxer.mjs"
21
+ },
17
22
  "./testing": {
18
23
  "types": "./dist/types/src/testing/index.d.ts",
19
24
  "browser": "./dist/lib/browser/testing/index.mjs",
@@ -36,21 +41,21 @@
36
41
  "dependencies": {
37
42
  "isomorphic-ws": "^5.0.0",
38
43
  "ws": "^8.14.2",
39
- "@dxos/async": "0.8.2-main.12df754",
40
- "@dxos/crypto": "0.8.2-main.12df754",
41
- "@dxos/credentials": "0.8.2-main.12df754",
42
- "@dxos/context": "0.8.2-main.12df754",
43
- "@dxos/debug": "0.8.2-main.12df754",
44
- "@dxos/invariant": "0.8.2-main.12df754",
45
- "@dxos/keyring": "0.8.2-main.12df754",
46
- "@dxos/keys": "0.8.2-main.12df754",
47
- "@dxos/log": "0.8.2-main.12df754",
48
- "@dxos/node-std": "0.8.2-main.12df754",
49
- "@dxos/protocols": "0.8.2-main.12df754",
50
- "@dxos/util": "0.8.2-main.12df754"
44
+ "@dxos/async": "0.8.2-main.2f9c567",
45
+ "@dxos/context": "0.8.2-main.2f9c567",
46
+ "@dxos/credentials": "0.8.2-main.2f9c567",
47
+ "@dxos/crypto": "0.8.2-main.2f9c567",
48
+ "@dxos/invariant": "0.8.2-main.2f9c567",
49
+ "@dxos/debug": "0.8.2-main.2f9c567",
50
+ "@dxos/keyring": "0.8.2-main.2f9c567",
51
+ "@dxos/keys": "0.8.2-main.2f9c567",
52
+ "@dxos/node-std": "0.8.2-main.2f9c567",
53
+ "@dxos/protocols": "0.8.2-main.2f9c567",
54
+ "@dxos/util": "0.8.2-main.2f9c567",
55
+ "@dxos/log": "0.8.2-main.2f9c567"
51
56
  },
52
57
  "devDependencies": {
53
- "@dxos/test-utils": "0.8.2-main.12df754"
58
+ "@dxos/test-utils": "0.8.2-main.2f9c567"
54
59
  },
55
60
  "publishConfig": {
56
61
  "access": "public"
@@ -99,7 +99,7 @@ export class EdgeClient extends Resource implements EdgeConnection {
99
99
  log('Edge identity changed', { identity, oldIdentity: this._identity });
100
100
  this._identity = identity;
101
101
  this._closeCurrentConnection(new EdgeIdentityChangedError());
102
- this._persistentLifecycle.scheduleRestart();
102
+ void this._persistentLifecycle.scheduleRestart();
103
103
  }
104
104
  }
105
105
 
@@ -176,7 +176,7 @@ export class EdgeClient extends Resource implements EdgeConnection {
176
176
  onRestartRequired: () => {
177
177
  if (this._isActive(connection)) {
178
178
  this._closeCurrentConnection();
179
- this._persistentLifecycle.scheduleRestart();
179
+ void this._persistentLifecycle.scheduleRestart();
180
180
  } else {
181
181
  log.verbose('restart requested by inactive connection');
182
182
  }
@@ -8,21 +8,18 @@ import { scheduleTask, scheduleTaskInterval } from '@dxos/async';
8
8
  import { Context, Resource } from '@dxos/context';
9
9
  import { invariant } from '@dxos/invariant';
10
10
  import { log, logInfo } from '@dxos/log';
11
+ import { EdgeWebsocketProtocol } from '@dxos/protocols';
11
12
  import { buf } from '@dxos/protocols/buf';
12
13
  import { MessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
13
14
 
14
15
  import { protocol } from './defs';
15
16
  import { type EdgeIdentity } from './edge-identity';
17
+ import { CLOUDFLARE_MESSAGE_MAX_BYTES, WebSocketMuxer } from './edge-ws-muxer';
16
18
  import { toUint8Array } from './protocol';
17
19
 
18
20
  const SIGNAL_KEEPALIVE_INTERVAL = 4_000;
19
21
  const SIGNAL_KEEPALIVE_TIMEOUT = 12_000;
20
22
 
21
- /**
22
- * 1MB websocket message limit: https://developers.cloudflare.com/durable-objects/platform/limits/
23
- */
24
- const CLOUDFLARE_MESSAGE_LENGTH_LIMIT = 1024 * 1024;
25
-
26
23
  export type EdgeWsConnectionCallbacks = {
27
24
  onConnected: () => void;
28
25
  onMessage: (message: Message) => void;
@@ -32,6 +29,7 @@ export type EdgeWsConnectionCallbacks = {
32
29
  export class EdgeWsConnection extends Resource {
33
30
  private _inactivityTimeoutCtx: Context | undefined;
34
31
  private _ws: WebSocket | undefined;
32
+ private _wsMuxer: WebSocketMuxer | undefined;
35
33
 
36
34
  constructor(
37
35
  private readonly _identity: EdgeIdentity,
@@ -52,24 +50,34 @@ export class EdgeWsConnection extends Resource {
52
50
 
53
51
  public send(message: Message) {
54
52
  invariant(this._ws);
53
+ invariant(this._wsMuxer);
55
54
  log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });
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;
55
+ if (this._ws?.protocol.includes(EdgeWebsocketProtocol.V0)) {
56
+ const binary = buf.toBinary(MessageSchema, message);
57
+ if (binary.length > CLOUDFLARE_MESSAGE_MAX_BYTES) {
58
+ log.error('Message dropped because it was too large (>1MB).', {
59
+ byteLength: binary.byteLength,
60
+ serviceId: message.serviceId,
61
+ payload: protocol.getPayloadType(message),
62
+ });
63
+ return;
64
+ }
65
+ this._ws.send(binary);
66
+ } else {
67
+ this._wsMuxer.send(message).catch((e) => log.catch(e));
64
68
  }
65
- this._ws.send(encoded);
66
69
  }
67
70
 
68
71
  protected override async _open() {
72
+ const baseProtocols = [...Object.values(EdgeWebsocketProtocol)];
69
73
  this._ws = new WebSocket(
70
74
  this._connectionInfo.url.toString(),
71
- this._connectionInfo.protocolHeader ? [this._connectionInfo.protocolHeader] : [],
75
+ this._connectionInfo.protocolHeader
76
+ ? [...baseProtocols, this._connectionInfo.protocolHeader]
77
+ : [...baseProtocols],
72
78
  );
79
+ const muxer = new WebSocketMuxer(this._ws);
80
+ this._wsMuxer = muxer;
73
81
 
74
82
  this._ws.onopen = () => {
75
83
  if (this.isOpen) {
@@ -84,6 +92,7 @@ export class EdgeWsConnection extends Resource {
84
92
  if (this.isOpen) {
85
93
  log.warn('disconnected while being open', { code: event.code, reason: event.reason });
86
94
  this._callbacks.onRestartRequired();
95
+ muxer.destroy();
87
96
  }
88
97
  };
89
98
  this._ws.onerror = (event) => {
@@ -106,9 +115,16 @@ export class EdgeWsConnection extends Resource {
106
115
  this._rescheduleHeartbeatTimeout();
107
116
  return;
108
117
  }
109
- const data = await toUint8Array(event.data);
110
- if (this.isOpen) {
111
- const message = buf.fromBinary(MessageSchema, data);
118
+ const bytes = await toUint8Array(event.data);
119
+ if (!this.isOpen) {
120
+ return;
121
+ }
122
+
123
+ const message = this._ws?.protocol?.includes(EdgeWebsocketProtocol.V0)
124
+ ? buf.fromBinary(MessageSchema, bytes)
125
+ : muxer.receiveData(bytes);
126
+
127
+ if (message) {
112
128
  log('received', { from: message.source, payload: protocol.getPayloadType(message) });
113
129
  this._callbacks.onMessage(message);
114
130
  }
@@ -121,6 +137,8 @@ export class EdgeWsConnection extends Resource {
121
137
  try {
122
138
  this._ws?.close();
123
139
  this._ws = undefined;
140
+ this._wsMuxer?.destroy();
141
+ this._wsMuxer = undefined;
124
142
  } catch (err) {
125
143
  if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {
126
144
  return;
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import { bufWkt } from '@dxos/protocols/buf';
8
+ import { TextMessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
9
+
10
+ import { protocol } from './defs';
11
+ import type { EdgeIdentity } from './edge-identity';
12
+ import { WebSocketMuxer } from './edge-ws-muxer';
13
+
14
+ const MAX_CHUNK_LENGTH = 16;
15
+
16
+ describe('WebSocketMuxerTest', () => {
17
+ test('basic message reassembly', async () => {
18
+ const { muxer: muxer1, sentMessages } = await createMuxer();
19
+ const { muxer: muxer2 } = await createMuxer();
20
+ const content = 'A'.repeat(MAX_CHUNK_LENGTH);
21
+ await muxer1.send(textMessage(content));
22
+
23
+ expect(sentMessages.length).toBeGreaterThan(1);
24
+ for (const chunk of sentMessages.slice(0, -1)) {
25
+ expect(muxer2.receiveData(chunk)).toBeUndefined();
26
+ }
27
+
28
+ const reassembledMessage = muxer2.receiveData(sentMessages.at(-1)!)!;
29
+ expect(reassembledMessage).toBeDefined();
30
+
31
+ const decoded = bufWkt.anyUnpack(reassembledMessage.payload!, TextMessageSchema);
32
+ expect(decoded?.message).toStrictEqual(content);
33
+ });
34
+ });
35
+
36
+ const textMessage = (message: string, source?: EdgeIdentity) =>
37
+ protocol.createMessage(TextMessageSchema, {
38
+ source: source && { peerKey: source.peerKey, identityKey: source.identityKey },
39
+ serviceId: 'test-service',
40
+ payload: { message },
41
+ });
42
+
43
+ const createMuxer = async () => {
44
+ const sentMessages: Uint8Array[] = [];
45
+ const muxer = new WebSocketMuxer(
46
+ {
47
+ readyState: 1,
48
+ send: (message: string) => {
49
+ sentMessages.push(Buffer.from(message));
50
+ },
51
+ },
52
+ { maxChunkLength: MAX_CHUNK_LENGTH },
53
+ );
54
+ return { muxer, sentMessages };
55
+ };