/*
 * 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.
 */
package flex.messaging;

/**
 * Interface to be notified when a FlexSession is created or destroyed. Implementations of this interface
 * may add themselves as session created listeners statically via <code>FlexSession.addSessionCreatedListener()</code>.
 * To listen for FlexSession destruction, the implementation class instance must add itself as a listener to
 * a specific FlexSession instance via the <code>addSessionDestroyedListener()</code> method.
 */
public interface FlexSessionListener {
    /**
     * Notification that a FlexSession was created.
     *
     * @param session The FlexSession that was created.
     */
    void sessionCreated(FlexSession session);

    /**
     * Notification that a FlexSession is about to be destroyed.
     *
     * @param session The FlexSession that will be destroyed.
     */
    void sessionDestroyed(FlexSession session);
}
