Apply review instructions

This commit is contained in:
arthuro555
2020-08-03 23:48:10 +02:00
parent f8250ec9aa
commit 003f251c9f
2 changed files with 193 additions and 126 deletions

View File

@@ -9,7 +9,7 @@ gdjs.evtTools.p2p = {
/**
* The peer to peer configuration.
*/
peerConfig: {debug:1}, // Enable logging of critical errors
peerConfig: { debug: 1 }, // Enable logging of critical errors
/**
* The p2p client.
@@ -50,45 +50,45 @@ gdjs.evtTools.p2p = {
/**
* Last error's message.
*/
lastError: "",
lastError: '',
/**
* True if a peer diconnected.
*/
peerDisconnected: false,
peerJustDisconnected: false,
/**
* The last peer that has disconnected.
*/
disconnectedPeer: "",
}
lastDisconnectedPeerId: '',
};
gdjs.evtTools.p2p.loadPeerJS = function() {
if(gdjs.evtTools.p2p.peer != null) return;
gdjs.evtTools.p2p.loadPeerJS = function () {
if (gdjs.evtTools.p2p.peer != null) return;
gdjs.evtTools.p2p.peer = new Peer(gdjs.evtTools.p2p.peerConfig);
gdjs.evtTools.p2p.peer.on("open", function() {
gdjs.evtTools.p2p.peer.on('open', function () {
gdjs.evtTools.p2p.ready = true;
});
gdjs.evtTools.p2p.peer.on("error", function(errorMessage) {
gdjs.evtTools.p2p.peer.on('error', function (errorMessage) {
gdjs.evtTools.p2p.error = true;
gdjs.evtTools.p2p.lastError = errorMessage;
});
gdjs.evtTools.p2p.peer.on("connection", gdjs.evtTools.p2p._onConnection);
gdjs.evtTools.p2p.peer.on("close", function() {
gdjs.evtTools.p2p.peer.on('connection', gdjs.evtTools.p2p._onConnection);
gdjs.evtTools.p2p.peer.on('close', function () {
gdjs.evtTools.p2p.peer = null;
gdjs.evtTools.p2p.loadPeerJS();
});
gdjs.evtTools.p2p.peer.on("disconnected", gdjs.evtTools.p2p.peer.reconnect);
}
gdjs.evtTools.p2p.peer.on('disconnected', gdjs.evtTools.p2p.peer.reconnect);
};
gdjs.evtTools.p2p._onConnection = function(connection) {
gdjs.evtTools.p2p._onConnection = function (connection) {
gdjs.evtTools.p2p.connections[connection.peer] = connection;
connection.on("data", function(data) {
if(data.eventName === undefined) return;
connection.on('data', function (data) {
if (data.eventName === undefined) return;
var dataLoss = gdjs.evtTools.p2p.eventHandling[data.eventName];
if (typeof dataLoss === "undefined" || dataLoss === false) {
if(typeof gdjs.evtTools.p2p.lastEventData[data.eventName] !== "object")
if (typeof dataLoss === 'undefined' || dataLoss === false) {
if (typeof gdjs.evtTools.p2p.lastEventData[data.eventName] !== 'object')
gdjs.evtTools.p2p.lastEventData[data.eventName] = [];
gdjs.evtTools.p2p.lastEventData[data.eventName].push(data.data);
} else {
@@ -96,38 +96,43 @@ gdjs.evtTools.p2p._onConnection = function(connection) {
gdjs.evtTools.p2p.lastEventData[data.eventName] = data.data;
}
});
connection.on("error", function() {
connection.on('error', function () {
// Close event is only for graceful disconnection, also handle error aka ungraceful disconnection
gdjs.evtTools.p2p._onDisconnect(connection.peer);
});
connection.on("close", function() {
connection.on('close', function () {
gdjs.evtTools.p2p._onDisconnect(connection.peer);
});
// Regularly check for disconnection as the built in way is not reliable.
var disconnectChecker = function() {
if (connection.peerConnection.connectionState == "failed" || connection.peerConnection.connectionState == "disconnected") {
var disconnectChecker = function () {
if (
connection.peerConnection.connectionState === 'failed' ||
connection.peerConnection.connectionState === 'disconnected'
) {
gdjs.evtTools.p2p._onDisconnect(connection.peer);
} else {
setTimeout(disconnectChecker, 500);
}
}
};
disconnectChecker();
}
};
gdjs.evtTools.p2p._onDisconnect = function(connectionID) {
gdjs.evtTools.p2p.peerDisconnected = true;
gdjs.evtTools.p2p.disconnectedPeer = connectionID;
gdjs.evtTools.p2p._onDisconnect = function (connectionID) {
gdjs.evtTools.p2p.peerJustDisconnected = true;
gdjs.evtTools.p2p.lastDisconnectedPeerId = connectionID;
delete gdjs.evtTools.p2p.connections[connectionID];
}
};
/**
* Connects to another p2p client.
* @param {string} id - The other client's id.
*/
gdjs.evtTools.p2p.connect = function(id) {
gdjs.evtTools.p2p.connect = function (id) {
var connection = gdjs.evtTools.p2p.peer.connect(id);
connection.on("open", function() { gdjs.evtTools.p2p._onConnection(connection) });
}
connection.on('open', function () {
gdjs.evtTools.p2p._onConnection(connection);
});
};
/**
* Returns true when the event got triggered by another p2p client.
@@ -135,23 +140,23 @@ gdjs.evtTools.p2p.connect = function(id) {
* @param {boolean} _dataLoss Is data loss allowed (accelerates event handling when true)?
* @returns {boolean}
*/
gdjs.evtTools.p2p.onEvent = function(eventName, _dataLoss) {
gdjs.evtTools.p2p.onEvent = function (eventName, _dataLoss) {
var dataLoss = gdjs.evtTools.p2p.eventHandling[eventName];
if (dataLoss == undefined) {
gdjs.evtTools.p2p.eventHandling[eventName] = _dataLoss;
return gdjs.evtTools.p2p.onEvent(eventName, _dataLoss);
}
if(dataLoss) {
if (dataLoss) {
var returnValue = gdjs.evtTools.p2p.triggeredEvents[eventName];
if(typeof returnValue === "undefined") return false;
if (typeof returnValue === 'undefined') return false;
gdjs.evtTools.p2p.triggeredEvents[eventName] = false;
return returnValue;
} else {
var returnValue = gdjs.evtTools.p2p.lastEventData[eventName];
if(typeof returnValue === "undefined") return false;
if (typeof returnValue === 'undefined') return false;
return returnValue.length !== 0;
}
}
};
/**
* Send an event to one specific connected client.
@@ -159,21 +164,27 @@ gdjs.evtTools.p2p.onEvent = function(eventName, _dataLoss) {
* @param {string} eventName - The event to trigger.
* @param {string} [eventData] - Additional data to send with the event.
*/
gdjs.evtTools.p2p.sendDataTo = function(id, eventName, eventData) {
if(gdjs.evtTools.p2p.connections[id])
gdjs.evtTools.p2p.connections[id].send({eventName: eventName, data: eventData});
}
gdjs.evtTools.p2p.sendDataTo = function (id, eventName, eventData) {
if (gdjs.evtTools.p2p.connections[id])
gdjs.evtTools.p2p.connections[id].send({
eventName: eventName,
data: eventData,
});
};
/**
* Send an event to all connected clients.
* @param {string} eventName - The event to trigger.
* @param {string} [eventData] - Additional data to send with the event.
*/
gdjs.evtTools.p2p.sendDataToAll = function(eventName, eventData) {
for(var id in gdjs.evtTools.p2p.connections) {
gdjs.evtTools.p2p.connections[id].send({eventName: eventName, data: eventData});
gdjs.evtTools.p2p.sendDataToAll = function (eventName, eventData) {
for (var id in gdjs.evtTools.p2p.connections) {
gdjs.evtTools.p2p.connections[id].send({
eventName: eventName,
data: eventData,
});
}
}
};
/**
* Send an event to one specific connected client.
@@ -181,62 +192,71 @@ gdjs.evtTools.p2p.sendDataToAll = function(eventName, eventData) {
* @param {string} eventName - The event to trigger.
* @param {gdjs.Variable} variable - Additional variable to send with the event.
*/
gdjs.evtTools.p2p.sendVariableTo = function(id, eventName, variable) {
if(gdjs.evtTools.p2p.connections[id])
gdjs.evtTools.p2p.sendVariableTo = function (id, eventName, variable) {
if (gdjs.evtTools.p2p.connections[id])
gdjs.evtTools.p2p.connections[id].send({
eventName: eventName,
data: gdjs.evtTools.network.variableStructureToJSON(variable)
eventName: eventName,
data: gdjs.evtTools.network.variableStructureToJSON(variable),
});
}
};
/**
* Send an event to all connected clients.
* @param {string} eventName - The event to trigger.
* @param {gdjs.Variable} variable - Additional variable to send with the event.
*/
gdjs.evtTools.p2p.sendVariableToAll = function(eventName, variable) {
for(var id in gdjs.evtTools.p2p.connections) {
gdjs.evtTools.p2p.sendVariableToAll = function (eventName, variable) {
for (var id in gdjs.evtTools.p2p.connections) {
gdjs.evtTools.p2p.connections[id].send({
eventName: eventName,
data: gdjs.evtTools.network.variableStructureToJSON(variable)
eventName: eventName,
data: gdjs.evtTools.network.variableStructureToJSON(variable),
});
}
}
};
/**
* Get some data associated to the last trigger of an event.
* @param {string} eventName - The event to get data from.
* @returns {string} - The data as JSON.
*/
gdjs.evtTools.p2p.getEventData = function(eventName) {
gdjs.evtTools.p2p.getEventData = function (eventName) {
var dataLoss = gdjs.evtTools.p2p.eventHandling[eventName];
if (typeof dataLoss === "undefined" || dataLoss === false) {
if (typeof dataLoss === 'undefined' || dataLoss === false) {
var event = gdjs.evtTools.p2p.lastEventData[eventName];
return event[event.length - 1];
} else {
return gdjs.evtTools.p2p.lastEventData[eventName];
}
}
};
/**
* Get a variable associated to the last trigger of an event.
* @param {string} eventName - The event to get the variable from.
* @param {gdjs.Variable} variable - The variable where to store the variable content.
*/
gdjs.evtTools.p2p.getEventVariable = function(eventName, variable) {
gdjs.evtTools.network.jsonToVariableStructure(gdjs.evtTools.p2p.getEventData(eventName), variable);
}
gdjs.evtTools.p2p.getEventVariable = function (eventName, variable) {
gdjs.evtTools.network.jsonToVariableStructure(
gdjs.evtTools.p2p.getEventData(eventName),
variable
);
};
/**
* Connects to a custom broker server.
* @param {string} host The host of the broker server
* @param {number} port
* @param {string} path The path (part of the url after the host) to the broker server
* @param {string} key Optional password to connect to the broker server
* @param {string} host The host of the broker server.
* @param {number} port The port of the broker server.
* @param {string} path The path (part of the url after the host) to the broker server.
* @param {string} key Optional password to connect to the broker server.
* @param {boolean} ssl Use ssl?
*/
gdjs.evtTools.p2p.useCustomBrokerServer = function(host, port, path, key, ssl) {
key = key.length === 0 ? "peerjs" : key; // All servers have "peerjs" as default key
gdjs.evtTools.p2p.useCustomBrokerServer = function (
host,
port,
path,
key,
ssl
) {
key = key.length === 0 ? 'peerjs' : key; // All servers have "peerjs" as default key
gdjs.evtTools.p2p.peerConfig = {
debug: 1,
host,
@@ -246,63 +266,74 @@ gdjs.evtTools.p2p.useCustomBrokerServer = function(host, port, path, key, ssl) {
key,
};
gdjs.evtTools.p2p.loadPeerJS();
}
};
/**
* Use default broker server. NOT RECOMMENDED.
* Use default broker server.
* This is not recommended for published games,
* this server should only be used for quick testing in development.
*/
gdjs.evtTools.p2p.useDefaultBrokerServer = function() {
gdjs.evtTools.p2p.useDefaultBrokerServer = function () {
gdjs.evtTools.p2p.loadPeerJS();
}
};
/**
* Returns the own current peer ID
* @see Peer.id
* @returns {string}
*/
gdjs.evtTools.p2p.getCurrentId = function() {
if(gdjs.evtTools.p2p.peer == undefined) return "";
return gdjs.evtTools.p2p.peer.id || "";
}
gdjs.evtTools.p2p.getCurrentId = function () {
if (gdjs.evtTools.p2p.peer == undefined) return '';
return gdjs.evtTools.p2p.peer.id || '';
};
/**
* Returns true once PeerJS is initialized
* @see gdjs.evtTools.p2p.ready
* @returns {boolean}
*/
gdjs.evtTools.p2p.isReady = function() {return gdjs.evtTools.p2p.ready;}
gdjs.evtTools.p2p.isReady = function () {
return gdjs.evtTools.p2p.ready;
};
/**
* Returns true once when there is an error.
* @returns {boolean}
*/
gdjs.evtTools.p2p.onError = function() {
gdjs.evtTools.p2p.onError = function () {
var returnValue = gdjs.evtTools.p2p.error;
gdjs.evtTools.p2p.error = false;
return returnValue;
}
};
gdjs.evtTools.p2p.getLastError = function() {
/**
* Returns the latest error message.
* @returns {boolean}
*/
gdjs.evtTools.p2p.getLastError = function () {
return gdjs.evtTools.p2p.lastError;
}
};
/**
* Returns true once a peer disconnected.
* @returns {boolean}
*/
gdjs.evtTools.p2p.onDisconnect = function() {
var returnValue = gdjs.evtTools.p2p.peerDisconnected;
gdjs.evtTools.p2p.peerDisconnected = false;
gdjs.evtTools.p2p.onDisconnect = function () {
var returnValue = gdjs.evtTools.p2p.peerJustDisconnected;
gdjs.evtTools.p2p.peerJustDisconnected = false;
return returnValue;
}
};
gdjs.evtTools.p2p.getDisconnectedPeer = function() {
return gdjs.evtTools.p2p.disconnectedPeer;
}
gdjs.evtTools.p2p.getDisconnectedPeer = function () {
return gdjs.evtTools.p2p.lastDisconnectedPeerId;
};
gdjs.callbacksRuntimeScenePostEvents.push(function() {
for(var i in gdjs.evtTools.p2p.lastEventData) {
if(typeof gdjs.evtTools.p2p.lastEventData[i] === "object" && gdjs.evtTools.p2p.lastEventData[i].length > 0)
gdjs.evtTools.p2p.lastEventData[i].length--;
gdjs.callbacksRuntimeScenePostEvents.push(function () {
for (var i in gdjs.evtTools.p2p.lastEventData) {
if (
typeof gdjs.evtTools.p2p.lastEventData[i] === 'object' &&
gdjs.evtTools.p2p.lastEventData[i].length > 0
)
gdjs.evtTools.p2p.lastEventData[i].pop();
}
});

View File

@@ -20,18 +20,22 @@ import { type ObjectsRenderingService, type ObjectsEditorService } from '../JsEx
*/
module.exports = {
createExtension: function(_/*: (string) => string */, gd/*: libGDevelop */) {
const extension/*: gdPlatformExtension */ = new gd.PlatformExtension();
extension.setExtensionInformation(
'P2P',
_('Peer-to-Peer communication (experimental)'),
_(
'Adds possibility to connect multiple game instances together via WebRTC (P2P)'
),
'Arthur Pacaud (arthuro555)',
'MIT'
)
.setExtensionHelpPath('/all-features/p2p');
createExtension: function (
_ /*: (string) => string */,
gd /*: libGDevelop */
) {
const extension /*: gdPlatformExtension */ = new gd.PlatformExtension();
extension
.setExtensionInformation(
'P2P',
_('Peer-to-Peer communication (experimental)'),
_(
'Adds possibility to connect multiple game instances together via WebRTC (P2P)'
),
'Arthur Pacaud (arthuro555)',
'MIT'
)
.setExtensionHelpPath('/all-features/p2p');
extension
.addCondition(
@@ -54,7 +58,9 @@ module.exports = {
.addCondition(
'IsReady',
_('Is P2P ready'),
_('True if the peer-to-peer extension initialized and is ready to use.'),
_(
'True if the peer-to-peer extension initialized and is ready to use.'
),
_('Is P2P ready?'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
@@ -69,7 +75,11 @@ module.exports = {
.addCondition(
'OnError',
_('An error occured'),
_('Triggers once when an error occurs.'),
_(
'Triggers once when an error occurs. ' +
'Use P2P::GetLastError() expression to get the content of the error ' +
'if you want to analyse it or display it to the user.'
),
_('P2P error occured'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
@@ -79,7 +89,7 @@ module.exports = {
.setIncludeFile('Extensions/P2P/A_peer.js')
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
.setFunctionName('gdjs.evtTools.p2p.onError');
extension
.addCondition(
'OnDisconnection',
@@ -99,7 +109,7 @@ module.exports = {
.addAction(
'Connect',
_('Connect to another client'),
_('Connects the current client to another client using its id'),
_('Connects the current client to another client using its id.'),
_('Connect to P2P client _PARAM0_'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
@@ -114,9 +124,9 @@ module.exports = {
extension
.addAction(
'UseOwnBroker',
_('Connect to own broker server'),
_('Connects to your own broker server.'),
_('Connect to broker server http://_PARAM0_:_PARAM1_/'),
_('Connect to a broker server'),
_('Connects the extension to a broker server.'),
_('Connect to the broker server at http://_PARAM0_:_PARAM1_/'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
@@ -134,9 +144,9 @@ module.exports = {
extension
.addAction(
'UseDefaultBroker',
_('Connect to default broker server'),
_('Connect to the default broker server'),
_('Connects to the default broker server.'),
_('Connect to default broker server'),
_('Connect to the default broker server'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
@@ -151,7 +161,9 @@ module.exports = {
'SendToAll',
_('Trigger event on all connected clients'),
_('Triggers an event on all connected clients'),
_('Trigger event _PARAM0_ on all connected clients (extra data: _PARAM1_)'),
_(
'Trigger event _PARAM0_ on all connected clients (extra data: _PARAM1_)'
),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
@@ -181,18 +193,25 @@ module.exports = {
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
.setFunctionName('gdjs.evtTools.p2p.sendDataTo');
extension
extension
.addAction(
'SendToAllVariable',
_('Trigger event on all connected clients (variable)'),
_('Triggers an event on all connected clients'),
_('Trigger event _PARAM0_ on all connected clients (extra data: _PARAM1_)'),
_(
'Trigger event _PARAM0_ on all connected clients (extra data: _PARAM1_)'
),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
.addParameter('string', _('Event name'), '', false)
.addParameter('scenevar', _('Variable containing the extra data'), '', false)
.addParameter(
'scenevar',
_('Variable containing the extra data'),
'',
false
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/P2P/A_peer.js')
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
@@ -210,7 +229,12 @@ module.exports = {
)
.addParameter('string', _('ID of the other client'), '', false)
.addParameter('string', _('Event name'), '', false)
.addParameter('scenevar', _('Variable containing the extra data'), '', false)
.addParameter(
'scenevar',
_('Variable containing the extra data'),
'',
false
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/P2P/A_peer.js')
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
@@ -221,16 +245,23 @@ module.exports = {
'GetEventVariable',
_('Get event data (variable)'),
_(
'Store the data of the specified event in a variable. ' +
'Check in the conditions that the event was received using the "Event received" condition.'
'Store the data of the specified event in a variable. ' +
'Check in the conditions that the event was received using the "Event received" condition.'
),
_(
'Overwrite _PARAM1_ with variable sent with last trigger of _PARAM0_'
),
_('Overwrite _PARAM1_ with variable sent with last trigger of _PARAM0_'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg',
'JsPlatform/Extensions/p2picon.svg'
)
.addParameter('string', _('Event name'), '', false)
.addParameter('scenevar', _('Variable where to store the received data'), '', false)
.addParameter(
'scenevar',
_('Variable where to store the received data'),
'',
false
)
.getCodeExtraInformation()
.setIncludeFile('Extensions/P2P/A_peer.js')
.addIncludeFile('Extensions/P2P/B_p2ptools.js')
@@ -240,7 +271,9 @@ module.exports = {
.addStrExpression(
'GetEventData',
_('Get event data'),
_('Returns the data received when the specified event was last triggered'),
_(
'Returns the data received when the specified event was last triggered'
),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg'
)
@@ -254,7 +287,7 @@ module.exports = {
.addStrExpression(
'GetID',
_('Get client ID'),
_('Gets the current client ID of the current game instance'),
_('Gets the client ID of the current game instance'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg'
)
@@ -265,7 +298,7 @@ module.exports = {
extension
.addStrExpression(
'GetError',
'GetLastError',
_('Get last error'),
_('Gets the description of the last P2P error'),
_('P2P (experimental)'),
@@ -278,8 +311,8 @@ module.exports = {
extension
.addStrExpression(
'GetDisconnectedPeer',
_('Get disconnected peer'),
'GetLastDisconnectedPeer',
_('Get last disconnected peer'),
_('Gets the id of the latest peer that has disconnected.'),
_('P2P (experimental)'),
'JsPlatform/Extensions/p2picon.svg'
@@ -291,7 +324,10 @@ module.exports = {
return extension;
},
runExtensionSanityTests: function(gd /*: libGDevelop */, extension /*: gdPlatformExtension*/) {
runExtensionSanityTests: function (
gd /*: libGDevelop */,
extension /*: gdPlatformExtension*/
) {
return [];
},
};