source: trunk/FACT++/scripts/doc/Subscription.js@ 15116

Last change on this file since 15116 was 15097, checked in by tbretz, 12 years ago
Added how to look for an already open Subscription.
File size: 5.8 KB
Line 
1throw new Error("Description for built in functions. Must not be included!");
2/**
3 * @fileOverview
4 * Documentation of a DIM service Subscription
5 */
6
7/**
8 * @class
9 *
10 * Subscription to a DIM service.
11 *
12 * This class represents the subscription to a DIM service. Received
13 * events are first copied to an even queue internally, to avoid
14 * any processing blocking the DIM thread (which could block the
15 * whole network as a result). Then the events are processed.
16 * If a callback is installed, the processing will take place in
17 * another JavaScript thread. Physically it will run synchronously
18 * with the other JavaScript threads. However, the processing blocks
19 * event processing. Consequetly, processing should on average be
20 * faster than the frequency with which events arrive to ensure they
21 * will not fill up the memory and possible reactions to there
22 * contents will happen within a reasonable time and not delayed
23 * too much.
24 *
25 * Each subscription must exist only once, therefore the function-call
26 * can be used to check for an open subscription.
27 *
28 * @param {String} service
29 * Name of the DIM service to which a subscription should be made.
30 * Usully of the form SERVER/SUBSCRIPTION.
31 *
32 * @param {Function} [callback]
33 * An optional function which is set as 'onchange' property.
34 * This can avoid to loose th first event after the subscription
35 * before the callback is set by the 'onchange' property (which
36 * is very unlikely).
37 *
38 * @throws
39 * <li>If number or type of arguments is wrong
40 * <li>If an open subscription to the same service already exists.
41 *
42 * @example
43 * var handle1 = Subscription("MAGIC_WEATHER/DATA");
44 * if (!handle1)
45 * handle1 = new Subscription("MAGIC_WEATHER/DATA");
46 * var handle2 = new Subscription("TNG_WEATHER/DATA", function(evt) { console.out(JSON.stringify(evt)); });
47 * ...
48 * handle2.close();
49 * handle1.close();
50 */
51function Subscription(service, callback)
52{
53 /**
54 *
55 * The name of the service subscribed to.
56 *
57 * @constant
58 * @type String
59 *
60 */
61 this.name = service;
62
63 /**
64 *
65 * Boolean value which is set to false if the Subscription was closed.
66 *
67 * @type Boolean
68 *
69 */
70 this.isOpen = false;
71
72 /**
73 *
74 * Callback in case of event reception.
75 *
76 * To install a callback in case a new event of this Subscription
77 * was received, set this property to a function. The argument
78 * provided to the function is identical with the object returned
79 * by Subscription.get(). For the code executed, the same rules apply
80 * than for a thread created with Thread.
81 *
82 * @type Function
83 *
84 * @example
85 * handle.onchange = function(event) { console.out(JSON.stringify(event); };
86 *
87 */
88 this.onchange = callback;
89
90 /**
91 *
92 * Returns the last received event of this subscription.
93 *
94 * @param {Integer} [timeout=0]
95 * A timeout in millisecond to wait for an event to arrive.
96 * This timeout only applied if no event has been received yet
97 * after a new Subscription has been created. If an event
98 * is already available, the event is returned. If the timeout
99 * is 'null', waiting will never timeout until an event was received.
100 * If the timeout is less than zero, no exception will be thrown,
101 * but 'undefined' returned in case of timeout. The corresponding
102 * timeout is then Math.abs(timeout).
103 *
104 * @param {Boolean} [requireNamed=true]
105 * Usually an event is only considered complete, if also the
106 * corresponding decription is available distributed through
107 * the service SERVER/SERVICE_DESC. If an event has no
108 * description or access to the data by name is not important,
109 * requireNamed can be set to false.
110 *
111 * @throws
112 * <li> If number or type of arguments is wrong
113 * <li> After a timeout, if the timeout value was greater or equal zero
114 * <li> If conversion of the received data to an event object has failed
115 *
116 * @returns {Event}
117 * A valid event is returned, undefined in the case waiting for an
118 * event has timed out and exceptions are supressed by a negative
119 * timeout.
120 *
121 * @example
122 * var a = new Subscription("...service does not exist...");
123 * a.get( 3000, true); // throws an exception
124 * a.get( 3000, false); // throws and exception
125 * a.get(-3000, true); // returns undefined
126 * a.get(-3000, false); // returns undefined
127 *
128 * var a = new Subscription("...service with valid description but no valid data yet...");
129 * a.get( 3000, true); // throws an exception
130 * a.get( 3000, false); // returns Event.data==null, Event.obj valid but empty
131 * a.get(-3000, true); // return undefined
132 * a.get(-3000, false); // returns Event.data==null, Event.obj valid but emoty
133 *
134 * // Assuming that now valid description is available but data
135 * var a = new Subscription("...service without valid description but valid data...");
136 * a.get( 3000, true); // throws an exception
137 * a.get( 3000, false); // returns Event.data valid, Event.obj==undefined
138 * a.get(-3000, true); // returns undefined
139 * a.get(-3000, false); // returns Event.data valid, Event.obj==undefined
140 *
141 */
142 this.get = function() { /* [native code] */ }
143
144 /**
145 *
146 * Unsubscribe from an existing subscription. Note that all open
147 * subscription produce network traffic and should be omitted if
148 * not needed.
149 *
150 * @returns {Boolean}
151 * true if the subscription was still open, false if it was
152 * already closed.
153 *
154 */
155 this.close() = function() { /* [native code] */ }
156}
Note: See TracBrowser for help on using the repository browser.