.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Tangence::Stream 3pm" .TH Tangence::Stream 3pm "2021-04-30" "perl v5.32.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" "Tangence::Stream" \- base class for "Tangence" stream\-handling mixins .SH "DESCRIPTION" .IX Header "DESCRIPTION" This module provides a base for Tangence::Client and Tangence::Server. It is not intended to be used directly by \f(CW\*(C`Tangence\*(C'\fR implementation code. .PP It provides the basic layer of message serialisation, deserialisation, and dispatching to methods that would handle the messages. Higher level classes are used to wrap this functionallity, and provide implementations of methods to handle the messages received. .PP When a message is received, it will be passed to a method whose name depends on the code of message received. The name will be \f(CW\*(C`handle_request_\*(C'\fR, followed by the name of the message code, in uppercase; for example \&\f(CW\*(C`handle_request_CALL\*(C'\fR. .SH "REQUIRED METHODS" .IX Header "REQUIRED METHODS" The following methods are required to be implemented by some class using this mixin. .SS "tangence_write" .IX Subsection "tangence_write" .Vb 1 \& $stream\->tangence_write( $data ) .Ve .PP Write bytes of data to the connected peer. \f(CW$data\fR will be a plain perl string. .SS "handle_request_$CODE" .IX Subsection "handle_request_$CODE" .Vb 1 \& $stream\->handle_request_$CODE( $token, $message ) .Ve .PP Invoked on receipt of a given message code. \f(CW$token\fR will be some opaque perl scalar value, and \f(CW$message\fR will be an instance of Tangence::Message. .PP The value of the token has no particular meaning, other than to be passed to the \f(CW\*(C`respond\*(C'\fR method. .SH "PROVIDED METHODS" .IX Header "PROVIDED METHODS" The following methods are provided by this mixin. .SS "tangence_closed" .IX Subsection "tangence_closed" .Vb 1 \& $stream\->tangence_closed .Ve .PP Informs the object that the underlying connection has now been closed, and any attachments to \f(CW\*(C`Tangence::Object\*(C'\fR or \f(CW\*(C`Tangence::ObjectProxy\*(C'\fR instances should now be dropped. .SS "tangence_readfrom" .IX Subsection "tangence_readfrom" .Vb 1 \& $stream\->tangence_readfrom( $buffer ) .Ve .PP Informs the object that more data has been read from the underlying connection stream. Whole messages will be removed from the beginning of the \f(CW$buffer\fR, which should be passed as a direct scalar (because it will be modified). This method will invoke the required \f(CW\*(C`handle_request_*\*(C'\fR methods. Any bytes remaining that form the start of a partial message will be left in the buffer. .SS "request" .IX Subsection "request" .Vb 1 \& $stream\->request( %args ) .Ve .PP Serialises a message object to pass to the \f(CW\*(C`tangence_write\*(C'\fR method, then enqueues a response handler to be invoked when a reply arrives. Takes the following named arguments: .IP "request => Tangence::Message" 8 .IX Item "request => Tangence::Message" The message body .IP "on_response => \s-1CODE\s0" 8 .IX Item "on_response => CODE" \&\s-1CODE\s0 reference to the callback to be invoked when a response to the message is received. It will be passed the response message: .Sp .Vb 1 \& $on_response\->( $message ) .Ve .SS "request (non-void)" .IX Subsection "request (non-void)" .Vb 1 \& $response = $stream\->request( request => $request )\->get .Ve .PP When called in non-void context, this method returns a Future that will yield the response instead. In this case it should not be given an \&\f(CW\*(C`on_response\*(C'\fR callback. .PP In this form, a \f(CW\*(C`MSG_ERROR\*(C'\fR response will automatically turn into a failed Future; the subsequent \f(CW\*(C`then\*(C'\fR or \f(CW\*(C`on_done\*(C'\fR code will not have to handle this case. .SS "respond" .IX Subsection "respond" .Vb 1 \& $stream\->respond( $token, $message ) .Ve .PP Serialises a message object to be sent to the \f(CW\*(C`tangence_write\*(C'\fR method. The \&\f(CW$token\fR value that was passed to the \f(CW\*(C`handle_request_\*(C'\fR method ensures that it is sent at the correct position in the stream, to allow the peer to pair it with the corresponding request. .SS "minor_version" .IX Subsection "minor_version" .Vb 1 \& $ver = $stream\->minor_version .Ve .PP Returns the minor version negotiated by the \f(CW\*(C`MSG_INIT\*(C'\fR / \f(CW\*(C`MSG_INITED\*(C'\fR initial message handshake. .SH "AUTHOR" .IX Header "AUTHOR" Paul Evans