@4players/odin-plugin-web 1.0.0-alpha.1

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 (43) hide show
  1. package/README.md +28 -0
  2. package/backend/lib/audioController.d.ts +102 -0
  3. package/backend/lib/audioController.d.ts.map +1 -0
  4. package/backend/lib/audioController.js +422 -0
  5. package/backend/lib/audioController.js.map +1 -0
  6. package/backend/lib/config.d.ts +11 -0
  7. package/backend/lib/config.d.ts.map +1 -0
  8. package/backend/lib/config.js +11 -0
  9. package/backend/lib/config.js.map +1 -0
  10. package/backend/lib/connectionPool.d.ts +17 -0
  11. package/backend/lib/connectionPool.d.ts.map +1 -0
  12. package/backend/lib/connectionPool.js +111 -0
  13. package/backend/lib/connectionPool.js.map +1 -0
  14. package/backend/lib/index.d.ts +53 -0
  15. package/backend/lib/index.d.ts.map +1 -0
  16. package/backend/lib/index.js +291 -0
  17. package/backend/lib/index.js.map +1 -0
  18. package/backend/lib/mainConnection.d.ts +40 -0
  19. package/backend/lib/mainConnection.d.ts.map +1 -0
  20. package/backend/lib/mainConnection.js +294 -0
  21. package/backend/lib/mainConnection.js.map +1 -0
  22. package/backend/lib/roomConnection.d.ts +37 -0
  23. package/backend/lib/roomConnection.d.ts.map +1 -0
  24. package/backend/lib/roomConnection.js +299 -0
  25. package/backend/lib/roomConnection.js.map +1 -0
  26. package/backend/lib/rpcConnection.d.ts +49 -0
  27. package/backend/lib/rpcConnection.d.ts.map +1 -0
  28. package/backend/lib/rpcConnection.js +235 -0
  29. package/backend/lib/rpcConnection.js.map +1 -0
  30. package/backend/lib/token.d.ts +16 -0
  31. package/backend/lib/token.d.ts.map +1 -0
  32. package/backend/lib/token.js +67 -0
  33. package/backend/lib/token.js.map +1 -0
  34. package/backend/package.json +13 -0
  35. package/package.json +48 -0
  36. package/wasm/lib/index.d.ts +97 -0
  37. package/wasm/lib/index.js +19 -0
  38. package/wasm/package.json +14 -0
  39. package/worker/lib/common.d.ts +27 -0
  40. package/worker/lib/index.d.ts +46 -0
  41. package/worker/lib/index.js +2 -0
  42. package/worker/lib/messages.d.ts +93 -0
  43. package/worker/package.json +13 -0
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+
2
+ ## Description
3
+
4
+ Eyvor is browser-based backend for the odin-sdk.
5
+
6
+ ## How to Setup
7
+
8
+ We use [asdf](https://asdf-vm.com/) to manage our toolchain.
9
+
10
+ ### Install Toolchain
11
+
12
+ ```bash
13
+ asdf plugin add nodejs
14
+ asdf plugin add emsdk
15
+ asdf install
16
+ ```
17
+
18
+ ### Build
19
+
20
+ ```
21
+ npm run build
22
+ ```
23
+
24
+ ### Test
25
+
26
+ ```
27
+ npm run test
28
+ ```
@@ -0,0 +1,102 @@
1
+ import { Backend, Strand } from '@4players/odin-common';
2
+ import { DeviceParameters } from '.';
3
+ import { CaptureSink, PlaybackId, PlaybackWorker } from '@4players/odin-plugin-web-worker';
4
+ import { RoomConnection } from './roomConnection';
5
+ export type Volume = Backend.Volume;
6
+ export type Activity = Backend.Activity;
7
+ export type CreateAudioPlaybackParameters = Backend.CreateAudioPlaybackParameters;
8
+ export type CreateAudioCaptureParameters = Backend.CreateAudioCaptureParameters & {
9
+ readonly device?: Device;
10
+ };
11
+ export type AudioContextFactory = (sampleRate: number | undefined) => Promise<AudioContext>;
12
+ export interface GlobalMediaId extends PlaybackId {
13
+ }
14
+ declare global {
15
+ interface AudioSinkOptions {
16
+ type: 'none';
17
+ }
18
+ interface AudioContext {
19
+ setSinkId?: (sinkId: string | undefined | AudioSinkOptions) => Promise<undefined>;
20
+ }
21
+ }
22
+ export declare class AudioContextCollection {
23
+ readonly audioContextFactory: AudioContextFactory;
24
+ readonly entries: Array<{
25
+ sampleRate: undefined | number;
26
+ audioContext: AudioContext;
27
+ references: number;
28
+ }>;
29
+ constructor(audioContextFactory: AudioContextFactory);
30
+ acquire(sampleRate: number | undefined): Promise<AudioContext>;
31
+ release(audioContext: BaseAudioContext): Promise<void>;
32
+ close(): void;
33
+ }
34
+ export declare class AudioController {
35
+ readonly audioContexts: AudioContextCollection;
36
+ readonly sink: CaptureSink;
37
+ playbackWorker: PlaybackWorker | undefined;
38
+ globalVolume: number;
39
+ playbacks: Map<string, {
40
+ id: GlobalMediaId | undefined;
41
+ volume: Volume;
42
+ playback: AudioPlayback;
43
+ }>;
44
+ setPlaybackStrand: Strand;
45
+ create(audioContexts: AudioContextCollection, sink: CaptureSink): Promise<AudioController>;
46
+ constructor(audioContexts: AudioContextCollection, sink: CaptureSink);
47
+ receivePacket(connectionId: number, packet: Uint8Array): void;
48
+ createAudioPlayback(parameters: CreateAudioPlaybackParameters): Promise<AudioPlayback>;
49
+ createAudioCapture(parameters: CreateAudioCaptureParameters): Promise<AudioCapture>;
50
+ enumerateDevices(): Promise<Device[]>;
51
+ playbackSetDevice(device: Device | undefined): Promise<void>;
52
+ playbackSetGlobalVolume(value: Backend.Volume): void;
53
+ playbackStart(uid: string, id: GlobalMediaId): void;
54
+ playbackStop(uid: string, id: GlobalMediaId): void;
55
+ playbackGetActivity(uid: string): Activity;
56
+ playbackSetVolume(uid: string, volume: Volume): void;
57
+ playbackGetVolume(uid: string): Volume;
58
+ closePlayback(uid: string): void;
59
+ close(): void;
60
+ }
61
+ export declare class Device implements Backend.Device {
62
+ readonly device: MediaDeviceInfo;
63
+ constructor(device: MediaDeviceInfo);
64
+ get type(): "AudioPlayback" | "AudioCapture";
65
+ get name(): string;
66
+ get isDefault(): boolean;
67
+ }
68
+ export declare class AudioPlayback implements Backend.AudioPlayback {
69
+ readonly controller: AudioController;
70
+ readonly uid: Backend.UID;
71
+ get volume(): Backend.Volume;
72
+ get activity(): Backend.Activity;
73
+ constructor(controller: AudioController, uid: Backend.UID);
74
+ start(id: GlobalMediaId): void;
75
+ stop(id: GlobalMediaId): void;
76
+ setVolume(value: Backend.Volume): void;
77
+ close(): void;
78
+ }
79
+ export declare class AudioCapture implements Backend.AudioCapture {
80
+ readonly controller: AudioController;
81
+ private _Capture;
82
+ private readonly _Medias;
83
+ private _Vad;
84
+ private _Apm;
85
+ private _Volume;
86
+ private _deviceParameters?;
87
+ get vad(): Backend.VadConfig;
88
+ get apm(): Backend.ApmConfig;
89
+ get volume(): Backend.Volume;
90
+ get activity(): import("@4players/odin-plugin-web-worker").Activity;
91
+ get speechProbability(): number;
92
+ constructor(controller: AudioController, parameters: CreateAudioCaptureParameters);
93
+ start(room: RoomConnection, media: GlobalMediaId, uid: Backend.UID): void;
94
+ stop(room: RoomConnection, media: GlobalMediaId): void;
95
+ setVad(value: Backend.VadConfig): void;
96
+ setApm(config: Backend.ApmConfig): Promise<void>;
97
+ setDevice(parameters: DeviceParameters): Promise<import("@4players/odin-common").Success<void> | undefined>;
98
+ setVolume(value: Backend.Volume): void;
99
+ close(): void;
100
+ _UpdateMedias(): Promise<void>;
101
+ }
102
+ //# sourceMappingURL=audioController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioController.d.ts","sourceRoot":"","sources":["../src/audioController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,422 @@
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 { Strand, assert, failure, sleep, success, } from '@4players/odin-common';
11
+ import { createCaptureWorker, createPlaybackWorker, silence, } from '@4players/odin-plugin-web-worker';
12
+ const defaultVad = {
13
+ voiceActivity: {
14
+ attackThreshold: 0.9,
15
+ releaseThreshold: 0.8,
16
+ },
17
+ volumeGate: {
18
+ attackThreshold: -30,
19
+ releaseThreshold: -40,
20
+ },
21
+ };
22
+ const defaultApm = {
23
+ echoCanceller: false,
24
+ highPassFilter: false,
25
+ preAmplifier: false,
26
+ captureLevelAdjustment: false,
27
+ noiseSuppression: 'None',
28
+ transientSuppressor: false,
29
+ gainController: false,
30
+ };
31
+ export class AudioContextCollection {
32
+ constructor(audioContextFactory) {
33
+ this.audioContextFactory = audioContextFactory;
34
+ this.entries = [];
35
+ }
36
+ acquire(sampleRate) {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ for (const entry of this.entries) {
39
+ if (entry.sampleRate === sampleRate) {
40
+ entry.references += 1;
41
+ return entry.audioContext;
42
+ }
43
+ else if (entry.sampleRate === undefined) {
44
+ const audioContext = entry.audioContext;
45
+ if (audioContext.sampleRate === sampleRate) {
46
+ entry.references += 1;
47
+ return entry.audioContext;
48
+ }
49
+ }
50
+ }
51
+ const entry = {
52
+ sampleRate,
53
+ audioContext: yield this.audioContextFactory(sampleRate),
54
+ references: 1,
55
+ };
56
+ this.entries.push(entry);
57
+ return entry.audioContext;
58
+ });
59
+ }
60
+ release(audioContext) {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ const index = this.entries.findIndex((entry) => entry.audioContext === audioContext);
63
+ if (index < 0)
64
+ return;
65
+ this.entries[index].references -= 1;
66
+ if (this.entries[index].references <= 0) {
67
+ const context = this.entries[index].audioContext;
68
+ this.entries.splice(index, 1);
69
+ yield context.close();
70
+ }
71
+ });
72
+ }
73
+ close() {
74
+ for (const entry of this.entries) {
75
+ entry.audioContext.close();
76
+ }
77
+ }
78
+ }
79
+ export class AudioController {
80
+ create(audioContexts, sink) {
81
+ return __awaiter(this, void 0, void 0, function* () {
82
+ return new AudioController(audioContexts, sink);
83
+ });
84
+ }
85
+ constructor(audioContexts, sink) {
86
+ this.audioContexts = audioContexts;
87
+ this.sink = sink;
88
+ this.globalVolume = 1;
89
+ this.playbacks = new Map();
90
+ this.setPlaybackStrand = new Strand();
91
+ }
92
+ receivePacket(connectionId, packet) {
93
+ var _a;
94
+ (_a = this.playbackWorker) === null || _a === void 0 ? void 0 : _a.receivePacket(connectionId, packet);
95
+ }
96
+ createAudioPlayback(parameters) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ let entry = this.playbacks.get(parameters.uid);
99
+ let volume = parameters.volume;
100
+ if (entry === undefined) {
101
+ volume = volume !== null && volume !== void 0 ? volume : 1;
102
+ const playback = new AudioPlayback(this, parameters.uid);
103
+ entry = { id: undefined, volume, playback };
104
+ this.playbacks.set(parameters.uid, entry);
105
+ }
106
+ if (volume !== undefined) {
107
+ entry.playback.setVolume(volume);
108
+ }
109
+ return entry.playback;
110
+ });
111
+ }
112
+ createAudioCapture(parameters) {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ const capture = new AudioCapture(this, parameters);
115
+ yield capture.setDevice(parameters);
116
+ return capture;
117
+ });
118
+ }
119
+ enumerateDevices() {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ const devices = yield navigator.mediaDevices.enumerateDevices();
122
+ return devices
123
+ .filter((device) => device.kind === 'audioinput' || device.kind === 'audiooutput')
124
+ .map((device) => new Device(device));
125
+ });
126
+ }
127
+ playbackSetDevice(device) {
128
+ return this.setPlaybackStrand.enqueue(() => __awaiter(this, void 0, void 0, function* () {
129
+ var _a;
130
+ const deviceId = (_a = device === null || device === void 0 ? void 0 : device.device.deviceId) !== null && _a !== void 0 ? _a : undefined;
131
+ let audioContext;
132
+ if (this.playbackWorker === undefined) {
133
+ audioContext = yield this.audioContexts.acquire(48000);
134
+ this.playbackWorker = yield createPlaybackWorker(audioContext);
135
+ this.playbackWorker.setGlobalVolume(this.globalVolume);
136
+ }
137
+ else {
138
+ audioContext = this.playbackWorker.audioContext;
139
+ }
140
+ if (audioContext.setSinkId !== undefined &&
141
+ deviceId !== 'default' &&
142
+ deviceId) {
143
+ yield audioContext.setSinkId(deviceId);
144
+ }
145
+ }));
146
+ }
147
+ playbackSetGlobalVolume(value) {
148
+ var _a;
149
+ this.globalVolume = value === 'muted' ? 0 : value;
150
+ (_a = this.playbackWorker) === null || _a === void 0 ? void 0 : _a.setGlobalVolume(this.globalVolume);
151
+ }
152
+ playbackStart(uid, id) {
153
+ var _a;
154
+ const entry = this.playbacks.get(uid);
155
+ if (entry === undefined)
156
+ return;
157
+ if (entry.id !== undefined) {
158
+ this.playbackStop(uid, entry.id);
159
+ }
160
+ entry.id = id;
161
+ (_a = this.playbackWorker) === null || _a === void 0 ? void 0 : _a.addMedias(id.connectionId, [id.mediaId]);
162
+ this.playbackSetVolume(uid, entry.volume);
163
+ }
164
+ playbackStop(uid, id) {
165
+ var _a;
166
+ const entry = this.playbacks.get(uid);
167
+ if (entry === undefined)
168
+ return;
169
+ if (entry.id !== id)
170
+ console.error('playback mediaId out of sync!');
171
+ entry.id = undefined;
172
+ (_a = this.playbackWorker) === null || _a === void 0 ? void 0 : _a.removeMedias(id.connectionId, [id.mediaId]);
173
+ }
174
+ playbackGetActivity(uid) {
175
+ var _a, _b;
176
+ const entry = this.playbacks.get(uid);
177
+ if ((entry === null || entry === void 0 ? void 0 : entry.id) === undefined)
178
+ return silence;
179
+ return (_b = (_a = this.playbackWorker) === null || _a === void 0 ? void 0 : _a.getActivity(entry.id)) !== null && _b !== void 0 ? _b : silence;
180
+ }
181
+ playbackSetVolume(uid, volume) {
182
+ var _a;
183
+ const entry = this.playbacks.get(uid);
184
+ if (entry === undefined)
185
+ return;
186
+ entry.volume = volume === 'muted' ? 0 : volume;
187
+ if (entry.id !== undefined) {
188
+ (_a = this.playbackWorker) === null || _a === void 0 ? void 0 : _a.setVolume(entry.id, entry.volume);
189
+ }
190
+ }
191
+ playbackGetVolume(uid) {
192
+ var _a;
193
+ const entry = this.playbacks.get(uid);
194
+ return (_a = entry === null || entry === void 0 ? void 0 : entry.volume) !== null && _a !== void 0 ? _a : 1;
195
+ }
196
+ closePlayback(uid) {
197
+ const entry = this.playbacks.get(uid);
198
+ if (entry === undefined)
199
+ return;
200
+ if (entry.id !== undefined)
201
+ this.playbackStop(uid, entry.id);
202
+ this.playbacks.delete(uid);
203
+ }
204
+ close() {
205
+ var _a;
206
+ (_a = this.playbackWorker) === null || _a === void 0 ? void 0 : _a.close();
207
+ this.audioContexts.close();
208
+ }
209
+ }
210
+ export class Device {
211
+ constructor(device) {
212
+ this.device = device;
213
+ }
214
+ get type() {
215
+ switch (this.device.kind) {
216
+ case 'audioinput':
217
+ return 'AudioCapture';
218
+ case 'audiooutput':
219
+ return 'AudioPlayback';
220
+ default:
221
+ assert(false, 'not supported device');
222
+ }
223
+ }
224
+ get name() {
225
+ return this.device.label;
226
+ }
227
+ get isDefault() {
228
+ return false;
229
+ }
230
+ }
231
+ export class AudioPlayback {
232
+ get volume() {
233
+ return this.controller.playbackGetVolume(this.uid);
234
+ }
235
+ get activity() {
236
+ return this.controller.playbackGetActivity(this.uid);
237
+ }
238
+ constructor(controller, uid) {
239
+ this.controller = controller;
240
+ this.uid = uid;
241
+ }
242
+ start(id) {
243
+ this.controller.playbackStart(this.uid, id);
244
+ }
245
+ stop(id) {
246
+ this.controller.playbackStop(this.uid, id);
247
+ }
248
+ setVolume(value) {
249
+ this.controller.playbackSetVolume(this.uid, value);
250
+ }
251
+ close() {
252
+ this.controller.closePlayback(this.uid);
253
+ }
254
+ }
255
+ export class AudioCapture {
256
+ get vad() {
257
+ return this._Vad;
258
+ }
259
+ get apm() {
260
+ return this._Apm;
261
+ }
262
+ get volume() {
263
+ return this._Volume;
264
+ }
265
+ get activity() {
266
+ var _a, _b;
267
+ return (_b = (_a = this._Capture) === null || _a === void 0 ? void 0 : _a.worker.activity) !== null && _b !== void 0 ? _b : silence;
268
+ }
269
+ get speechProbability() {
270
+ var _a, _b;
271
+ return (_b = (_a = this._Capture) === null || _a === void 0 ? void 0 : _a.worker.speechProbability) !== null && _b !== void 0 ? _b : 0;
272
+ }
273
+ constructor(controller, parameters) {
274
+ this.controller = controller;
275
+ this._Medias = new Map();
276
+ this._Vad = defaultVad;
277
+ this._Apm = defaultApm;
278
+ this._Volume = 1;
279
+ if (parameters.apm) {
280
+ this.setApm(parameters.apm);
281
+ }
282
+ if (parameters.vad) {
283
+ this.setVad(parameters.vad);
284
+ }
285
+ if (parameters.volume) {
286
+ this.setVolume(parameters.volume);
287
+ }
288
+ }
289
+ start(room, media, uid) {
290
+ var _a;
291
+ let entry = this._Medias.get(media.connectionId);
292
+ if (entry === undefined) {
293
+ this._Medias.set(media.connectionId, (entry = new Set()));
294
+ }
295
+ if (entry.has(media.mediaId))
296
+ return;
297
+ entry.add(media.mediaId);
298
+ if (((_a = room.mainConnection) === null || _a === void 0 ? void 0 : _a.id) === media.connectionId) {
299
+ room
300
+ .typedRequest('StartMedia', {
301
+ media_id: media.mediaId,
302
+ properties: { kind: 'audio', uid },
303
+ })
304
+ .catch((reason) => console.error(`StartMedia got rejected; ${reason}`));
305
+ }
306
+ this._UpdateMedias();
307
+ }
308
+ stop(room, media) {
309
+ var _a;
310
+ const entry = this._Medias.get(media.connectionId);
311
+ if (!(entry === null || entry === void 0 ? void 0 : entry.delete(media.mediaId)))
312
+ return;
313
+ if (((_a = room.mainConnection) === null || _a === void 0 ? void 0 : _a.id) === media.connectionId) {
314
+ room
315
+ .typedRequest('StopMedia', { media_id: media.mediaId })
316
+ .catch((reason) => console.error(`StopMedia got rejected; ${reason}`));
317
+ }
318
+ this._UpdateMedias();
319
+ }
320
+ setVad(value) {
321
+ this._Vad = value;
322
+ if (this._Capture) {
323
+ this._Capture.worker.setVad(value);
324
+ }
325
+ }
326
+ setApm(config) {
327
+ return __awaiter(this, void 0, void 0, function* () {
328
+ this._Apm = config;
329
+ if (this._deviceParameters) {
330
+ yield this.setDevice(this._deviceParameters);
331
+ }
332
+ });
333
+ }
334
+ setDevice(parameters) {
335
+ var _a;
336
+ return __awaiter(this, void 0, void 0, function* () {
337
+ const device = yield openCaptureDevice(this.controller, parameters, this._Apm);
338
+ if (device.type !== 'Success') {
339
+ console.error(`unable to open capture device; ${device.reason}`);
340
+ return;
341
+ }
342
+ this._deviceParameters = parameters;
343
+ if (this._Capture !== undefined) {
344
+ this._Capture.source.disconnect(this._Capture.worker.worklet);
345
+ }
346
+ if (this._Capture === undefined ||
347
+ this._Capture.worker.worklet.context !== device.value.context) {
348
+ (_a = this._Capture) === null || _a === void 0 ? void 0 : _a.worker.close();
349
+ this._Capture = {
350
+ worker: yield createCaptureWorker(device.value.context, this.controller.sink),
351
+ source: device.value,
352
+ };
353
+ yield this._UpdateMedias();
354
+ this.setVolume(this.volume);
355
+ this.setVad(this.vad);
356
+ }
357
+ else {
358
+ this._Capture.source = device.value;
359
+ }
360
+ this._Capture.source.connect(this._Capture.worker.worklet);
361
+ return success();
362
+ });
363
+ }
364
+ setVolume(value) {
365
+ this._Volume = value;
366
+ if (this._Capture) {
367
+ this._Capture.worker.setVolume(value === 'muted' ? 0 : value);
368
+ }
369
+ }
370
+ close() {
371
+ if (this._Capture !== undefined) {
372
+ this._Capture.worker.close();
373
+ this._Capture.source.disconnect(this._Capture.worker.worklet);
374
+ this.controller.audioContexts.release(this._Capture.source.context);
375
+ }
376
+ this._Capture = undefined;
377
+ }
378
+ _UpdateMedias() {
379
+ return __awaiter(this, void 0, void 0, function* () {
380
+ if (this._Capture !== undefined) {
381
+ const connections = Array.from(this._Medias).map(([key, value]) => {
382
+ return { id: key, mediaIds: Array.from(value) };
383
+ });
384
+ this._Capture.worker.setMedias(connections);
385
+ }
386
+ });
387
+ }
388
+ }
389
+ function openCaptureDevice(controller, parameters, apm) {
390
+ return __awaiter(this, void 0, void 0, function* () {
391
+ const deviceId = parameters.device
392
+ ? { exact: parameters.device.device.deviceId }
393
+ : undefined;
394
+ let stream;
395
+ try {
396
+ const result = yield Promise.race([
397
+ navigator.mediaDevices.getUserMedia({
398
+ audio: {
399
+ echoCancellation: apm.echoCanceller,
400
+ noiseSuppression: apm.noiseSuppression !== 'None',
401
+ autoGainControl: apm.gainController,
402
+ // @ts-ignore chrome fix
403
+ echoCancellationType: 'system',
404
+ // sampleRate: 48000,
405
+ deviceId,
406
+ },
407
+ }),
408
+ sleep(30000, 'timeout'),
409
+ ]);
410
+ if (result === 'timeout')
411
+ return failure('getUserMedia; timeout');
412
+ stream = result;
413
+ }
414
+ catch (reason) {
415
+ return failure(`getUserMedia; ${reason}`);
416
+ }
417
+ const sampleRate = stream.getAudioTracks()[0].getSettings().sampleRate;
418
+ const context = yield controller.audioContexts.acquire(sampleRate);
419
+ return success(context.createMediaStreamSource(stream));
420
+ });
421
+ }
422
+ //# sourceMappingURL=audioController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioController.js","sourceRoot":"","sources":["../src/audioController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const HealthCheckTimeout = 1000;
2
+ export declare const ClockJumpCheckInterval = 1000;
3
+ export declare const ClockJumpThreshold = 10000;
4
+ export declare const MainConnectionPingInterval = 10000;
5
+ export declare const WebRTCIceTimeout = 3000;
6
+ export declare const WebRTCTimeout = 10000;
7
+ export declare const ConnectTimeout = 5000;
8
+ export declare const MinTokenLifetime = 60000;
9
+ export declare const MinTokenRefreshInterval = 5000;
10
+ export declare const ConnectInterval: number[];
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,0BAA0B,QAAQ,CAAC;AAChD,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AACtC,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,eAAe,UAAsC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const HealthCheckTimeout = 1000; /* ms */
2
+ export const ClockJumpCheckInterval = 1000; /* ms */
3
+ export const ClockJumpThreshold = 10000; /* ms */
4
+ export const MainConnectionPingInterval = 10000; /* ms */
5
+ export const WebRTCIceTimeout = 3000; /* ms */
6
+ export const WebRTCTimeout = 10000; /* ms */
7
+ export const ConnectTimeout = 5000; /* ms */
8
+ export const MinTokenLifetime = 60000; /* 1min */
9
+ export const MinTokenRefreshInterval = 5000; /* 5sec */
10
+ export const ConnectInterval = [0, 100, 200, 200, 500, 1000, 2000]; /* ms */
11
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,CAAC,QAAQ;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,CAAC,QAAQ;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,QAAQ;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC,CAAC,QAAQ;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,QAAQ;AAC9C,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,QAAQ;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,QAAQ;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,UAAU;AACjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,CAAC,UAAU;AACvD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ"}
@@ -0,0 +1,17 @@
1
+ import { DatagramHandler, MainConnection } from './mainConnection';
2
+ import { Result } from '@4players/odin-common';
3
+ export declare class ConnectionPool {
4
+ readonly onDatagram: DatagramHandler;
5
+ private _LastConnectionId;
6
+ private readonly _ConnectionsByUrl;
7
+ private readonly _ConnectionsById;
8
+ private readonly _Close;
9
+ get closed(): boolean;
10
+ constructor(onDatagram: DatagramHandler);
11
+ sendDatagram(connectionId: number, packet: Uint8Array): void;
12
+ acquireConnection(url: URL, signal: AbortSignal): Promise<Result<MainConnection> | 'closed'>;
13
+ releaseConnection(connection: MainConnection): void;
14
+ checkHealth(): Promise<void>;
15
+ close(): void;
16
+ }
17
+ //# sourceMappingURL=connectionPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionPool.d.ts","sourceRoot":"","sources":["../src/connectionPool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,MAAM,EAA8B,MAAM,uBAAuB,CAAC;AAc3E,qBAAa,cAAc;IAUb,QAAQ,CAAC,UAAU,EAAE,eAAe;IAThD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyB;IAC3D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA4B;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAEhD,IAAI,MAAM,IAAI,OAAO,CAEpB;gBAEoB,UAAU,EAAE,eAAe;IA2BhD,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAO/C,iBAAiB,CACrB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC;IAsC7C,iBAAiB,CAAC,UAAU,EAAE,cAAc;IAetC,WAAW;IAQjB,KAAK;CAGN"}