@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.
- package/.lintstagedrc.mjs +7 -0
- package/.prettierignore +0 -0
- package/CHANGELOG.md +21 -0
- package/README.md +32 -0
- package/dist/cjs/Logger.js +148 -0
- package/dist/cjs/Logger.js.map +1 -0
- package/dist/cjs/LoggingUtils.js +64 -0
- package/dist/cjs/LoggingUtils.js.map +1 -0
- package/dist/cjs/PlayerConnection.js +220 -0
- package/dist/cjs/PlayerConnection.js.map +1 -0
- package/dist/cjs/PlayerRegistry.js +77 -0
- package/dist/cjs/PlayerRegistry.js.map +1 -0
- package/dist/cjs/SFUConnection.js +264 -0
- package/dist/cjs/SFUConnection.js.map +1 -0
- package/dist/cjs/SignallingServer.js +149 -0
- package/dist/cjs/SignallingServer.js.map +1 -0
- package/dist/cjs/StreamerConnection.js +172 -0
- package/dist/cjs/StreamerConnection.js.map +1 -0
- package/dist/cjs/StreamerRegistry.js +149 -0
- package/dist/cjs/StreamerRegistry.js.map +1 -0
- package/dist/cjs/Utils.js +19 -0
- package/dist/cjs/Utils.js.map +1 -0
- package/dist/cjs/WebServer.js +124 -0
- package/dist/cjs/WebServer.js.map +1 -0
- package/dist/cjs/pixelstreamingsignalling.js +28 -0
- package/dist/cjs/pixelstreamingsignalling.js.map +1 -0
- package/dist/esm/Logger.js +141 -0
- package/dist/esm/Logger.js.map +1 -0
- package/dist/esm/LoggingUtils.js +58 -0
- package/dist/esm/LoggingUtils.js.map +1 -0
- package/dist/esm/PlayerConnection.js +183 -0
- package/dist/esm/PlayerConnection.js.map +1 -0
- package/dist/esm/PlayerRegistry.js +73 -0
- package/dist/esm/PlayerRegistry.js.map +1 -0
- package/dist/esm/SFUConnection.js +227 -0
- package/dist/esm/SFUConnection.js.map +1 -0
- package/dist/esm/SignallingServer.js +112 -0
- package/dist/esm/SignallingServer.js.map +1 -0
- package/dist/esm/StreamerConnection.js +135 -0
- package/dist/esm/StreamerConnection.js.map +1 -0
- package/dist/esm/StreamerRegistry.js +145 -0
- package/dist/esm/StreamerRegistry.js.map +1 -0
- package/dist/esm/Utils.js +15 -0
- package/dist/esm/Utils.js.map +1 -0
- package/dist/esm/WebServer.js +117 -0
- package/dist/esm/WebServer.js.map +1 -0
- package/dist/esm/pixelstreamingsignalling.js +12 -0
- package/dist/esm/pixelstreamingsignalling.js.map +1 -0
- package/dist/types/Logger.d.ts +20 -0
- package/dist/types/LoggingUtils.d.ts +44 -0
- package/dist/types/PlayerConnection.d.ts +66 -0
- package/dist/types/PlayerRegistry.d.ts +66 -0
- package/dist/types/SFUConnection.d.ts +85 -0
- package/dist/types/SignallingServer.d.ts +48 -0
- package/dist/types/StreamerConnection.d.ts +61 -0
- package/dist/types/StreamerRegistry.d.ts +96 -0
- package/dist/types/Utils.d.ts +8 -0
- package/dist/types/WebServer.d.ts +42 -0
- package/dist/types/pixelstreamingsignalling.d.ts +9 -0
- package/docs/Logger/README.md +19 -0
- package/docs/Logger/functions/InitLogging.md +26 -0
- package/docs/Logger/interfaces/IConfig.md +41 -0
- package/docs/Logger/variables/Logger.md +15 -0
- package/docs/LoggingUtils/README.md +19 -0
- package/docs/LoggingUtils/functions/createHandlerListener.md +42 -0
- package/docs/LoggingUtils/functions/logForward.md +36 -0
- package/docs/LoggingUtils/functions/logIncoming.md +30 -0
- package/docs/LoggingUtils/functions/logOutgoing.md +30 -0
- package/docs/LoggingUtils/interfaces/IMessageLogger.md +29 -0
- package/docs/LoggingUtils/interfaces/IProtoLogObj.md +57 -0
- package/docs/PlayerConnection/README.md +11 -0
- package/docs/PlayerConnection/classes/PlayerConnection.md +177 -0
- package/docs/PlayerRegistry/README.md +16 -0
- package/docs/PlayerRegistry/classes/PlayerRegistry.md +423 -0
- package/docs/PlayerRegistry/interfaces/IPlayer.md +86 -0
- package/docs/PlayerRegistry/interfaces/IPlayerInfo.md +43 -0
- package/docs/README.md +19 -0
- package/docs/SFUConnection/README.md +11 -0
- package/docs/SFUConnection/classes/SFUConnection.md +554 -0
- package/docs/SignallingServer/README.md +19 -0
- package/docs/SignallingServer/classes/SignallingServer.md +76 -0
- package/docs/SignallingServer/interfaces/IServerConfig.md +92 -0
- package/docs/SignallingServer/type-aliases/ProtocolConfig.md +15 -0
- package/docs/StreamerConnection/README.md +11 -0
- package/docs/StreamerConnection/classes/StreamerConnection.md +507 -0
- package/docs/StreamerRegistry/README.md +16 -0
- package/docs/StreamerRegistry/classes/StreamerRegistry.md +431 -0
- package/docs/StreamerRegistry/interfaces/IStreamer.md +375 -0
- package/docs/StreamerRegistry/interfaces/IStreamerInfo.md +51 -0
- package/docs/Utils/README.md +12 -0
- package/docs/Utils/functions/beautify.md +23 -0
- package/docs/Utils/functions/stringify.md +23 -0
- package/docs/WebServer/README.md +15 -0
- package/docs/WebServer/classes/WebServer.md +50 -0
- package/docs/WebServer/interfaces/IWebServerConfig.md +76 -0
- package/docs/pixelstreamingsignalling/README.md +145 -0
- package/eslint.config.mjs +39 -0
- package/package.json +58 -0
- package/src/Logger.ts +189 -0
- package/src/LoggingUtils.ts +80 -0
- package/src/PlayerConnection.ts +257 -0
- package/src/PlayerRegistry.ts +116 -0
- package/src/SFUConnection.ts +329 -0
- package/src/SignallingServer.ts +214 -0
- package/src/StreamerConnection.ts +194 -0
- package/src/StreamerRegistry.ts +252 -0
- package/src/Utils.ts +16 -0
- package/src/WebServer.ts +213 -0
- package/src/pixelstreamingsignalling.ts +11 -0
- package/tsconfig.cjs.json +8 -0
- package/tsconfig.esm.json +8 -0
- package/tsconfig.json +29 -0
package/.prettierignore
ADDED
|
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"}
|