@epicgames-ps/lib-pixelstreamingsignalling-ue5.8 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 (112) hide show
  1. package/.lintstagedrc.mjs +7 -0
  2. package/.prettierignore +0 -0
  3. package/CHANGELOG.md +21 -0
  4. package/README.md +32 -0
  5. package/dist/cjs/Logger.js +148 -0
  6. package/dist/cjs/Logger.js.map +1 -0
  7. package/dist/cjs/LoggingUtils.js +64 -0
  8. package/dist/cjs/LoggingUtils.js.map +1 -0
  9. package/dist/cjs/PlayerConnection.js +220 -0
  10. package/dist/cjs/PlayerConnection.js.map +1 -0
  11. package/dist/cjs/PlayerRegistry.js +77 -0
  12. package/dist/cjs/PlayerRegistry.js.map +1 -0
  13. package/dist/cjs/SFUConnection.js +264 -0
  14. package/dist/cjs/SFUConnection.js.map +1 -0
  15. package/dist/cjs/SignallingServer.js +149 -0
  16. package/dist/cjs/SignallingServer.js.map +1 -0
  17. package/dist/cjs/StreamerConnection.js +172 -0
  18. package/dist/cjs/StreamerConnection.js.map +1 -0
  19. package/dist/cjs/StreamerRegistry.js +149 -0
  20. package/dist/cjs/StreamerRegistry.js.map +1 -0
  21. package/dist/cjs/Utils.js +19 -0
  22. package/dist/cjs/Utils.js.map +1 -0
  23. package/dist/cjs/WebServer.js +124 -0
  24. package/dist/cjs/WebServer.js.map +1 -0
  25. package/dist/cjs/pixelstreamingsignalling.js +28 -0
  26. package/dist/cjs/pixelstreamingsignalling.js.map +1 -0
  27. package/dist/esm/Logger.js +141 -0
  28. package/dist/esm/Logger.js.map +1 -0
  29. package/dist/esm/LoggingUtils.js +58 -0
  30. package/dist/esm/LoggingUtils.js.map +1 -0
  31. package/dist/esm/PlayerConnection.js +183 -0
  32. package/dist/esm/PlayerConnection.js.map +1 -0
  33. package/dist/esm/PlayerRegistry.js +73 -0
  34. package/dist/esm/PlayerRegistry.js.map +1 -0
  35. package/dist/esm/SFUConnection.js +227 -0
  36. package/dist/esm/SFUConnection.js.map +1 -0
  37. package/dist/esm/SignallingServer.js +112 -0
  38. package/dist/esm/SignallingServer.js.map +1 -0
  39. package/dist/esm/StreamerConnection.js +135 -0
  40. package/dist/esm/StreamerConnection.js.map +1 -0
  41. package/dist/esm/StreamerRegistry.js +145 -0
  42. package/dist/esm/StreamerRegistry.js.map +1 -0
  43. package/dist/esm/Utils.js +15 -0
  44. package/dist/esm/Utils.js.map +1 -0
  45. package/dist/esm/WebServer.js +117 -0
  46. package/dist/esm/WebServer.js.map +1 -0
  47. package/dist/esm/pixelstreamingsignalling.js +12 -0
  48. package/dist/esm/pixelstreamingsignalling.js.map +1 -0
  49. package/dist/types/Logger.d.ts +20 -0
  50. package/dist/types/LoggingUtils.d.ts +44 -0
  51. package/dist/types/PlayerConnection.d.ts +66 -0
  52. package/dist/types/PlayerRegistry.d.ts +66 -0
  53. package/dist/types/SFUConnection.d.ts +85 -0
  54. package/dist/types/SignallingServer.d.ts +48 -0
  55. package/dist/types/StreamerConnection.d.ts +61 -0
  56. package/dist/types/StreamerRegistry.d.ts +96 -0
  57. package/dist/types/Utils.d.ts +8 -0
  58. package/dist/types/WebServer.d.ts +42 -0
  59. package/dist/types/pixelstreamingsignalling.d.ts +9 -0
  60. package/docs/Logger/README.md +19 -0
  61. package/docs/Logger/functions/InitLogging.md +26 -0
  62. package/docs/Logger/interfaces/IConfig.md +41 -0
  63. package/docs/Logger/variables/Logger.md +15 -0
  64. package/docs/LoggingUtils/README.md +19 -0
  65. package/docs/LoggingUtils/functions/createHandlerListener.md +42 -0
  66. package/docs/LoggingUtils/functions/logForward.md +36 -0
  67. package/docs/LoggingUtils/functions/logIncoming.md +30 -0
  68. package/docs/LoggingUtils/functions/logOutgoing.md +30 -0
  69. package/docs/LoggingUtils/interfaces/IMessageLogger.md +29 -0
  70. package/docs/LoggingUtils/interfaces/IProtoLogObj.md +57 -0
  71. package/docs/PlayerConnection/README.md +11 -0
  72. package/docs/PlayerConnection/classes/PlayerConnection.md +177 -0
  73. package/docs/PlayerRegistry/README.md +16 -0
  74. package/docs/PlayerRegistry/classes/PlayerRegistry.md +423 -0
  75. package/docs/PlayerRegistry/interfaces/IPlayer.md +86 -0
  76. package/docs/PlayerRegistry/interfaces/IPlayerInfo.md +43 -0
  77. package/docs/README.md +19 -0
  78. package/docs/SFUConnection/README.md +11 -0
  79. package/docs/SFUConnection/classes/SFUConnection.md +554 -0
  80. package/docs/SignallingServer/README.md +19 -0
  81. package/docs/SignallingServer/classes/SignallingServer.md +76 -0
  82. package/docs/SignallingServer/interfaces/IServerConfig.md +92 -0
  83. package/docs/SignallingServer/type-aliases/ProtocolConfig.md +15 -0
  84. package/docs/StreamerConnection/README.md +11 -0
  85. package/docs/StreamerConnection/classes/StreamerConnection.md +507 -0
  86. package/docs/StreamerRegistry/README.md +16 -0
  87. package/docs/StreamerRegistry/classes/StreamerRegistry.md +431 -0
  88. package/docs/StreamerRegistry/interfaces/IStreamer.md +375 -0
  89. package/docs/StreamerRegistry/interfaces/IStreamerInfo.md +51 -0
  90. package/docs/Utils/README.md +12 -0
  91. package/docs/Utils/functions/beautify.md +23 -0
  92. package/docs/Utils/functions/stringify.md +23 -0
  93. package/docs/WebServer/README.md +15 -0
  94. package/docs/WebServer/classes/WebServer.md +50 -0
  95. package/docs/WebServer/interfaces/IWebServerConfig.md +76 -0
  96. package/docs/pixelstreamingsignalling/README.md +145 -0
  97. package/eslint.config.mjs +39 -0
  98. package/package.json +58 -0
  99. package/src/Logger.ts +189 -0
  100. package/src/LoggingUtils.ts +80 -0
  101. package/src/PlayerConnection.ts +257 -0
  102. package/src/PlayerRegistry.ts +116 -0
  103. package/src/SFUConnection.ts +329 -0
  104. package/src/SignallingServer.ts +214 -0
  105. package/src/StreamerConnection.ts +194 -0
  106. package/src/StreamerRegistry.ts +252 -0
  107. package/src/Utils.ts +16 -0
  108. package/src/WebServer.ts +213 -0
  109. package/src/pixelstreamingsignalling.ts +11 -0
  110. package/tsconfig.cjs.json +8 -0
  111. package/tsconfig.esm.json +8 -0
  112. package/tsconfig.json +29 -0
@@ -0,0 +1,183 @@
1
+ import { WebSocketTransportNJS, SignallingProtocol, MessageHelpers, Messages } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.8';
2
+ import { Logger } from './Logger';
3
+ import * as LogUtils from './LoggingUtils';
4
+ /**
5
+ * A connection between the signalling server and a player connection.
6
+ * This is where messages expected to be handled by the player come in
7
+ * and where messages are sent to the player.
8
+ *
9
+ * Interesting internals:
10
+ * playerId: The unique id string of this player.
11
+ * transport: The ITransport where transport events can be subscribed to
12
+ * protocol: The SignallingProtocol where signalling messages can be
13
+ * subscribed to.
14
+ */
15
+ export class PlayerConnection {
16
+ /**
17
+ * Initializes a new connection with given and sane values. Adds listeners for the
18
+ * websocket close and error so it can react by unsubscribing and resetting itself.
19
+ * @param server - The signalling server object that spawned this player.
20
+ * @param ws - The websocket coupled to this player connection.
21
+ * @param remoteAddress - The remote address of this connection. Only used as display.
22
+ * @param request - The HTTP upgrade request that opened this connection, if available.
23
+ */
24
+ constructor(server, ws, remoteAddress, request) {
25
+ this.server = server;
26
+ this.playerId = '';
27
+ this.subscribedStreamer = null;
28
+ this.transport = new WebSocketTransportNJS(ws);
29
+ this.protocol = new SignallingProtocol(this.transport);
30
+ this.remoteAddress = remoteAddress;
31
+ this.request = request;
32
+ this.transport.on('error', this.onTransportError.bind(this));
33
+ this.transport.on('close', this.onTransportClose.bind(this));
34
+ this.streamerIdChangeListener = this.onStreamerIdChanged.bind(this);
35
+ this.streamerDisconnectedListener = this.onStreamerDisconnected.bind(this);
36
+ this.registerMessageHandlers();
37
+ }
38
+ /**
39
+ * Returns an identifier that is displayed in logs.
40
+ * @returns A string describing this connection.
41
+ */
42
+ getReadableIdentifier() {
43
+ return this.playerId;
44
+ }
45
+ /**
46
+ * Sends a signalling message to the player.
47
+ * @param message - The message to send.
48
+ */
49
+ sendMessage(message) {
50
+ LogUtils.logOutgoing(this, message);
51
+ this.protocol.sendMessage(message);
52
+ }
53
+ /**
54
+ * Returns a descriptive object for the REST API inspection operations.
55
+ * @returns An IPlayerInfo object containing viewable information about this connection.
56
+ */
57
+ getPlayerInfo() {
58
+ var _a;
59
+ return {
60
+ playerId: this.playerId,
61
+ type: 'Player',
62
+ subscribedTo: (_a = this.subscribedStreamer) === null || _a === void 0 ? void 0 : _a.streamerId,
63
+ remoteAddress: this.remoteAddress
64
+ };
65
+ }
66
+ registerMessageHandlers() {
67
+ /* eslint-disable @typescript-eslint/unbound-method */
68
+ this.protocol.on(Messages.subscribe.typeName, LogUtils.createHandlerListener(this, this.onSubscribeMessage));
69
+ this.protocol.on(Messages.unsubscribe.typeName, LogUtils.createHandlerListener(this, this.onUnsubscribeMessage));
70
+ this.protocol.on(Messages.listStreamers.typeName, LogUtils.createHandlerListener(this, this.onListStreamers));
71
+ this.protocol.on(Messages.ping.typeName, LogUtils.createHandlerListener(this, this.onPingMessage));
72
+ /* eslint-enable @typescript-eslint/unbound-method */
73
+ this.protocol.on(Messages.offer.typeName, this.sendToStreamer.bind(this));
74
+ this.protocol.on(Messages.answer.typeName, this.sendToStreamer.bind(this));
75
+ this.protocol.on(Messages.iceCandidate.typeName, this.sendToStreamer.bind(this));
76
+ this.protocol.on(Messages.dataChannelRequest.typeName, this.sendToStreamer.bind(this));
77
+ this.protocol.on(Messages.peerDataChannelsReady.typeName, this.sendToStreamer.bind(this));
78
+ this.protocol.on(Messages.layerPreference.typeName, this.sendToStreamer.bind(this));
79
+ this.protocol.on('unhandled', (message) => {
80
+ Logger.warn(`Unhandled player protocol message: ${JSON.stringify(message)}`);
81
+ });
82
+ }
83
+ sendToStreamer(message) {
84
+ if (!this.subscribedStreamer) {
85
+ Logger.warn(`Player ${this.playerId} tried to send to a streamer but they're not subscribed to any.`);
86
+ const streamerId = this.server.streamerRegistry.getFirstStreamerId();
87
+ if (!streamerId) {
88
+ Logger.error('There are no streamers to force a subscription. Disconnecting.');
89
+ this.disconnect();
90
+ return;
91
+ }
92
+ else {
93
+ Logger.warn(`Subscribing to ${streamerId}`);
94
+ this.subscribe(streamerId);
95
+ }
96
+ }
97
+ message.playerId = this.playerId;
98
+ LogUtils.logForward(this, this.subscribedStreamer, message);
99
+ this.subscribedStreamer.protocol.sendMessage(message);
100
+ }
101
+ subscribe(streamerId) {
102
+ const streamer = this.server.streamerRegistry.find(streamerId);
103
+ if (!streamer) {
104
+ Logger.error(`subscribe: Player ${this.playerId} tried to subscribe to a non-existent streamer ${streamerId}`);
105
+ const failureMessage = MessageHelpers.createMessage(Messages.subscribeFailed, {
106
+ message: `Streamer ${streamerId} does not exist.`
107
+ });
108
+ this.protocol.sendMessage(failureMessage);
109
+ return;
110
+ }
111
+ if (this.subscribedStreamer) {
112
+ Logger.warn(`subscribe: Player ${this.playerId} is resubscribing to a streamer but is already subscribed to ${this.subscribedStreamer.streamerId}`);
113
+ this.unsubscribe();
114
+ }
115
+ if (streamer.maxSubscribers > 0 && streamer.subscribers.size >= streamer.maxSubscribers) {
116
+ Logger.error(`subscribe: Player ${this.playerId} could not subscribe to ${streamerId}. Max players (${streamer.maxSubscribers}) reached.`);
117
+ const failureMessage = MessageHelpers.createMessage(Messages.subscribeFailed, {
118
+ message: `Streamer ${streamerId} is full. Max players = ${streamer.maxSubscribers}.`
119
+ });
120
+ this.protocol.sendMessage(failureMessage);
121
+ return;
122
+ }
123
+ this.subscribedStreamer = streamer;
124
+ this.subscribedStreamer.subscribers.add(this.playerId);
125
+ this.subscribedStreamer.on('id_changed', this.streamerIdChangeListener);
126
+ this.subscribedStreamer.on('disconnect', this.streamerDisconnectedListener);
127
+ const connectedMessage = MessageHelpers.createMessage(Messages.playerConnected, {
128
+ playerId: this.playerId,
129
+ dataChannel: true,
130
+ sfu: false
131
+ });
132
+ this.sendToStreamer(connectedMessage);
133
+ }
134
+ unsubscribe() {
135
+ if (!this.subscribedStreamer) {
136
+ return;
137
+ }
138
+ this.subscribedStreamer.subscribers.delete(this.playerId);
139
+ const disconnectedMessage = MessageHelpers.createMessage(Messages.playerDisconnected, {
140
+ playerId: this.playerId
141
+ });
142
+ this.sendToStreamer(disconnectedMessage);
143
+ this.subscribedStreamer.off('id_changed', this.streamerIdChangeListener);
144
+ this.subscribedStreamer.off('disconnect', this.streamerDisconnectedListener);
145
+ this.subscribedStreamer = null;
146
+ }
147
+ disconnect() {
148
+ this.unsubscribe();
149
+ this.protocol.disconnect();
150
+ }
151
+ onStreamerDisconnected() {
152
+ this.disconnect();
153
+ }
154
+ onTransportError(error) {
155
+ Logger.error(`Player (${this.playerId}) transport error ${error.message}`);
156
+ }
157
+ onTransportClose(_event) {
158
+ Logger.debug('PlayerConnection transport close.');
159
+ this.disconnect();
160
+ }
161
+ onSubscribeMessage(message) {
162
+ this.subscribe(message.streamerId);
163
+ }
164
+ onUnsubscribeMessage(_message) {
165
+ this.unsubscribe();
166
+ }
167
+ onListStreamers(_message) {
168
+ const listMessage = MessageHelpers.createMessage(Messages.streamerList, {
169
+ ids: this.server.streamerRegistry.streamers
170
+ .filter((streamer) => streamer.streaming)
171
+ .map((streamer) => streamer.streamerId)
172
+ });
173
+ this.sendMessage(listMessage);
174
+ }
175
+ onStreamerIdChanged(newId) {
176
+ const renameMessage = MessageHelpers.createMessage(Messages.streamerIdChanged, { newID: newId });
177
+ this.sendMessage(renameMessage);
178
+ }
179
+ onPingMessage(message) {
180
+ this.sendMessage(MessageHelpers.createMessage(Messages.pong, { time: message.time }));
181
+ }
182
+ }
183
+ //# sourceMappingURL=PlayerConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerConnection.js","sourceRoot":"","sources":["../../src/PlayerConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { EventEmitter } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.8';
2
+ import { Logger } from './Logger';
3
+ /**
4
+ * Handles all the player connections of a signalling server and
5
+ * can be used to lookup connections by id etc.
6
+ * Fires events when players are added or removed.
7
+ * Events:
8
+ * 'added': (playerId: string) Player was added.
9
+ * 'removed': (playerId: string) Player was removed.
10
+ */
11
+ export class PlayerRegistry extends EventEmitter {
12
+ constructor() {
13
+ super();
14
+ this.players = new Map();
15
+ this.players = new Map();
16
+ this.nextPlayerId = 0;
17
+ }
18
+ /**
19
+ * Assigns a unique id to the player and adds it to the registry
20
+ */
21
+ add(player) {
22
+ player.playerId = this.getUniquePlayerId();
23
+ this.players.set(player.playerId, player);
24
+ this.emit('added', player.playerId);
25
+ Logger.info(`Registered new player: ${player.playerId}`);
26
+ }
27
+ /**
28
+ * Removes a player from the registry. Does nothing if the id
29
+ * does not exist.
30
+ */
31
+ remove(player) {
32
+ if (!this.players.has(player.playerId)) {
33
+ return;
34
+ }
35
+ this.emit('removed', player.playerId);
36
+ this.players.delete(player.playerId);
37
+ Logger.info(`Unregistered player: ${player.playerId}`);
38
+ }
39
+ /**
40
+ * Tests if a player id exists in the registry.
41
+ */
42
+ has(playerId) {
43
+ return this.players.has(playerId);
44
+ }
45
+ /**
46
+ * Gets a player from the registry using the player id.
47
+ * Returns undefined if the player doesn't exist.
48
+ */
49
+ get(playerId) {
50
+ return this.players.get(playerId);
51
+ }
52
+ listPlayers() {
53
+ return Array.from(this.players.values());
54
+ }
55
+ /**
56
+ * Returns true when the registry is empty.
57
+ */
58
+ empty() {
59
+ return this.players.size === 0;
60
+ }
61
+ /**
62
+ * Gets the total number of connected players.
63
+ */
64
+ count() {
65
+ return this.players.size;
66
+ }
67
+ getUniquePlayerId() {
68
+ const newPlayerId = `Player${this.nextPlayerId}`;
69
+ this.nextPlayerId++;
70
+ return newPlayerId;
71
+ }
72
+ }
73
+ //# sourceMappingURL=PlayerRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerRegistry.js","sourceRoot":"","sources":["../../src/PlayerRegistry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmC,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAC7G,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA+BlC;;;;;;;GAOG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAI5C;QACI,KAAK,EAAE,CAAC;QAJJ,YAAO,GAAyB,IAAI,GAAG,EAAE,CAAC;QAK9C,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,MAAe;QACf,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAAe;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAErC,MAAM,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,QAAgB;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,QAAgB;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,WAAW;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;IAEO,iBAAiB;QACrB,MAAM,WAAW,GAAG,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
@@ -0,0 +1,227 @@
1
+ import { WebSocketTransportNJS, SignallingProtocol, MessageHelpers, Messages, EventEmitter } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.8';
2
+ import { Logger } from './Logger';
3
+ import * as LogUtils from './LoggingUtils';
4
+ /**
5
+ * A SFU connection to the signalling server.
6
+ * An SFU can act as both a streamer and a player. It can subscribe to
7
+ * streamers like a player, and other players can subscribe to the sfu.
8
+ * Therefore the SFU will have a streamer id and a player id and be
9
+ * registered in both streamer registries and player registries.
10
+ *
11
+ * Interesting internals:
12
+ * playerId: The player id of this connectiom.
13
+ * streamerId: The streamer id of this connection.
14
+ * transport: The ITransport where transport events can be subscribed to
15
+ * protocol: The SignallingProtocol where signalling messages can be
16
+ * subscribed to.
17
+ * streaming: True when the streamer is ready to accept subscriptions.
18
+ */
19
+ export class SFUConnection extends EventEmitter {
20
+ /**
21
+ * Construct a new SFU connection.
22
+ * @param server - The signalling server object that spawned this sfu.
23
+ * @param ws - The websocket coupled to this sfu connection.
24
+ * @param remoteAddress - The remote address of this connection. Only used as display.
25
+ * @param request - The HTTP upgrade request that opened this connection, if available.
26
+ */
27
+ constructor(server, ws, remoteAddress, request) {
28
+ super();
29
+ this.server = server;
30
+ this.transport = new WebSocketTransportNJS(ws);
31
+ this.protocol = new SignallingProtocol(this.transport);
32
+ this.playerId = '';
33
+ this.streamerId = '';
34
+ this.streaming = false;
35
+ this.remoteAddress = remoteAddress;
36
+ this.request = request;
37
+ this.subscribedStreamer = null;
38
+ this.maxSubscribers = 0;
39
+ this.subscribers = new Set();
40
+ this.transport.on('error', this.onTransportError.bind(this));
41
+ this.transport.on('close', this.onTransportClose.bind(this));
42
+ this.layerPreferenceListener = this.onLayerPreference.bind(this);
43
+ this.streamerIdChangeListener = this.onStreamerIdChanged.bind(this);
44
+ this.streamerDisconnectedListener = this.onStreamerDisconnected.bind(this);
45
+ this.registerMessageHandlers();
46
+ }
47
+ /**
48
+ * Returns an identifier that is displayed in logs.
49
+ * @returns A string describing this connection.
50
+ */
51
+ getReadableIdentifier() {
52
+ return `(${this.streamerId}:${this.playerId})`;
53
+ }
54
+ /**
55
+ * Sends a signalling message to the SFU.
56
+ * @param message - The message to send.
57
+ */
58
+ sendMessage(message) {
59
+ LogUtils.logOutgoing(this, message);
60
+ this.protocol.sendMessage(message);
61
+ }
62
+ /**
63
+ * Returns a descriptive object for the REST API inspection operations.
64
+ * @returns An IStreamerInfo object containing viewable information about this connection.
65
+ */
66
+ getStreamerInfo() {
67
+ return {
68
+ streamerId: this.streamerId,
69
+ type: 'SFU',
70
+ streaming: this.streaming,
71
+ remoteAddress: this.remoteAddress,
72
+ subscribers: this.server.playerRegistry
73
+ .listPlayers()
74
+ .filter((player) => player.subscribedStreamer == this)
75
+ .map((player) => player.getPlayerInfo())
76
+ };
77
+ }
78
+ /**
79
+ * Returns a descriptive object for the REST API inspection operations.
80
+ * @returns An IPlayerInfo object containing viewable information about this connection.
81
+ */
82
+ getPlayerInfo() {
83
+ var _a;
84
+ return {
85
+ playerId: this.playerId,
86
+ type: 'SFU',
87
+ remoteAddress: this.remoteAddress,
88
+ subscribedTo: (_a = this.subscribedStreamer) === null || _a === void 0 ? void 0 : _a.streamerId
89
+ };
90
+ }
91
+ registerMessageHandlers() {
92
+ /* eslint-disable @typescript-eslint/unbound-method */
93
+ this.protocol.on(Messages.subscribe.typeName, LogUtils.createHandlerListener(this, this.onSubscribeMessage));
94
+ this.protocol.on(Messages.unsubscribe.typeName, LogUtils.createHandlerListener(this, this.onUnsubscribeMessage));
95
+ this.protocol.on(Messages.listStreamers.typeName, LogUtils.createHandlerListener(this, this.onListStreamers));
96
+ this.protocol.on(Messages.endpointId.typeName, LogUtils.createHandlerListener(this, this.onEndpointId));
97
+ this.protocol.on(Messages.streamerDataChannels.typeName, LogUtils.createHandlerListener(this, this.onStreamerDataChannels));
98
+ this.protocol.on(Messages.startStreaming.typeName, LogUtils.createHandlerListener(this, this.onStartStreaming));
99
+ this.protocol.on(Messages.stopStreaming.typeName, LogUtils.createHandlerListener(this, this.onStopStreaming));
100
+ this.protocol.on(Messages.ping.typeName, LogUtils.createHandlerListener(this, this.onPingMessage));
101
+ /* eslint-enable @typescript-eslint/unbound-method */
102
+ this.protocol.on(Messages.offer.typeName, this.sendToPlayer.bind(this));
103
+ this.protocol.on(Messages.answer.typeName, this.sendToStreamer.bind(this));
104
+ this.protocol.on(Messages.peerDataChannels.typeName, this.sendToPlayer.bind(this));
105
+ }
106
+ subscribe(streamerId) {
107
+ const streamer = this.server.streamerRegistry.find(streamerId);
108
+ if (!streamer) {
109
+ Logger.error(`subscribe: SFU ${this.playerId} tried to subscribe to a non-existent streamer ${streamerId}`);
110
+ return;
111
+ }
112
+ this.subscribedStreamer = streamer;
113
+ // Register as a subscriber of the upstream streamer so it will forward signalling messages
114
+ // back to this SFU (the streamer's forwardMessage only sends to subscribed players).
115
+ this.subscribedStreamer.subscribers.add(this.playerId);
116
+ this.subscribedStreamer.on('layer_preference', this.layerPreferenceListener);
117
+ this.subscribedStreamer.on('id_changed', this.streamerIdChangeListener);
118
+ this.subscribedStreamer.on('disconnect', this.streamerDisconnectedListener);
119
+ const connectedMessage = MessageHelpers.createMessage(Messages.playerConnected, {
120
+ playerId: this.playerId,
121
+ dataChannel: true,
122
+ sfu: true
123
+ });
124
+ this.sendToStreamer(connectedMessage);
125
+ }
126
+ unsubscribe() {
127
+ if (!this.subscribedStreamer) {
128
+ return;
129
+ }
130
+ const disconnectedMessage = MessageHelpers.createMessage(Messages.playerDisconnected, {
131
+ playerId: this.playerId
132
+ });
133
+ this.sendToStreamer(disconnectedMessage);
134
+ this.subscribedStreamer.subscribers.delete(this.playerId);
135
+ this.subscribedStreamer.off('layer_preference', this.layerPreferenceListener);
136
+ this.subscribedStreamer.off('id_changed', this.streamerIdChangeListener);
137
+ this.subscribedStreamer.off('disconnect', this.streamerDisconnectedListener);
138
+ this.subscribedStreamer = null;
139
+ }
140
+ sendToStreamer(message) {
141
+ if (!this.subscribedStreamer) {
142
+ Logger.error(`SFU ${this.playerId} tried to send to a streamer but they're not subscribed to any.`);
143
+ return;
144
+ }
145
+ LogUtils.logForward(this, this.subscribedStreamer, message);
146
+ // normally we want to indicate what player this message came from
147
+ // but in some instances we might already have set this (streamerDataChannels) due to poor choices
148
+ message.playerId = message.playerId || this.playerId;
149
+ this.subscribedStreamer.protocol.sendMessage(message);
150
+ }
151
+ sendToPlayer(message) {
152
+ if (!message.playerId) {
153
+ Logger.error(`SFU ${this.streamerId} trying to send a message to a player with no playerId. Ignored.`);
154
+ return;
155
+ }
156
+ if (!this.subscribers.has(message.playerId)) {
157
+ // Only send to players subscribed to this SFU, otherwise the SFU could target any player
158
+ // on the server via the global player registry (cross-tenant signalling).
159
+ Logger.error(`SFU ${this.streamerId} tried to send a message to player ${message.playerId} which is not subscribed to it. Ignored.`);
160
+ return;
161
+ }
162
+ const player = this.server.playerRegistry.get(message.playerId);
163
+ if (player) {
164
+ delete message.playerId;
165
+ LogUtils.logForward(this, player, message);
166
+ player.protocol.sendMessage(message);
167
+ }
168
+ else {
169
+ Logger.error(`SFU attempted to forward to player ${message.playerId} which does not exist.`);
170
+ }
171
+ }
172
+ disconnect() {
173
+ this.unsubscribe();
174
+ this.protocol.disconnect();
175
+ this.emit('disconnect');
176
+ }
177
+ onLayerPreference(message) {
178
+ this.sendMessage(message);
179
+ }
180
+ onStreamerIdChanged(newId) {
181
+ const renameMessage = MessageHelpers.createMessage(Messages.streamerIdChanged, { newID: newId });
182
+ this.sendMessage(renameMessage);
183
+ }
184
+ onStreamerDisconnected() {
185
+ this.unsubscribe();
186
+ this.sendMessage(MessageHelpers.createMessage(Messages.streamerDisconnected));
187
+ this.streaming = false;
188
+ this.emit('disconnect');
189
+ }
190
+ onTransportError(error) {
191
+ Logger.error(`SFU (${this.playerId}) transport error ${error.message}`);
192
+ }
193
+ onTransportClose(_event) {
194
+ Logger.debug('SFUConnection transport close.');
195
+ this.disconnect();
196
+ }
197
+ onSubscribeMessage(message) {
198
+ this.subscribe(message.streamerId);
199
+ }
200
+ onUnsubscribeMessage(_message) {
201
+ this.unsubscribe();
202
+ }
203
+ onListStreamers(_message) {
204
+ const listMessage = MessageHelpers.createMessage(Messages.streamerList, {
205
+ ids: this.server.streamerRegistry.streamers.map((streamer) => streamer.streamerId)
206
+ });
207
+ this.sendMessage(listMessage);
208
+ }
209
+ onStreamerDataChannels(message) {
210
+ message.sfuId = this.playerId;
211
+ this.sendToStreamer(message);
212
+ }
213
+ onEndpointId(_message) {
214
+ this.streaming = true;
215
+ }
216
+ onStartStreaming(_message) {
217
+ this.streaming = true;
218
+ }
219
+ onStopStreaming(_message) {
220
+ this.streaming = false;
221
+ this.emit('disconnect');
222
+ }
223
+ onPingMessage(message) {
224
+ this.sendMessage(MessageHelpers.createMessage(Messages.pong, { time: message.time }));
225
+ }
226
+ }
227
+ //# sourceMappingURL=SFUConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SFUConnection.js","sourceRoot":"","sources":["../../src/SFUConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import * as wslib from 'ws';
2
+ import { StreamerConnection } from './StreamerConnection';
3
+ import { PlayerConnection } from './PlayerConnection';
4
+ import { SFUConnection } from './SFUConnection';
5
+ import { Logger } from './Logger';
6
+ import { StreamerRegistry } from './StreamerRegistry';
7
+ import { PlayerRegistry } from './PlayerRegistry';
8
+ import { Messages, MessageHelpers, SignallingProtocol, KeepaliveMonitor } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.8';
9
+ import { stringify } from './Utils';
10
+ /**
11
+ * The main signalling server object.
12
+ * Contains a streamer and player registry and handles setting up of websockets
13
+ * to listen for incoming connections.
14
+ */
15
+ export class SignallingServer {
16
+ /**
17
+ * Initializes the server object and sets up listening sockets for streamers
18
+ * players and optionally SFU connections.
19
+ * @param config - A collection of options for this server.
20
+ */
21
+ constructor(config) {
22
+ Logger.debug('Started SignallingServer with config: %s', stringify(config));
23
+ this.config = config;
24
+ this.streamerRegistry = new StreamerRegistry(config.authorizeStreamerId);
25
+ this.playerRegistry = new PlayerRegistry();
26
+ this.protocolConfig = {
27
+ protocolVersion: SignallingProtocol.SIGNALLING_VERSION,
28
+ peerConnectionOptions: this.config.peerOptions || {}
29
+ };
30
+ this.startTime = new Date();
31
+ if (!config.playerPort && !config.httpServer && !config.httpsServer) {
32
+ Logger.error('No player port, http server or https server supplied to SignallingServer.');
33
+ return;
34
+ }
35
+ // Streamer connections
36
+ const streamerServer = new wslib.WebSocketServer(Object.assign({ port: config.streamerPort, backlog: 1 }, config.streamerWsOptions));
37
+ streamerServer.on('connection', this.onStreamerConnected.bind(this));
38
+ Logger.info(`Listening for streamer connections on port ${config.streamerPort}`);
39
+ // Player connections
40
+ const server = config.httpsServer || config.httpServer;
41
+ const playerServer = new wslib.WebSocketServer(Object.assign({ server: server, port: server ? undefined : config.playerPort }, config.playerWsOptions));
42
+ playerServer.on('connection', this.onPlayerConnected.bind(this));
43
+ if (!config.httpServer && !config.httpsServer) {
44
+ Logger.info(`Listening for player connections on port ${config.playerPort}`);
45
+ }
46
+ // Optional SFU connections
47
+ if (config.sfuPort) {
48
+ const sfuServer = new wslib.WebSocketServer(Object.assign({ port: config.sfuPort, backlog: 1 }, config.sfuWsOptions));
49
+ sfuServer.on('connection', this.onSFUConnected.bind(this));
50
+ Logger.info(`Listening for SFU connections on port ${config.sfuPort}`);
51
+ }
52
+ }
53
+ sendConfigMessage(connection) {
54
+ // peer connection options is a general field with all optional fields;
55
+ // it doesnt play nice with mergePartial so we just add it verbatim
56
+ const message = MessageHelpers.createMessage(Messages.config, this.protocolConfig);
57
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
58
+ message.peerConnectionOptions = this.protocolConfig['peerConnectionOptions'];
59
+ connection.sendMessage(message);
60
+ }
61
+ onStreamerConnected(ws, request) {
62
+ Logger.info(`New streamer connection: %s`, request.socket.remoteAddress);
63
+ const newStreamer = new StreamerConnection(this, ws, request.socket.remoteAddress, request);
64
+ newStreamer.maxSubscribers = this.config.maxSubscribers || 0;
65
+ // add it to the registry and when the transport closes, remove it.
66
+ this.streamerRegistry.add(newStreamer);
67
+ newStreamer.transport.on('close', () => {
68
+ this.streamerRegistry.remove(newStreamer);
69
+ Logger.info(`Streamer %s (%s) disconnected.`, newStreamer.streamerId, request.socket.remoteAddress);
70
+ });
71
+ this.sendConfigMessage(newStreamer);
72
+ }
73
+ onPlayerConnected(ws, request) {
74
+ Logger.info(`New player connection: %s (%s)`, request.socket.remoteAddress, request.url);
75
+ const newPlayer = new PlayerConnection(this, ws, request.socket.remoteAddress, request);
76
+ // add it to the registry and when the transport closes, remove it
77
+ this.playerRegistry.add(newPlayer);
78
+ newPlayer.transport.on('close', () => {
79
+ this.playerRegistry.remove(newPlayer);
80
+ Logger.info(`Player %s (%s) disconnected.`, newPlayer.playerId, request.socket.remoteAddress);
81
+ });
82
+ // Optionally monitor the player connection for liveness. A player whose socket dies without
83
+ // a clean close frame (sleeping laptop, dropped Wi-Fi, killed tab) is otherwise only removed
84
+ // once the OS TCP keepalive eventually reaps it, leaving it subscribed in the meantime. When
85
+ // maxSubscribers is set this can hold a slot that no live player is using. We use
86
+ // ws.terminate() rather than a graceful close because a dead peer never completes the close
87
+ // handshake. The monitor stops itself on transport 'close', so no manual teardown is needed.
88
+ const keepaliveTimeout = this.config.playerKeepaliveTimeout || 0;
89
+ if (keepaliveTimeout > 0) {
90
+ const keepalive = new KeepaliveMonitor(newPlayer.protocol, keepaliveTimeout);
91
+ keepalive.onTimeout = () => {
92
+ Logger.info(`Player %s (%s) failed keepalive - terminating dead connection.`, newPlayer.playerId, request.socket.remoteAddress);
93
+ ws.terminate();
94
+ };
95
+ }
96
+ this.sendConfigMessage(newPlayer);
97
+ }
98
+ onSFUConnected(ws, request) {
99
+ Logger.info(`New SFU connection: %s`, request.socket.remoteAddress);
100
+ const newSFU = new SFUConnection(this, ws, request.socket.remoteAddress, request);
101
+ // SFU acts as both a streamer and player
102
+ this.streamerRegistry.add(newSFU);
103
+ this.playerRegistry.add(newSFU);
104
+ newSFU.transport.on('close', () => {
105
+ this.streamerRegistry.remove(newSFU);
106
+ this.playerRegistry.remove(newSFU);
107
+ Logger.info(`SFU %s (%s) disconnected.`, newSFU.streamerId, request.socket.remoteAddress);
108
+ });
109
+ this.sendConfigMessage(newSFU);
110
+ }
111
+ }
112
+ //# sourceMappingURL=SignallingServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignallingServer.js","sourceRoot":"","sources":["../../src/SignallingServer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAwB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACH,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EACnB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAoDpC;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAOzB;;;;OAIG;IACH,YAAY,MAAqB;QAC7B,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG;YAClB,eAAe,EAAE,kBAAkB,CAAC,kBAAkB;YACtD,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE;SACvD,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;YAC1F,OAAO;QACX,CAAC;QAED,uBAAuB;QACvB,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,eAAe,iBAC5C,IAAI,EAAE,MAAM,CAAC,YAAY,EACzB,OAAO,EAAE,CAAC,IACP,MAAM,CAAC,iBAAiB,EAC7B,CAAC;QACH,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,8CAA8C,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAEjF,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC;QACvD,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,eAAe,iBAC1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IACzC,MAAM,CAAC,eAAe,EAC3B,CAAC;QACH,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,2BAA2B;QAC3B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,eAAe,iBACvC,IAAI,EAAE,MAAM,CAAC,OAAO,EACpB,OAAO,EAAE,CAAC,IACP,MAAM,CAAC,YAAY,EACxB,CAAC;YACH,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,yCAAyC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,UAAuD;QAC7E,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,OAAO,GAAoB,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACpG,mEAAmE;QACnE,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QAC7E,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAEO,mBAAmB,CAAC,EAAmB,EAAE,OAA6B;QAC1E,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC5F,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;QAE7D,mEAAmE;QACnE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CACP,gCAAgC,EAChC,WAAW,CAAC,UAAU,EACtB,OAAO,CAAC,MAAM,CAAC,aAAa,CAC/B,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAEO,iBAAiB,CAAC,EAAmB,EAAE,OAA6B;QACxE,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzF,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAExF,kEAAkE;QAClE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACjC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;QAEH,4FAA4F;QAC5F,6FAA6F;QAC7F,6FAA6F;QAC7F,kFAAkF;QAClF,4FAA4F;QAC5F,6FAA6F;QAC7F,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,IAAI,CAAC,CAAC;QACjE,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC7E,SAAS,CAAC,SAAS,GAAG,GAAG,EAAE;gBACvB,MAAM,CAAC,IAAI,CACP,gEAAgE,EAChE,SAAS,CAAC,QAAQ,EAClB,OAAO,CAAC,MAAM,CAAC,aAAa,CAC/B,CAAC;gBACF,EAAE,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC,CAAC;QACN,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAEO,cAAc,CAAC,EAAmB,EAAE,OAA6B;QACrE,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAElF,yCAAyC;QACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC9B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACJ"}