module Hydro_types: sig .. end
Basic type and exception definitions
Exceptions
These are the base exceptions of the runtime. Note that user code
usually does not get them directly because they are wrapped into
the
Client_condition exception. E.g. user code could get
Client_condition(`Connect_error(Proxy_error(`NoEndpointIsReachable))).
For technical reasons, Client_condition is defined below.
type protocol_violation = [ `BadMessageType
| `CompressionNotSupported
| `MessageFormatViolation of string ]
exception Protocol_violation of protocol_violation
A violation of the protocol has been detected:
`MessageFormatViolation reason: The data received over the wire
cannot be even split into messages. reason explains why.
`CompressionNotSupported: A compressed message was received
although Hydro announces that it does not support compression.
`BadMessageType: XXX
exception Marshal_error of string
A value cannot be marshalled, i.e. converted into the string format
that is sent over the wire. The argument explains the reason.
exception Unmarshal_error of string
A received message cannot be decoded into a value.
The argument explains the reason.
type limitation = [ `UnsupportedEncodingVersion
| `UnsupportedEndpointType of int
| `UnsupportedProtocolVersion ]
exception Limitation of limitation
A Hydro limitation was hit:
`UnsupportedEncodingVersion: Hydro only understands version 1.0
`UnsupportedProtocolVersion: Hydro only understands version 1.0
type proxy_error = [ `NoCallableEndpointFound
| `NoEndpointIsReachable
| `NoLocatorIsReachable
| `ProxyIsDown ]
exception Proxy_error of proxy_error
The proxy is unable to fulfill the request:
`NoCallableEndpointFound: After the endpoint resolution procedure
no endpoint turns out to be usable. Note that also DNS failures
can lead to this error.
`NoEndpointIsReachable: None of the resolved endpoints is
actually reachable.
`NoLocatorIsReachable: No locator (i.e. IceGrid node) is
actually reachable, and the resolution procedure fails because of
this.
`ProxyIsDown: The proxy has been shut down
exception Domain_not_found of string
A DNS name cannot be resolved. The argument is the name
exception Unbound_exception of exn
An exception that has not to be caught by a exception handler
built into Hydro. Such exceptions always fall through to the
user code.
exception Unimplemented_operation of string
This operation was called, but the actual definition is missing
See also the exception
Client_condition below!
Values
This defines
value, the abstract (non-mapped) representation of
values that can be sent over the wire.
value is mostly internally
used, because
hydrogen generates a user-friendlier representation
of values that uses directly OCaml types.
type noreturn
A type without value. May be used to indicate that functions or methods
never return normally to the caller.
type value =
| |
VNothing |
| |
VBool of bool |
| |
VByte of int |
| |
VShort of int |
| |
VInt of int |
| |
VInt32 of int32 |
| |
VLong of int64 |
| |
VFloat of float |
| |
VDouble of float |
| |
VString of string |
| |
VSequence of value array |
| |
VByteseq of string |
| |
VDictionary of (value * value) array |
| |
VEnum of int |
| |
VStruct of value array |
| |
VNull |
| |
VClass of class_repr Pervasives.ref |
| |
VProxy of proxy_addr |
| |
VDirectWriter of (Netbuffer.t -> unit) |
| |
VDirectMapping of exn |
This is mostly clear: e.g.
VLong n represents a value that is declared
as "long" in the Ice IDL file. Some remarks:
VNothing is the fictive value for `Void types (think of () in
OCaml)
- There are two representations for "int":
`Int n and `Int32 n,
so the user can select which representation to prefer
VFloat f means that f is only single-precision, although the
OCaml float type corresponds to double-precision floats.
VByteseq s is used for values of sequence<byte> Ice type.
VEnum k: The number k is the position in the declaration.
VClass cls_ref: We use a reference as argument to simply the
unmarshalling algorithm. User code should never see `Placeholder
inside this reference, but only `Value.
VDirectWriter f: The function f is called to write out the
byte encoding of the value.
VDirectMapping: The value is given in the language-mapped
representation, wrapped into a special, generated exception
type class_repr = [ `Placeholder of int32 | `Value of object_value ]
type sliced_value = < hydro_effective_id : string; hydro_slices : slice list >
Sliced values are used to marshal exceptions and object instances.
For these there is an inheritance hierarchy.
hydro_slices: These are the slices in base-to-derived order,
i.e. the root slice for the root of the inheritance hierarchy
comes first, and the most derived slice comes last.
hydro_effective_id: The effective type ID of the class or
exception. This is the most derived ID the local type system
knows = the latest element in hydro_slices with a decoded slice.
This type also exists as class type
Hydro_lm.sliced_base.
type object_value = < hydro_effective_id : string;
hydro_inflate : string -> noreturn;
hydro_invoke_operation : string ->
value array ->
session -> unit;
hydro_slices : slice list >
Object values are subtypes of
sliced_value. Additional
methods:
hydro_inflate id: Used in the language-mapping layer to restore
the full object type for the object_value. This is done by
calling hydro_inflate with the class id of the desired class.
The method in turn raises a special exception E obj
that has to be caught by the caller in order to get obj.
The argument obj is the object itself, but with a richer type
that corresponds to id.
hydro_invoke_operation name args sess: invoke the operation
name (always passed in lowercase letters) with arguments args
and session sess.
Basically this means that an
object_value is a
sliced_value
that can be recovered as rich class type by the language mapping layer.
For an object_value that has callable operations, use
the class type Hydro_lm.object_base.
type slice = [ `Decoded of string * value array | `Opaque of string * string ]
It is possible that the ID of a slice is known or not. In the first
case Hydro represents it as `Decoded(id,values) where id is the
type ID of the slice, and values are the decoded values in order.
If Hydro does not know the type ID, the slice is represented as
`Opaque(id,values), and the values remain unmarshalled. It is still
possible to forward an opaque value to another Ice node.
type proxy_addr = < facet : string option; id : identity;
mode : proxy_mode; parameters : proxy_parameters;
secure : bool >
The address of a remote object (for creating a proxy):
id is the identity of the remote object
facet is the facet if any
mode is the mode of the proxy
secure may demand that only SSL endpoints are chose in order
to access the remote object
parameters denotes the endpoint(s) where the object is reachable
in a transport-dependent form
type proxy_mode = [ `Batch_datagram | `Batch_oneway | `Datagram | `Oneway | `Twoway ]
type proxy_parameters = [ `Adapter of string | `Endpoints of endpoint array | `Well_known ]
Where to find the Internet port(s) of the service behind the proxy:
`Endpoints e: The proxy is a direct proxy with the non-empty
array of endpoints e
`Well_known: The proxy is an indirect proxy referring to a
well known object
`Adapter s: The proxy is an indirect proxy referring to an
adapter s (the string is non-empty)
type endpoint = [ `SSL of ssl_endpoint
| `TCP of tcp_endpoint
| `UDP of udp_endpoint
| `Unknown of int * string ]
type endpoint_type = [ `SSL | `TCP | `UDP | `Unknown of int ]
type tcp_endpoint = < compress : bool; host : string; port : int; timeout : int32 >
type udp_endpoint = < compress : bool; enc_major : int; enc_minor : int; host : string;
port : int; proto_major : int; proto_minor : int >
type ssl_endpoint = tcp_endpoint
type identity = < category : string; name : string >
The identity of a remote object
Type system
type htype =
| |
TVoid |
| |
TBool |
| |
TByte |
| |
TShort |
| |
TInt |
| |
TInt32 |
| |
TLong |
| |
TFloat |
| |
TDouble |
| |
TString |
| |
TByteseq |
| |
TEnum of string array |
| |
TStruct of (string * htype) array |
| |
TSequence of htype |
| |
TDictionary of htype * htype |
| |
TProxy of string |
| |
TClass of string |
| |
TDirectMapping of htype * (Netbuffer.t -> exn -> unit) * (string -> int Pervasives.ref -> int -> exn) |
type hexn = < elements : (string * htype) array; name : string;
super : hexn option >
type hintf = < elements : hfunction list; name : string;
super : hintf list >
type hfunction = < in_args : (string * htype) array; in_classes : bool;
mode : op_mode; name : string;
out_args : (string * htype) array; out_classes : bool;
result : htype >
type hclass = < elements : (string * htype) array; name : string;
super : hclass option >
type system = < classes : hclass Hydro_prelim.CiHashtbl.t;
ctors : (sliced_value -> object_value)
Hydro_prelim.CiHashtbl.t;
exceptions : hexn Hydro_prelim.CiHashtbl.t;
interfaces : hintf Hydro_prelim.CiHashtbl.t;
types : htype Hydro_prelim.CiHashtbl.t >
type op_mode = [ `Idempotent | `Nonmutating | `Normal ]
Messages
type msg_type = [ `Batch_request
| `Close_connection
| `Reply
| `Request
| `Validate_connection ]
type compression_status = [ `Compressed | `Compression_unsupported | `Uncompressed ]
type msg_header = < body_size : int; compression : compression_status;
enc_major : int; enc_minor : int; msg_type : msg_type;
proto_major : int; proto_minor : int >
type encap_buffer = {
|
encap_buf : Netbuffer.t; |
|
encap_pos : int; |
|
encap_len : int; |
|
encap_enc_minor : int; |
}
type msg_buffer = msg_header * encap_buffer list
type msg = [ `Batch_request of batch_request_msg list
| `Close_connection
| `Reply of reply_msg
| `Request of request_msg
| `Validate_connection ]
type request_msg = < context : (string * string) array; facet : string option;
id : identity; mode : op_mode; operation :
string; params : encap_buffer; request_id : int32 >
type batch_request_msg = < context : (string * string) array; facet : string option;
id : identity; mode : op_mode; operation :
string; params : encap_buffer >
type reply_msg = < request_id : int32; result : result >
type result = [ `Facet_does_not_exist of identity * string option * string
| `Object_does_not_exist of identity * string option * string
| `Operation_does_not_exist of identity * string option * string
| `Success of encap_buffer
| `Unknown_exception of string
| `Unknown_local_exception of string
| `Unknown_user_exception of string
| `User_exception of encap_buffer ]
Parameters
See the
Hydro_params module for creating and modifying these
objects
type call_params = < context : (string * string) list option;
destination : Unix.sockaddr option; msg_timeout : float option >
Parameters for a single call:
msg_timeout: If Some tmo, the number tmo is the maximum
number of seconds until when a response must have been arrived.
Otherwise the call times out with a
Client_condition `Message_timeout. If None, there is no
such timeout condition. (Only used for twoway calls.)
destination: For unconnected UDP sockets, this parameter must
be Some addr to set the destination of the call. For connected
sockets this parameter must be None.
context: If Some ctx, the key/value pairs in ctx are to
be passed as context. If None a reasonable default is passed.
type exn_handler = < handle : exn -> unit >
An exception handler encapsulated as object
type client_params = < exception_handler : exn_handler; idle_timeout : float;
max_enc_minor : int option; max_proto_minor : int option;
msg_timeout : float; trans_timeout : float >
Parameters for clients:
trans_timeout: If non-negative, a timeout on the transport
level is set. This means that connections that block for more
than this number of seconds time out. In this case, the whole
client fails, and all pending calls see a
Client_condition `Transport_timeout if it happens in the middle
of a connection, or Client_condition `Connect_timeout if it
happens in the connect phase.
msg_timeout: If non-negative, the number tmo is the maximum
number of seconds until when a response must have been arrived.
Otherwise the call times out with a
Client_condition `Message_timeout. This error is non-fatal,
and only the single call times out. (Only used for twoway calls.)
idle_timeout: when the client has been idle for this number of
seconds, it is automatically shut down. "Idle" means that there is
neither something to send nor a message is expected to be received.
- The
exception_handler is invoked for exceptions that cannot be handled
by the client. The handler is never invoked for Unbound_exceptions -
these always fall through to the caller. In any case the client is shut
down for exceptions that cannot be handled by the client.
max_proto_minor and max_enc_minor are the maximum minor versions
of the server. These values are only used in the datagram case; for
stream connections they can be obtained directly from the server.
If not set, minor numbers of 0 are assumed.
type server_params = < trans_timeout : float >
Serving
type server_ops = < abort_connection : unit -> unit; endpoint : endpoint;
event_system : Unixqueue.event_system; server_id : int;
server_params : server_params;
shutdown_connection : unit -> unit; system : system >
-
endpoint returns the endpoint name where this server is reachable
by remote proxies
shutdown_connection initiates the shutdown of the connection
for connection-oriented servers (nothing is done for connection-less
servers)
abort_connection closes the connection immediately
for connection-oriented servers (nothing is done for connection-less
servers)
event_system is the Unixqueue the server is using
system is the type system
server_params are the server parameters
server_id identifies the connection for connection-oriented
servers, otherwise just the server
type session = < context : (string * string) list;
emit_result : value -> value array -> unit;
emit_unknown_exception : string -> unit;
emit_unknown_local_exception : string -> unit;
emit_unknown_user_exception : string -> unit;
emit_user_exception : sliced_value -> unit;
is_responded : bool; request_id : int32;
response : reply_msg option;
server_ops : server_ops >
-
is_responded is
true when a response has been sent, or when
a response can no longer be sent, and
false when a response is
still expected
response is Some r when the response r is emitted, and
None otherwise
emit_result r outvars emits the main result r and the output
parameters outvars
emit_user_exception sv emits the user exception contained in sv
emit_unknown_local_exception s emit the "unknown local exception",
accompanied by the string s
emit_unknown_user_exception s emit the "unknown user exception",
accompanied by the string s
emit_unknown_exception s emit the "unknown exception",
accompanied by the string s
request_id is the request ID sent in the request. Fails if
non applicable (e.g. oneway calls)
context is the list of key/value pairs sent as context in
the request message
server_ops allows access to server-specific operations
type operation_dispatcher = < hydro_effective_id : string;
hydro_invoke_operation : string ->
value array ->
session -> unit >
If you get Not_found after only passing the operation name to
hydro_invoke_operation the operation does not exist.
type facet_dispatcher = < invoke_facet : string option -> operation_dispatcher >
type object_dispatcher = < adapter_id : string option;
get_identity : operation_dispatcher -> identity;
invoke_object : identity -> facet_dispatcher;
replica_group_id : string option >
The invoke_object method either returns the next dispatcher, or
raises Not_found. In the scope of a single object dispatcher we
require that the mapping between identity and facet dispatcher
is bijective, so there is also get_identity for the
reverse mapping.
Client Exceptions
type client_condition = [ `Client_is_down
| `Connect_error of exn
| `Connect_timeout
| `Error of exn
| `Facet_does_not_exist of identity * string option * string
| `Message_lost of bool
| `Message_timeout
| `Object_does_not_exist of identity * string option * string
| `Operation_does_not_exist of identity * string option * string
| `Transport_timeout
| `Unknown_exception of string
| `Unknown_local_exception of string
| `Unknown_user_exception of string
| `User_exception of sliced_value ]
exception Client_condition of client_condition
These conditions may be passed back to the caller of a RPC function:
`Message_lost: The client was shut down before the response
arrived. The reason is unrelated to the RPC call that
sees `Message_lost (i.e. it is a follow-up error). The argument
says whether the request message was tried to send (true) or
not (false).
`Message_timeout: The maximum time for replying the RPC call
has been exceeded.
`Transport_timeout: The transport level (TCP level) blocks for
too long. (This is a fatal error, and the client is shut down.)
`Connect_timeout: The transport level (TCP level) blocks for
too long while connecting to a server, or while doing the
initial handshake. It is ensured that the server has never seen
the RPC call. (This is a fatal error, and the client is shut down.)
`Connect_error e: An error happened while connecting to the
server, or while doing the initial handshake. The exception e
explains the error. It is ensured that the server has never seen
the RPC call. (This is a fatal error, and the client is shut down.)
`Client_is_down: A call is tried with a client that is already
shut down
`User_exception sv: The remote function raises a user-level
exception, i.e. an exception that is declared in the Ice IDL.
The sliced value sv represents the exception.
`Object_does_not_exist(id,facet,op): Cannot call the function
op, optionally in facet, of the remote object id because
the object is unknown to the server.
`Facet_does_not_exist(id,facet,op): Cannot call the function
op, optionally in facet, of the remote object id because
the facet is unknown to the server.
`Operation_does_not_exist(id,facet,op): Cannot call the function
op, optionally in facet, of the remote object id because
the function is unknown to the server.
`Unknown_local_exception s: While performing the remote operation
the server caught an exception that is declared in the IDL
as local exception (such exception cannot be marshalled at all).
The string s explains the exception.
`Unknown_user_exception s: While performing the remote operation
the server caught an exception that is declared in the IDL
but not for the operation. The string s explains the exception.
`Unknown_exception s: While performing the remote operation
the server caught an unknown exception.
The string s explains the exception.
`Error e: An error happened that is not one of the above.
The exception e explains the error.
(This is a fatal error, and the client is shut down.)
Miscelleneous
type transport_protocol_type = [ `Datagram | `Stream ]
class type descriptor = object .. end
type network_port = [ `TCP of Unix.inet_addr * int | `UDP of Unix.inet_addr * int ]