ark-email 0.13.0 → 0.14.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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +1 -1
  4. data/lib/ark_email/client.rb +4 -0
  5. data/lib/ark_email/models/email_retrieve_params.rb +4 -1
  6. data/lib/ark_email/models/email_retrieve_response.rb +177 -1
  7. data/lib/ark_email/models/log_entry.rb +298 -0
  8. data/lib/ark_email/models/log_entry_detail.rb +102 -0
  9. data/lib/ark_email/models/log_list_params.rb +106 -0
  10. data/lib/ark_email/models/log_retrieve_params.rb +14 -0
  11. data/lib/ark_email/models/log_retrieve_response.rb +33 -0
  12. data/lib/ark_email/models.rb +8 -0
  13. data/lib/ark_email/resources/logs.rb +120 -0
  14. data/lib/ark_email/version.rb +1 -1
  15. data/lib/ark_email.rb +6 -0
  16. data/rbi/ark_email/client.rbi +3 -0
  17. data/rbi/ark_email/models/email_retrieve_params.rbi +8 -2
  18. data/rbi/ark_email/models/email_retrieve_response.rbi +379 -0
  19. data/rbi/ark_email/models/log_entry.rbi +431 -0
  20. data/rbi/ark_email/models/log_entry_detail.rbi +192 -0
  21. data/rbi/ark_email/models/log_list_params.rbi +163 -0
  22. data/rbi/ark_email/models/log_retrieve_params.rbi +27 -0
  23. data/rbi/ark_email/models/log_retrieve_response.rbi +59 -0
  24. data/rbi/ark_email/models.rbi +8 -0
  25. data/rbi/ark_email/resources/emails.rbi +4 -1
  26. data/rbi/ark_email/resources/logs.rbi +104 -0
  27. data/sig/ark_email/client.rbs +2 -0
  28. data/sig/ark_email/models/email_retrieve_response.rbs +179 -0
  29. data/sig/ark_email/models/log_entry.rbs +209 -0
  30. data/sig/ark_email/models/log_entry_detail.rbs +97 -0
  31. data/sig/ark_email/models/log_list_params.rbs +97 -0
  32. data/sig/ark_email/models/log_retrieve_params.rbs +15 -0
  33. data/sig/ark_email/models/log_retrieve_response.rbs +26 -0
  34. data/sig/ark_email/models.rbs +8 -0
  35. data/sig/ark_email/resources/logs.rbs +25 -0
  36. metadata +20 -2
@@ -0,0 +1,163 @@
1
+ # typed: strong
2
+
3
+ module ArkEmail
4
+ module Models
5
+ class LogListParams < ArkEmail::Internal::Type::BaseModel
6
+ extend ArkEmail::Internal::Type::RequestParameters::Converter
7
+ include ArkEmail::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(ArkEmail::LogListParams, ArkEmail::Internal::AnyHash)
12
+ end
13
+
14
+ # Filter by API credential ID
15
+ sig { returns(T.nilable(String)) }
16
+ attr_reader :credential_id
17
+
18
+ sig { params(credential_id: String).void }
19
+ attr_writer :credential_id
20
+
21
+ # Filter logs before this date (ISO 8601 format)
22
+ sig { returns(T.nilable(Time)) }
23
+ attr_reader :end_date
24
+
25
+ sig { params(end_date: Time).void }
26
+ attr_writer :end_date
27
+
28
+ # Filter by endpoint name
29
+ sig { returns(T.nilable(String)) }
30
+ attr_reader :endpoint
31
+
32
+ sig { params(endpoint: String).void }
33
+ attr_writer :endpoint
34
+
35
+ # Page number
36
+ sig { returns(T.nilable(Integer)) }
37
+ attr_reader :page
38
+
39
+ sig { params(page: Integer).void }
40
+ attr_writer :page
41
+
42
+ # Results per page (max 100)
43
+ sig { returns(T.nilable(Integer)) }
44
+ attr_reader :per_page
45
+
46
+ sig { params(per_page: Integer).void }
47
+ attr_writer :per_page
48
+
49
+ # Filter by request ID (partial match)
50
+ sig { returns(T.nilable(String)) }
51
+ attr_reader :request_id
52
+
53
+ sig { params(request_id: String).void }
54
+ attr_writer :request_id
55
+
56
+ # Filter logs after this date (ISO 8601 format)
57
+ sig { returns(T.nilable(Time)) }
58
+ attr_reader :start_date
59
+
60
+ sig { params(start_date: Time).void }
61
+ attr_writer :start_date
62
+
63
+ # Filter by status category:
64
+ #
65
+ # - `success` - Status codes < 400
66
+ # - `error` - Status codes >= 400
67
+ sig { returns(T.nilable(ArkEmail::LogListParams::Status::OrSymbol)) }
68
+ attr_reader :status
69
+
70
+ sig { params(status: ArkEmail::LogListParams::Status::OrSymbol).void }
71
+ attr_writer :status
72
+
73
+ # Filter by exact HTTP status code (100-599)
74
+ sig { returns(T.nilable(Integer)) }
75
+ attr_reader :status_code
76
+
77
+ sig { params(status_code: Integer).void }
78
+ attr_writer :status_code
79
+
80
+ sig do
81
+ params(
82
+ credential_id: String,
83
+ end_date: Time,
84
+ endpoint: String,
85
+ page: Integer,
86
+ per_page: Integer,
87
+ request_id: String,
88
+ start_date: Time,
89
+ status: ArkEmail::LogListParams::Status::OrSymbol,
90
+ status_code: Integer,
91
+ request_options: ArkEmail::RequestOptions::OrHash
92
+ ).returns(T.attached_class)
93
+ end
94
+ def self.new(
95
+ # Filter by API credential ID
96
+ credential_id: nil,
97
+ # Filter logs before this date (ISO 8601 format)
98
+ end_date: nil,
99
+ # Filter by endpoint name
100
+ endpoint: nil,
101
+ # Page number
102
+ page: nil,
103
+ # Results per page (max 100)
104
+ per_page: nil,
105
+ # Filter by request ID (partial match)
106
+ request_id: nil,
107
+ # Filter logs after this date (ISO 8601 format)
108
+ start_date: nil,
109
+ # Filter by status category:
110
+ #
111
+ # - `success` - Status codes < 400
112
+ # - `error` - Status codes >= 400
113
+ status: nil,
114
+ # Filter by exact HTTP status code (100-599)
115
+ status_code: nil,
116
+ request_options: {}
117
+ )
118
+ end
119
+
120
+ sig do
121
+ override.returns(
122
+ {
123
+ credential_id: String,
124
+ end_date: Time,
125
+ endpoint: String,
126
+ page: Integer,
127
+ per_page: Integer,
128
+ request_id: String,
129
+ start_date: Time,
130
+ status: ArkEmail::LogListParams::Status::OrSymbol,
131
+ status_code: Integer,
132
+ request_options: ArkEmail::RequestOptions
133
+ }
134
+ )
135
+ end
136
+ def to_hash
137
+ end
138
+
139
+ # Filter by status category:
140
+ #
141
+ # - `success` - Status codes < 400
142
+ # - `error` - Status codes >= 400
143
+ module Status
144
+ extend ArkEmail::Internal::Type::Enum
145
+
146
+ TaggedSymbol =
147
+ T.type_alias { T.all(Symbol, ArkEmail::LogListParams::Status) }
148
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
149
+
150
+ SUCCESS = T.let(:success, ArkEmail::LogListParams::Status::TaggedSymbol)
151
+ ERROR = T.let(:error, ArkEmail::LogListParams::Status::TaggedSymbol)
152
+
153
+ sig do
154
+ override.returns(
155
+ T::Array[ArkEmail::LogListParams::Status::TaggedSymbol]
156
+ )
157
+ end
158
+ def self.values
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,27 @@
1
+ # typed: strong
2
+
3
+ module ArkEmail
4
+ module Models
5
+ class LogRetrieveParams < ArkEmail::Internal::Type::BaseModel
6
+ extend ArkEmail::Internal::Type::RequestParameters::Converter
7
+ include ArkEmail::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(ArkEmail::LogRetrieveParams, ArkEmail::Internal::AnyHash)
12
+ end
13
+
14
+ sig do
15
+ params(request_options: ArkEmail::RequestOptions::OrHash).returns(
16
+ T.attached_class
17
+ )
18
+ end
19
+ def self.new(request_options: {})
20
+ end
21
+
22
+ sig { override.returns({ request_options: ArkEmail::RequestOptions }) }
23
+ def to_hash
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,59 @@
1
+ # typed: strong
2
+
3
+ module ArkEmail
4
+ module Models
5
+ class LogRetrieveResponse < ArkEmail::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(
9
+ ArkEmail::Models::LogRetrieveResponse,
10
+ ArkEmail::Internal::AnyHash
11
+ )
12
+ end
13
+
14
+ # Full API request log entry with bodies
15
+ sig { returns(ArkEmail::LogEntryDetail) }
16
+ attr_reader :data
17
+
18
+ sig { params(data: ArkEmail::LogEntryDetail::OrHash).void }
19
+ attr_writer :data
20
+
21
+ sig { returns(ArkEmail::APIMeta) }
22
+ attr_reader :meta
23
+
24
+ sig { params(meta: ArkEmail::APIMeta::OrHash).void }
25
+ attr_writer :meta
26
+
27
+ sig { returns(T::Boolean) }
28
+ attr_accessor :success
29
+
30
+ # Detailed API request log with request/response bodies
31
+ sig do
32
+ params(
33
+ data: ArkEmail::LogEntryDetail::OrHash,
34
+ meta: ArkEmail::APIMeta::OrHash,
35
+ success: T::Boolean
36
+ ).returns(T.attached_class)
37
+ end
38
+ def self.new(
39
+ # Full API request log entry with bodies
40
+ data:,
41
+ meta:,
42
+ success: true
43
+ )
44
+ end
45
+
46
+ sig do
47
+ override.returns(
48
+ {
49
+ data: ArkEmail::LogEntryDetail,
50
+ meta: ArkEmail::APIMeta,
51
+ success: T::Boolean
52
+ }
53
+ )
54
+ end
55
+ def to_hash
56
+ end
57
+ end
58
+ end
59
+ end
@@ -30,6 +30,14 @@ module ArkEmail
30
30
 
31
31
  EmailSendRawParams = ArkEmail::Models::EmailSendRawParams
32
32
 
33
+ LogEntry = ArkEmail::Models::LogEntry
34
+
35
+ LogEntryDetail = ArkEmail::Models::LogEntryDetail
36
+
37
+ LogListParams = ArkEmail::Models::LogListParams
38
+
39
+ LogRetrieveParams = ArkEmail::Models::LogRetrieveParams
40
+
33
41
  SuppressionBulkCreateParams = ArkEmail::Models::SuppressionBulkCreateParams
34
42
 
35
43
  SuppressionCreateParams = ArkEmail::Models::SuppressionCreateParams
@@ -20,10 +20,13 @@ module ArkEmail
20
20
  email_id,
21
21
  # Comma-separated list of fields to include:
22
22
  #
23
+ # - `full` - Include all expanded fields in a single request
23
24
  # - `content` - HTML and plain text body
24
25
  # - `headers` - Email headers
25
26
  # - `deliveries` - Delivery attempt history
26
- # - `activity` - Opens and clicks
27
+ # - `activity` - Opens and clicks tracking data
28
+ # - `attachments` - File attachments with content (base64 encoded)
29
+ # - `raw` - Complete raw MIME message (base64 encoded)
27
30
  expand: nil,
28
31
  request_options: {}
29
32
  )
@@ -0,0 +1,104 @@
1
+ # typed: strong
2
+
3
+ module ArkEmail
4
+ module Resources
5
+ class Logs
6
+ # Retrieve detailed information about a specific API request log, including the
7
+ # full request and response bodies.
8
+ #
9
+ # **Body decryption:** Request and response bodies are stored encrypted and
10
+ # automatically decrypted when retrieved. Bodies larger than 25KB are truncated at
11
+ # storage time with a `... [truncated]` marker.
12
+ #
13
+ # **Use cases:**
14
+ #
15
+ # - Debug a specific failed request
16
+ # - Review the exact payload sent/received
17
+ # - Share request details with support
18
+ #
19
+ # **Related endpoints:**
20
+ #
21
+ # - `GET /logs` - List logs with filters
22
+ sig do
23
+ params(
24
+ request_id: String,
25
+ request_options: ArkEmail::RequestOptions::OrHash
26
+ ).returns(ArkEmail::Models::LogRetrieveResponse)
27
+ end
28
+ def retrieve(
29
+ # The request ID (format `req_*`)
30
+ request_id,
31
+ request_options: {}
32
+ )
33
+ end
34
+
35
+ # Retrieve a paginated list of API request logs for debugging and monitoring.
36
+ # Results are ordered by timestamp, newest first.
37
+ #
38
+ # **Use cases:**
39
+ #
40
+ # - Debug integration issues by reviewing recent requests
41
+ # - Monitor error rates and response times
42
+ # - Audit API usage patterns
43
+ #
44
+ # **Filters:**
45
+ #
46
+ # - `status` - Filter by success or error category
47
+ # - `statusCode` - Filter by exact HTTP status code
48
+ # - `endpoint` - Filter by endpoint name (e.g., `emails.send`)
49
+ # - `credentialId` - Filter by API key
50
+ # - `startDate`/`endDate` - Filter by date range
51
+ #
52
+ # **Note:** Request and response bodies are only included when retrieving a single
53
+ # log entry with `GET /logs/{requestId}`.
54
+ #
55
+ # **Related endpoints:**
56
+ #
57
+ # - `GET /logs/{requestId}` - Get full log details with request/response bodies
58
+ sig do
59
+ params(
60
+ credential_id: String,
61
+ end_date: Time,
62
+ endpoint: String,
63
+ page: Integer,
64
+ per_page: Integer,
65
+ request_id: String,
66
+ start_date: Time,
67
+ status: ArkEmail::LogListParams::Status::OrSymbol,
68
+ status_code: Integer,
69
+ request_options: ArkEmail::RequestOptions::OrHash
70
+ ).returns(ArkEmail::Internal::PageNumberPagination[ArkEmail::LogEntry])
71
+ end
72
+ def list(
73
+ # Filter by API credential ID
74
+ credential_id: nil,
75
+ # Filter logs before this date (ISO 8601 format)
76
+ end_date: nil,
77
+ # Filter by endpoint name
78
+ endpoint: nil,
79
+ # Page number
80
+ page: nil,
81
+ # Results per page (max 100)
82
+ per_page: nil,
83
+ # Filter by request ID (partial match)
84
+ request_id: nil,
85
+ # Filter logs after this date (ISO 8601 format)
86
+ start_date: nil,
87
+ # Filter by status category:
88
+ #
89
+ # - `success` - Status codes < 400
90
+ # - `error` - Status codes >= 400
91
+ status: nil,
92
+ # Filter by exact HTTP status code (100-599)
93
+ status_code: nil,
94
+ request_options: {}
95
+ )
96
+ end
97
+
98
+ # @api private
99
+ sig { params(client: ArkEmail::Client).returns(T.attached_class) }
100
+ def self.new(client:)
101
+ end
102
+ end
103
+ end
104
+ end
@@ -20,6 +20,8 @@ module ArkEmail
20
20
 
21
21
  attr_reader tracking: ArkEmail::Resources::Tracking
22
22
 
23
+ attr_reader logs: ArkEmail::Resources::Logs
24
+
23
25
  private def auth_headers: -> ::Hash[String, String]
24
26
 
25
27
  def initialize: (
@@ -37,11 +37,14 @@ module ArkEmail
37
37
  timestamp: Float,
38
38
  timestamp_iso: Time,
39
39
  to: String,
40
+ activity: ArkEmail::Models::EmailRetrieveResponse::Data::Activity,
41
+ attachments: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Attachment],
40
42
  deliveries: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Delivery],
41
43
  headers: ::Hash[Symbol, String],
42
44
  html_body: String,
43
45
  message_id: String,
44
46
  plain_body: String,
47
+ raw_message: String,
45
48
  spam: bool,
46
49
  spam_score: Float,
47
50
  tag: String
@@ -66,6 +69,18 @@ module ArkEmail
66
69
 
67
70
  attr_accessor to: String
68
71
 
72
+ attr_reader activity: ArkEmail::Models::EmailRetrieveResponse::Data::Activity?
73
+
74
+ def activity=: (
75
+ ArkEmail::Models::EmailRetrieveResponse::Data::Activity
76
+ ) -> ArkEmail::Models::EmailRetrieveResponse::Data::Activity
77
+
78
+ attr_reader attachments: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Attachment]?
79
+
80
+ def attachments=: (
81
+ ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Attachment]
82
+ ) -> ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Attachment]
83
+
69
84
  attr_reader deliveries: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Delivery]?
70
85
 
71
86
  def deliveries=: (
@@ -88,6 +103,10 @@ module ArkEmail
88
103
 
89
104
  def plain_body=: (String) -> String
90
105
 
106
+ attr_reader raw_message: String?
107
+
108
+ def raw_message=: (String) -> String
109
+
91
110
  attr_reader spam: bool?
92
111
 
93
112
  def spam=: (bool) -> bool
@@ -110,11 +129,14 @@ module ArkEmail
110
129
  timestamp: Float,
111
130
  timestamp_iso: Time,
112
131
  to: String,
132
+ ?activity: ArkEmail::Models::EmailRetrieveResponse::Data::Activity,
133
+ ?attachments: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Attachment],
113
134
  ?deliveries: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Delivery],
114
135
  ?headers: ::Hash[Symbol, String],
115
136
  ?html_body: String,
116
137
  ?message_id: String,
117
138
  ?plain_body: String,
139
+ ?raw_message: String,
118
140
  ?spam: bool,
119
141
  ?spam_score: Float,
120
142
  ?tag: String
@@ -130,11 +152,14 @@ module ArkEmail
130
152
  timestamp: Float,
131
153
  timestamp_iso: Time,
132
154
  to: String,
155
+ activity: ArkEmail::Models::EmailRetrieveResponse::Data::Activity,
156
+ attachments: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Attachment],
133
157
  deliveries: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Delivery],
134
158
  headers: ::Hash[Symbol, String],
135
159
  html_body: String,
136
160
  message_id: String,
137
161
  plain_body: String,
162
+ raw_message: String,
138
163
  spam: bool,
139
164
  spam_score: Float,
140
165
  tag: String
@@ -167,6 +192,160 @@ module ArkEmail
167
192
  def self?.values: -> ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::status]
168
193
  end
169
194
 
195
+ type activity =
196
+ {
197
+ clicks: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Click],
198
+ opens: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Open]
199
+ }
200
+
201
+ class Activity < ArkEmail::Internal::Type::BaseModel
202
+ attr_reader clicks: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Click]?
203
+
204
+ def clicks=: (
205
+ ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Click]
206
+ ) -> ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Click]
207
+
208
+ attr_reader opens: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Open]?
209
+
210
+ def opens=: (
211
+ ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Open]
212
+ ) -> ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Open]
213
+
214
+ def initialize: (
215
+ ?clicks: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Click],
216
+ ?opens: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Open]
217
+ ) -> void
218
+
219
+ def to_hash: -> {
220
+ clicks: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Click],
221
+ opens: ::Array[ArkEmail::Models::EmailRetrieveResponse::Data::Activity::Open]
222
+ }
223
+
224
+ type click =
225
+ {
226
+ ip_address: String,
227
+ timestamp: Float,
228
+ timestamp_iso: Time,
229
+ url: String,
230
+ user_agent: String
231
+ }
232
+
233
+ class Click < ArkEmail::Internal::Type::BaseModel
234
+ attr_reader ip_address: String?
235
+
236
+ def ip_address=: (String) -> String
237
+
238
+ attr_reader timestamp: Float?
239
+
240
+ def timestamp=: (Float) -> Float
241
+
242
+ attr_reader timestamp_iso: Time?
243
+
244
+ def timestamp_iso=: (Time) -> Time
245
+
246
+ attr_reader url: String?
247
+
248
+ def url=: (String) -> String
249
+
250
+ attr_reader user_agent: String?
251
+
252
+ def user_agent=: (String) -> String
253
+
254
+ def initialize: (
255
+ ?ip_address: String,
256
+ ?timestamp: Float,
257
+ ?timestamp_iso: Time,
258
+ ?url: String,
259
+ ?user_agent: String
260
+ ) -> void
261
+
262
+ def to_hash: -> {
263
+ ip_address: String,
264
+ timestamp: Float,
265
+ timestamp_iso: Time,
266
+ url: String,
267
+ user_agent: String
268
+ }
269
+ end
270
+
271
+ type open_ =
272
+ {
273
+ ip_address: String,
274
+ timestamp: Float,
275
+ timestamp_iso: Time,
276
+ user_agent: String
277
+ }
278
+
279
+ class Open < ArkEmail::Internal::Type::BaseModel
280
+ attr_reader ip_address: String?
281
+
282
+ def ip_address=: (String) -> String
283
+
284
+ attr_reader timestamp: Float?
285
+
286
+ def timestamp=: (Float) -> Float
287
+
288
+ attr_reader timestamp_iso: Time?
289
+
290
+ def timestamp_iso=: (Time) -> Time
291
+
292
+ attr_reader user_agent: String?
293
+
294
+ def user_agent=: (String) -> String
295
+
296
+ def initialize: (
297
+ ?ip_address: String,
298
+ ?timestamp: Float,
299
+ ?timestamp_iso: Time,
300
+ ?user_agent: String
301
+ ) -> void
302
+
303
+ def to_hash: -> {
304
+ ip_address: String,
305
+ timestamp: Float,
306
+ timestamp_iso: Time,
307
+ user_agent: String
308
+ }
309
+ end
310
+ end
311
+
312
+ type attachment =
313
+ {
314
+ content_type: String,
315
+ data: String,
316
+ filename: String,
317
+ hash_: String,
318
+ size: Integer
319
+ }
320
+
321
+ class Attachment < ArkEmail::Internal::Type::BaseModel
322
+ attr_accessor content_type: String
323
+
324
+ attr_accessor data: String
325
+
326
+ attr_accessor filename: String
327
+
328
+ attr_accessor hash_: String
329
+
330
+ attr_accessor size: Integer
331
+
332
+ def initialize: (
333
+ content_type: String,
334
+ data: String,
335
+ filename: String,
336
+ hash_: String,
337
+ size: Integer
338
+ ) -> void
339
+
340
+ def to_hash: -> {
341
+ content_type: String,
342
+ data: String,
343
+ filename: String,
344
+ hash_: String,
345
+ size: Integer
346
+ }
347
+ end
348
+
170
349
  type delivery =
171
350
  {
172
351
  id: String,