fixed spelling, including "experimental" in API

This commit is contained in:
breyed
2013-06-08 11:03:11 -05:00
parent 2e2a8e4346
commit 808a8ce0a9
40 changed files with 76 additions and 76 deletions

View File

@@ -128,7 +128,7 @@ env.Append(CPPPATH = ['#'])
##### Set up C++11 environment
polyfill_libs = [] # boost libraries used as drop in replacements for incomplete
# C++11 STL implimentations
# C++11 STL implementations
env_cpp11 = env.Clone ()
if env_cpp11['CXX'].startswith('g++'):

View File

@@ -63,7 +63,7 @@ public:
if (it == m_connections.end()) {
// this connection is not in the list. This really shouldn't happen
// and probably means something else is wrong.
throw std::invalid_argument("No data avaliable for session");
throw std::invalid_argument("No data available for session");
}
return it->second;

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('broadcast_server', ["broadcast_server.cpp"], LIBS = ALL_LIBS)

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('echo_client', ["echo_client.cpp"], LIBS = ALL_LIBS)

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('echo_server', ["echo_server.cpp"], LIBS = ALL_LIBS)

View File

@@ -13,7 +13,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs] + [tls_libs]
prgs += env_cpp11.Program('echo_server_tls', ["echo_server_tls.cpp"], LIBS = ALL_LIBS)

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('iostream_server', ["iostream_server.cpp"], LIBS = ALL_LIBS)

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('print_server', ["print_server.cpp"], LIBS = ALL_LIBS)

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('subprotocol_server', ["subprotocol_server.cpp"], LIBS = ALL_LIBS)

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('telemetry_client', ["telemetry_client.cpp"], LIBS = ALL_LIBS)

View File

@@ -12,7 +12,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs]
prgs += env_cpp11.Program('testee_server', ["testee_server.cpp"], LIBS = ALL_LIBS)

View File

@@ -13,7 +13,7 @@ env_cpp11 = env_cpp11.Clone ()
prgs = []
# if a C++11 environment is avaliable build using that, otherwise use boost
# if a C++11 environment is available build using that, otherwise use boost
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs] + [tls_libs]
prgs += env_cpp11.Program('utility_client', ["utility_client.cpp"], LIBS = ALL_LIBS)

View File

@@ -1,16 +1,16 @@
WebSocket++ (0.3.x branch)
==========================
WebSocket++ is a header only C++ library that impliments RFC6455 The WebSocket
WebSocket++ is a header only C++ library that implements RFC6455 The WebSocket
Protocol. It allows integrating WebSocket client and server functionality into
C++ programs. It uses interchangable network transport modules including one
C++ programs. It uses interchangeable network transport modules including one
based on C++ iostreams and one based on Boost Asio.
*This branch is no longer "experimental". It represents the current edge release
of the WebSocket++ library. The API of 0.3.x has some significant changes from
0.2.x, so care should be taken when upgrading.*
*This branch's API is relatively stable now. Features implimented so far are
*This branch's API is relatively stable now. Features implemented so far are
unlikely to change (except where explicitly noted). New features will be added
regularly until parity with the 0.2 branch is reached.*
@@ -25,7 +25,7 @@ Major Features
* Message/event based interface
* Supports secure WebSockets (TLS), IPv6, and explicit proxies.
* Flexible dependency management (C++11 Standard Library or Boost)
* Interchangable network transport modules (iostream and Boost Asio)
* Interchangeable network transport modules (iostream and Boost Asio)
* Portible, cross platform and architecture design
Get Involved

View File

@@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE( invalid_websocket_version ) {
BOOST_CHECK_EQUAL(run_server_test(s,input), output);
}
BOOST_AUTO_TEST_CASE( unimplimented_websocket_version ) {
BOOST_AUTO_TEST_CASE( unimplemented_websocket_version ) {
std::string input = "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 14\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nOrigin: http://www.example.com\r\n\r\n";
std::string output = "HTTP/1.1 400 Bad Request\r\nSec-WebSocket-Version: 0,7,8,13\r\nServer: test\r\n\r\n";

View File

@@ -197,7 +197,7 @@ struct core {
* for debugging and presenting useful errors to end users but may be
* undesirable for security reasons in some production environments.
* Close reasons could be used by an attacker to confirm that the endpoint
* is out of resources or be used to identify the WebSocket implimentation
* is out of resources or be used to identify the WebSocket implementation
* in use.
*
* Note: this will suppress *all* close codes, including those explicitly

View File

@@ -198,7 +198,7 @@ struct core_client {
* for debugging and presenting useful errors to end users but may be
* undesirable for security reasons in some production environments.
* Close reasons could be used by an attacker to confirm that the endpoint
* is out of resources or be used to identify the WebSocket implimentation
* is out of resources or be used to identify the WebSocket implementation
* in use.
*
* Note: this will suppress *all* close codes, including those explicitly

View File

@@ -198,7 +198,7 @@ struct debug_core {
* for debugging and presenting useful errors to end users but may be
* undesirable for security reasons in some production environments.
* Close reasons could be used by an attacker to confirm that the endpoint
* is out of resources or be used to identify the WebSocket implimentation
* is out of resources or be used to identify the WebSocket implementation
* in use.
*
* Note: this will suppress *all* close codes, including those explicitly

View File

@@ -88,7 +88,7 @@ namespace status {
GOOD = 0, // no failure yet!
SYSTEM = 1, // system call returned error, check that code
WEBSOCKET = 2, // websocket close codes contain error
UNKNOWN = 3, // No failure information is avaliable
UNKNOWN = 3, // No failure information is available
TIMEOUT_TLS = 4, // TLS handshake timed out
TIMEOUT_WS = 5 // WS handshake timed out
};
@@ -97,8 +97,8 @@ namespace status {
namespace internal_state {
// More granular internal states. These are used for multi-threaded
// connection syncronization and preventing values that are not yet or no
// longer avaliable from being used.
// connection synchronization and preventing values that are not yet or no
// longer available from being used.
enum value {
USER_INIT = 0,
@@ -271,7 +271,7 @@ public:
* period. It is specified in milliseconds.
*
* This can be used to probe the health of the remote endpoint's WebSocket
* implimentation. This does not guarantee that the remote application
* implementation. This does not guarantee that the remote application
* itself is still healthy but can be a useful diagnostic.
*
* Note: receipt of this callback doesn't mean the pong will never come.

View File

@@ -39,9 +39,9 @@ namespace websocketpp {
/**
* Some generic information about extensions
*
* Each extension object has an implimented flag. It can be retrieved by calling
* is_implimented(). This compile time flag indicates whether or not the object
* in question actually impliments the extension or if it is a placeholder stub
* Each extension object has an implemented flag. It can be retrieved by calling
* is_implemented(). This compile time flag indicates whether or not the object
* in question actually implements the extension or if it is a placeholder stub
*
* Each extension object also has an enabled flag. It can be retrieved by
* calling is_enabled(). This runtime flag indicates whether or not the

View File

@@ -43,7 +43,7 @@ namespace permessage_deflate {
/// Stub class for use when disabling permessage_deflate extension
/**
* This class is a stub that impliments the permessage_deflate interface
* This class is a stub that implements the permessage_deflate interface
* with minimal dependencies. It is used to disable permessage_deflate
* functionality at compile time without loading any unnecessary code.
*/
@@ -59,7 +59,7 @@ public:
/// Returns true if the extension is capable of providing
/// permessage_deflate functionality
bool is_implimented() const {
bool is_implemented() const {
return false;
}

View File

@@ -410,7 +410,7 @@ private:
* Template parameter econfig defines compile time types, constants, and
* settings. It should be a struct with the following members:
*
* request_type (type) A type that impliments the http::request interface
* request_type (type) A type that implements the http::request interface
*
* allow_disabling_context_takeover (static const bool) whether or not to
* disable context takeover when the other endpoint requests it.
@@ -422,7 +422,7 @@ private:
*
*
* Methods:
* permessage_deflate::enabled does not define or impliment any methods
* permessage_deflate::enabled does not define or implement any methods
* itself. It uses the attribute list to determine
*
*
@@ -533,8 +533,8 @@ public:
return ret;
}
/// Returns true if this object impliments permessage_deflate functionality
bool is_implimented() const {
/// Returns true if this object implements permessage_deflate functionality
bool is_implemented() const {
return true;
}

View File

@@ -773,7 +773,7 @@ inline void word_mask_exact(uint8_t* data, size_t length, const
*
* word_mask returns a copy of prepared_key circularly shifted based on the
* length value. The returned value may be fed back into word_mask when more
* data is avaliable.
* data is available.
*
* input and output must both have length at least:
* ceil(length/sizeof(size_t))*sizeof(size_t)

View File

@@ -129,7 +129,7 @@ namespace http {
request_header_fields_too_large = 431,
internal_server_error = 500,
not_implimented = 501,
not_implemented = 501,
bad_gateway = 502,
service_unavailable = 503,
gateway_timeout = 504,
@@ -223,7 +223,7 @@ namespace http {
return "Request Header Fields Too Large";
case internal_server_error:
return "Internal Server Error";
case not_implimented:
case not_implemented:
return "Not Implimented";
case bad_gateway:
return "Bad Gateway";

View File

@@ -273,7 +273,7 @@ inline size_t response::process_body(const char *buf, size_t len) {
to_read = m_read;
m_state = DONE;
} else {
// we need more bytes than are avaliable, read them all
// we need more bytes than are available, read them all
to_read = len;
}

View File

@@ -67,7 +67,7 @@ public:
* final header delimiters.
*
* Consume is a streaming processor. It may be called multiple times on one
* request and the full headers need not be avaliable before processing can
* request and the full headers need not be available before processing can
* begin. If the end of the request was reached during this call to consume
* the ready flag will be set. Further calls to consume once ready will be
* ignored.

View File

@@ -69,7 +69,7 @@ public:
* final header delimiters.
*
* Consume is a streaming processor. It may be called multiple times on one
* response and the full headers need not be avaliable before processing can
* response and the full headers need not be available before processing can
* begin. If the end of the response was reached during this call to consume
* the ready flag will be set. Further calls to consume once ready will be
* ignored.

View File

@@ -564,7 +564,7 @@ void connection<config>::start() {
"Start must be called from user init state"
);
// Depending on how the transport impliments init this function may return
// Depending on how the transport implements init this function may return
// immediately and call handle_transport_init later or call
// handle_transport_init from this function.
transport_con_type::init(
@@ -994,7 +994,7 @@ bool connection<config>::process_handshake_request() {
m_response.set_status(http::status_code::bad_request);
return false;
} else {
// extension negotiation succeded, set response header accordingly
// extension negotiation succeeded, set response header accordingly
// we don't send an empty extensions header because it breaks many
// clients.
if (neg_results.second.size() > 0) {
@@ -1660,7 +1660,7 @@ lib::error_code connection<config>::send_close_frame(close::status::value code,
const std::string &reason, bool ack, bool terminal)
{
m_alog.write(log::alevel::devel,"send_close_frame");
// If silent close is set, repsect it and blank out close information
// If silent close is set, respect it and blank out close information
// Otherwise use whatever has been specified in the parameters. If
// parameters specifies close::status::blank then determine what to do
// based on whether or not this is an ack. If it is not an ack just

View File

@@ -50,7 +50,7 @@ namespace message_buffer {
* requested from the manager the requester and it's associated downstream code
* may keep a pointer to the message indefinitely at a cost of extra resource
* usage. Once the reference count drops to the point where the manager is the
* only reference the messages is recycled using whatever method is implimented
* only reference the messages is recycled using whatever method is implemented
* in the manager.
*
* # endpoint_message_manager:
@@ -156,7 +156,7 @@ public:
/// Get whether or not the message is terminal
/**
* Messages can be flagged as terminal, which results in the connection
* being close after they are written rather than the implimentation going
* being close after they are written rather than the implementation going
* on to the next message in the queue. This is typically used internally
* for close messages only.
*/

View File

@@ -49,7 +49,7 @@ namespace message_buffer {
* requested from the manager the requester and it's associated downstream code
* may keep a pointer to the message indefinitely at a cost of extra resource
* usage. Once the reference count drops to the point where the manager is the
* only reference the messages is recycled using whatever method is implimented
* only reference the messages is recycled using whatever method is implemented
* in the manager.
*
* # endpoint_message_manager:

View File

@@ -124,8 +124,8 @@ enum processor_errors {
/// Invalid UTF-8 encoding
invalid_utf8,
/// Operation required not implimented functionality
not_implimented,
/// Operation required not implemented functionality
not_implemented,
/// Invalid HTTP method
invalid_http_method,
@@ -206,8 +206,8 @@ public:
return "64 bit frames are not supported on 32 bit systems";
case error::invalid_utf8:
return "Invalid UTF8 encoding";
case error::not_implimented:
return "Operation required not implimented functionality";
case error::not_implemented:
return "Operation required not implemented functionality";
case error::invalid_http_method:
return "Invalid HTTP method.";
case error::invalid_http_version:
@@ -256,7 +256,7 @@ inline lib::error_code make_error_code(error::processor_errors e) {
* returned.
*
* If the error isn't normally associated with reasons to close a connection
* (such as errors intended to be used interally or delivered to client
* (such as errors intended to be used internally or delivered to client
* applications, ex: invalid arguments) then
* close::status::internal_endpoint_error is returned.
*/

View File

@@ -260,7 +260,7 @@ public:
// 0x00, the message is complete and is dispatched. Then we go back to
// header state.
//ec = make_error_code(error::not_implimented);
//ec = make_error_code(error::not_implemented);
return p;
}

View File

@@ -88,7 +88,7 @@ public:
}
bool has_permessage_deflate() const {
return m_permessage_deflate.is_implimented();
return m_permessage_deflate.is_implemented();
}
err_str_pair negotiate_extensions(const request_type& req) {
@@ -117,7 +117,7 @@ public:
typename request_type::parameter_list::const_iterator it;
if (m_permessage_deflate.is_implimented()) {
if (m_permessage_deflate.is_implemented()) {
err_str_pair neg_ret;
for (it = p.begin(); it != p.end(); ++it) {
// look through each extension, if the key is permessage-deflate

View File

@@ -173,9 +173,9 @@ public:
/// understands.
virtual int get_version() const = 0;
/// Returns whether or not the permessage_compress extension is implimented
/// Returns whether or not the permessage_compress extension is implemented
/**
* Compile time flag that indicates whether this processor has implimented
* Compile time flag that indicates whether this processor has implemented
* the permessage_compress extension. By default this is false.
*/
virtual bool has_permessage_compress() const {
@@ -289,10 +289,10 @@ public:
/// Retrieves the most recently processed message
/**
* Retrieves a shared pointer to the recently completed message if there is
* one. If ready() returns true then there is a message avaliable.
* one. If ready() returns true then there is a message available.
* Retrieving the message with get_message will reset the state of ready.
* As such, each new message may be retrieved only once. Calling get_message
* when there is no message avaliable will result in a null pointer being
* when there is no message available will result in a null pointer being
* returned.
*
* @return A pointer to the most recently processed message or a null shared

View File

@@ -53,7 +53,7 @@ typedef lib::function<void(connection_hdl)> tcp_init_handler;
/// Boost Asio based connection transport component
/**
* transport::asio::connection impliments a connection transport component using
* transport::asio::connection implements a connection transport component using
* Boost ASIO that works with the transport::asio::endpoint endpoint transport
* component.
*/
@@ -349,7 +349,7 @@ protected:
m_alog.write(log::alevel::devel,"asio connection init");
}
// TODO: pre-init timeout. Right now no implimented socket policies
// TODO: pre-init timeout. Right now no implemented socket policies
// actually have an asyncronous pre-init
socket_con_type::pre_init(
@@ -620,7 +620,7 @@ protected:
if (m_proxy_data->res.get_status_code() != http::status_code::ok) {
// got an error response back
// TODO: expose this error in a programatically accessible way?
// TODO: expose this error in a programmatically accessible way?
// if so, see below for an option on how to do this.
std::stringstream s;
s << "Proxy connection error: "

View File

@@ -46,7 +46,7 @@ namespace asio {
/// Boost Asio based endpoint transport component
/**
* transport::asio::endpoint impliments an endpoint transport component using
* transport::asio::endpoint implements an endpoint transport component using
* Boost ASIO.
*/
template <typename config>

View File

@@ -39,13 +39,13 @@
#include <iostream>
#include <string>
// Interface that sockets/security policies must impliment
// Interface that sockets/security policies must implement
/**
* Endpoint Interface
*
* bool is_secure() const;
* @return Wether or not the endpoint creates secure connections
* @return Whether or not the endpoint creates secure connections
*
* lib::error_code init(socket_con_ptr scon);
* Called by the transport after a new connection is created to initialize

View File

@@ -45,7 +45,7 @@ typedef lib::function<void(connection_hdl,boost::asio::ip::tcp::socket&)>
/// Basic Boost ASIO connection socket component
/**
* transport::asio::basic_socket::connection impliments a connection socket
* transport::asio::basic_socket::connection implements a connection socket
* component using Boost ASIO ip::tcp::socket.
*/
class connection {
@@ -67,7 +67,7 @@ public:
/// Check whether or not this connection is secure
/**
* @return Wether or not this connection is secure
* @return Whether or not this connection is secure
*/
bool is_secure() const {
return false;
@@ -235,7 +235,7 @@ private:
/// Basic ASIO endpoint socket component
/**
* transport::asio::basic_socket::endpoint impliments an endpoint socket
* transport::asio::basic_socket::endpoint implements an endpoint socket
* component that uses Boost ASIO's ip::tcp::socket.
*/
class endpoint {
@@ -253,7 +253,7 @@ public:
/// Checks whether the endpoint creates secure connections
/**
* @return Wether or not the endpoint creates secure connections
* @return Whether or not the endpoint creates secure connections
*/
bool is_secure() const {
return false;

View File

@@ -52,7 +52,7 @@ typedef lib::function<lib::shared_ptr<boost::asio::ssl::context>(connection_hdl)
/// TLS enabled Boost ASIO connection socket component
/**
* transport::asio::tls_socket::connection impliments a secure connection socket
* transport::asio::tls_socket::connection implements a secure connection socket
* component that uses Boost ASIO's ssl::stream to wrap an ip::tcp::socket.
*/
class connection {
@@ -80,7 +80,7 @@ public:
/// Check whether or not this connection is secure
/**
* @return Wether or not this connection is secure
* @return Whether or not this connection is secure
*/
bool is_secure() const {
return true;
@@ -286,7 +286,7 @@ private:
/// TLS enabled Boost ASIO endpoint socket component
/**
* transport::asio::tls_socket::endpoint impliments a secure endpoint socket
* transport::asio::tls_socket::endpoint implements a secure endpoint socket
* component that uses Boost ASIO's ssl::stream to wrap an ip::tcp::socket.
*/
class endpoint {
@@ -304,7 +304,7 @@ public:
/// Checks whether the endpoint creates secure connections
/**
* @return Wether or not the endpoint creates secure connections
* @return Whether or not the endpoint creates secure connections
*/
bool is_secure() const {
return true;

View File

@@ -47,7 +47,7 @@ typedef lib::function<void(connection_hdl,const lib::error_code&)> connect_handl
typedef lib::function<void()> endpoint_lock;
// Endpoint interface
// Methods a transport endpoint must impliment
// Methods a transport endpoint must implement
/// Initialize a connection
/**

View File

@@ -95,7 +95,7 @@ public:
/// Overloaded stream input operator
/**
* Attempts to read input from the given stream into the transport. Bytes
* will be extracted from the input stream to fullfill any pending reads.
* will be extracted from the input stream to fulfill any pending reads.
* Input in this manner will only read until the current read buffer has
* been filled. Then it will signal the library to process the input. If the
* library's input handler adds a new async_read, additional bytes will be
@@ -103,7 +103,7 @@ public:
*
* When this function returns one of the following conditions is true:
* - There is no outstanding read operation
* - There are no more bytes avaliable in the input stream
* - There are no more bytes available in the input stream
*
* You can use tellg() on the input stream to determine if all of the input
* bytes were read or not.
@@ -123,7 +123,7 @@ public:
/// Manual input supply
/**
* Copies bytes from buf into WebSocket++'s input buffers. Bytes will be
* copied from the supplied buffer to fullfull any pending library reads. It
* copied from the supplied buffer to fulfill any pending library reads. It
* will return the number of bytes successfully processed. If there are no
* pending reads readsome will return immediately. Not all of the bytes may
* be able to be read in one call
@@ -171,7 +171,7 @@ public:
/// Call back a function after a period of time.
/**
* Timers are not implimented in this transport. The timer pointer will
* Timers are not implemented in this transport. The timer pointer will
* always be empty. The handler will never be called.
*
* @param duration Length of time to wait in milliseconds