Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add Webex InstantConnect driver #283

Merged
merged 9 commits into from
Mar 14, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions drivers/webex/instant_connect.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
class Webex::InstantConnect < PlaceOS::Driver
# Discovery Information
generic_name :InstantConnect
descriptive_name "Webex InstantConnect"
uri_base "https://mtg-broker-a.wbx2.com"

default_settings({
bot_access_token: "token",
})

@audience_setting = ""
tassja marked this conversation as resolved.
Show resolved Hide resolved

def create_meeting(meeting_id : String)
expiry = 24.hours.from_now.to_unix
payload = {
"aud": @audience_setting,
"jwt": {
"sub": meeting_id,
"exp": expiry,
},
}.to_json

response = post("/api/v1/joseencrypt", body: payload, headers: {
"Content-Type" => "application/json",
"Authorization" => "Bearer #{setting String, :bot_access_token}",
})

raise "request failed with #{response.status_code}" unless response.status_code == 200
response_body = NamedTuple(host: Array(String), guest: Array(String)).from_json(response.body.not_nil!)
puts response_body
return_hash = Hash(String, String).new
response_body.each do |key, value|
return_hash[key.to_s] = value.first.to_s
end
return_hash
end
end
38 changes: 38 additions & 0 deletions drivers/webex/instant_connect_spec.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# require "placeos-driver/spec"

DriverSpecs.mock_driver "Webex::InstantConnect" do
# Send the request
retval = exec(:create_meeting,
meeting_id: "1",
)

# InstantConnect should send a HTTP request
expect_http_request do |request, response|
headers = request.headers
io = request.body
if io
data = io.gets_to_end
request = JSON.parse(data)
if request.to_s.includes?(%("aud" => "a4d886b0-979f-4e2c-a958-3e8c14605e51")) && headers["Authorization"].includes?(%(Bearer))
response.status_code = 200
response << RAW_RESPONSE
else
response.status_code = 401
end
else
raise "expected request to include meeting details #{request.inspect}"
end
end
retval.get.should eq(HASHED_RESPONSE)
end

RAW_RESPONSE = %({
"host": [
"eyJwMnMiOiJCWXpoYmV4W"
],
"guest": [
"eyJwMnMiOiJaVVJsejNsb1"
]
})

HASHED_RESPONSE = {"host" => "eyJwMnMiOiJCWXpoYmV4W", "guest" => "eyJwMnMiOiJaVVJsejNsb1"}