features-extras.wave.state.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of shindig-extras Show documentation
Show all versions of shindig-extras Show documentation
Provides extra, deprecated or extended functionality. The items here have unstable APIs and could change at any time.
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* 'License'); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
/**
* @fileoverview Provides classes for defining and managing the
* synchronized gadget state.
*/
/**
* Creates a new state object to hold properties of the gadget.
*
* @constructor
* @class This class contains state properties of the Gadget.
* @this {wave.State}
* @param {string=} opt_rpc rpc name
* @export
*/
wave.State = function(opt_rpc) {
this.setState_(null);
this.rpc_ = opt_rpc === undefined ? 'wave_gadget_state' : opt_rpc;
};
/**
* Retrieve a value from the synchronized state.
* As of now, get always returns a string. This will change at some point
* to return whatever was set.
*
* @param {string} key Value for the specified key to retrieve.
* @param {?string=} opt_default Optional default value if non-existant
* (optional).
* @return {?string} Object for the specified key or null if not found.
* @export
*/
wave.State.prototype.get = function(key, opt_default) {
if (key in this.state_) {
return this.state_[key];
}
return opt_default === undefined ? null: opt_default;
};
/**
* Retrieve the valid keys for the synchronized state.
*
* @return {Array.} set of keys
* @export
*/
wave.State.prototype.getKeys = function() {
var keys = [];
for (var key in this.state_) {
keys.push(key);
}
return keys;
};
/**
* Updates the state delta. This is an asynchronous call that
* will update the state and not take effect immediately. Creating
* any key with a null value will attempt to delete the key.
*
* @param {!Object.} delta Map of key-value pairs representing
* a delta of keys to update.
* @export
*/
wave.State.prototype.submitDelta = function(delta) {
gadgets.rpc.call(null, this.rpc_, null, delta);
};
/**
* Submits delta that contains only one key-value pair. Note that if value is
* null the key will be removed from the state.
* See submitDelta(delta) for semantic details.
*
* @param {string} key
* @param {?string} value
* @export
*/
wave.State.prototype.submitValue = function(key, value) {
var delta = {};
delta[key] = value;
this.submitDelta(delta);
};
/**
* Submits a delta to remove all key-values in the state.
*
* @export
*/
wave.State.prototype.reset = function() {
var delta = {};
for (var key in this.state_) {
delta[key] = null;
}
this.submitDelta(delta);
};
/**
* Pretty prints the current state object. Note this is a debug method
* only.
*
* @return {string} The stringified state.
* @export
*/
wave.State.prototype.toString = function() {
return wave.util.printJson(this.state_, true);
};
/**
* Set the state object to the given value.
*
* @param {Object.} state
*/
wave.State.prototype.setState_ = function(state) {
this.state_ = state || {};
};
/**
* Calculate a delta object that would turn this state into the state given
* in the parameter when applied to this state.
*
* @param {!Object.} state
* @return {!Object.} delta
*/
wave.State.prototype.calculateDelta_ = function(state) {
var delta = {};
for (var key in state) {
var hasKey = this.state_.hasOwnProperty(key);
if (!hasKey || (this.state_[key] != state[key])) {
delta[key] = state[key];
}
}
for (var key in this.state_) {
if (!state.hasOwnProperty(key)) {
delta[key] = null;
}
}
return delta;
};
/**
* Apply the given delta object to this state.
*
* @param {!Object.} delta
*/
wave.State.prototype.applyDelta_ = function(delta) {
this.state_ = this.state_ || {};
for (var key in delta) {
if (delta[key] != null) {
this.state_[key] = delta[key];
} else {
delete this.state_[key];
}
}
};
© 2015 - 2024 Weber Informatics LLC | Privacy Policy