svix 2.2.0 → 2.4.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 +4 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +1 -25
- data/lib/svix/api/destination.rb +75 -0
- data/lib/svix/api/destination_transformation.rb +30 -0
- data/lib/svix/api_internal/destination.rb +14 -0
- data/lib/svix/api_internal/destination_autoconfig.rb +22 -0
- data/lib/svix/api_internal/endpoint.rb +4 -2
- data/lib/svix/api_internal/{endpoint_auto_config.rb → endpoint_auto_config_deprecated.rb} +1 -1
- data/lib/svix/api_internal/endpoint_autoconfig.rb +30 -0
- data/lib/svix/autoconfig.rb +53 -19
- data/lib/svix/autoconfig_consumer.rb +70 -9
- data/lib/svix/models/adobe_sign_config.rb +3 -3
- data/lib/svix/models/adobe_sign_config_out.rb +2 -2
- data/lib/svix/models/aggregate_event_types_out.rb +6 -6
- data/lib/svix/models/airwallex_config.rb +3 -3
- data/lib/svix/models/airwallex_config_out.rb +2 -2
- data/lib/svix/models/api_token_out.rb +8 -8
- data/lib/svix/models/app_portal_access_in.rb +8 -8
- data/lib/svix/models/app_portal_access_out.rb +4 -4
- data/lib/svix/models/app_usage_stats_in.rb +5 -5
- data/lib/svix/models/app_usage_stats_out.rb +7 -7
- data/lib/svix/models/application_in.rb +6 -6
- data/lib/svix/models/application_out.rb +9 -9
- data/lib/svix/models/application_patch.rb +4 -4
- data/lib/svix/models/application_token_expire_in.rb +4 -4
- data/lib/svix/models/auto_config_sink_type.rb +4 -8
- data/lib/svix/models/auto_config_subscription_out.rb +67 -0
- data/lib/svix/models/azure_blob_storage_config_in.rb +5 -5
- data/lib/svix/models/azure_blob_storage_config_out.rb +4 -4
- data/lib/svix/models/azure_blob_storage_config_patch.rb +5 -5
- data/lib/svix/models/background_task_out.rb +7 -7
- data/lib/svix/models/big_query_config_in.rb +6 -6
- data/lib/svix/models/big_query_config_out.rb +5 -5
- data/lib/svix/models/big_query_config_patch.rb +6 -6
- data/lib/svix/models/bulk_expunge_contents_in.rb +3 -3
- data/lib/svix/models/bulk_expunge_contents_out.rb +3 -3
- data/lib/svix/models/bulk_replay_in.rb +9 -9
- data/lib/svix/models/checkbook_config.rb +3 -3
- data/lib/svix/models/checkbook_config_out.rb +2 -2
- data/lib/svix/models/clickhouse_config_in.rb +7 -7
- data/lib/svix/models/clickhouse_config_out.rb +6 -6
- data/lib/svix/models/clickhouse_config_patch.rb +7 -7
- data/lib/svix/models/connector_in.rb +12 -12
- data/lib/svix/models/connector_out.rb +17 -17
- data/lib/svix/models/connector_patch.rb +7 -7
- data/lib/svix/models/connector_upsert_in.rb +10 -10
- data/lib/svix/models/create_stream_events_in.rb +4 -4
- data/lib/svix/models/create_stream_events_out.rb +2 -2
- data/lib/svix/models/cron_config.rb +5 -5
- data/lib/svix/models/destination_in.rb +204 -0
- data/lib/svix/models/destination_out.rb +224 -0
- data/lib/svix/models/destination_patch.rb +190 -0
- data/lib/svix/models/destination_status.rb +31 -0
- data/lib/svix/models/destination_status_in.rb +29 -0
- data/lib/svix/models/destination_transform_in.rb +49 -0
- data/lib/svix/models/destination_transformation_out.rb +52 -0
- data/lib/svix/models/docusign_config.rb +3 -3
- data/lib/svix/models/docusign_config_out.rb +2 -2
- data/lib/svix/models/easypost_config.rb +3 -3
- data/lib/svix/models/easypost_config_out.rb +2 -2
- data/lib/svix/models/empty_response.rb +2 -2
- data/lib/svix/models/endpoint_headers_in.rb +3 -3
- data/lib/svix/models/endpoint_headers_out.rb +4 -4
- data/lib/svix/models/endpoint_headers_patch_in.rb +4 -4
- data/lib/svix/models/endpoint_in.rb +12 -12
- data/lib/svix/models/endpoint_message_out.rb +13 -13
- data/lib/svix/models/endpoint_out.rb +13 -13
- data/lib/svix/models/endpoint_patch.rb +5 -5
- data/lib/svix/models/endpoint_secret_out.rb +3 -3
- data/lib/svix/models/endpoint_secret_rotate_in.rb +4 -4
- data/lib/svix/models/endpoint_stats.rb +7 -7
- data/lib/svix/models/endpoint_transformation_in.rb +4 -4
- data/lib/svix/models/endpoint_transformation_out.rb +6 -6
- data/lib/svix/models/endpoint_transformation_patch.rb +2 -2
- data/lib/svix/models/endpoint_upsert_in.rb +10 -10
- data/lib/svix/models/environment_in.rb +5 -5
- data/lib/svix/models/environment_out.rb +7 -7
- data/lib/svix/models/event_bridge_config_in.rb +7 -7
- data/lib/svix/models/event_bridge_config_out.rb +6 -6
- data/lib/svix/models/event_bridge_config_patch.rb +7 -7
- data/lib/svix/models/event_example_in.rb +4 -4
- data/lib/svix/models/event_in.rb +4 -4
- data/lib/svix/models/event_out.rb +5 -5
- data/lib/svix/models/event_stream_out.rb +5 -5
- data/lib/svix/models/event_type_from_open_api.rb +8 -8
- data/lib/svix/models/event_type_import_open_api_in.rb +6 -6
- data/lib/svix/models/event_type_import_open_api_out.rb +3 -3
- data/lib/svix/models/event_type_import_open_api_out_data.rb +4 -4
- data/lib/svix/models/event_type_in.rb +9 -9
- data/lib/svix/models/event_type_out.rb +12 -12
- data/lib/svix/models/event_type_patch.rb +3 -3
- data/lib/svix/models/event_type_upsert_in.rb +8 -8
- data/lib/svix/models/expunge_all_contents_out.rb +6 -6
- data/lib/svix/models/fifo_endpoint_config_in.rb +52 -0
- data/lib/svix/models/github_config.rb +3 -3
- data/lib/svix/models/github_config_out.rb +2 -2
- data/lib/svix/models/google_cloud_pub_sub_config_in.rb +5 -5
- data/lib/svix/models/google_cloud_pub_sub_config_out.rb +4 -4
- data/lib/svix/models/google_cloud_pub_sub_config_patch.rb +5 -5
- data/lib/svix/models/google_cloud_storage_config_in.rb +4 -4
- data/lib/svix/models/google_cloud_storage_config_out.rb +3 -3
- data/lib/svix/models/google_cloud_storage_config_patch.rb +4 -4
- data/lib/svix/models/http_sink_headers_patch_in.rb +3 -3
- data/lib/svix/models/hubspot_config.rb +3 -3
- data/lib/svix/models/hubspot_config_out.rb +2 -2
- data/lib/svix/models/ingest_endpoint_headers_in.rb +3 -3
- data/lib/svix/models/ingest_endpoint_headers_out.rb +4 -4
- data/lib/svix/models/ingest_endpoint_in.rb +10 -10
- data/lib/svix/models/ingest_endpoint_out.rb +11 -11
- data/lib/svix/models/ingest_endpoint_secret_in.rb +4 -4
- data/lib/svix/models/ingest_endpoint_secret_out.rb +3 -3
- data/lib/svix/models/ingest_endpoint_transformation_out.rb +5 -5
- data/lib/svix/models/ingest_endpoint_transformation_patch.rb +2 -2
- data/lib/svix/models/ingest_endpoint_upsert_in.rb +8 -8
- data/lib/svix/models/ingest_source_consumer_portal_access_in.rb +4 -4
- data/lib/svix/models/ingest_source_in.rb +14 -13
- data/lib/svix/models/ingest_source_out.rb +18 -17
- data/lib/svix/models/integration_in.rb +4 -4
- data/lib/svix/models/integration_key_out.rb +3 -3
- data/lib/svix/models/integration_out.rb +7 -7
- data/lib/svix/models/integration_update.rb +4 -4
- data/lib/svix/models/list_response_application_out.rb +6 -6
- data/lib/svix/models/list_response_background_task_out.rb +6 -6
- data/lib/svix/models/list_response_connector_out.rb +6 -6
- data/lib/svix/models/list_response_destination_out.rb +58 -0
- data/lib/svix/models/list_response_endpoint_message_out.rb +6 -6
- data/lib/svix/models/list_response_endpoint_out.rb +6 -6
- data/lib/svix/models/list_response_event_type_out.rb +6 -6
- data/lib/svix/models/list_response_ingest_endpoint_out.rb +6 -6
- data/lib/svix/models/list_response_ingest_source_out.rb +6 -6
- data/lib/svix/models/list_response_integration_out.rb +6 -6
- data/lib/svix/models/list_response_message_attempt_out.rb +6 -6
- data/lib/svix/models/list_response_message_endpoint_out.rb +6 -6
- data/lib/svix/models/list_response_message_out.rb +6 -6
- data/lib/svix/models/list_response_operational_webhook_endpoint_out.rb +6 -6
- data/lib/svix/models/list_response_stream_event_type_out.rb +6 -6
- data/lib/svix/models/list_response_stream_out.rb +6 -6
- data/lib/svix/models/list_response_stream_sink_out.rb +6 -6
- data/lib/svix/models/merge_config.rb +46 -0
- data/lib/svix/models/merge_config_out.rb +43 -0
- data/lib/svix/models/message_attempt_out.rb +14 -14
- data/lib/svix/models/message_endpoint_out.rb +15 -15
- data/lib/svix/models/message_in.rb +21 -12
- data/lib/svix/models/message_out.rb +10 -10
- data/lib/svix/models/message_precheck_in.rb +4 -4
- data/lib/svix/models/message_precheck_out.rb +3 -3
- data/lib/svix/models/meta_config.rb +4 -4
- data/lib/svix/models/meta_config_out.rb +2 -2
- data/lib/svix/models/nango_config.rb +3 -3
- data/lib/svix/models/nango_config_out.rb +2 -2
- data/lib/svix/models/open_claw_config.rb +3 -3
- data/lib/svix/models/open_claw_config_out.rb +2 -2
- data/lib/svix/models/operational_webhook_endpoint_headers_in.rb +3 -3
- data/lib/svix/models/operational_webhook_endpoint_headers_out.rb +4 -4
- data/lib/svix/models/operational_webhook_endpoint_in.rb +11 -11
- data/lib/svix/models/operational_webhook_endpoint_out.rb +12 -12
- data/lib/svix/models/operational_webhook_endpoint_secret_in.rb +4 -4
- data/lib/svix/models/operational_webhook_endpoint_secret_out.rb +3 -3
- data/lib/svix/models/operational_webhook_endpoint_upsert_in.rb +9 -9
- data/lib/svix/models/orum_io_config.rb +3 -3
- data/lib/svix/models/orum_io_config_out.rb +3 -3
- data/lib/svix/models/otel_tracing_config_in.rb +4 -4
- data/lib/svix/models/otel_tracing_config_out.rb +4 -4
- data/lib/svix/models/otel_tracing_config_patch.rb +3 -3
- data/lib/svix/models/panda_doc_config.rb +3 -3
- data/lib/svix/models/panda_doc_config_out.rb +2 -2
- data/lib/svix/models/poller_v2_commit_in.rb +3 -3
- data/lib/svix/models/poller_v2_message_out.rb +12 -12
- data/lib/svix/models/poller_v2_poll_out.rb +4 -4
- data/lib/svix/models/polling_endpoint_consumer_seek_in.rb +3 -3
- data/lib/svix/models/polling_endpoint_consumer_seek_out.rb +3 -3
- data/lib/svix/models/polling_endpoint_message_out.rb +11 -11
- data/lib/svix/models/polling_endpoint_out.rb +5 -5
- data/lib/svix/models/port_io_config.rb +3 -3
- data/lib/svix/models/port_io_config_out.rb +2 -2
- data/lib/svix/models/postgres_config_in.rb +65 -0
- data/lib/svix/models/postgres_config_out.rb +52 -0
- data/lib/svix/models/postgres_config_patch.rb +55 -0
- data/lib/svix/models/rabbit_mq_config_in.rb +4 -4
- data/lib/svix/models/rabbit_mq_config_out.rb +3 -3
- data/lib/svix/models/rabbit_mq_config_patch.rb +4 -4
- data/lib/svix/models/recover_in.rb +4 -4
- data/lib/svix/models/recover_out.rb +6 -6
- data/lib/svix/models/redshift_config_in.rb +11 -11
- data/lib/svix/models/redshift_config_out.rb +10 -10
- data/lib/svix/models/redshift_config_patch.rb +7 -7
- data/lib/svix/models/replay_in.rb +4 -4
- data/lib/svix/models/replay_out.rb +6 -6
- data/lib/svix/models/rotate_poller_token_in.rb +4 -4
- data/lib/svix/models/rotate_token_out.rb +3 -3
- data/lib/svix/models/rutter_config.rb +3 -3
- data/lib/svix/models/rutter_config_out.rb +2 -2
- data/lib/svix/models/s3_config_in.rb +21 -11
- data/lib/svix/models/s3_config_out.rb +13 -7
- data/lib/svix/models/s3_config_patch.rb +14 -8
- data/lib/svix/models/segment_config.rb +3 -3
- data/lib/svix/models/segment_config_out.rb +2 -2
- data/lib/svix/models/shopify_config.rb +3 -3
- data/lib/svix/models/shopify_config_out.rb +2 -2
- data/lib/svix/models/sink_http_config_in.rb +5 -5
- data/lib/svix/models/sink_http_config_out.rb +4 -4
- data/lib/svix/models/sink_http_config_patch.rb +3 -3
- data/lib/svix/models/sink_in_common.rb +10 -10
- data/lib/svix/models/sink_secret_out.rb +3 -3
- data/lib/svix/models/sink_transform_in.rb +3 -3
- data/lib/svix/models/sink_transformation_out.rb +4 -4
- data/lib/svix/models/slack_config.rb +3 -3
- data/lib/svix/models/slack_config_out.rb +2 -2
- data/lib/svix/models/snowflake_config_in.rb +8 -8
- data/lib/svix/models/snowflake_config_out.rb +7 -7
- data/lib/svix/models/snowflake_config_patch.rb +8 -8
- data/lib/svix/models/sns_config_in.rb +7 -7
- data/lib/svix/models/sns_config_out.rb +5 -5
- data/lib/svix/models/sns_config_patch.rb +6 -6
- data/lib/svix/models/sqs_config_in.rb +7 -7
- data/lib/svix/models/sqs_config_out.rb +6 -6
- data/lib/svix/models/sqs_config_patch.rb +6 -6
- data/lib/svix/models/status.rb +29 -0
- data/lib/svix/models/stream_event_type_in.rb +7 -7
- data/lib/svix/models/stream_event_type_out.rb +9 -9
- data/lib/svix/models/stream_event_type_patch.rb +2 -2
- data/lib/svix/models/stream_in.rb +5 -5
- data/lib/svix/models/stream_out.rb +8 -8
- data/lib/svix/models/stream_patch.rb +4 -4
- data/lib/svix/models/stream_portal_access_in.rb +5 -5
- data/lib/svix/models/stream_sink_in.rb +19 -18
- data/lib/svix/models/stream_sink_out.rb +42 -24
- data/lib/svix/models/stream_sink_patch.rb +15 -14
- data/lib/svix/models/stream_token_expire_in.rb +4 -4
- data/lib/svix/models/stripe_config.rb +3 -3
- data/lib/svix/models/stripe_config_out.rb +2 -2
- data/lib/svix/models/subscribe_in.rb +4 -4
- data/lib/svix/models/svix_config.rb +3 -3
- data/lib/svix/models/svix_config_out.rb +2 -2
- data/lib/svix/models/tailscale_config.rb +7 -4
- data/lib/svix/models/tailscale_config_out.rb +2 -2
- data/lib/svix/models/telnyx_config.rb +3 -3
- data/lib/svix/models/telnyx_config_out.rb +3 -3
- data/lib/svix/models/vapi_config.rb +3 -3
- data/lib/svix/models/vapi_config_out.rb +2 -2
- data/lib/svix/models/veriff_config.rb +3 -3
- data/lib/svix/models/veriff_config_out.rb +2 -2
- data/lib/svix/models/vgs_config.rb +3 -3
- data/lib/svix/models/vgs_config_out.rb +2 -2
- data/lib/svix/models/zoom_config.rb +3 -3
- data/lib/svix/models/zoom_config_out.rb +2 -2
- data/lib/svix/svix.rb +7 -0
- data/lib/svix/svix_http_client.rb +1 -1
- data/lib/svix/version.rb +1 -1
- data/lib/svix.rb +16 -0
- metadata +24 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 80a5c538c52aca1bfdc78b0c292d1b98026e33d52d34d046018cb29f46299045
|
|
4
|
+
data.tar.gz: ef7c60c07d70db846465d98192659f868fc64525b272c067e33994b5d32e4a7c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c575396bda140b62d3f6d033f57b3fdfe87752a372e2bfdc009da887a7a7d9cbc16d47cc0e428d93bdaa0e17686f86e13ba522f4037dd299421ee4215ea340cf
|
|
7
|
+
data.tar.gz: 7857cacda9161bcce17b0b3a0a96ffaf046b2db17e856f3ecc8932c5effd9f13e7efe774e284f2fa9780a50256fa247999e44c21d94b27c0847974870d6226b3
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
svix (2.
|
|
4
|
+
svix (2.4.0)
|
|
5
5
|
base64 (~> 0.3.0)
|
|
6
6
|
logger (~> 1.0)
|
|
7
7
|
|
|
@@ -16,33 +16,11 @@ GEM
|
|
|
16
16
|
bigdecimal
|
|
17
17
|
rexml
|
|
18
18
|
diff-lcs (1.6.2)
|
|
19
|
-
erb (6.0.7)
|
|
20
19
|
hashdiff (1.2.1)
|
|
21
|
-
io-console (0.9.2)
|
|
22
|
-
irb (1.18.0)
|
|
23
|
-
pp (>= 0.6.0)
|
|
24
|
-
prism (>= 1.3.0)
|
|
25
|
-
rdoc (>= 4.0.0)
|
|
26
|
-
reline (>= 0.4.2)
|
|
27
20
|
logger (1.7.0)
|
|
28
21
|
ostruct (0.6.3)
|
|
29
|
-
pp (0.6.4)
|
|
30
|
-
prettyprint
|
|
31
|
-
prettyprint (0.2.0)
|
|
32
|
-
prism (1.9.0)
|
|
33
22
|
public_suffix (7.0.5)
|
|
34
23
|
rake (13.4.1)
|
|
35
|
-
rbs (4.1.3)
|
|
36
|
-
logger
|
|
37
|
-
prism (>= 1.6.0)
|
|
38
|
-
tsort
|
|
39
|
-
rdoc (8.0.0)
|
|
40
|
-
erb
|
|
41
|
-
prism (>= 1.6.0)
|
|
42
|
-
rbs (>= 4.0.0)
|
|
43
|
-
tsort
|
|
44
|
-
reline (0.7.0)
|
|
45
|
-
io-console (~> 0.5)
|
|
46
24
|
rexml (3.4.4)
|
|
47
25
|
rspec (3.13.2)
|
|
48
26
|
rspec-core (~> 3.13.0)
|
|
@@ -58,7 +36,6 @@ GEM
|
|
|
58
36
|
rspec-support (~> 3.13.0)
|
|
59
37
|
rspec-support (3.13.7)
|
|
60
38
|
subprocess (1.5.7)
|
|
61
|
-
tsort (0.2.0)
|
|
62
39
|
webmock (3.26.2)
|
|
63
40
|
addressable (>= 2.8.0)
|
|
64
41
|
crack (>= 0.3.2)
|
|
@@ -69,7 +46,6 @@ PLATFORMS
|
|
|
69
46
|
|
|
70
47
|
DEPENDENCIES
|
|
71
48
|
base64
|
|
72
|
-
irb
|
|
73
49
|
logger
|
|
74
50
|
ostruct
|
|
75
51
|
rake (~> 13.0)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# This file is @generated
|
|
3
|
+
|
|
4
|
+
require "net/http"
|
|
5
|
+
|
|
6
|
+
module Svix
|
|
7
|
+
class Destination
|
|
8
|
+
attr_accessor :transformation
|
|
9
|
+
def initialize(client)
|
|
10
|
+
@client = client
|
|
11
|
+
@transformation = DestinationTransformation.new(client)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def list(app_id, options = {})
|
|
15
|
+
options = options.transform_keys(&:to_s)
|
|
16
|
+
res = @client.execute_request(
|
|
17
|
+
"GET",
|
|
18
|
+
"/api/v1/app/#{app_id}/destination",
|
|
19
|
+
query_params: {
|
|
20
|
+
"limit" => options["limit"],
|
|
21
|
+
"iterator" => options["iterator"],
|
|
22
|
+
"order" => options["order"]
|
|
23
|
+
}
|
|
24
|
+
)
|
|
25
|
+
ListResponseDestinationOut.deserialize(res)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def create(app_id, destination_in, options = {})
|
|
29
|
+
options = options.transform_keys(&:to_s)
|
|
30
|
+
res = @client.execute_request(
|
|
31
|
+
"POST",
|
|
32
|
+
"/api/v1/app/#{app_id}/destination",
|
|
33
|
+
headers: {
|
|
34
|
+
"idempotency-key" => options["idempotency-key"]
|
|
35
|
+
},
|
|
36
|
+
body: destination_in
|
|
37
|
+
)
|
|
38
|
+
DestinationOut.deserialize(res)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def get(app_id, destination_id)
|
|
42
|
+
res = @client.execute_request(
|
|
43
|
+
"GET",
|
|
44
|
+
"/api/v1/app/#{app_id}/destination/#{destination_id}"
|
|
45
|
+
)
|
|
46
|
+
DestinationOut.deserialize(res)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def upsert(app_id, destination_id, destination_in)
|
|
50
|
+
res = @client.execute_request(
|
|
51
|
+
"PUT",
|
|
52
|
+
"/api/v1/app/#{app_id}/destination/#{destination_id}",
|
|
53
|
+
body: destination_in
|
|
54
|
+
)
|
|
55
|
+
DestinationOut.deserialize(res)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def delete(app_id, destination_id)
|
|
59
|
+
@client.execute_request(
|
|
60
|
+
"DELETE",
|
|
61
|
+
"/api/v1/app/#{app_id}/destination/#{destination_id}"
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def patch(app_id, destination_id, destination_patch)
|
|
66
|
+
res = @client.execute_request(
|
|
67
|
+
"PATCH",
|
|
68
|
+
"/api/v1/app/#{app_id}/destination/#{destination_id}",
|
|
69
|
+
body: destination_patch
|
|
70
|
+
)
|
|
71
|
+
DestinationOut.deserialize(res)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# This file is @generated
|
|
3
|
+
|
|
4
|
+
require "net/http"
|
|
5
|
+
|
|
6
|
+
module Svix
|
|
7
|
+
class DestinationTransformation
|
|
8
|
+
def initialize(client)
|
|
9
|
+
@client = client
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def get(app_id, destination_id)
|
|
13
|
+
res = @client.execute_request(
|
|
14
|
+
"GET",
|
|
15
|
+
"/api/v1/app/#{app_id}/destination/#{destination_id}/transformation"
|
|
16
|
+
)
|
|
17
|
+
DestinationTransformationOut.deserialize(res)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def patch(app_id, destination_id, destination_transform_in)
|
|
21
|
+
res = @client.execute_request(
|
|
22
|
+
"PATCH",
|
|
23
|
+
"/api/v1/app/#{app_id}/destination/#{destination_id}/transformation",
|
|
24
|
+
body: destination_transform_in
|
|
25
|
+
)
|
|
26
|
+
EmptyResponse.deserialize(res)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# This file is @generated
|
|
3
|
+
|
|
4
|
+
require "net/http"
|
|
5
|
+
|
|
6
|
+
module Svix
|
|
7
|
+
class Destination
|
|
8
|
+
attr_accessor :autoconfig
|
|
9
|
+
def initialize(client)
|
|
10
|
+
@client = client
|
|
11
|
+
@autoconfig = DestinationAutoconfig.new(client)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# This file is @generated
|
|
3
|
+
|
|
4
|
+
require "net/http"
|
|
5
|
+
|
|
6
|
+
module Svix
|
|
7
|
+
class DestinationAutoconfig
|
|
8
|
+
def initialize(client)
|
|
9
|
+
@client = client
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def subscribe(app_id, autoconfig_id, destination_in)
|
|
13
|
+
res = @client.execute_request(
|
|
14
|
+
"PUT",
|
|
15
|
+
"/api/v1/app/#{app_id}/autoconfig/#{autoconfig_id}/destination",
|
|
16
|
+
body: destination_in
|
|
17
|
+
)
|
|
18
|
+
DestinationOut.deserialize(res)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -5,10 +5,12 @@ require "net/http"
|
|
|
5
5
|
|
|
6
6
|
module Svix
|
|
7
7
|
class Endpoint
|
|
8
|
-
attr_accessor :
|
|
8
|
+
attr_accessor :auto_config_deprecated
|
|
9
|
+
attr_accessor :autoconfig
|
|
9
10
|
def initialize(client)
|
|
10
11
|
@client = client
|
|
11
|
-
@
|
|
12
|
+
@auto_config_deprecated = EndpointAutoConfigDeprecated.new(client)
|
|
13
|
+
@autoconfig = EndpointAutoconfig.new(client)
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
def transformation_partial_update(app_id, endpoint_id, endpoint_transformation_in)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# This file is @generated
|
|
3
|
+
|
|
4
|
+
require "net/http"
|
|
5
|
+
|
|
6
|
+
module Svix
|
|
7
|
+
class EndpointAutoconfig
|
|
8
|
+
def initialize(client)
|
|
9
|
+
@client = client
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def get(app_id, autoconfig_id)
|
|
13
|
+
res = @client.execute_request(
|
|
14
|
+
"GET",
|
|
15
|
+
"/api/v1/app/#{app_id}/autoconfig/#{autoconfig_id}"
|
|
16
|
+
)
|
|
17
|
+
AutoConfigSubscriptionOut.deserialize(res)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def subscribe(app_id, autoconfig_id, endpoint_in)
|
|
21
|
+
res = @client.execute_request(
|
|
22
|
+
"PUT",
|
|
23
|
+
"/api/v1/app/#{app_id}/autoconfig/#{autoconfig_id}/endpoint",
|
|
24
|
+
body: endpoint_in
|
|
25
|
+
)
|
|
26
|
+
EndpointOut.deserialize(res)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
data/lib/svix/autoconfig.rb
CHANGED
|
@@ -5,11 +5,14 @@ require "base64"
|
|
|
5
5
|
require "uri"
|
|
6
6
|
|
|
7
7
|
require "svix/models/subscribe_in"
|
|
8
|
-
require "svix/api_internal/
|
|
8
|
+
require "svix/api_internal/endpoint_auto_config_deprecated"
|
|
9
|
+
require "svix/api_internal/endpoint_autoconfig"
|
|
9
10
|
|
|
10
11
|
module Svix
|
|
11
12
|
class AutoConfig
|
|
12
13
|
AUTOCONFIG_TOKEN_PREFIX_V1 = "auto_v1_"
|
|
14
|
+
AUTOCONFIG_TOKEN_PREFIX_V2 = "auto_v2_"
|
|
15
|
+
UNSUPPORTED_TOKEN_VERSION = "Unsupported token version. You might need to update the Svix SDK to use this token"
|
|
13
16
|
|
|
14
17
|
class InvalidTokenError < StandardError; end
|
|
15
18
|
|
|
@@ -18,7 +21,8 @@ module Svix
|
|
|
18
21
|
def initialize(token, endpoint_in)
|
|
19
22
|
content = AutoConfig.decode_token!(token)
|
|
20
23
|
@app_id = content.fetch("app_id")
|
|
21
|
-
@endpoint_id = content
|
|
24
|
+
@endpoint_id = content["endpoint_id"]
|
|
25
|
+
@autoconfig_id = content["autoconfig_id"]
|
|
22
26
|
@endpoint = endpoint_in
|
|
23
27
|
@webhook = Webhook.new(content.fetch("endpoint_secret"))
|
|
24
28
|
@client = SvixHttpClient.new(
|
|
@@ -28,11 +32,19 @@ module Svix
|
|
|
28
32
|
end
|
|
29
33
|
|
|
30
34
|
def subscribe
|
|
31
|
-
|
|
32
|
-
@
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
if @autoconfig_id
|
|
36
|
+
EndpointAutoconfig.new(@client).subscribe(
|
|
37
|
+
@app_id,
|
|
38
|
+
@autoconfig_id,
|
|
39
|
+
@endpoint
|
|
40
|
+
)
|
|
41
|
+
else
|
|
42
|
+
EndpointAutoConfigDeprecated.new(@client).update(
|
|
43
|
+
@app_id,
|
|
44
|
+
@endpoint_id,
|
|
45
|
+
SubscribeIn.new("endpoint" => @endpoint)
|
|
46
|
+
)
|
|
47
|
+
end
|
|
36
48
|
end
|
|
37
49
|
|
|
38
50
|
def verify(payload, headers)
|
|
@@ -41,26 +53,48 @@ module Svix
|
|
|
41
53
|
|
|
42
54
|
class << self
|
|
43
55
|
def decode_token!(token)
|
|
44
|
-
unless token.is_a?(String)
|
|
45
|
-
raise InvalidTokenError
|
|
56
|
+
unless token.is_a?(String)
|
|
57
|
+
raise InvalidTokenError, UNSUPPORTED_TOKEN_VERSION
|
|
46
58
|
end
|
|
47
59
|
|
|
48
|
-
|
|
60
|
+
if token.start_with?(AUTOCONFIG_TOKEN_PREFIX_V1)
|
|
61
|
+
data = parse_token_payload!(token, AUTOCONFIG_TOKEN_PREFIX_V1)
|
|
62
|
+
{
|
|
63
|
+
"version" => "v1",
|
|
64
|
+
"app_id" => data.fetch("aid"),
|
|
65
|
+
"endpoint_id" => data.fetch("eid"),
|
|
66
|
+
"server_url" => data.fetch("surl"),
|
|
67
|
+
"endpoint_secret" => data.fetch("esec"),
|
|
68
|
+
"token_plaintext" => data.fetch("tok"),
|
|
69
|
+
}
|
|
70
|
+
elsif token.start_with?(AUTOCONFIG_TOKEN_PREFIX_V2)
|
|
71
|
+
data = parse_token_payload!(token, AUTOCONFIG_TOKEN_PREFIX_V2)
|
|
72
|
+
{
|
|
73
|
+
"version" => "v2",
|
|
74
|
+
"app_id" => data.fetch("aid"),
|
|
75
|
+
"autoconfig_id" => data.fetch("sid"),
|
|
76
|
+
"server_url" => data.fetch("surl"),
|
|
77
|
+
"endpoint_secret" => data.fetch("esec"),
|
|
78
|
+
"token_plaintext" => data.fetch("tok"),
|
|
79
|
+
}
|
|
80
|
+
else
|
|
81
|
+
raise InvalidTokenError, UNSUPPORTED_TOKEN_VERSION
|
|
82
|
+
end
|
|
83
|
+
rescue ArgumentError, JSON::ParserError, KeyError, TypeError
|
|
84
|
+
raise InvalidTokenError
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
def parse_token_payload!(token, prefix)
|
|
90
|
+
encoded = token.byteslice(prefix.length..-1)
|
|
49
91
|
json = Base64.decode64(encoded)
|
|
50
92
|
data = JSON.parse(json)
|
|
51
93
|
unless data.is_a?(Hash)
|
|
52
94
|
raise InvalidTokenError
|
|
53
95
|
end
|
|
54
96
|
|
|
55
|
-
|
|
56
|
-
"app_id" => data.fetch("aid"),
|
|
57
|
-
"endpoint_id" => data.fetch("eid"),
|
|
58
|
-
"server_url" => data.fetch("surl"),
|
|
59
|
-
"endpoint_secret" => data.fetch("esec"),
|
|
60
|
-
"token_plaintext" => data.fetch("tok"),
|
|
61
|
-
}
|
|
62
|
-
rescue ArgumentError, JSON::ParserError, KeyError, TypeError
|
|
63
|
-
raise InvalidTokenError
|
|
97
|
+
data
|
|
64
98
|
end
|
|
65
99
|
end
|
|
66
100
|
end
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "uri"
|
|
4
|
+
|
|
3
5
|
require "svix/models/auto_config_sink_type"
|
|
6
|
+
require "svix/models/auto_config_subscription_out"
|
|
7
|
+
require "svix/models/status"
|
|
8
|
+
require "svix/models/destination_in"
|
|
9
|
+
require "svix/models/destination_out"
|
|
4
10
|
require "svix/models/poller_v2_commit_in"
|
|
5
11
|
require "svix/models/sink_in_common"
|
|
12
|
+
require "svix/models/destination_status"
|
|
6
13
|
require "svix/models/subscribe_in"
|
|
7
|
-
require "svix/api_internal/
|
|
14
|
+
require "svix/api_internal/endpoint_auto_config_deprecated"
|
|
15
|
+
require "svix/api_internal/endpoint_autoconfig"
|
|
16
|
+
require "svix/api_internal/destination_autoconfig"
|
|
8
17
|
require "svix/api_internal/message_pollerv2"
|
|
9
18
|
|
|
10
19
|
module Svix
|
|
@@ -12,7 +21,8 @@ module Svix
|
|
|
12
21
|
def initialize(token, sink_in)
|
|
13
22
|
content = AutoConfig.decode_token!(token)
|
|
14
23
|
@app_id = content.fetch("app_id")
|
|
15
|
-
@sink_id = content
|
|
24
|
+
@sink_id = content["endpoint_id"]
|
|
25
|
+
@autoconfig_id = content["autoconfig_id"]
|
|
16
26
|
@sink_in = sink_in
|
|
17
27
|
@client = SvixHttpClient.new(
|
|
18
28
|
content.fetch("token_plaintext"),
|
|
@@ -21,17 +31,28 @@ module Svix
|
|
|
21
31
|
end
|
|
22
32
|
|
|
23
33
|
def subscribe
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
if @autoconfig_id
|
|
35
|
+
destination = DestinationAutoconfig.new(@client).subscribe(
|
|
36
|
+
@app_id,
|
|
37
|
+
@autoconfig_id,
|
|
38
|
+
sink_in_common_to_polling_destination(@sink_in)
|
|
39
|
+
)
|
|
40
|
+
@sink_id = destination.id
|
|
41
|
+
destination
|
|
42
|
+
else
|
|
43
|
+
poller = AutoConfigSinkTypeConfig::Poller.deserialize(@sink_in.serialize)
|
|
44
|
+
subscribe_in = SubscribeIn.new(
|
|
45
|
+
"sink" => AutoConfigSinkType.new("config" => poller)
|
|
46
|
+
)
|
|
47
|
+
endpoint = EndpointAutoConfigDeprecated.new(@client).update(@app_id, @sink_id, subscribe_in)
|
|
48
|
+
destination_out_from_v1_endpoint(endpoint)
|
|
49
|
+
end
|
|
29
50
|
end
|
|
30
51
|
|
|
31
52
|
def receive(consumer_id, options = {})
|
|
32
53
|
MessagePollerv2.new(@client).consumer_poll(
|
|
33
54
|
@app_id,
|
|
34
|
-
|
|
55
|
+
sink_id,
|
|
35
56
|
consumer_id,
|
|
36
57
|
options
|
|
37
58
|
)
|
|
@@ -40,11 +61,51 @@ module Svix
|
|
|
40
61
|
def commit(consumer_id, offset, options = {})
|
|
41
62
|
MessagePollerv2.new(@client).consumer_commit(
|
|
42
63
|
@app_id,
|
|
43
|
-
|
|
64
|
+
sink_id,
|
|
44
65
|
consumer_id,
|
|
45
66
|
PollerV2CommitIn.new("offset" => offset),
|
|
46
67
|
options
|
|
47
68
|
)
|
|
48
69
|
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
def sink_id
|
|
74
|
+
return @sink_id if @sink_id
|
|
75
|
+
|
|
76
|
+
# Get the sink id from the autoconfig id (v2)
|
|
77
|
+
dest_id = EndpointAutoconfig.new(@client).get(@app_id, @autoconfig_id).dest_id
|
|
78
|
+
raise "autoconfig subscription is pending. Have you called subscribe()?" if dest_id.nil? || dest_id.empty?
|
|
79
|
+
|
|
80
|
+
dest_id
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def destination_out_from_v1_endpoint(endpoint)
|
|
84
|
+
DestinationOut.new(
|
|
85
|
+
"id" => endpoint.id,
|
|
86
|
+
"uid" => endpoint.uid,
|
|
87
|
+
"status" => endpoint.disabled ? DestinationStatus::DISABLED : DestinationStatus::ENABLED,
|
|
88
|
+
"current_iterator" => "",
|
|
89
|
+
"created_at" => endpoint.created_at,
|
|
90
|
+
"updated_at" => endpoint.updated_at,
|
|
91
|
+
"batch_size" => 0,
|
|
92
|
+
"max_wait_secs" => 0,
|
|
93
|
+
"event_types" => endpoint.event_types,
|
|
94
|
+
"channels" => endpoint.channels,
|
|
95
|
+
"metadata" => endpoint.metadata,
|
|
96
|
+
"config" => DestinationOutConfig::PollingEndpoint.new
|
|
97
|
+
)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def sink_in_common_to_polling_destination(sink)
|
|
101
|
+
attrs = {
|
|
102
|
+
"config" => DestinationInConfig::PollingEndpoint.new
|
|
103
|
+
}
|
|
104
|
+
attrs["uid"] = sink.uid unless sink.uid.nil?
|
|
105
|
+
attrs["event_types"] = sink.event_types unless sink.event_types.nil?
|
|
106
|
+
attrs["channels"] = sink.channels unless sink.channels.nil?
|
|
107
|
+
attrs["metadata"] = sink.metadata unless sink.metadata.nil?
|
|
108
|
+
DestinationIn.new(attrs)
|
|
109
|
+
end
|
|
49
110
|
end
|
|
50
111
|
end
|
|
@@ -33,14 +33,14 @@ module Svix
|
|
|
33
33
|
|
|
34
34
|
def serialize
|
|
35
35
|
out = Hash.new
|
|
36
|
-
out["clientId"] = Svix::serialize_primitive(@client_id)
|
|
36
|
+
out["clientId"] = Svix::serialize_primitive(@client_id) unless @client_id.nil?
|
|
37
37
|
out
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
# Serializes the object to a json string
|
|
41
41
|
# @return String
|
|
42
|
-
def to_json
|
|
43
|
-
|
|
42
|
+
def to_json(*args)
|
|
43
|
+
serialize.to_json(*args)
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
end
|
|
@@ -43,17 +43,17 @@ module Svix
|
|
|
43
43
|
|
|
44
44
|
def serialize
|
|
45
45
|
out = Hash.new
|
|
46
|
-
out["id"] = Svix::serialize_primitive(@id)
|
|
47
|
-
out["status"] = Svix::serialize_schema_ref(@status)
|
|
48
|
-
out["task"] = Svix::serialize_schema_ref(@task)
|
|
49
|
-
out["updatedAt"] = Svix::serialize_primitive(@updated_at)
|
|
46
|
+
out["id"] = Svix::serialize_primitive(@id) unless @id.nil?
|
|
47
|
+
out["status"] = Svix::serialize_schema_ref(@status) unless @status.nil?
|
|
48
|
+
out["task"] = Svix::serialize_schema_ref(@task) unless @task.nil?
|
|
49
|
+
out["updatedAt"] = Svix::serialize_primitive(@updated_at) unless @updated_at.nil?
|
|
50
50
|
out
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
# Serializes the object to a json string
|
|
54
54
|
# @return String
|
|
55
|
-
def to_json
|
|
56
|
-
|
|
55
|
+
def to_json(*args)
|
|
56
|
+
serialize.to_json(*args)
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
end
|
|
@@ -33,14 +33,14 @@ module Svix
|
|
|
33
33
|
|
|
34
34
|
def serialize
|
|
35
35
|
out = Hash.new
|
|
36
|
-
out["secret"] = Svix::serialize_primitive(@secret)
|
|
36
|
+
out["secret"] = Svix::serialize_primitive(@secret) unless @secret.nil?
|
|
37
37
|
out
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
# Serializes the object to a json string
|
|
41
41
|
# @return String
|
|
42
|
-
def to_json
|
|
43
|
-
|
|
42
|
+
def to_json(*args)
|
|
43
|
+
serialize.to_json(*args)
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
end
|
|
@@ -43,19 +43,19 @@ module Svix
|
|
|
43
43
|
|
|
44
44
|
def serialize
|
|
45
45
|
out = Hash.new
|
|
46
|
-
out["token"] = Svix::serialize_primitive(@token)
|
|
47
|
-
out["id"] = Svix::serialize_primitive(@id)
|
|
48
|
-
out["name"] = Svix::serialize_primitive(@name)
|
|
49
|
-
out["createdAt"] = Svix::serialize_primitive(@created_at)
|
|
50
|
-
out["expiresAt"] = Svix::serialize_primitive(@expires_at)
|
|
51
|
-
out["scopes"] = Svix::serialize_primitive(@scopes)
|
|
46
|
+
out["token"] = Svix::serialize_primitive(@token) unless @token.nil?
|
|
47
|
+
out["id"] = Svix::serialize_primitive(@id) unless @id.nil?
|
|
48
|
+
out["name"] = Svix::serialize_primitive(@name) unless @name.nil?
|
|
49
|
+
out["createdAt"] = Svix::serialize_primitive(@created_at) unless @created_at.nil?
|
|
50
|
+
out["expiresAt"] = Svix::serialize_primitive(@expires_at) unless @expires_at.nil?
|
|
51
|
+
out["scopes"] = Svix::serialize_primitive(@scopes) unless @scopes.nil?
|
|
52
52
|
out
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
# Serializes the object to a json string
|
|
56
56
|
# @return String
|
|
57
|
-
def to_json
|
|
58
|
-
|
|
57
|
+
def to_json(*args)
|
|
58
|
+
serialize.to_json(*args)
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
61
|
end
|
|
@@ -74,19 +74,19 @@ module Svix
|
|
|
74
74
|
|
|
75
75
|
def serialize
|
|
76
76
|
out = Hash.new
|
|
77
|
-
out["application"] = Svix::serialize_schema_ref(@application)
|
|
78
|
-
out["readOnly"] = Svix::serialize_primitive(@read_only)
|
|
79
|
-
out["capabilities"] = @capabilities.map { |v| v.serialize }
|
|
80
|
-
out["featureFlags"] = Svix::serialize_primitive(@feature_flags)
|
|
81
|
-
out["expiry"] = Svix::serialize_primitive(@expiry)
|
|
82
|
-
out["sessionId"] = Svix::serialize_primitive(@session_id)
|
|
77
|
+
out["application"] = Svix::serialize_schema_ref(@application) unless @application.nil?
|
|
78
|
+
out["readOnly"] = Svix::serialize_primitive(@read_only) unless @read_only.nil?
|
|
79
|
+
out["capabilities"] = @capabilities.map { |v| v.serialize } unless @capabilities.nil?
|
|
80
|
+
out["featureFlags"] = Svix::serialize_primitive(@feature_flags) unless @feature_flags.nil?
|
|
81
|
+
out["expiry"] = Svix::serialize_primitive(@expiry) unless @expiry.nil?
|
|
82
|
+
out["sessionId"] = Svix::serialize_primitive(@session_id) unless @session_id.nil?
|
|
83
83
|
out
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
# Serializes the object to a json string
|
|
87
87
|
# @return String
|
|
88
|
-
def to_json
|
|
89
|
-
|
|
88
|
+
def to_json(*args)
|
|
89
|
+
serialize.to_json(*args)
|
|
90
90
|
end
|
|
91
91
|
end
|
|
92
92
|
end
|
|
@@ -35,15 +35,15 @@ module Svix
|
|
|
35
35
|
|
|
36
36
|
def serialize
|
|
37
37
|
out = Hash.new
|
|
38
|
-
out["url"] = Svix::serialize_primitive(@url)
|
|
39
|
-
out["token"] = Svix::serialize_primitive(@token)
|
|
38
|
+
out["url"] = Svix::serialize_primitive(@url) unless @url.nil?
|
|
39
|
+
out["token"] = Svix::serialize_primitive(@token) unless @token.nil?
|
|
40
40
|
out
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
# Serializes the object to a json string
|
|
44
44
|
# @return String
|
|
45
|
-
def to_json
|
|
46
|
-
|
|
45
|
+
def to_json(*args)
|
|
46
|
+
serialize.to_json(*args)
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
end
|