@4players/odin-plugin-web 1.0.0-alpha.6 → 1.0.0-alpha.61
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/README.md +1 -1
- package/cmake/dependencies.cmake +31 -0
- package/cmake/options.cmake +53 -0
- package/esbuild.config.ts +49 -0
- package/lib/plugin/index.d.ts +45 -0
- package/lib/plugin/index.js +1 -0
- package/lib/worker/shared.js +1 -0
- package/lib/worker/unshared.js +1 -0
- package/package.json +38 -30
- package/backend/lib/audioController.d.ts +0 -102
- package/backend/lib/audioController.d.ts.map +0 -1
- package/backend/lib/audioController.js +0 -442
- package/backend/lib/audioController.js.map +0 -1
- package/backend/lib/config.d.ts +0 -11
- package/backend/lib/config.d.ts.map +0 -1
- package/backend/lib/config.js +0 -11
- package/backend/lib/config.js.map +0 -1
- package/backend/lib/connectionPool.d.ts +0 -17
- package/backend/lib/connectionPool.d.ts.map +0 -1
- package/backend/lib/connectionPool.js +0 -111
- package/backend/lib/connectionPool.js.map +0 -1
- package/backend/lib/index.d.ts +0 -53
- package/backend/lib/index.d.ts.map +0 -1
- package/backend/lib/index.js +0 -293
- package/backend/lib/index.js.map +0 -1
- package/backend/lib/mainConnection.d.ts +0 -40
- package/backend/lib/mainConnection.d.ts.map +0 -1
- package/backend/lib/mainConnection.js +0 -294
- package/backend/lib/mainConnection.js.map +0 -1
- package/backend/lib/roomConnection.d.ts +0 -37
- package/backend/lib/roomConnection.d.ts.map +0 -1
- package/backend/lib/roomConnection.js +0 -299
- package/backend/lib/roomConnection.js.map +0 -1
- package/backend/lib/rpcConnection.d.ts +0 -49
- package/backend/lib/rpcConnection.d.ts.map +0 -1
- package/backend/lib/rpcConnection.js +0 -235
- package/backend/lib/rpcConnection.js.map +0 -1
- package/backend/lib/token.d.ts +0 -16
- package/backend/lib/token.d.ts.map +0 -1
- package/backend/lib/token.js +0 -67
- package/backend/lib/token.js.map +0 -1
- package/backend/package.json +0 -16
- package/wasm/lib/index.d.ts +0 -97
- package/wasm/lib/index.js +0 -19
- package/wasm/package.json +0 -14
- package/worker/lib/common.d.ts +0 -27
- package/worker/lib/index.d.ts +0 -46
- package/worker/lib/index.js +0 -2
- package/worker/lib/messages.d.ts +0 -93
- package/worker/package.json +0 -16
|
@@ -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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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { ConnectionPool } from './connectionPool';
|
|
2
|
-
import { MainConnection } from './mainConnection';
|
|
3
|
-
import { Token } from './token';
|
|
4
|
-
import { Backend, RoomCommands, Result } from '@4players/odin-common';
|
|
5
|
-
import * as z from 'zod';
|
|
6
|
-
export declare class RoomConnection {
|
|
7
|
-
readonly connectionPool: ConnectionPool;
|
|
8
|
-
readonly onEvent: Backend.OnEvent;
|
|
9
|
-
readonly gateway: URL | undefined;
|
|
10
|
-
readonly roomId: string;
|
|
11
|
-
private _RoomConnection;
|
|
12
|
-
private _MainConnection;
|
|
13
|
-
private readonly _Close;
|
|
14
|
-
private _Token;
|
|
15
|
-
private _UserData;
|
|
16
|
-
private _Position;
|
|
17
|
-
private _LastTokenRenew;
|
|
18
|
-
private readonly _Closed;
|
|
19
|
-
get token(): Token;
|
|
20
|
-
get userData(): Uint8Array;
|
|
21
|
-
get position(): [number, number, number];
|
|
22
|
-
get closed(): boolean;
|
|
23
|
-
get mainConnection(): MainConnection | undefined;
|
|
24
|
-
constructor(connectionPool: ConnectionPool, onEvent: Backend.OnEvent, gateway: URL | undefined, token: Token, roomId: string, userData: Uint8Array, position: [number, number, number]);
|
|
25
|
-
request(name: string, properties: unknown): Promise<Result<unknown> | 'closed'>;
|
|
26
|
-
typedRequest<Name extends Extract<keyof RoomCommands, string>>(name: Name, properties: z.infer<RoomCommands[Name]['request']>): Promise<Result<z.infer<RoomCommands[Name]['response']>> | 'closed'>;
|
|
27
|
-
close(): void;
|
|
28
|
-
get renewTokenIn(): number;
|
|
29
|
-
private _Main;
|
|
30
|
-
private _ConnectToServer;
|
|
31
|
-
private _ChangeStatus;
|
|
32
|
-
private _HandleConnection;
|
|
33
|
-
private _HandleEvent;
|
|
34
|
-
private _HandleRequests;
|
|
35
|
-
private _RenewToken;
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=roomConnection.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roomConnection.d.ts","sourceRoot":"","sources":["../src/roomConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EACL,OAAO,EACP,YAAY,EAGZ,MAAM,EAQP,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAOzB,qBAAa,cAAc;aAoCP,cAAc,EAAE,cAAc;aAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;aACxB,OAAO,EAAE,GAAG,GAAG,SAAS;aAExB,MAAM,EAAE,MAAM;IAvChC,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAItB;IAEF,IAAI,KAAK,UAER;IAED,IAAI,QAAQ,eAEX;IAED,IAAI,QAAQ,6BAEX;IAED,IAAI,MAAM,YAET;IAED,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAE/C;gBAGiB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,OAAO,EAAE,GAAG,GAAG,SAAS,EACxC,KAAK,EAAE,KAAK,EACI,MAAM,EAAE,MAAM,EAC9B,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAQ9B,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;IAWhC,YAAY,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,EACjE,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,GACjD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IAWtE,KAAK;IAIL,IAAI,YAAY,IAAI,MAAM,CAKzB;YAEa,KAAK;YAkDL,gBAAgB;YAuEhB,aAAa;YAUb,iBAAiB;IA4B/B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;YA8BT,WAAW;CAc1B"}
|
|
@@ -1,299 +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 { RpcConnection } from './rpcConnection';
|
|
11
|
-
import { Token } from './token';
|
|
12
|
-
import { Selector, failure, sleep, success, RoomCommandsRpc, } from '@4players/odin-common';
|
|
13
|
-
import * as z from 'zod';
|
|
14
|
-
import { ConnectTimeout, MinTokenLifetime, MinTokenRefreshInterval, } from './config';
|
|
15
|
-
export class RoomConnection {
|
|
16
|
-
get token() {
|
|
17
|
-
return this._Token;
|
|
18
|
-
}
|
|
19
|
-
get userData() {
|
|
20
|
-
return this._UserData;
|
|
21
|
-
}
|
|
22
|
-
get position() {
|
|
23
|
-
return this._Position;
|
|
24
|
-
}
|
|
25
|
-
get closed() {
|
|
26
|
-
return this._Close.signal.aborted;
|
|
27
|
-
}
|
|
28
|
-
get mainConnection() {
|
|
29
|
-
return this._MainConnection;
|
|
30
|
-
}
|
|
31
|
-
constructor(connectionPool, onEvent, gateway, token, roomId, userData, position) {
|
|
32
|
-
this.connectionPool = connectionPool;
|
|
33
|
-
this.onEvent = onEvent;
|
|
34
|
-
this.gateway = gateway;
|
|
35
|
-
this.roomId = roomId;
|
|
36
|
-
this._Close = new AbortController();
|
|
37
|
-
this._LastTokenRenew = performance.now();
|
|
38
|
-
this._Closed = new Promise((accept) => this._Close.signal.addEventListener('abort', () => accept('closed'), {
|
|
39
|
-
once: true,
|
|
40
|
-
}));
|
|
41
|
-
this._Token = token;
|
|
42
|
-
this._UserData = userData;
|
|
43
|
-
this._Position = position;
|
|
44
|
-
this._Main().then(({ reason }) => console.debug(`room closed; ${reason}`));
|
|
45
|
-
}
|
|
46
|
-
request(name, properties) {
|
|
47
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
-
if (this._RoomConnection === undefined) {
|
|
49
|
-
return failure('currently not connected');
|
|
50
|
-
}
|
|
51
|
-
const response = yield this._RoomConnection.request(name, properties);
|
|
52
|
-
if (response !== 'closed' && response.type === 'Success') {
|
|
53
|
-
this._HandleRequests(name, properties, response.value);
|
|
54
|
-
}
|
|
55
|
-
return response;
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
typedRequest(name, properties) {
|
|
59
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
const schema = RoomCommandsRpc[name];
|
|
61
|
-
const response = yield this.request(name, properties);
|
|
62
|
-
if (response === 'closed' || response.type === 'Failure')
|
|
63
|
-
return response;
|
|
64
|
-
const parsed = schema.response.safeParse(response.value);
|
|
65
|
-
if (parsed.success)
|
|
66
|
-
return success(parsed.data);
|
|
67
|
-
else {
|
|
68
|
-
return failure(`received invalid response from ${name}; ${parsed.error}`);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
close() {
|
|
73
|
-
this._Close.abort();
|
|
74
|
-
}
|
|
75
|
-
get renewTokenIn() {
|
|
76
|
-
const earliest = this._LastTokenRenew - performance.now() + MinTokenRefreshInterval;
|
|
77
|
-
const latest = this._Token.timeLeft - MinTokenLifetime;
|
|
78
|
-
return Math.max(earliest, latest);
|
|
79
|
-
}
|
|
80
|
-
_Main() {
|
|
81
|
-
var _a;
|
|
82
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
-
let closeReason = 'unable to establish connection';
|
|
84
|
-
/// as long as we are asked to continue
|
|
85
|
-
while (this._Close.signal.aborted === false) {
|
|
86
|
-
const result = yield this._ConnectToServer();
|
|
87
|
-
if (result.type === 'Failure') {
|
|
88
|
-
closeReason = result.reason;
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
(_a = this._RoomConnection) === null || _a === void 0 ? void 0 : _a.close();
|
|
92
|
-
this._RoomConnection = undefined;
|
|
93
|
-
this._MainConnection = undefined;
|
|
94
|
-
// can the token be used to request a better token from a gateway?
|
|
95
|
-
if (this.gateway !== undefined && this._Token.hasAudience('gateway')) {
|
|
96
|
-
this._ChangeStatus('Joining', `requesting new token from ${this.gateway}`);
|
|
97
|
-
const newToken = yield contactGateway(this.gateway, this._Token, this._Close.signal);
|
|
98
|
-
if (newToken.type === 'Success') {
|
|
99
|
-
if (newToken.value !== 'rejected') {
|
|
100
|
-
// we got a better token, lets retry.
|
|
101
|
-
this._Token = newToken.value;
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
closeReason = 'invalid or expired token';
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// we failed to get a connection, should we try again?
|
|
111
|
-
if (this._Token.timeLeft <= 0) {
|
|
112
|
-
closeReason = 'unable to use expired token';
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
// slow retries down
|
|
116
|
-
yield sleep(1000);
|
|
117
|
-
}
|
|
118
|
-
this._ChangeStatus('Closed', this._Close.signal.aborted ? 'user requested' : closeReason);
|
|
119
|
-
this.close();
|
|
120
|
-
return failure(closeReason);
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
_ConnectToServer() {
|
|
124
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
-
if (!this._Token.hasAudience('sfu') || this._Token.address === undefined) {
|
|
126
|
-
return success('continue');
|
|
127
|
-
}
|
|
128
|
-
this._ChangeStatus('Joining', `connecting to ${this._Token.address}`);
|
|
129
|
-
// are we already connected to the server?
|
|
130
|
-
if (this._MainConnection === undefined ||
|
|
131
|
-
this._MainConnection.closed ||
|
|
132
|
-
this._MainConnection.url !== this._Token.address) {
|
|
133
|
-
// no? release the not fitting connection
|
|
134
|
-
if (this._MainConnection) {
|
|
135
|
-
this.connectionPool.releaseConnection(this._MainConnection);
|
|
136
|
-
}
|
|
137
|
-
// connect to the right server
|
|
138
|
-
const mainConnection = yield this.connectionPool.acquireConnection(this._Token.address, this._Close.signal);
|
|
139
|
-
if (mainConnection === 'closed')
|
|
140
|
-
return failure('connection pool closed'); // connection pool is closed
|
|
141
|
-
if (mainConnection.type === 'Failure') {
|
|
142
|
-
this._ChangeStatus('Joining', `connection failed; ${mainConnection.reason}`);
|
|
143
|
-
return success('continue');
|
|
144
|
-
}
|
|
145
|
-
this._MainConnection = mainConnection.value;
|
|
146
|
-
}
|
|
147
|
-
// join room
|
|
148
|
-
const result = yield Promise.race([
|
|
149
|
-
Promise.all([
|
|
150
|
-
this._MainConnection.joinRoom(this._Token, this.roomId, this.userData, this.position),
|
|
151
|
-
]),
|
|
152
|
-
sleep(ConnectTimeout, 'timeout'),
|
|
153
|
-
this._Closed,
|
|
154
|
-
]);
|
|
155
|
-
if (result === 'closed')
|
|
156
|
-
return failure('room connection closed'); // room connection was closed
|
|
157
|
-
if (result !== 'timeout') {
|
|
158
|
-
const [websocket] = result;
|
|
159
|
-
if (websocket === 'closed')
|
|
160
|
-
return success('continue'); // connection was lost, before joinRoom finished
|
|
161
|
-
if (websocket.type === 'Failure') {
|
|
162
|
-
// join was rejected by the server
|
|
163
|
-
return failure(`unable to join room; ${websocket.reason}`);
|
|
164
|
-
}
|
|
165
|
-
// room connection is open, make it available
|
|
166
|
-
this._RoomConnection = new RpcConnection(websocket.value);
|
|
167
|
-
this._ChangeStatus('Joined', `joined room ${this.roomId} on ${websocket.value.url}`);
|
|
168
|
-
// TODO(sven): handle this
|
|
169
|
-
// await this._MainConnection.webRtcReady()
|
|
170
|
-
// process room events
|
|
171
|
-
yield this._HandleConnection(this._MainConnection, websocket.value);
|
|
172
|
-
}
|
|
173
|
-
// try to reconnect
|
|
174
|
-
return success('continue');
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
_ChangeStatus(status, message) {
|
|
178
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
-
const properties = {
|
|
180
|
-
status,
|
|
181
|
-
message,
|
|
182
|
-
};
|
|
183
|
-
this.onEvent('RoomStatusChanged', properties);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
_HandleConnection(main, webSocket) {
|
|
187
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
-
if (this._RoomConnection === undefined)
|
|
189
|
-
return;
|
|
190
|
-
const selector = new Selector([
|
|
191
|
-
() => sleep(this.renewTokenIn, 'renewToken'),
|
|
192
|
-
() => sleep(500, 'tick'),
|
|
193
|
-
() => __awaiter(this, void 0, void 0, function* () { var _a; return yield ((_a = this._RoomConnection) === null || _a === void 0 ? void 0 : _a.recv()); }),
|
|
194
|
-
() => this._Closed,
|
|
195
|
-
() => main.closePromise,
|
|
196
|
-
]);
|
|
197
|
-
while (true) {
|
|
198
|
-
const value = yield selector.next();
|
|
199
|
-
switch (value) {
|
|
200
|
-
case undefined:
|
|
201
|
-
case 'closed':
|
|
202
|
-
webSocket.close();
|
|
203
|
-
return;
|
|
204
|
-
case 'renewToken':
|
|
205
|
-
this._RenewToken(main, webSocket);
|
|
206
|
-
break;
|
|
207
|
-
case 'tick':
|
|
208
|
-
break;
|
|
209
|
-
default:
|
|
210
|
-
this._HandleEvent(value);
|
|
211
|
-
break;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
_HandleEvent(event) {
|
|
217
|
-
this.onEvent(event.name, event.properties);
|
|
218
|
-
}
|
|
219
|
-
_HandleRequests(name, properties, response) {
|
|
220
|
-
switch (name) {
|
|
221
|
-
case 'SetPeerPosition':
|
|
222
|
-
// eslint-disable-next-line no-case-declarations
|
|
223
|
-
const setPeerPosition = RoomCommandsRpc.SetPeerPosition.request.safeParse(properties);
|
|
224
|
-
if (setPeerPosition.success) {
|
|
225
|
-
const value = setPeerPosition.data.position;
|
|
226
|
-
this._Position = value.length === 2 ? [value[0], value[1], 0] : value;
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
console.warn('unable to process SetPeerPosition command');
|
|
230
|
-
}
|
|
231
|
-
break;
|
|
232
|
-
case 'UpdatePeer':
|
|
233
|
-
// eslint-disable-next-line no-case-declarations
|
|
234
|
-
const updatePeer = RoomCommandsRpc.UpdatePeer.request.safeParse(properties);
|
|
235
|
-
if (updatePeer.success) {
|
|
236
|
-
this._UserData = updatePeer.data.user_data;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
console.warn('unable to process UpdatePeer command');
|
|
240
|
-
}
|
|
241
|
-
break;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
_RenewToken(main, webSocket) {
|
|
245
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
246
|
-
this._LastTokenRenew = performance.now();
|
|
247
|
-
if (this.token.timeLeft > MinTokenLifetime)
|
|
248
|
-
return;
|
|
249
|
-
const response = yield main.getReconnectToken(webSocket);
|
|
250
|
-
if (response.type === 'Success') {
|
|
251
|
-
if (response.value.timeLeft > this._Token.timeLeft) {
|
|
252
|
-
this._Token = response.value;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
console.warn(`${main.url} rejected reconnect token request; ${response.reason}`);
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
function contactGateway(gateway, token, signal) {
|
|
262
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
263
|
-
try {
|
|
264
|
-
const response = yield fetch(gateway, {
|
|
265
|
-
body: '{"jsonrpc":"2.0","id":1,"method":"Connect","params":{}}',
|
|
266
|
-
method: 'POST',
|
|
267
|
-
headers: {
|
|
268
|
-
'content-type': 'application/json',
|
|
269
|
-
authorization: `Bearer ${token}`,
|
|
270
|
-
},
|
|
271
|
-
signal,
|
|
272
|
-
});
|
|
273
|
-
const schema = z.union([
|
|
274
|
-
z.object({
|
|
275
|
-
result: z.object({
|
|
276
|
-
token: z.string(),
|
|
277
|
-
}),
|
|
278
|
-
}),
|
|
279
|
-
z.object({
|
|
280
|
-
error: z.object({
|
|
281
|
-
message: z.string(),
|
|
282
|
-
}),
|
|
283
|
-
}),
|
|
284
|
-
]);
|
|
285
|
-
const body = schema.parse(yield response.json());
|
|
286
|
-
if ('result' in body) {
|
|
287
|
-
return Token.parse(body.result.token);
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
console.error(`gateway rejected token; ${body.error.message}`);
|
|
291
|
-
return success('rejected');
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
catch (error) {
|
|
295
|
-
return failure(String(error));
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
//# sourceMappingURL=roomConnection.js.map
|