Spaces:
				
			
			
	
			
			
		Runtime error
		
	
	
	
			
			
	
	
	
	
		
		
		Runtime error
		
	| const Variable = require('../engine/variable'); | |
| const log = require('../util/log'); | |
| class Cloud { | |
| /** | |
| * @typedef updateVariable | |
| * @param {string} name The name of the cloud variable to update on the server | |
| * @param {(string | number)} value The value to update the cloud variable with. | |
| */ | |
| /** | |
| * A cloud data provider, responsible for managing the connection to the | |
| * cloud data server and for posting data about cloud data activity to | |
| * this IO device. | |
| * @typedef {object} CloudProvider | |
| * @property {updateVariable} updateVariable A function which sends a cloud variable | |
| * update to the cloud data server. | |
| * @property {Function} requestCloseConnection A function which closes | |
| * the connection to the cloud data server. | |
| */ | |
| /** | |
| * Part of a cloud io data post indicating a cloud variable update. | |
| * @typedef {object} VarUpdateData | |
| * @property {string} name The name of the variable to update | |
| * @property {(number | string)} value The scalar value to update the variable with | |
| */ | |
| /** | |
| * A cloud io data post message. | |
| * @typedef {object} CloudIOData | |
| * @property {VarUpdateData} varUpdate A {@link VarUpdateData} message indicating | |
| * a cloud variable update | |
| */ | |
| /** | |
| * Cloud IO Device responsible for sending and receiving messages from | |
| * cloud provider (mananging the cloud server connection) and interacting | |
| * with cloud variables in the current project. | |
| * @param {Runtime} runtime The runtime context for this cloud io device. | |
| */ | |
| constructor (runtime) { | |
| /** | |
| * Reference to the cloud data provider, responsible for mananging | |
| * the web socket connection to the cloud data server. | |
| * @type {?CloudProvider} | |
| */ | |
| this.provider = null; | |
| /** | |
| * Reference to the runtime that owns this cloud io device. | |
| * @type {!Runtime} | |
| */ | |
| this.runtime = runtime; | |
| /** | |
| * Reference to the stage target which owns the cloud variables | |
| * in the project. | |
| * @type {?Target} | |
| */ | |
| this.stage = null; | |
| } | |
| /** | |
| * Set a reference to the cloud data provider. | |
| * @param {CloudProvider} provider The cloud data provider | |
| */ | |
| setProvider (provider) { | |
| this.provider = provider; | |
| } | |
| /** | |
| * Set a reference to the stage target which owns the | |
| * cloud variables in the project. | |
| * @param {Target} stage The stage target | |
| */ | |
| setStage (stage) { | |
| this.stage = stage; | |
| } | |
| /** | |
| * Handle incoming data to this io device. | |
| * @param {CloudIOData} data The {@link CloudIOData} object to process | |
| */ | |
| postData (data) { | |
| if (data.varUpdate) { | |
| this.updateCloudVariable(data.varUpdate); | |
| } | |
| } | |
| requestCreateVariable (variable) { | |
| if (this.runtime.canAddCloudVariable()) { | |
| if (this.provider) { | |
| this.provider.createVariable(variable.name, variable.value); | |
| // We'll set the cloud flag and update the | |
| // cloud variable limit when we actually | |
| // get a confirmation from the cloud data server | |
| } | |
| } // TODO else track creation for later | |
| } | |
| /** | |
| * Request the cloud data provider to update the given variable with | |
| * the given value. Does nothing if this io device does not have a provider set. | |
| * @param {string} name The name of the variable to update | |
| * @param {string | number} value The value to update the variable with | |
| */ | |
| requestUpdateVariable (name, value) { | |
| if (this.provider) { | |
| this.provider.updateVariable(name, value); | |
| } | |
| } | |
| /** | |
| * Request the cloud data provider to rename the variable with the given name | |
| * to the given new name. Does nothing if this io device does not have a provider set. | |
| * @param {string} oldName The name of the variable to rename | |
| * @param {string | number} newName The new name for the variable | |
| */ | |
| requestRenameVariable (oldName, newName) { | |
| if (this.provider) { | |
| this.provider.renameVariable(oldName, newName); | |
| } | |
| } | |
| /** | |
| * Request the cloud data provider to delete the variable with the given name | |
| * Does nothing if this io device does not have a provider set. | |
| * @param {string} name The name of the variable to delete | |
| */ | |
| requestDeleteVariable (name) { | |
| if (this.provider) { | |
| this.provider.deleteVariable(name); | |
| } | |
| } | |
| /** | |
| * Update a cloud variable in the runtime based on the message received | |
| * from the cloud provider. | |
| * @param {VarData} varUpdate A {@link VarData} object describing | |
| * a cloud variable update received from the cloud data provider. | |
| */ | |
| updateCloudVariable (varUpdate) { | |
| const varName = varUpdate.name; | |
| const variable = this.stage.lookupVariableByNameAndType(varName, Variable.SCALAR_TYPE); | |
| if (!variable || !variable.isCloud) { | |
| log.warn(`Received an update for a cloud variable that does not exist: ${varName}`); | |
| return; | |
| } | |
| variable.value = varUpdate.value; | |
| } | |
| /** | |
| * Request the cloud data provider to close the web socket connection and | |
| * clear this io device of references to the cloud data provider and the | |
| * stage. | |
| */ | |
| clear () { | |
| if (!this.provider) return; | |
| this.provider.requestCloseConnection(); | |
| this.provider = null; | |
| this.stage = null; | |
| } | |
| } | |
| module.exports = Cloud; | |
