@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,7 @@
1
+ import baseConfig from '../.lintstagedrc.mjs'
2
+
3
+ export default {
4
+ ...baseConfig,
5
+ '*.ts': 'eslint --fix',
6
+ }
7
+
Binary file
package/CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
1
+ # @epicgames-ps/lib-pixelstreamingsignalling-ue5.6
2
+
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 812a419: - Addressing security issues raised by dependabot. (glob, js-yaml, playwright)
8
+ - Added lint npm script to the root project. Running `npm run lint` will now run linting over all packages.
9
+ - Updated dependencies [812a419]
10
+ - @epicgames-ps/lib-pixelstreamingcommon-ue5.7@0.1.4
11
+
12
+ ## 0.2.0
13
+
14
+ ### Minor Changes
15
+
16
+ - 05bebea: Add: Ability to access player id on the frontend.
17
+ QoL: Remove player id stripping from the signalling library.
18
+
19
+ It is useful to be able to use the player id as a unique identifier that is common between UE side stats and frontend side stats; however, the player id is not actually exposed to TS/JS because the SS strips it out of signalling messages.
20
+
21
+ This change is a backport of "Exposed playerid" (#728)
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+
2
+ # @epicgames-ps/lib-pixelstreamingsignalling
3
+
4
+ A library for developers wanting to implement tools and applications that signal Pixel Streaming applications.
5
+
6
+ ## Building
7
+
8
+ To build the `Signalling` module invoke the following commands in the `Common` and `Signalling` directories.
9
+
10
+ ```bash
11
+ npm install
12
+ npm run build
13
+ ```
14
+
15
+ This will result in a `/dist` output directory.
16
+
17
+ **Note:** If you just want to get a signalling server up and running refer to ["Getting Started"](https://github.com/EpicGames/PixelStreamingInfrastructure?tab=readme-ov-file#getting-started).
18
+
19
+ ### NPM package contents
20
+ - ES6 module
21
+ - CommonJS
22
+ - Type definitions
23
+ - Source maps
24
+
25
+ ## Documentation
26
+
27
+ - [Protocol Notes](https://github.com/EpicGames/PixelStreamingInfrastructure/blob/master/Common/docs/Protocol.md)
28
+ - [Protocol Messages](https://github.com/EpicGames/PixelStreamingInfrastructure/blob/master/Common/docs/messages.md)
29
+
30
+ The API documentation is [here](https://github.com/EpicGames/PixelStreamingInfrastructure/tree/master/Signalling/docs) and covers details of all exported components of the library.
31
+
32
+
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Logger = void 0;
7
+ exports.InitLogging = InitLogging;
8
+ // Copyright Epic Games, Inc. All Rights Reserved.
9
+ const Utils_1 = require("./Utils");
10
+ const path_1 = __importDefault(require("path"));
11
+ const winston_1 = __importDefault(require("winston"));
12
+ require("winston-daily-rotate-file");
13
+ const lib_pixelstreamingcommon_ue5_8_1 = require("@epicgames-ps/lib-pixelstreamingcommon-ue5.8");
14
+ const { combine, timestamp, printf, colorize, splat } = winston_1.default.format;
15
+ /**
16
+ * The actual logger object. This is just a winston logger.
17
+ * You can use InitLogging to get a decent result, or you can
18
+ * completely create your own winston logger and assign it.
19
+ */
20
+ exports.Logger = createDefaultLogger();
21
+ /**
22
+ * A wrapper for the log calls in Common lib
23
+ */
24
+ class CommonLogger {
25
+ constructor(winstonLogger) {
26
+ this.logger = winstonLogger;
27
+ }
28
+ InitLogging(_logLevel, _includeStack) { }
29
+ Debug(message) {
30
+ this.logger.debug(message);
31
+ }
32
+ Info(message) {
33
+ this.logger.info(message);
34
+ }
35
+ Warning(message) {
36
+ this.logger.warn(message);
37
+ }
38
+ Error(message) {
39
+ this.logger.error(message);
40
+ }
41
+ }
42
+ /**
43
+ * Call this as early as possible to setup the logging module with your
44
+ * preferred settings.
45
+ * @param config - The settings to init the logger with. See IConfig interface
46
+ */
47
+ function InitLogging(config) {
48
+ const logDir = config.logDir || 'logs';
49
+ const logLevelConsole = config.logLevelConsole || 'info';
50
+ const logLevelFile = config.logLevelFile || 'info';
51
+ logMessagesToConsole = config.logMessagesToConsole || 'none';
52
+ exports.Logger = winston_1.default.createLogger({
53
+ transports: [createConsoleTransport(logLevelConsole), createFileTransport(logDir, logLevelFile)]
54
+ });
55
+ const commonLogger = new CommonLogger(exports.Logger);
56
+ (0, lib_pixelstreamingcommon_ue5_8_1.overrideLogger)(commonLogger);
57
+ }
58
+ let logMessagesToConsole = 'none';
59
+ function createDefaultLogger() {
60
+ return winston_1.default.createLogger({
61
+ level: 'info',
62
+ format: winston_1.default.format.cli(),
63
+ transports: [new winston_1.default.transports.Console()]
64
+ });
65
+ }
66
+ function createConsoleTransport(logLevel) {
67
+ return new winston_1.default.transports.Console({
68
+ level: logLevel,
69
+ format: combine(createProtoMessageFilter()(), timestamp({ format: 'HH:mm:ss.SSS' }), colorize(), splat(), createConsoleFormat())
70
+ });
71
+ }
72
+ function isLogObject(object) {
73
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
74
+ return ('event' in object &&
75
+ object.event == 'proto_message' &&
76
+ 'direction' in object &&
77
+ 'protoMessage' in object);
78
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
79
+ }
80
+ function createConsoleFormat() {
81
+ return printf((logObj) => {
82
+ const prefix = `[${String(logObj['timestamp'])}] ${logObj.level}: `;
83
+ if (typeof logObj.message === 'string') {
84
+ return prefix + logObj.message;
85
+ }
86
+ else if (isLogObject(logObj.message)) {
87
+ const { direction, receiver, sender, target, protoMessage } = logObj.message;
88
+ switch (direction) {
89
+ case 'incoming':
90
+ return prefix + `> ${receiver} :: ${formatMessageForConsole(protoMessage)}`;
91
+ case 'outgoing':
92
+ return prefix + `< ${sender} :: ${formatMessageForConsole(protoMessage)}`;
93
+ case 'forward':
94
+ return prefix + `${receiver} > ${target} :: ${formatMessageForConsole(protoMessage)}`;
95
+ default:
96
+ return prefix + `Unknown proto direction: ${direction}`;
97
+ }
98
+ }
99
+ return '';
100
+ });
101
+ }
102
+ function formatMessageForConsole(message) {
103
+ switch (logMessagesToConsole) {
104
+ case 'verbose':
105
+ return (0, Utils_1.stringify)(message);
106
+ case 'formatted':
107
+ return (0, Utils_1.beautify)(message);
108
+ default:
109
+ return `[${message.type}]`;
110
+ }
111
+ }
112
+ function createProtoMessageFilter() {
113
+ return winston_1.default.format((info, _opts) => {
114
+ if (typeof info.message !== 'string' && isLogObject(info.message) && logMessagesToConsole == 'none') {
115
+ return false;
116
+ }
117
+ return info;
118
+ });
119
+ }
120
+ function createFileTransport(logDirPath, logLevel) {
121
+ return new winston_1.default.transports.DailyRotateFile({
122
+ level: logLevel,
123
+ filename: path_1.default.join(logDirPath, 'server-%DATE%.log'),
124
+ datePattern: 'YYYY-MM-DD',
125
+ maxFiles: '14d',
126
+ format: combine(timestamp({ format: 'YYYY-MM-DD HH:mm:ss.SSS' }), splat(), createFileFormat())
127
+ });
128
+ }
129
+ function createFileFormat() {
130
+ return printf((logObj) => {
131
+ if (typeof logObj.message === 'string') {
132
+ const { timestamp, level, message } = logObj;
133
+ return JSON.stringify({
134
+ timestamp,
135
+ level,
136
+ event: 'message',
137
+ message
138
+ });
139
+ }
140
+ else if (isLogObject(logObj.message)) {
141
+ const { timestamp, level, message } = logObj;
142
+ return JSON.stringify(Object.assign({ timestamp,
143
+ level }, message));
144
+ }
145
+ return '';
146
+ });
147
+ }
148
+ //# sourceMappingURL=Logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/Logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logIncoming = logIncoming;
4
+ exports.logOutgoing = logOutgoing;
5
+ exports.logForward = logForward;
6
+ exports.createHandlerListener = createHandlerListener;
7
+ const Logger_1 = require("./Logger");
8
+ /**
9
+ * Call to log messages received on a connection that we will handle here at the server.
10
+ * Do not call this for messages being forwarded to another connection.
11
+ * @param recvr - IMessageLogger The connection the message was received on.
12
+ */
13
+ function logIncoming(recvr, message) {
14
+ const logObj = {
15
+ event: 'proto_message',
16
+ direction: 'incoming',
17
+ receiver: recvr.getReadableIdentifier(),
18
+ protoMessage: message
19
+ };
20
+ Logger_1.Logger.info(logObj);
21
+ }
22
+ /**
23
+ * Call to log messages created here at the server and being sent to the connection.
24
+ * Do not call this for messages being forwarded to this connection.
25
+ * @param sender - IMessageLogger The connection the message is being sent to.
26
+ */
27
+ function logOutgoing(sender, message) {
28
+ Logger_1.Logger.info({
29
+ event: 'proto_message',
30
+ direction: 'outgoing',
31
+ sender: sender.getReadableIdentifier(),
32
+ protoMessage: message
33
+ });
34
+ }
35
+ /**
36
+ * Call this for messages being forwarded to this connection. That is messages received on
37
+ * one connection and being sent to another with only minor changes being made.
38
+ * @param recvr - The connection the message was received on.
39
+ * @param target - The connection the message is being sent to.
40
+ */
41
+ function logForward(recvr, target, message) {
42
+ Logger_1.Logger.info({
43
+ event: 'proto_message',
44
+ direction: 'forward',
45
+ receiver: recvr.getReadableIdentifier(),
46
+ target: target.getReadableIdentifier(),
47
+ protoMessage: message
48
+ });
49
+ }
50
+ /**
51
+ * We don't want to log every incoming and outgoing messages. This is because some messages are simply
52
+ * forwarded to other connections. This results in duplicated spam. So we only want to log incoming
53
+ * messages that we handle internally, and any messages that we forward we only log once for the recv
54
+ * and send events.
55
+ * This creation method allows a simple way to enforce this. Any events we handle directly will
56
+ * be preceded by the logging call.
57
+ */
58
+ function createHandlerListener(obj, handler) {
59
+ return (message) => {
60
+ logIncoming(obj, message);
61
+ handler.bind(obj)(message);
62
+ };
63
+ }
64
+ //# sourceMappingURL=LoggingUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoggingUtils.js","sourceRoot":"","sources":["../../src/LoggingUtils.ts"],"names":[],"mappings":";;AA0BA,kCAQC;AAOD,kCAOC;AAQD,gCAQC;AAUD,sDAKC;AA7ED,qCAAkC;AAmBlC;;;;GAIG;AACH,SAAgB,WAAW,CAAC,KAAqB,EAAE,OAAoB;IACnE,MAAM,MAAM,GAAiB;QACzB,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,KAAK,CAAC,qBAAqB,EAAE;QACvC,YAAY,EAAE,OAAO;KACxB,CAAC;IACF,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,MAAsB,EAAE,OAAoB;IACpE,eAAM,CAAC,IAAI,CAAC;QACR,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,UAAU;QACrB,MAAM,EAAE,MAAM,CAAC,qBAAqB,EAAE;QACtC,YAAY,EAAE,OAAO;KACxB,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,KAAqB,EAAE,MAAsB,EAAE,OAAoB;IAC1F,eAAM,CAAC,IAAI,CAAC;QACR,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,KAAK,CAAC,qBAAqB,EAAE;QACvC,MAAM,EAAE,MAAM,CAAC,qBAAqB,EAAE;QACtC,YAAY,EAAE,OAAO;KACxB,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,GAAmB,EAAE,OAA+B;IACtF,OAAO,CAAC,OAAoB,EAAE,EAAE;QAC5B,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PlayerConnection = void 0;
37
+ const lib_pixelstreamingcommon_ue5_8_1 = require("@epicgames-ps/lib-pixelstreamingcommon-ue5.8");
38
+ const Logger_1 = require("./Logger");
39
+ const LogUtils = __importStar(require("./LoggingUtils"));
40
+ /**
41
+ * A connection between the signalling server and a player connection.
42
+ * This is where messages expected to be handled by the player come in
43
+ * and where messages are sent to the player.
44
+ *
45
+ * Interesting internals:
46
+ * playerId: The unique id string of this player.
47
+ * transport: The ITransport where transport events can be subscribed to
48
+ * protocol: The SignallingProtocol where signalling messages can be
49
+ * subscribed to.
50
+ */
51
+ class PlayerConnection {
52
+ /**
53
+ * Initializes a new connection with given and sane values. Adds listeners for the
54
+ * websocket close and error so it can react by unsubscribing and resetting itself.
55
+ * @param server - The signalling server object that spawned this player.
56
+ * @param ws - The websocket coupled to this player connection.
57
+ * @param remoteAddress - The remote address of this connection. Only used as display.
58
+ * @param request - The HTTP upgrade request that opened this connection, if available.
59
+ */
60
+ constructor(server, ws, remoteAddress, request) {
61
+ this.server = server;
62
+ this.playerId = '';
63
+ this.subscribedStreamer = null;
64
+ this.transport = new lib_pixelstreamingcommon_ue5_8_1.WebSocketTransportNJS(ws);
65
+ this.protocol = new lib_pixelstreamingcommon_ue5_8_1.SignallingProtocol(this.transport);
66
+ this.remoteAddress = remoteAddress;
67
+ this.request = request;
68
+ this.transport.on('error', this.onTransportError.bind(this));
69
+ this.transport.on('close', this.onTransportClose.bind(this));
70
+ this.streamerIdChangeListener = this.onStreamerIdChanged.bind(this);
71
+ this.streamerDisconnectedListener = this.onStreamerDisconnected.bind(this);
72
+ this.registerMessageHandlers();
73
+ }
74
+ /**
75
+ * Returns an identifier that is displayed in logs.
76
+ * @returns A string describing this connection.
77
+ */
78
+ getReadableIdentifier() {
79
+ return this.playerId;
80
+ }
81
+ /**
82
+ * Sends a signalling message to the player.
83
+ * @param message - The message to send.
84
+ */
85
+ sendMessage(message) {
86
+ LogUtils.logOutgoing(this, message);
87
+ this.protocol.sendMessage(message);
88
+ }
89
+ /**
90
+ * Returns a descriptive object for the REST API inspection operations.
91
+ * @returns An IPlayerInfo object containing viewable information about this connection.
92
+ */
93
+ getPlayerInfo() {
94
+ var _a;
95
+ return {
96
+ playerId: this.playerId,
97
+ type: 'Player',
98
+ subscribedTo: (_a = this.subscribedStreamer) === null || _a === void 0 ? void 0 : _a.streamerId,
99
+ remoteAddress: this.remoteAddress
100
+ };
101
+ }
102
+ registerMessageHandlers() {
103
+ /* eslint-disable @typescript-eslint/unbound-method */
104
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.subscribe.typeName, LogUtils.createHandlerListener(this, this.onSubscribeMessage));
105
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.unsubscribe.typeName, LogUtils.createHandlerListener(this, this.onUnsubscribeMessage));
106
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.listStreamers.typeName, LogUtils.createHandlerListener(this, this.onListStreamers));
107
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.ping.typeName, LogUtils.createHandlerListener(this, this.onPingMessage));
108
+ /* eslint-enable @typescript-eslint/unbound-method */
109
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.offer.typeName, this.sendToStreamer.bind(this));
110
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.answer.typeName, this.sendToStreamer.bind(this));
111
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.iceCandidate.typeName, this.sendToStreamer.bind(this));
112
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.dataChannelRequest.typeName, this.sendToStreamer.bind(this));
113
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.peerDataChannelsReady.typeName, this.sendToStreamer.bind(this));
114
+ this.protocol.on(lib_pixelstreamingcommon_ue5_8_1.Messages.layerPreference.typeName, this.sendToStreamer.bind(this));
115
+ this.protocol.on('unhandled', (message) => {
116
+ Logger_1.Logger.warn(`Unhandled player protocol message: ${JSON.stringify(message)}`);
117
+ });
118
+ }
119
+ sendToStreamer(message) {
120
+ if (!this.subscribedStreamer) {
121
+ Logger_1.Logger.warn(`Player ${this.playerId} tried to send to a streamer but they're not subscribed to any.`);
122
+ const streamerId = this.server.streamerRegistry.getFirstStreamerId();
123
+ if (!streamerId) {
124
+ Logger_1.Logger.error('There are no streamers to force a subscription. Disconnecting.');
125
+ this.disconnect();
126
+ return;
127
+ }
128
+ else {
129
+ Logger_1.Logger.warn(`Subscribing to ${streamerId}`);
130
+ this.subscribe(streamerId);
131
+ }
132
+ }
133
+ message.playerId = this.playerId;
134
+ LogUtils.logForward(this, this.subscribedStreamer, message);
135
+ this.subscribedStreamer.protocol.sendMessage(message);
136
+ }
137
+ subscribe(streamerId) {
138
+ const streamer = this.server.streamerRegistry.find(streamerId);
139
+ if (!streamer) {
140
+ Logger_1.Logger.error(`subscribe: Player ${this.playerId} tried to subscribe to a non-existent streamer ${streamerId}`);
141
+ const failureMessage = lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.subscribeFailed, {
142
+ message: `Streamer ${streamerId} does not exist.`
143
+ });
144
+ this.protocol.sendMessage(failureMessage);
145
+ return;
146
+ }
147
+ if (this.subscribedStreamer) {
148
+ Logger_1.Logger.warn(`subscribe: Player ${this.playerId} is resubscribing to a streamer but is already subscribed to ${this.subscribedStreamer.streamerId}`);
149
+ this.unsubscribe();
150
+ }
151
+ if (streamer.maxSubscribers > 0 && streamer.subscribers.size >= streamer.maxSubscribers) {
152
+ Logger_1.Logger.error(`subscribe: Player ${this.playerId} could not subscribe to ${streamerId}. Max players (${streamer.maxSubscribers}) reached.`);
153
+ const failureMessage = lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.subscribeFailed, {
154
+ message: `Streamer ${streamerId} is full. Max players = ${streamer.maxSubscribers}.`
155
+ });
156
+ this.protocol.sendMessage(failureMessage);
157
+ return;
158
+ }
159
+ this.subscribedStreamer = streamer;
160
+ this.subscribedStreamer.subscribers.add(this.playerId);
161
+ this.subscribedStreamer.on('id_changed', this.streamerIdChangeListener);
162
+ this.subscribedStreamer.on('disconnect', this.streamerDisconnectedListener);
163
+ const connectedMessage = lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.playerConnected, {
164
+ playerId: this.playerId,
165
+ dataChannel: true,
166
+ sfu: false
167
+ });
168
+ this.sendToStreamer(connectedMessage);
169
+ }
170
+ unsubscribe() {
171
+ if (!this.subscribedStreamer) {
172
+ return;
173
+ }
174
+ this.subscribedStreamer.subscribers.delete(this.playerId);
175
+ const disconnectedMessage = lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.playerDisconnected, {
176
+ playerId: this.playerId
177
+ });
178
+ this.sendToStreamer(disconnectedMessage);
179
+ this.subscribedStreamer.off('id_changed', this.streamerIdChangeListener);
180
+ this.subscribedStreamer.off('disconnect', this.streamerDisconnectedListener);
181
+ this.subscribedStreamer = null;
182
+ }
183
+ disconnect() {
184
+ this.unsubscribe();
185
+ this.protocol.disconnect();
186
+ }
187
+ onStreamerDisconnected() {
188
+ this.disconnect();
189
+ }
190
+ onTransportError(error) {
191
+ Logger_1.Logger.error(`Player (${this.playerId}) transport error ${error.message}`);
192
+ }
193
+ onTransportClose(_event) {
194
+ Logger_1.Logger.debug('PlayerConnection 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 = lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.streamerList, {
205
+ ids: this.server.streamerRegistry.streamers
206
+ .filter((streamer) => streamer.streaming)
207
+ .map((streamer) => streamer.streamerId)
208
+ });
209
+ this.sendMessage(listMessage);
210
+ }
211
+ onStreamerIdChanged(newId) {
212
+ const renameMessage = lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.streamerIdChanged, { newID: newId });
213
+ this.sendMessage(renameMessage);
214
+ }
215
+ onPingMessage(message) {
216
+ this.sendMessage(lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.pong, { time: message.time }));
217
+ }
218
+ }
219
+ exports.PlayerConnection = PlayerConnection;
220
+ //# 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,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlayerRegistry = void 0;
4
+ const lib_pixelstreamingcommon_ue5_8_1 = require("@epicgames-ps/lib-pixelstreamingcommon-ue5.8");
5
+ const Logger_1 = require("./Logger");
6
+ /**
7
+ * Handles all the player connections of a signalling server and
8
+ * can be used to lookup connections by id etc.
9
+ * Fires events when players are added or removed.
10
+ * Events:
11
+ * 'added': (playerId: string) Player was added.
12
+ * 'removed': (playerId: string) Player was removed.
13
+ */
14
+ class PlayerRegistry extends lib_pixelstreamingcommon_ue5_8_1.EventEmitter {
15
+ constructor() {
16
+ super();
17
+ this.players = new Map();
18
+ this.players = new Map();
19
+ this.nextPlayerId = 0;
20
+ }
21
+ /**
22
+ * Assigns a unique id to the player and adds it to the registry
23
+ */
24
+ add(player) {
25
+ player.playerId = this.getUniquePlayerId();
26
+ this.players.set(player.playerId, player);
27
+ this.emit('added', player.playerId);
28
+ Logger_1.Logger.info(`Registered new player: ${player.playerId}`);
29
+ }
30
+ /**
31
+ * Removes a player from the registry. Does nothing if the id
32
+ * does not exist.
33
+ */
34
+ remove(player) {
35
+ if (!this.players.has(player.playerId)) {
36
+ return;
37
+ }
38
+ this.emit('removed', player.playerId);
39
+ this.players.delete(player.playerId);
40
+ Logger_1.Logger.info(`Unregistered player: ${player.playerId}`);
41
+ }
42
+ /**
43
+ * Tests if a player id exists in the registry.
44
+ */
45
+ has(playerId) {
46
+ return this.players.has(playerId);
47
+ }
48
+ /**
49
+ * Gets a player from the registry using the player id.
50
+ * Returns undefined if the player doesn't exist.
51
+ */
52
+ get(playerId) {
53
+ return this.players.get(playerId);
54
+ }
55
+ listPlayers() {
56
+ return Array.from(this.players.values());
57
+ }
58
+ /**
59
+ * Returns true when the registry is empty.
60
+ */
61
+ empty() {
62
+ return this.players.size === 0;
63
+ }
64
+ /**
65
+ * Gets the total number of connected players.
66
+ */
67
+ count() {
68
+ return this.players.size;
69
+ }
70
+ getUniquePlayerId() {
71
+ const newPlayerId = `Player${this.nextPlayerId}`;
72
+ this.nextPlayerId++;
73
+ return newPlayerId;
74
+ }
75
+ }
76
+ exports.PlayerRegistry = PlayerRegistry;
77
+ //# sourceMappingURL=PlayerRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerRegistry.js","sourceRoot":"","sources":["../../src/PlayerRegistry.ts"],"names":[],"mappings":";;;AAEA,iGAA6G;AAC7G,qCAAkC;AA+BlC;;;;;;;GAOG;AACH,MAAa,cAAe,SAAQ,6CAAY;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,eAAM,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,eAAM,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;AAzED,wCAyEC"}