@epicgames-ps/lib-pixelstreamingsignalling-ue5.8 0.1.0 → 0.2.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/CHANGELOG.md +10 -0
- package/dist/cjs/PlayerConnection.js +8 -0
- package/dist/cjs/PlayerConnection.js.map +1 -1
- package/dist/cjs/SignallingServer.js +28 -6
- package/dist/cjs/SignallingServer.js.map +1 -1
- package/dist/esm/PlayerConnection.js +8 -0
- package/dist/esm/PlayerConnection.js.map +1 -1
- package/dist/esm/SignallingServer.js +28 -6
- package/dist/esm/SignallingServer.js.map +1 -1
- package/dist/types/SignallingServer.d.ts +26 -0
- package/eslint.config.mjs +1 -1
- package/jest.config.js +14 -0
- package/package.json +5 -2
- package/src/PlayerConnection.ts +12 -2
- package/src/SignallingServer.test.ts +63 -0
- package/src/SignallingServer.ts +71 -6
- package/tsconfig.jest.json +9 -0
- package/tsconfig.json +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @epicgames-ps/lib-pixelstreamingsignalling-ue5.6
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- c8cd21a: Allow TURN credentials to be issued per connection rather than shared by every session. `peerOptions` is static, so a credential written there is sent to every peer that ever connects and cannot be changed without a redeploy — the weakness noted in tip 3 of the security guidelines. `IServerConfig.peerOptionsProvider` is consulted once per connecting peer and returns the peer options for that peer, falling back to `peerOptions` if it throws. On top of it the signalling server adds `--turn_secret` (or `--turn_secret_file`) and `--turn_ttl`, which give every `turn:`/`turns:` entry a time limited username and credential in the form coturn's `use-auth-secret` mode expects. Default behaviour is unchanged when no secret is supplied. See `Docs/Security-Guidelines.md`.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- e9cd872: Stop an unsubscribed player from crashing the signalling server. When a player sends a message without being subscribed, `sendToStreamer` force-subscribes it to the first available streamer and then forwards through `this.subscribedStreamer!`. `subscribe()` can decline — most commonly because `maxSubscribers` is already reached — and reports that only by leaving `subscribedStreamer` unset, so the non-null assertions throw a TypeError out of a websocket message handler and take the process down, disconnecting every other player. It now checks the subscription took, and disconnects just that player if it did not.
|
|
12
|
+
|
|
3
13
|
## 0.2.1
|
|
4
14
|
|
|
5
15
|
### Patch Changes
|
|
@@ -128,6 +128,14 @@ class PlayerConnection {
|
|
|
128
128
|
else {
|
|
129
129
|
Logger_1.Logger.warn(`Subscribing to ${streamerId}`);
|
|
130
130
|
this.subscribe(streamerId);
|
|
131
|
+
// subscribe() declines silently, most often because maxSubscribers is reached, and
|
|
132
|
+
// says so only by leaving subscribedStreamer unset. Forwarding anyway dereferences
|
|
133
|
+
// null, which surfaces as an uncaughtException and exits the process.
|
|
134
|
+
if (!this.subscribedStreamer) {
|
|
135
|
+
Logger_1.Logger.error(`Player ${this.playerId} could not be subscribed to ${streamerId}. Disconnecting.`);
|
|
136
|
+
this.disconnect();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
131
139
|
}
|
|
132
140
|
}
|
|
133
141
|
message.playerId = this.playerId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayerConnection.js","sourceRoot":"","sources":["../../src/PlayerConnection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PlayerConnection.js","sourceRoot":"","sources":["../../src/PlayerConnection.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,iGAOsD;AAGtD,qCAAkC;AAClC,yDAA2C;AAG3C;;;;;;;;;;GAUG;AACH,MAAa,gBAAgB;IAkBzB;;;;;;;OAOG;IACH,YAAY,MAAwB,EAAE,EAAa,EAAE,aAAsB,EAAE,OAAyB;QAClG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,sDAAqB,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,mDAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3E,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,OAAoB;QAC5B,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,aAAa;;QACT,OAAO;YACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,MAAA,IAAI,CAAC,kBAAkB,0CAAE,UAAU;YACjD,aAAa,EAAE,IAAI,CAAC,aAAa;SACpC,CAAC;IACN,CAAC;IAEO,uBAAuB;QAC3B,sDAAsD;QACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,CACZ,yCAAQ,CAAC,SAAS,CAAC,QAAQ,EAC3B,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAChE,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,CACZ,yCAAQ,CAAC,WAAW,CAAC,QAAQ,EAC7B,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAClE,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,CACZ,yCAAQ,CAAC,aAAa,CAAC,QAAQ,EAC/B,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAC7D,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,yCAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACnG,qDAAqD;QAErD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,yCAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,yCAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,yCAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,yCAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,yCAAQ,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,yCAAQ,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpF,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAoB,EAAE,EAAE;YACnD,eAAM,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,cAAc,CAAC,OAAoB;QACvC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,eAAM,CAAC,IAAI,CACP,UAAU,IAAI,CAAC,QAAQ,iEAAiE,CAC3F,CAAC;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YACrE,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,eAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBAC/E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,OAAO;YACX,CAAC;iBAAM,CAAC;gBACJ,eAAM,CAAC,IAAI,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC3B,mFAAmF;gBACnF,mFAAmF;gBACnF,sEAAsE;gBACtE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC3B,eAAM,CAAC,KAAK,CACR,UAAU,IAAI,CAAC,QAAQ,+BAA+B,UAAU,kBAAkB,CACrF,CAAC;oBACF,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,OAAO;gBACX,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAEO,SAAS,CAAC,UAAkB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,eAAM,CAAC,KAAK,CACR,qBAAqB,IAAI,CAAC,QAAQ,kDAAkD,UAAU,EAAE,CACnG,CAAC;YACF,MAAM,cAAc,GAAG,+CAAc,CAAC,aAAa,CAAC,yCAAQ,CAAC,eAAe,EAAE;gBAC1E,OAAO,EAAE,YAAY,UAAU,kBAAkB;aACpD,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC1C,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,eAAM,CAAC,IAAI,CACP,qBAAqB,IAAI,CAAC,QAAQ,gEAAgE,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CACzI,CAAC;YACF,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,QAAQ,CAAC,cAAc,GAAG,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YACtF,eAAM,CAAC,KAAK,CACR,qBAAqB,IAAI,CAAC,QAAQ,2BAA2B,UAAU,kBAAkB,QAAQ,CAAC,cAAc,YAAY,CAC/H,CAAC;YACF,MAAM,cAAc,GAAG,+CAAc,CAAC,aAAa,CAAC,yCAAQ,CAAC,eAAe,EAAE;gBAC1E,OAAO,EAAE,YAAY,UAAU,2BAA2B,QAAQ,CAAC,cAAc,GAAG;aACvF,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC1C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;QACnC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxE,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAE5E,MAAM,gBAAgB,GAAG,+CAAc,CAAC,aAAa,CAAC,yCAAQ,CAAC,eAAe,EAAE;YAC5E,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI;YACjB,GAAG,EAAE,KAAK;SACb,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,OAAO;QACX,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1D,MAAM,mBAAmB,GAAG,+CAAc,CAAC,aAAa,CAAC,yCAAQ,CAAC,kBAAkB,EAAE;YAClF,QAAQ,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAEzC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACzE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC7E,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACnC,CAAC;IAEO,UAAU;QACd,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;IAEO,sBAAsB;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEO,gBAAgB,CAAC,KAAiB;QACtC,eAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAEO,gBAAgB,CAAC,MAAkB;QACvC,eAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAEO,kBAAkB,CAAC,OAA2B;QAClD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAEO,oBAAoB,CAAC,QAA8B;QACvD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,QAAgC;QACpD,MAAM,WAAW,GAAG,+CAAc,CAAC,aAAa,CAAC,yCAAQ,CAAC,YAAY,EAAE;YACpE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS;iBACtC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;iBACxC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAEO,mBAAmB,CAAC,KAAa;QACrC,MAAM,aAAa,GAAG,+CAAc,CAAC,aAAa,CAAC,yCAAQ,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAEO,aAAa,CAAC,OAAsB;QACxC,IAAI,CAAC,WAAW,CAAC,+CAAc,CAAC,aAAa,CAAC,yCAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;CACJ;AA9OD,4CA8OC"}
|
|
@@ -86,14 +86,36 @@ class SignallingServer {
|
|
|
86
86
|
Logger_1.Logger.info(`Listening for SFU connections on port ${config.sfuPort}`);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
-
sendConfigMessage(connection) {
|
|
89
|
+
sendConfigMessage(connection, peerRequest) {
|
|
90
90
|
// peer connection options is a general field with all optional fields;
|
|
91
91
|
// it doesnt play nice with mergePartial so we just add it verbatim
|
|
92
92
|
const message = lib_pixelstreamingcommon_ue5_8_1.MessageHelpers.createMessage(lib_pixelstreamingcommon_ue5_8_1.Messages.config, this.protocolConfig);
|
|
93
|
-
|
|
94
|
-
message.peerConnectionOptions = this.protocolConfig['peerConnectionOptions'];
|
|
93
|
+
message.peerConnectionOptions = this.getPeerOptions(peerRequest);
|
|
95
94
|
connection.sendMessage(message);
|
|
96
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolves the peer options for one connecting peer, deferring to peerOptionsProvider when the
|
|
98
|
+
* consumer supplied one.
|
|
99
|
+
*/
|
|
100
|
+
getPeerOptions(peerRequest) {
|
|
101
|
+
if (!this.config.peerOptionsProvider) {
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
103
|
+
return this.protocolConfig['peerConnectionOptions'];
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
// The provider is consumer code, so its return is unknown to us; it travels as an
|
|
107
|
+
// opaque blob in the config message either way.
|
|
108
|
+
return this.config.peerOptionsProvider(peerRequest);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
// A provider is consumer code and may reach outside the process for a credential. If it
|
|
112
|
+
// fails we still send a config message, because a peer that never receives one simply
|
|
113
|
+
// waits forever with nothing in its log to explain why.
|
|
114
|
+
Logger_1.Logger.error('peerOptionsProvider threw for %s peer %s, falling back to the static peer options: %s', peerRequest.peerType, peerRequest.peerId, error instanceof Error ? error.message : (0, Utils_1.stringify)(error));
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
116
|
+
return this.protocolConfig['peerConnectionOptions'];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
97
119
|
onStreamerConnected(ws, request) {
|
|
98
120
|
Logger_1.Logger.info(`New streamer connection: %s`, request.socket.remoteAddress);
|
|
99
121
|
const newStreamer = new StreamerConnection_1.StreamerConnection(this, ws, request.socket.remoteAddress, request);
|
|
@@ -104,7 +126,7 @@ class SignallingServer {
|
|
|
104
126
|
this.streamerRegistry.remove(newStreamer);
|
|
105
127
|
Logger_1.Logger.info(`Streamer %s (%s) disconnected.`, newStreamer.streamerId, request.socket.remoteAddress);
|
|
106
128
|
});
|
|
107
|
-
this.sendConfigMessage(newStreamer);
|
|
129
|
+
this.sendConfigMessage(newStreamer, { peerType: 'streamer', peerId: newStreamer.streamerId });
|
|
108
130
|
}
|
|
109
131
|
onPlayerConnected(ws, request) {
|
|
110
132
|
Logger_1.Logger.info(`New player connection: %s (%s)`, request.socket.remoteAddress, request.url);
|
|
@@ -129,7 +151,7 @@ class SignallingServer {
|
|
|
129
151
|
ws.terminate();
|
|
130
152
|
};
|
|
131
153
|
}
|
|
132
|
-
this.sendConfigMessage(newPlayer);
|
|
154
|
+
this.sendConfigMessage(newPlayer, { peerType: 'player', peerId: newPlayer.playerId });
|
|
133
155
|
}
|
|
134
156
|
onSFUConnected(ws, request) {
|
|
135
157
|
Logger_1.Logger.info(`New SFU connection: %s`, request.socket.remoteAddress);
|
|
@@ -142,7 +164,7 @@ class SignallingServer {
|
|
|
142
164
|
this.playerRegistry.remove(newSFU);
|
|
143
165
|
Logger_1.Logger.info(`SFU %s (%s) disconnected.`, newSFU.streamerId, request.socket.remoteAddress);
|
|
144
166
|
});
|
|
145
|
-
this.sendConfigMessage(newSFU);
|
|
167
|
+
this.sendConfigMessage(newSFU, { peerType: 'sfu', peerId: newSFU.streamerId });
|
|
146
168
|
}
|
|
147
169
|
}
|
|
148
170
|
exports.SignallingServer = SignallingServer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignallingServer.js","sourceRoot":"","sources":["../../src/SignallingServer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,0CAA4B;AAC5B,6DAA0D;AAC1D,yDAAsD;AACtD,mDAAgD;AAChD,qCAAkC;AAClC,yDAA4E;AAC5E,qDAAkD;AAClD,iGAKsD;AACtD,mCAAoC;
|
|
1
|
+
{"version":3,"file":"SignallingServer.js","sourceRoot":"","sources":["../../src/SignallingServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -92,6 +92,14 @@ export class PlayerConnection {
|
|
|
92
92
|
else {
|
|
93
93
|
Logger.warn(`Subscribing to ${streamerId}`);
|
|
94
94
|
this.subscribe(streamerId);
|
|
95
|
+
// subscribe() declines silently, most often because maxSubscribers is reached, and
|
|
96
|
+
// says so only by leaving subscribedStreamer unset. Forwarding anyway dereferences
|
|
97
|
+
// null, which surfaces as an uncaughtException and exits the process.
|
|
98
|
+
if (!this.subscribedStreamer) {
|
|
99
|
+
Logger.error(`Player ${this.playerId} could not be subscribed to ${streamerId}. Disconnecting.`);
|
|
100
|
+
this.disconnect();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
95
103
|
}
|
|
96
104
|
}
|
|
97
105
|
message.playerId = this.playerId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayerConnection.js","sourceRoot":"","sources":["../../src/PlayerConnection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PlayerConnection.js","sourceRoot":"","sources":["../../src/PlayerConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,14 +50,36 @@ export class SignallingServer {
|
|
|
50
50
|
Logger.info(`Listening for SFU connections on port ${config.sfuPort}`);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
sendConfigMessage(connection) {
|
|
53
|
+
sendConfigMessage(connection, peerRequest) {
|
|
54
54
|
// peer connection options is a general field with all optional fields;
|
|
55
55
|
// it doesnt play nice with mergePartial so we just add it verbatim
|
|
56
56
|
const message = MessageHelpers.createMessage(Messages.config, this.protocolConfig);
|
|
57
|
-
|
|
58
|
-
message.peerConnectionOptions = this.protocolConfig['peerConnectionOptions'];
|
|
57
|
+
message.peerConnectionOptions = this.getPeerOptions(peerRequest);
|
|
59
58
|
connection.sendMessage(message);
|
|
60
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolves the peer options for one connecting peer, deferring to peerOptionsProvider when the
|
|
62
|
+
* consumer supplied one.
|
|
63
|
+
*/
|
|
64
|
+
getPeerOptions(peerRequest) {
|
|
65
|
+
if (!this.config.peerOptionsProvider) {
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
67
|
+
return this.protocolConfig['peerConnectionOptions'];
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
// The provider is consumer code, so its return is unknown to us; it travels as an
|
|
71
|
+
// opaque blob in the config message either way.
|
|
72
|
+
return this.config.peerOptionsProvider(peerRequest);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// A provider is consumer code and may reach outside the process for a credential. If it
|
|
76
|
+
// fails we still send a config message, because a peer that never receives one simply
|
|
77
|
+
// waits forever with nothing in its log to explain why.
|
|
78
|
+
Logger.error('peerOptionsProvider threw for %s peer %s, falling back to the static peer options: %s', peerRequest.peerType, peerRequest.peerId, error instanceof Error ? error.message : stringify(error));
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
80
|
+
return this.protocolConfig['peerConnectionOptions'];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
61
83
|
onStreamerConnected(ws, request) {
|
|
62
84
|
Logger.info(`New streamer connection: %s`, request.socket.remoteAddress);
|
|
63
85
|
const newStreamer = new StreamerConnection(this, ws, request.socket.remoteAddress, request);
|
|
@@ -68,7 +90,7 @@ export class SignallingServer {
|
|
|
68
90
|
this.streamerRegistry.remove(newStreamer);
|
|
69
91
|
Logger.info(`Streamer %s (%s) disconnected.`, newStreamer.streamerId, request.socket.remoteAddress);
|
|
70
92
|
});
|
|
71
|
-
this.sendConfigMessage(newStreamer);
|
|
93
|
+
this.sendConfigMessage(newStreamer, { peerType: 'streamer', peerId: newStreamer.streamerId });
|
|
72
94
|
}
|
|
73
95
|
onPlayerConnected(ws, request) {
|
|
74
96
|
Logger.info(`New player connection: %s (%s)`, request.socket.remoteAddress, request.url);
|
|
@@ -93,7 +115,7 @@ export class SignallingServer {
|
|
|
93
115
|
ws.terminate();
|
|
94
116
|
};
|
|
95
117
|
}
|
|
96
|
-
this.sendConfigMessage(newPlayer);
|
|
118
|
+
this.sendConfigMessage(newPlayer, { peerType: 'player', peerId: newPlayer.playerId });
|
|
97
119
|
}
|
|
98
120
|
onSFUConnected(ws, request) {
|
|
99
121
|
Logger.info(`New SFU connection: %s`, request.socket.remoteAddress);
|
|
@@ -106,7 +128,7 @@ export class SignallingServer {
|
|
|
106
128
|
this.playerRegistry.remove(newSFU);
|
|
107
129
|
Logger.info(`SFU %s (%s) disconnected.`, newSFU.streamerId, request.socket.remoteAddress);
|
|
108
130
|
});
|
|
109
|
-
this.sendConfigMessage(newSFU);
|
|
131
|
+
this.sendConfigMessage(newSFU, { peerType: 'sfu', peerId: newSFU.streamerId });
|
|
110
132
|
}
|
|
111
133
|
}
|
|
112
134
|
//# sourceMappingURL=SignallingServer.js.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"SignallingServer.js","sourceRoot":"","sources":["../../src/SignallingServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,10 +20,31 @@ export interface IServerConfig {
|
|
|
20
20
|
maxSubscribers?: number;
|
|
21
21
|
playerKeepaliveTimeout?: number;
|
|
22
22
|
authorizeStreamerId?: StreamerIdAuthorizer;
|
|
23
|
+
peerOptionsProvider?: PeerOptionsProvider;
|
|
23
24
|
}
|
|
24
25
|
export type ProtocolConfig = {
|
|
25
26
|
[key: string]: any;
|
|
26
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* The kind of peer a set of peer options is being built for. Provided so a consumer can vary what
|
|
30
|
+
* it returns by peer - a streamer connects once and holds its configuration for as long as it runs,
|
|
31
|
+
* where a player receives a fresh one every time it connects.
|
|
32
|
+
*/
|
|
33
|
+
export type PeerType = 'streamer' | 'player' | 'sfu';
|
|
34
|
+
/**
|
|
35
|
+
* Describes the peer that is about to be sent a config message.
|
|
36
|
+
*/
|
|
37
|
+
export interface IPeerOptionsRequest {
|
|
38
|
+
peerType: PeerType;
|
|
39
|
+
peerId: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* An optional consumer-supplied hook that builds the peer configuration for one connecting peer.
|
|
43
|
+
* Return the object to send as peerConnectionOptions in that peer's config message. This is the
|
|
44
|
+
* seam for per-connection credentials without the project committing to a credential scheme of its
|
|
45
|
+
* own. A provider that throws is treated as having no answer, and the static peerOptions are sent.
|
|
46
|
+
*/
|
|
47
|
+
export type PeerOptionsProvider = (request: IPeerOptionsRequest) => unknown;
|
|
27
48
|
/**
|
|
28
49
|
* The main signalling server object.
|
|
29
50
|
* Contains a streamer and player registry and handles setting up of websockets
|
|
@@ -42,6 +63,11 @@ export declare class SignallingServer {
|
|
|
42
63
|
*/
|
|
43
64
|
constructor(config: IServerConfig);
|
|
44
65
|
private sendConfigMessage;
|
|
66
|
+
/**
|
|
67
|
+
* Resolves the peer options for one connecting peer, deferring to peerOptionsProvider when the
|
|
68
|
+
* consumer supplied one.
|
|
69
|
+
*/
|
|
70
|
+
private getPeerOptions;
|
|
45
71
|
private onStreamerConnected;
|
|
46
72
|
private onPlayerConnected;
|
|
47
73
|
private onSFUConnected;
|
package/eslint.config.mjs
CHANGED
package/jest.config.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
preset: "ts-jest",
|
|
3
|
+
testEnvironment: "node",
|
|
4
|
+
transform: {
|
|
5
|
+
"^.+\.ts$": [
|
|
6
|
+
"ts-jest",
|
|
7
|
+
{
|
|
8
|
+
tsconfig: "tsconfig.jest.json",
|
|
9
|
+
},
|
|
10
|
+
],
|
|
11
|
+
},
|
|
12
|
+
modulePathIgnorePatterns: ["<rootDir>/dist/"],
|
|
13
|
+
testPathIgnorePatterns: ["<rootDir>/dist/", "/node_modules/"],
|
|
14
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epicgames-ps/lib-pixelstreamingsignalling-ue5.8",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Basic signalling library for developers wishing to build applications that signal a Pixel Streaming application.",
|
|
5
5
|
"main": "dist/cjs/pixelstreamingsignalling.js",
|
|
6
6
|
"module": "dist/esm/pixelstreamingsignalling.js",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"rebuild": "npm run clean && npm run build",
|
|
15
15
|
"watch": "nodemon -V -d 3 --watch src --watch ../Common/dist -e \"ts,js,mjs,cjs,json\" --exec \"npm run build:cjs\"",
|
|
16
16
|
"lint": "eslint src",
|
|
17
|
-
"test": "
|
|
17
|
+
"test": "jest"
|
|
18
18
|
},
|
|
19
19
|
"author": "Epic Games",
|
|
20
20
|
"license": "MIT",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"@eslint/js": "^9.20.0",
|
|
23
23
|
"@types/cors": "^2.8.17",
|
|
24
24
|
"@types/express": "^5.0.0",
|
|
25
|
+
"@types/jest": "^29.5.14",
|
|
25
26
|
"@types/node": "^22.14.0",
|
|
26
27
|
"@types/ws": "^8.5.14",
|
|
27
28
|
"eslint": "^9.39.0",
|
|
@@ -29,9 +30,11 @@
|
|
|
29
30
|
"eslint-plugin-prettier": "^5.2.3",
|
|
30
31
|
"eslint-plugin-tsdoc": "^0.4.0",
|
|
31
32
|
"nodemon": "^3.1.9",
|
|
33
|
+
"jest": "^29.7.0",
|
|
32
34
|
"rimraf": "^6.0.1",
|
|
33
35
|
"typedoc": "^0.28.0",
|
|
34
36
|
"typedoc-plugin-markdown": "^4.4.2",
|
|
37
|
+
"ts-jest": "^29.2.5",
|
|
35
38
|
"typescript": "^5.7.3",
|
|
36
39
|
"typescript-eslint": "8.57.2"
|
|
37
40
|
},
|
package/src/PlayerConnection.ts
CHANGED
|
@@ -142,12 +142,22 @@ export class PlayerConnection implements IPlayer, LogUtils.IMessageLogger {
|
|
|
142
142
|
} else {
|
|
143
143
|
Logger.warn(`Subscribing to ${streamerId}`);
|
|
144
144
|
this.subscribe(streamerId);
|
|
145
|
+
// subscribe() declines silently, most often because maxSubscribers is reached, and
|
|
146
|
+
// says so only by leaving subscribedStreamer unset. Forwarding anyway dereferences
|
|
147
|
+
// null, which surfaces as an uncaughtException and exits the process.
|
|
148
|
+
if (!this.subscribedStreamer) {
|
|
149
|
+
Logger.error(
|
|
150
|
+
`Player ${this.playerId} could not be subscribed to ${streamerId}. Disconnecting.`
|
|
151
|
+
);
|
|
152
|
+
this.disconnect();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
145
155
|
}
|
|
146
156
|
}
|
|
147
157
|
|
|
148
158
|
message.playerId = this.playerId;
|
|
149
|
-
LogUtils.logForward(this, this.subscribedStreamer
|
|
150
|
-
this.subscribedStreamer
|
|
159
|
+
LogUtils.logForward(this, this.subscribedStreamer, message);
|
|
160
|
+
this.subscribedStreamer.protocol.sendMessage(message);
|
|
151
161
|
}
|
|
152
162
|
|
|
153
163
|
private subscribe(streamerId: string) {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
2
|
+
import { SignallingServer, IPeerOptionsRequest, PeerOptionsProvider } from './SignallingServer';
|
|
3
|
+
|
|
4
|
+
const STATIC_PEER_OPTIONS = { iceServers: [{ urls: ['stun:stun.example.com:19302'] }] };
|
|
5
|
+
|
|
6
|
+
const PLAYER_REQUEST: IPeerOptionsRequest = { peerType: 'player', peerId: 'player-1' };
|
|
7
|
+
|
|
8
|
+
// The constructor binds listening sockets and the class offers no way to close them, so a test that
|
|
9
|
+
// built a server properly would leak a listener per case. The peer options path depends on nothing
|
|
10
|
+
// the constructor sets up beyond these two fields, so we supply them directly.
|
|
11
|
+
function serverWith(provider?: PeerOptionsProvider): SignallingServer {
|
|
12
|
+
const server = Object.create(SignallingServer.prototype) as SignallingServer;
|
|
13
|
+
server.config = { streamerPort: 0, peerOptions: STATIC_PEER_OPTIONS, peerOptionsProvider: provider };
|
|
14
|
+
server.protocolConfig = { peerConnectionOptions: STATIC_PEER_OPTIONS };
|
|
15
|
+
return server;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getPeerOptions(server: SignallingServer, request: IPeerOptionsRequest): unknown {
|
|
19
|
+
// Private: called through the type system rather than exported, because the behaviour under test
|
|
20
|
+
// is what a connecting peer is sent, not a public API.
|
|
21
|
+
return (server as unknown as { getPeerOptions(request: IPeerOptionsRequest): unknown }).getPeerOptions(
|
|
22
|
+
request
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe('SignallingServer peer options', () => {
|
|
27
|
+
it('sends the configured peer options when no provider is supplied', () => {
|
|
28
|
+
expect(getPeerOptions(serverWith(), PLAYER_REQUEST)).toBe(STATIC_PEER_OPTIONS);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('sends what the provider returns', () => {
|
|
32
|
+
const minted = { iceServers: [{ urls: ['turn:turn.example.com:3478'], username: 'u' }] };
|
|
33
|
+
expect(
|
|
34
|
+
getPeerOptions(
|
|
35
|
+
serverWith(() => minted),
|
|
36
|
+
PLAYER_REQUEST
|
|
37
|
+
)
|
|
38
|
+
).toBe(minted);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('tells the provider which peer is connecting', () => {
|
|
42
|
+
const seen: IPeerOptionsRequest[] = [];
|
|
43
|
+
const server = serverWith((request) => {
|
|
44
|
+
seen.push(request);
|
|
45
|
+
return {};
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
getPeerOptions(server, PLAYER_REQUEST);
|
|
49
|
+
getPeerOptions(server, { peerType: 'streamer', peerId: 'UnknownStreamer' });
|
|
50
|
+
|
|
51
|
+
expect(seen).toEqual([
|
|
52
|
+
{ peerType: 'player', peerId: 'player-1' },
|
|
53
|
+
{ peerType: 'streamer', peerId: 'UnknownStreamer' }
|
|
54
|
+
]);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('falls back to the configured peer options when the provider throws', () => {
|
|
58
|
+
const server = serverWith(() => {
|
|
59
|
+
throw new Error('credential service unreachable');
|
|
60
|
+
});
|
|
61
|
+
expect(getPeerOptions(server, PLAYER_REQUEST)).toBe(STATIC_PEER_OPTIONS);
|
|
62
|
+
});
|
|
63
|
+
});
|
package/src/SignallingServer.ts
CHANGED
|
@@ -60,12 +60,46 @@ export interface IServerConfig {
|
|
|
60
60
|
// ships no authentication of its own. See StreamerIdAuthorizer. When omitted, the default
|
|
61
61
|
// behaviour is unchanged (requested id accepted, numeric suffix appended on collision).
|
|
62
62
|
authorizeStreamerId?: StreamerIdAuthorizer;
|
|
63
|
+
|
|
64
|
+
// Optional hook returning the peer configuration to send to a single connecting peer, in place
|
|
65
|
+
// of the static peerOptions. This is the seam for peer configuration that must not be shared
|
|
66
|
+
// between connections - time limited TURN credentials being the motivating case, since a static
|
|
67
|
+
// credential is sent to every peer that ever connects and cannot be changed without a redeploy.
|
|
68
|
+
// See PeerOptionsProvider. When omitted, every peer receives peerOptions unchanged.
|
|
69
|
+
peerOptionsProvider?: PeerOptionsProvider;
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
export type ProtocolConfig = {
|
|
66
73
|
[key: string]: any;
|
|
67
74
|
};
|
|
68
75
|
|
|
76
|
+
/**
|
|
77
|
+
* The kind of peer a set of peer options is being built for. Provided so a consumer can vary what
|
|
78
|
+
* it returns by peer - a streamer connects once and holds its configuration for as long as it runs,
|
|
79
|
+
* where a player receives a fresh one every time it connects.
|
|
80
|
+
*/
|
|
81
|
+
export type PeerType = 'streamer' | 'player' | 'sfu';
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Describes the peer that is about to be sent a config message.
|
|
85
|
+
*/
|
|
86
|
+
export interface IPeerOptionsRequest {
|
|
87
|
+
// The kind of peer connecting.
|
|
88
|
+
peerType: PeerType;
|
|
89
|
+
// The id the registry assigned this peer. For a streamer or an SFU this is the placeholder the
|
|
90
|
+
// registry allocates on connect, because a streamer is not named until it sends its endpointId
|
|
91
|
+
// message, which happens after it has been configured. A player id is final.
|
|
92
|
+
peerId: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* An optional consumer-supplied hook that builds the peer configuration for one connecting peer.
|
|
97
|
+
* Return the object to send as peerConnectionOptions in that peer's config message. This is the
|
|
98
|
+
* seam for per-connection credentials without the project committing to a credential scheme of its
|
|
99
|
+
* own. A provider that throws is treated as having no answer, and the static peerOptions are sent.
|
|
100
|
+
*/
|
|
101
|
+
export type PeerOptionsProvider = (request: IPeerOptionsRequest) => unknown;
|
|
102
|
+
|
|
69
103
|
/**
|
|
70
104
|
* The main signalling server object.
|
|
71
105
|
* Contains a streamer and player registry and handles setting up of websockets
|
|
@@ -133,15 +167,46 @@ export class SignallingServer {
|
|
|
133
167
|
}
|
|
134
168
|
}
|
|
135
169
|
|
|
136
|
-
private sendConfigMessage(
|
|
170
|
+
private sendConfigMessage(
|
|
171
|
+
connection: { sendMessage(msg: Messages.config): void },
|
|
172
|
+
peerRequest: IPeerOptionsRequest
|
|
173
|
+
): void {
|
|
137
174
|
// peer connection options is a general field with all optional fields;
|
|
138
175
|
// it doesnt play nice with mergePartial so we just add it verbatim
|
|
139
176
|
const message: Messages.config = MessageHelpers.createMessage(Messages.config, this.protocolConfig);
|
|
140
|
-
|
|
141
|
-
message.peerConnectionOptions = this.protocolConfig['peerConnectionOptions'];
|
|
177
|
+
message.peerConnectionOptions = this.getPeerOptions(peerRequest);
|
|
142
178
|
connection.sendMessage(message);
|
|
143
179
|
}
|
|
144
180
|
|
|
181
|
+
/**
|
|
182
|
+
* Resolves the peer options for one connecting peer, deferring to peerOptionsProvider when the
|
|
183
|
+
* consumer supplied one.
|
|
184
|
+
*/
|
|
185
|
+
private getPeerOptions(peerRequest: IPeerOptionsRequest): Messages.config['peerConnectionOptions'] {
|
|
186
|
+
if (!this.config.peerOptionsProvider) {
|
|
187
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
188
|
+
return this.protocolConfig['peerConnectionOptions'];
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
try {
|
|
192
|
+
// The provider is consumer code, so its return is unknown to us; it travels as an
|
|
193
|
+
// opaque blob in the config message either way.
|
|
194
|
+
return this.config.peerOptionsProvider(peerRequest) as Messages.config['peerConnectionOptions'];
|
|
195
|
+
} catch (error) {
|
|
196
|
+
// A provider is consumer code and may reach outside the process for a credential. If it
|
|
197
|
+
// fails we still send a config message, because a peer that never receives one simply
|
|
198
|
+
// waits forever with nothing in its log to explain why.
|
|
199
|
+
Logger.error(
|
|
200
|
+
'peerOptionsProvider threw for %s peer %s, falling back to the static peer options: %s',
|
|
201
|
+
peerRequest.peerType,
|
|
202
|
+
peerRequest.peerId,
|
|
203
|
+
error instanceof Error ? error.message : stringify(error)
|
|
204
|
+
);
|
|
205
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
206
|
+
return this.protocolConfig['peerConnectionOptions'];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
145
210
|
private onStreamerConnected(ws: wslib.WebSocket, request: http.IncomingMessage) {
|
|
146
211
|
Logger.info(`New streamer connection: %s`, request.socket.remoteAddress);
|
|
147
212
|
|
|
@@ -159,7 +224,7 @@ export class SignallingServer {
|
|
|
159
224
|
);
|
|
160
225
|
});
|
|
161
226
|
|
|
162
|
-
this.sendConfigMessage(newStreamer);
|
|
227
|
+
this.sendConfigMessage(newStreamer, { peerType: 'streamer', peerId: newStreamer.streamerId });
|
|
163
228
|
}
|
|
164
229
|
|
|
165
230
|
private onPlayerConnected(ws: wslib.WebSocket, request: http.IncomingMessage) {
|
|
@@ -193,7 +258,7 @@ export class SignallingServer {
|
|
|
193
258
|
};
|
|
194
259
|
}
|
|
195
260
|
|
|
196
|
-
this.sendConfigMessage(newPlayer);
|
|
261
|
+
this.sendConfigMessage(newPlayer, { peerType: 'player', peerId: newPlayer.playerId });
|
|
197
262
|
}
|
|
198
263
|
|
|
199
264
|
private onSFUConnected(ws: wslib.WebSocket, request: http.IncomingMessage) {
|
|
@@ -209,6 +274,6 @@ export class SignallingServer {
|
|
|
209
274
|
Logger.info(`SFU %s (%s) disconnected.`, newSFU.streamerId, request.socket.remoteAddress);
|
|
210
275
|
});
|
|
211
276
|
|
|
212
|
-
this.sendConfigMessage(newSFU);
|
|
277
|
+
this.sendConfigMessage(newSFU, { peerType: 'sfu', peerId: newSFU.streamerId });
|
|
213
278
|
}
|
|
214
279
|
}
|