event_emitter.rb

 1# frozen_string_literal: true
 2
 3require_relative "message_event"
 4
 5module EventEmitter
 6	# @param owner_jid [Blather::JID]
 7	def jid_to_owner(owner_jid)
 8		REGISTRATION_REPO.find(owner_jid).then { |(tel, *rest)|
 9			unless MessageEvent::NanpaTel.match?(tel)
10				log.warn(
11					"Skipping incoming message event: no valid owner mapping",
12					jid: owner_jid.to_s, owner: tel.to_s
13				)
14				next
15			end
16			yield [tel, *rest] if block_given?
17		}
18	end
19
20	def emit_incoming_event(
21		owner_jid,
22		from:, body:, endstream_id:, media_urls: []
23	)
24		jid_to_owner(owner_jid) { |(tel, *)|
25			MessageEvent::In.new(
26				owner: tel, from: from, to: [tel], body: body.to_s,
27				endstream_id: endstream_id, media_urls: media_urls
28			).emit(REDIS)
29		}.catch do |e|
30			log.warn("Failed to emit incoming message event", error: e.message)
31		end
32	end
33
34	def emit_failed_event(endstream_id:, error_code:, error_description:)
35		MessageEvent::Failed.new(
36			endstream_id: endstream_id,
37			error_code: error_code,
38			error_description: error_description
39		).emit(REDIS)
40	end
41
42	def emit_outgoing_event(
43		owner_jid,
44		to:, body:, stanza_id:, media_urls: []
45	)
46		jid_to_owner(owner_jid) { |(owner, *)|
47			MessageEvent::Out.new(
48				owner: owner, from: owner, to: to, body: body.to_s,
49				stanza_id: stanza_id.to_s,
50				media_urls: media_urls
51			).emit(REDIS)
52		}.catch do |e|
53			log.warn("Failed to emit outgoing message event", error: e.message)
54		end
55	end
56end