Changes

Jump to navigation Jump to search
4,721 bytes added ,  15:43, 27 February 2020
no edit summary
This [[Module Library|XQuery Module]] contains functions for accessing specific WebSocket functions. This module is mainly useful in the context of [[WebSockets]].
Within the WebSocket module you can access functions in the context of the specific client. You can access the clientid, the clientpath and broadcast a message to all connected clients without the caller/client. If you have to access functions with more rights, like getting the clientids of other connected clients, you should checkout the [[WebSockets Module]]
=Conventions=
* The module will be available if the {{Code|basex-api}} package must be included library is found in the classpath. This is always the case if you use one of the complete distributions of BaseX (zip, exe, war) of BaseX.* All functions and errors are assigned to the <code><nowiki>http://basex.org/modules/websocketws</nowiki></code> namespace. The module must be imported in , which is statically bound to the query prolog:<pre class="brush:xquery">import module namespace websocket = "http://basex{{Code|ws}} prefix.org/modules/Websocket";* As sessions are side-effecting operations, all functions are flagged as ''non-deterministic''.As a result, some query optimizations will be suppressed..</pre>
=General Functions= ==ws:id== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:id||xs:string}}|-| '''Summary'''|Returns the ID of the current WebSocket.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.|} ==ws:ids== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:ids||xs:string*}}|-| '''Summary'''|Returns the ids of all currently registered WebSockets.|} ==ws:path== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:path|$id as xs:string|xs:string}}|-| '''Summary'''|Returns the path of the WebSocket with the specified {{Code|$id}}.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.|} ==ws:close== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:close|$id as xs:string|empty-sequence()}}|-| '''Summary'''|Closes the connection of the WebSocket with the specified {{Code|$id}}.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.|} =Sending Data= ==ws:send== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:send|$message as item(), $ids as xs:string*|empty-sequence()}}|-| '''Summary'''|Sends a <code>$message</code> to the clients with the specified <code>$ids</code>. Ids that cannot be assigned to clients will be ignored. The message will be handled as follows:* Items of type {{Code|xs:base64Binary}} and {{Code|xs:hexBinary}} will be transmitted as binary messages.* Function items (maps, arrays) will be serialized as JSON and transmitted as string messages.* All other items will be serialized with the default serialization options and transmitted as string messages.|} ==ws:broadcast== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:broadcast|$message as xs:anyAtomicType|empty-sequence()}}|-| '''Summary'''|Broadcasts a <code>$message</code> to all connected clients except to the caller. Invocations of this convenience function are equivalent to <code>ws:send($message, ws:ids()[. != ws:id()])</code>. See [[#ws:send|ws:send]] for more details on the message handling.|} ==ws:emit== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:emit|$message as xs:anyAtomicType|empty-sequence()}}|-| '''Summary'''|Emits a <code>$message</code> to all connected clients. Invocations of this function are equivalent to <code>ws:send($message, ws:ids())</code>. See [[#ws:send|ws:send]] for more details on the message handling.|} ==ws:eval== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:eval|$query as xs:anyAtomicItem|xs:string}}<br />{{Func|ws:eval|$query as xs:anyAtomicItem, $bindings as map(*)?|xs:string}}<br />{{Func|ws:eval|$query as xs:anyAtomicItem, $bindings as map(*)?, $options as map(*)?|xs:string}}<br />|-| '''Summary'''|Schedules the evaluation of the supplied {{Code|$query}} and returns the result to the calling WebSocket client. The query can be a URI or a string, and variables and context items can be declared via {{Code|$bindings}} (see {{Function|XQuery|xquery:eval}} for more details). The following {{Code|$options}} can be supplied:* {{Code|base-uri}}: sets the [https://www.w3.org/TR/xquery-31/#dt-static-base-uri base-uri property] for the query. This URI will be used when resolving relative URIs, such as with {{Code|fn:doc}}.* {{Code|id}}: sets a custom job id. The id must not start with the standard <code>job</code> prefix, and it can only be assigned if no job with the same name exists.Query scheduling is recommendable if the immediate query execution might be too time consuming and lead to a timeout.|-| '''Errors'''|{{Error|overflow|#Errors}} Query execution is rejected, because too many jobs are queued or being executed. <br/>{{Error|id|#Errors}} The specified id is invalid or has already been assigned.|-| '''Examples'''|* Schedule a second query that will notify the client 10 seconds later that a message was processed:<syntaxhighlight lang="xquery">declare %ws:message('/tasks', '{$message}')function local:message($message) { ws:eval('prof:sleep(10000), "Your message has been processed."')}; </syntaxhighlight>|} =WebSocket Attributes= ==ws:get==
==websocket:broadcast==
{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|websocketws:broadcastget|$message id as xs:anyAtomicTypestring, $name as xs:string|item()*}}<br/>{{Func|ws:get|$id as xs:string, $name as xs:string, $default as item()*|empty-sequenceitem()*}}
|-
| '''Summary'''
|Broadcasts <code>message</code> which may be Returns the value of type xs:string, xs:base64Binaryan attribute with the specified {{Code|$name}} from the WebSocket with the specified {{Code|$id}}. If the attribute is unknown, an empty sequence or xs:hexBinary to all connected members except to the calleroptionally specified {{Code|$default}} value will be returned instead.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.
|}
==websocketws:idset== 
{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|websocketws:set|$id||as xs:string, $name as xs:string, $value as item()*|empty-sequence()}}
|-
| '''Summary'''
|Returns the ID specified {{Code|value}} of the current attribute with the specified {{Code|$name}} from the WebSocket connectionwith the specified {{Mono|$id}}.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.<br>{{Error|set|#Errors}} The supplied value cannot be materialized.
|}
==websocketws:pathdelete== 
{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|websocketws:path|delete|$id as xs:string, $name as xs:string|empty-sequence()}}
|-
| '''Summary'''
|Returns Deletes an attribute with the path of specified {{Code|$name}} from the current WebSocketClient. If WebSocket with the <code>specified {{Mono|$id</code> parameter is set, the path of a specific user }}.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the ID <code>$specified id</code> will be returnedexists.
|}
=Usage TipsExamples==Example 1== <syntaxhighlight lang="xquery">import module namespace ws = "http://basex.org/modules/ws"; declare %ws:connect('/')function local:connect() as empty-sequence() { let $id := ws:id() let $message := json:serialize(map { 'type': 'Connect', 'id': $id }) return ws:broadcast($message)};</syntaxhighlight> '''Explanation:''' * The function has a <code>websocket%ws:idconnect</code> returns your current session idannotation. You can use all It gets called if a client successfully creates a WebSocket connection to the path <code>/</code> (check out [[Session ModuleWebSockets]] for further information).* A JSON response is generated, which contains the new client id and [[Sessions Module]] functions within the websocket contexta <code>Connect</code> string.* This response will be sent to all other connected clients. ==Example 2== <syntaxhighlight lang="xquery">import module namespace ws = "http://basex.org/modules/ws";
=Example=
==Code==
<pre class="brush:xquery">
declare
module namespace websocketexample %ws:message('/', '{$message}')function local:message( $message as xs:string) as empty-sequence() { let $message := json:serialize(map { 'message'http:$message }) return ws:emit($message)};</syntaxhighlight> '''Explanation:''' * The function has a <code>%ws:message</basexcode> annotation. It gets called if a client sends a new message.* A JSON response is generated, which contains the message string.org/modules/web-page';* This response will be sent to all connected clients (: Import including the WebSocket module :calling client). import module namespace websocket = Errors= {| class="wikitable"http://basexwidth="100%"! width="110"|Code|Description|-|{{Code|set}}|The supplied value cannot be materialized.|-|{{Code|not-found}}|No WebSocket with the specified id exists.org/modules/Websocket"|} =Changelog= ;Version 9.2 * Added: [[#ws:eval|ws:eval]]
%ws:connect("/") function websocketexample:connect( ) { let $client-id := websocket:id() let $client-path := websocket:path() let $response := json:serialize( <json type="object"> <messageType>UserConnected</messageType> <clientId>{$client-id}</clientId> <clientPath>{$client-path}</clientPath> </json> ) return websocket:broadcast($response) };</pre>==Explanation==* First of all: include the websocket This module* The <code>$ws:connect("/")</code> annotation gets called if a client successfully creates a websocket to the path "/" (checkout [[WebSockets]] for further information)was introduced with Version 9.1.* Get the <code>client-id</code> and the <code>client-path</code> with <code>websocket:id()</code> and <code>websocket:path()</code>* Create a json-result * Broadcast the result to all connected clients without the calling client
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu