Mercurial > prosody-hg
annotate net/cqueues.lua @ 13903:4af7d00a2966
MUC: occupant: refactor to allow storing more than just presence for a session
Previously a "session" (i.e. a full JID joined to a MUC) was stored as simply
a mapping of full JIDs->presence, contained within occupant objects (an
occupant object groups all sessions behind a certain nick in the MUC).
To enable developing GC3 and other features, it would be helpful if we can
store additional metadata when a client joins a room, for example, whether it
has opted out of receiving presence stanzas (a GC3 feature).
This changes the internal data structure, which shouldn't be used outside this
module, it adds a new :get_session() method, and modifies the :each_session()
iterator to return the session as an additional result (which should be
backwards compatible with code that just consumes the existing two results).
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 11 Nov 2024 12:47:01 +0000 |
| parents | ba409c67353b |
| children |
| rev | line source |
|---|---|
|
6514
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
1 -- Prosody IM |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
2 -- Copyright (C) 2014 Daurnimator |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
3 -- |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
4 -- This project is MIT/X11 licensed. Please see the |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
5 -- COPYING file in the source package for more information. |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
6 -- |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
7 -- This module allows you to use cqueues with a net.server mainloop |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
8 -- |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
9 |
|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
10999
diff
changeset
|
10 local server = require "prosody.net.server"; |
|
6514
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
11 local cqueues = require "cqueues"; |
|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
10999
diff
changeset
|
12 local timer = require "prosody.util.timer"; |
|
6538
f1eb66288f60
net.cqueues: Fix incorrect version check
daurnimator <quae@daurnimator.com>
parents:
6537
diff
changeset
|
13 assert(cqueues.VERSION >= 20150113, "cqueues newer than 20150113 required") |
|
6514
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
14 |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
15 -- Create a single top level cqueue |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
16 local cq; |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
17 |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
18 if server.cq then -- server provides cqueues object |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
19 cq = server.cq; |
|
10996
d742095046f9
net.cqueues: Switch to server.watchfd for main loop integration
Kim Alvefur <zash@zash.se>
parents:
6538
diff
changeset
|
20 elseif server.watchfd then |
|
6514
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
21 cq = cqueues.new(); |
|
10999
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
22 local timeout = timer.add_task(cq:timeout() or 0, function () |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
23 -- FIXME It should be enough to reschedule this timeout instead of replacing it, but this does not work. See https://issues.prosody.im/1572 |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
24 assert(cq:loop(0)); |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
25 return cq:timeout(); |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
26 end); |
|
10996
d742095046f9
net.cqueues: Switch to server.watchfd for main loop integration
Kim Alvefur <zash@zash.se>
parents:
6538
diff
changeset
|
27 server.watchfd(cq:pollfd(), function () |
|
6514
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
28 assert(cq:loop(0)); |
|
10999
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
29 local t = cq:timeout(); |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
30 if t then |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
31 timer.stop(timeout); |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
32 timeout = timer.add_task(cq:timeout(), function () |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
33 assert(cq:loop(0)); |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
34 return cq:timeout(); |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
35 end); |
|
37b884d675f7
net.cqueues: Fix resuming after timeouts
Kim Alvefur <zash@zash.se>
parents:
10996
diff
changeset
|
36 end |
|
6514
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
37 end); |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
38 else |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
39 error "NYI" |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
40 end |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
41 |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
42 return { |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
43 cq = cq; |
|
d425fc41e59f
net.cqueues: Add module that allows use of cqueues while still using net.server as main loop
daurnimator <quae@daurnimator.com>
parents:
diff
changeset
|
44 } |
