edgebase_core 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 863c34754501e695e158e1ec1d2efd117721a43a484276f0cece831669f1e11b
4
- data.tar.gz: 0ee94fe11ad404c9973ccdcf80c08209704435bd5cf549fd2e3ba8641df68d59
3
+ metadata.gz: 2136ccb71c9f415d7a60e444e1e4fe74e2daca64a283613ce3ba9e067aef11cb
4
+ data.tar.gz: 4ad0f8d6529d442f9d2f173dc0fa2ff7e5a226539d37308b9c8ff0c26ded44b1
5
5
  SHA512:
6
- metadata.gz: 5108ab71e83e447485847ea93255b180fed9dc837ed23e14a180fc02660d077633d70a6173b85be49943d060f78224a32e1a2cb275facde8d91a50578f3c159b
7
- data.tar.gz: 863b5381f5b712649ef566daf1421004e5b96ce9be02b00a625b60028d57b2f71d7e93f780ada71e3c0bbafd029e24636be6a9f8506279e4bd225d0f3e1aa695
6
+ metadata.gz: d57a88b32dfe78079672b20e7de97e6b9f5691770777e329330619109c28e6da67378d4f19b2f9c70354296b63fc7d62bd22af217e41a3ffa6eb510fd9dacded
7
+ data.tar.gz: 452ceed9d70939fdd7a336b4bcab13cf80a9fc086e5f873a0f3d93d23bf697252673cb7fb9a976b62ea2326737300a676bc3c4c1bd73ffd9bd1703325aface5f
@@ -237,6 +237,51 @@ module EdgebaseCore
237
237
  @http.get("/auth/oauth/link/#{CGI.escape(provider).gsub('+', '%20')}/callback")
238
238
  end
239
239
 
240
+ # Count records in a single-instance table — GET /api/db/{namespace}/tables/{table}/count
241
+ def db_single_count_records(namespace, table, query: nil)
242
+ @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/count", params: query)
243
+ end
244
+
245
+ # Search records in a single-instance table — GET /api/db/{namespace}/tables/{table}/search
246
+ def db_single_search_records(namespace, table, query: nil)
247
+ @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/search", params: query)
248
+ end
249
+
250
+ # Get a single record from a single-instance table — GET /api/db/{namespace}/tables/{table}/{id}
251
+ def db_single_get_record(namespace, table, id, query: nil)
252
+ @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/#{CGI.escape(id).gsub('+', '%20')}", params: query)
253
+ end
254
+
255
+ # Update a record in a single-instance table — PATCH /api/db/{namespace}/tables/{table}/{id}
256
+ def db_single_update_record(namespace, table, id, body = nil)
257
+ @http.patch("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/#{CGI.escape(id).gsub('+', '%20')}", body)
258
+ end
259
+
260
+ # Delete a record from a single-instance table — DELETE /api/db/{namespace}/tables/{table}/{id}
261
+ def db_single_delete_record(namespace, table, id)
262
+ @http.delete("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/#{CGI.escape(id).gsub('+', '%20')}")
263
+ end
264
+
265
+ # List records from a single-instance table — GET /api/db/{namespace}/tables/{table}
266
+ def db_single_list_records(namespace, table, query: nil)
267
+ @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}", params: query)
268
+ end
269
+
270
+ # Insert a record into a single-instance table — POST /api/db/{namespace}/tables/{table}
271
+ def db_single_insert_record(namespace, table, body = nil, query: nil)
272
+ @http.post("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}", body, params: query)
273
+ end
274
+
275
+ # Batch insert records into a single-instance table — POST /api/db/{namespace}/tables/{table}/batch
276
+ def db_single_batch_records(namespace, table, body = nil, query: nil)
277
+ @http.post("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/batch", body, params: query)
278
+ end
279
+
280
+ # Batch update/delete records by filter in a single-instance table — POST /api/db/{namespace}/tables/{table}/batch-by-filter
281
+ def db_single_batch_by_filter(namespace, table, body = nil, query: nil)
282
+ @http.post("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/batch-by-filter", body, params: query)
283
+ end
284
+
240
285
  # Count records in dynamic table — GET /api/db/{namespace}/{instanceId}/tables/{table}/count
241
286
  def db_count_records(namespace, instance_id, table, query: nil)
242
287
  @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/#{CGI.escape(instance_id).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/count", params: query)
@@ -447,55 +492,15 @@ module EdgebaseCore
447
492
  @http.put("/room/media/realtime/tracks/close", body, params: query)
448
493
  end
449
494
 
495
+ # Create a room Cloudflare RealtimeKit session — POST /api/room/media/cloudflare_realtimekit/session
496
+ def create_room_cloudflare_realtime_kit_session(body = nil, query: nil)
497
+ @http.post("/room/media/cloudflare_realtimekit/session", body, params: query)
498
+ end
499
+
450
500
  # Track custom events — POST /api/analytics/track
451
501
  def track_events(body = nil)
452
502
  @http.post("/analytics/track", body)
453
503
  end
454
-
455
- # Count records in a single-instance table — GET /api/db/{namespace}/tables/{table}/count
456
- def db_single_count_records(namespace, table, query: nil)
457
- @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/count", params: query)
458
- end
459
-
460
- # Search records in a single-instance table — GET /api/db/{namespace}/tables/{table}/search
461
- def db_single_search_records(namespace, table, query: nil)
462
- @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/search", params: query)
463
- end
464
-
465
- # Get a single record from a single-instance table — GET /api/db/{namespace}/tables/{table}/{id}
466
- def db_single_get_record(namespace, table, id, query: nil)
467
- @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/#{CGI.escape(id).gsub('+', '%20')}", params: query)
468
- end
469
-
470
- # Update a record in a single-instance table — PATCH /api/db/{namespace}/tables/{table}/{id}
471
- def db_single_update_record(namespace, table, id, body = nil)
472
- @http.patch("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/#{CGI.escape(id).gsub('+', '%20')}", body)
473
- end
474
-
475
- # Delete a record from a single-instance table — DELETE /api/db/{namespace}/tables/{table}/{id}
476
- def db_single_delete_record(namespace, table, id)
477
- @http.delete("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/#{CGI.escape(id).gsub('+', '%20')}")
478
- end
479
-
480
- # List records from a single-instance table — GET /api/db/{namespace}/tables/{table}
481
- def db_single_list_records(namespace, table, query: nil)
482
- @http.get("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}", params: query)
483
- end
484
-
485
- # Insert a record into a single-instance table — POST /api/db/{namespace}/tables/{table}
486
- def db_single_insert_record(namespace, table, body = nil, query: nil)
487
- @http.post("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}", body, params: query)
488
- end
489
-
490
- # Batch insert records into a single-instance table — POST /api/db/{namespace}/tables/{table}/batch
491
- def db_single_batch_records(namespace, table, body = nil, query: nil)
492
- @http.post("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/batch", body, params: query)
493
- end
494
-
495
- # Batch update/delete records by filter in a single-instance table — POST /api/db/{namespace}/tables/{table}/batch-by-filter
496
- def db_single_batch_by_filter(namespace, table, body = nil, query: nil)
497
- @http.post("/db/#{CGI.escape(namespace).gsub('+', '%20')}/tables/#{CGI.escape(table).gsub('+', '%20')}/batch-by-filter", body, params: query)
498
- end
499
504
  end
500
505
 
501
506
 
@@ -525,12 +530,15 @@ module EdgebaseCore
525
530
  ADMIN_GET_AUTH_SETTINGS = "/admin/api/data/auth/settings"
526
531
  ADMIN_BACKUP_GET_CONFIG = "/admin/api/data/backup/config"
527
532
  ADMIN_BACKUP_DUMP_D1 = "/admin/api/data/backup/dump-d1"
533
+ ADMIN_BACKUP_DUMP_DATA = "/admin/api/data/backup/dump-data"
528
534
  ADMIN_BACKUP_DUMP_DO = "/admin/api/data/backup/dump-do"
529
535
  ADMIN_BACKUP_LIST_DOS = "/admin/api/data/backup/list-dos"
530
536
  ADMIN_BACKUP_RESTORE_D1 = "/admin/api/data/backup/restore-d1"
537
+ ADMIN_BACKUP_RESTORE_DATA = "/admin/api/data/backup/restore-data"
531
538
  ADMIN_BACKUP_RESTORE_DO = "/admin/api/data/backup/restore-do"
532
539
  ADMIN_CLEANUP_ANON = "/admin/api/data/cleanup-anon"
533
540
  ADMIN_GET_CONFIG_INFO = "/admin/api/data/config-info"
541
+ ADMIN_DESTROY_APP = "/admin/api/data/destroy-app"
534
542
  ADMIN_GET_DEV_INFO = "/admin/api/data/dev-info"
535
543
  ADMIN_GET_EMAIL_TEMPLATES = "/admin/api/data/email/templates"
536
544
  ADMIN_LIST_FUNCTIONS = "/admin/api/data/functions"
@@ -613,6 +621,7 @@ module EdgebaseCore
613
621
  PUSH_UNREGISTER = "/api/push/unregister"
614
622
  CONNECT_ROOM = "/api/room"
615
623
  CHECK_ROOM_CONNECTION = "/api/room/connect-check"
624
+ CREATE_ROOM_CLOUDFLARE_REALTIME_KIT_SESSION = "/api/room/media/cloudflare_realtimekit/session"
616
625
  RENEGOTIATE_ROOM_REALTIME_SESSION = "/api/room/media/realtime/renegotiate"
617
626
  GET_ROOM_REALTIME_SESSION = "/api/room/media/realtime/session"
618
627
  CREATE_ROOM_REALTIME_SESSION = "/api/room/media/realtime/session"
@@ -635,6 +644,10 @@ module EdgebaseCore
635
644
  "/admin/api/data/admins/#{id}/password"
636
645
  end
637
646
 
647
+ def self.admin_list_namespace_instances(namespace)
648
+ "/admin/api/data/namespaces/#{namespace}/instances"
649
+ end
650
+
638
651
  def self.admin_list_bucket_objects(name)
639
652
  "/admin/api/data/storage/buckets/#{name}/objects"
640
653
  end
@@ -104,6 +104,27 @@ module EdgebaseCore
104
104
 
105
105
  private
106
106
 
107
+ def parse_retry_after_delay(response, attempt)
108
+ base_delay = 1.0 * (2 ** attempt)
109
+ retry_after = response["retry-after"] || response["Retry-After"]
110
+ if retry_after
111
+ begin
112
+ seconds = Integer(retry_after)
113
+ base_delay = seconds.to_f if seconds > 0
114
+ rescue ArgumentError
115
+ # ignore non-integer Retry-After
116
+ end
117
+ end
118
+ jitter = rand * base_delay * 0.25
119
+ [base_delay + jitter, 10.0].min
120
+ end
121
+
122
+ RETRYABLE_ERRORS = [
123
+ Net::OpenTimeout, Net::ReadTimeout, Errno::ECONNREFUSED,
124
+ Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EHOSTUNREACH,
125
+ SocketError, EOFError
126
+ ].freeze
127
+
107
128
  def request(method, path, params: nil, json_body: nil)
108
129
  url = build_url(path)
109
130
  if params && !params.empty?
@@ -111,22 +132,46 @@ module EdgebaseCore
111
132
  url = "#{url}?#{query}"
112
133
  end
113
134
 
114
- uri = URI(url)
115
- http = build_http(uri)
135
+ max_retries = 3
136
+ last_response = nil
116
137
 
117
- req = case method
118
- when "GET" then Net::HTTP::Get.new(uri)
119
- when "POST" then Net::HTTP::Post.new(uri)
120
- when "PATCH" then Net::HTTP::Patch.new(uri)
121
- when "PUT" then Net::HTTP::Put.new(uri)
122
- when "DELETE" then Net::HTTP::Delete.new(uri)
123
- else Net::HTTP::Get.new(uri)
124
- end
138
+ (max_retries + 1).times do |attempt|
139
+ uri = URI(url)
140
+ http = build_http(uri)
125
141
 
126
- auth_headers.each { |k, v| req[k] = v }
127
- req.body = JSON.generate(json_body) if json_body
142
+ req = case method
143
+ when "GET" then Net::HTTP::Get.new(uri)
144
+ when "POST" then Net::HTTP::Post.new(uri)
145
+ when "PATCH" then Net::HTTP::Patch.new(uri)
146
+ when "PUT" then Net::HTTP::Put.new(uri)
147
+ when "DELETE" then Net::HTTP::Delete.new(uri)
148
+ else Net::HTTP::Get.new(uri)
149
+ end
128
150
 
129
- parse_response(http.request(req))
151
+ auth_headers.each { |k, v| req[k] = v }
152
+ req.body = JSON.generate(json_body) if json_body
153
+
154
+ begin
155
+ response = http.request(req)
156
+ last_response = response
157
+ rescue *RETRYABLE_ERRORS => e
158
+ if attempt < 2
159
+ sleep(0.05 * (attempt + 1))
160
+ next
161
+ end
162
+ raise EdgeBaseError.new(0, "Request failed: #{e.message}")
163
+ end
164
+
165
+ if response.code.to_i == 429 && attempt < max_retries
166
+ delay = parse_retry_after_delay(response, attempt)
167
+ sleep(delay)
168
+ next
169
+ end
170
+
171
+ return parse_response(response)
172
+ end
173
+
174
+ parse_response(last_response)
130
175
  end
131
176
 
132
177
  def build_url(path)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edgebase_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - EdgeBase
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-20 00:00:00.000000000 Z
11
+ date: 2026-03-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Core module for EdgeBase Ruby SDK. Provides HttpClient, TableRef, DocRef,
14
14
  StorageClient, and generated API layer from OpenAPI spec.