Changes

Jump to navigation Jump to search
4,159 bytes added ,  15:43, 27 February 2020
no edit summary
=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/ws</nowiki></code> namespace, which is statically bound to the {{Code|ws}} prefix. The module must * As sessions are side-effecting operations, all functions are flagged as ''non-deterministic''. As a result, some query optimizations will be imported in the query prolog:suppressed.
<pre class="brush:xquery">import module namespace ws = "http://basex.org/modules/ws";...</pre> =General Functions=
==ws:id==
|-
| '''Summary'''
|Returns the ID of the current WebSocket client.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.
|}
|-
| '''Summary'''
|Returns the ids of all currently registered WebSocket clientsWebSockets.
|}
|-
| '''Summary'''
|Returns the path of the WebSocket client 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='120' | '''Signatures'''
|{{Func|ws:send|$message as xs:anyAtomicTypeitem(), $ids as xs:string*|empty-sequence()}}
|-
| '''Summary'''
|Sends a <code>$message</code>, which may be of type xs:string, xs:base64Binary or xs:hexBinary, to the users 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.
|}
|-
| '''Summary'''
|Broadcasts a <code>$message</code>, which may be of type xs:string, xs:base64Binary or xs:hexBinary, to all connected clients except to the caller. This Invocations of this convenience function is are equivalent to <code>ws:send($message, ws:ids()[. != ws:id()])</code>. See [[#ws:send|ws:send]] for more details on the message handling.
|}
|-
| '''Summary'''
|Emits a <code>$message</code>to all connected clients. Invocations of this function are equivalent to <code>ws:send($message, which may be of type 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:base64Binary or string}}<br />{{Func|ws:eval|$query as xs:hexBinaryanyAtomicItem, $bindings as map(*)?, $options as map(*)?|xs:string}}<br />|-| '''Summary'''|Schedules the evaluation of the supplied {{Code|$query}} and returns the result to all connected clientsthe 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 convenience function 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 equivalent 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. <codebr/>{{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:sendmessage('/tasks', '{$message}')function local:message($message) { ws:eval('prof:sleep(10000), "Your message has been processed."')}; </syntaxhighlight>|} =WebSocket Attributes= ==ws:get== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:get|$id as xs:string, $name as xs:string|item()*}}<br/>{{Func|ws:get|$id as xs:string, $name as xs:string, $default as item()*|item()*}}|-| '''Summary'''|Returns the value of an attribute with the specified {{Code|$name}} from the WebSocket with the specified {{Code|$id}}. If the attribute is unknown, an empty sequence or the optionally specified {{Code|$default}} value will be returned instead.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.|} ==ws:set== {| width='100%'|-| width='120' | '''Signatures'''|{{Func|ws:idsset|$id as xs:string, $name as xs:string, $value as item()*|empty-sequence()}}|-| '''Summary'''|Returns the specified {{Code|value}} of the attribute with the specified {{Code|$name}} from the WebSocket with the specified {{Mono|$id}}.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.</codebr>{{Error|set|#Errors}} The supplied value cannot be materialized.
|}
==ws:closedelete==
{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|ws:closedelete|$id as xs:string, $name as xs:string|empty-sequence()}}
|-
| '''Summary'''
|Closes Deletes an attribute with the connection of specified {{Code|$name}} from the WebSocket client with the specified {{CodeMono|$id}}.|-| '''Errors'''|{{Error|not-found|#Errors}} No WebSocket with the specified id exists.
|}
==Example 1==
<pre classsyntaxhighlight lang="brush:xquery">import module namespace ws = "http://basex.org/modules/Websocketws";
declare
%ws:connect('/')
function local:connect() as xs:string empty-sequence() {
let $id := ws:id()
let $message := json:serialize(map {
return ws:broadcast($message)
};
</presyntaxhighlight>
'''Explanation:'''
==Example 2==
<pre classsyntaxhighlight lang="brush:xquery">import module namespace ws = "http://basex.org/modules/Websocketws";
declare
function local:message(
$message as xs:string
) as xs:string empty-sequence() {
let $message := json:serialize(map { 'message': $message })
return ws:emit($message)
};
</presyntaxhighlight>
'''Explanation:'''
* A JSON response is generated, which contains the message string.
* This response will be sent to all connected clients (including the calling client).
 
=Errors=
 
{| class="wikitable" width="100%"
! width="110"|Code
|Description
|-
|{{Code|set}}
|The supplied value cannot be materialized.
|-
|{{Code|not-found}}
|No WebSocket with the specified id exists.
|}
 
=Changelog=
 
;Version 9.2
 
* Added: [[#ws:eval|ws:eval]]
 
This module was introduced with Version 9.1.
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu