@dxos/network-manager 0.1.57 → 0.1.58-main.0e9c99e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{chunk-UKMTAO4L.mjs → chunk-CNQ55TFQ.mjs} +197 -112
- package/dist/lib/browser/chunk-CNQ55TFQ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +155 -22
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/index.cjs +207 -122
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +363 -145
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/types/src/swarm/connection-limiter.d.ts +1 -1
- package/dist/types/src/swarm/connection-limiter.d.ts.map +1 -1
- package/dist/types/src/swarm/connection.d.ts +3 -1
- package/dist/types/src/swarm/connection.d.ts.map +1 -1
- package/dist/types/src/swarm/peer.d.ts +1 -1
- package/dist/types/src/swarm/peer.d.ts.map +1 -1
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/tests/tcp-transport.test.d.ts +2 -0
- package/dist/types/src/tests/tcp-transport.test.d.ts.map +1 -0
- package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +1 -1
- package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -1
- package/dist/types/src/transport/tcp-transport.d.ts +23 -0
- package/dist/types/src/transport/tcp-transport.d.ts.map +1 -0
- package/dist/types/src/transport/transport.d.ts +2 -1
- package/dist/types/src/transport/transport.d.ts.map +1 -1
- package/package.json +17 -18
- package/src/swarm/connection-limiter.ts +2 -2
- package/src/swarm/connection.ts +53 -27
- package/src/swarm/peer.ts +4 -1
- package/src/testing/test-builder.ts +5 -1
- package/src/tests/tcp-transport.test.ts +67 -0
- package/src/transport/simplepeer-transport-proxy.ts +28 -2
- package/src/transport/simplepeer-transport.ts +39 -3
- package/src/transport/tcp-transport.ts +107 -0
- package/src/transport/transport.ts +1 -0
- package/dist/lib/browser/chunk-UKMTAO4L.mjs.map +0 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DeferredTask } from '@dxos/async';
|
|
2
2
|
import { PublicKey } from '@dxos/keys';
|
|
3
|
-
export declare const MAX_CONCURRENT_INITIATING_CONNECTIONS =
|
|
3
|
+
export declare const MAX_CONCURRENT_INITIATING_CONNECTIONS = 50;
|
|
4
4
|
export type ConnectionLimiterOptions = {
|
|
5
5
|
maxConcurrentInitConnections?: number;
|
|
6
6
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-limiter.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection-limiter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connection-limiter.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection-limiter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAKvC,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAExD,MAAM,MAAM,wBAAwB,GAAG;IACrC,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC/C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAE/B;IAEF,sBAAsB,eAMnB;gBAES,EAAE,4BAAoE,EAAE,GAAE,wBAA6B;IAInH;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS;CASpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,EAAuB,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/swarm/connection.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,EAAuB,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAYvC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAahD,UAAU,mBAAmB;IAC3B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,oBAAY,eAAe;IACzB;;OAEG;IACH,OAAO,YAAY;IAEnB;;;OAGG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,UAAU,eAAe;IAEzB;;OAEG;IACH,SAAS,cAAc;IAEvB;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,MAAM,WAAW;IAEjB,QAAQ,aAAa;IACrB,OAAO,YAAY;CACpB;AAED;;;GAGG;AACH,qBAAa,UAAU;aAsBH,KAAK,EAAE,SAAS;aAChB,KAAK,EAAE,SAAS;aAChB,QAAQ,EAAE,SAAS;aACnB,SAAS,EAAE,SAAS;aACpB,SAAS,EAAE,OAAO;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IA7B9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,UAAU,CAAwB;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,qBAAqB,CAAgB;IAE7C,QAAQ,CAAC,YAAY,yBAAgC;IACrD,QAAQ,CAAC,MAAM,cAAqB;IAE7B,WAAW,SAA8B;IAEhD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAE7B;IAEH,OAAO,CAAC,gBAAgB,CAA6B;gBAGnC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,SAAS,EAAE,wBAAwB;IAC1C,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,OAAO,EACjB,gBAAgB,EAAE,eAAe,EACjC,SAAS,EAAE,YAAY,EACvB,iBAAiB,EAAE,gBAAgB,EACnC,UAAU,CAAC,iCAAqB;IAWnD,IAAI,KAAK,oBAER;IAED,IAAI,SAAS,0BAEZ;IAED,IAAI,QAAQ,iBAEX;IAED;;OAEG;IACG,cAAc;IA4Ed,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;IAsCjB,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;IAuCvB,OAAO,CAAC,WAAW;YAKL,kBAAkB;IAgChC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,aAAa;IA2B/B,QAAQ;IAIR,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Event } from '@dxos/async';
|
|
2
|
-
import { SystemError } from '@dxos/errors';
|
|
3
2
|
import { PublicKey } from '@dxos/keys';
|
|
3
|
+
import { SystemError } from '@dxos/protocols';
|
|
4
4
|
import { Answer } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
5
5
|
import { OfferMessage, SignalMessage, SignalMessenger } from '../signal';
|
|
6
6
|
import { TransportFactory } from '../transport';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../../src/swarm/peer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAA8B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../../src/swarm/peer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAA8B,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAkB,WAAW,EAAgB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBAAa,wBAAyB,SAAQ,WAAW;;CAIxD;AAED,UAAU,aAAa;IACrB;;OAEG;IACH,WAAW,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAE9C;;OAEG;IACH,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB;;OAEG;IACH,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB;;OAEG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnD;;OAEG;IACH,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAOD;;;GAGG;AACH,qBAAa,IAAI;aAwBG,EAAE,EAAE,SAAS;aACb,KAAK,EAAE,SAAS;aAChB,WAAW,EAAE,SAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU;IA9B7B;;OAEG;IACH,OAAO,CAAC,eAAe,CAAK;IACrB,kBAAkB,UAAQ;IACjC,OAAO,CAAC,mBAAmB,CAAC,CAAS;IAErC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAU;IAE1B,UAAU,CAAC,EAAE,UAAU,CAAC;IAE/B;;OAEG;IACI,WAAW,UAAS;IAEpB,UAAU,UAAS;IAE1B,SAAgB,mBAAmB,oBAA2B;gBAI5C,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,SAAS,EACrB,gBAAgB,EAAE,eAAe,EACjC,iBAAiB,EAAE,oBAAoB,EACvC,iBAAiB,EAAE,gBAAgB,EACnC,kBAAkB,EAAE,iBAAiB,EACrC,UAAU,EAAE,aAAa;IAG5C;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoDrD;;OAEG;IACG,kBAAkB;IA6CxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAsGnB,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK;IAgB3B,QAAQ,CAAC,OAAO,EAAE,aAAa;IAU/B,OAAO;CAOd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-builder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EACL,mBAAmB,EAGnB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAOL,aAAa,EACd,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"test-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-builder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EACL,mBAAmB,EAGnB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAI5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAOL,aAAa,EACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,KAAK,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAI3F,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAEtD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,qBAAa,WAAW;aAGM,OAAO,EAAE,kBAAkB;IAFvD,OAAO,CAAC,cAAc,CAAoC;gBAE9B,OAAO,GAAE,kBAAuB;IAE5D,mBAAmB;IAQnB,UAAU,CAAC,MAAM,GAAE,SAA8B;CAGlD;AAED;;GAEG;AACH,qBAAa,QAAQ;IAiBjB,OAAO,CAAC,QAAQ,CAAC,WAAW;aACZ,MAAM,EAAE,SAAS;aACjB,SAAS,CAAC;IAlB5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkE;IAY1F,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAC,CAAoB;gBAGlB,WAAW,EAAE,WAAW,EACzB,MAAM,EAAE,SAAS,EACjB,SAAS,CAAC,2BAAe;IAc3C,oBAAoB,CAAC,SAAS,EAAE,aAAa;IAgEvC,IAAI;IAMJ,KAAK;IASX,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,mBAAmB;IAS/C,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,GAAE,4BAAuC,GAAG,mBAAmB;IAWvG,SAAS;IAIT,QAAQ;CAGf;AAGD,qBAAa,mBAAmB;IAI5B,QAAQ,CAAC,IAAI,EAAE,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS;IACzB,QAAQ,CAAC,gBAAgB,EAAE,4BAA4B;IALzD,QAAQ,EAAE,gBAAgB,CAAC;gBAGhB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,EAChB,gBAAgB,EAAE,4BAA4B;IASnD,IAAI,CAAC,QAAQ,yBAA+B;IAW5C,KAAK;CAIZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp-transport.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tcp-transport.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simplepeer-transport-proxy.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport-proxy.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"simplepeer-transport-proxy.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport-proxy.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW1C,OAAO,EAAgC,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,MAAM,8BAA8B,GAAG;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAE7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF,qBAAa,wBAAyB,YAAW,SAAS;IAatD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZ1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,QAAQ,CAAC,MAAM,cAAe;IAC9B,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAuB;gBAI1B,OAAO,EAAE,8BAA8B;YAsC5C,iBAAiB;IAiB/B,OAAO,CAAC,WAAW;YAKL,aAAa;IAI3B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B;;OAEG;IAEH,UAAU;CAKX;AAGD,qBAAa,+BAAgC,YAAW,gBAAgB;IACtE,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAAuC;IAE3D;;;OAGG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IAShE,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS;CAatD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simplepeer-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"simplepeer-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport.ts"],"names":[],"mappings":";AAQA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;AAIjD,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAC/B,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF;;GAEG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IAUvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IATnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,OAAO,CAAS;IAExB,QAAQ,CAAC,MAAM,cAAe;IAC9B,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE7B,MAAM,EAAE,yBAAyB;IAkFxD,OAAO;IASb,MAAM,CAAC,MAAM,EAAE,MAAM;YASP,kBAAkB;CAIjC;AAED,eAAO,MAAM,gCAAgC,kBAAmB,GAAG,KAAG,gBAMpE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Event } from '@dxos/async';
|
|
2
|
+
import { ErrorStream } from '@dxos/debug';
|
|
3
|
+
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
4
|
+
import { Transport, TransportFactory, TransportOptions } from './transport';
|
|
5
|
+
export declare const TcpTransportFactory: TransportFactory;
|
|
6
|
+
/**
|
|
7
|
+
* Fake transport.
|
|
8
|
+
*/
|
|
9
|
+
export declare class TcpTransport implements Transport {
|
|
10
|
+
private readonly options;
|
|
11
|
+
private _server?;
|
|
12
|
+
private _socket?;
|
|
13
|
+
readonly closed: Event<void>;
|
|
14
|
+
readonly connected: Event<void>;
|
|
15
|
+
readonly errors: ErrorStream;
|
|
16
|
+
private _destroyed;
|
|
17
|
+
private _connected;
|
|
18
|
+
constructor(options: TransportOptions);
|
|
19
|
+
destroy(): Promise<void>;
|
|
20
|
+
signal({ payload }: Signal): void;
|
|
21
|
+
private _handleSocket;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=tcp-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/tcp-transport.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5E,eAAO,MAAM,mBAAmB,EAAE,gBAEjC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,YAAW,SAAS;IAYhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAXpC,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,OAAO,CAAC,CAAqB;IAErC,SAAgB,MAAM,cAAqB;IAC3C,SAAgB,SAAS,cAAqB;IAC9C,SAAgB,MAAM,cAAqB;IAE3C,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,UAAU,CAAS;gBAEE,OAAO,EAAE,gBAAgB;IAsChD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM;IAW1B,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -6,7 +6,8 @@ export declare enum TransportKind {
|
|
|
6
6
|
SIMPLE_PEER = "SIMPLE_PEER",
|
|
7
7
|
LIBDATACHANNEL = "LIBDATACHANNEL",
|
|
8
8
|
SIMPLE_PEER_PROXY = "SIMPLE_PEER_PROXY",
|
|
9
|
-
MEMORY = "MEMORY"
|
|
9
|
+
MEMORY = "MEMORY",
|
|
10
|
+
TCP = "TCP"
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* Abstraction over a P2P connection transport. Currently either WebRTC or in-memory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/transport.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,oBAAY,aAAa;IACvB,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,MAAM,WAAW;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/transport.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAE/D,oBAAY,aAAa;IACvB,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,MAAM,WAAW;IACjB,GAAG,QAAQ;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IAEpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC;IAE/B;;OAEG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACvD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/network-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.58-main.0e9c99e",
|
|
4
4
|
"description": "Network Manager",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -30,22 +30,21 @@
|
|
|
30
30
|
"tiny-invariant": "^1.3.1",
|
|
31
31
|
"ws": "^7.4.4",
|
|
32
32
|
"xor-distance": "^2.0.0",
|
|
33
|
-
"@dxos/async": "0.1.
|
|
34
|
-
"@dxos/codec-protobuf": "0.1.
|
|
35
|
-
"@dxos/context": "0.1.
|
|
36
|
-
"@dxos/credentials": "0.1.
|
|
37
|
-
"@dxos/crypto": "0.1.
|
|
38
|
-
"@dxos/
|
|
39
|
-
"@dxos/invariant": "0.1.
|
|
40
|
-
"@dxos/keys": "0.1.
|
|
41
|
-
"@dxos/log": "0.1.
|
|
42
|
-
"@dxos/messaging": "0.1.
|
|
43
|
-
"@dxos/node-std": "0.1.
|
|
44
|
-
"@dxos/protocols": "0.1.
|
|
45
|
-
"@dxos/rpc": "0.1.
|
|
46
|
-
"@dxos/teleport": "0.1.
|
|
47
|
-
"@dxos/util": "0.1.
|
|
48
|
-
"@dxos/debug": "0.1.57"
|
|
33
|
+
"@dxos/async": "0.1.58-main.0e9c99e",
|
|
34
|
+
"@dxos/codec-protobuf": "0.1.58-main.0e9c99e",
|
|
35
|
+
"@dxos/context": "0.1.58-main.0e9c99e",
|
|
36
|
+
"@dxos/credentials": "0.1.58-main.0e9c99e",
|
|
37
|
+
"@dxos/crypto": "0.1.58-main.0e9c99e",
|
|
38
|
+
"@dxos/debug": "0.1.58-main.0e9c99e",
|
|
39
|
+
"@dxos/invariant": "0.1.58-main.0e9c99e",
|
|
40
|
+
"@dxos/keys": "0.1.58-main.0e9c99e",
|
|
41
|
+
"@dxos/log": "0.1.58-main.0e9c99e",
|
|
42
|
+
"@dxos/messaging": "0.1.58-main.0e9c99e",
|
|
43
|
+
"@dxos/node-std": "0.1.58-main.0e9c99e",
|
|
44
|
+
"@dxos/protocols": "0.1.58-main.0e9c99e",
|
|
45
|
+
"@dxos/rpc": "0.1.58-main.0e9c99e",
|
|
46
|
+
"@dxos/teleport": "0.1.58-main.0e9c99e",
|
|
47
|
+
"@dxos/util": "0.1.58-main.0e9c99e"
|
|
49
48
|
},
|
|
50
49
|
"devDependencies": {
|
|
51
50
|
"@swc-node/register": "1.5.4",
|
|
@@ -55,7 +54,7 @@
|
|
|
55
54
|
"earljs": "~0.1.10",
|
|
56
55
|
"fast-check": "~3.3.0",
|
|
57
56
|
"typescript": "^5.2.2",
|
|
58
|
-
"@dxos/signal": "0.1.
|
|
57
|
+
"@dxos/signal": "0.1.58-main.0e9c99e"
|
|
59
58
|
},
|
|
60
59
|
"publishConfig": {
|
|
61
60
|
"access": "public"
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
import { DeferredTask } from '@dxos/async';
|
|
6
6
|
import { Context } from '@dxos/context';
|
|
7
|
-
import { CancelledError } from '@dxos/errors';
|
|
8
7
|
import { invariant } from '@dxos/invariant';
|
|
9
8
|
import { PublicKey } from '@dxos/keys';
|
|
10
9
|
import { log } from '@dxos/log';
|
|
10
|
+
import { CancelledError } from '@dxos/protocols';
|
|
11
11
|
import { ComplexMap } from '@dxos/util';
|
|
12
12
|
|
|
13
|
-
export const MAX_CONCURRENT_INITIATING_CONNECTIONS =
|
|
13
|
+
export const MAX_CONCURRENT_INITIATING_CONNECTIONS = 50;
|
|
14
14
|
|
|
15
15
|
export type ConnectionLimiterOptions = {
|
|
16
16
|
maxConcurrentInitConnections?: number;
|
package/src/swarm/connection.ts
CHANGED
|
@@ -5,11 +5,17 @@
|
|
|
5
5
|
import { DeferredTask, Event, sleep, synchronized } from '@dxos/async';
|
|
6
6
|
import { Context, cancelWithContext } from '@dxos/context';
|
|
7
7
|
import { ErrorStream } from '@dxos/debug';
|
|
8
|
-
import { CancelledError } from '@dxos/errors';
|
|
9
8
|
import { invariant } from '@dxos/invariant';
|
|
10
9
|
import { PublicKey } from '@dxos/keys';
|
|
11
10
|
import { log } from '@dxos/log';
|
|
12
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
CancelledError,
|
|
13
|
+
ProtocolError,
|
|
14
|
+
ConnectionResetError,
|
|
15
|
+
ConnectivityError,
|
|
16
|
+
UnknownProtocolError,
|
|
17
|
+
trace,
|
|
18
|
+
} from '@dxos/protocols';
|
|
13
19
|
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
14
20
|
|
|
15
21
|
import { SignalMessage, SignalMessenger } from '../signal';
|
|
@@ -73,6 +79,9 @@ export enum ConnectionState {
|
|
|
73
79
|
* Connection closed.
|
|
74
80
|
*/
|
|
75
81
|
CLOSED = 'CLOSED',
|
|
82
|
+
|
|
83
|
+
ABORTING = 'ABORTING',
|
|
84
|
+
ABORTED = 'ABORTED',
|
|
76
85
|
}
|
|
77
86
|
|
|
78
87
|
/**
|
|
@@ -156,7 +165,7 @@ export class Connection {
|
|
|
156
165
|
// TODO(dmaretskyi): Piped streams should do this automatically, but it break's without this code.
|
|
157
166
|
this._protocol.stream.on('close', () => {
|
|
158
167
|
log('protocol stream closed');
|
|
159
|
-
this.close().catch((err) => this.errors.raise(err));
|
|
168
|
+
this.close(new ProtocolError('protocol stream closed')).catch((err) => this.errors.raise(err));
|
|
160
169
|
});
|
|
161
170
|
|
|
162
171
|
invariant(!this._transport);
|
|
@@ -179,13 +188,19 @@ export class Connection {
|
|
|
179
188
|
|
|
180
189
|
this._transport.errors.handle((err) => {
|
|
181
190
|
log('transport error:', { err });
|
|
182
|
-
// TODO(nf): collect a list of errors?
|
|
183
191
|
if (!this.closeReason) {
|
|
184
192
|
this.closeReason = err?.message;
|
|
185
193
|
}
|
|
186
|
-
|
|
187
|
-
|
|
194
|
+
|
|
195
|
+
// TODO(nf): fix ErrorStream so instanceof works here
|
|
196
|
+
if (err instanceof ConnectionResetError) {
|
|
197
|
+
log('aborting due to transport ConnectionResetError');
|
|
188
198
|
this.abort().catch((err) => this.errors.raise(err));
|
|
199
|
+
} else if (err instanceof ConnectivityError) {
|
|
200
|
+
log('aborting due to transport ConnectivityError');
|
|
201
|
+
this.abort().catch((err) => this.errors.raise(err));
|
|
202
|
+
} else if (err instanceof UnknownProtocolError) {
|
|
203
|
+
log('unsure what to do for UnknownProtocolError', { err });
|
|
189
204
|
}
|
|
190
205
|
|
|
191
206
|
if (this._state !== ConnectionState.CLOSED && this._state !== ConnectionState.CLOSING) {
|
|
@@ -207,15 +222,15 @@ export class Connection {
|
|
|
207
222
|
// TODO(nf): make the caller responsible for recording the reason and determining flow control.
|
|
208
223
|
async abort(err?: Error) {
|
|
209
224
|
log('aborting...', { err });
|
|
225
|
+
if (this._state === ConnectionState.CLOSED || this._state === ConnectionState.ABORTED) {
|
|
226
|
+
log(`abort ignored: already ${this._state}`, this.closeReason);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
this._changeState(ConnectionState.ABORTING);
|
|
210
231
|
if (!this.closeReason) {
|
|
211
232
|
this.closeReason = err?.message;
|
|
212
233
|
}
|
|
213
|
-
if (this._state === ConnectionState.CLOSED) {
|
|
214
|
-
log('abort ignored: already closed', this.closeReason);
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
// TODO(nf): different state?
|
|
218
|
-
this._changeState(ConnectionState.CLOSING);
|
|
219
234
|
|
|
220
235
|
await this._ctx.dispose();
|
|
221
236
|
|
|
@@ -234,8 +249,12 @@ export class Connection {
|
|
|
234
249
|
log.catch(err);
|
|
235
250
|
}
|
|
236
251
|
|
|
237
|
-
|
|
238
|
-
|
|
252
|
+
try {
|
|
253
|
+
this._callbacks?.onClosed?.(err);
|
|
254
|
+
} catch (err) {
|
|
255
|
+
log.catch(err);
|
|
256
|
+
}
|
|
257
|
+
this._changeState(ConnectionState.ABORTED);
|
|
239
258
|
}
|
|
240
259
|
|
|
241
260
|
@synchronized
|
|
@@ -243,27 +262,34 @@ export class Connection {
|
|
|
243
262
|
if (!this.closeReason) {
|
|
244
263
|
this.closeReason = err?.message;
|
|
245
264
|
}
|
|
246
|
-
if (
|
|
265
|
+
if (
|
|
266
|
+
this._state === ConnectionState.CLOSED ||
|
|
267
|
+
this._state === ConnectionState.ABORTING ||
|
|
268
|
+
this._state === ConnectionState.ABORTED
|
|
269
|
+
) {
|
|
247
270
|
return;
|
|
248
271
|
}
|
|
272
|
+
const lastState = this._state;
|
|
249
273
|
this._changeState(ConnectionState.CLOSING);
|
|
250
274
|
|
|
251
275
|
await this._ctx.dispose();
|
|
252
276
|
|
|
253
277
|
log('closing...', { peerId: this.ownId });
|
|
254
278
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
279
|
+
if (lastState === ConnectionState.CONNECTED) {
|
|
280
|
+
try {
|
|
281
|
+
// Gracefully close the stream flushing any unsent data packets.
|
|
282
|
+
await this._protocol.close();
|
|
283
|
+
} catch (err: any) {
|
|
284
|
+
log.catch(err);
|
|
285
|
+
}
|
|
261
286
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
287
|
+
try {
|
|
288
|
+
// After the transport is closed streams are disconnected.
|
|
289
|
+
await this._transport?.destroy();
|
|
290
|
+
} catch (err: any) {
|
|
291
|
+
log.catch(err);
|
|
292
|
+
}
|
|
267
293
|
}
|
|
268
294
|
|
|
269
295
|
log('closed', { peerId: this.ownId });
|
|
@@ -343,7 +369,7 @@ export class Connection {
|
|
|
343
369
|
}
|
|
344
370
|
|
|
345
371
|
private _changeState(state: ConnectionState): void {
|
|
346
|
-
log('stateChanged', { from: this._state,
|
|
372
|
+
log('stateChanged', { from: this._state, to: state, peerId: this.ownId });
|
|
347
373
|
invariant(state !== this._state, 'Already in this state.');
|
|
348
374
|
this._state = state;
|
|
349
375
|
this.stateChanged.emit(state);
|
package/src/swarm/peer.ts
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import { Event, scheduleTask, synchronized } from '@dxos/async';
|
|
6
6
|
import { Context } from '@dxos/context';
|
|
7
|
-
import { CancelledError, SystemError } from '@dxos/errors';
|
|
8
7
|
import { invariant } from '@dxos/invariant';
|
|
9
8
|
import { PublicKey } from '@dxos/keys';
|
|
10
9
|
import { log } from '@dxos/log';
|
|
10
|
+
import { CancelledError, SystemError, TimeoutError } from '@dxos/protocols';
|
|
11
11
|
import { Answer } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
12
12
|
|
|
13
13
|
import { OfferMessage, SignalMessage, SignalMessenger } from '../signal';
|
|
@@ -194,6 +194,9 @@ export class Peer {
|
|
|
194
194
|
this._callbacks.onAccepted();
|
|
195
195
|
} catch (err: any) {
|
|
196
196
|
log('initiation error', { err, topic: this.topic, peerId: this.localPeerId, remoteId: this.id });
|
|
197
|
+
if (err instanceof TimeoutError) {
|
|
198
|
+
await connection.abort(err);
|
|
199
|
+
}
|
|
197
200
|
// Calls `onStateChange` with CLOSED state.
|
|
198
201
|
await this.closeConnection(err);
|
|
199
202
|
throw err;
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
createLibDataChannelTransportFactory,
|
|
28
28
|
TransportKind,
|
|
29
29
|
} from '../transport';
|
|
30
|
+
import { TcpTransportFactory } from '../transport/tcp-transport';
|
|
30
31
|
import { TestWireProtocol, type TestTeleportExtensionFactory } from './test-wire-protocol';
|
|
31
32
|
|
|
32
33
|
// Signal server will be started by the setup script.
|
|
@@ -105,6 +106,9 @@ export class TestPeer {
|
|
|
105
106
|
switch (transport) {
|
|
106
107
|
case TransportKind.MEMORY:
|
|
107
108
|
throw new Error('Memory transport not supported with signal server.');
|
|
109
|
+
case TransportKind.TCP:
|
|
110
|
+
transportFactory = TcpTransportFactory;
|
|
111
|
+
break;
|
|
108
112
|
case TransportKind.SIMPLE_PEER:
|
|
109
113
|
transportFactory = createSimplePeerTransportFactory();
|
|
110
114
|
break;
|
|
@@ -146,7 +150,7 @@ export class TestPeer {
|
|
|
146
150
|
throw new Error(`Unsupported transport: ${transport}`);
|
|
147
151
|
}
|
|
148
152
|
} else {
|
|
149
|
-
if (transport !== TransportKind.MEMORY) {
|
|
153
|
+
if (transport !== TransportKind.MEMORY && transport !== TransportKind.TCP) {
|
|
150
154
|
log.warn(`specified transport ${transport} but no signalling configured, using memory transport instead`);
|
|
151
155
|
}
|
|
152
156
|
log.info(`using ${transport} transport without signal server.`);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2021 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { randomBytes } from 'crypto';
|
|
6
|
+
|
|
7
|
+
import { PublicKey } from '@dxos/keys';
|
|
8
|
+
import { test } from '@dxos/test';
|
|
9
|
+
import { range } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { TestBuilder } from '../testing';
|
|
12
|
+
import { FullyConnectedTopology } from '../topology';
|
|
13
|
+
import { TransportKind } from '../transport';
|
|
14
|
+
import { basicTestSuite } from './basic-test-suite';
|
|
15
|
+
import { exchangeMessages, joinSwarm, leaveSwarm, openAndCloseAfterTest } from './utils';
|
|
16
|
+
|
|
17
|
+
describe('Tcp transport', () => {
|
|
18
|
+
const testBuilder = new TestBuilder({
|
|
19
|
+
transport: TransportKind.TCP,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
basicTestSuite(testBuilder);
|
|
23
|
+
|
|
24
|
+
test
|
|
25
|
+
.skip('load', async () => {
|
|
26
|
+
const NUM_PAIRS = 100;
|
|
27
|
+
const NUM_ROUNDS = 10_000;
|
|
28
|
+
const PACKET_SIZE = 1_000;
|
|
29
|
+
|
|
30
|
+
const pairs = await Promise.all(
|
|
31
|
+
range(NUM_PAIRS).map(async () => {
|
|
32
|
+
const peer1 = testBuilder.createPeer();
|
|
33
|
+
const peer2 = testBuilder.createPeer();
|
|
34
|
+
await openAndCloseAfterTest([peer1, peer2]);
|
|
35
|
+
|
|
36
|
+
const topic = PublicKey.random();
|
|
37
|
+
const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
peer1,
|
|
41
|
+
peer2,
|
|
42
|
+
topic,
|
|
43
|
+
swarm1,
|
|
44
|
+
swarm2,
|
|
45
|
+
};
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const message = randomBytes(PACKET_SIZE / 2).toString('hex');
|
|
50
|
+
|
|
51
|
+
for (let i = 0; i < NUM_ROUNDS; i++) {
|
|
52
|
+
// console.log(`Round ${i}/${NUM_ROUNDS}`);
|
|
53
|
+
await Promise.all(
|
|
54
|
+
pairs.map(async ({ swarm1, swarm2 }) => {
|
|
55
|
+
await exchangeMessages(swarm1, swarm2, message);
|
|
56
|
+
}),
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
await Promise.all(
|
|
61
|
+
pairs.map(async ({ peer1, peer2, topic }) => {
|
|
62
|
+
await leaveSwarm([peer1, peer2], topic);
|
|
63
|
+
}),
|
|
64
|
+
);
|
|
65
|
+
})
|
|
66
|
+
.timeout(1_000_000);
|
|
67
|
+
});
|
|
@@ -11,6 +11,13 @@ import { ErrorStream } from '@dxos/debug';
|
|
|
11
11
|
import { invariant } from '@dxos/invariant';
|
|
12
12
|
import { PublicKey } from '@dxos/keys';
|
|
13
13
|
import { log } from '@dxos/log';
|
|
14
|
+
import {
|
|
15
|
+
ConnectionResetError,
|
|
16
|
+
TimeoutError,
|
|
17
|
+
ProtocolError,
|
|
18
|
+
ConnectivityError,
|
|
19
|
+
UnknownProtocolError,
|
|
20
|
+
} from '@dxos/protocols';
|
|
14
21
|
import { ConnectionState, BridgeEvent, BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';
|
|
15
22
|
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
16
23
|
import { arrayToBuffer } from '@dxos/util';
|
|
@@ -78,7 +85,7 @@ export class SimplePeerTransportProxy implements Transport {
|
|
|
78
85
|
|
|
79
86
|
private async _handleConnection(connectionEvent: BridgeEvent.ConnectionEvent): Promise<void> {
|
|
80
87
|
if (connectionEvent.error) {
|
|
81
|
-
this.errors.raise(
|
|
88
|
+
this.errors.raise(decodeError(connectionEvent.error));
|
|
82
89
|
}
|
|
83
90
|
|
|
84
91
|
switch (connectionEvent.state) {
|
|
@@ -108,7 +115,7 @@ export class SimplePeerTransportProxy implements Transport {
|
|
|
108
115
|
proxyId: this._proxyId,
|
|
109
116
|
signal,
|
|
110
117
|
})
|
|
111
|
-
.catch((err) => this.errors.raise(err));
|
|
118
|
+
.catch((err) => this.errors.raise(decodeError(err)));
|
|
112
119
|
}
|
|
113
120
|
|
|
114
121
|
// TODO(burdon): Move open from constructor.
|
|
@@ -173,3 +180,22 @@ export class SimplePeerTransportProxyFactory implements TransportFactory {
|
|
|
173
180
|
return transport;
|
|
174
181
|
}
|
|
175
182
|
}
|
|
183
|
+
|
|
184
|
+
// TODO(nf): fix so Errors crossing RPC boundary preserve class
|
|
185
|
+
const decodeError = (err: Error | string) => {
|
|
186
|
+
const message = typeof err === 'string' ? err : err.message;
|
|
187
|
+
|
|
188
|
+
if (message.includes('ConnectionResetError')) {
|
|
189
|
+
return new ConnectionResetError(message);
|
|
190
|
+
} else if (message.includes('TimeoutError')) {
|
|
191
|
+
return new TimeoutError(message);
|
|
192
|
+
} else if (message.includes('ProtocolError')) {
|
|
193
|
+
return new ProtocolError(message);
|
|
194
|
+
} else if (message.includes('ConnectivityError')) {
|
|
195
|
+
return new ConnectivityError(message);
|
|
196
|
+
} else if (message.includes('UnknownProtocolError')) {
|
|
197
|
+
return new UnknownProtocolError(message);
|
|
198
|
+
} else {
|
|
199
|
+
return typeof err === 'string' ? new Error(err) : err;
|
|
200
|
+
}
|
|
201
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable no-fallthrough */
|
|
1
2
|
//
|
|
2
3
|
// Copyright 2020 DXOS.org
|
|
3
4
|
//
|
|
@@ -9,7 +10,7 @@ import { Event } from '@dxos/async';
|
|
|
9
10
|
import { ErrorStream, raise } from '@dxos/debug';
|
|
10
11
|
import { PublicKey } from '@dxos/keys';
|
|
11
12
|
import { log } from '@dxos/log';
|
|
12
|
-
import { trace } from '@dxos/protocols';
|
|
13
|
+
import { ConnectionResetError, ConnectivityError, ProtocolError, UnknownProtocolError, trace } from '@dxos/protocols';
|
|
13
14
|
import { Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
14
15
|
|
|
15
16
|
import { Transport, TransportFactory } from './transport';
|
|
@@ -63,7 +64,40 @@ export class SimplePeerTransport implements Transport {
|
|
|
63
64
|
});
|
|
64
65
|
|
|
65
66
|
this._peer.on('error', async (err) => {
|
|
66
|
-
|
|
67
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/RTCError
|
|
68
|
+
if (typeof RTCError !== 'undefined' && err instanceof RTCError) {
|
|
69
|
+
// Sent when connection is unexpectedly severed
|
|
70
|
+
if (err.errorDetail === 'sctp-failure') {
|
|
71
|
+
this.errors.raise(new ConnectionResetError('sctp-failure from RTCError', err));
|
|
72
|
+
} else {
|
|
73
|
+
this.errors.raise(new UnknownProtocolError('unknown RTCError', err));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Safari specific? are all errors of code: "DATA_CHANNEL_ERROR" connection aborts?
|
|
77
|
+
} else if (err.name === 'InvalidStateError') {
|
|
78
|
+
this.errors.raise(new ConnectionResetError('safari WebRTC error', err));
|
|
79
|
+
// catch more generic simple-peer errors: https://github.com/feross/simple-peer/blob/master/README.md#error-codes
|
|
80
|
+
} else if ('code' in err) {
|
|
81
|
+
switch (err.code) {
|
|
82
|
+
case 'ERR_WEBRTC_SUPPORT':
|
|
83
|
+
this.errors.raise(new ProtocolError('WebRTC not supported', err));
|
|
84
|
+
case 'ERR_ICE_CONNECTION_FAILURE':
|
|
85
|
+
case 'ERR_DATA_CHANNEL':
|
|
86
|
+
case 'ERR_CONNECTION_FAILURE':
|
|
87
|
+
case 'ERR_SIGNALING':
|
|
88
|
+
this.errors.raise(new ConnectivityError('unknown communication failure', err));
|
|
89
|
+
case 'ERR_CREATE_OFFER':
|
|
90
|
+
case 'ERR_CREATE_ANSWER':
|
|
91
|
+
case 'ERR_SET_LOCAL_DESCRIPTION':
|
|
92
|
+
case 'ERR_SET_REMOTE_DESCRIPTION':
|
|
93
|
+
case 'ERR_ADD_ICE_CANDIDATE':
|
|
94
|
+
this.errors.raise(new UnknownProtocolError('unknown simple-peer library failure', err));
|
|
95
|
+
default:
|
|
96
|
+
this.errors.raise(new Error('unknown simple-peer error'));
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
this.errors.raise(err);
|
|
100
|
+
}
|
|
67
101
|
|
|
68
102
|
// Try to gather additional information about the connection.
|
|
69
103
|
try {
|
|
@@ -75,7 +109,9 @@ export class SimplePeerTransport implements Transport {
|
|
|
75
109
|
});
|
|
76
110
|
});
|
|
77
111
|
}
|
|
78
|
-
} catch
|
|
112
|
+
} catch (err) {
|
|
113
|
+
log.catch(err);
|
|
114
|
+
}
|
|
79
115
|
|
|
80
116
|
await this.destroy();
|
|
81
117
|
});
|