class SleepIQ::Client

Attributes

awsalb[RW]
bedid[RW]
key[RW]
sessid[RW]

Public Class Methods

new(**opts) click to toggle source
# File lib/sleepiq/client.rb, line 14
def initialize(**opts) # rubocop:disable Metrics/AbcSize
  @username = opts[:username].nil? ? ENV['sleepiq_username'] : opts[:username]
  @password = opts[:password].nil? ? ENV['sleepiq_password'] : opts[:password]
  @key = opts[:key]
  @awsalb = opts[:awsalb]
  @sessid = opts[:sessid]
  @bedid = opts[:bedid]

  login if @key.nil? || @awsalb.nil? || @sessid.nil?

  @conn = Faraday.new(
    url:     'https://api.sleepiq.sleepnumber.com',
    headers: default_headers,
    params:  { _k: @key },
    request: { timeout: 10, open_timeout: 3, write_timeout: 10 }
  ) do |conn|
    conn.response :json
    conn.adapter :net_http
  end

  @bedid = family_status['beds'][0]['bedId'] if @bedid.nil?
end

Public Instance Methods

default_headers() click to toggle source
# File lib/sleepiq/client.rb, line 64
def default_headers
  { 'Content-Type':    'text/plain',
    'Host':            'api.sleepiq.sleepnumber.com',
    'Accept':          '*/*',
    'Cache-Control':   'no-cache',
    'Accept-Encoding': 'gzip, deflate',
    'Connection':      'keep-alive',
    'Cookie':          "AWSALB=#{@awsalb}; JSESSIONID=#{@sessid}" }
end
login(username = @username, password = @password) click to toggle source
# File lib/sleepiq/client.rb, line 37
def login(username = @username, password = @password) # rubocop:disable Metrics/AbcSize
  login_conn = Faraday.new(
    url:     'https://api.sleepiq.sleepnumber.com',
    ssl:     { verify: false },
    headers: { 'Content-Type': 'text/plain', 'Host': 'api.sleepiq.sleepnumber.com' }
  ) do |conn|
    conn.response :json
    conn.adapter :net_http
  end

  result = login_conn.put do |req|
    req.url '/rest/login'
    req.options.timeout = 10
    req.options.write_timeout = 10
    req.options.open_timeout = 3
    req.body = "{\"login\":\"#{username}\",\"password\":\"#{password}\"}"
  end

  raise "status code was #{result.status}" unless result.status == 200

  result.headers['set-cookie'].split(' ').each do |k, _v|
    @sessid = k.split('=')[1].delete_suffix(';') if k.include? 'JSESSIONID'
    @awsalb = k.split('=')[1].delete_suffix(';') if k.include? 'AWSALB'
  end
  @key = result.body['key']
end