@4players/odin-plugin-web 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (95) hide show
  1. package/lib/common/msgpack.d.ts +2 -0
  2. package/lib/common/msgpack.js +117 -0
  3. package/{backend/lib → lib/plugin}/config.d.ts +5 -4
  4. package/lib/plugin/config.js +22 -0
  5. package/{backend/lib → lib/plugin}/connectionPool.d.ts +3 -3
  6. package/{backend/lib → lib/plugin}/connectionPool.js +32 -13
  7. package/lib/plugin/deviceManager.d.ts +12 -0
  8. package/lib/plugin/deviceManager.js +120 -0
  9. package/lib/plugin/h3/mainConnection.d.ts +31 -0
  10. package/lib/plugin/h3/mainConnection.js +195 -0
  11. package/{backend/lib → lib/plugin}/index.d.ts +30 -13
  12. package/lib/plugin/index.js +404 -0
  13. package/lib/plugin/mainConnection.d.ts +30 -0
  14. package/lib/plugin/mainConnection.js +21 -0
  15. package/{backend/lib/audioController.d.ts → lib/plugin/mediaController.d.ts} +12 -48
  16. package/lib/plugin/mediaController.js +215 -0
  17. package/lib/plugin/medias/audio-capture.d.ts +30 -0
  18. package/lib/plugin/medias/audio-capture.js +224 -0
  19. package/lib/plugin/medias/audio-playback.d.ts +13 -0
  20. package/lib/plugin/medias/audio-playback.js +40 -0
  21. package/lib/plugin/medias/video-capture.d.ts +15 -0
  22. package/lib/plugin/medias/video-capture.js +69 -0
  23. package/lib/plugin/medias/video-playback.d.ts +13 -0
  24. package/lib/plugin/medias/video-playback.js +20 -0
  25. package/{backend/lib → lib/plugin}/roomConnection.d.ts +9 -6
  26. package/{backend/lib → lib/plugin}/roomConnection.js +74 -53
  27. package/lib/plugin/rpcConnection.d.ts +57 -0
  28. package/{backend/lib → lib/plugin}/rpcConnection.js +129 -83
  29. package/lib/plugin/token.d.ts +13 -0
  30. package/{backend/lib → lib/plugin}/token.js +8 -9
  31. package/lib/plugin/webrtc/mainConnection.d.ts +53 -0
  32. package/lib/plugin/webrtc/mainConnection.js +455 -0
  33. package/lib/plugin/webrtc/websocket.d.ts +3 -0
  34. package/lib/plugin/webrtc/websocket.js +56 -0
  35. package/lib/worker/buffers.d.ts +42 -0
  36. package/lib/worker/buffers.js +79 -0
  37. package/{worker/lib/index.d.ts → lib/worker/common.d.ts} +7 -8
  38. package/lib/worker/common.js +7 -0
  39. package/lib/worker/config.d.ts +8 -0
  40. package/lib/worker/config.js +11 -0
  41. package/lib/worker/index.d.ts +3 -0
  42. package/lib/worker/index.js +1 -0
  43. package/lib/worker/memory.d.ts +9 -0
  44. package/lib/worker/memory.js +29 -0
  45. package/lib/worker/messages.d.ts +14 -0
  46. package/lib/worker/messages.js +15 -0
  47. package/lib/worker/packet.d.ts +11 -0
  48. package/lib/worker/packet.js +59 -0
  49. package/lib/worker/shared/capture.d.ts +27 -0
  50. package/lib/worker/shared/capture.js +63 -0
  51. package/lib/worker/shared/index.d.ts +3 -0
  52. package/lib/worker/shared/index.js +147 -0
  53. package/lib/worker/shared/messages.d.ts +67 -0
  54. package/lib/worker/shared/messages.js +64 -0
  55. package/lib/worker/shared/playback.d.ts +20 -0
  56. package/lib/worker/shared/playback.js +78 -0
  57. package/lib/worker/unshared/capture.d.ts +27 -0
  58. package/lib/worker/unshared/capture.js +66 -0
  59. package/lib/worker/unshared/index.d.ts +3 -0
  60. package/lib/worker/unshared/index.js +170 -0
  61. package/{worker/lib → lib/worker/unshared}/messages.d.ts +3 -15
  62. package/lib/worker/unshared/messages.js +80 -0
  63. package/lib/worker/unshared/playback.d.ts +22 -0
  64. package/lib/worker/unshared/playback.js +83 -0
  65. package/package.json +29 -26
  66. package/backend/lib/audioController.d.ts.map +0 -1
  67. package/backend/lib/audioController.js +0 -442
  68. package/backend/lib/audioController.js.map +0 -1
  69. package/backend/lib/config.d.ts.map +0 -1
  70. package/backend/lib/config.js +0 -11
  71. package/backend/lib/config.js.map +0 -1
  72. package/backend/lib/connectionPool.d.ts.map +0 -1
  73. package/backend/lib/connectionPool.js.map +0 -1
  74. package/backend/lib/index.d.ts.map +0 -1
  75. package/backend/lib/index.js +0 -293
  76. package/backend/lib/index.js.map +0 -1
  77. package/backend/lib/mainConnection.d.ts +0 -40
  78. package/backend/lib/mainConnection.d.ts.map +0 -1
  79. package/backend/lib/mainConnection.js +0 -294
  80. package/backend/lib/mainConnection.js.map +0 -1
  81. package/backend/lib/roomConnection.d.ts.map +0 -1
  82. package/backend/lib/roomConnection.js.map +0 -1
  83. package/backend/lib/rpcConnection.d.ts +0 -49
  84. package/backend/lib/rpcConnection.d.ts.map +0 -1
  85. package/backend/lib/rpcConnection.js.map +0 -1
  86. package/backend/lib/token.d.ts +0 -16
  87. package/backend/lib/token.d.ts.map +0 -1
  88. package/backend/lib/token.js.map +0 -1
  89. package/backend/package.json +0 -13
  90. package/wasm/lib/index.js +0 -19
  91. package/wasm/package.json +0 -14
  92. package/worker/lib/common.d.ts +0 -27
  93. package/worker/lib/index.js +0 -2
  94. package/worker/package.json +0 -13
  95. /package/{wasm/lib → lib/wasm}/index.d.ts +0 -0
@@ -1,293 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { ConnectionPool } from './connectionPool';
11
- import { RoomConnection } from './roomConnection';
12
- import { assert, unwrap, parseRpcMessage, RoomNotificationsRpc, } from '@4players/odin-common';
13
- import { Token } from './token';
14
- import { AudioCapture, AudioContextCollection, AudioController, AudioPlayback, } from './audioController';
15
- import * as uuid from 'uuid';
16
- export class WebPlugin {
17
- get playbackVolume() {
18
- return this._PlaybackVolume;
19
- }
20
- static create(audioContextFactory) {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- // eslint-disable-next-line prefer-const
23
- let audioController;
24
- const pool = new ConnectionPool((connectionId, packet) => audioController.receivePacket(connectionId, packet));
25
- const audioContexts = new AudioContextCollection(audioContextFactory);
26
- audioController = new AudioController(audioContexts, pool.sendDatagram.bind(pool));
27
- return new WebPlugin(pool, audioController);
28
- });
29
- }
30
- constructor(connectionPool, audioController) {
31
- this.version = '1';
32
- this._NextRoomId = 0;
33
- this._PlaybackVolume = 1;
34
- this._ConnectionPool = connectionPool;
35
- this._AudioController = audioController;
36
- }
37
- joinRoom(parameters) {
38
- return new Room(this._NextRoomId++, this._ConnectionPool, parameters);
39
- }
40
- createAudioPlayback(parameters) {
41
- return __awaiter(this, void 0, void 0, function* () {
42
- return this._AudioController.createAudioPlayback(parameters);
43
- });
44
- }
45
- createAudioCapture(parameters) {
46
- return __awaiter(this, void 0, void 0, function* () {
47
- return this._AudioController.createAudioCapture(parameters);
48
- });
49
- }
50
- enumerateDevices() {
51
- return this._AudioController.enumerateDevices();
52
- }
53
- setOutputVolume(volume) {
54
- this._AudioController.playbackSetGlobalVolume(volume);
55
- }
56
- setOutputDevice(device) {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- yield this._AudioController.playbackSetDevice(device.device);
59
- });
60
- }
61
- close() {
62
- this._AudioController.close();
63
- this._ConnectionPool.close();
64
- }
65
- }
66
- export class Room {
67
- get mainConnection() {
68
- return this._Connection.mainConnection;
69
- }
70
- constructor(id, connectionPool, parameters) {
71
- var _a, _b, _c;
72
- this._Captures = new Map();
73
- this._Playbacks = new Map();
74
- this._Peers = new Map();
75
- this._AvailableMediaIds = [];
76
- const { gateway, onEvent } = parameters;
77
- const token = unwrap(Token.parse(parameters.token));
78
- const roomId = (_a = parameters.roomId) !== null && _a !== void 0 ? _a : token.defaultRoomId;
79
- const userData = (_b = parameters.userData) !== null && _b !== void 0 ? _b : new Uint8Array(0);
80
- const position = (_c = parameters.position) !== null && _c !== void 0 ? _c : [0, 0, 0];
81
- assert(roomId !== undefined, 'room id required for multi-room-tokens');
82
- this._Id = id;
83
- this._OnEvent = onEvent;
84
- this._Connection = new RoomConnection(connectionPool, this._HandleEvent.bind(this), gateway ? new URL(gateway) : undefined, token, roomId, userData, position);
85
- }
86
- request(method, properties) {
87
- return this._Connection.request(method, properties);
88
- }
89
- link(media) {
90
- var _a;
91
- if (media instanceof AudioPlayback) {
92
- const entry = (_a = this._Playbacks.get(media.uid)) !== null && _a !== void 0 ? _a : {
93
- media: undefined,
94
- playback: undefined,
95
- };
96
- if (entry.playback !== undefined) {
97
- this.unlink(entry.playback);
98
- }
99
- if (entry.media !== undefined) {
100
- media.start(entry.media);
101
- }
102
- entry.playback = media;
103
- this._Playbacks.set(media.uid, entry);
104
- }
105
- else if (media instanceof AudioCapture) {
106
- let entry = this._Captures.get(media);
107
- if (entry) {
108
- this.unlink(media);
109
- }
110
- const mediaId = this.mainConnection !== undefined && this._AvailableMediaIds.shift();
111
- entry = {
112
- media: mediaId
113
- ? {
114
- connectionId: this.mainConnection.id,
115
- mediaId,
116
- }
117
- : undefined,
118
- uid: uuid.v4(),
119
- };
120
- this._Captures.set(media, entry);
121
- if (entry.media !== undefined) {
122
- media.start(this._Connection, entry.media, entry.uid);
123
- }
124
- }
125
- else {
126
- throw new Error('invalid media');
127
- }
128
- }
129
- unlink(media) {
130
- if (media instanceof AudioPlayback) {
131
- const entry = this._Playbacks.get(media.uid);
132
- if ((entry === null || entry === void 0 ? void 0 : entry.playback) !== media)
133
- return;
134
- entry.playback = undefined;
135
- if (entry.media !== undefined) {
136
- media.stop(entry.media);
137
- }
138
- this._Playbacks.set(media.uid, entry);
139
- }
140
- else if (media instanceof AudioCapture) {
141
- const entry = this._Captures.get(media);
142
- if (entry === undefined)
143
- return;
144
- if (entry.media !== undefined) {
145
- media.stop(this._Connection, entry.media);
146
- this._AvailableMediaIds.push(entry.media.mediaId);
147
- }
148
- this._Captures.delete(media);
149
- }
150
- else {
151
- throw new Error('invalid media');
152
- }
153
- }
154
- close() {
155
- this._Connection.close();
156
- }
157
- _HandleEvent(method, properties) {
158
- const rpc = parseRpcMessage(RoomNotificationsRpc, {
159
- name: method,
160
- properties,
161
- });
162
- if (rpc !== undefined) {
163
- this._HandleKnownEvent(rpc);
164
- properties = rpc.properties;
165
- }
166
- console.log(`handle event ${method} ${this._OnEvent !== undefined}`);
167
- this._OnEvent(method, properties);
168
- }
169
- _HandleKnownEvent(event) {
170
- switch (event.name) {
171
- case 'RoomStatusChanged':
172
- if (event.properties.status !== 'Joined') {
173
- this._HandleConnectionLost();
174
- }
175
- break;
176
- case 'RoomUpdated':
177
- for (const update of event.properties.updates) {
178
- this._HandleRoomUpdate(update);
179
- }
180
- break;
181
- case 'PeerUpdated':
182
- this._HandlePeerUpdate(event.properties);
183
- break;
184
- }
185
- }
186
- _HandleConnectionLost() {
187
- for (const peerId of this._Peers.keys()) {
188
- this._HandlePeerLeft(peerId);
189
- }
190
- for (const [capture, entry] of this._Captures) {
191
- if (entry.media === undefined)
192
- continue;
193
- capture.stop(this._Connection, entry.media);
194
- entry.media = undefined;
195
- }
196
- this._AvailableMediaIds.length = 0;
197
- }
198
- _HandleRoomUpdate(update) {
199
- if (update.kind === 'Joined') {
200
- assert(this._AvailableMediaIds.length === 0, 'left over media ids');
201
- this._AvailableMediaIds.push(...update.media_ids);
202
- this._HandleRoomJoined();
203
- for (const peer of update.room.peers) {
204
- this._HandlePeerJoined(peer);
205
- }
206
- }
207
- else if (update.kind === 'PeerJoined') {
208
- this._HandlePeerJoined(update.peer);
209
- }
210
- else if (update.kind === 'PeerLeft') {
211
- this._HandlePeerLeft(update.peer_id);
212
- }
213
- }
214
- _HandleRoomJoined() {
215
- for (const [capture, entry] of this._Captures) {
216
- if (this._AvailableMediaIds.length === 0 ||
217
- this.mainConnection === undefined) {
218
- continue;
219
- }
220
- entry.media = {
221
- connectionId: this.mainConnection.id,
222
- mediaId: this._AvailableMediaIds.shift(),
223
- };
224
- capture.start(this._Connection, entry.media, entry.uid);
225
- }
226
- }
227
- _HandlePeerUpdate(update) {
228
- if (update.kind === 'MediaStarted') {
229
- this._HandleMediaStart(update.peer_id, update.media);
230
- }
231
- else if (update.kind === 'MediaStopped') {
232
- this._HandleMediaStopped(update.peer_id, update.media_id);
233
- }
234
- }
235
- _HandlePeerJoined(peer) {
236
- if (!this._Peers.has(peer.id)) {
237
- this._Peers.set(peer.id, { mediaIds: new Map() });
238
- }
239
- for (const media of peer.medias) {
240
- this._HandleMediaStart(peer.id, media);
241
- }
242
- }
243
- _HandlePeerLeft(peerId) {
244
- const entry = this._Peers.get(peerId);
245
- if (entry === undefined)
246
- return;
247
- for (const mediaId of entry.mediaIds.keys()) {
248
- this._HandleMediaStopped(peerId, mediaId);
249
- }
250
- this._Peers.delete(peerId);
251
- }
252
- _HandleMediaStart(peerId, media) {
253
- var _a, _b;
254
- if (this.mainConnection === undefined)
255
- return;
256
- const peer = this._Peers.get(peerId);
257
- if (peer === undefined || media.properties.kind !== 'audio')
258
- return;
259
- const uid = String((_a = media.properties.uid) !== null && _a !== void 0 ? _a : uuid.v4());
260
- console.log(`uuid ${media.properties.uid} ${uid}`);
261
- media.properties.uid = uid; // feed the uid back, so it can be seen be seen down the chain.
262
- const entry = (_b = this._Playbacks.get(uid)) !== null && _b !== void 0 ? _b : {
263
- media: undefined,
264
- playback: undefined,
265
- };
266
- this._Playbacks.set(uid, entry);
267
- peer.mediaIds.set(media.id, uid);
268
- entry.media = {
269
- connectionId: this.mainConnection.id,
270
- mediaId: media.id,
271
- };
272
- if (entry.playback !== undefined) {
273
- entry.playback.start(entry.media);
274
- }
275
- }
276
- _HandleMediaStopped(peerId, mediaId) {
277
- const peer = this._Peers.get(peerId);
278
- if (peer === undefined)
279
- return;
280
- const uid = peer === null || peer === void 0 ? void 0 : peer.mediaIds.get(mediaId);
281
- if (uid === undefined)
282
- return;
283
- const entry = this._Playbacks.get(uid);
284
- if (entry === undefined)
285
- return;
286
- if (entry.media !== undefined && entry.playback !== undefined) {
287
- entry.playback.stop(entry.media);
288
- }
289
- entry.media = undefined;
290
- peer.mediaIds.delete(mediaId);
291
- }
292
- }
293
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- import { TypedRpcConnection } from './rpcConnection';
2
- import { Token } from './token';
3
- import { MainCommands, MainNotifications, Result } from '@4players/odin-common';
4
- type RpcConnection = TypedRpcConnection<MainCommands, MainNotifications>;
5
- export type DatagramHandler = (connectionId: number, datagram: Uint8Array) => void;
6
- export declare class MainConnection {
7
- readonly id: number;
8
- readonly url: URL;
9
- readonly onDatagram: DatagramHandler;
10
- readonly connection: RpcConnection;
11
- readonly webRtc: RTCPeerConnection;
12
- static create(id: number, url: URL, onDatagram: DatagramHandler, signal: AbortSignal): Promise<Result<MainConnection>>;
13
- private readonly _AudioChannel;
14
- private readonly _PeerIdMap;
15
- private _PeriodicHealthCheck;
16
- private _WebRtcIceTimeout;
17
- private _WebRtcTimeout;
18
- private _ClosePromise;
19
- get closePromise(): Promise<"closed">;
20
- get closeSignal(): AbortSignal;
21
- get closed(): boolean;
22
- webRtcReady(): Promise<boolean>;
23
- private constructor();
24
- close(): void;
25
- joinRoom(token: Token, roomId: string, userData: Uint8Array, position: [number, number, number]): Promise<Result<WebSocket> | 'closed'>;
26
- getReconnectToken(webSocket: WebSocket): Promise<Result<Token>>;
27
- sendDatagram(datagram: Uint8Array): void;
28
- healthCheck(): Promise<boolean>;
29
- private _Request;
30
- private _readEvents;
31
- private _SendOffer;
32
- private _OnWebRtcStatusChanged;
33
- private _OnWebRtcUpdate;
34
- private _UpdateRemoteSdp;
35
- private _AddIceCandidate;
36
- private _OnIceCandidate;
37
- private _CleanUp;
38
- }
39
- export {};
40
- //# sourceMappingURL=mainConnection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mainConnection.d.ts","sourceRoot":"","sources":["../src/mainConnection.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAW,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EACL,YAAY,EAEZ,iBAAiB,EAEjB,MAAM,EAKP,MAAM,uBAAuB,CAAC;AAG/B,KAAK,aAAa,GAAG,kBAAkB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAEzE,MAAM,MAAM,eAAe,GAAG,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,UAAU,KACjB,IAAI,CAAC;AAEV,qBAAa,cAAc;IAgFvB,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,GAAG,EAAE,GAAG;IACjB,QAAQ,CAAC,UAAU,EAAE,eAAe;IACpC,QAAQ,CAAC,UAAU,EAAE,aAAa;IAClC,QAAQ,CAAC,MAAM,EAAE,iBAAiB;WAnFvB,MAAM,CACjB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAsBlC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,iBAAiB,CAA4C;IACrE,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,aAAa,CAAoB;IAEzC,IAAI,YAAY,sBAEf;IAED,IAAI,WAAW,gBAEd;IAED,IAAI,MAAM,YAET;IAED,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAgC/B,OAAO;IAuCP,KAAK;IAIC,QAAQ,CACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;IAqBlC,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAYrE,YAAY,CAAC,QAAQ,EAAE,UAAU;IAM3B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YAOvB,QAAQ;YAuBR,WAAW;YAeX,UAAU;IAuBxB,OAAO,CAAC,sBAAsB;IA8B9B,OAAO,CAAC,eAAe;YAcT,gBAAgB;IAO9B,OAAO,CAAC,gBAAgB;YAmBV,eAAe;IAgB7B,OAAO,CAAC,QAAQ;CAQjB"}
@@ -1,294 +0,0 @@
1
- /* eslint-disable no-dupe-class-members */
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- import { HealthCheckTimeout, MainConnectionPingInterval, WebRTCIceTimeout as WebRtcIceTimeout, WebRTCTimeout as WebRtcTimeout, } from './config';
12
- import { TypedRpcConnection, connect } from './rpcConnection';
13
- import { Token } from './token';
14
- import { MainCommandsRpc, MainNotificationsRpc, assert, extendUrl, failure, success, } from '@4players/odin-common';
15
- export class MainConnection {
16
- static create(id, url, onDatagram, signal) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- if (signal.aborted)
19
- return failure('aborted');
20
- const webSocketUrl = extendUrl(url, 'main');
21
- if (webSocketUrl.type !== 'Success')
22
- return webSocketUrl;
23
- const webSocket = yield connect(webSocketUrl.value, signal);
24
- if (webSocket.type !== 'Success')
25
- return webSocket;
26
- const connection = new TypedRpcConnection(webSocket.value, MainCommandsRpc, MainNotificationsRpc);
27
- let webRtc;
28
- try {
29
- webRtc = new RTCPeerConnection();
30
- }
31
- catch (reason) {
32
- connection.close();
33
- return failure(`unable to create webrtc connection; ${reason}`);
34
- }
35
- return success(new MainConnection(id, url, onDatagram, connection, webRtc));
36
- });
37
- }
38
- get closePromise() {
39
- return this._ClosePromise;
40
- }
41
- get closeSignal() {
42
- return this.connection.closeSignal;
43
- }
44
- get closed() {
45
- return this.connection.closed;
46
- }
47
- webRtcReady() {
48
- const isReady = () => {
49
- switch (this.webRtc.connectionState) {
50
- case 'connected':
51
- return true;
52
- case 'failed':
53
- case 'closed':
54
- return false;
55
- default:
56
- return undefined;
57
- }
58
- };
59
- const result = isReady();
60
- if (result !== undefined)
61
- return Promise.resolve(result);
62
- return new Promise((accept) => {
63
- const onConnectionStateChanged = () => {
64
- const result = isReady();
65
- if (result !== undefined) {
66
- this.webRtc.removeEventListener('connectionstatechange', onConnectionStateChanged);
67
- accept(result);
68
- }
69
- };
70
- this.webRtc.addEventListener('connectionstatechange', onConnectionStateChanged);
71
- });
72
- }
73
- constructor(id, url, onDatagram, connection, webRtc) {
74
- this.id = id;
75
- this.url = url;
76
- this.onDatagram = onDatagram;
77
- this.connection = connection;
78
- this.webRtc = webRtc;
79
- this._PeerIdMap = new WeakMap();
80
- this.closeSignal.addEventListener('abort', () => this._CleanUp(), {
81
- once: true,
82
- });
83
- this._ClosePromise = new Promise((accept) => {
84
- this.closeSignal.addEventListener('abort', () => accept('closed'), {
85
- once: true,
86
- });
87
- });
88
- this._AudioChannel = this.webRtc.createDataChannel('audio', {
89
- id: 2,
90
- negotiated: true,
91
- ordered: false,
92
- maxRetransmits: 0,
93
- });
94
- this._AudioChannel.binaryType = 'arraybuffer';
95
- this._AudioChannel.onmessage = (event) => onDatagram(this.id, new Uint8Array(event.data));
96
- this.webRtc.onicecandidate = this._OnIceCandidate.bind(this);
97
- this.webRtc.onconnectionstatechange = () => this._OnWebRtcStatusChanged();
98
- this._SendOffer();
99
- if (MainConnectionPingInterval !== undefined) {
100
- this._PeriodicHealthCheck = setInterval(() => this.healthCheck(), MainConnectionPingInterval);
101
- }
102
- this._readEvents();
103
- }
104
- close() {
105
- this.connection.close();
106
- }
107
- joinRoom(token, roomId, userData, position) {
108
- return __awaiter(this, void 0, void 0, function* () {
109
- const response = yield this.connection.request('JoinRoom', {
110
- token: String(token),
111
- room_id: roomId,
112
- user_data: userData,
113
- position,
114
- });
115
- if (response === 'closed' || response.type === 'Failure')
116
- return response;
117
- const responseValue = response.value;
118
- if (!('token' in responseValue)) {
119
- return failure('JoinRoom responded without token');
120
- }
121
- const url = extendUrl(this.url, `room?token=${responseValue.token}`);
122
- if (url.type === 'Failure')
123
- return url;
124
- const webSocket = yield connect(url.value, this.closeSignal);
125
- if (webSocket.type === 'Success') {
126
- this._PeerIdMap.set(webSocket.value, responseValue.peer_id);
127
- }
128
- return webSocket;
129
- });
130
- }
131
- getReconnectToken(webSocket) {
132
- return __awaiter(this, void 0, void 0, function* () {
133
- const peerId = this._PeerIdMap.get(webSocket);
134
- if (peerId === undefined) {
135
- return failure('the webSocket is not part of this connection');
136
- }
137
- const response = yield this._Request('RequestReconnectToken', {
138
- peer_id: peerId,
139
- });
140
- if (response.type === 'Failure')
141
- return response;
142
- return Token.parse(response.value);
143
- });
144
- }
145
- sendDatagram(datagram) {
146
- if (this._AudioChannel.readyState === 'open') {
147
- this._AudioChannel.send(datagram);
148
- }
149
- }
150
- healthCheck() {
151
- return __awaiter(this, void 0, void 0, function* () {
152
- const response = yield this._Request('Ping', {}, HealthCheckTimeout);
153
- const success = response !== 'timeout' && response.type === 'Success';
154
- if (!success)
155
- this.close();
156
- return success;
157
- });
158
- }
159
- _Request(name, properties, timeout) {
160
- return __awaiter(this, void 0, void 0, function* () {
161
- const result = yield (timeout === undefined
162
- ? this.connection.request(name, properties)
163
- : this.connection.request(name, properties, timeout));
164
- if (result === 'closed')
165
- return failure('connection lost');
166
- return result;
167
- });
168
- }
169
- _readEvents() {
170
- return __awaiter(this, void 0, void 0, function* () {
171
- while (true) {
172
- const event = yield this.connection.recv();
173
- if (event === 'closed')
174
- break;
175
- console.debug(`${this.url} received ${event.name} on main`, event.properties);
176
- if (event.name === 'WebRtcUpdate') {
177
- this._OnWebRtcUpdate(event.properties);
178
- }
179
- }
180
- this.close();
181
- });
182
- }
183
- _SendOffer() {
184
- var _a;
185
- return __awaiter(this, void 0, void 0, function* () {
186
- let sdp;
187
- try {
188
- const offer = yield this.webRtc.createOffer();
189
- assert(offer.type === 'offer' && offer.sdp, 'generated broken webrtc offer');
190
- yield this.webRtc.setLocalDescription(offer);
191
- sdp = (_a = offer.sdp) !== null && _a !== void 0 ? _a : '';
192
- }
193
- catch (_b) {
194
- console.error('RTCPeerConnection failed creating an offer');
195
- return;
196
- }
197
- yield this._Request('WebRtcUpdate', {
198
- kind: 'Sdp',
199
- type: 'Offer',
200
- sdp,
201
- media_map: [],
202
- });
203
- });
204
- }
205
- _OnWebRtcStatusChanged() {
206
- console.log(`webrtc ${this.webRtc.connectionState}`);
207
- switch (this.webRtc.connectionState) {
208
- case 'closed':
209
- case 'failed':
210
- this.close();
211
- break;
212
- case 'connected':
213
- clearTimeout(this._WebRtcIceTimeout);
214
- this._WebRtcIceTimeout = undefined;
215
- clearTimeout(this._WebRtcTimeout);
216
- this._WebRtcTimeout = undefined;
217
- break;
218
- case 'disconnected':
219
- this.healthCheck();
220
- // falls through
221
- default:
222
- if (this._WebRtcIceTimeout === undefined) {
223
- this._WebRtcIceTimeout = setTimeout(() => {
224
- this.webRtc.restartIce();
225
- this._WebRtcIceTimeout = undefined;
226
- }, WebRtcIceTimeout);
227
- }
228
- if (this._WebRtcTimeout === undefined) {
229
- this._WebRtcTimeout = setTimeout(() => this.close(), WebRtcTimeout);
230
- }
231
- break;
232
- }
233
- }
234
- _OnWebRtcUpdate(update) {
235
- switch (update.kind) {
236
- case 'Sdp':
237
- this._UpdateRemoteSdp(update);
238
- break;
239
- case 'Trickle':
240
- this._AddIceCandidate(update);
241
- break;
242
- case 'TrickleFinished':
243
- this.webRtc.addIceCandidate(undefined);
244
- break;
245
- }
246
- }
247
- _UpdateRemoteSdp(update) {
248
- return __awaiter(this, void 0, void 0, function* () {
249
- const type = update.type === 'Answer' ? 'answer' : 'offer';
250
- yield this.webRtc.setRemoteDescription({ type, sdp: update.sdp });
251
- });
252
- }
253
- _AddIceCandidate(candidate) {
254
- var _a, _b, _c;
255
- const candidateInit = {
256
- candidate: candidate.candidate,
257
- sdpMid: (_a = candidate.spd_mid) !== null && _a !== void 0 ? _a : undefined,
258
- sdpMLineIndex: (_b = candidate.spd_mline_index) !== null && _b !== void 0 ? _b : undefined,
259
- usernameFragment: (_c = candidate.username_fragment) !== null && _c !== void 0 ? _c : undefined,
260
- };
261
- // HACK/TODO(max): find out why the server is not sending sdpMid or sdpMLineIndex
262
- if (candidateInit.sdpMid === undefined &&
263
- candidateInit.sdpMLineIndex === undefined) {
264
- candidateInit.sdpMid = '0';
265
- }
266
- this.webRtc.addIceCandidate(candidateInit);
267
- }
268
- _OnIceCandidate(event) {
269
- return __awaiter(this, void 0, void 0, function* () {
270
- if (event.candidate) {
271
- const { candidate, sdpMid, sdpMLineIndex, usernameFragment } = event.candidate;
272
- this._Request('WebRtcUpdate', {
273
- kind: 'Trickle',
274
- candidate,
275
- spd_mid: sdpMid !== null && sdpMid !== void 0 ? sdpMid : undefined,
276
- spd_mline_index: sdpMLineIndex !== null && sdpMLineIndex !== void 0 ? sdpMLineIndex : undefined,
277
- username_fragment: usernameFragment !== null && usernameFragment !== void 0 ? usernameFragment : undefined,
278
- });
279
- }
280
- else {
281
- this._Request('WebRtcUpdate', { kind: 'TrickleFinished' });
282
- }
283
- });
284
- }
285
- _CleanUp() {
286
- console.debug(`${this.url} closed`);
287
- this.connection.close();
288
- this.webRtc.close();
289
- clearInterval(this._PeriodicHealthCheck);
290
- clearTimeout(this._WebRtcIceTimeout);
291
- clearTimeout(this._WebRtcTimeout);
292
- }
293
- }
294
- //# sourceMappingURL=mainConnection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mainConnection.js","sourceRoot":"","sources":["../src/mainConnection.ts"],"names":[],"mappings":"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"}