Class: Appwrite::Client
- Inherits:
-
Object
- Object
- Appwrite::Client
- Defined in:
- lib/appwrite/client.rb
Instance Method Summary collapse
-
#add_header(key, value) ⇒ self
Add Header.
-
#call(method:, path: '', headers: {}, params: {}, response_type: nil) ⇒ self
Send the HTTP request.
- #chunked_upload(path:, headers:, params:, param_name: '', id_param_name: nil, on_progress: nil, response_type: nil) ⇒ Object
- #get_config(key) ⇒ Object
-
#get_headers ⇒ Hash
Get request headers.
-
#initialize ⇒ Client
constructor
A new instance of Client.
-
#set_cookie(value) ⇒ self
Set Cookie.
-
#set_dev_key(value) ⇒ self
Set DevKey.
-
#set_endpoint(endpoint) ⇒ self
Set endpoint.
-
#set_forwarded_user_agent(value) ⇒ self
Set ForwardedUserAgent.
-
#set_impersonate_user_email(value) ⇒ self
Set ImpersonateUserEmail.
-
#set_impersonate_user_id(value) ⇒ self
Set ImpersonateUserId.
-
#set_impersonate_user_phone(value) ⇒ self
Set ImpersonateUserPhone.
-
#set_jwt(value) ⇒ self
Set JWT.
-
#set_key(value) ⇒ self
Set Key.
-
#set_locale(value) ⇒ self
Set Locale.
-
#set_project(value) ⇒ self
Set Project.
-
#set_self_signed(self_signed = true) ⇒ self
Set self signed.
-
#set_session(value) ⇒ self
Set Session.
Constructor Details
#initialize ⇒ Client
Returns a new instance of Client.
11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/appwrite/client.rb', line 11 def initialize @chunk_size = 5*1024*1024 @headers = { 'user-agent' => RUBY_PLATFORM + ':ruby-' + RUBY_VERSION, 'x-sdk-name'=> 'Ruby', 'x-sdk-platform'=> 'server', 'x-sdk-language'=> 'ruby', 'x-sdk-version'=> '25.1.0', 'X-Appwrite-Response-Format' => '1.9.5' } @endpoint = 'https://cloud.appwrite.io/v1' @config = {} end |
Instance Method Details
#add_header(key, value) ⇒ self
Add Header
212 213 214 215 216 |
# File 'lib/appwrite/client.rb', line 212 def add_header(key, value) @headers[key.downcase] = value self end |
#call(method:, path: '', headers: {}, params: {}, response_type: nil) ⇒ self
Send the HTTP request.
234 235 236 237 238 239 240 241 242 243 244 245 |
# File 'lib/appwrite/client.rb', line 234 def call( method:, path: '', headers: {}, params: {}, response_type: nil ) separator = path.include?('?') ? '&' : '?' uri = URI.parse(@endpoint + path + ((method == "GET" && params.length) ? separator + encode(params) : '')) fetch(method, uri, headers, params, response_type) end |
#chunked_upload(path:, headers:, params:, param_name: '', id_param_name: nil, on_progress: nil, response_type: nil) ⇒ Object
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 |
# File 'lib/appwrite/client.rb', line 247 def chunked_upload( path:, headers:, params:, param_name: '', id_param_name: nil, on_progress: nil, response_type: nil ) input_file = params[param_name.to_sym] case input_file.source_type when 'path' size = ::File.size(input_file.path) when 'string' size = input_file.data.bytesize end if size < @chunk_size if input_file.source_type == 'path' input_file.data = IO.read(input_file.path) end params[param_name.to_sym] = input_file return call( method: 'POST', path: path, headers: headers, params: params, response_type: response_type, ) end offset = 0 id_param_name = id_param_name.to_sym if id_param_name upload_id = nil chunks_uploaded = 0 if id_param_name&.empty? == false upload_id = params[id_param_name] # Make a request to check if a file already exists begin current = call( method: "GET", path: "#{path}/#{params[id_param_name]}", headers: headers, params: {} ) chunks_uploaded = current['chunksUploaded'].to_i offset = chunks_uploaded * @chunk_size rescue Appwrite::Exception => error raise error unless error.code.to_i == 404 end end total_chunks = (size.to_f / @chunk_size).ceil chunks = [] while offset < size chunks << { index: chunks_uploaded.to_i, start: offset, ending: [offset + @chunk_size, size].min } offset += @chunk_size chunks_uploaded = chunks_uploaded.to_i + 1 end result = current if defined?(current) return result unless chunks.any? upload_chunk = lambda do |chunk, current_upload_id| case input_file.source_type when 'path' string = IO.read(input_file.path, chunk[:ending] - chunk[:start], chunk[:start]) when 'string' string = input_file.data.byteslice(chunk[:start], chunk[:ending] - chunk[:start]) end chunk_params = params.merge(param_name.to_sym => InputFile::from_string( string, filename: input_file.filename, mime_type: input_file.mime_type )) chunk_headers = headers.merge('content-range' => "bytes #{chunk[:start]}-#{chunk[:ending] - 1}/#{size}") chunk_headers['x-appwrite-id'] = current_upload_id if current_upload_id call( method: 'POST', path: path, headers: chunk_headers, params: chunk_params, ) end result = upload_chunk.call(chunks.first, upload_id) upload_id = result['$id'] if result['$id'] completed_count = chunks.first[:index] + 1 uploaded_size = chunks.first[:ending] upload_complete = lambda do |chunk_result| chunks_uploaded = chunk_result['chunksUploaded'] return false if chunks_uploaded.nil? chunks_total = chunk_result['chunksTotal'] || total_chunks chunks_uploaded.to_i >= chunks_total.to_i end on_progress.call({ id: result['$id'], progress: uploaded_size.to_f/size.to_f * 100.0, size_uploaded: uploaded_size, chunks_total: result['chunksTotal'] || total_chunks, chunks_uploaded: result['chunksUploaded'] || completed_count }) unless on_progress.nil? mutex = Mutex.new queue = Queue.new chunks.drop(1).each { |chunk| queue << chunk } first_error = nil last_result = result completed_result = nil workers = [8, queue.size].min.times.map do Thread.new do loop do break if mutex.synchronize { !first_error.nil? } chunk = begin queue.pop(true) rescue ThreadError nil end break unless chunk begin chunk_result = upload_chunk.call(chunk, upload_id) rescue => error mutex.synchronize { first_error ||= error } break end mutex.synchronize do completed_count += 1 uploaded_size += chunk[:ending] - chunk[:start] last_result = chunk_result completed_result = chunk_result if upload_complete.call(chunk_result) on_progress.call({ id: upload_id, progress: uploaded_size.to_f/size.to_f * 100.0, size_uploaded: uploaded_size, chunks_total: chunk_result['chunksTotal'] || total_chunks, chunks_uploaded: chunk_result['chunksUploaded'] || completed_count }) unless on_progress.nil? end end end end workers.each(&:join) raise first_error if first_error result = completed_result || last_result return result unless response_type.respond_to?("from") response_type.from(map: result) end |
#get_config(key) ⇒ Object
176 177 178 |
# File 'lib/appwrite/client.rb', line 176 def get_config(key) @config[key] || '' end |
#get_headers ⇒ Hash
Get request headers
221 222 223 |
# File 'lib/appwrite/client.rb', line 221 def get_headers @headers.dup end |
#set_cookie(value) ⇒ self
Set Cookie
The user cookie to authenticate with. Used by SDKs that forward an incoming Cookie header in server-side runtimes.
127 128 129 130 131 132 |
# File 'lib/appwrite/client.rb', line 127 def (value) add_header('cookie', value) @config['cookie'] = value self end |
#set_dev_key(value) ⇒ self
Set DevKey
Your secret dev API key
113 114 115 116 117 118 |
# File 'lib/appwrite/client.rb', line 113 def set_dev_key(value) add_header('x-appwrite-dev-key', value) @config['devkey'] = value self end |
#set_endpoint(endpoint) ⇒ self
Set endpoint.
185 186 187 188 189 190 191 192 193 |
# File 'lib/appwrite/client.rb', line 185 def set_endpoint(endpoint) if not endpoint.start_with?('http://') and not endpoint.start_with?('https://') raise Appwrite::Exception.new('Invalid endpoint URL: ' + endpoint) end @endpoint = endpoint self end |
#set_forwarded_user_agent(value) ⇒ self
Set ForwardedUserAgent
The user agent string of the client that made the request
99 100 101 102 103 104 |
# File 'lib/appwrite/client.rb', line 99 def set_forwarded_user_agent(value) add_header('x-forwarded-user-agent', value) @config['forwardeduseragent'] = value self end |
#set_impersonate_user_email(value) ⇒ self
Set ImpersonateUserEmail
Impersonate a user by email on an already user-authenticated request. Requires the current request to be authenticated as a user with impersonator capability; X-Appwrite-Key alone is not sufficient. Impersonator users are intentionally granted users.read so they can discover a target before impersonation begins. Internal audit logs still attribute actions to the original impersonator and record the impersonated target only in internal audit payload data.
155 156 157 158 159 160 |
# File 'lib/appwrite/client.rb', line 155 def set_impersonate_user_email(value) add_header('x-appwrite-impersonate-user-email', value) @config['impersonateuseremail'] = value self end |
#set_impersonate_user_id(value) ⇒ self
Set ImpersonateUserId
Impersonate a user by ID on an already user-authenticated request. Requires the current request to be authenticated as a user with impersonator capability; X-Appwrite-Key alone is not sufficient. Impersonator users are intentionally granted users.read so they can discover a target before impersonation begins. Internal audit logs still attribute actions to the original impersonator and record the impersonated target only in internal audit payload data.
141 142 143 144 145 146 |
# File 'lib/appwrite/client.rb', line 141 def set_impersonate_user_id(value) add_header('x-appwrite-impersonate-user-id', value) @config['impersonateuserid'] = value self end |
#set_impersonate_user_phone(value) ⇒ self
Set ImpersonateUserPhone
Impersonate a user by phone on an already user-authenticated request. Requires the current request to be authenticated as a user with impersonator capability; X-Appwrite-Key alone is not sufficient. Impersonator users are intentionally granted users.read so they can discover a target before impersonation begins. Internal audit logs still attribute actions to the original impersonator and record the impersonated target only in internal audit payload data.
169 170 171 172 173 174 |
# File 'lib/appwrite/client.rb', line 169 def set_impersonate_user_phone(value) add_header('x-appwrite-impersonate-user-phone', value) @config['impersonateuserphone'] = value self end |
#set_jwt(value) ⇒ self
Set JWT
Your secret JSON Web Token
59 60 61 62 63 64 |
# File 'lib/appwrite/client.rb', line 59 def set_jwt(value) add_header('x-appwrite-jwt', value) @config['jwt'] = value self end |
#set_key(value) ⇒ self
Set Key
Your secret API key
45 46 47 48 49 50 |
# File 'lib/appwrite/client.rb', line 45 def set_key(value) add_header('x-appwrite-key', value) @config['key'] = value self end |
#set_locale(value) ⇒ self
Set Locale
71 72 73 74 75 76 |
# File 'lib/appwrite/client.rb', line 71 def set_locale(value) add_header('x-appwrite-locale', value) @config['locale'] = value self end |
#set_project(value) ⇒ self
Set Project
Your project ID
32 33 34 35 36 |
# File 'lib/appwrite/client.rb', line 32 def set_project(value) @config['project'] = value self end |
#set_self_signed(self_signed = true) ⇒ self
Set self signed.
200 201 202 203 204 |
# File 'lib/appwrite/client.rb', line 200 def set_self_signed(self_signed = true) @self_signed = self_signed self end |
#set_session(value) ⇒ self
Set Session
The user session to authenticate with
85 86 87 88 89 90 |
# File 'lib/appwrite/client.rb', line 85 def set_session(value) add_header('x-appwrite-session', value) @config['session'] = value self end |