1 //
2 // ========================================================================
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19 package org.eclipse.jetty.spdy.api;
20
21 import java.net.InetSocketAddress;
22 import java.util.EventListener;
23 import java.util.Set;
24 import java.util.concurrent.ExecutionException;
25 import java.util.concurrent.TimeoutException;
26
27 import org.eclipse.jetty.util.Callback;
28 import org.eclipse.jetty.util.Promise;
29
30 /**
31 * <p>A {@link Session} represents the client-side endpoint of a SPDY connection to a single origin server.</p>
32 * <p>Once a {@link Session} has been obtained, it can be used to open SPDY streams:</p>
33 * <pre>
34 * Session session = ...;
35 * SynInfo synInfo = new SynInfo(true);
36 * session.push(synInfo, new Stream.FrameListener.Adapter()
37 * {
38 * public void onReply(Stream stream, ReplyInfo replyInfo)
39 * {
40 * // Stream reply received
41 * }
42 * });
43 * </pre>
44 * <p>A {@link Session} is the active part of the endpoint, and by calling its API applications can generate
45 * events on the connection; conversely {@link SessionFrameListener} is the passive part of the endpoint, and
46 * has callbacks that are invoked when events happen on the connection.</p>
47 *
48 * @see SessionFrameListener
49 */
50 public interface Session
51 {
52 /**
53 * @return the SPDY protocol version used by this session
54 */
55 public short getVersion();
56
57 /**
58 * <p>Registers the given {@code listener} to be notified of session events.</p>
59 *
60 * @param listener the listener to register
61 * @see #removeListener(Listener)
62 */
63 public void addListener(Listener listener);
64
65 /**
66 * <p>Deregisters the give {@code listener} from being notified of session events.</p>
67 *
68 * @param listener the listener to deregister
69 * @see #addListener(Listener)
70 */
71 public void removeListener(Listener listener);
72
73 /**
74 * <p>Sends a SYN_FRAME to create a new {@link Stream SPDY stream}.</p>
75 * <p>Callers may use the returned Stream for example, to send data frames.</p>
76 *
77 * @param synInfo the metadata to send on stream creation
78 * @param listener the listener to invoke when events happen on the stream just created
79 * @return the stream that will be created
80 * @see #syn(SynInfo, StreamFrameListener, Promise)
81 */
82 public Stream syn(SynInfo synInfo, StreamFrameListener listener) throws ExecutionException, InterruptedException, TimeoutException;
83
84 /**
85 * <p>Sends asynchronously a SYN_FRAME to create a new {@link Stream SPDY stream}.</p>
86 * <p>Callers may pass a non-null completion callback to be notified of when the
87 * stream has been created and use the stream, for example, to send data frames.</p>
88 *
89 *
90 * @param synInfo the metadata to send on stream creation
91 * @param listener the listener to invoke when events happen on the stream just created
92 * @param promise the completion callback that gets notified of stream creation
93 * @see #syn(SynInfo, StreamFrameListener)
94 */
95 public void syn(SynInfo synInfo, StreamFrameListener listener, Promise<Stream> promise);
96
97 /**
98 * <p>Sends synchronously a RST_STREAM to abort a stream.</p>
99 *
100 * @param rstInfo the metadata to reset the stream
101 * @see #rst(RstInfo, Callback)
102 */
103 public void rst(RstInfo rstInfo) throws InterruptedException, ExecutionException, TimeoutException;
104
105 /**
106 * <p>Sends asynchronously a RST_STREAM to abort a stream.</p>
107 * <p>Callers may pass a non-null completion callback to be notified of when the
108 * reset has been actually sent.</p>
109 *
110 * @param rstInfo the metadata to reset the stream
111 * @param callback the completion callback that gets notified of reset's send
112 * @see #rst(RstInfo)
113 */
114 public void rst(RstInfo rstInfo, Callback callback);
115
116 /**
117 * <p>Sends synchronously a SETTINGS to configure the SPDY connection.</p>
118 *
119 * @param settingsInfo the metadata to send
120 * @see #settings(SettingsInfo, Callback)
121 */
122 public void settings(SettingsInfo settingsInfo) throws ExecutionException, InterruptedException, TimeoutException;
123
124 /**
125 * <p>Sends asynchronously a SETTINGS to configure the SPDY connection.</p>
126 * <p>Callers may pass a non-null completion callback to be notified of when the
127 * settings has been actually sent.</p>
128 *
129 *
130 * @param settingsInfo the metadata to send
131 * @param callback the completion callback that gets notified of settings' send
132 * @see #settings(SettingsInfo)
133 */
134 public void settings(SettingsInfo settingsInfo, Callback callback);
135
136 /**
137 * <p>Sends synchronously a PING, normally to measure round-trip time.</p>
138 *
139 * @see #ping(PingInfo, Promise)
140 * @param pingInfo
141 */
142 public PingResultInfo ping(PingInfo pingInfo) throws ExecutionException, InterruptedException, TimeoutException;
143
144 /**
145 * <p>Sends asynchronously a PING, normally to measure round-trip time.</p>
146 * <p>Callers may pass a non-null completion callback to be notified of when the
147 * ping has been actually sent.</p>
148 *
149 * @param pingInfo
150 * @param promise the completion callback that gets notified of ping's send
151 * @see #ping(PingInfo)
152 */
153 public void ping(PingInfo pingInfo, Promise<PingResultInfo> promise);
154
155 /**
156 * <p>Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.</p>
157 *
158 * @see #goAway(GoAwayInfo, Callback)
159 * @param goAwayInfo
160 */
161 public void goAway(GoAwayInfo goAwayInfo) throws ExecutionException, InterruptedException, TimeoutException;
162
163 /**
164 * <p>Closes gracefully this session, sending a GO_AWAY frame and then closing the TCP connection.</p>
165 * <p>Callers may pass a non-null completion callback to be notified of when the
166 * go away has been actually sent.</p>
167 *
168 * @param goAwayInfo
169 * @param callback the completion callback that gets notified of go away's send
170 * @see #goAway(GoAwayInfo)
171 */
172 public void goAway(GoAwayInfo goAwayInfo, Callback callback);
173
174 /**
175 * @return a snapshot of the streams currently active in this session
176 * @see #getStream(int)
177 */
178 public Set<Stream> getStreams();
179
180 /**
181 * @param streamId the id of the stream to retrieve
182 * @return the stream with the given stream id
183 * @see #getStreams()
184 */
185 public Stream getStream(int streamId);
186
187 /**
188 * @param key the attribute key
189 * @return an arbitrary object associated with the given key to this session
190 * @see #setAttribute(String, Object)
191 */
192 public Object getAttribute(String key);
193
194 /**
195 * @param key the attribute key
196 * @param value an arbitrary object to associate with the given key to this session
197 * @see #getAttribute(String)
198 * @see #removeAttribute(String)
199 */
200 public void setAttribute(String key, Object value);
201
202 /**
203 * @param key the attribute key
204 * @return the arbitrary object associated with the given key to this session
205 * @see #setAttribute(String, Object)
206 */
207 public Object removeAttribute(String key);
208
209 /**
210 * @return the local address of the underlying endpoint
211 */
212 public InetSocketAddress getLocalAddress();
213
214 /**
215 * @return the remote address of the underlying endpoint
216 */
217 public InetSocketAddress getRemoteAddress();
218
219 /**
220 * <p>Super interface for listeners with callbacks that are invoked on specific session events.</p>
221 */
222 public interface Listener extends EventListener
223 {
224 }
225
226 /**
227 * <p>Specialized listener that is invoked upon creation and removal of streams.</p>
228 */
229 public interface StreamListener extends Listener
230 {
231 /**
232 * <p>Callback invoked when a new SPDY stream is created.</p>
233 *
234 * @param stream the stream just created
235 */
236 public void onStreamCreated(Stream stream);
237
238 /**
239 * <p>Callback invoked when a SPDY stream is closed.</p>
240 *
241 * @param stream the stream just closed.
242 */
243 public void onStreamClosed(Stream stream);
244
245 /**
246 * <p>Empty implementation of {@link StreamListener}.</p>
247 */
248 public static class Adapter implements StreamListener
249 {
250 @Override
251 public void onStreamCreated(Stream stream)
252 {
253 }
254
255 @Override
256 public void onStreamClosed(Stream stream)
257 {
258 }
259 }
260 }
261 }