/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2010, 2011 IBM Corporation
 */

// messages from the server to the client

module weinre {
    interface WeinreClientEvents {
    
        void clientRegistered(Object client);
        void targetRegistered(Object target);

        void clientUnregistered(string clientId);
        void targetUnregistered(string targetId);

        void connectionCreated(string clientId, string targetId);
        void connectionDestroyed(string clientId, string targetId);
        
        void sendCallback(string callbackId, Object result);
        
        void serverProperties(Object properties);
    };
}

