mockrtc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.github/workflows/ci.yml +29 -0
  2. package/LICENSE +201 -0
  3. package/README.md +290 -0
  4. package/dist/admin-bin.d.ts +2 -0
  5. package/dist/admin-bin.js +67 -0
  6. package/dist/admin-bin.js.map +1 -0
  7. package/dist/client/mockrtc-client.d.ts +12 -0
  8. package/dist/client/mockrtc-client.js +67 -0
  9. package/dist/client/mockrtc-client.js.map +1 -0
  10. package/dist/client/mockrtc-remote-peer.d.ts +15 -0
  11. package/dist/client/mockrtc-remote-peer.js +246 -0
  12. package/dist/client/mockrtc-remote-peer.js.map +1 -0
  13. package/dist/control-channel.d.ts +8 -0
  14. package/dist/control-channel.js +11 -0
  15. package/dist/control-channel.js.map +1 -0
  16. package/dist/handling/handler-builder.d.ts +138 -0
  17. package/dist/handling/handler-builder.js +164 -0
  18. package/dist/handling/handler-builder.js.map +1 -0
  19. package/dist/handling/handler-step-definitions.d.ts +63 -0
  20. package/dist/handling/handler-step-definitions.js +123 -0
  21. package/dist/handling/handler-step-definitions.js.map +1 -0
  22. package/dist/handling/handler-steps.d.ts +48 -0
  23. package/dist/handling/handler-steps.js +218 -0
  24. package/dist/handling/handler-steps.js.map +1 -0
  25. package/dist/main-browser.d.ts +9 -0
  26. package/dist/main-browser.js +26 -0
  27. package/dist/main-browser.js.map +1 -0
  28. package/dist/main.d.ts +58 -0
  29. package/dist/main.js +67 -0
  30. package/dist/main.js.map +1 -0
  31. package/dist/mockrtc-admin-plugin.d.ts +56 -0
  32. package/dist/mockrtc-admin-plugin.js +151 -0
  33. package/dist/mockrtc-admin-plugin.js.map +1 -0
  34. package/dist/mockrtc-admin-server.d.ts +7 -0
  35. package/dist/mockrtc-admin-server.js +18 -0
  36. package/dist/mockrtc-admin-server.js.map +1 -0
  37. package/dist/mockrtc-client.d.ts +12 -0
  38. package/dist/mockrtc-client.js +64 -0
  39. package/dist/mockrtc-client.js.map +1 -0
  40. package/dist/mockrtc-handler-builder.d.ts +15 -0
  41. package/dist/mockrtc-handler-builder.js +24 -0
  42. package/dist/mockrtc-handler-builder.js.map +1 -0
  43. package/dist/mockrtc-peer.d.ts +147 -0
  44. package/dist/mockrtc-peer.js +7 -0
  45. package/dist/mockrtc-peer.js.map +1 -0
  46. package/dist/mockrtc-remote-peer.d.ts +15 -0
  47. package/dist/mockrtc-remote-peer.js +234 -0
  48. package/dist/mockrtc-remote-peer.js.map +1 -0
  49. package/dist/mockrtc-server-peer.d.ts +29 -0
  50. package/dist/mockrtc-server-peer.js +145 -0
  51. package/dist/mockrtc-server-peer.js.map +1 -0
  52. package/dist/mockrtc-server.d.ts +14 -0
  53. package/dist/mockrtc-server.js +53 -0
  54. package/dist/mockrtc-server.js.map +1 -0
  55. package/dist/mockrtc.d.ts +25 -0
  56. package/dist/mockrtc.js +7 -0
  57. package/dist/mockrtc.js.map +1 -0
  58. package/dist/package.json +52 -0
  59. package/dist/server/mockrtc-admin-plugin.d.ts +17 -0
  60. package/dist/server/mockrtc-admin-plugin.js +163 -0
  61. package/dist/server/mockrtc-admin-plugin.js.map +1 -0
  62. package/dist/server/mockrtc-admin-server.d.ts +7 -0
  63. package/dist/server/mockrtc-admin-server.js +18 -0
  64. package/dist/server/mockrtc-admin-server.js.map +1 -0
  65. package/dist/server/mockrtc-server-peer.d.ts +24 -0
  66. package/dist/server/mockrtc-server-peer.js +141 -0
  67. package/dist/server/mockrtc-server-peer.js.map +1 -0
  68. package/dist/server/mockrtc-server.d.ts +14 -0
  69. package/dist/server/mockrtc-server.js +53 -0
  70. package/dist/server/mockrtc-server.js.map +1 -0
  71. package/dist/src/main.d.ts +1 -0
  72. package/dist/src/main.js +24 -0
  73. package/dist/src/main.js.map +1 -0
  74. package/dist/src/mockrtc-peer.d.ts +0 -0
  75. package/dist/src/mockrtc-peer.js +2 -0
  76. package/dist/src/mockrtc-peer.js.map +1 -0
  77. package/dist/src/mockrtc.d.ts +0 -0
  78. package/dist/src/mockrtc.js +65 -0
  79. package/dist/src/mockrtc.js.map +1 -0
  80. package/dist/webrtc/control-channel.d.ts +8 -0
  81. package/dist/webrtc/control-channel.js +11 -0
  82. package/dist/webrtc/control-channel.js.map +1 -0
  83. package/dist/webrtc/datachannel-stream.d.ts +25 -0
  84. package/dist/webrtc/datachannel-stream.js +86 -0
  85. package/dist/webrtc/datachannel-stream.js.map +1 -0
  86. package/dist/webrtc/mediatrack-stream.d.ts +29 -0
  87. package/dist/webrtc/mediatrack-stream.js +109 -0
  88. package/dist/webrtc/mediatrack-stream.js.map +1 -0
  89. package/dist/webrtc/mockrtc-connection.d.ts +14 -0
  90. package/dist/webrtc/mockrtc-connection.js +147 -0
  91. package/dist/webrtc/mockrtc-connection.js.map +1 -0
  92. package/dist/webrtc/peer-connection.d.ts +16 -0
  93. package/dist/webrtc/peer-connection.js +81 -0
  94. package/dist/webrtc/peer-connection.js.map +1 -0
  95. package/dist/webrtc/rtc-connection.d.ts +47 -0
  96. package/dist/webrtc/rtc-connection.js +370 -0
  97. package/dist/webrtc/rtc-connection.js.map +1 -0
  98. package/dist/webrtc-hooks.d.ts +30 -0
  99. package/dist/webrtc-hooks.js +224 -0
  100. package/dist/webrtc-hooks.js.map +1 -0
  101. package/karma.conf.ts +89 -0
  102. package/ngi-eu-footer.png +0 -0
  103. package/package.json +86 -0
  104. package/src/admin-bin.ts +57 -0
  105. package/src/client/mockrtc-client.ts +79 -0
  106. package/src/client/mockrtc-remote-peer.ts +286 -0
  107. package/src/handling/handler-builder.ts +215 -0
  108. package/src/handling/handler-step-definitions.ts +142 -0
  109. package/src/handling/handler-steps.ts +254 -0
  110. package/src/main-browser.ts +44 -0
  111. package/src/main.ts +109 -0
  112. package/src/mockrtc-peer.ts +176 -0
  113. package/src/mockrtc.ts +36 -0
  114. package/src/server/mockrtc-admin-plugin.ts +196 -0
  115. package/src/server/mockrtc-admin-server.ts +17 -0
  116. package/src/server/mockrtc-server-peer.ts +159 -0
  117. package/src/server/mockrtc-server.ts +53 -0
  118. package/src/webrtc/control-channel.ts +13 -0
  119. package/src/webrtc/datachannel-stream.ts +102 -0
  120. package/src/webrtc/mediatrack-stream.ts +135 -0
  121. package/src/webrtc/mockrtc-connection.ts +164 -0
  122. package/src/webrtc/rtc-connection.ts +420 -0
  123. package/src/webrtc-hooks.ts +245 -0
  124. package/test/integration/close-steps.spec.ts +39 -0
  125. package/test/integration/connection-setup.spec.ts +230 -0
  126. package/test/integration/echo-steps.spec.ts +88 -0
  127. package/test/integration/proxy.spec.ts +526 -0
  128. package/test/integration/send-steps.spec.ts +76 -0
  129. package/test/integration/smoke-test.spec.ts +100 -0
  130. package/test/integration/wait-steps.spec.ts +225 -0
  131. package/test/start-test-admin-server.ts +12 -0
  132. package/test/test-setup.ts +136 -0
  133. package/test/tsconfig.json +11 -0
  134. package/tsconfig.json +14 -0
  135. package/typedoc.json +19 -0
  136. package/wallaby.js +41 -0
@@ -0,0 +1,56 @@
1
+ /// <reference types="node" />
2
+ import * as stream from 'stream';
3
+ import { PluggableAdmin } from 'mockttp';
4
+ import { SerializedValue } from 'mockttp/dist/util/serialization';
5
+ import { HandlerStep } from './handling/handler-steps';
6
+ import { MockRTCOptions } from './mockrtc';
7
+ export interface SessionData {
8
+ id: string;
9
+ description: RTCSessionDescriptionInit;
10
+ }
11
+ export declare class MockRTCAdminPlugin implements PluggableAdmin.AdminPlugin<MockRTCOptions, {}> {
12
+ private mockRTCServer;
13
+ start(options: MockRTCOptions): Promise<void>;
14
+ reset(): void;
15
+ stop(): Promise<void>;
16
+ schema: import("graphql/language/ast").DocumentNode;
17
+ buildResolvers(adminStream: stream.Duplex, ruleParams: {}): {
18
+ Mutation: {
19
+ createPeer: (__: any, { data: { steps } }: {
20
+ data: {
21
+ steps: Array<SerializedValue<HandlerStep>>;
22
+ };
23
+ }) => Promise<import("./mockrtc-server-peer").MockRTCServerPeer>;
24
+ createOffer: (__: any, { peerId, sessionId }: {
25
+ peerId: string;
26
+ sessionId?: string | undefined;
27
+ }) => Promise<SessionData>;
28
+ createExternalOffer: (__: any, { peerId }: {
29
+ peerId: string;
30
+ }) => Promise<SessionData>;
31
+ completeOffer: (__: any, { peerId, sessionId, answer }: {
32
+ peerId: string;
33
+ sessionId: string;
34
+ answer: RTCSessionDescriptionInit;
35
+ }) => Promise<void>;
36
+ answerOffer: (__: any, { peerId, sessionId, offer }: {
37
+ peerId: string;
38
+ sessionId?: string | undefined;
39
+ offer: RTCSessionDescriptionInit;
40
+ }) => Promise<SessionData>;
41
+ answerExternalOffer: (__: any, { peerId, offer }: {
42
+ peerId: string;
43
+ offer: RTCSessionDescriptionInit;
44
+ }) => Promise<SessionData>;
45
+ };
46
+ Query: {
47
+ getSeenMessages: (__: any, { peerId, channelName }: {
48
+ peerId: string;
49
+ channelName?: string | undefined;
50
+ }) => Promise<(string | {
51
+ type: string;
52
+ value: string;
53
+ })[]>;
54
+ };
55
+ };
56
+ }
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /*
3
+ * SPDX-FileCopyrightText: 2022 Tim Perry <tim@httptoolkit.tech>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
+ return new (P || (P = Promise))(function (resolve, reject) {
9
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
13
+ });
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.MockRTCAdminPlugin = void 0;
17
+ const graphql_tag_1 = require("graphql-tag");
18
+ const serialization_1 = require("mockttp/dist/util/serialization");
19
+ const handler_steps_1 = require("./handling/handler-steps");
20
+ const mockrtc_server_1 = require("./mockrtc-server");
21
+ class MockRTCAdminPlugin {
22
+ constructor() {
23
+ this.schema = (0, graphql_tag_1.gql) `
24
+ extend type Mutation {
25
+ createPeer(data: RTCHandlerData!): MockedPeer!
26
+
27
+ createOffer(peerId: ID!, sessionId: ID): Session!
28
+ createExternalOffer(peerId: ID!): Session!
29
+ completeOffer(peerId: ID!, sessionId: ID!, answer: SessionDescriptionInput!): Void
30
+
31
+ answerOffer(peerId: ID!, sessionId: ID, offer: SessionDescriptionInput!): Session!
32
+ answerExternalOffer(peerId: ID!, offer: SessionDescriptionInput!): Session!
33
+ answerRenegotiationOffer(sessionId: ID!, offer: SessionDescriptionInput!): Session!
34
+ }
35
+
36
+ input RTCHandlerData {
37
+ steps: [Raw!]!
38
+ }
39
+
40
+ type MockedPeer {
41
+ peerId: ID!
42
+ }
43
+
44
+ input SessionDescriptionInput {
45
+ type: String!
46
+ sdp: String!
47
+ }
48
+
49
+ type SessionDescriptionResult {
50
+ type: String!
51
+ sdp: String!
52
+ }
53
+
54
+ type Session {
55
+ id: ID!
56
+ description: SessionDescriptionResult
57
+ }
58
+
59
+ extend type Query {
60
+ getSeenMessages(peerId: ID!, channelName: String): [Raw!]
61
+ }
62
+
63
+ scalar HandlerStep
64
+ `;
65
+ }
66
+ start(options) {
67
+ this.mockRTCServer = new mockrtc_server_1.MockRTCServer(options);
68
+ return this.mockRTCServer.start();
69
+ }
70
+ reset() { }
71
+ stop() {
72
+ return this.mockRTCServer.stop();
73
+ }
74
+ buildResolvers(adminStream, ruleParams) {
75
+ return {
76
+ Mutation: {
77
+ createPeer: (__, { data: { steps } }) => {
78
+ return this.mockRTCServer.buildPeerFromData(steps.map((stepData) => (0, serialization_1.deserialize)(stepData, adminStream, ruleParams, handler_steps_1.StepLookup)));
79
+ },
80
+ createOffer: (__, { peerId, sessionId }) => __awaiter(this, void 0, void 0, function* () {
81
+ const peer = this.mockRTCServer.getPeer(peerId);
82
+ if (!peer)
83
+ throw new Error("Id matches no active peer");
84
+ if (sessionId) {
85
+ const session = peer.getSessionApi(sessionId);
86
+ return {
87
+ id: sessionId,
88
+ description: yield session.createOffer()
89
+ };
90
+ }
91
+ else {
92
+ const offerParams = yield peer.createOffer();
93
+ return { id: offerParams._sessionId, description: offerParams.offer };
94
+ }
95
+ }),
96
+ createExternalOffer: (__, { peerId }) => __awaiter(this, void 0, void 0, function* () {
97
+ const peer = this.mockRTCServer.getPeer(peerId);
98
+ if (!peer)
99
+ throw new Error("Id matches no active peer");
100
+ const offerParams = yield peer.createExternalOffer();
101
+ return { id: offerParams.id, description: offerParams.offer };
102
+ }),
103
+ completeOffer: (__, { peerId, sessionId, answer }) => __awaiter(this, void 0, void 0, function* () {
104
+ const session = this.mockRTCServer.getPeer(peerId).getSessionApi(sessionId);
105
+ yield session.completeOffer(answer);
106
+ }),
107
+ answerOffer: (__, { peerId, sessionId, offer }) => __awaiter(this, void 0, void 0, function* () {
108
+ const peer = this.mockRTCServer.getPeer(peerId);
109
+ if (!peer)
110
+ throw new Error("Id matches no active peer");
111
+ if (sessionId) {
112
+ const session = peer.getSessionApi(sessionId);
113
+ const answer = yield session.answerOffer(offer);
114
+ return { id: sessionId, description: answer };
115
+ }
116
+ else {
117
+ const answerParams = yield peer.answerOffer(offer);
118
+ return { id: answerParams._sessionId, description: answerParams.answer };
119
+ }
120
+ }),
121
+ answerExternalOffer: (__, { peerId, offer }) => __awaiter(this, void 0, void 0, function* () {
122
+ const peer = this.mockRTCServer.getPeer(peerId);
123
+ if (!peer)
124
+ throw new Error("Id matches no active peer");
125
+ const answerParams = yield peer.answerExternalOffer(offer);
126
+ return { id: answerParams.id, description: answerParams.answer };
127
+ })
128
+ },
129
+ Query: {
130
+ getSeenMessages: (__, { peerId, channelName }) => __awaiter(this, void 0, void 0, function* () {
131
+ const peer = this.mockRTCServer.getPeer(peerId);
132
+ if (!peer)
133
+ throw new Error("Id matches no active peer");
134
+ const messages = yield (channelName != undefined
135
+ ? peer.getMessagesOnChannel(channelName)
136
+ : peer.getAllMessages());
137
+ return messages.map((message) => {
138
+ if (Buffer.isBuffer(message)) {
139
+ return { type: 'buffer', value: message.toString('base64') };
140
+ }
141
+ else {
142
+ return message;
143
+ }
144
+ });
145
+ })
146
+ }
147
+ };
148
+ }
149
+ }
150
+ exports.MockRTCAdminPlugin = MockRTCAdminPlugin;
151
+ //# sourceMappingURL=mockrtc-admin-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockrtc-admin-plugin.js","sourceRoot":"","sources":["../src/mockrtc-admin-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { PluggableAdmin } from 'mockttp';
2
+ import { MockRTCAdminPlugin } from './mockrtc-admin-plugin';
3
+ export declare class MockRTCAdminServer extends PluggableAdmin.AdminServer<{
4
+ webrtc: MockRTCAdminPlugin;
5
+ }> {
6
+ constructor();
7
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /*
3
+ * SPDX-FileCopyrightText: 2022 Tim Perry <tim@httptoolkit.tech>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MockRTCAdminServer = void 0;
8
+ const mockttp_1 = require("mockttp");
9
+ const mockrtc_admin_plugin_1 = require("./mockrtc-admin-plugin");
10
+ class MockRTCAdminServer extends mockttp_1.PluggableAdmin.AdminServer {
11
+ constructor() {
12
+ super({
13
+ adminPlugins: { webrtc: mockrtc_admin_plugin_1.MockRTCAdminPlugin }
14
+ });
15
+ }
16
+ }
17
+ exports.MockRTCAdminServer = MockRTCAdminServer;
18
+ //# sourceMappingURL=mockrtc-admin-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockrtc-admin-server.js","sourceRoot":"","sources":["../src/mockrtc-admin-server.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qCAAyC;AACzC,iEAA4D;AAE5D,MAAa,kBAAmB,SAAQ,wBAAc,CAAC,WAA2C;IAE9F;QACI,KAAK,CAAC;YACF,YAAY,EAAE,EAAE,MAAM,EAAE,yCAAkB,EAAE;SAC/C,CAAC,CAAC;IACP,CAAC;CAEJ;AARD,gDAQC"}
@@ -0,0 +1,12 @@
1
+ import { PluggableAdmin } from 'mockttp';
2
+ import { MockRTC, MockRTCOptions, MockRTCPeerBuilder } from "./mockrtc";
3
+ export declare type MockRTCClientOptions = PluggableAdmin.AdminClientOptions & MockRTCOptions;
4
+ export declare class MockRTCClient implements MockRTC {
5
+ private options;
6
+ private adminClient;
7
+ constructor(options?: MockRTCClientOptions);
8
+ buildPeer(): MockRTCPeerBuilder;
9
+ private buildPeerFromData;
10
+ start(): Promise<void>;
11
+ stop(): Promise<void>;
12
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /*
3
+ * SPDX-FileCopyrightText: 2022 Tim Perry <tim@httptoolkit.tech>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
+ return new (P || (P = Promise))(function (resolve, reject) {
9
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
13
+ });
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.MockRTCClient = void 0;
17
+ const graphql_tag_1 = require("graphql-tag");
18
+ const mockttp_1 = require("mockttp");
19
+ const serialization_1 = require("mockttp/dist/util/serialization");
20
+ const mockrtc_remote_peer_1 = require("./mockrtc-remote-peer");
21
+ const handler_builder_1 = require("./handling/handler-builder");
22
+ class MockRTCClient {
23
+ constructor(options = {}) {
24
+ this.options = options;
25
+ this.buildPeerFromData = (handlerSteps) => __awaiter(this, void 0, void 0, function* () {
26
+ const { adminStream } = this.adminClient;
27
+ const peerData = yield this.adminClient.sendQuery({
28
+ query: (0, graphql_tag_1.default) `
29
+ mutation CreatePeer($peerData: RTCHandlerData!) {
30
+ createPeer(data: $peerData) {
31
+ peerId
32
+ }
33
+ }
34
+ `,
35
+ variables: {
36
+ peerData: {
37
+ steps: handlerSteps.map(step => (0, serialization_1.serialize)(step, adminStream))
38
+ }
39
+ },
40
+ transformResponse: ({ createPeer }) => createPeer
41
+ });
42
+ const { peerId } = peerData;
43
+ return new mockrtc_remote_peer_1.MockRTCRemotePeer(peerId, this.adminClient);
44
+ });
45
+ this.adminClient = new mockttp_1.PluggableAdmin.AdminClient(options);
46
+ }
47
+ buildPeer() {
48
+ return new handler_builder_1.MockRTCHandlerBuilder(this.buildPeerFromData);
49
+ }
50
+ start() {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ yield this.adminClient.start({
53
+ webrtc: this.options
54
+ });
55
+ });
56
+ }
57
+ stop() {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ yield this.adminClient.stop();
60
+ });
61
+ }
62
+ }
63
+ exports.MockRTCClient = MockRTCClient;
64
+ //# sourceMappingURL=mockrtc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockrtc-client.js","sourceRoot":"","sources":["../src/mockrtc-client.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;AAEH,6CAA8B;AAC9B,qCAAyC;AACzC,mEAA4D;AAM5D,+DAA0D;AAC1D,gEAAmE;AAOnE,MAAa,aAAa;IAItB,YACY,UAAgC,EAAE;QAAlC,YAAO,GAAP,OAAO,CAA2B;QAStC,sBAAiB,GAAG,CAAO,YAAqC,EAAwB,EAAE;YAC9F,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;YAEzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAG/C;gBACE,KAAK,EAAE,IAAA,qBAAG,EAAA;;;;;;aAMT;gBACD,SAAS,EAAE;oBACP,QAAQ,EAAE;wBACN,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,yBAAS,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;qBAChE;iBACJ;gBACD,iBAAiB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU;aACpD,CAAC,CAAC;YAEH,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE5B,OAAO,IAAI,uCAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC,CAAA,CAAA;QAhCG,IAAI,CAAC,WAAW,GAAG,IAAI,wBAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS;QACL,OAAO,IAAI,uCAAqB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IA6BK,KAAK;;YACP,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBACzB,MAAM,EAAE,IAAI,CAAC,OAAO;aACvB,CAAC,CAAC;QACP,CAAC;KAAA;IAEK,IAAI;;YACN,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;KAAA;CACJ;AAlDD,sCAkDC"}
@@ -0,0 +1,15 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * The builder logic for composing RTC handling behaviour for both mock peers and rules,
4
+ * by internally queuing defined actions until a `.thenX()` method is called to compile
5
+ * the actions into either a peer or a rule (handled by an abstract method).
6
+ */
7
+ export declare class MockRTCHandlerBuilder<R> {
8
+ private buildCallback;
9
+ private handlerSteps;
10
+ constructor(buildCallback: (handlerSteps: HandlerStep[]) => Promise<R>);
11
+ waitForMessage(): this;
12
+ thenReply(response: string | Buffer): Promise<R>;
13
+ }
14
+ export interface HandlerStep {
15
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockRTCHandlerBuilder = void 0;
4
+ /**
5
+ * The builder logic for composing RTC handling behaviour for both mock peers and rules,
6
+ * by internally queuing defined actions until a `.thenX()` method is called to compile
7
+ * the actions into either a peer or a rule (handled by an abstract method).
8
+ */
9
+ class MockRTCHandlerBuilder {
10
+ constructor(buildCallback) {
11
+ this.buildCallback = buildCallback;
12
+ this.handlerSteps = [];
13
+ }
14
+ waitForMessage() {
15
+ // Handler logic not yet implemented
16
+ return this;
17
+ }
18
+ thenReply(response) {
19
+ // Handler logic not yet implemented
20
+ return this.buildCallback(this.handlerSteps);
21
+ }
22
+ }
23
+ exports.MockRTCHandlerBuilder = MockRTCHandlerBuilder;
24
+ //# sourceMappingURL=mockrtc-handler-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockrtc-handler-builder.js","sourceRoot":"","sources":["../src/mockrtc-handler-builder.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,MAAa,qBAAqB;IAI9B,YACY,aAA0D;QAA1D,kBAAa,GAAb,aAAa,CAA6C;QAH9D,iBAAY,GAAkB,EAAE,CAAC;IAItC,CAAC;IAEJ,cAAc;QACV,oCAAoC;QACpC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,QAAyB;QAC/B,oCAAoC;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;CAEJ;AAlBD,sDAkBC"}
@@ -0,0 +1,147 @@
1
+ /// <reference types="node" />
2
+ export interface MockRTCPeerOptions {
3
+ recordMessages?: boolean;
4
+ }
5
+ /**
6
+ * A MockRTC peer represents a target you can connect to, and exposes an API to create
7
+ * offers or answers to create new connections.
8
+ *
9
+ * Peers have defined behaviour, and each connection will be handled accordingly and
10
+ * independently.
11
+ *
12
+ * Peers can also optionally track all the messages and metadata across all their
13
+ * connections.
14
+ */
15
+ export interface MockRTCPeer {
16
+ readonly peerId: string;
17
+ /**
18
+ * Creates an offer for a new connection to this mock peer.
19
+ *
20
+ * Returns a set of offer parameters: the offer itself, a session to renegotiate
21
+ * the connection in future, and a setAnswer callback to call with an answer
22
+ * once you have one.
23
+ */
24
+ createOffer(options?: OfferOptions): Promise<MockRTCOfferParams>;
25
+ /**
26
+ * Takes an offer for a WebRTC connection elsewhere, and creates an answer to
27
+ * connect that to this peer.
28
+ *
29
+ * Returns a set of answer parameters: the answer itself, and a session to renegotiate
30
+ * the connection in future.
31
+ */
32
+ answerOffer(offer: RTCSessionDescriptionInit, options?: AnswerOptions): Promise<MockRTCAnswerParams>;
33
+ /**
34
+ * Creates an offer for a new external connection to this mock peer.
35
+ *
36
+ * External connections are used for proxying traffic. They do not do anything
37
+ * by default (so they ignore this peer's configured steps) but a mock connection
38
+ * can be connected to an external connection using methods like
39
+ * {@link MockRTCHandlerBuilder.thenPassThrough thenPassThrough}.
40
+ *
41
+ * Returns a set of offer parameters: an external connection id, the offer itself,
42
+ * a session to renegotiate the connection in future, and a setAnswer callback to
43
+ * call with an answer once you have one.
44
+ */
45
+ createExternalOffer(options?: OfferOptions): Promise<MockRTCExternalOfferParams>;
46
+ /**
47
+ * Takes an offer for a WebRTC connection elsewhere, and creates an answer to create
48
+ * an external connection to this peer.
49
+ *
50
+ * External connections are used for proxying traffic. They do not do anything
51
+ * by default (so they ignore this peer's configured steps) but a mock connection
52
+ * can be connected to an external connection using methods like
53
+ * {@link MockRTCHandlerBuilder.thenPassThrough thenPassThrough}.
54
+ *
55
+ * Returns a set of answer parameters: an external connection id, the answer itself,
56
+ * and a session to renegotiate the connection in future.
57
+ */
58
+ answerExternalOffer(offer: RTCSessionDescriptionInit, options?: AnswerOptions): Promise<MockRTCExternalAnswerParams>;
59
+ /**
60
+ * Takes a connection id, and returns the associated session.
61
+ *
62
+ * This is useful for advanced use cases, where keeping the session returned by other
63
+ * setup methods is inconvenient, and it's easier to keep ids and look up sessions
64
+ * on demand instead.
65
+ */
66
+ getSession(id: string): MockRTCSession;
67
+ /**
68
+ * Retrieve an array of all data channel messages that this peer has received on
69
+ * all connections.
70
+ */
71
+ getAllMessages(): Promise<Array<string | Buffer>>;
72
+ /**
73
+ * Retrieve an array of all data channel messages on a specific channel that this
74
+ * peer has received on all connections.
75
+ */
76
+ getMessagesOnChannel(channelName: string): Promise<Array<string | Buffer>>;
77
+ }
78
+ /**
79
+ * Once a connection has been created, you can access its session API. This allows
80
+ * for renegotiation of an existing session, while persisting the same connection
81
+ * and ongoing handling process.
82
+ */
83
+ export interface MockRTCSession {
84
+ /**
85
+ * For most use cases explicitly using the session ID isn't necessary.
86
+ *
87
+ * For some advanced use cases though, it's more convenient to store session ids and use
88
+ * peer.getSession, rather than using the session property from the setup methods directly.
89
+ */
90
+ readonly sessionId: string;
91
+ /**
92
+ * Create a new offer for this session, to renegotiate the existing connection.
93
+ */
94
+ createOffer(options?: OfferOptions): Promise<RTCSessionDescriptionInit>;
95
+ /**
96
+ * Provide an answer to complete an offer for this session, to renegotiate the existing connection.
97
+ */
98
+ completeOffer(answer: RTCSessionDescriptionInit): Promise<void>;
99
+ /**
100
+ * Get an answer given an offer from elsewhere, to renegotiate the existing connection.
101
+ */
102
+ answerOffer(offer: RTCSessionDescriptionInit, options?: AnswerOptions): Promise<RTCSessionDescriptionInit>;
103
+ }
104
+ export interface MockRTCOfferParams {
105
+ offer: RTCSessionDescriptionInit;
106
+ setAnswer: (answer: RTCSessionDescriptionInit) => Promise<void>;
107
+ session: MockRTCSession;
108
+ }
109
+ export interface MockRTCAnswerParams {
110
+ answer: RTCSessionDescriptionInit;
111
+ session: MockRTCSession;
112
+ }
113
+ export interface OfferOptions {
114
+ /**
115
+ * A raw SDP string that should be mirrored (best efforts) where possible to
116
+ * create an equivalent offer, including the same media with the same params.
117
+ */
118
+ mirrorSDP?: string;
119
+ /**
120
+ * When using mirrorSDP, for SDP that only defines video/audio media we will
121
+ * receive an offer with no data stream attached. This can be a problem for
122
+ * proxied connections, which need a data stream to hook up the external
123
+ * connection later. If addDataStream is set to true, a data stream will always
124
+ * be created even if not present in the mirrored SDP.
125
+ *
126
+ * This option has no effect if mirrorSDP is not set.
127
+ */
128
+ addDataStream?: boolean;
129
+ }
130
+ export interface AnswerOptions {
131
+ /**
132
+ * A raw SDP string that should be mirrored (best efforts) where possible to
133
+ * create an equivalent answer, including the same media params.
134
+ */
135
+ mirrorSDP?: string;
136
+ }
137
+ export interface MockRTCExternalOfferParams {
138
+ id: string;
139
+ offer: RTCSessionDescriptionInit;
140
+ setAnswer: (answer: RTCSessionDescriptionInit) => Promise<void>;
141
+ session: MockRTCSession;
142
+ }
143
+ export interface MockRTCExternalAnswerParams {
144
+ id: string;
145
+ answer: RTCSessionDescriptionInit;
146
+ session: MockRTCSession;
147
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /*
3
+ * SPDX-FileCopyrightText: 2022 Tim Perry <tim@httptoolkit.tech>
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=mockrtc-peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockrtc-peer.js","sourceRoot":"","sources":["../src/mockrtc-peer.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,15 @@
1
+ /// <reference types="node" />
2
+ import { PluggableAdmin } from 'mockttp';
3
+ import { MockRTCPeer, MockRTCOfferParams, MockRTCExternalOfferParams, MockRTCExternalAnswerParams, MockRTCAnswerParams } from "./mockrtc-peer";
4
+ export declare class MockRTCRemotePeer implements MockRTCPeer {
5
+ readonly peerId: string;
6
+ private adminClient;
7
+ constructor(peerId: string, adminClient: PluggableAdmin.AdminClient<{}>);
8
+ createOffer(): Promise<MockRTCOfferParams>;
9
+ createExternalOffer(): Promise<MockRTCExternalOfferParams>;
10
+ private completeOffer;
11
+ answerOffer(offer: RTCSessionDescriptionInit): Promise<MockRTCAnswerParams>;
12
+ answerExternalOffer(offer: RTCSessionDescriptionInit): Promise<MockRTCExternalAnswerParams>;
13
+ getAllMessages(): Promise<(string | Buffer)[]>;
14
+ getMessagesOnChannel(channelName: string): Promise<Array<string | Buffer>>;
15
+ }