peer.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import "./setup";
  2. import { expect } from "chai";
  3. import { Peer } from "../lib/peer";
  4. import { Server } from "mock-socket";
  5. import { ConnectionType, ServerMessageType } from "../lib/enums";
  6. const createMockServer = (): Server => {
  7. const fakeURL = "ws://localhost:8080/peerjs?key=peerjs&id=1&token=testToken";
  8. const mockServer = new Server(fakeURL);
  9. mockServer.on("connection", (socket) => {
  10. //@ts-ignore
  11. socket.on("message", (data) => {
  12. socket.send("test message from mock server");
  13. });
  14. socket.send(JSON.stringify({ type: ServerMessageType.Open }));
  15. });
  16. return mockServer;
  17. };
  18. describe("Peer", function () {
  19. describe("after construct without parameters", function () {
  20. it("shouldn't contains any connection", function () {
  21. const peer = new Peer();
  22. expect(peer.open).to.be.false;
  23. expect(peer.connections).to.be.empty;
  24. expect(peer.id).to.be.null;
  25. expect(peer.disconnected).to.be.false;
  26. expect(peer.destroyed).to.be.false;
  27. peer.destroy();
  28. });
  29. });
  30. describe("after construct with parameters", function () {
  31. it("should contains id and key", function () {
  32. const peer = new Peer("1", { key: "anotherKey" });
  33. expect(peer.id).to.eq("1");
  34. expect(peer.options.key).to.eq("anotherKey");
  35. peer.destroy();
  36. });
  37. });
  38. describe("after call to peer #2", function () {
  39. let mockServer;
  40. before(function () {
  41. mockServer = createMockServer();
  42. });
  43. it("Peer#1 should has id #1", function (done) {
  44. const peer1 = new Peer("1", { port: 8080, host: "localhost" });
  45. expect(peer1.open).to.be.false;
  46. const mediaOptions = {
  47. metadata: { var: "123" },
  48. constraints: {
  49. mandatory: {
  50. OfferToReceiveAudio: true,
  51. OfferToReceiveVideo: true,
  52. },
  53. },
  54. };
  55. const track = new MediaStreamTrack();
  56. const mediaStream = new MediaStream([track]);
  57. const mediaConnection = peer1.call("2", mediaStream, { ...mediaOptions });
  58. expect(mediaConnection.connectionId).to.be.a("string");
  59. expect(mediaConnection.type).to.eq(ConnectionType.Media);
  60. expect(mediaConnection.peer).to.eq("2");
  61. expect(mediaConnection.options).to.include(mediaOptions);
  62. expect(mediaConnection.metadata).to.deep.eq(mediaOptions.metadata);
  63. expect(mediaConnection.peerConnection.getSenders()[0].track.id).to.eq(
  64. track.id,
  65. );
  66. peer1.once("open", (id) => {
  67. expect(id).to.be.eq("1");
  68. //@ts-ignore
  69. expect(peer1._lastServerId).to.be.eq("1");
  70. expect(peer1.disconnected).to.be.false;
  71. expect(peer1.destroyed).to.be.false;
  72. expect(peer1.open).to.be.true;
  73. peer1.destroy();
  74. expect(peer1.disconnected).to.be.true;
  75. expect(peer1.destroyed).to.be.true;
  76. expect(peer1.open).to.be.false;
  77. expect(peer1.connections).to.be.empty;
  78. done();
  79. });
  80. });
  81. after(function () {
  82. mockServer.stop();
  83. });
  84. });
  85. describe("reconnect", function () {
  86. let mockServer;
  87. before(function () {
  88. mockServer = createMockServer();
  89. });
  90. it("connect to server => disconnect => reconnect => destroy", function (done) {
  91. const peer1 = new Peer("1", { port: 8080, host: "localhost" });
  92. peer1.once("open", () => {
  93. expect(peer1.open).to.be.true;
  94. peer1.once("disconnected", () => {
  95. expect(peer1.disconnected).to.be.true;
  96. expect(peer1.destroyed).to.be.false;
  97. expect(peer1.open).to.be.false;
  98. peer1.once("open", (id) => {
  99. expect(id).to.be.eq("1");
  100. expect(peer1.disconnected).to.be.false;
  101. expect(peer1.destroyed).to.be.false;
  102. expect(peer1.open).to.be.true;
  103. peer1.once("disconnected", () => {
  104. expect(peer1.disconnected).to.be.true;
  105. expect(peer1.destroyed).to.be.false;
  106. expect(peer1.open).to.be.false;
  107. peer1.once("close", () => {
  108. expect(peer1.disconnected).to.be.true;
  109. expect(peer1.destroyed).to.be.true;
  110. expect(peer1.open).to.be.false;
  111. done();
  112. });
  113. });
  114. peer1.destroy();
  115. });
  116. peer1.reconnect();
  117. });
  118. peer1.disconnect();
  119. });
  120. });
  121. it("disconnect => reconnect => destroy", function (done) {
  122. mockServer.stop();
  123. const peer1 = new Peer("1", { port: 8080, host: "localhost" });
  124. peer1.once("disconnected", (id) => {
  125. expect(id).to.be.eq("1");
  126. expect(peer1.disconnected).to.be.true;
  127. expect(peer1.destroyed).to.be.false;
  128. expect(peer1.open).to.be.false;
  129. peer1.once("open", (id) => {
  130. expect(id).to.be.eq("1");
  131. expect(peer1.disconnected).to.be.false;
  132. expect(peer1.destroyed).to.be.false;
  133. expect(peer1.open).to.be.true;
  134. peer1.once("disconnected", () => {
  135. expect(peer1.disconnected).to.be.true;
  136. expect(peer1.destroyed).to.be.false;
  137. expect(peer1.open).to.be.false;
  138. peer1.once("close", () => {
  139. expect(peer1.disconnected).to.be.true;
  140. expect(peer1.destroyed).to.be.true;
  141. expect(peer1.open).to.be.false;
  142. done();
  143. });
  144. });
  145. peer1.destroy();
  146. });
  147. mockServer = createMockServer();
  148. peer1.reconnect();
  149. });
  150. });
  151. it("destroy peer if no id and no connection", function (done) {
  152. mockServer.stop();
  153. const peer1 = new Peer({ port: 8080, host: "localhost" });
  154. peer1.once("error", (_error) => {
  155. // expect(error.type).to.be.eq(PeerErrorType.ServerError);
  156. peer1.once("close", () => {
  157. expect(peer1.disconnected).to.be.true;
  158. expect(peer1.destroyed).to.be.true;
  159. expect(peer1.open).to.be.false;
  160. done();
  161. });
  162. mockServer = createMockServer();
  163. });
  164. });
  165. after(function () {
  166. mockServer.stop();
  167. });
  168. });
  169. });